From 6a6f363893b53a774349a0a55e533cb7aab31348 Mon Sep 17 00:00:00 2001 From: Edward Moyse <edward.moyse@cern.ch> Date: Thu, 20 Dec 2018 14:38:09 +0100 Subject: [PATCH 001/163] Removing Atlantis, as this is now hosted elsewhere. --- graphics/AtlantisJava/CMakeLists.txt | 31 - graphics/AtlantisJava/ant/build.xml | 469 --- .../AtlantisJava/configuration/PSProlog.txt | 156 - .../AtlantisJava/configuration/colormap.xml | 369 --- .../AtlantisJava/configuration/config.dtd | 169 -- .../AtlantisJava/configuration/epusti.csv | 5 - graphics/AtlantisJava/configuration/pdg.xml | 109 - .../configuration/rpsplt_fcal.csv | 498 --- .../AtlantisJava/configuration/rpsplt_hec.csv | 329 -- .../configuration/rpsplt_tile.csv | 169 -- graphics/AtlantisJava/events/event.dtd | 506 ---- graphics/AtlantisJava/geometry/AGeometry.xml | 233 -- .../AtlantisJava/geometry/AMuonGeometry.xml | 220 -- graphics/AtlantisJava/geometry/ATLAS_IDS.xml | 27 - graphics/AtlantisJava/geometry/IdDict.dtd | 118 - .../AtlantisJava/geometry/IdDictATLAS.xml | 56 - .../geometry/IdDictCalorimeter.xml | 731 ----- .../geometry/IdDictForwardDetectors.xml | 140 - .../geometry/IdDictInnerDetector.xml | 559 ---- .../geometry/IdDictLArCalorimeter.xml | 694 ----- .../geometry/IdDictLArElectrode.xml | 327 -- .../geometry/IdDictLArHighVoltage.xml | 222 -- .../geometry/IdDictTileCalorimeter.xml | 398 --- graphics/AtlantisJava/img/atlantis_icon.gif | Bin 2939 -> 0 bytes graphics/AtlantisJava/img/atlantis_log.gif | Bin 18919 -> 0 bytes graphics/AtlantisJava/img/atlas.jpg | Bin 32018 -> 0 bytes graphics/AtlantisJava/img/atlas_logo_big.png | Bin 7956 -> 0 bytes .../img/cursor_DnD_invalid_32x32.gif | Bin 153 -> 0 bytes .../img/cursor_DnD_invalid_64x64.gif | Bin 204 -> 0 bytes .../img/cursor_DnD_valid_32x32.gif | Bin 147 -> 0 bytes .../img/cursor_DnD_valid_64x64.gif | Bin 202 -> 0 bytes .../AtlantisJava/img/cursor_fisheye_32x32.gif | Bin 1191 -> 0 bytes .../AtlantisJava/img/cursor_fisheye_64x64.gif | Bin 1259 -> 0 bytes .../img/cursor_fisheye_bw_32x32.gif | Bin 167 -> 0 bytes .../img/cursor_fisheye_bw_64x64.gif | Bin 220 -> 0 bytes .../AtlantisJava/img/cursor_move_32x32.gif | Bin 235 -> 0 bytes .../AtlantisJava/img/cursor_move_64x64.gif | Bin 286 -> 0 bytes .../AtlantisJava/img/cursor_pick_32x32.gif | Bin 142 -> 0 bytes .../AtlantisJava/img/cursor_pick_64x64.gif | Bin 194 -> 0 bytes .../AtlantisJava/img/cursor_rectsel_32x32.gif | Bin 176 -> 0 bytes .../AtlantisJava/img/cursor_rectsel_64x64.gif | Bin 207 -> 0 bytes .../AtlantisJava/img/cursor_rotate_32x32.gif | Bin 1126 -> 0 bytes .../AtlantisJava/img/cursor_rotate_64x64.gif | Bin 1190 -> 0 bytes .../img/cursor_rotate_bw_32x32.gif | Bin 238 -> 0 bytes .../img/cursor_rotate_bw_64x64.gif | Bin 300 -> 0 bytes .../AtlantisJava/img/cursor_sync_32x32.gif | Bin 916 -> 0 bytes .../AtlantisJava/img/cursor_sync_64x64.gif | Bin 973 -> 0 bytes .../AtlantisJava/img/cursor_zoom_32x32.gif | Bin 335 -> 0 bytes .../AtlantisJava/img/cursor_zoom_64x64.gif | Bin 394 -> 0 bytes .../AtlantisJava/img/cursor_zoom_bw_32x32.gif | Bin 161 -> 0 bytes .../AtlantisJava/img/cursor_zoom_bw_64x64.gif | Bin 212 -> 0 bytes graphics/AtlantisJava/img/downarrow.png | Bin 183 -> 0 bytes .../AtlantisJava/img/interaction_clock.png | Bin 1033 -> 0 bytes .../AtlantisJava/img/interaction_fisheye.png | Bin 694 -> 0 bytes .../AtlantisJava/img/interaction_pick.png | Bin 260 -> 0 bytes .../AtlantisJava/img/interaction_rotate.png | Bin 608 -> 0 bytes .../img/interaction_rubberband.png | Bin 699 -> 0 bytes .../img/interaction_rubberbandyx.png | Bin 699 -> 0 bytes .../AtlantisJava/img/interaction_scale.png | Bin 422 -> 0 bytes .../AtlantisJava/img/interaction_skew.png | Bin 271 -> 0 bytes .../img/interaction_synccursors.png | Bin 455 -> 0 bytes graphics/AtlantisJava/img/interaction_zmr.png | Bin 1010 -> 0 bytes graphics/AtlantisJava/img/interaction_zr.png | Bin 234 -> 0 bytes graphics/AtlantisJava/img/left.gif | Bin 172 -> 0 bytes graphics/AtlantisJava/img/minerva_log.gif | Bin 19469 -> 0 bytes graphics/AtlantisJava/img/mode_loop.png | Bin 470 -> 0 bytes graphics/AtlantisJava/img/mode_loop_on.png | Bin 475 -> 0 bytes graphics/AtlantisJava/img/mode_random.png | Bin 1032 -> 0 bytes graphics/AtlantisJava/img/mode_random_on.png | Bin 1045 -> 0 bytes graphics/AtlantisJava/img/mode_sequential.png | Bin 387 -> 0 bytes .../AtlantisJava/img/mode_sequential_on.png | Bin 386 -> 0 bytes graphics/AtlantisJava/img/right.gif | Bin 172 -> 0 bytes graphics/AtlantisJava/img/toolbar_next.png | Bin 659 -> 0 bytes graphics/AtlantisJava/img/toolbar_open.png | Bin 550 -> 0 bytes .../AtlantisJava/img/toolbar_previous.png | Bin 634 -> 0 bytes graphics/AtlantisJava/img/uparrow.png | Bin 189 -> 0 bytes graphics/AtlantisJava/lib/Jama.jar | Bin 33329 -> 0 bytes graphics/AtlantisJava/lib/batik-anim.jar | Bin 95479 -> 0 bytes graphics/AtlantisJava/lib/batik-ext.jar | Bin 10261 -> 0 bytes graphics/AtlantisJava/lib/batik-extension.jar | Bin 68051 -> 0 bytes graphics/AtlantisJava/lib/batik-parser.jar | Bin 73710 -> 0 bytes graphics/AtlantisJava/lib/batik-script.jar | Bin 61893 -> 0 bytes graphics/AtlantisJava/lib/batik-xml.jar | Bin 30862 -> 0 bytes graphics/AtlantisJava/lib/commons-cli-1.0.jar | Bin 30117 -> 0 bytes .../AtlantisJava/lib/commons-codec-1.4.jar | Bin 58160 -> 0 bytes .../AtlantisJava/lib/commons-logging-1.1.jar | Bin 52915 -> 0 bytes graphics/AtlantisJava/lib/jas-aida-dev.jar | Bin 3738 -> 0 bytes graphics/AtlantisJava/lib/jas-aida.jar | Bin 40424 -> 0 bytes graphics/AtlantisJava/lib/jas-jel.jar | Bin 33570 -> 0 bytes graphics/AtlantisJava/lib/jlibeps.jar | Bin 17486 -> 0 bytes graphics/AtlantisJava/lib/oncrpc.jar | Bin 86081 -> 0 bytes .../lib/ostermillerutils_1_05_00.jar | Bin 34346 -> 0 bytes .../AtlantisJava/lib/test/fest-assert-1.2.jar | Bin 89901 -> 0 bytes .../lib/test/fest-reflect-1.2.jar | Bin 37208 -> 0 bytes .../AtlantisJava/lib/test/fest-util-1.1.2.jar | Bin 18962 -> 0 bytes .../lib/test/jcip-annotations-1.0.jar | Bin 2255 -> 0 bytes .../lib/ws-commons-util-1.0.2.jar | Bin 34407 -> 0 bytes graphics/AtlantisJava/lib/xml-apis-ext.jar | Bin 85686 -> 0 bytes .../AtlantisJava/lib/xmlrpc-client-3.1.jar | Bin 45124 -> 0 bytes .../AtlantisJava/lib/xmlrpc-server-3.1.jar | Bin 75310 -> 0 bytes .../AtlantisJava/share/InteractiveServer.py | 483 --- graphics/AtlantisJava/share/MINERVA.jnlp | 84 - graphics/AtlantisJava/share/atlantis | 13 - graphics/AtlantisJava/share/atlantis.jnlp | 81 - graphics/AtlantisJava/share/atlantis_online | 15 - graphics/AtlantisJava/share/ntupleXML.h | 1351 --------- .../AtlantisJava/share/specificconfig.jnlp | 83 - .../src/atlantis/ACommandLine.java | 399 --- .../src/atlantis/AOpenGLTools.java | 22 - .../AtlantisJava/src/atlantis/Atlantis.java | 770 ----- .../src/atlantis/canvas/ACanvas.java | 1113 ------- .../canvas/ADrawCalorimeterSummedEndcaps.java | 937 ------ .../src/atlantis/canvas/AGLGraphics.java | 486 --- .../src/atlantis/canvas/ALayout.java | 231 -- .../canvas/ALayoutChangeListener.java | 16 - .../src/atlantis/canvas/ALegendWindow.java | 197 -- .../src/atlantis/canvas/AOverlay.java | 193 -- .../src/atlantis/canvas/AScale.java | 356 --- .../src/atlantis/canvas/AScaleBorder.java | 1282 -------- .../src/atlantis/canvas/ATitleMenuBar.java | 92 - .../src/atlantis/canvas/AWindow.java | 1549 ---------- .../src/atlantis/canvas/AWindowGLView.java | 337 --- .../src/atlantis/canvas/AWindowSwingView.java | 57 - .../src/atlantis/canvas/package.html | 23 - .../src/atlantis/config/AConfig.java | 432 --- .../src/atlantis/config/AConfigNode.java | 263 -- .../src/atlantis/config/AConfigUpdater.java | 405 --- .../src/atlantis/config/ADefaultValues.java | 206 -- .../src/atlantis/config/package.html | 6 - .../src/atlantis/data/A3DPointData.java | 254 -- .../src/atlantis/data/AAODData.java | 359 --- .../src/atlantis/data/ABJetData.java | 134 - .../src/atlantis/data/ACSCDData.java | 304 -- .../src/atlantis/data/ACSCData.java | 197 -- .../src/atlantis/data/ACalorimeterData.java | 2662 ----------------- .../src/atlantis/data/ACalorimeterRPSPLT.java | 260 -- .../src/atlantis/data/AClusterData.java | 385 --- .../atlantis/data/ACompositeParticleData.java | 114 - .../src/atlantis/data/ADHelix.java | 539 ---- .../src/atlantis/data/AETMisData.java | 562 ---- .../src/atlantis/data/AElectronData.java | 180 -- .../src/atlantis/data/AEmTauROIData.java | 34 - .../src/atlantis/data/AEventFromXML.java | 786 ----- .../src/atlantis/data/AFCALData.java | 1228 -------- .../src/atlantis/data/AG4StepData.java | 559 ---- .../src/atlantis/data/AHECData.java | 574 ---- .../src/atlantis/data/AHelix.java | 854 ------ .../src/atlantis/data/AHelixAODData.java | 178 -- .../src/atlantis/data/AHistogram.java | 422 --- .../src/atlantis/data/AHistogramData.java | 15 - .../src/atlantis/data/AHitData.java | 487 --- .../src/atlantis/data/AInDetSegmentData.java | 30 - .../src/atlantis/data/AInDetTrackData.java | 164 - .../src/atlantis/data/AJetData.java | 782 ----- .../src/atlantis/data/AJetROIData.java | 38 - .../src/atlantis/data/ALArData.java | 1032 ------- .../atlantis/data/ALVL1JetElementData.java | 446 --- .../src/atlantis/data/ALVL1ResultData.java | 292 -- .../atlantis/data/ALVL1TriggerTowerData.java | 800 ----- .../src/atlantis/data/ALegoData.java | 1042 ------- .../src/atlantis/data/AMBTSData.java | 595 ---- .../src/atlantis/data/AMDTData.java | 338 --- .../src/atlantis/data/AMuonData.java | 95 - .../src/atlantis/data/AMuonHitData.java | 192 -- .../src/atlantis/data/AMuonROIData.java | 34 - .../src/atlantis/data/AMuonSegmentData.java | 56 - .../src/atlantis/data/AMuonTrackData.java | 200 -- .../src/atlantis/data/AOldHelix.java | 338 --- .../src/atlantis/data/APDGTable.java | 107 - .../src/atlantis/data/AParticle.java | 57 - .../src/atlantis/data/APhotonData.java | 166 - .../src/atlantis/data/APixelClusterData.java | 403 --- .../src/atlantis/data/APixelRDOData.java | 160 - .../src/atlantis/data/APulseShapePlot.java | 513 ---- .../src/atlantis/data/AROIData.java | 334 --- .../src/atlantis/data/ARPCData.java | 311 -- .../src/atlantis/data/ARVxData.java | 1043 ------- .../src/atlantis/data/AS3DData.java | 486 --- .../src/atlantis/data/ASMTrData.java | 626 ---- .../src/atlantis/data/ASNPData.java | 659 ---- .../src/atlantis/data/ASTrData.java | 254 -- .../src/atlantis/data/ASVxData.java | 167 -- .../src/atlantis/data/ASegmentData.java | 164 - .../src/atlantis/data/ASiClusterData.java | 385 --- .../src/atlantis/data/ASiClusterRDOData.java | 481 --- .../src/atlantis/data/ATGCData.java | 340 --- .../src/atlantis/data/ATILEData.java | 843 ------ .../src/atlantis/data/ATRTData.java | 752 ----- .../src/atlantis/data/ATauJetData.java | 198 -- .../src/atlantis/data/ATrackData.java | 1389 --------- .../src/atlantis/data/ATrackResidualData.java | 323 -- .../src/atlantis/data/ATrigS3DData.java | 252 -- .../src/atlantis/data/ATriggerInfoData.java | 213 -- .../src/atlantis/data/AVertex.java | 328 -- .../src/atlantis/data/AVertexFit.java | 289 -- .../src/atlantis/data/package.html | 8 - .../src/atlantis/event/AAssociation.java | 298 -- .../atlantis/event/AAssociationManager.java | 118 - .../atlantis/event/ABufferedEventSource.java | 263 -- .../src/atlantis/event/AData.java | 1661 ---------- .../src/atlantis/event/AEpsImageProducer.java | 117 - .../src/atlantis/event/AEvent.java | 1051 ------- .../src/atlantis/event/AEventInfo.java | 212 -- .../src/atlantis/event/AEventInfoPrinter.java | 60 - .../src/atlantis/event/AEventManager.java | 319 -- .../src/atlantis/event/AEventSource.java | 114 - .../atlantis/event/AEventSourceException.java | 65 - .../src/atlantis/event/AFileEventSource.java | 309 -- .../src/atlantis/event/AFilter.java | 275 -- .../src/atlantis/event/AImageProducer.java | 129 - .../src/atlantis/event/ANewEventListener.java | 18 - .../event/ANewEventSourceListener.java | 16 - .../atlantis/event/AObjectsAssociation.java | 26 - .../src/atlantis/event/APngImageProducer.java | 119 - .../atlantis/event/AStreamedEventSource.java | 52 - .../src/atlantis/event/ASvgImageProducer.java | 117 - .../src/atlantis/event/AURLEventSource.java | 385 --- .../src/atlantis/event/AZipEventSource.java | 478 --- .../event/oncrpc/AONCRPCEventSource.java | 304 -- .../src/atlantis/event/oncrpc/Event.java | 86 - .../atlantis/event/oncrpc/EventRequest.java | 79 - .../src/atlantis/event/oncrpc/Server.java | 47 - .../src/atlantis/event/oncrpc/Streams.java | 53 - .../src/atlantis/event/package.html | 9 - .../atlantis/event/xmlrpc/AClientXMLRPC.java | 244 -- .../event/xmlrpc/ARemoteCallerException.java | 22 - .../atlantis/event/xmlrpc/AServerXMLRPC.java | 43 - .../xmlrpc/AServerXMLRPCEventSource.java | 146 - .../event/xmlrpc/AXMLRPCEventSource.java | 238 -- .../src/atlantis/geometry/AAtlasDetector.java | 119 - .../geometry/ABarrelCalorimeterDetector.java | 284 -- .../geometry/ABarrelSiliconDetector.java | 276 -- .../atlantis/geometry/ABarrelTRTDetector.java | 184 -- .../src/atlantis/geometry/ABoxDetector.java | 172 -- .../src/atlantis/geometry/ABoxDetectors.java | 168 -- .../geometry/ACalorimeterDetector.java | 699 ----- .../src/atlantis/geometry/ADetector.java | 157 - .../atlantis/geometry/ADetectorSystem.java | 122 - .../src/atlantis/geometry/ADetectors.java | 114 - .../src/atlantis/geometry/ADiscDetector.java | 57 - .../geometry/AEndcapCalorimeterDetector.java | 328 -- .../geometry/AEndcapCryostatDetector.java | 158 - .../geometry/AEndcapSiliconDetector.java | 220 -- .../atlantis/geometry/AEndcapTRTDetector.java | 173 -- .../geometry/AGapCalorimeterDetector.java | 179 -- .../atlantis/geometry/AGeneralDetectors.java | 71 - .../geometry/AGeometryFromXMLReader.java | 286 -- .../atlantis/geometry/ARectangleDetector.java | 49 - .../src/atlantis/geometry/ATBxDetector.java | 81 - .../atlantis/geometry/ATrapezoidDetector.java | 211 -- .../geometry/ATrapezoidDetectors.java | 163 - .../src/atlantis/geometry/package.html | 8 - .../src/atlantis/globals/AGlobals.java | 202 -- .../src/atlantis/globals/package.html | 13 - .../graphics/AAbstractGraphics2D.java | 315 -- .../src/atlantis/graphics/AClipper.java | 226 -- .../src/atlantis/graphics/ACoord.java | 355 --- .../src/atlantis/graphics/ACursorFactory.java | 227 -- .../atlantis/graphics/ADrawParameters.java | 98 - .../src/atlantis/graphics/ADrawable.java | 24 - .../atlantis/graphics/ADrawnGraphics2D.java | 149 - .../atlantis/graphics/ADummyGraphics2D.java | 215 -- .../atlantis/graphics/AGLPixelGraphics.java | 47 - .../src/atlantis/graphics/AGraphics.java | 407 --- .../src/atlantis/graphics/AIcon.java | 28 - .../src/atlantis/graphics/ALegoDraw.java | 1150 ------- .../atlantis/graphics/APickingGraphics2D.java | 432 --- .../src/atlantis/graphics/APixelGraphics.java | 304 -- .../graphics/ATemplateGraphics2D.java | 47 - .../atlantis/graphics/AVectorGraphics.java | 309 -- .../atlantis/graphics/colormap/AColorMap.java | 365 --- .../graphics/colormap/MappedColor.java | 93 - .../src/atlantis/graphics/dnd/ACallBack.java | 9 - .../src/atlantis/graphics/dnd/ADnDButton.java | 88 - .../src/atlantis/graphics/dnd/ADnDLabel.java | 184 -- .../atlantis/graphics/dnd/ADragListener.java | 9 - .../graphics/dnd/AObjectTransferable.java | 62 - .../graphics/encoders/AImageEncoder.java | 167 -- .../graphics/encoders/PngEncoder.java | 582 ---- .../atlantis/graphics/layout/AFlowLayout.java | 115 - .../atlantis/graphics/layout/AGridLayout.java | 214 -- .../graphics/layout/ARunAnotherLayout.java | 26 - .../src/atlantis/graphics/package.html | 6 - .../src/atlantis/gui/AAboutDialog.java | 214 -- .../src/atlantis/gui/ACheckBox.java | 33 - .../src/atlantis/gui/ACheckNode.java | 86 - .../gui/AClosingConfirmationDialog.java | 63 - .../atlantis/gui/AColorComboBoxRenderer.java | 126 - .../src/atlantis/gui/AColorHelpDialog.java | 260 -- .../src/atlantis/gui/AColorMapDialog.java | 109 - .../src/atlantis/gui/AColorMapEditor.java | 281 -- .../src/atlantis/gui/AComboBox.java | 51 - .../src/atlantis/gui/AConfigWriter.java | 417 --- .../src/atlantis/gui/AControlButton.java | 84 - .../src/atlantis/gui/ACrashReporter.java | 232 -- .../atlantis/gui/ADefaultCellAttribute.java | 129 - .../src/atlantis/gui/ADemoDialog.java | 434 --- .../src/atlantis/gui/ADemoFileChooser.java | 41 - .../src/atlantis/gui/ADemoLoop.java | 200 -- .../src/atlantis/gui/AEventLoopDialog.java | 346 --- .../atlantis/gui/AEventPropertiesDialog.java | 721 ----- .../src/atlantis/gui/AEventQueue.java | 165 - .../src/atlantis/gui/AEventSourceToolBar.java | 523 ---- .../src/atlantis/gui/AFileControl.java | 210 -- .../AtlantisJava/src/atlantis/gui/AGUI.java | 572 ---- .../src/atlantis/gui/AGUILayoutManager.java | 131 - .../src/atlantis/gui/AGUIUtilities.java | 167 -- .../src/atlantis/gui/AHelpControl.java | 45 - .../src/atlantis/gui/AHelpSystem.java | 118 - .../src/atlantis/gui/AInteractionToolBar.java | 429 --- .../src/atlantis/gui/AItemTabbedPane.java | 144 - .../src/atlantis/gui/ALayoutDialog.java | 109 - .../src/atlantis/gui/ALazyPanel.java | 109 - .../src/atlantis/gui/AListsControl.java | 28 - .../src/atlantis/gui/ALogPane.java | 205 -- .../src/atlantis/gui/AMainLogPane.java | 13 - .../src/atlantis/gui/AMenuButton.java | 46 - .../src/atlantis/gui/AMouseHelpDialog.java | 312 -- .../atlantis/gui/AMultiSpanCellTableUI.java | 81 - .../src/atlantis/gui/AMutableCheckBox.java | 183 -- .../src/atlantis/gui/AOpenGLControl.java | 160 - .../src/atlantis/gui/AParamGUIDataModel.java | 173 -- .../src/atlantis/gui/AParametersPage.java | 44 - .../src/atlantis/gui/AParametersTable.java | 253 -- .../src/atlantis/gui/APasswordDialog.java | 203 -- .../atlantis/gui/APointerPositionWindow.java | 175 -- .../src/atlantis/gui/APopupHelper.java | 48 - .../src/atlantis/gui/APreferencesControl.java | 429 --- .../atlantis/gui/AReadColorMapChooser.java | 35 - .../src/atlantis/gui/AReadFileChooser.java | 103 - .../atlantis/gui/AReadGeometryChooser.java | 79 - .../src/atlantis/gui/ASaveCanvasDialog.java | 477 --- .../src/atlantis/gui/AStartupWindow.java | 86 - .../src/atlantis/gui/ATabbedPaneUI.java | 35 - .../src/atlantis/gui/ATextField.java | 31 - .../src/atlantis/gui/ATreeCellRenderer.java | 34 - .../atlantis/gui/ATreeExpansionListener.java | 43 - .../src/atlantis/gui/AWindowControl.java | 190 -- .../src/atlantis/gui/AXMLFileChooser.java | 108 - .../src/atlantis/gui/AXMLGeometryChooser.java | 73 - .../src/atlantis/gui/package.html | 8 - .../atlantis/interactions/A3DBoxGroup.java | 14 - .../interactions/A3DBoxInteraction.java | 202 -- .../atlantis/interactions/AClockGroup.java | 62 - .../interactions/AClockInteraction.java | 103 - .../interactions/AEnterExitListener.java | 13 - .../interactions/AFishEyeChangeListener.java | 17 - .../atlantis/interactions/AFishEyeGroup.java | 116 - .../interactions/AFishEyeInteraction.java | 389 --- .../atlantis/interactions/AInteraction.java | 323 -- .../interactions/AInteractionGroup.java | 143 - .../AInteractionsConfigReader.java | 69 - .../interactions/AInteractionsManager.java | 535 ---- .../atlantis/interactions/ALineSegment.java | 165 - .../src/atlantis/interactions/AModifier.java | 85 - .../interactions/AMouseDragListener.java | 20 - .../interactions/AMousePressListener.java | 16 - .../src/atlantis/interactions/ANZMRGroup.java | 16 - .../interactions/ANZMRInteraction.java | 80 - .../interactions/AParallelogramSelection.java | 119 - .../src/atlantis/interactions/APickGroup.java | 102 - .../interactions/APickInteraction.java | 419 --- .../atlantis/interactions/APopupListener.java | 16 - .../interactions/ARectangleSelection.java | 95 - .../interactions/ARectangleVPSelection.java | 524 ---- .../interactions/ARectangleYXSelection.java | 320 -- .../ARotatedRectangleSelection.java | 211 -- .../interactions/ARubberbandGroup.java | 109 - .../interactions/ARubberbandYXGroup.java | 109 - .../interactions/AScaleCopyGroup.java | 14 - .../interactions/AScaleCopyInteraction.java | 24 - .../src/atlantis/interactions/ASelection.java | 455 --- .../src/atlantis/interactions/ASkewGroup.java | 14 - .../interactions/ASkewInteraction.java | 123 - .../interactions/ASleepMouseDragListener.java | 13 - .../interactions/ASquareSelection.java | 87 - .../interactions/ASynchroCursorsGroup.java | 15 - .../ASynchroCursorsInteraction.java | 483 --- .../interactions/AVPSelectionGroup.java | 15 - .../interactions/AWindowInfoInteraction.java | 73 - .../interactions/AXSkewSelection.java | 124 - .../interactions/AXSliceSelection.java | 79 - .../interactions/AYSkewSelection.java | 124 - .../interactions/AYSliceSelection.java | 79 - .../src/atlantis/interactions/AZMRGroup.java | 14 - .../interactions/AZMRInteraction.java | 700 ----- .../src/atlantis/interactions/package.html | 11 - .../src/atlantis/list/AColorIcon.java | 69 - .../AtlantisJava/src/atlantis/list/AList.java | 128 - .../src/atlantis/list/AListManager.java | 1765 ----------- .../src/atlantis/list/AListProcessor.java | 10 - .../src/atlantis/list/package.html | 6 - .../src/atlantis/nge/ANAnimInterpolate.java | 47 - .../src/atlantis/nge/ANAnimSegment.java | 13 - .../src/atlantis/nge/ANAnimSetProjection.java | 38 - .../src/atlantis/nge/ANAnimThread.java | 67 - .../src/atlantis/nge/ANAnimVar.java | 27 - .../src/atlantis/nge/ANAnimationManager.java | 92 - .../src/atlantis/nge/ANCacheToken.java | 11 - .../src/atlantis/nge/ANColor.java | 87 - .../src/atlantis/nge/ANFrameManager.java | 190 -- .../src/atlantis/nge/ANGlobalFlags.java | 17 - .../src/atlantis/nge/ANLinearProjection.java | 229 -- .../src/atlantis/nge/ANLinearTransition.java | 140 - .../src/atlantis/nge/ANManager.java | 122 - .../src/atlantis/nge/ANObjectGenerator.java | 151 - .../src/atlantis/nge/ANPickDrawer.java | 59 - .../src/atlantis/nge/ANPickHandler.java | 11 - .../src/atlantis/nge/ANPickHandlerSimple.java | 19 - .../src/atlantis/nge/ANPickHelper.java | 51 - .../src/atlantis/nge/ANPickListener.java | 15 - .../src/atlantis/nge/ANPickResult.java | 21 - .../src/atlantis/nge/ANPickResultPrinter.java | 17 - .../src/atlantis/nge/ANProjection.java | 20 - .../src/atlantis/nge/ANProjection3D.java | 90 - .../src/atlantis/nge/ANProjectionPhysics.java | 181 -- .../src/atlantis/nge/ANProjectionYX.java | 46 - .../src/atlantis/nge/ANRenderHints.java | 33 - .../src/atlantis/nge/ANRenderer.java | 22 - .../src/atlantis/nge/ANRendererBasic.java | 88 - .../src/atlantis/nge/ANSelectionList.java | 81 - .../src/atlantis/nge/ANTerribleHacks.java | 119 - .../src/atlantis/nge/ANTestWindow.java | 119 - .../src/atlantis/nge/object/ANObject.java | 27 - .../src/atlantis/nge/object/ANObjectList.java | 30 - .../atlantis/nge/object/ANObjectTestAxes.java | 44 - .../src/atlantis/nge/object/ANObjectVL.java | 66 - .../nge/object/data/ANObjectDataCell.java | 170 -- .../nge/object/data/ANObjectDataJet.java | 146 - .../nge/object/data/ANObjectPointing.java | 147 - .../nge/object/data/ANObjectTracks.java | 82 - .../nge/object/geometry/ANObjectBeamLine.java | 21 - .../nge/object/geometry/ANObjectGeomCalo.java | 159 - .../nge/object/geometry/ANObjectGeomMuon.java | 229 -- .../atlantis/output/AExceptionHandler.java | 61 - .../src/atlantis/output/ALogInterface.java | 25 - .../src/atlantis/output/AOutput.java | 54 - .../AtlantisJava/src/atlantis/package.html | 8 - .../parameters/AAbstractParameter.java | 913 ------ .../atlantis/parameters/AColorParameter.java | 92 - .../src/atlantis/parameters/ACommand.java | 31 - .../parameters/ACommandProcessor.java | 451 --- .../atlantis/parameters/ACutParameter.java | 171 -- .../parameters/AEnumeratorParameter.java | 278 -- .../atlantis/parameters/ALinkParameter.java | 151 - .../parameters/AListIntegerParameter.java | 98 - .../atlantis/parameters/ANumberParameter.java | 104 - .../src/atlantis/parameters/APar.java | 657 ---- .../src/atlantis/parameters/AParameter.java | 107 - .../parameters/AParameterChangeListener.java | 11 - .../parameters/AParameterConfigReader.java | 114 - .../atlantis/parameters/AParameterData.java | 202 -- .../atlantis/parameters/AParameterState.java | 38 - .../parameters/AParameterSuperGroup.java | 241 -- .../parameters/AParameterUtilities.java | 102 - .../atlantis/parameters/AParametersGroup.java | 157 - .../parameters/AStatusGroupParameter.java | 213 -- .../atlantis/parameters/AStatusParameter.java | 58 - .../parameters/AStatusRootParameter.java | 435 --- .../src/atlantis/parameters/package.html | 7 - .../src/atlantis/projection/AProjection.java | 32 - .../atlantis/projection/AProjection2D.java | 348 --- .../atlantis/projection/AProjection3D.java | 167 -- .../atlantis/projection/AProjection3DBox.java | 569 ---- .../projection/AProjectionEventInfo.java | 197 -- .../atlantis/projection/AProjectionFR.java | 127 - .../atlantis/projection/AProjectionFZ.java | 76 - .../atlantis/projection/AProjectionInfo.java | 102 - .../projection/AProjectionLegoPlot.java | 402 --- .../atlantis/projection/AProjectionN3D.java | 66 - .../atlantis/projection/AProjectionNGE.java | 143 - .../projection/AProjectionNPhysics.java | 95 - .../atlantis/projection/AProjectionNYX.java | 71 - .../atlantis/projection/AProjectionPhi.java | 73 - .../atlantis/projection/AProjectionRZ.java | 68 - .../projection/AProjectionTrackResidual.java | 167 -- .../atlantis/projection/AProjectionVP.java | 169 -- .../atlantis/projection/AProjectionXZ.java | 81 - .../atlantis/projection/AProjectionYX.java | 307 -- .../atlantis/projection/AProjectionYZ.java | 72 - .../projection/AProjectionsManager.java | 110 - .../src/atlantis/projection/package.html | 9 - .../src/atlantis/utils/A3Vector.java | 98 - .../src/atlantis/utils/A4Vector.java | 127 - .../atlantis/utils/AAtlantisException.java | 41 - .../src/atlantis/utils/AClipPolygon.java | 98 - .../src/atlantis/utils/ACommandHistory.java | 213 -- .../src/atlantis/utils/AHashMap.java | 201 -- .../src/atlantis/utils/AIdDictionary.java | 152 - .../src/atlantis/utils/AIdField.java | 537 ---- .../src/atlantis/utils/AIdHelper.java | 599 ---- .../src/atlantis/utils/AIdRange.java | 392 --- .../src/atlantis/utils/AIntHashtable.java | 79 - .../src/atlantis/utils/ALogger.java | 213 -- .../src/atlantis/utils/ALoggerFactory.java | 25 - .../src/atlantis/utils/AMath.java | 328 -- .../src/atlantis/utils/ANewIdHelper.java | 157 - .../src/atlantis/utils/APoint.java | 72 - .../src/atlantis/utils/APolygon.java | 238 -- .../src/atlantis/utils/AUtilities.java | 243 -- .../src/atlantis/utils/AVector.java | 84 - .../src/atlantis/utils/package.html | 6 - .../src/atlantis/utils/xml/AArrayParser.java | 36 - .../atlantis/utils/xml/AFloatArrayParser.java | 255 -- .../atlantis/utils/xml/AIntArrayParser.java | 126 - .../utils/xml/AStringArrayParser.java | 103 - .../utils/xml/AXMLEntityResolver.java | 40 - .../atlantis/utils/xml/AXMLErrorHandler.java | 127 - .../src/atlantis/utils/xml/AXMLUtils.java | 38 - graphics/AtlantisJava/src/overview.html | 25 - .../AtlantisJava/test/events/emptyEvent.xml | 6 - .../test/events/muonCollections.xml | 240 -- .../test/events/muonCollections2.xml | 291 -- .../AtlantisJava/test/events/rvxEvent.xml | 44 - .../test/events/rvxInconsistentEvent.xml | 258 -- .../atlantis/AtlantisHeadlessTestCase.java | 38 - .../test/src/atlantis/HeadlessTest.java | 21 - .../src/atlantis/InconsistentEventTest.java | 36 - .../src/atlantis/NoTracksElementTest.java | 36 - .../src/atlantis/canvas/AScaleBorderTest.java | 19 - .../test/src/atlantis/canvas/AScaleTest.java | 104 - .../test/src/atlantis/canvas/AWindowTest.java | 14 - .../test/src/atlantis/data/AHelixTest.java | 100 - .../test/src/atlantis/data/AOldHelixTest.java | 92 - .../src/atlantis/event/AEventInfoTest.java | 68 - .../src/atlantis/graphics/ACoordTest.java | 73 - .../src/atlantis/list/AListManagerTest.java | 51 - .../parameters/AAbstractParameterTest.java | 120 - .../parameters/AParameterDataTest.java | 84 - .../test/src/atlantis/utils/A3VectorTest.java | 101 - .../test/src/atlantis/utils/A4VectorTest.java | 128 - .../test/src/atlantis/utils/AIdRangeTest.java | 90 - .../test/src/atlantis/utils/AMathTest.java | 69 - .../src/atlantis/utils/ANewIdHelperTest.java | 130 - .../test/src/guitest/AAssert.java | 28 - .../test/src/guitest/AtlantisGUIFixture.java | 141 - .../test/src/guitest/AtlantisGuiTestCase.java | 100 - .../src/guitest/EnumeratorParameterTest.java | 17 - .../src/guitest/EventSourceToolBarTest.java | 14 - .../src/guitest/InteractionToolBarTest.java | 48 - .../src/guitest/LoadEventFailureTest.java | 22 - .../test/src/guitest/LoadEventTest.java | 25 - ...LoadEventWithInvalidRecVertexDataTest.java | 29 - .../LoadEventWithValidRecVertexDataTest.java | 29 - .../src/guitest/LoadEventsManyTimesTest.java | 31 - .../MuonTrackCollectionsEmptyTest.java | 39 - .../src/guitest/MuonTrackCollectionsTest.java | 40 - .../test/src/guitest/OverlayTest.java | 27 - .../test/src/guitest/ProjectionsTest.java | 24 - .../guitest/ReadNextAndPreviousEventTest.java | 27 - .../test/src/guitest/StartAndExitTest.java | 19 - .../test/src/guitest/TabsTest.java | 23 - .../test/src/testutils/AtlantisInit.java | 20 - .../test/src/testutils/TeeOutputStream.java | 34 - .../test/src/testutils/TestUtils.java | 17 - 555 files changed, 103264 deletions(-) delete mode 100644 graphics/AtlantisJava/CMakeLists.txt delete mode 100755 graphics/AtlantisJava/ant/build.xml delete mode 100755 graphics/AtlantisJava/configuration/PSProlog.txt delete mode 100755 graphics/AtlantisJava/configuration/colormap.xml delete mode 100644 graphics/AtlantisJava/configuration/config.dtd delete mode 100644 graphics/AtlantisJava/configuration/epusti.csv delete mode 100755 graphics/AtlantisJava/configuration/pdg.xml delete mode 100644 graphics/AtlantisJava/configuration/rpsplt_fcal.csv delete mode 100644 graphics/AtlantisJava/configuration/rpsplt_hec.csv delete mode 100644 graphics/AtlantisJava/configuration/rpsplt_tile.csv delete mode 100755 graphics/AtlantisJava/events/event.dtd delete mode 100755 graphics/AtlantisJava/geometry/AGeometry.xml delete mode 100755 graphics/AtlantisJava/geometry/AMuonGeometry.xml delete mode 100755 graphics/AtlantisJava/geometry/ATLAS_IDS.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDict.dtd delete mode 100755 graphics/AtlantisJava/geometry/IdDictATLAS.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictCalorimeter.xml delete mode 100644 graphics/AtlantisJava/geometry/IdDictForwardDetectors.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictInnerDetector.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictLArCalorimeter.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictLArElectrode.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictLArHighVoltage.xml delete mode 100755 graphics/AtlantisJava/geometry/IdDictTileCalorimeter.xml delete mode 100755 graphics/AtlantisJava/img/atlantis_icon.gif delete mode 100755 graphics/AtlantisJava/img/atlantis_log.gif delete mode 100755 graphics/AtlantisJava/img/atlas.jpg delete mode 100644 graphics/AtlantisJava/img/atlas_logo_big.png delete mode 100755 graphics/AtlantisJava/img/cursor_DnD_invalid_32x32.gif delete mode 100755 graphics/AtlantisJava/img/cursor_DnD_invalid_64x64.gif delete mode 100755 graphics/AtlantisJava/img/cursor_DnD_valid_32x32.gif delete mode 100755 graphics/AtlantisJava/img/cursor_DnD_valid_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_fisheye_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_fisheye_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_fisheye_bw_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_fisheye_bw_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_move_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_move_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_pick_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_pick_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rectsel_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rectsel_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rotate_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rotate_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rotate_bw_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_rotate_bw_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_sync_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_sync_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_zoom_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_zoom_64x64.gif delete mode 100644 graphics/AtlantisJava/img/cursor_zoom_bw_32x32.gif delete mode 100644 graphics/AtlantisJava/img/cursor_zoom_bw_64x64.gif delete mode 100644 graphics/AtlantisJava/img/downarrow.png delete mode 100644 graphics/AtlantisJava/img/interaction_clock.png delete mode 100644 graphics/AtlantisJava/img/interaction_fisheye.png delete mode 100644 graphics/AtlantisJava/img/interaction_pick.png delete mode 100644 graphics/AtlantisJava/img/interaction_rotate.png delete mode 100644 graphics/AtlantisJava/img/interaction_rubberband.png delete mode 100644 graphics/AtlantisJava/img/interaction_rubberbandyx.png delete mode 100644 graphics/AtlantisJava/img/interaction_scale.png delete mode 100644 graphics/AtlantisJava/img/interaction_skew.png delete mode 100644 graphics/AtlantisJava/img/interaction_synccursors.png delete mode 100644 graphics/AtlantisJava/img/interaction_zmr.png delete mode 100644 graphics/AtlantisJava/img/interaction_zr.png delete mode 100755 graphics/AtlantisJava/img/left.gif delete mode 100644 graphics/AtlantisJava/img/minerva_log.gif delete mode 100644 graphics/AtlantisJava/img/mode_loop.png delete mode 100644 graphics/AtlantisJava/img/mode_loop_on.png delete mode 100644 graphics/AtlantisJava/img/mode_random.png delete mode 100644 graphics/AtlantisJava/img/mode_random_on.png delete mode 100644 graphics/AtlantisJava/img/mode_sequential.png delete mode 100644 graphics/AtlantisJava/img/mode_sequential_on.png delete mode 100755 graphics/AtlantisJava/img/right.gif delete mode 100755 graphics/AtlantisJava/img/toolbar_next.png delete mode 100755 graphics/AtlantisJava/img/toolbar_open.png delete mode 100755 graphics/AtlantisJava/img/toolbar_previous.png delete mode 100644 graphics/AtlantisJava/img/uparrow.png delete mode 100755 graphics/AtlantisJava/lib/Jama.jar delete mode 100644 graphics/AtlantisJava/lib/batik-anim.jar delete mode 100644 graphics/AtlantisJava/lib/batik-ext.jar delete mode 100644 graphics/AtlantisJava/lib/batik-extension.jar delete mode 100644 graphics/AtlantisJava/lib/batik-parser.jar delete mode 100644 graphics/AtlantisJava/lib/batik-script.jar delete mode 100644 graphics/AtlantisJava/lib/batik-xml.jar delete mode 100755 graphics/AtlantisJava/lib/commons-cli-1.0.jar delete mode 100644 graphics/AtlantisJava/lib/commons-codec-1.4.jar delete mode 100644 graphics/AtlantisJava/lib/commons-logging-1.1.jar delete mode 100755 graphics/AtlantisJava/lib/jas-aida-dev.jar delete mode 100755 graphics/AtlantisJava/lib/jas-aida.jar delete mode 100755 graphics/AtlantisJava/lib/jas-jel.jar delete mode 100644 graphics/AtlantisJava/lib/jlibeps.jar delete mode 100644 graphics/AtlantisJava/lib/oncrpc.jar delete mode 100644 graphics/AtlantisJava/lib/ostermillerutils_1_05_00.jar delete mode 100644 graphics/AtlantisJava/lib/test/fest-assert-1.2.jar delete mode 100644 graphics/AtlantisJava/lib/test/fest-reflect-1.2.jar delete mode 100644 graphics/AtlantisJava/lib/test/fest-util-1.1.2.jar delete mode 100644 graphics/AtlantisJava/lib/test/jcip-annotations-1.0.jar delete mode 100644 graphics/AtlantisJava/lib/ws-commons-util-1.0.2.jar delete mode 100644 graphics/AtlantisJava/lib/xml-apis-ext.jar delete mode 100644 graphics/AtlantisJava/lib/xmlrpc-client-3.1.jar delete mode 100644 graphics/AtlantisJava/lib/xmlrpc-server-3.1.jar delete mode 100755 graphics/AtlantisJava/share/InteractiveServer.py delete mode 100644 graphics/AtlantisJava/share/MINERVA.jnlp delete mode 100755 graphics/AtlantisJava/share/atlantis delete mode 100644 graphics/AtlantisJava/share/atlantis.jnlp delete mode 100755 graphics/AtlantisJava/share/atlantis_online delete mode 100644 graphics/AtlantisJava/share/ntupleXML.h delete mode 100644 graphics/AtlantisJava/share/specificconfig.jnlp delete mode 100644 graphics/AtlantisJava/src/atlantis/ACommandLine.java delete mode 100644 graphics/AtlantisJava/src/atlantis/AOpenGLTools.java delete mode 100644 graphics/AtlantisJava/src/atlantis/Atlantis.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/ACanvas.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/ADrawCalorimeterSummedEndcaps.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/AGLGraphics.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/ALayout.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/ALayoutChangeListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/ALegendWindow.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/AOverlay.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/AScale.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/AScaleBorder.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/ATitleMenuBar.java delete mode 100755 graphics/AtlantisJava/src/atlantis/canvas/AWindow.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/AWindowGLView.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/AWindowSwingView.java delete mode 100644 graphics/AtlantisJava/src/atlantis/canvas/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/config/AConfig.java delete mode 100755 graphics/AtlantisJava/src/atlantis/config/AConfigNode.java delete mode 100644 graphics/AtlantisJava/src/atlantis/config/AConfigUpdater.java delete mode 100755 graphics/AtlantisJava/src/atlantis/config/ADefaultValues.java delete mode 100644 graphics/AtlantisJava/src/atlantis/config/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/data/A3DPointData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AAODData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ABJetData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ACSCDData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ACSCData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ACalorimeterData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ACalorimeterRPSPLT.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AClusterData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ACompositeParticleData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ADHelix.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AETMisData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AElectronData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AEmTauROIData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AEventFromXML.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AFCALData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AG4StepData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AHECData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AHelix.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AHelixAODData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AHistogram.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AHistogramData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AHitData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AInDetSegmentData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AInDetTrackData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AJetData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AJetROIData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ALArData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ALVL1JetElementData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ALVL1ResultData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ALVL1TriggerTowerData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ALegoData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AMBTSData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AMDTData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AMuonData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AMuonHitData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AMuonROIData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AMuonSegmentData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AMuonTrackData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AOldHelix.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/APDGTable.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AParticle.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/APhotonData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/APixelClusterData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/APixelRDOData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/APulseShapePlot.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AROIData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ARPCData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ARVxData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/AS3DData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASMTrData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASNPData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASTrData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASVxData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ASegmentData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASiClusterData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ASiClusterRDOData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ATGCData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ATILEData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ATRTData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/ATauJetData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ATrackData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ATrackResidualData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ATrigS3DData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/ATriggerInfoData.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AVertex.java delete mode 100755 graphics/AtlantisJava/src/atlantis/data/AVertexFit.java delete mode 100644 graphics/AtlantisJava/src/atlantis/data/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AAssociation.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AAssociationManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/ABufferedEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AEpsImageProducer.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AEvent.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AEventInfo.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AEventInfoPrinter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AEventManager.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AEventSourceException.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AFileEventSource.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/AFilter.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AImageProducer.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/ANewEventListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/ANewEventSourceListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AObjectsAssociation.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/APngImageProducer.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AStreamedEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/ASvgImageProducer.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AURLEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/AZipEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/oncrpc/AONCRPCEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/oncrpc/Event.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/oncrpc/EventRequest.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/oncrpc/Server.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/oncrpc/Streams.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/event/xmlrpc/AClientXMLRPC.java delete mode 100755 graphics/AtlantisJava/src/atlantis/event/xmlrpc/ARemoteCallerException.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPC.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPCEventSource.java delete mode 100644 graphics/AtlantisJava/src/atlantis/event/xmlrpc/AXMLRPCEventSource.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AAtlasDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ABarrelCalorimeterDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ABarrelSiliconDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ABarrelTRTDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ABoxDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ABoxDetectors.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ACalorimeterDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ADetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ADetectorSystem.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ADetectors.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ADiscDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AEndcapCalorimeterDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AEndcapCryostatDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AEndcapSiliconDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AEndcapTRTDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AGapCalorimeterDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AGeneralDetectors.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/AGeometryFromXMLReader.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ARectangleDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ATBxDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetectors.java delete mode 100644 graphics/AtlantisJava/src/atlantis/geometry/package.html delete mode 100644 graphics/AtlantisJava/src/atlantis/globals/AGlobals.java delete mode 100644 graphics/AtlantisJava/src/atlantis/globals/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/AAbstractGraphics2D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/AClipper.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ACoord.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ACursorFactory.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ADrawParameters.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ADrawable.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ADrawnGraphics2D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ADummyGraphics2D.java delete mode 100644 graphics/AtlantisJava/src/atlantis/graphics/AGLPixelGraphics.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/AGraphics.java delete mode 100644 graphics/AtlantisJava/src/atlantis/graphics/AIcon.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ALegoDraw.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/APickingGraphics2D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/APixelGraphics.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/ATemplateGraphics2D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/AVectorGraphics.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/colormap/AColorMap.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/colormap/MappedColor.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/dnd/ACallBack.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDButton.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDLabel.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/dnd/ADragListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/dnd/AObjectTransferable.java delete mode 100644 graphics/AtlantisJava/src/atlantis/graphics/encoders/AImageEncoder.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/encoders/PngEncoder.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/layout/AFlowLayout.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/layout/AGridLayout.java delete mode 100755 graphics/AtlantisJava/src/atlantis/graphics/layout/ARunAnotherLayout.java delete mode 100644 graphics/AtlantisJava/src/atlantis/graphics/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AAboutDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ACheckBox.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ACheckNode.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AClosingConfirmationDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AColorComboBoxRenderer.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AColorHelpDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AColorMapDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AColorMapEditor.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AComboBox.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AConfigWriter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AControlButton.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/ACrashReporter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ADefaultCellAttribute.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ADemoDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ADemoFileChooser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ADemoLoop.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AEventLoopDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AEventPropertiesDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AEventQueue.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AEventSourceToolBar.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AFileControl.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AGUI.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AGUILayoutManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AGUIUtilities.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AHelpControl.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AHelpSystem.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AInteractionToolBar.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AItemTabbedPane.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ALayoutDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ALazyPanel.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AListsControl.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/ALogPane.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AMainLogPane.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AMenuButton.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AMouseHelpDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AMultiSpanCellTableUI.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AMutableCheckBox.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/AOpenGLControl.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AParamGUIDataModel.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AParametersPage.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AParametersTable.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/APasswordDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/APointerPositionWindow.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/APopupHelper.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/APreferencesControl.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AReadColorMapChooser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AReadFileChooser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AReadGeometryChooser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ASaveCanvasDialog.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AStartupWindow.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ATabbedPaneUI.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ATextField.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ATreeCellRenderer.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/ATreeExpansionListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AWindowControl.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AXMLFileChooser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/gui/AXMLGeometryChooser.java delete mode 100644 graphics/AtlantisJava/src/atlantis/gui/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/A3DBoxGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/A3DBoxInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AClockGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AClockInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AEnterExitListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/AFishEyeChangeListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AFishEyeGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AFishEyeInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AInteractionGroup.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/AInteractionsConfigReader.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AInteractionsManager.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ALineSegment.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/AModifier.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AMouseDragListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AMousePressListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/ANZMRGroup.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/ANZMRInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AParallelogramSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/APickGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/APickInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/APopupListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARectangleSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARectangleVPSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARectangleYXSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARotatedRectangleSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARubberbandGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ARubberbandYXGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASkewGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASkewInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASleepMouseDragListener.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASquareSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AVPSelectionGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AWindowInfoInteraction.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AXSkewSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AXSliceSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AYSkewSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AYSliceSelection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AZMRGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/interactions/AZMRInteraction.java delete mode 100644 graphics/AtlantisJava/src/atlantis/interactions/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/list/AColorIcon.java delete mode 100755 graphics/AtlantisJava/src/atlantis/list/AList.java delete mode 100755 graphics/AtlantisJava/src/atlantis/list/AListManager.java delete mode 100755 graphics/AtlantisJava/src/atlantis/list/AListProcessor.java delete mode 100644 graphics/AtlantisJava/src/atlantis/list/package.html delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimInterpolate.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimSegment.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimSetProjection.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimThread.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimVar.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANAnimationManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANCacheToken.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANColor.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANFrameManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANGlobalFlags.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANLinearProjection.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANLinearTransition.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANObjectGenerator.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickDrawer.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickHandler.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickHandlerSimple.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickHelper.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickResult.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANPickResultPrinter.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANProjection.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANProjection3D.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANProjectionPhysics.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANProjectionYX.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANRenderHints.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANRenderer.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANRendererBasic.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANSelectionList.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANTerribleHacks.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/ANTestWindow.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/ANObject.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/ANObjectList.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/ANObjectTestAxes.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/ANObjectVL.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataCell.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataJet.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectPointing.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectTracks.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectBeamLine.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomCalo.java delete mode 100644 graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomMuon.java delete mode 100755 graphics/AtlantisJava/src/atlantis/output/AExceptionHandler.java delete mode 100644 graphics/AtlantisJava/src/atlantis/output/ALogInterface.java delete mode 100755 graphics/AtlantisJava/src/atlantis/output/AOutput.java delete mode 100644 graphics/AtlantisJava/src/atlantis/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AAbstractParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AColorParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/ACommand.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/ACommandProcessor.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/ACutParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AEnumeratorParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/ALinkParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AListIntegerParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/ANumberParameter.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/APar.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AParameter.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterChangeListener.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterConfigReader.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterData.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterState.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterSuperGroup.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/AParameterUtilities.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AParametersGroup.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AStatusGroupParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AStatusParameter.java delete mode 100755 graphics/AtlantisJava/src/atlantis/parameters/AStatusRootParameter.java delete mode 100644 graphics/AtlantisJava/src/atlantis/parameters/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjection.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjection2D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjection3D.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjection3DBox.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionEventInfo.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionFR.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionFZ.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionInfo.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionLegoPlot.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionN3D.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionNGE.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionNPhysics.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionNYX.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionPhi.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionRZ.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/AProjectionTrackResidual.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionVP.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionXZ.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionYX.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionYZ.java delete mode 100755 graphics/AtlantisJava/src/atlantis/projection/AProjectionsManager.java delete mode 100644 graphics/AtlantisJava/src/atlantis/projection/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/A3Vector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/A4Vector.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AAtlantisException.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AClipPolygon.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/ACommandHistory.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AHashMap.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/AIdDictionary.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/AIdField.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AIdHelper.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/AIdRange.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AIntHashtable.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/ALogger.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/ALoggerFactory.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AMath.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/ANewIdHelper.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/APoint.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/APolygon.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AUtilities.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/AVector.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/package.html delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AArrayParser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AFloatArrayParser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AIntArrayParser.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AStringArrayParser.java delete mode 100644 graphics/AtlantisJava/src/atlantis/utils/xml/AXMLEntityResolver.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AXMLErrorHandler.java delete mode 100755 graphics/AtlantisJava/src/atlantis/utils/xml/AXMLUtils.java delete mode 100644 graphics/AtlantisJava/src/overview.html delete mode 100644 graphics/AtlantisJava/test/events/emptyEvent.xml delete mode 100644 graphics/AtlantisJava/test/events/muonCollections.xml delete mode 100644 graphics/AtlantisJava/test/events/muonCollections2.xml delete mode 100644 graphics/AtlantisJava/test/events/rvxEvent.xml delete mode 100644 graphics/AtlantisJava/test/events/rvxInconsistentEvent.xml delete mode 100644 graphics/AtlantisJava/test/src/atlantis/AtlantisHeadlessTestCase.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/HeadlessTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/InconsistentEventTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/NoTracksElementTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/canvas/AScaleBorderTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/canvas/AScaleTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/canvas/AWindowTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/data/AHelixTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/data/AOldHelixTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/event/AEventInfoTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/graphics/ACoordTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/list/AListManagerTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/parameters/AAbstractParameterTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/parameters/AParameterDataTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/utils/A3VectorTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/utils/A4VectorTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/utils/AIdRangeTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/utils/AMathTest.java delete mode 100644 graphics/AtlantisJava/test/src/atlantis/utils/ANewIdHelperTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/AAssert.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/AtlantisGUIFixture.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/AtlantisGuiTestCase.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/EnumeratorParameterTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/EventSourceToolBarTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/InteractionToolBarTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/LoadEventFailureTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/LoadEventTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/LoadEventWithInvalidRecVertexDataTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/LoadEventWithValidRecVertexDataTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/LoadEventsManyTimesTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsEmptyTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/OverlayTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/ProjectionsTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/ReadNextAndPreviousEventTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/StartAndExitTest.java delete mode 100644 graphics/AtlantisJava/test/src/guitest/TabsTest.java delete mode 100644 graphics/AtlantisJava/test/src/testutils/AtlantisInit.java delete mode 100644 graphics/AtlantisJava/test/src/testutils/TeeOutputStream.java delete mode 100644 graphics/AtlantisJava/test/src/testutils/TestUtils.java diff --git a/graphics/AtlantisJava/CMakeLists.txt b/graphics/AtlantisJava/CMakeLists.txt deleted file mode 100644 index 7d9ae4dd6008..000000000000 --- a/graphics/AtlantisJava/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -################################################################################ -# Package: AtlantisJava -################################################################################ - -# Declare the package name: -atlas_subdir( AtlantisJava ) - -# External dependencies: -find_package( Java ) - -# Install files from the package: -atlas_install_joboptions( share/InteractiveServer.py ) -atlas_install_scripts( share/atlantis share/atlantis_online ) -atlas_install_generic( lib/*.jar - DESTINATION "share/AtlantisJava/lib" - EXECUTABLE ) -atlas_install_generic( img/*.gif img/*.png img/*.jpg - DESTINATION "share/AtlantisJava/img" - EXECUTABLE ) -atlas_install_generic( configuration/*.xml configuration/*.csv configuration/PSProlog.txt - DESTINATION "share/AtlantisJava/configuration" - EXECUTABLE ) -atlas_install_generic( events/event.dtd events/*.zip - DESTINATION "share/AtlantisJava/events" - EXECUTABLE ) -atlas_install_generic( geometry/*.xml - DESTINATION "share/AtlantisJava/geometry" - EXECUTABLE ) -atlas_install_generic( help/help.jar help/online.xml help/*.png - DESTINATION "share/AtlantisJava/help" - EXECUTABLE ) diff --git a/graphics/AtlantisJava/ant/build.xml b/graphics/AtlantisJava/ant/build.xml deleted file mode 100755 index 1172e921def8..000000000000 --- a/graphics/AtlantisJava/ant/build.xml +++ /dev/null @@ -1,469 +0,0 @@ -<?xml version="1.0"?> - -<!-- Main Ant build file for Atlantis --> - -<!-- basedir attribute to be adjusted - target build directory - - - - - --> -<project name="Atlantis" default="usage" basedir=".."> - <!-- begin properties - - - - - - - - - - - - - - - - - - - - - - - - --> - <!-- read in overriden properties from ant.properties file - - - - - --> - <property file="ant.properties"/> - <property name="appName" value="Atlantis"/> - - <!-- Use Java 1.6. - Note that this controls the source code accepted and bytecode generated but - does NOT ensure that the correct libraries are available so in principle you - could still build code that requires different libraries to run. - This was added when we needed to enforve Java 1.5 but 1.6 was already - the most commonly installed version. --> - <property name="ant.build.javac.source" value="1.6"/> - - <!-- webstart codebase with appropriate default --> - <property name="codebase" value="http://www.cern.ch/atlantis/webstart"/> - - <!-- password for webstart certificate - certificate is created in - webstart target, used to sign *.jar files and erased afterwards --> - <property name="password" value="webstart_certificate_atlantis_password"/> - - <!-- list of "specific system configurations" in configurations/config-*.xml --> - <!-- NOT including MINERVA since this needs a slightly different JNLP file to load events from a URL --> - <property name="configs" - value="acr-general,acr-public,l1calo-acr,lar-acr,lar-publications,mbts-acr,mdt-acr,pixel-acr,pixel-publications,sct-acr,sct-publications,tgc-acr,tile-acr,tile-publications,trt-acr,trt-publications"/> - - <!-- timeout in milliseconds for JUnit tests, applies to each forked JVM instance --> - <property name="test.timeout" value="300000"/> - - <!-- directories - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <property name="src.src" value="src"/> - <property name="lib.src" value="lib"/> - <property name="test.src" value="test/src"/> - <property name="test.events" value="test/events"/> - <!-- runtime directories and files --> - <property name="conf" value="configuration"/> - <property name="events" value="events"/> - <property name="geom" value="geometry"/> - <property name="help" value="help"/> - <property name="img" value="img"/> - <property name="share" value="share"/> - - <property name="conf.src" value="${conf}"/> - <property name="events.src" value="${events}"/> - <property name="geom.src" value="${geom}"/> - <property name="help.src" value="${help}"/> - <property name="img.src" value="${img}"/> - <property name="share.src" value="${share}"/> - - <property name="conf.run" value="${targetDir}/${conf}"/> - <property name="events.run" value="${targetDir}/${events}"/> - <property name="geom.run" value="${targetDir}/${geom}"/> - <property name="help.run" value="${targetDir}/${help}"/> - <property name="img.run" value="${targetDir}/${img}"/> - <property name="share.run" value="${targetDir}/${share}"/> - - <property name="class.run" value="${targetDir}/classes"/> - <property name="lib.run" value="${targetDir}/lib"/> - <property name="test.run" value="${targetDir}/classes-test"/> - - <!-- directories for test libraries and output --> - <property name="lib.test" value="${targetDir}/lib/test"/> - <property name="report.test" value="${targetDir}/report"/> - - <!-- Atlantis - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <property name="atlantis.jar" value="${targetDir}/atlantis.jar"/> - <property name="atlantis.main.class" value="atlantis.Atlantis"/> - - <!-- Classpath for manifest in Jar file --> - <path id="classpath.mf"> - <fileset dir="${lib.run}"> - <include name="**/*.jar"/> - </fileset> - <fileset dir="${help.run}"> - <include name="**/*.jar"/> - </fileset> - </path> - - <!-- "foreach" task needed to generate specific system configs, provided by ant-contrib --> - <taskdef resource="net/sf/antcontrib/antcontrib.properties"> - <classpath> - <pathelement location="${lib.src}/build/ant-contrib-1.0b3.jar"/> - </classpath> - </taskdef> - - - <!-- =============================================================== --> - - <!-- targets begin - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <!-- preinit target - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="preinit" description="Test if targetDir argument is set"> - <fail unless="targetDir"> - targetDir variable must be set - try: ant usage - example: ant -DtargetDir="test" all - </fail> - <echo>Atlantis build will be made into ${targetDir} directory</echo> - </target> - - - <!-- init target - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="init" depends="preinit" - description="Makes required directories, copies libs"> - <mkdir dir="${lib.run}"/> - <!-- For runtime libraries use include element to take only Jar files from lib directory, - not build subdirectory --> - <copy todir="${lib.run}"> - <fileset dir="${lib.src}"> - <include name="*.jar"/> - </fileset> - </copy> - - <mkdir dir="${conf.run}"/> - <copy todir="${conf.run}"> - <fileset dir="${conf.src}"/> - </copy> - - <mkdir dir="${events.run}"/> - <copy todir="${events.run}"> - <fileset dir="${events.src}"/> - </copy> - - <mkdir dir="${geom.run}"/> - <copy todir="${geom.run}"> - <fileset dir="${geom.src}"/> - </copy> - - <mkdir dir="${help.run}"/> - <copy todir="${help.run}"> - <fileset dir="${help.src}"> - <include name="help.jar"/> - </fileset> - </copy> - - <mkdir dir="${img.run}"/> - <copy todir="${img.run}"> - <fileset dir="${img.src}"/> - </copy> - - <mkdir dir="${share.run}"/> - <copy todir="${share.run}"> - <fileset dir="${share.src}"/> - </copy> - - <mkdir dir="${class.run}"/> - - </target> - - - - <!-- compile target --> - <target name="compile" depends="init" - description="Compiles all source files"> - - <javac includeAntRuntime="false" srcdir="${src.src}" destdir="${class.run}" deprecation="on" verbose="no"> - <!-- <compilerarg value="-Xlint:unchecked"/> --> - <include name="**/*.java"/> - <classpath> - <fileset dir="${lib.run}"> - <include name="**/*.jar"/> - </fileset> - </classpath> - </javac> - </target> - - - <!-- all target - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="all" depends="jar, clean" - description="Copy runtime files, build and clean up"/> - - <!-- jar-atlantis target - - - - - - - - - - - - - - - - - - - - - - --> - <!-- Keep for compatibility with existing CMT requirements file --> - <target name="jar-atlantis" depends="all" - description="Create jar file of Atlantis"> - </target> - - <!-- jar target - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="jar" depends="compile" - description="Create all jar files for deployment"> - <manifestclasspath property="jar.classpath" jarfile="${atlantis.jar}"> - <classpath refid="classpath.mf"/> - </manifestclasspath> - - <!-- jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <jar destfile="${atlantis.jar}"> - <fileset dir="${class.run}" /> - <fileset dir="${targetDir}"> - <exclude name="classes/*"/> - <exclude name="lib/*"/> - <exclude name="help/*"/> - <include name="*/*"/> - </fileset> - <manifest> - <attribute name="Built-By" value="${user.name}"/> - <attribute name="Main-Class" value="${atlantis.main.class}"/> - <attribute name="Class-Path" value="${jar.classpath}"/> - <attribute name="Implementation-Title" value="Atlantis"/> - </manifest> - </jar> - </target> - - <!-- webstartcommon target - - - - - - - - - - - - - - - - - - - - --> - <target name="webstartcommon" depends="compile"> - <manifestclasspath property="jar.classpath" jarfile="${atlantis.jar}"> - <classpath refid="classpath.mf"/> - </manifestclasspath> - - <jar destfile="${atlantis.jar}"> - <fileset dir="${class.run}" /> - - <fileset dir="${targetDir}"> - <exclude name="classes/*"/> - <exclude name="lib/*"/> - <exclude name="help/*"/> - <include name="*/*"/> - </fileset> - - <manifest> - <attribute name="Built-By" value="${user.name}"/> - <attribute name="Main-Class" value="${atlantis.main.class}"/> - <attribute name="Class-Path" value="${jar.classpath}"/> - <attribute name="Implementation-Title" value="Atlantis"/> - </manifest> - </jar> - - <!-- clean up, leave only lib/*.jar, help/*.jar, atlantis.jar --> - <delete dir="${conf.run}"/> - <delete dir="${events.run}"/> - <delete dir="${geom.run}"/> - <delete dir="${img.run}"/> - <delete dir="${share.run}"/> - - <antcall target="clean"/> - <antcall target="webstartjarsigner"/> - </target> - - - <!-- webstart - distribution via webstart (lib/*.jar, help/*.jar and - atlantis.jar (includes all data files) --> - <target name="webstart" depends="webstartcommon" - description="atlantis distribution for Java WebStart"> - - <!-- copy webstart .jnlp files --> - <copy file="${share.src}/atlantis.jnlp" todir="${targetDir}"> - <filterset> - <filter token="CODEBASE" value="${codebase}"/> - </filterset> - </copy> - - </target> - - - <!-- webstart - MINERVA version --> - <target name="webstart-minerva" depends="compile" - description="Atlantis MINERVA distribution for Java WebStart"> - - <!-- copy webstart .jnlp files --> - <copy file="${share.src}/MINERVA.jnlp" todir="${targetDir}"> - <filterset> - <filter token="CODEBASE" value="${codebase}"/> - </filterset> - </copy> - - </target> - - - <target name="webstart-config"> - <!-- copy webstart .jnlp files --> - <copy file="${share.src}/specificconfig.jnlp" tofile="${targetDir}/${config}.jnlp"> - <filterset> - <filter token="CODEBASE" value="${codebase}"/> - <filter token="HREF" value="${config}.jnlp"/> - <filter token="CONFIG" value="config-${config}.xml"/> - </filterset> - </copy> - </target> - - - <!-- webstart including basic atlantis.jnlp and "specific system configurations" --> - <target name="webstart-all" depends="webstart,webstart-specificconfigs,webstart-minerva" - description="Atlantis for Java Webstart including basic atlantis.jnlp and specific system configurations"/> - - - <target name="webstart-specificconfigs"> - <foreach param="config" list="${configs}" target="webstart-config"/> - </target> - - - <!-- webstartjarsigner target - - - - - - - - - - - - - - - - - - - --> - <target name="webstartjarsigner" description="Sign all jar files"> - <delete file="${targetDir}/keystore"/> - <exec executable="${java.home}/bin/keytool"> - <arg line="-genkey -dname 'cn=Atlantis team' -alias Atlantis - -keypass ${password} -keystore ${targetDir}/keystore - -storepass ${password} -validity 180"/> - </exec> - <signjar alias="Atlantis" - keystore="${targetDir}/keystore" - keypass="${password}" - storepass="${password}"> - - <fileset file="${lib.run}/*.jar" /> - <fileset file="${help.run}/*.jar"/> - <fileset file="${atlantis.jar}"/> - </signjar> - <delete file="${targetDir}/keystore"/> - </target> - - - - <!-- updateconfigurations target - - - - - - - - - - - - - - - - - - --> - <!-- update special configurations - jython script performs update of - all special / customised configurations shipped with atlantis and then - runs Atlantis with each configuration file --> - <target name="updateconfigs" depends="jar" - description="Update / synchronise customised configuration files"> - <echo>Requires jython available in PATH, otherwise fails.</echo> - - <!-- arg to exec - arguments to specify atlantis distribution direct. - and where the configuration files for updating are located --> - <!-- exec for unix, mac --> - <exec executable="jython" osfamily="unix" failonerror="true"> - <arg line="share/configupdater.py --atlantis ${targetDir} - --update ${conf.src}"/> - </exec> - <!-- exec for windows --> - <exec executable="cmd" osfamily="windows" failonerror="true"> - <arg value="/c"/> - <arg value="jython.bat"/> - <arg value="share\configupdater.py"/> - <arg value="--atlantis"/> - <arg line="${targetDir}"/> - <arg line="--update"/> - <arg line="${conf.src}"/> - </exec> - - <echo>Deleting build directory ${targetDir}, calling delete ...</echo> - <delete dir="${targetDir}"/> - </target> - - <!-- javadoc target - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="javadoc" description="Make Javadoc documentation"> - <mkdir dir="${targetDir}" /> - - <javadoc packagenames="atlantis.*" - sourcepath="${src.src}" - destdir="${targetDir}" - overview="${src.src}/overview.html" - doctitle="Atlantis event display for ATLAS" - > - <classpath> - <fileset dir="${lib.src}"> - <include name="**/*.jar"/> - </fileset> - </classpath> - </javadoc> - </target> - - <!-- clean target - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="clean" description="Erase *.class generated files"> - <delete dir="${class.run}"/> - </target> - - <target name="test" depends="unit-tests,gui-tests" description="Run all tests"> - <!-- If testcase is set, specified test is run here. --> - <junit printsummary="yes" haltonerror="no" haltonfailure="no" failureProperty="test.failed" errorProperty="test.failed" - fork="yes" timeout="${test.timeout}"> - <sysproperty key="atlantis.test.events" file="${test.events}"/> - <formatter type="xml"/> - <test name="${testcase}" toDir="${report.test}" if="testcase"/> - <classpath refid="classpath.test"/> - </junit> - - <mkdir dir="${report.test}/html"/> - <junitreport todir="${report.test}"> - <fileset dir="${report.test}"> - <include name="TEST-*.xml"/> - </fileset> - <report todir="${report.test}/html"/> - </junitreport> - - <fail message="Failed JUnit test(s)" if="test.failed"/> - </target> - - <!-- Has to continue on failure or error so report target can run. --> - <!-- Not sure why need haltonerror="no" even if failures occur but no errors --> - <target name="unit-tests" depends="compile-tests,jar" description="Run unit tests"> - <mkdir dir="${report.test}"/> - <junit printsummary="yes" haltonerror="no" haltonfailure="no" failureProperty="test.failed" errorProperty="test.failed" - fork="yes" timeout="${test.timeout}"> - <sysproperty key="atlantis.test.events" file="${test.events}"/> - <formatter type="xml"/> - <!-- If testcase is set, specified test will be run in "test" target. Otherwise run all of them. --> - <batchtest toDir="${report.test}" unless="testcase"> - <fileset dir="${test.run}" includes="atlantis/**/*Test.class"/> - </batchtest> - <classpath refid="classpath.test"/> - </junit> - </target> - - <!-- Has to continue on failure or error so report target can run. --> - <!-- Not sure why need haltonerror="no" even if failures occur but no errors --> - <target name="gui-tests" depends="compile-tests,jar" description="Run GUI tests"> - <mkdir dir="${report.test}"/> - <junit printsummary="yes" haltonerror="no" haltonfailure="no" failureProperty="test.failed" errorProperty="test.failed" - fork="yes" timeout="${test.timeout}"> - <sysproperty key="atlantis.test.events" file="${test.events}"/> - <formatter type="xml"/> - <!-- If testcase is set, specified test will be run in "test" target. Otherwise run all of them. --> - <batchtest toDir="${report.test}" unless="testcase"> - <fileset dir="${test.run}" includes="guitest/**/*Test.class"> - </fileset> - </batchtest> - <classpath refid="classpath.test"/> - </junit> - </target> - - <!-- compile-tests target: compile JUnit tests --> - <target name="compile-tests" depends="compile" - description="Compiles source files for all tests"> - <mkdir dir="${lib.run}/test"/> - <copy todir="${lib.run}/test"> - <fileset dir="${lib.src}/test"> - <include name="*.jar"/> - </fileset> - </copy> - <mkdir dir="${test.run}"/> - <javac includeAntRuntime="false" srcdir="${test.src}" destdir="${test.run}" deprecation="on" verbose="no"> - <include name="**/*.java"/> - <classpath> - <fileset dir="${lib.run}"> - <include name="**/*.jar"/> - </fileset> - <fileset dir="${lib.test}"> - <include name="**/*.jar"/> - </fileset> - <pathelement path="${class.run}"/> - </classpath> - </javac> - <path id="classpath.test"> - <fileset dir="${lib.run}"> - <include name="**/*.jar"/> - </fileset> - <fileset dir="${lib.test}"> - <include name="**/*.jar"/> - </fileset> - <pathelement path="${targetDir}/atlantis.jar"/> - <pathelement path="${test.run}"/> - </path> - </target> - - <!-- usage target - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="usage" description="Prints usage hint"> - <echo level="info" message="Usage:"/> - <echo>targetDir - directory to build atlantis distribution in</echo> - <echo>ant -DtargetDir=[target directory] [all|jar|javadoc|test|report|updateconfigs]</echo> - <echo>and -DtargetDir=[target directory] -Dtestcase=[test-case class] test</echo> - <echo>ant -DtargetDir=[target directory] [-Dcodebase="Webstart codebase URL"] [webstart|webstart-specificconfigs|webstart-all]</echo> - </target> - - <!-- help target - - - - - - - - - - - - - - - - - - - - - - - - - - --> - <target name="help" depends="usage" description="Prints usage hint"/> - -</project> diff --git a/graphics/AtlantisJava/configuration/PSProlog.txt b/graphics/AtlantisJava/configuration/PSProlog.txt deleted file mode 100755 index ca7483a2aebb..000000000000 --- a/graphics/AtlantisJava/configuration/PSProlog.txt +++ /dev/null @@ -1,156 +0,0 @@ -100 dict dup begin - -% Author: Charles Loomis - -% Redefinitions which save some space in the output file. These are also -% the same as the PDF operators. -/q {gsave} def -/Q {grestore} def - -/n {newpath} def -/m {moveto} def -/l {lineto} def -/c {curveto} def -/h {closepath} def - -/re {4 -2 roll moveto - dup 0 exch rlineto exch 0 rlineto - neg 0 exch rlineto closepath} def - -/f {fill} def -/f* {eofill} def -/F {gsave vg&FC fill grestore} def -/F* {gsave vg&FC eofill grestore} def - -/s {closepath stroke} def -/S {stroke} def - -/b {closepath gsave vg&FC fill grestore - gsave stroke grestore newpath} def -/B {gsave vg&FC fill grestore gsave stroke grestore newpath} def -/b* {closepath gsave vg&FC eofill grestore - gsave stroke grestore newpath} def -/B* {gsave vg&FC eofill grestore gsave stroke grestore newpath} def - -/g {1 array astore /vg&fcolor exch def} def -/G {setgray} def -/k {4 array astore /vg&fcolor exch def} def -/K {setcmykcolor} def -/rg {3 array astore /vg&fcolor exch def} def -/RG {setrgbcolor} def - -% Initialize the fill color. -0 0 0 rg - -/vg&FC {mark vg&fcolor aload pop - counttomark 1 eq {G} if - counttomark 3 eq {RG} if - counttomark 4 eq {K} if - cleartomark } def - -/vg&DFC {/vg&fcolor exch def} def - -/vg&C {mark exch aload pop - counttomark 1 eq {G} if - counttomark 3 eq {RG} if - counttomark 4 eq {K} if - cleartomark } def - -/w {setlinewidth} def -/j {setlinejoin} def -/J {setlinecap} def -/M {setmiterlimit} def -/d {setdash} def -/i {setflat} def - -/W {clip} def -/W* {eoclip} def - -% Setup the default graphics state. -% (black; 1 pt. linewidth; miter join; butt-ends; solid) -/defaultGraphicsState {0 g 1 w 0 j 0 J [] 0 d} def - -% Emulation of the rectangle operators for PostScript implementations -% which do not implement all Level 2 features. This is an INCOMPLETE -% emulation; only the "x y width height rect..." form is emulated. -/*rf {gsave newpath re fill grestore} def -/*rs {gsave newpath re stroke grestore} def -/*rc {newpath re clip} def -/rf /rectfill where {pop /rectfill}{/*rf} ifelse load def -/rs /rectstroke where {pop /rectstroke}{/*rs} ifelse load def -/rc /rectclip where {pop /rectclip}{/*rc} ifelse load def - -% Emulation of the selectfont operator. This includes a 20% increase in -% the fontsize which is necessary to get sizes similar to the Java fonts. -/*sf {exch findfont exch - dup type /arraytype eq {makefont}{scalefont} ifelse setfont} bind def -/sf /selectfont where {pop {1.2 mul selectfont}}{{1.2 mul *sf}} ifelse def - -% Initialize variables for safety. -/delta 0 def -/xv 0 def /yv 0 def /width 0 def /height 0 def - -% Initialize to portrait A4 page. -/pw 595 def /ph 842 def /po true def /ftp false def - -% Initialize margins to 20 points. -/ml 20 def /mr 20 def /mt 20 def /mb 20 def - -% set page size (usage: <page width><page height> setpagesize) -/setpagesize {/ph exch def /pw exch def} def - -% set page orientation (usage: portrait or landscape) -/portrait {/po true def} def -/landscape {/po false def} def - -% force natural size for image (usage: naturalsize) -/naturalsize {/ftp false def} def - -% resize image to fill page (usage: fittopage) -/fittopage {/ftp true def} def - -% set margins of the page (usage: <left><bottom><top><right> setmargins) -/setmargins {/mr exch def /mt exch def /mb exch def /ml exch def} def - -% set the graphic's size (usage: <width><height> setsize) -/setsize {/gh exch def /gw exch def} def - -% set the graphic's origin (usage: <x0><y0> setorigin) -/setorigin {/gy exch def /gx exch def} def - -% calculate image center -/imagecenter {pw ml sub mr sub 2 div ml add - ph mt sub mb sub 2 div mb add} def - -% calculate the necessary scaling -/imagescale {po {gw}{gh} ifelse pw ml sub mr sub div - po {gh}{gw} ifelse ph mt sub mb sub div - 2 copy lt {exch} if pop - ftp not {1 2 copy lt {exch} if pop} if - 1 exch div /sfactor exch def - /gw gw sfactor mul def /gh gh sfactor mul def} def - -% calculate image origin -/imageorigin {pw ml sub mr sub 2 div ml add - po {gw}{gh} ifelse 2 div sub - ph mt sub mb sub 2 div mb add - po {gh}{gw} ifelse 2 div po {add}{sub} ifelse} def - -% calculate the clipping origin -/cliporigin {pw ml sub mr sub 2 div ml add - po {gw}{gh} ifelse 2 div sub floor - ph mt sub mb sub 2 div mb add - po {gh}{gw} ifelse 2 div sub floor} def - -% Set the clipping region to the bounding box. -/cliptobounds {cliporigin po {gw}{gh} ifelse 1 add - po {gh}{gw} ifelse 1 add rc} def - -% set the base transformation matrix (usage: setbasematrix) -/setbasematrix {imageorigin translate - po {0}{90} ifelse rotate - sfactor sfactor neg scale - /defaultmatrix matrix currentmatrix def} def - - - diff --git a/graphics/AtlantisJava/configuration/colormap.xml b/graphics/AtlantisJava/configuration/colormap.xml deleted file mode 100755 index 1160b07c23b9..000000000000 --- a/graphics/AtlantisJava/configuration/colormap.xml +++ /dev/null @@ -1,369 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE colormap [ - <!ELEMENT colormap (Mapping*)> - <!ATTLIST colormap - numMaps CDATA #REQUIRED - numColors CDATA #REQUIRED> - <!ELEMENT Mapping EMPTY> - <!ATTLIST Mapping - map CDATA #REQUIRED - index CDATA #REQUIRED - r CDATA #REQUIRED - g CDATA #REQUIRED - b CDATA #REQUIRED> -]> - -<colormap numMaps="9" numColors="29" > -<!-- map 0 - Default(1) --> - <!-- white --> - <Mapping map="0" index="0" r="176" g="176" b="176"/> - <!-- geometry --> - <Mapping map="0" index="1" r="58" g="58" b="58"/> - <Mapping map="0" index="2" r="32" g="32" b="32"/> - <Mapping map="0" index="3" r="205" g="92" b="92"/> - <Mapping map="0" index="4" r="55" g="101" b="140"/> - <Mapping map="0" index="5" r="130" g="200" b="130"/> - <Mapping map="0" index="6" r="70" g="130" b="180"/> - <Mapping map="0" index="7" r="200" g="200" b="200"/> - <!-- background --> - <Mapping map="0" index="8" r="255" g="255" b="255"/> - <!-- frames --> - <Mapping map="0" index="9" r="189" g="34" b="50"/> - <Mapping map="0" index="10" r="180" g="180" b="81"/> - <Mapping map="0" index="11" r="33" g="182" b="92"/> - <Mapping map="0" index="12" r="89" g="206" b="223"/> - <Mapping map="0" index="13" r="140" g="40" b="140"/> - <!-- grey --> - <Mapping map="0" index="14" r="153" g="153" b="153"/> - <!-- cells --> - <Mapping map="0" index="15" r="125" g="0" b="0"/> - <Mapping map="0" index="16" r="255" g="255" b="128"/> - <Mapping map="0" index="17" r="0" g="125" b="0"/> - <Mapping map="0" index="18" r="181" g="229" b="251"/> - <Mapping map="0" index="19" r="255" g="128" b="255"/> - <!-- red --> - <Mapping map="0" index="20" r="255" g="0" b="0"/> - <!-- green --> - <Mapping map="0" index="21" r="0" g="255" b="0"/> - <!-- blue --> - <Mapping map="0" index="22" r="0" g="0" b="255"/> - <!-- yellow --> - <Mapping map="0" index="23" r="255" g="255" b="0"/> - <!-- magenta --> - <Mapping map="0" index="24" r="255" g="0" b="255"/> - <!-- cyan --> - <Mapping map="0" index="25" r="0" g="255" b="255"/> - <!-- black --> - <Mapping map="0" index="26" r="0" g="0" b="0"/> - <!-- orange --> - <Mapping map="0" index="27" r="255" g="115" b="0"/> - <!-- cornflower blue --> - <Mapping map="0" index="28" r="135" g="206" b="250"/> -<!-- map 1 - Default(2) --> - <!-- white --> - <Mapping map="1" index="0" r="176" g="176" b="176"/> - <!-- geometry --> - <Mapping map="1" index="1" r="58" g="58" b="58"/> - <Mapping map="1" index="2" r="32" g="32" b="32"/> - <Mapping map="1" index="3" r="254" g="102" b="0"/> - <Mapping map="1" index="4" r="0" g="24" b="71"/> - <Mapping map="1" index="5" r="130" g="200" b="130"/> - <Mapping map="1" index="6" r="0" g="51" b="153"/> - <Mapping map="1" index="7" r="200" g="200" b="200"/> - <!-- background --> - <Mapping map="1" index="8" r="255" g="255" b="255"/> - <!-- frames --> - <Mapping map="1" index="9" r="189" g="34" b="50"/> - <Mapping map="1" index="10" r="180" g="180" b="81"/> - <Mapping map="1" index="11" r="33" g="182" b="92"/> - <Mapping map="1" index="12" r="89" g="206" b="223"/> - <Mapping map="1" index="13" r="140" g="40" b="140"/> - <!-- grey --> - <Mapping map="1" index="14" r="153" g="153" b="153"/> - <!-- cells --> - <Mapping map="1" index="15" r="185" g="0" b="0"/> - <Mapping map="1" index="16" r="255" g="255" b="128"/> - <Mapping map="1" index="17" r="0" g="125" b="0"/> - <Mapping map="1" index="18" r="181" g="229" b="251"/> - <Mapping map="1" index="19" r="255" g="128" b="255"/> - <!-- red --> - <Mapping map="1" index="20" r="255" g="0" b="0"/> - <!-- green --> - <Mapping map="1" index="21" r="0" g="255" b="0"/> - <!-- blue --> - <Mapping map="1" index="22" r="0" g="0" b="255"/> - <!-- yellow --> - <Mapping map="1" index="23" r="255" g="255" b="0"/> - <!-- magenta --> - <Mapping map="1" index="24" r="255" g="0" b="255"/> - <!-- cyan --> - <Mapping map="1" index="25" r="0" g="255" b="255"/> - <!-- black --> - <Mapping map="1" index="26" r="0" g="0" b="0"/> - <!-- orange --> - <Mapping map="1" index="27" r="255" g="170" b="0"/> - <!-- cornflower blue --> - <Mapping map="1" index="28" r="0" g="102" b="255"/> -<!-- map 2 - Default(M4+M5) --> - <!-- white --> - <Mapping map="2" index="0" r="255" g="255" b="255"/> - <!-- geometry --> - <Mapping map="2" index="1" r="40" g="0" b="0"/> - <Mapping map="2" index="2" r="0" g="35" b="0"/> - <Mapping map="2" index="3" r="132" g="39" b="32"/> - <Mapping map="2" index="4" r="138" g="138" b="68"/> - <Mapping map="2" index="5" r="98" g="134" b="122"/> - <Mapping map="2" index="6" r="78" g="139" b="170"/> - <Mapping map="2" index="7" r="97" g="65" b="97"/> - <!-- background --> - <Mapping map="2" index="8" r="44" g="47" b="50"/> - <!-- frames --> - <Mapping map="2" index="9" r="189" g="34" b="50"/> - <Mapping map="2" index="10" r="180" g="180" b="81"/> - <Mapping map="2" index="11" r="33" g="182" b="92"/> - <Mapping map="2" index="12" r="89" g="206" b="223"/> - <Mapping map="2" index="13" r="140" g="40" b="140"/> - <!-- grey --> - <Mapping map="2" index="14" r="153" g="153" b="153"/> - <!-- cells --> - <Mapping map="2" index="15" r="245" g="135" b="138"/> - <Mapping map="2" index="16" r="255" g="255" b="128"/> - <Mapping map="2" index="17" r="123" g="212" b="194"/> - <Mapping map="2" index="18" r="181" g="229" b="251"/> - <Mapping map="2" index="19" r="255" g="128" b="255"/> - <!-- red --> - <Mapping map="2" index="20" r="255" g="0" b="0"/> - <!-- green --> - <Mapping map="2" index="21" r="0" g="255" b="0"/> - <!-- blue --> - <Mapping map="2" index="22" r="0" g="0" b="255"/> - <!-- yellow --> - <Mapping map="2" index="23" r="255" g="255" b="0"/> - <!-- magenta --> - <Mapping map="2" index="24" r="255" g="0" b="255"/> - <!-- cyan --> - <Mapping map="2" index="25" r="0" g="255" b="255"/> - <!-- black --> - <Mapping map="2" index="26" r="0" g="0" b="0"/> - <!-- orange --> - <Mapping map="2" index="27" r="255" g="115" b="0"/> - <!-- cornflower blue --> - <Mapping map="2" index="28" r="102" g="128" b="255"/> -<!-- map 3 - Gray detector --> - <!-- white --> - <Mapping map="3" index="0" r="255" g="255" b="255"/> - <!-- geometry --> - <Mapping map="3" index="1" r="0" g="0" b="0"/> - <Mapping map="3" index="2" r="0" g="0" b="0"/> - <Mapping map="3" index="3" r="32" g="32" b="32"/> - <Mapping map="3" index="4" r="80" g="80" b="80"/> - <Mapping map="3" index="5" r="16" g="16" b="16"/> - <Mapping map="3" index="6" r="48" g="48" b="48"/> - <Mapping map="3" index="7" r="64" g="64" b="64"/> - <!-- background --> - <Mapping map="3" index="8" r="112" g="112" b="112"/> - <!-- frames --> - <Mapping map="3" index="9" r="189" g="34" b="50"/> - <Mapping map="3" index="10" r="180" g="180" b="81"/> - <Mapping map="3" index="11" r="33" g="182" b="92"/> - <Mapping map="3" index="12" r="89" g="206" b="223"/> - <Mapping map="3" index="13" r="140" g="40" b="140"/> - <!-- grey --> - <Mapping map="3" index="14" r="153" g="153" b="153"/> - <!-- cells --> - <Mapping map="3" index="15" r="245" g="135" b="138"/> - <Mapping map="3" index="16" r="255" g="255" b="128"/> - <Mapping map="3" index="17" r="123" g="212" b="194"/> - <Mapping map="3" index="18" r="181" g="229" b="251"/> - <Mapping map="3" index="19" r="255" g="128" b="255"/> - <!-- red --> - <Mapping map="3" index="20" r="255" g="0" b="0"/> - <!-- green --> - <Mapping map="3" index="21" r="0" g="255" b="0"/> - <!-- blue --> - <Mapping map="3" index="22" r="0" g="0" b="255"/> - <!-- yellow --> - <Mapping map="3" index="23" r="255" g="255" b="0"/> - <!-- magenta --> - <Mapping map="3" index="24" r="255" g="0" b="255"/> - <!-- cyan --> - <Mapping map="3" index="25" r="0" g="255" b="255"/> - <!-- black --> - <Mapping map="3" index="26" r="0" g="0" b="0"/> - <!-- orange --> - <Mapping map="3" index="27" r="255" g="115" b="0"/> - <!-- cornflower blue --> - <Mapping map="3" index="28" r="102" g="128" b="255"/> -<!-- map 4 - Original --> - <!-- white --> - <Mapping map="4" index="0" r="255" g="255" b="255"/> - <!-- geometry --> - <Mapping map="4" index="1" r="0" g="0" b="0"/> - <Mapping map="4" index="2" r="0" g="0" b="0"/> - <Mapping map="4" index="3" r="255" g="0" b="0"/> - <Mapping map="4" index="4" r="0" g="0" b="255"/> - <Mapping map="4" index="5" r="0" g="255" b="0"/> - <Mapping map="4" index="6" r="0" g="0" b="0"/> - <Mapping map="4" index="7" r="255" g="0" b="255"/> - <!-- background --> - <Mapping map="4" index="8" r="0" g="204" b="255"/> - <!-- frames --> - <Mapping map="4" index="9" r="189" g="34" b="50"/> - <Mapping map="4" index="10" r="180" g="180" b="81"/> - <Mapping map="4" index="11" r="33" g="182" b="92"/> - <Mapping map="4" index="12" r="89" g="206" b="223"/> - <Mapping map="4" index="13" r="140" g="40" b="140"/> - <!-- grey --> - <Mapping map="4" index="14" r="153" g="153" b="153"/> - <!-- cells --> - <Mapping map="4" index="15" r="245" g="135" b="138"/> - <Mapping map="4" index="16" r="255" g="255" b="128"/> - <Mapping map="4" index="17" r="123" g="212" b="194"/> - <Mapping map="4" index="18" r="181" g="229" b="251"/> - <Mapping map="4" index="19" r="255" g="128" b="255"/> - <!-- red --> - <Mapping map="4" index="20" r="255" g="0" b="0"/> - <!-- green --> - <Mapping map="4" index="21" r="0" g="255" b="0"/> - <!-- blue --> - <Mapping map="4" index="22" r="0" g="0" b="255"/> - <!-- yellow --> - <Mapping map="4" index="23" r="255" g="255" b="0"/> - <!-- magenta --> - <Mapping map="4" index="24" r="255" g="0" b="255"/> - <!-- cyan --> - <Mapping map="4" index="25" r="0" g="255" b="255"/> - <!-- black --> - <Mapping map="4" index="26" r="0" g="0" b="0"/> - <!-- orange --> - <Mapping map="4" index="27" r="255" g="115" b="0"/> - <!-- cornflower blue --> - <Mapping map="4" index="28" r="102" g="128" b="255"/> -<!-- map 5 - Grey --> - <!-- white --> - <Mapping map="5" index="0" r="255" g="255" b="255"/> - <Mapping map="5" index="1" r="255" g="255" b="255"/> - <Mapping map="5" index="2" r="255" g="255" b="255"/> - <Mapping map="5" index="3" r="255" g="255" b="255"/> - <Mapping map="5" index="4" r="255" g="255" b="255"/> - <Mapping map="5" index="5" r="255" g="255" b="255"/> - <Mapping map="5" index="6" r="255" g="255" b="255"/> - <Mapping map="5" index="7" r="255" g="255" b="255"/> - <!-- grey --> - <Mapping map="5" index="8" r="204" g="204" b="204"/> - <!-- black --> - <Mapping map="5" index="9" r="0" g="0" b="0"/> - <Mapping map="5" index="10" r="0" g="0" b="0"/> - <Mapping map="5" index="11" r="0" g="0" b="0"/> - <Mapping map="5" index="12" r="0" g="0" b="0"/> - <Mapping map="5" index="13" r="0" g="0" b="0"/> - <Mapping map="5" index="14" r="0" g="0" b="0"/> - <Mapping map="5" index="15" r="0" g="0" b="0"/> - <Mapping map="5" index="16" r="0" g="0" b="0"/> - <Mapping map="5" index="17" r="0" g="0" b="0"/> - <Mapping map="5" index="18" r="0" g="0" b="0"/> - <Mapping map="5" index="19" r="0" g="0" b="0"/> - <Mapping map="5" index="20" r="0" g="0" b="0"/> - <Mapping map="5" index="21" r="0" g="0" b="0"/> - <Mapping map="5" index="22" r="0" g="0" b="0"/> - <Mapping map="5" index="23" r="0" g="0" b="0"/> - <Mapping map="5" index="24" r="0" g="0" b="0"/> - <Mapping map="5" index="25" r="0" g="0" b="0"/> - <Mapping map="5" index="26" r="0" g="0" b="0"/> - <Mapping map="5" index="27" r="0" g="0" b="0"/> - <Mapping map="5" index="28" r="0" g="0" b="0"/> -<!-- map 6 - BW --> - <!-- white --> - <Mapping map="6" index="0" r="255" g="255" b="255"/> - <Mapping map="6" index="1" r="255" g="255" b="255"/> - <Mapping map="6" index="2" r="255" g="255" b="255"/> - <Mapping map="6" index="3" r="255" g="255" b="255"/> - <Mapping map="6" index="4" r="255" g="255" b="255"/> - <Mapping map="6" index="5" r="255" g="255" b="255"/> - <Mapping map="6" index="6" r="255" g="255" b="255"/> - <Mapping map="6" index="7" r="255" g="255" b="255"/> - <Mapping map="6" index="8" r="255" g="255" b="255"/> - <!-- black --> - <Mapping map="6" index="9" r="0" g="0" b="0"/> - <Mapping map="6" index="10" r="0" g="0" b="0"/> - <Mapping map="6" index="11" r="0" g="0" b="0"/> - <Mapping map="6" index="12" r="0" g="0" b="0"/> - <Mapping map="6" index="13" r="0" g="0" b="0"/> - <Mapping map="6" index="14" r="0" g="0" b="0"/> - <Mapping map="6" index="15" r="0" g="0" b="0"/> - <Mapping map="6" index="16" r="0" g="0" b="0"/> - <Mapping map="6" index="17" r="0" g="0" b="0"/> - <Mapping map="6" index="18" r="0" g="0" b="0"/> - <Mapping map="6" index="19" r="0" g="0" b="0"/> - <Mapping map="6" index="20" r="0" g="0" b="0"/> - <Mapping map="6" index="21" r="0" g="0" b="0"/> - <Mapping map="6" index="22" r="0" g="0" b="0"/> - <Mapping map="6" index="23" r="0" g="0" b="0"/> - <Mapping map="6" index="24" r="0" g="0" b="0"/> - <Mapping map="6" index="25" r="0" g="0" b="0"/> - <Mapping map="6" index="26" r="0" g="0" b="0"/> - <Mapping map="6" index="27" r="0" g="0" b="0"/> - <Mapping map="6" index="28" r="0" g="0" b="0"/> -<!-- map 7 - HITCOL --> - <Mapping map="7" index="0" r="0" g="0" b="85"/> - <Mapping map="7" index="1" r="0" g="0" b="255"/> - <Mapping map="7" index="2" r="85" g="85" b="170"/> - <Mapping map="7" index="3" r="0" g="170" b="255"/> - <Mapping map="7" index="4" r="0" g="255" b="255"/> - <Mapping map="7" index="5" r="0" g="85" b="85"/> - <Mapping map="7" index="6" r="0" g="85" b="0"/> - <Mapping map="7" index="7" r="0" g="170" b="0"/> - <Mapping map="7" index="8" r="0" g="255" b="0"/> - <Mapping map="7" index="9" r="170" g="255" b="0"/> - <Mapping map="7" index="10" r="255" g="255" b="0"/> - <Mapping map="7" index="11" r="255" g="170" b="0"/> - <Mapping map="7" index="12" r="170" g="85" b="0"/> - <Mapping map="7" index="13" r="255" g="85" b="85"/> - <Mapping map="7" index="14" r="255" g="0" b="0"/> - <Mapping map="7" index="15" r="170" g="0" b="0"/> - <Mapping map="7" index="16" r="85" g="0" b="0"/> - <!-- not used --> - <Mapping map="7" index="17" r="0" g="0" b="0"/> - <Mapping map="7" index="18" r="0" g="0" b="0"/> - <Mapping map="7" index="19" r="0" g="0" b="0"/> - <Mapping map="7" index="20" r="0" g="0" b="0"/> - <Mapping map="7" index="21" r="0" g="0" b="0"/> - <Mapping map="7" index="22" r="0" g="0" b="0"/> - <Mapping map="7" index="23" r="0" g="0" b="0"/> - <Mapping map="7" index="24" r="0" g="0" b="0"/> - <Mapping map="7" index="25" r="0" g="0" b="0"/> - <Mapping map="7" index="26" r="0" g="0" b="0"/> - <Mapping map="7" index="27" r="0" g="0" b="0"/> - <Mapping map="7" index="28" r="0" g="0" b="0"/> -<!-- map 8 - GREY HITCOL --> - <Mapping map="8" index="0" r="255" g="255" b="255"/> - <Mapping map="8" index="1" r="240" g="240" b="240"/> - <Mapping map="8" index="2" r="224" g="224" b="224"/> - <Mapping map="8" index="3" r="208" g="208" b="208"/> - <Mapping map="8" index="4" r="192" g="192" b="192"/> - <Mapping map="8" index="5" r="176" g="176" b="176"/> - <Mapping map="8" index="6" r="160" g="160" b="160"/> - <Mapping map="8" index="7" r="144" g="144" b="144"/> - <Mapping map="8" index="8" r="128" g="128" b="128"/> - <Mapping map="8" index="9" r="112" g="112" b="112"/> - <Mapping map="8" index="10" r="96" g="96" b="96"/> - <Mapping map="8" index="11" r="80" g="80" b="80"/> - <Mapping map="8" index="12" r="64" g="64" b="64"/> - <Mapping map="8" index="13" r="48" g="48" b="48"/> - <Mapping map="8" index="14" r="32" g="32" b="32"/> - <Mapping map="8" index="15" r="16" g="16" b="16"/> - <!-- not used --> - <Mapping map="8" index="16" r="0" g="0" b="0"/> - <Mapping map="8" index="17" r="0" g="0" b="0"/> - <Mapping map="8" index="18" r="0" g="0" b="0"/> - <Mapping map="8" index="19" r="0" g="0" b="0"/> - <Mapping map="8" index="20" r="0" g="0" b="0"/> - <Mapping map="8" index="21" r="0" g="0" b="0"/> - <Mapping map="8" index="22" r="0" g="0" b="0"/> - <Mapping map="8" index="23" r="0" g="0" b="0"/> - <Mapping map="8" index="24" r="0" g="0" b="0"/> - <Mapping map="8" index="25" r="0" g="0" b="0"/> - <Mapping map="8" index="26" r="0" g="0" b="0"/> - <Mapping map="8" index="27" r="0" g="0" b="0"/> - <Mapping map="8" index="28" r="0" g="0" b="0"/> -</colormap> diff --git a/graphics/AtlantisJava/configuration/config.dtd b/graphics/AtlantisJava/configuration/config.dtd deleted file mode 100644 index 189f117e0911..000000000000 --- a/graphics/AtlantisJava/configuration/config.dtd +++ /dev/null @@ -1,169 +0,0 @@ -<!ELEMENT AtlantisConfiguration (Initialization, Parameters,ParameterDifferences*, WindowCorners*)> - -<!ELEMENT Initialization (Interactions, Canvas)> - -<!ELEMENT Interactions (Panel*, InteractionControl+)> - -<!ELEMENT InteractionControl (Panel*)> - <!ATTLIST InteractionControl - projectionName CDATA #REQUIRED - availableInDemoMode CDATA "YES" - defaultInDemoMode CDATA "NO" > - -<!ELEMENT Panel EMPTY> - <!ATTLIST Panel - screenName CDATA #REQUIRED - fileName CDATA #REQUIRED - toolTip CDATA ""> - -<!ELEMENT Canvas (UsedWindow+, Layout+)> - <!ATTLIST Canvas - startupLayout CDATA #REQUIRED - aspectRatio CDATA #REQUIRED> - -<!ELEMENT UsedWindow EMPTY> - <!ATTLIST UsedWindow - name CDATA #REQUIRED - projection CDATA "EP" - group CDATA "Data"> - -<!ELEMENT Layout (Window+, Page+)> - <!ATTLIST Layout - name CDATA #REQUIRED - startup CDATA #REQUIRED - startupWindow CDATA #REQUIRED> - -<!ELEMENT Window EMPTY> - <!ATTLIST Window - name CDATA #REQUIRED - hPos CDATA #REQUIRED - vPos CDATA #REQUIRED - width CDATA #REQUIRED - height CDATA #REQUIRED> - -<!ELEMENT Page EMPTY> - <!ATTLIST Page - name CDATA #REQUIRED - content CDATA #REQUIRED> - -<!ELEMENT Parameters (SuperGroup*)> - <!ATTLIST Parameters - userLevel CDATA #REQUIRED> - -<!ELEMENT SuperGroup (Group*)> - <!ATTLIST SuperGroup - name CDATA #REQUIRED - toolTip CDATA "" - userLevel CDATA "0"> - -<!ELEMENT Group (Command*,((ENUM)*, (SENUM)*, (ICUT)*, (SICUT)*, (FCUT)*, (SFCUT)*, (INT)*, (SINT)*,(LINT)*, (SLINT)*, (FLOAT)*, (SFLOAT)*, (COLOR)*, (SCOLOR)*, (StatusRoot)*, (STATUS)*, (LINK)*)* )> - <!ATTLIST Group - name CDATA #REQUIRED - sname CDATA "" - guiUsage (NO_USE|TABLE|PROJECTION|BRAIN_TEST) "NO_USE" - scope (LOCAL|GLOBAL) "GLOBAL" - userLevel CDATA "0" - toolTip CDATA ""> - -<!ELEMENT Command EMPTY> - <!ATTLIST Command - name CDATA #REQUIRED - command CDATA #REQUIRED - ul CDATA "0" - toolTip CDATA ""> - -<!ENTITY none "0"> - -<!ELEMENT ENUM EMPTY> <!ATTLIST ENUM fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT SENUM EMPTY> <!ATTLIST SENUM fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT ICUT EMPTY> <!ATTLIST ICUT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" isMod (YES|NO) "NO" op CDATA #REQUIRED dop CDATA "" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT SICUT EMPTY> <!ATTLIST SICUT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED isMod (YES|NO) "NO" op CDATA #REQUIRED dop CDATA "" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT FCUT EMPTY> <!ATTLIST FCUT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" isMod (YES|NO) "NO" op CDATA #REQUIRED dop CDATA "" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT SFCUT EMPTY> <!ATTLIST SFCUT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED isMod (YES|NO) "NO" op CDATA #REQUIRED dop CDATA "" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT INT EMPTY> <!ATTLIST INT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" isMod (YES|NO) "NO" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT SINT EMPTY> <!ATTLIST SINT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED isMod (YES|NO) "NO" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT FLOAT EMPTY> <!ATTLIST FLOAT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" isMod (YES|NO) "NO" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT SFLOAT EMPTY> <!ATTLIST SFLOAT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED isMod (YES|NO) "NO" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT LINT EMPTY> <!ATTLIST LINT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT SLINT EMPTY> <!ATTLIST SLINT fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED tip CDATA "" ul CDATA "0" scope CDATA "" u CDATA "&none;"> -<!ELEMENT COLOR EMPTY> <!ATTLIST COLOR fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT SCOLOR EMPTY> <!ATTLIST SCOLOR fn CDATA #REQUIRED sn CDATA "" va CDATA #REQUIRED pv CDATA "-inf : inf" st (ON|OFF) #REQUIRED tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT StatusRoot (StatusGroup*, STATUS*)> <!ATTLIST StatusRoot fn CDATA #REQUIRED sn CDATA "" st (ON|OFF) "OFF" tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT StatusGroup (StatusGroup*, STATUS*)> <!ATTLIST StatusGroup fn CDATA #REQUIRED sn CDATA "" st (ON|OFF) "OFF" tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT STATUS EMPTY> <!ATTLIST STATUS fn CDATA #REQUIRED sn CDATA "" st (ON|OFF) #REQUIRED tip CDATA "" ul CDATA "0" scope CDATA ""> -<!ELEMENT LINK EMPTY> <!ATTLIST LINK to CDATA #REQUIRED> - -<!ELEMENT ParameterDifferences (DIFFERENCE*)> - -<!ELEMENT DIFFERENCE EMPTY> - <!ATTLIST DIFFERENCE - group CDATA #REQUIRED - name CDATA #REQUIRED - windowName CDATA "*" - va CDATA "" - st CDATA "" - op CDATA ""> - -<!ELEMENT WindowCorners (CORNERS*)> - -<!ELEMENT CORNERS EMPTY> - <!ATTLIST CORNERS - windowName CDATA #REQUIRED - x0 CDATA #REQUIRED - y0 CDATA #REQUIRED - x1 CDATA #REQUIRED - y1 CDATA #REQUIRED - x2 CDATA #REQUIRED - y2 CDATA #REQUIRED> - -<!ENTITY length "1"> -<!ENTITY energy "2"> -<!ENTITY energyMEV "3"> - -<!ENTITY user "0"> -<!ENTITY superuser "1"> -<!ENTITY debug "3"> - -<!ENTITY assocCutOptions "All=0, Connected=1, Unconnected=2"> -<!ENTITY drawTo "Pixels = 0, Silicon Strips = 1, TRT_DriftCircle=2, LAr = 3, TILE = 4, Muon System = 5"> -<!ENTITY colorFn "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Track Segment = 4"> -<!ENTITY colorFnTRT "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Track Segment = 4, isOutlier = 5, driftSign = 6, threshold = 7"> -<!ENTITY colorFnMTr "Constant = 0, Index = 1, Pt = 2"> -<!ENTITY colorFnCal "Constant = 0, SubDetector = 1, Cluster = 2, Layer = 3, Energy = 4, Jet = 5, ECAL/HCAL = 6, Time = 7"> -<!ENTITY colorFnS3D "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Group = 4, Layer = 5"> -<!ENTITY colorFnTrigS3D "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Layer = 4"> -<!ENTITY colorFnSiCluster "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Layer = 4, Orientation=5"> -<!ENTITY colorFnPixCluster "Constant = 0, Simulated Track = 1, Reconstructed Track = 2, SubDetector = 3, Layer = 4, Orientation=5, dE/dx=6"> -<!ENTITY colorFnSTr "Constant = 0, Index = 1, Pt = 2, Particle Type = 3, Origin Vertex = 4"> -<!ENTITY colorFnRTr "Constant = 0, Index = 1, Pt = 2, Collection = 3, Simulated Track = 4, RecVertex = 5, Objects = 7"> -<!ENTITY colorFnBasic "Constant = 0, Index = 1"> -<!ENTITY colorFnBasicVtx "Constant = 0, Index = 1 , VertexType = 2"> -<!ENTITY colorFnBasicCollection "Constant = 0, Index = 1, Collection = 2"> -<!ENTITY colorFnBasicCollectionBJets "Constant = 0, Index = 1, Collection = 2, BJets = 3"> - -<!ENTITY energyMode "Sum (Linear) = 0, Max (Linear) = 1, Sum (Logarithmic) = 2, Max (Logarithmic) = 3, Sum (Square Root) = 4, Max (Square Root) = 5"> -<!ENTITY symbol "Filled Square=0,Filled Circle=4,Horizontal Line=1,Vertical Line=2,Plus=3"> -<!ENTITY pickingModes "Event Data=0, Detectors=1"> -<!ENTITY frameCol "0,8:14"> -<!ENTITY detectCol "0:8,14"> -<!ENTITY dataCol "0,8,14:28"> -<!ENTITY histoCol "0,8,14:28"> -<!ENTITY real "<,>"> -<!ENTITY eta "η"> -<!ENTITY rho "ρ"> -<!ENTITY phi "Φ"> -<!ENTITY delta "Δ"> -<!ENTITY lambda "λ"> -<!ENTITY sigma "σ"> -<!ENTITY prime "'"> -<!ENTITY ne "!="> -<!ENTITY le "<="> -<!ENTITY ge ">="> -<!ENTITY int "=,≠,<,≤,>,≥"> -<!ENTITY intEqual "="> -<!ENTITY modesFZ "Standard = 0, RPC Middle 1 = 1, RPC Middle 2 = 2, RPC Outer = 3, MDT Inner and Extension = 4, MDT Middle = 5, MDT Outer = 6"> -<!ENTITY modesYX "Standard = 0, TGC Inner 1 = 1,TGC Middle 1 = 2, TGC Middle 2 = 3, TGC Middle 3 = 4, MDT/CSC Inner 1 = 5, MDT Extension = 6, MDT Middle = 7, MDT Outer = 8, FCAL EM= 9, FCAL HAD 1= 10, FCAL HAD 2= 11, LAr Ecap Presamp= 12, LAr Ecap 1= 13, LAr Ecap 2= 14, LAr Ecap 3= 15, HEC 1= 16, HEC 2= 17, HEC 3= 18, HEC 4= 19, LAr Ecap Summed=20, HEC Summed=21, MBTS=22"> - -<!-- Entities for including blocks of common data --> -<!ENTITY CommonInteractions SYSTEM "common-interactions.xml"> -<!ENTITY CommonParameters SYSTEM "common-parameters.xml"> diff --git a/graphics/AtlantisJava/configuration/epusti.csv b/graphics/AtlantisJava/configuration/epusti.csv deleted file mode 100644 index 0c0b9051835d..000000000000 --- a/graphics/AtlantisJava/configuration/epusti.csv +++ /dev/null @@ -1,5 +0,0 @@ -# Event Properties User Selected Trigger Items - -# example: "L1_EM7, L2_e10, EF_e10, L2_g10, EF_g10, L1_J70, EF_tau100" - -"" \ No newline at end of file diff --git a/graphics/AtlantisJava/configuration/pdg.xml b/graphics/AtlantisJava/configuration/pdg.xml deleted file mode 100755 index 20f87414de89..000000000000 --- a/graphics/AtlantisJava/configuration/pdg.xml +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0"?> - -<!DOCTYPE PDG [ - - <!ELEMENT PDG (Particle*)> - - <!ELEMENT Particle EMPTY> - - <!ATTLIST Particle - charge (-1 | 0 | 1 | 10) #REQUIRED - type CDATA #REQUIRED - code CDATA #REQUIRED - name CDATA #REQUIRED - > - - <!-- - charge = 10 : unknown particle or bug - --> - - <!ENTITY eta "η"> - <!ENTITY rho "ρ"> - <!ENTITY phi "Φ"> - <!ENTITY delta "Δ"> - <!ENTITY pi "π"> - <!ENTITY sigma "Σ"> - <!ENTITY tau "τ"> - <!ENTITY xi "Ξ"> - <!ENTITY omega "Ω"> - <!ENTITY mu "μ"> - <!ENTITY gamma "γ"> - <!ENTITY nu "ν"> - <!ENTITY lambda "Λ"> - <!ENTITY psi "ψ"> - <!ENTITY upsilon "Υ"> - -]> - -<PDG> - - <!-- - 'type' used for InDet selection cuts - --> - - <Particle charge="10" type="0" code="1" name="unknown" /> - <Particle charge="10" type="0" code="0" name="Bug" /> - - <Particle charge="1" type="1" code="211" name="π" /> - <Particle charge="1" type="1" code="2212" name="Proton" /> - <Particle charge="1" type="1" code="321" name="K" /> - <Particle charge="1" type="1" code="3222" name="σ" /> - <Particle charge="-1" type="1" code="3112" name="Anti-σ" /> - <Particle charge="1" type="1" code="411" name="D" /> - <Particle charge="1" type="1" code="431" name="Ds" /> - <Particle charge="-1" type="1" code="3312" name="ξ" /> - <Particle charge="-1" type="1" code="3334" name="ω" /> - <Particle charge="-1" type="2" code="15" name="τ" /> - <Particle charge="-1" type="3" code="11" name="e" /> - <Particle charge="-1" type="4" code="13" name="μ" /> - <Particle charge="0" type="5" code="111" name="π0" /> - <Particle charge="0" type="5" code="2112" name="Neutron" /> - <Particle charge="0" type="5" code="130" name="K0_L" /> - <Particle charge="0" type="5" code="310" name="K0_S" /> - <Particle charge="0" type="5" code="3212" name="σ0" /> - <Particle charge="0" type="5" code="221" name="η" /> - <Particle charge="0" type="5" code="3122" name="λ" /> - <Particle charge="0" type="5" code="3322" name="ξ0" /> - <Particle charge="0" type="5" code="421" name="D0" /> - <Particle charge="0" type="6" code="22" name="γ" /> - <Particle charge="0" type="7" code="12" name="ν" /> - <Particle charge="0" type="7" code="14" name="ν" /> - <Particle charge="0" type="7" code="16" name="ν" /> - <Particle charge="0" type="7" code="1000022" name="neutralino" /> - <Particle charge="0" type="7" code="1000039" name="gravitino" /> - <Particle charge="0" type="8" code="1" name="u" /> - <Particle charge="0" type="8" code="2" name="d" /> - <Particle charge="0" type="8" code="3" name="s" /> - <Particle charge="0" type="8" code="4" name="c" /> - <Particle charge="0" type="8" code="5" name="b" /> - <Particle charge="0" type="8" code="6" name="t" /> - <Particle charge="-1" type="9" code="1000015" name="stau" /> - <Particle charge="-1" type="9" code="2000011" name="selectron" /> - <Particle charge="-1" type="9" code="2000013" name="smuon" /> - <Particle charge="1" type="10" code="24" name="W" /> - <Particle charge="-1" type="11" code="601" name="From Ntuple: d" /> - <Particle charge="1" type="11" code="602" name="From Ntuple: u" /> - <Particle charge="-1" type="11" code="603" name="From Ntuple: s" /> - <Particle charge="1" type="11" code="604" name="From Ntuple: c" /> - <Particle charge="-1" type="11" code="605" name="From Ntuple: b" /> - <Particle charge="1" type="11" code="606" name="From Ntuple: t" /> - <Particle charge="0" type="12" code="21" name="gluon" /> - <Particle charge="0" type="13" code="23" name="Z" /> - - <!-- - fragmentation types - --> - - <Particle charge="0" type="14" code="91" name="cluster fragmentation" /> - <Particle charge="0" type="14" code="92" name="string fragmentation" /> - <Particle charge="0" type="14" code="93" name="independent fragmentation" /> - - <!-- - extra particles (Higgs (h0), J/psi, upsilon) - --> - - <Particle charge="0" type="15" code="25" name="h0" /> - <Particle charge="0" type="15" code="443" name="J/ψ" /> - <Particle charge="0" type="15" code="553" name="υ" /> - -</PDG> diff --git a/graphics/AtlantisJava/configuration/rpsplt_fcal.csv b/graphics/AtlantisJava/configuration/rpsplt_fcal.csv deleted file mode 100644 index f5c29d694923..000000000000 --- a/graphics/AtlantisJava/configuration/rpsplt_fcal.csv +++ /dev/null @@ -1,498 +0,0 @@ -# Real Pulse Shape Plots Lookup Table values for FCAL calorimeter - - -# FCAL, lookup table layer 0, amplitude values -FCAL_LAYER0_AMPLITUDE - "0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.00145f, -0.0002f, -0.00052f, - -9e-05f, 0.00017f, 0.00022f, 3e-05f, -0.00031f, - -0.00061f, -0.00046f, -0.00033f, 0.00012f, -0.00013f, - -0.00025f, -0.0005f, -0.00038f, -0.00035f, -0.0002f, - -0.00042f, -0.00031f, -0.00022f, 0.0001f, -0.00017f, - -0.00033f, 0.00028f, 0.00017f, 2e-05f, 9e-05f, - -0.00018f, -0.00023f, 6e-05f, -3e-05f, -0.00037f, - -0.00029f, -0.00021f, -0.00042f, -0.00047f, -0.00032f, - -0.00041f, -0.0002f, 0.0001f, 0.00032f, 0.0006f, - 0.00147f, 0.00234f, 0.00409f, 0.00701f, 0.01124f, - 0.01704f, 0.02441f, 0.0349f, 0.04655f, 0.06027f, - 0.07674f, 0.09489f, 0.11624f, 0.13948f, 0.16603f, - 0.19516f, 0.22665f, 0.25946f, 0.29534f, 0.3334f, - 0.37421f, 0.41508f, 0.45488f, 0.49473f, 0.53529f, - 0.5759f, 0.61356f, 0.65022f, 0.68584f, 0.72121f, - 0.75454f, 0.78585f, 0.81642f, 0.84443f, 0.8694f, - 0.89244f, 0.9134f, 0.93157f, 0.94811f, 0.96263f, - 0.9756f, 0.98573f, 0.99294f, 0.99721f, 0.99958f, - 0.99937f, 0.99596f, 0.99067f, 0.98339f, 0.97312f, - 0.96037f, 0.94624f, 0.93069f, 0.9126f, 0.89226f, - 0.87097f, 0.84789f, 0.82241f, 0.79715f, 0.7696f, - 0.74111f, 0.713f, 0.68302f, 0.65322f, 0.62221f, - 0.58901f, 0.55499f, 0.52119f, 0.48651f, 0.45161f, - 0.41474f, 0.37863f, 0.34418f, 0.31038f, 0.2759f, - 0.24106f, 0.20725f, 0.17425f, 0.14223f, 0.10914f, - 0.07784f, 0.04664f, 0.01518f, -0.01539f, -0.04403f, - -0.07252f, -0.1007f, -0.12714f, -0.15365f, -0.17955f, - -0.20587f, -0.23009f, -0.25359f, -0.27704f, -0.29989f, - -0.32317f, -0.34403f, -0.3634f, -0.3812f, -0.39806f, - -0.41503f, -0.42994f, -0.4448f, -0.45808f, -0.46945f, - -0.47926f, -0.48934f, -0.50054f, -0.51152f, -0.52073f, - -0.52908f, -0.53691f, -0.5431f, -0.55034f, -0.55776f, - -0.56445f, -0.56952f, -0.57341f, -0.57756f, -0.58138f, - -0.58532f, -0.58718f, -0.58934f, -0.5898f, -0.59049f, - -0.59047f, -0.5886f, -0.58601f, -0.58368f, -0.58009f, - -0.57595f, -0.56963f, -0.55958f, -0.54925f, -0.5387f, - -0.52797f, -0.5171f, -0.50614f, -0.49513f, -0.4841f, - -0.47308f, -0.46212f, -0.45122f, -0.44041f, -0.42973f, - -0.41916f, -0.40875f, -0.39851f, -0.38846f, -0.37862f, - -0.36901f, -0.35965f, -0.35054f, -0.34168f, -0.33306f, - -0.32471f, -0.31661f, -0.30876f, -0.30117f, -0.29382f, - -0.28672f, -0.27987f, -0.27327f, -0.2669f, -0.26077f, - -0.25487f, -0.2492f, -0.24375f, -0.23855f, -0.23358f, - -0.22884f, -0.22433f, -0.22007f, -0.21602f, -0.21221f, - -0.20861f, -0.20521f, -0.20199f, -0.19895f, -0.19609f, - -0.19337f, -0.19079f, -0.18833f, -0.186f, -0.18376f, - -0.1816f, -0.17953f, -0.17753f, -0.17557f, -0.17367f, - -0.1718f, -0.16996f, -0.16814f, -0.16634f, -0.16454f, - -0.16276f, -0.16097f, -0.15917f, -0.15737f, -0.15555f, - -0.15372f, -0.15186f, -0.14997f, -0.14801f, -0.14599f, - -0.14389f, -0.1417f, -0.13943f, -0.13712f, -0.13482f, - -0.13255f, -0.13036f, -0.12824f, -0.12623f, -0.12429f, - -0.12243f, -0.12061f, -0.11882f, -0.11704f, -0.11527f, - -0.11349f, -0.11167f, -0.10983f, -0.10794f, -0.10603f, - -0.10406f, -0.10205f, -0.1f, -0.09791f, -0.09578f, - -0.09361f, -0.09141f, -0.08918f, -0.08694f, -0.08466f, - -0.08238f, -0.08009f, -0.0778f, -0.0755f, -0.07321f, - -0.07093f, -0.06867f, -0.06642f, -0.06421f, -0.06202f, - -0.05986f, -0.05774f, -0.05566f, -0.0536f, -0.05158f, - -0.04959f, -0.04764f, -0.04572f, -0.04385f, -0.04203f, - -0.04025f, -0.03853f, -0.03687f, -0.03526f, -0.0337f, - -0.03218f, -0.03072f, -0.0293f, -0.02794f, -0.02663f, - -0.02536f, -0.02413f, -0.02294f, -0.02181f, -0.0207f, - -0.01964f, -0.01861f, -0.01761f, -0.01665f, -0.01573f, - -0.01484f, -0.01399f, -0.01319f, -0.01242f, -0.01168f, - -0.011f, -0.01034f, -0.00973f, -0.00914f, -0.00861f, - -0.00808f, -0.00761f, -0.00716f, -0.00673f, -0.00632f, - -0.00595f, -0.00559f, -0.00526f, -0.00494f, -0.00464f, - -0.00436f, -0.00409f, -0.00383f, -0.00359f, -0.00335f, - -0.00312f, -0.00291f, -0.00271f, -0.00252f, -0.00234f, - -0.00219f, -0.00204f, -0.0019f, -0.00174f, -0.00158f, - -0.00139f, -0.00118f, -0.00094f, -0.00068f, -0.00042f, - -0.00016f, 8e-05f, 0.00032f, 0.00052f, 0.0007f, - 0.00088f, 0.00102f, 0.00114f, 0.0013f, 0.0014f, - 0.00148f, 0.00159f, 0.00171f, 0.0018f, 0.00191f, - 0.00197f, 0.00207f, 0.00218f, 0.00232f, 0.00243f, - 0.00254f, 0.00267f, 0.0028f, 0.00292f, 0.00305f, - 0.00318f, 0.00331f, 0.00347f, 0.00363f, 0.00376f, - 0.00388f, 0.00405f, 0.00421f, 0.00433f, 0.00446f, - 0.00458f, 0.00473f, 0.00488f, 0.00497f, 0.00514f, - 0.00522f, 0.00538f, 0.00553f, 0.00563f, 0.00573f, - 0.00588f, 0.00596f, 0.00608f, 0.0062f, 0.00629f, - 0.00636f, 0.00646f, 0.00654f, 0.00663f, 0.00669f, - 0.00674f, 0.00679f, 0.00688f, 0.00688f, 0.00696f, - 0.00702f, 0.00704f, 0.00711f, 0.00712f, 0.0072f, - 0.0072f, 0.00727f, 0.00729f, 0.00729f, 0.00737f, - 0.00737f, 0.00737f, 0.00737f, 0.00746f, 0.00746f, - 0.00746f, 0.00746f, 0.00746f, 0.00746f, 0.00746f, - 0.00746f, 0.00746f, 0.00737f, 0.00737f, 0.00737f, - 0.00737f, 0.00737f, 0.00737f, 0.00729f, 0.00729f, - 0.00729f, 0.00729f, 0.00729f, 0.0072f, 0.0072f, - 0.00717f, 0.00712f, 0.00708f, 0.00704f, 0.00704f, - 0.00696f, 0.00696f, 0.00696f, 0.00696f, 0.00696f, - 0.00696f, 0.00696f, 0.00696f, 0.00696f, 0.00696f, - 0.00688f, 0.00688f, 0.00688f, 0.00688f, 0.00688f, - 0.00684f, 0.00679f, 0.00679f, 0.00679f, 0.00671f, - 0.00671f, 0.00671f, 0.00671f, 0.00663f, 0.00663f, - 0.00663f, 0.00663f, 0.00659f, 0.00655f, 0.00655f, - 0.00655f, 0.00655f, 0.00655f, 0.00651f, 0.00646f, - 0.00646f, 0.00646f, 0.00646f, 0.00646f, 0.00646f, - 0.00646f, 0.00646f, 0.00639f, 0.00638f, 0.00638f, - 0.00638f, 0.00638f, 0.00638f, 0.00638f, 0.00638f, - 0.00638f, 0.00638f, 0.00638f, 0.00638f, 0.0063f, - 0.00629f, 0.00629f, 0.00629f, 0.00629f, 0.00629f, - 0.00629f, 0.00629f, 0.00629f, 0.00629f, 0.00622f, - 0.00622f, 0.00622f, 0.00622f, 0.00622f, 0.00622f, - 0.00622f, 0.00622f, 0.00612f, 0.00612f, 0.00612f, - 0.00612f, 0.00612f, 0.00612f, 0.00612f, 0.00612f, - 0.00606f, 0.00605f, 0.00605f, 0.00605f, 0.00605f, - 0.00605f, 0.00605f, 0.00601f, 0.00596f, 0.00596f, - 0.00596f, 0.00596f, 0.00596f, 0.00596f, 0.00596f, - 0.00588f, 0.00588f, 0.00588f, 0.00588f, 0.00588f, - 0.00588f, 0.00585f, 0.00579f, 0.00579f, 0.00579f, - 0.00579f, 0.00579f, 0.00572f, 0.00572f, 0.00572f, - 0.00572f, 0.00572f, 0.00572f, 0.00572f, 0.00572f, - 0.00572f, 0.00563f, 0.00563f, 0.00563f, 0.00563f, - 0.00563f, 0.00563f, 0.00563f, 0.00563f, 0.00563f, - 0.00563f, 0.00563f, 0.00563f, 0.00563f, 0.00563f" - - -# FCAL lookup table layer 1, amplitude values -FCAL_LAYER1_AMPLITUDE - "0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, -0.00014f, - -0.00015f, -0.00019f, -0.00024f, -2e-05f, 8e-05f, - 0.00012f, -3e-05f, -0.00012f, -0.00011f, -0.0002f, - -4e-05f, 7e-05f, 5e-05f, -1e-05f, -9e-05f, - -3e-05f, -0.00012f, -3e-05f, -3e-05f, -1e-05f, - -3e-05f, -1e-05f, -0.00011f, -0.00021f, -0.00017f, - -0.00016f, -6e-05f, 1e-05f, 1e-05f, -3e-05f, - -0.00018f, -0.0002f, -0.00018f, -8e-05f, -2e-05f, - -5e-05f, 0.00011f, 4e-05f, 0.00032f, 0.00076f, - 0.00136f, 0.00271f, 0.00417f, 0.00696f, 0.01099f, - 0.01602f, 0.02229f, 0.02963f, 0.03936f, 0.05282f, - 0.06928f, 0.08819f, 0.10857f, 0.12914f, 0.15221f, - 0.17682f, 0.20343f, 0.23335f, 0.26583f, 0.29864f, - 0.33272f, 0.36835f, 0.40457f, 0.44149f, 0.47595f, - 0.51049f, 0.54648f, 0.5816f, 0.61676f, 0.65114f, - 0.68367f, 0.7141f, 0.74147f, 0.76915f, 0.79855f, - 0.82565f, 0.85105f, 0.87379f, 0.89366f, 0.9111f, - 0.927f, 0.94162f, 0.95496f, 0.96664f, 0.97688f, - 0.98534f, 0.99109f, 0.99601f, 0.99887f, 0.99964f, - 0.99962f, 0.99681f, 0.99299f, 0.98726f, 0.98f, - 0.97158f, 0.96249f, 0.95187f, 0.9393f, 0.92385f, - 0.90628f, 0.88827f, 0.86996f, 0.85269f, 0.83453f, - 0.81503f, 0.79519f, 0.77368f, 0.74984f, 0.72628f, - 0.70228f, 0.67716f, 0.65181f, 0.62399f, 0.59774f, - 0.57129f, 0.54263f, 0.51398f, 0.48417f, 0.45309f, - 0.42268f, 0.39325f, 0.36432f, 0.33302f, 0.29777f, - 0.26282f, 0.22816f, 0.19507f, 0.16394f, 0.13389f, - 0.10437f, 0.07385f, 0.04319f, 0.01199f, -0.01883f, - -0.04912f, -0.07801f, -0.10802f, -0.13734f, -0.16453f, - -0.19169f, -0.2182f, -0.24487f, -0.27109f, -0.29671f, - -0.32083f, -0.34391f, -0.36456f, -0.38568f, -0.40796f, - -0.428f, -0.44835f, -0.46643f, -0.48286f, -0.49816f, - -0.51161f, -0.5248f, -0.5374f, -0.54928f, -0.5608f, - -0.57103f, -0.57868f, -0.58697f, -0.59288f, -0.59803f, - -0.60282f, -0.60532f, -0.60756f, -0.60862f, -0.60882f, - -0.60828f, -0.60572f, -0.60473f, -0.60353f, -0.60196f, - -0.6001f, -0.59736f, -0.59308f, -0.58847f, -0.5836f, - -0.57846f, -0.57308f, -0.56749f, -0.56171f, -0.55576f, - -0.54966f, -0.54343f, -0.5371f, -0.53066f, -0.52415f, - -0.51757f, -0.51094f, -0.50428f, -0.4976f, -0.4909f, - -0.4842f, -0.47749f, -0.47078f, -0.4641f, -0.45745f, - -0.45081f, -0.44422f, -0.43769f, -0.43118f, -0.42475f, - -0.41838f, -0.41207f, -0.40583f, -0.39965f, -0.39355f, - -0.38752f, -0.38156f, -0.37568f, -0.36988f, -0.36414f, - -0.35848f, -0.35292f, -0.34744f, -0.34205f, -0.33676f, - -0.33155f, -0.32642f, -0.32135f, -0.31634f, -0.31139f, - -0.30648f, -0.30164f, -0.29688f, -0.29227f, -0.28779f, - -0.28349f, -0.27937f, -0.27541f, -0.2716f, -0.26792f, - -0.26432f, -0.26084f, -0.25743f, -0.25406f, -0.25074f, - -0.24743f, -0.24413f, -0.24086f, -0.23757f, -0.23428f, - -0.23096f, -0.22764f, -0.22429f, -0.22092f, -0.21754f, - -0.21414f, -0.21072f, -0.20729f, -0.20385f, -0.20038f, - -0.19692f, -0.19344f, -0.18993f, -0.18644f, -0.18293f, - -0.17943f, -0.17592f, -0.17244f, -0.16898f, -0.16553f, - -0.16211f, -0.1587f, -0.15533f, -0.15198f, -0.14866f, - -0.14538f, -0.14213f, -0.13891f, -0.13573f, -0.13259f, - -0.12948f, -0.12641f, -0.1234f, -0.12042f, -0.11747f, - -0.11457f, -0.11173f, -0.10891f, -0.10617f, -0.10345f, - -0.10079f, -0.09819f, -0.09562f, -0.09311f, -0.09065f, - -0.08823f, -0.08586f, -0.08354f, -0.08125f, -0.07903f, - -0.07685f, -0.07471f, -0.07262f, -0.07057f, -0.06857f, - -0.06662f, -0.06471f, -0.06284f, -0.06102f, -0.05926f, - -0.05751f, -0.05582f, -0.05416f, -0.05254f, -0.05096f, - -0.04942f, -0.04792f, -0.04647f, -0.04507f, -0.04369f, - -0.04235f, -0.04104f, -0.03974f, -0.03845f, -0.03717f, - -0.03591f, -0.03467f, -0.03347f, -0.03231f, -0.03119f, - -0.03012f, -0.0291f, -0.02812f, -0.02718f, -0.02629f, - -0.02542f, -0.0246f, -0.02381f, -0.02304f, -0.0223f, - -0.02157f, -0.02088f, -0.0202f, -0.01953f, -0.01888f, - -0.01824f, -0.01761f, -0.017f, -0.0164f, -0.0158f, - -0.01523f, -0.01466f, -0.0141f, -0.01355f, -0.01301f, - -0.01247f, -0.01195f, -0.01141f, -0.0109f, -0.01039f, - -0.00989f, -0.0094f, -0.0089f, -0.00842f, -0.00796f, - -0.0075f, -0.00705f, -0.0066f, -0.00616f, -0.00575f, - -0.00533f, -0.00493f, -0.00452f, -0.00413f, -0.00375f, - -0.00338f, -0.003f, -0.00265f, -0.00228f, -0.00195f, - -0.00162f, -0.00128f, -0.00096f, -0.00064f, -0.00035f, - -5e-05f, 0.00023f, 0.0005f, 0.00079f, 0.00105f, - 0.00131f, 0.00156f, 0.00181f, 0.00201f, 0.0023f, - 0.0025f, 0.00267f, 0.00287f, 0.00315f, 0.00335f, - 0.00346f, 0.00367f, 0.0039f, 0.0041f, 0.00421f, - 0.00441f, 0.00458f, 0.00473f, 0.0049f, 0.00505f, - 0.00516f, 0.00522f, 0.00537f, 0.00551f, 0.00552f, - 0.00569f, 0.00579f, 0.0059f, 0.00601f, 0.00615f, - 0.00628f, 0.00632f, 0.00648f, 0.00653f, 0.00664f, - 0.00679f, 0.0068f, 0.00696f, 0.00696f, 0.007f, - 0.00711f, 0.00711f, 0.00724f, 0.00728f, 0.00728f, - 0.00728f, 0.00743f, 0.00743f, 0.00743f, 0.00743f, - 0.00744f, 0.00759f, 0.00759f, 0.00759f, 0.00759f, - 0.00759f, 0.00759f, 0.00774f, 0.00775f, 0.00775f, - 0.00775f, 0.00775f, 0.00775f, 0.00775f, 0.00775f, - 0.00789f, 0.00791f, 0.00791f, 0.00791f, 0.00791f, - 0.00791f, 0.00791f, 0.00791f, 0.00791f, 0.00791f, - 0.00791f, 0.00792f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00807f, 0.00807f, - 0.00807f, 0.00807f, 0.00807f, 0.00791f, 0.00791f, - 0.00791f, 0.00791f, 0.00791f, 0.00791f, 0.00791f, - 0.00791f, 0.00791f, 0.00791f, 0.00791f, 0.00791f, - 0.00791f, 0.00791f, 0.00791f, 0.00791f, 0.00791f, - 0.00791f, 0.00775f, 0.00775f, 0.00775f, 0.00775f, - 0.00775f, 0.00775f, 0.00775f, 0.00775f, 0.00775f, - 0.00775f, 0.00775f, 0.00775f, 0.00775f, 0.0076f, - 0.00759f, 0.00759f, 0.00759f, 0.00759f, 0.00759f, - 0.00759f, 0.00759f, 0.00759f, 0.00759f, 0.00759f, - 0.00759f, 0.00753f, 0.00743f, 0.00743f, 0.00743f, - 0.00743f, 0.00743f, 0.00743f, 0.00743f, 0.00743f, - 0.00743f, 0.00743f, 0.00743f, 0.00743f, 0.00743f, - 0.00728f, 0.00728f, 0.00728f, 0.00728f, 0.00728f, - 0.00728f, 0.00728f, 0.00728f, 0.00728f, 0.00728f, - 0.00728f, 0.00728f, 0.00728f, 0.00727f, 0.00711f, - 0.00711f, 0.00711f, 0.00711f, 0.00711f, 0.00711f, - 0.00711f, 0.00711f, 0.00711f, 0.00711f, 0.00711f, - 0.00711f, 0.00711f, 0.00711f, 0.00711f, 0.00711f" - - -# FCAL lookup table layer 2, amplitude values -FCAL_LAYER2_AMPLITUDE - "0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, -0.00128f, -0.00011f, 0.00018f, 2e-05f, - 0.00012f, -6e-05f, -5e-05f, -4e-05f, -4e-05f, - -6e-05f, -0.00031f, 3e-05f, -0.00022f, 7e-05f, - -3e-05f, 2e-05f, 0.00011f, 9e-05f, -0.00025f, - -5e-05f, -0.00026f, -3e-05f, -3e-05f, -5e-05f, - -3e-05f, 8e-05f, 0.00016f, 0.00025f, 0.00015f, - 0.00018f, 9e-05f, -0.00016f, -0.00017f, 0.00012f, - 0.00031f, 0.00061f, 0.00137f, 0.00259f, 0.00487f, - 0.00807f, 0.01106f, 0.01611f, 0.02298f, 0.03195f, - 0.04154f, 0.05328f, 0.06624f, 0.08155f, 0.09926f, - 0.11723f, 0.13765f, 0.16233f, 0.18937f, 0.21701f, - 0.24599f, 0.27675f, 0.30806f, 0.34205f, 0.3763f, - 0.40922f, 0.44335f, 0.47795f, 0.51151f, 0.54584f, - 0.58035f, 0.61246f, 0.64345f, 0.67427f, 0.70516f, - 0.73373f, 0.75953f, 0.78417f, 0.80817f, 0.83037f, - 0.85125f, 0.87108f, 0.88998f, 0.9072f, 0.92291f, - 0.93755f, 0.95053f, 0.96236f, 0.97239f, 0.9802f, - 0.9869f, 0.99293f, 0.99661f, 0.99861f, 0.99968f, - 0.99958f, 0.99822f, 0.99567f, 0.9913f, 0.98539f, - 0.97946f, 0.97165f, 0.96321f, 0.95356f, 0.943f, - 0.93288f, 0.92124f, 0.90748f, 0.8924f, 0.87741f, - 0.86239f, 0.84699f, 0.83096f, 0.81354f, 0.79568f, - 0.77812f, 0.75942f, 0.73898f, 0.71895f, 0.6979f, - 0.67584f, 0.65541f, 0.63427f, 0.61183f, 0.58872f, - 0.56582f, 0.54277f, 0.51966f, 0.49662f, 0.47374f, - 0.45068f, 0.42633f, 0.40063f, 0.37501f, 0.35003f, - 0.32551f, 0.30122f, 0.27643f, 0.2508f, 0.22669f, - 0.2018f, 0.1756f, 0.15017f, 0.12637f, 0.102f, - 0.07617f, 0.05128f, 0.02768f, 0.00478f, -0.01868f, - -0.0427f, -0.06341f, -0.08504f, -0.10568f, -0.12438f, - -0.14567f, -0.16618f, -0.18641f, -0.20502f, -0.22295f, - -0.24012f, -0.2569f, -0.27256f, -0.28823f, -0.30194f, - -0.31542f, -0.33028f, -0.34304f, -0.35301f, -0.36387f, - -0.37478f, -0.38515f, -0.39437f, -0.4023f, -0.41029f, - -0.41949f, -0.42512f, -0.43117f, -0.43628f, -0.44007f, - -0.4454f, -0.45203f, -0.45813f, -0.46382f, -0.46907f, - -0.4739f, -0.47832f, -0.48235f, -0.48597f, -0.4892f, - -0.49207f, -0.49454f, -0.49666f, -0.49841f, -0.49984f, - -0.50092f, -0.50166f, -0.50208f, -0.50221f, -0.50202f, - -0.50155f, -0.50082f, -0.49982f, -0.49856f, -0.49706f, - -0.49533f, -0.49338f, -0.49122f, -0.48885f, -0.48628f, - -0.48354f, -0.48064f, -0.47755f, -0.47432f, -0.47094f, - -0.46742f, -0.46379f, -0.46001f, -0.45611f, -0.45208f, - -0.4479f, -0.44361f, -0.43919f, -0.43467f, -0.43006f, - -0.42543f, -0.42077f, -0.41613f, -0.4115f, -0.4069f, - -0.40233f, -0.39778f, -0.39325f, -0.38873f, -0.38422f, - -0.37971f, -0.37519f, -0.37068f, -0.36616f, -0.36163f, - -0.3571f, -0.35256f, -0.34802f, -0.34347f, -0.33892f, - -0.33436f, -0.32982f, -0.32529f, -0.32077f, -0.31626f, - -0.31179f, -0.30733f, -0.30289f, -0.2985f, -0.29413f, - -0.2898f, -0.28552f, -0.28129f, -0.27709f, -0.27294f, - -0.26885f, -0.26479f, -0.26078f, -0.25685f, -0.25293f, - -0.24906f, -0.24524f, -0.24147f, -0.23772f, -0.23403f, - -0.23038f, -0.22676f, -0.22318f, -0.21964f, -0.21614f, - -0.21268f, -0.20925f, -0.20586f, -0.20249f, -0.19916f, - -0.19588f, -0.19261f, -0.1894f, -0.18622f, -0.18305f, - -0.17994f, -0.17686f, -0.1738f, -0.17078f, -0.16779f, - -0.16484f, -0.1619f, -0.15902f, -0.15615f, -0.15333f, - -0.15054f, -0.14777f, -0.14504f, -0.14234f, -0.13967f, - -0.13704f, -0.13444f, -0.13187f, -0.12934f, -0.12684f, - -0.12439f, -0.12197f, -0.11959f, -0.11724f, -0.11494f, - -0.11265f, -0.1104f, -0.10815f, -0.10592f, -0.10371f, - -0.10151f, -0.09934f, -0.0972f, -0.09509f, -0.09302f, - -0.09099f, -0.08899f, -0.08705f, -0.08514f, -0.08327f, - -0.08145f, -0.07966f, -0.0779f, -0.07617f, -0.07448f, - -0.07282f, -0.07119f, -0.06958f, -0.06801f, -0.06646f, - -0.06493f, -0.06344f, -0.06196f, -0.06051f, -0.05908f, - -0.05768f, -0.05629f, -0.05495f, -0.0536f, -0.05229f, - -0.051f, -0.04974f, -0.04849f, -0.04726f, -0.04607f, - -0.0449f, -0.04375f, -0.04262f, -0.04151f, -0.04044f, - -0.03937f, -0.03834f, -0.03732f, -0.03634f, -0.03536f, - -0.0344f, -0.03347f, -0.03256f, -0.03166f, -0.03079f, - -0.02993f, -0.02908f, -0.02826f, -0.02745f, -0.02666f, - -0.02588f, -0.02512f, -0.02437f, -0.02364f, -0.02293f, - -0.02223f, -0.02154f, -0.02087f, -0.02021f, -0.01957f, - -0.01892f, -0.0183f, -0.01768f, -0.0171f, -0.01651f, - -0.01594f, -0.01536f, -0.01482f, -0.01428f, -0.01375f, - -0.01323f, -0.01271f, -0.01221f, -0.01171f, -0.01123f, - -0.01076f, -0.01029f, -0.00984f, -0.0094f, -0.00898f, - -0.00857f, -0.00817f, -0.00777f, -0.00739f, -0.007f, - -0.00663f, -0.00624f, -0.00587f, -0.00551f, -0.00514f, - -0.00479f, -0.00444f, -0.0041f, -0.00377f, -0.00344f, - -0.00313f, -0.00282f, -0.00252f, -0.00223f, -0.00195f, - -0.00168f, -0.0014f, -0.00114f, -0.00089f, -0.00063f, - -0.00039f, -0.00015f, 9e-05f, 0.00031f, 0.00053f, - 0.00076f, 0.00096f, 0.00117f, 0.00138f, 0.00158f, - 0.00178f, 0.00194f, 0.00216f, 0.00234f, 0.00251f, - 0.00269f, 0.0029f, 0.00298f, 0.00319f, 0.00338f, - 0.00353f, 0.00368f, 0.00383f, 0.00398f, 0.00408f, - 0.00427f, 0.00438f, 0.00447f, 0.00458f, 0.00472f, - 0.00488f, 0.00501f, 0.00512f, 0.00517f, 0.00532f, - 0.00546f, 0.00547f, 0.00561f, 0.00572f, 0.00576f, - 0.0059f, 0.00594f, 0.00606f, 0.0062f, 0.0062f, - 0.00635f, 0.00636f, 0.0065f, 0.0065f, 0.00664f, - 0.00665f, 0.0068f, 0.0068f, 0.00684f, 0.00695f, - 0.00695f, 0.0071f, 0.0071f, 0.00721f, 0.00725f, - 0.00725f, 0.00739f, 0.0074f, 0.0074f, 0.00751f, - 0.00755f, 0.00755f, 0.00759f, 0.00769f, 0.00769f, - 0.00769f, 0.00769f, 0.00783f, 0.00783f, 0.00783f, - 0.00783f, 0.00795f, 0.00799f, 0.00799f, 0.00799f, - 0.00799f, 0.00812f, 0.00813f, 0.00813f, 0.00813f, - 0.00813f, 0.00813f, 0.00828f, 0.00829f, 0.00829f, - 0.00829f, 0.00829f, 0.00829f, 0.00829f, 0.00829f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00844f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00858f, 0.00858f, 0.00858f, - 0.00858f, 0.00858f, 0.00854f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f, - 0.00843f, 0.00843f, 0.00843f, 0.00843f, 0.00843f" - - -# FCAL lookup table time values -FCAL_TIME - "0.5f, 1.5f, 2.5f, 3.5f, 4.5f, - 5.5f, 6.5f, 7.5f, 8.5f, 9.5f, - 10.5f, 11.5f, 12.5f, 13.5f, 14.5f, - 15.5f, 16.5f, 17.5f, 18.5f, 19.5f, - 20.5f, 21.5f, 22.5f, 23.5f, 24.5f, - 25.5f, 26.5f, 27.5f, 28.5f, 29.5f, - 30.5f, 31.5f, 32.5f, 33.5f, 34.5f, - 35.5f, 36.5f, 37.5f, 38.5f, 39.5f, - 40.5f, 41.5f, 42.5f, 43.5f, 44.5f, - 45.5f, 46.5f, 47.5f, 48.5f, 49.5f, - 50.5f, 51.5f, 52.5f, 53.5f, 54.5f, - 55.5f, 56.5f, 57.5f, 58.5f, 59.5f, - 60.5f, 61.5f, 62.5f, 63.5f, 64.5f, - 65.5f, 66.5f, 67.5f, 68.5f, 69.5f, - 70.5f, 71.5f, 72.5f, 73.5f, 74.5f, - 75.5f, 76.5f, 77.5f, 78.5f, 79.5f, - 80.5f, 81.5f, 82.5f, 83.5f, 84.5f, - 85.5f, 86.5f, 87.5f, 88.5f, 89.5f, - 90.5f, 91.5f, 92.5f, 93.5f, 94.5f, - 95.5f, 96.5f, 97.5f, 98.5f, 99.5f, - 100.5f, 101.5f, 102.5f, 103.5f, 104.5f, - 105.5f, 106.5f, 107.5f, 108.5f, 109.5f, - 110.5f, 111.5f, 112.5f, 113.5f, 114.5f, - 115.5f, 116.5f, 117.5f, 118.5f, 119.5f, - 120.5f, 121.5f, 122.5f, 123.5f, 124.5f, - 125.5f, 126.5f, 127.5f, 128.5f, 129.5f, - 130.5f, 131.5f, 132.5f, 133.5f, 134.5f, - 135.5f, 136.5f, 137.5f, 138.5f, 139.5f, - 140.5f, 141.5f, 142.5f, 143.5f, 144.5f, - 145.5f, 146.5f, 147.5f, 148.5f, 149.5f, - 150.5f, 151.5f, 152.5f, 153.5f, 154.5f, - 155.5f, 156.5f, 157.5f, 158.5f, 159.5f, - 160.5f, 161.5f, 162.5f, 163.5f, 164.5f, - 165.5f, 166.5f, 167.5f, 168.5f, 169.5f, - 170.5f, 171.5f, 172.5f, 173.5f, 174.5f, - 175.5f, 176.5f, 177.5f, 178.5f, 179.5f, - 180.5f, 181.5f, 182.5f, 183.5f, 184.5f, - 185.5f, 186.5f, 187.5f, 188.5f, 189.5f, - 190.5f, 191.5f, 192.5f, 193.5f, 194.5f, - 195.5f, 196.5f, 197.5f, 198.5f, 199.5f, - 200.5f, 201.5f, 202.5f, 203.5f, 204.5f, - 205.5f, 206.5f, 207.5f, 208.5f, 209.5f, - 210.5f, 211.5f, 212.5f, 213.5f, 214.5f, - 215.5f, 216.5f, 217.5f, 218.5f, 219.5f, - 220.5f, 221.5f, 222.5f, 223.5f, 224.5f, - 225.5f, 226.5f, 227.5f, 228.5f, 229.5f, - 230.5f, 231.5f, 232.5f, 233.5f, 234.5f, - 235.5f, 236.5f, 237.5f, 238.5f, 239.5f, - 240.5f, 241.5f, 242.5f, 243.5f, 244.5f, - 245.5f, 246.5f, 247.5f, 248.5f, 249.5f, - 250.5f, 251.5f, 252.5f, 253.5f, 254.5f, - 255.5f, 256.5f, 257.5f, 258.5f, 259.5f, - 260.5f, 261.5f, 262.5f, 263.5f, 264.5f, - 265.5f, 266.5f, 267.5f, 268.5f, 269.5f, - 270.5f, 271.5f, 272.5f, 273.5f, 274.5f, - 275.5f, 276.5f, 277.5f, 278.5f, 279.5f, - 280.5f, 281.5f, 282.5f, 283.5f, 284.5f, - 285.5f, 286.5f, 287.5f, 288.5f, 289.5f, - 290.5f, 291.5f, 292.5f, 293.5f, 294.5f, - 295.5f, 296.5f, 297.5f, 298.5f, 299.5f, - 300.5f, 301.5f, 302.5f, 303.5f, 304.5f, - 305.5f, 306.5f, 307.5f, 308.5f, 309.5f, - 310.5f, 311.5f, 312.5f, 313.5f, 314.5f, - 315.5f, 316.5f, 317.5f, 318.5f, 319.5f, - 320.5f, 321.5f, 322.5f, 323.5f, 324.5f, - 325.5f, 326.5f, 327.5f, 328.5f, 329.5f, - 330.5f, 331.5f, 332.5f, 333.5f, 334.5f, - 335.5f, 336.5f, 337.5f, 338.5f, 339.5f, - 340.5f, 341.5f, 342.5f, 343.5f, 344.5f, - 345.5f, 346.5f, 347.5f, 348.5f, 349.5f, - 350.5f, 351.5f, 352.5f, 353.5f, 354.5f, - 355.5f, 356.5f, 357.5f, 358.5f, 359.5f, - 360.5f, 361.5f, 362.5f, 363.5f, 364.5f, - 365.5f, 366.5f, 367.5f, 368.5f, 369.5f, - 370.5f, 371.5f, 372.5f, 373.5f, 374.5f, - 375.5f, 376.5f, 377.5f, 378.5f, 379.5f, - 380.5f, 381.5f, 382.5f, 383.5f, 384.5f, - 385.5f, 386.5f, 387.5f, 388.5f, 389.5f, - 390.5f, 391.5f, 392.5f, 393.5f, 394.5f, - 395.5f, 396.5f, 397.5f, 398.5f, 399.5f, - 400.5f, 401.5f, 402.5f, 403.5f, 404.5f, - 405.5f, 406.5f, 407.5f, 408.5f, 409.5f, - 410.5f, 411.5f, 412.5f, 413.5f, 414.5f, - 415.5f, 416.5f, 417.5f, 418.5f, 419.5f, - 420.5f, 421.5f, 422.5f, 423.5f, 424.5f, - 425.5f, 426.5f, 427.5f, 428.5f, 429.5f, - 430.5f, 431.5f, 432.5f, 433.5f, 434.5f, - 435.5f, 436.5f, 437.5f, 438.5f, 439.5f, - 440.5f, 441.5f, 442.5f, 443.5f, 444.5f, - 445.5f, 446.5f, 447.5f, 448.5f, 449.5f, - 450.5f, 451.5f, 452.5f, 453.5f, 454.5f, - 455.5f, 456.5f, 457.5f, 458.5f, 459.5f, - 460.5f, 461.5f, 462.5f, 463.5f, 464.5f, - 465.5f, 466.5f, 467.5f, 468.5f, 469.5f, - 470.5f, 471.5f, 472.5f, 473.5f, 474.5f, - 475.5f, 476.5f, 477.5f, 478.5f, 479.5f, - 480.5f, 481.5f, 482.5f, 483.5f, 484.5f, - 485.5f, 486.5f, 487.5f, 488.5f, 489.5f, - 490.5f, 491.5f, 492.5f, 493.5f, 494.5f, - 495.5f, 496.5f, 497.5f, 498.5f, 499.5f, - 500.5f, 501.5f, 502.5f, 503.5f, 504.5f, - 505.5f, 506.5f, 507.5f, 508.5f, 509.5f, - 510.5f, 511.5f, 512.5f, 513.5f, 514.5f, - 515.5f, 516.5f, 517.5f, 518.5f, 519.5f, - 520.5f, 521.5f, 522.5f, 523.5f, 524.5f, - 525.5f, 526.5f, 527.5f, 528.5f, 529.5f, - 530.5f, 531.5f, 532.5f, 533.5f, 534.5f, - 535.5f, 536.5f, 537.5f, 538.5f, 539.5f, - 540.5f, 541.5f, 542.5f, 543.5f, 544.5f, - 545.5f, 546.5f, 547.5f, 548.5f, 549.5f, - 550.5f, 551.5f, 552.5f, 553.5f, 554.5f, - 555.5f, 556.5f, 557.5f, 558.5f, 559.5f, - 560.5f, 561.5f, 562.5f, 563.5f, 564.5f, - 565.5f, 566.5f, 567.5f, 568.5f, 569.5f, - 570.5f, 571.5f, 572.5f, 573.5f, 574.5f, - 575.5f, 576.5f, 577.5f, 578.5f, 579.5f, - 580.5f, 581.5f, 582.5f, 583.5f, 584.5f, - 585.5f, 586.5f, 587.5f, 588.5f, 589.5f, - 590.5f, 591.5f, 592.5f, 593.5f, 594.5f, - 595.5f, 596.5f, 597.5f, 598.5f, 599.5f" - diff --git a/graphics/AtlantisJava/configuration/rpsplt_hec.csv b/graphics/AtlantisJava/configuration/rpsplt_hec.csv deleted file mode 100644 index 0b1285de75ed..000000000000 --- a/graphics/AtlantisJava/configuration/rpsplt_hec.csv +++ /dev/null @@ -1,329 +0,0 @@ -# Real Pulse Shape Plots Lookup Table values for HEC calorimeter - - -# HEC lookup table, amplitude values -HEC_AMPLITUDE -"0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0.000101187f, 0.00664058f, 0.00527695f, 0.0002041f, -0.000215028f, 0.000293915f, 0.000490323f, 0.000903528f, 0.00170435f, -0.00314031f, 0.00552285f, 0.00920343f, 0.0145539f, 0.0219273f, -0.0316359f, 0.043942f, 0.059033f, 0.0770143f, 0.0978915f, -0.121549f, 0.147763f, 0.17623f, 0.206609f, 0.238601f, -0.272f, 0.306696f, 0.342649f, 0.379813f, 0.418056f, -0.457117f, 0.496607f, 0.536044f, 0.57493f, 0.612812f, -0.649334f, 0.684243f, 0.717392f, 0.748708f, 0.778165f, -0.805768f, 0.831539f, 0.85551f, 0.877704f, 0.898131f, -0.916774f, 0.933594f, 0.948547f, 0.961595f, 0.972719f, -0.98191f, 0.989184f, 0.994564f, 0.998103f, 0.99988f, -1f, 0.998581f, 0.995722f, 0.991483f, 0.985877f, -0.978879f, 0.970462f, 0.960624f, 0.949425f, 0.936981f, -0.92346f, 0.909059f, 0.893975f, 0.878385f, 0.862425f, -0.846174f, 0.829654f, 0.812831f, 0.795626f, 0.777953f, -0.759737f, 0.740952f, 0.721636f, 0.701896f, 0.681887f, -0.661787f, 0.64177f, 0.621975f, 0.602503f, 0.583422f, -0.564766f, 0.54655f, 0.528765f, 0.511376f, 0.494318f, -0.477505f, 0.460853f, 0.444298f, 0.427826f, 0.411478f, -0.395336f, 0.379494f, 0.364017f, 0.348923f, 0.334176f, -0.319715f, 0.305481f, 0.291443f, 0.277605f, 0.263994f, -0.250654f, 0.237625f, 0.224942f, 0.21263f, 0.200696f, -0.189132f, 0.177913f, 0.166995f, 0.156325f, 0.145848f, -0.135522f, 0.125326f, 0.115279f, 0.105427f, 0.0958465f, -0.0866154f, 0.0777954f, 0.0694189f, 0.0614767f, 0.0539207f, -0.0466707f, 0.0396293f, 0.0327093f, 0.0258526f, 0.0190475f, -0.0123301f, 0.00576636f, -0.000577978f, -0.00665906f, -0.0124708f, --0.0180326f, -0.023372f, -0.0285029f, -0.0334147f, -0.0380814f, --0.0424744f, -0.0465814f, -0.0504199f, -0.0540364f, -0.0574984f, --0.060883f, -0.0642531f, -0.06764f, -0.0710355f, -0.0743926f, --0.0776445f, -0.0807294f, -0.0836115f, -0.0862943f, -0.0888135f, --0.091227f, -0.0935885f, -0.0959315f, -0.0982592f, -0.100547f, --0.102752f, -0.104836f, -0.106781f, -0.108595f, -0.110316f, --0.112001f, -0.113707f, -0.115471f, -0.117302f, -0.119178f, --0.121058f, -0.122894f, -0.124646f, -0.126288f, -0.127819f, --0.129262f, -0.130658f, -0.132056f, -0.133495f, -0.134988f, --0.136514f, -0.138027f, -0.139477f, -0.140829f, -0.142082f, --0.143263f, -0.144417f, -0.145579f, -0.146758f, -0.147944f, --0.149106f, -0.150203f, -0.151199f, -0.152063f, -0.152785f, --0.153383f, -0.153917f, -0.154483f, -0.155185f, -0.156098f, --0.157233f, -0.158526f, -0.159851f, -0.161065f, -0.162059f, --0.162781f, -0.163253f, -0.163543f, -0.163732f, -0.163889f, --0.164059f, -0.164269f, -0.164541f, -0.1649f, -0.165369f, --0.165963f, -0.166671f, -0.167457f, -0.168261f, -0.169021f, --0.169687f, -0.170237f, -0.170686f, -0.171074f, -0.171449f, --0.171844f, -0.172271f, -0.172716f, -0.173152f, -0.173545f, --0.173864f, -0.174091f, -0.174214f, -0.174244f, -0.174208f, --0.174145f, -0.174091f, -0.174075f, -0.174109f, -0.174199f, --0.174347f, -0.174556f, -0.174822f, -0.175124f, -0.175427f, --0.175685f, -0.175868f, -0.175971f, -0.176023f, -0.17607f, --0.17616f, -0.176313f, -0.176514f, -0.176721f, -0.176879f, --0.176951f, -0.176934f, -0.176855f, -0.17676f, -0.176689f, --0.176655f, -0.176648f, -0.176647f, -0.176639f, -0.176628f, --0.176632f, -0.176673f, -0.176754f, -0.176855f, -0.176936f, --0.176952f, -0.176875f, -0.176706f, -0.17647f, -0.176211f, --0.175972f, -0.175794f, -0.175711f, -0.175755f, -0.175946f, --0.176285f, -0.176742f, -0.177258f, -0.177757f, -0.17817f, --0.17845f, -0.178579f, -0.178566f, -0.178437f, -0.178227f, --0.177974f, -0.177712f, -0.177464f, -0.177238f, -0.177031f, --0.176835f, -0.176652f, -0.176495f, -0.176386f, -0.176349f, --0.176395f, -0.176518f, -0.176694f, -0.176894f, -0.177086f, --0.177248f, -0.177368f, -0.177442f, -0.177475f, -0.177466f, --0.177409f, -0.177287f, -0.177085f, -0.176805f, -0.176481f, --0.176177f, -0.175968f, -0.175917f, -0.176041f, -0.176305f, --0.176639f, -0.176956f, -0.177192f, -0.177313f, -0.177318f, --0.17723f, -0.177084f, -0.176912f, -0.176746f, -0.176605f, --0.176497f, -0.176412f, -0.176339f, -0.176273f, -0.176226f, --0.176224f, -0.176294f, -0.176444f, -0.176653f, -0.176876f, --0.177061f, -0.17717f, -0.177187f, -0.177116f, -0.176969f, --0.17676f, -0.176495f, -0.176185f, -0.175846f, -0.175501f, --0.175181f, -0.174914f, -0.174722f, -0.174603f, -0.174535f, --0.174484f, -0.174419f, -0.174334f, -0.174257f, -0.174241f, --0.174339f, -0.174568f, -0.174897f, -0.175247f, -0.175527f, --0.175668f, -0.175649f, -0.175504f, -0.175302f, -0.175115f, --0.17499f, -0.174941f, -0.174946f, -0.174966f, -0.174962f, --0.174908f, -0.174796f, -0.174638f, -0.174464f, -0.174308f, --0.174196f, -0.174135f, -0.174112f, -0.174105f, -0.174099f, --0.1741f, -0.174129f, -0.174211f, -0.174347f, -0.174508f, --0.174639f, -0.174693f, -0.174653f, -0.174547f, -0.17444f, --0.174397f, -0.17446f, -0.174621f, -0.174834f, -0.175026f, --0.175129f, -0.175111f, -0.174973f, -0.174755f, -0.174506f, --0.174263f, -0.174042f, -0.173832f, -0.173617f, -0.173383f, --0.173135f, -0.172888f, -0.172667f, -0.172506f, -0.172432f, --0.172467f, -0.172611f, -0.172834f, -0.173088f, -0.173314f, --0.173464f, -0.173523f, -0.173511f, -0.173469f, -0.17344f, --0.173454f, -0.173512f, -0.173588f, -0.173645f, -0.173641f, --0.173557f, -0.173396f, -0.173188f, -0.172974f, -0.172789f, --0.172649f, -0.172556f, -0.172492f, -0.17244f, -0.172391f, --0.172346f, -0.17231f, -0.172284f, -0.172267f, -0.172255f, --0.172249f, -0.172253f, -0.172273f, -0.17231f, -0.172352f, --0.172388f, -0.172401f, -0.172379f, -0.172311f, -0.172176f, --0.171942f, -0.171573f, -0.17104f, -0.17034f, -0.169499f, --0.168562f, -0.16757f, -0.166543f, -0.165477f, -0.164352f, --0.163143f, -0.161835f, -0.160427f, -0.158922f, -0.157329f, --0.155643f, -0.153858f, -0.15196f, -0.149937f, -0.147782f, --0.145494f, -0.143082f, -0.14057f, -0.137992f, -0.135393f, --0.132824f, -0.130331f, -0.127944f, -0.12568f, -0.123532f, --0.121472f, -0.119454f, -0.117412f, -0.115278f, -0.112998f, --0.110548f, -0.107945f, -0.105239f, -0.102501f, -0.0997942f, --0.0971684f, -0.0946474f, -0.0922345f, -0.0899178f, -0.087684f, --0.0855244f, -0.0834364f, -0.0814211f, -0.0794707f, -0.0775634f, --0.0756617f, -0.0737202f, -0.0717019f, -0.0695945f, -0.0674152f, --0.0652053f, -0.0630127f, -0.0608754f, -0.0588116f, -0.056822f, --0.0549011f, -0.0530426f, -0.0512422f, -0.049497f, -0.0478024f, --0.0461557f, -0.0445622f, -0.0430403f, -0.0416186f, -0.0403259f, --0.0391799f, -0.0381777f, -0.0372926f, -0.0364776f, -0.0356725f, --0.0348179f, -0.0338654f, -0.0327897f, -0.0315966f, -0.0303215f, --0.0290217f, -0.0277614f, -0.0265938f, -0.0255459f, -0.0246139f, --0.0237676f, -0.0229666f, -0.0221815f, -0.0214062f, -0.0206548f, --0.0199489f, -0.0192999f, -0.0186995f, -0.0181225f, -0.0175376f, --0.0169217f, -0.0162671f, -0.015582f, -0.0148865f, -0.0142068f, --0.013571f, -0.0130013f, -0.0125088f, -0.0120878f, -0.0117106f, --0.0113307f, -0.010896f, -0.0103706f, -0.00975524f, -0.00909709f, --0.00847957f, -0.00799095f, -0.00768947f, -0.00757594f, -0.00759465f, --0.007658f, -0.00768306f, -0.00761927f, -0.00745677f, -0.00721301f, --0.0069087f, -0.00655204f, -0.00613803f, -0.00565728f, -0.0051098f, --0.00451485f, -0.00390879f, -0.00333665f, -0.00284016f, -0.00244591f, --0.00216087f, -0.00197292f, -0.00185468f, -0.00177376f, -0.0017025f, --0.00162463f, -0.00153632f, -0.00144381f, -0.00135502f, -0.00127151f, --0.00118363f, -0.00107486f, -0.000933489f, -0.000765153f, -0.000595878f, --0.000462136f, -0.000391149f, -0.000381636f, -0.00039948f, -0.000392457f, --0.00031506f, -0.000148614f, 9.0048e-05f, 0.00035786f, 0.000604245f, -0.000786303f, 0.000878787f, 0.000875978f, 0.000791694f, 0.000657695f, -0.00051893f, 0.000425818f, 0.000426074f, 0.000551054f, 0.000806885f, -0.00117476f, 0.00161695f, 0.00208652f, 0.00253376f, 0.00290882f, -0.00316028f, 0.00323814f, 0.00310475f, 0.00275044f, 0.00220837f, -0.00155712f, 0.000907431f, 0.000374364f, 4.94567e-05f, -2.10426e-05f, -0.000152468f, 0.000507839f, 0.000947469f, 0.00136192f, 0.00165448f, -0.00176273f, 0.00167267f, 0.00141913f, 0.00107273f, 0.000722145f, -0.000454802f, 0.000340469f, 0.000418315f, 0.000688105f, 0.00110894f, -0.00160413f, 0.00207832f, 0.00244585f, 0.00265788f, 0.0027142f, -0.00265461f, 0.00253537f, 0.00240031f, 0.00226566f, 0.00212575f, -0.00197065f, 0.00180602f, 0.00166146f, 0.00158237f, 0.00160939f, -0.00175419f, 0.00198981f, 0.00225835f, 0.00249251f, 0.00264239f, -0.00268974f, 0.00264634f, 0.00253697f, 0.00238428f, 0.00220657f, -0.00202457f, 0.00187327f, 0.00179975f, 0.00184459f, 0.00201759f, -0.00228424f, 0.00257413f, 0.00280859f, 0.00293672f, 0.00295574f, -0.00290479f, 0.0028433f, 0.00282479f, 0.00288132f, 0.00302619f, -0.00326351f, 0.00359044f, 0.00398678f, 0.00440043f, 0.00474437f, -0.00491837f, 0.00484987f, 0.00453341f, 0.00404398f, 0.00351183f, -0.00306889f, 0.00279655f, 0.00270115f, 0.0027279f, 0.00280162f, -0.00286887f, 0.00291904f, 0.00297615f, 0.00307301f, 0.00322684f, -0.00343021f, 0.00365863f, 0.003885f, 0.00409031f, 0.00426691f, -0.00441451f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f, -0f, 0f, 0f, 0f, 0f" - - -# HEC lookup table, time values -HEC_TIME -"0f, 1.03959f, 2.07917f, 3.11876f, 4.15835f, -5.19794f, 6.23752f, 7.27711f, 8.3167f, 9.35629f, -10.3959f, 11.4355f, 12.475f, 13.5146f, 14.5542f, -15.5938f, 16.6334f, 17.673f, 18.7126f, 19.7522f, -20.7917f, 21.8313f, 22.8709f, 23.9105f, 24.9501f, -25.9897f, 27.0293f, 28.0689f, 29.1084f, 30.148f, -31.1876f, 32.2272f, 33.2668f, 34.3064f, 35.346f, -36.3856f, 37.4251f, 38.4647f, 39.5043f, 40.5439f, -41.5835f, 42.6231f, 43.6627f, 44.7023f, 45.7418f, -46.7814f, 47.821f, 48.8606f, 49.9002f, 50.9398f, -51.9794f, 53.019f, 54.0585f, 55.0981f, 56.1377f, -57.1773f, 58.2169f, 59.2565f, 60.2961f, 61.3357f, -62.3752f, 63.4148f, 64.4544f, 65.494f, 66.5336f, -67.5732f, 68.6128f, 69.6524f, 70.6919f, 71.7315f, -72.7711f, 73.8107f, 74.8503f, 75.8899f, 76.9295f, -77.9691f, 79.0086f, 80.0482f, 81.0878f, 82.1274f, -83.167f, 84.2066f, 85.2462f, 86.2858f, 87.3253f, -88.3649f, 89.4045f, 90.4441f, 91.4837f, 92.5233f, -93.5629f, 94.6025f, 95.642f, 96.6816f, 97.7212f, -98.7608f, 99.8004f, 100.84f, 101.88f, 102.919f, -103.959f, 104.998f, 106.038f, 107.078f, 108.117f, -109.157f, 110.196f, 111.236f, 112.275f, 113.315f, -114.355f, 115.394f, 116.434f, 117.473f, 118.513f, -119.553f, 120.592f, 121.632f, 122.671f, 123.711f, -124.75f, 125.79f, 126.83f, 127.869f, 128.909f, -129.948f, 130.988f, 132.028f, 133.067f, 134.107f, -135.146f, 136.186f, 137.226f, 138.265f, 139.305f, -140.344f, 141.384f, 142.423f, 143.463f, 144.503f, -145.542f, 146.582f, 147.621f, 148.661f, 149.701f, -150.74f, 151.78f, 152.819f, 153.859f, 154.899f, -155.938f, 156.978f, 158.017f, 159.057f, 160.096f, -161.136f, 162.176f, 163.215f, 164.255f, 165.294f, -166.334f, 167.374f, 168.413f, 169.453f, 170.492f, -171.532f, 172.572f, 173.611f, 174.651f, 175.69f, -176.73f, 177.769f, 178.809f, 179.849f, 180.888f, -181.928f, 182.967f, 184.007f, 185.047f, 186.086f, -187.126f, 188.165f, 189.205f, 190.245f, 191.284f, -192.324f, 193.363f, 194.403f, 195.442f, 196.482f, -197.522f, 198.561f, 199.601f, 200.64f, 201.68f, -202.72f, 203.759f, 204.799f, 205.838f, 206.878f, -207.917f, 208.957f, 209.997f, 211.036f, 212.076f, -213.115f, 214.155f, 215.195f, 216.234f, 217.274f, -218.313f, 219.353f, 220.393f, 221.432f, 222.472f, -223.511f, 224.551f, 225.59f, 226.63f, 227.67f, -228.709f, 229.749f, 230.788f, 231.828f, 232.868f, -233.907f, 234.947f, 235.986f, 237.026f, 238.066f, -239.105f, 240.145f, 241.184f, 242.224f, 243.263f, -244.303f, 245.343f, 246.382f, 247.422f, 248.461f, -249.501f, 250.541f, 251.58f, 252.62f, 253.659f, -254.699f, 255.739f, 256.778f, 257.818f, 258.857f, -259.897f, 260.936f, 261.976f, 263.016f, 264.055f, -265.095f, 266.134f, 267.174f, 268.214f, 269.253f, -270.293f, 271.332f, 272.372f, 273.412f, 274.451f, -275.491f, 276.53f, 277.57f, 278.609f, 279.649f, -280.689f, 281.728f, 282.768f, 283.807f, 284.847f, -285.887f, 286.926f, 287.966f, 289.005f, 290.045f, -291.084f, 292.124f, 293.164f, 294.203f, 295.243f, -296.282f, 297.322f, 298.362f, 299.401f, 300.441f, -301.48f, 302.52f, 303.56f, 304.599f, 305.639f, -306.678f, 307.718f, 308.757f, 309.797f, 310.837f, -311.876f, 312.916f, 313.955f, 314.995f, 316.035f, -317.074f, 318.114f, 319.153f, 320.193f, 321.233f, -322.272f, 323.312f, 324.351f, 325.391f, 326.43f, -327.47f, 328.51f, 329.549f, 330.589f, 331.628f, -332.668f, 333.708f, 334.747f, 335.787f, 336.826f, -337.866f, 338.906f, 339.945f, 340.985f, 342.024f, -343.064f, 344.103f, 345.143f, 346.183f, 347.222f, -348.262f, 349.301f, 350.341f, 351.381f, 352.42f, -353.46f, 354.499f, 355.539f, 356.579f, 357.618f, -358.658f, 359.697f, 360.737f, 361.776f, 362.816f, -363.856f, 364.895f, 365.935f, 366.974f, 368.014f, -369.054f, 370.093f, 371.133f, 372.172f, 373.212f, -374.251f, 375.291f, 376.331f, 377.37f, 378.41f, -379.449f, 380.489f, 381.529f, 382.568f, 383.608f, -384.647f, 385.687f, 386.727f, 387.766f, 388.806f, -389.845f, 390.885f, 391.924f, 392.964f, 394.004f, -395.043f, 396.083f, 397.122f, 398.162f, 399.202f, -400.241f, 401.281f, 402.32f, 403.36f, 404.4f, -405.439f, 406.479f, 407.518f, 408.558f, 409.597f, -410.637f, 411.677f, 412.716f, 413.756f, 414.795f, -415.835f, 416.875f, 417.914f, 418.954f, 419.993f, -421.033f, 422.073f, 423.112f, 424.152f, 425.191f, -426.231f, 427.27f, 428.31f, 429.35f, 430.389f, -431.429f, 432.468f, 433.508f, 434.548f, 435.587f, -436.627f, 437.666f, 438.706f, 439.746f, 440.785f, -441.825f, 442.864f, 443.904f, 444.943f, 445.983f, -447.023f, 448.062f, 449.102f, 450.141f, 451.181f, -452.221f, 453.26f, 454.3f, 455.339f, 456.379f, -457.418f, 458.458f, 459.498f, 460.537f, 461.577f, -462.616f, 463.656f, 464.696f, 465.735f, 466.775f, -467.814f, 468.854f, 469.894f, 470.933f, 471.973f, -473.012f, 474.052f, 475.091f, 476.131f, 477.171f, -478.21f, 479.25f, 480.289f, 481.329f, 482.369f, -483.408f, 484.448f, 485.487f, 486.527f, 487.567f, -488.606f, 489.646f, 490.685f, 491.725f, 492.764f, -493.804f, 494.844f, 495.883f, 496.923f, 497.962f, -499.002f, 500.042f, 501.081f, 502.121f, 503.16f, -504.2f, 505.24f, 506.279f, 507.319f, 508.358f, -509.398f, 510.437f, 511.477f, 512.517f, 513.556f, -514.596f, 515.635f, 516.675f, 517.715f, 518.754f, -519.794f, 520.833f, 521.873f, 522.913f, 523.952f, -524.992f, 526.031f, 527.071f, 528.11f, 529.15f, -530.19f, 531.229f, 532.269f, 533.308f, 534.348f, -535.388f, 536.427f, 537.467f, 538.506f, 539.546f, -540.585f, 541.625f, 542.665f, 543.704f, 544.744f, -545.783f, 546.823f, 547.863f, 548.902f, 549.942f, -550.981f, 552.021f, 553.061f, 554.1f, 555.14f, -556.179f, 557.219f, 558.258f, 559.298f, 560.338f, -561.377f, 562.417f, 563.456f, 564.496f, 565.536f, -566.575f, 567.615f, 568.654f, 569.694f, 570.734f, -571.773f, 572.813f, 573.852f, 574.892f, 575.931f, -576.971f, 578.011f, 579.05f, 580.09f, 581.129f, -582.169f, 583.209f, 584.248f, 585.288f, 586.327f, -587.367f, 588.407f, 589.446f, 590.486f, 591.525f, -592.565f, 593.604f, 594.644f, 595.684f, 596.723f, -597.763f, 598.802f, 599.842f, 600.882f, 601.921f, -602.961f, 604f, 605.04f, 606.08f, 607.119f, -608.159f, 609.198f, 610.238f, 611.277f, 612.317f, -613.357f, 614.396f, 615.436f, 616.475f, 617.515f, -618.555f, 619.594f, 620.634f, 621.673f, 622.713f, -623.752f, 624.792f, 625.832f, 626.871f, 627.911f, -628.95f, 629.99f, 631.03f, 632.069f, 633.109f, -634.148f, 635.188f, 636.228f, 637.267f, 638.307f, -639.346f, 640.386f, 641.425f, 642.465f, 643.505f, -644.544f, 645.584f, 646.623f, 647.663f, 648.703f, -649.742f, 650.782f, 651.821f, 652.861f, 653.901f, -654.94f, 655.98f, 657.019f, 658.059f, 659.098f, -660.138f, 661.178f, 662.217f, 663.257f, 664.296f, -665.336f, 666.376f, 667.415f, 668.455f, 669.494f, -670.534f, 671.574f, 672.613f, 673.653f, 674.692f, -675.732f, 676.771f, 677.811f, 678.851f, 679.89f, -680.93f, 681.969f, 683.009f, 684.049f, 685.088f, -686.128f, 687.167f, 688.207f, 689.247f, 690.286f, -691.326f, 692.365f, 693.405f, 694.444f, 695.484f, -696.524f, 697.563f, 698.603f, 699.642f, 700.682f, -701.722f, 702.761f, 703.801f, 704.84f, 705.88f, -706.919f, 707.959f, 708.999f, 710.038f, 711.078f, -712.117f, 713.157f, 714.197f, 715.236f, 716.276f, -717.315f, 718.355f, 719.395f, 720.434f, 721.474f, -722.513f, 723.553f, 724.592f, 725.632f, 726.672f, -727.711f, 728.751f, 729.79f, 730.83f, 731.87f, -732.909f, 733.949f, 734.988f, 736.028f, 737.068f, -738.107f, 739.147f, 740.186f, 741.226f, 742.265f, -743.305f, 744.345f, 745.384f, 746.424f, 747.463f, -748.503f, 749.543f, 750.582f, 751.622f, 752.661f, -753.701f, 754.741f, 755.78f, 756.82f, 757.859f, -758.899f, 759.938f, 760.978f, 762.018f, 763.057f, -764.097f, 765.136f, 766.176f, 767.216f, 768.255f, -769.295f, 770.334f, 771.374f, 772.414f, 773.453f, -774.493f, 775.532f, 776.572f, 777.611f, 778.651f, -779.691f, 780.73f, 781.77f, 782.809f, 783.849f, -784.889f, 785.928f, 786.968f, 788.007f, 789.047f, -790.086f, 791.126f, 792.166f, 793.205f, 794.245f, -795.284f, 796.324f, 797.364f, 798.403f, 799.443f, -800.482f, 801.522f, 802.562f, 803.601f, 804.641f, -805.68f, 806.72f, 807.759f, 808.799f, 809.839f, -810.878f, 811.918f, 812.957f, 813.997f, 815.037f, -816.076f, 817.116f, 818.155f, 819.195f, 820.235f, -821.274f, 822.314f, 823.353f, 824.393f, 825.432f, -826.472f, 827.512f, 828.551f, 829.591f, 830.63f" diff --git a/graphics/AtlantisJava/configuration/rpsplt_tile.csv b/graphics/AtlantisJava/configuration/rpsplt_tile.csv deleted file mode 100644 index 213666c43c9f..000000000000 --- a/graphics/AtlantisJava/configuration/rpsplt_tile.csv +++ /dev/null @@ -1,169 +0,0 @@ -# Real Pulse Shape Plots Lookup Table values for TILE calorimeter - -# TILE, time values -TILE_TIME -"-75.5f, -75f, -74.5f, -74f, -73.5f, --73f, -72.5f, -72f, -71.5f, -71f, --70.5f, -70f, -69.5f, -69f, -68.5f, --68f, -67.5f, -67f, -66.5f, -66f, --65.5f, -65f, -64.5f, -64f, -63.5f, --63f, -62.5f, -62f, -61.5f, -61f, --60.5f, -60f, -59.5f, -59f, -58.5f, --58f, -57.5f, -57f, -56.5f, -56f, --55.5f, -55f, -54.5f, -54f, -53.5f, --53f, -52.5f, -52f, -51.5f, -51f, --50.5f, -50f, -49.5f, -49f, -48.5f, --48f, -47.5f, -47f, -46.5f, -46f, --45.5f, -45f, -44.5f, -44f, -43.5f, --43f, -42.5f, -42f, -41.5f, -41f, --40.5f, -40f, -39.5f, -39f, -38.5f, --38f, -37.5f, -37f, -36.5f, -36f, --35.5f, -35f, -34.5f, -34f, -33.5f, --33f, -32.5f, -32f, -31.5f, -31f, --30.5f, -30f, -29.5f, -29f, -28.5f, --28f, -27.5f, -27f, -26.5f, -26f, --25.5f, -25f, -24.5f, -24f, -23.5f, --23f, -22.5f, -22f, -21.5f, -21f, --20.5f, -20f, -19.5f, -19f, -18.5f, --18f, -17.5f, -17f, -16.5f, -16f, --15.5f, -15f, -14.5f, -14f, -13.5f, --13f, -12.5f, -12f, -11.5f, -11f, --10.5f, -10f, -9.5f, -9f, -8.5f, --8f, -7.5f, -7f, -6.5f, -6f, --5.5f, -5f, -4.5f, -4f, -3.5f, --3f, -2.5f, -2f, -1.5f, -1f, --0.5f, 0f, 0.5f, 1f, 1.5f, -2f, 2.5f, 3f, 3.5f, 4f, -4.5f, 5f, 5.5f, 6f, 6.5f, -7f, 7.5f, 8f, 8.5f, 9f, -9.5f, 10f, 10.5f, 11f, 11.5f, -12f, 12.5f, 13f, 13.5f, 14f, -14.5f, 15f, 15.5f, 16f, 16.5f, -17f, 17.5f, 18f, 18.5f, 19f, -19.5f, 20f, 20.5f, 21f, 21.5f, -22f, 22.5f, 23f, 23.5f, 24f, -24.5f, 25f, 25.5f, 26f, 26.5f, -27f, 27.5f, 28f, 28.5f, 29f, -29.5f, 30f, 30.5f, 31f, 31.5f, -32f, 32.5f, 33f, 33.5f, 34f, -34.5f, 35f, 35.5f, 36f, 36.5f, -37f, 37.5f, 38f, 38.5f, 39f, -39.5f, 40f, 40.5f, 41f, 41.5f, -42f, 42.5f, 43f, 43.5f, 44f, -44.5f, 45f, 45.5f, 46f, 46.5f, -47f, 47.5f, 48f, 48.5f, 49f, -49.5f, 50f, 50.5f, 51f, 51.5f, -52f, 52.5f, 53f, 53.5f, 54f, -54.5f, 55f, 55.5f, 56f, 56.5f, -57f, 57.5f, 58f, 58.5f, 59f, -59.5f, 60f, 60.5f, 61f, 61.5f, -62f, 62.5f, 63f, 63.5f, 64f, -64.5f, 65f, 65.5f, 66f, 66.5f, -67f, 67.5f, 68f, 68.5f, 69f, -69.5f, 70f, 70.5f, 71f, 71.5f, -72f, 72.5f, 73f, 73.5f, 74f, -74.5f, 75f, 75.5f, 76f, 76.5f, -77f, 77.5f, 78f, 78.5f, 79f, -79.5f, 80f, 80.5f, 81f, 81.5f, -82f, 82.5f, 83f, 83.5f, 84f, -84.5f, 85f, 85.5f, 86f, 86.5f, -87f, 87.5f, 88f, 88.5f, 89f, -89.5f, 90f, 90.5f, 91f, 91.5f, -92f, 92.5f, 93f, 93.5f, 94f, -94.5f, 95f, 95.5f, 96f, 96.5f, -97f, 97.5f, 98f, 98.5f, 99f, -99.5f, 100f, 100.5f, 101f, 101.5f, -102f, 102.5f, 103f, 103.5f, 104f, -104.5f, 105f, 105.5f, 106f, 106.5f, -107f, 107.5f, 108f, 108.5f, 109f, -109.5f, 110f, 110.5f, 111f, 111.5f, -112f, 112.5f, 113f, 113.5f, 114f, -114.5f, 115f, 115.5f, 116f, 116.5f, -117f, 117.5f, 118f, 118.5f, 119f, -119.5f, 120f, 120.5f, 121f, 121.5f, -122f, 122.5f, 123f, 123.5f, 124f, -124.5f" - -# TILE, amplitude values -TILE_AMPLITUDE -"0f, 2.304e-05f, 5.178e-05f, 8.592e-05f, 0.00012515f, -0.00016918f, 0.0002177f, 0.00027043f, 0.00032705f, 0.00038728f, -0.00045081f, 0.00051733f, 0.00058656f, 0.00065819f, 0.00073193f, -0.00080746f, 0.0008845f, 0.00096275f, 0.0010419f, 0.00112166f, -0.00120172f, 0.00128179f, 0.00136157f, 0.00144076f, 0.00151905f, -0.00159642f, 0.0016754f, 0.00176001f, 0.00185428f, 0.00196225f, -0.00208795f, 0.00223542f, 0.00240868f, 0.00261177f, 0.00284873f, -0.00312358f, 0.00344037f, 0.00380312f, 0.00421586f, 0.00468264f, -0.00520748f, 0.00579479f, 0.00645263f, 0.00719117f, 0.00802059f, -0.00895106f, 0.00999278f, 0.0111559f, 0.0124507f, 0.0138872f, -0.0154757f, 0.0172264f, 0.0191494f, 0.0212549f, 0.0235531f, -0.0260541f, 0.0287667f, 0.0316991f, 0.0348593f, 0.0382556f, -0.041896f, 0.0457887f, 0.0499419f, 0.0543637f, 0.0590621f, -0.0640455f, 0.0693218f, 0.0748993f, 0.0807861f, 0.0869903f, -0.09352f, 0.100383f, 0.107581f, 0.115115f, 0.122983f, -0.131184f, 0.139719f, 0.148586f, 0.157786f, 0.167316f, -0.177177f, 0.187369f, 0.19789f, 0.208739f, 0.219917f, -0.231423f, 0.243248f, 0.255385f, 0.267822f, 0.28055f, -0.29356f, 0.306842f, 0.320385f, 0.334181f, 0.348219f, -0.362489f, 0.376982f, 0.391688f, 0.406597f, 0.421699f, -0.436986f, 0.452445f, 0.46806f, 0.483808f, 0.499668f, -0.515617f, 0.531635f, 0.547698f, 0.563786f, 0.579876f, -0.595946f, 0.611975f, 0.62794f, 0.64382f, 0.659592f, -0.675236f, 0.69073f, 0.706053f, 0.721186f, 0.736109f, -0.7508f, 0.76524f, 0.779408f, 0.793285f, 0.806849f, -0.82008f, 0.832959f, 0.845464f, 0.857576f, 0.869274f, -0.880538f, 0.891349f, 0.901693f, 0.911564f, 0.920954f, -0.929854f, 0.938257f, 0.946156f, 0.953541f, 0.960406f, -0.966742f, 0.972542f, 0.977798f, 0.982501f, 0.986645f, -0.990222f, 0.993234f, 0.995685f, 0.997581f, 0.998929f, -0.999733f, 1f, 0.999735f, 0.998944f, 0.997632f, -0.995806f, 0.99347f, 0.99063f, 0.987293f, 0.983464f, -0.979148f, 0.974352f, 0.969089f, 0.963376f, 0.957231f, -0.95067f, 0.943711f, 0.936371f, 0.928666f, 0.920615f, -0.912235f, 0.903542f, 0.894553f, 0.885287f, 0.875759f, -0.865988f, 0.855985f, 0.845763f, 0.835332f, 0.824704f, -0.81389f, 0.8029f, 0.791746f, 0.780439f, 0.768991f, -0.757412f, 0.745713f, 0.733906f, 0.722002f, 0.710012f, -0.697947f, 0.685818f, 0.673635f, 0.66141f, 0.649153f, -0.636873f, 0.624581f, 0.612288f, 0.600004f, 0.587739f, -0.575503f, 0.563307f, 0.551161f, 0.539076f, 0.527062f, -0.515129f, 0.503286f, 0.491542f, 0.479906f, 0.468386f, -0.456991f, 0.445729f, 0.434609f, 0.42364f, 0.412831f, -0.402189f, 0.391724f, 0.381444f, 0.371358f, 0.361474f, -0.351802f, 0.342348f, 0.333115f, 0.3241f, 0.315301f, -0.306715f, 0.298339f, 0.290172f, 0.282211f, 0.274453f, -0.266897f, 0.259539f, 0.252377f, 0.245409f, 0.238632f, -0.232044f, 0.225642f, 0.219421f, 0.213379f, 0.207511f, -0.201813f, 0.196283f, 0.190915f, 0.185707f, 0.180655f, -0.175755f, 0.171003f, 0.166395f, 0.161928f, 0.157598f, -0.153402f, 0.149335f, 0.145394f, 0.141575f, 0.137874f, -0.134288f, 0.130813f, 0.127445f, 0.12418f, 0.121015f, -0.117947f, 0.11497f, 0.112082f, 0.109278f, 0.106556f, -0.103911f, 0.10134f, 0.0988427f, 0.0964156f, 0.0940569f, -0.0917646f, 0.0895367f, 0.0873709f, 0.0852652f, 0.0832176f, -0.0812259f, 0.0792881f, 0.0774021f, 0.0755657f, 0.0737769f, -0.0720337f, 0.0703338f, 0.0686753f, 0.0670561f, 0.065474f, -0.0639269f, 0.0624129f, 0.0609298f, 0.0594755f, 0.0580479f, -0.0566449f, 0.0552645f, 0.0539046f, 0.052563f, 0.0512377f, -0.0499268f, 0.0486296f, 0.0473466f, 0.0460778f, 0.0448235f, -0.0435841f, 0.0423598f, 0.0411508f, 0.0399573f, 0.0387798f, -0.0376183f, 0.0364732f, 0.0353447f, 0.0342331f, 0.0331386f, -0.0320615f, 0.0310021f, 0.0299605f, 0.0289372f, 0.0279322f, -0.0269459f, 0.0259786f, 0.0250305f, 0.0241018f, 0.0231928f, -0.0223038f, 0.021435f, 0.0205867f, 0.0197591f, 0.0189525f, -0.0181671f, 0.017403f, 0.01666f, 0.0159379f, 0.0152367f, -0.0145562f, 0.0138962f, 0.0132567f, 0.0126374f, 0.0120383f, -0.0114592f, 0.0109f, 0.0103606f, 0.00984081f, 0.00934049f, -0.00885952f, 0.00839776f, 0.00795509f, 0.00753137f, 0.00712647f, -0.00674024f, 0.00637256f, 0.0060233f, 0.00569231f, 0.00537947f, -0.00508463f, 0.00480767f, 0.00454845f, 0.00430684f, 0.0040827f, -0.00387587f, 0.00368583f, 0.00351191f, 0.00335339f, 0.0032096f, -0.00307982f, 0.00296336f, 0.00285953f, 0.00276764f, 0.00268698f, -0.00261686f, 0.00255658f, 0.00250545f, 0.00246277f, 0.00242785f, -0.00239998f, 0.00237849f, 0.00236265f, 0.00235179f, 0.00234521f, -0.0023422f, 0.00234208f, 0.00234415f, 0.0023477f, 0.00235206f, -0.00235651f, 0.00236036f, 0.00236293f, 0.0023635f, 0.00236139f, -0.00235594f, 0.00234693f, 0.00233436f, 0.00231825f, 0.00229862f, -0.00227549f, 0.00224886f, 0.00221876f, 0.0021852f, 0.00214819f, -0.00210775f, 0.0020639f, 0.00201666f, 0.00196603f, 0.00191204f, -0.0018547f" diff --git a/graphics/AtlantisJava/events/event.dtd b/graphics/AtlantisJava/events/event.dtd deleted file mode 100755 index e9937b30976e..000000000000 --- a/graphics/AtlantisJava/events/event.dtd +++ /dev/null @@ -1,506 +0,0 @@ -<!-- -kine element is alias to barcode resp. to new-style truth association - using barcodes + numBarcodes (1 hits - to more tracks) at hits - (2006/08), kine should be removed completely on turn 2006/2007 ---> - -<!ENTITY % string.Type "CDATA"> - -<!ENTITY % eventAttributes - "version %string.Type; #IMPLIED - runNumber %string.Type; #IMPLIED - eventNumber %string.Type; #IMPLIED - dateTime %string.Type; #IMPLIED - lumiBlock %string.Type; #IMPLIED - eventProperties %string.Type; #IMPLIED"> - - -<!ELEMENT Event - (BJet|CaloETMis|Cluster|CompositeParticle|CSC|CSCD|Electron|EmTauROI| - ETMis|FCAL|HEC|IDScan|iPat|Jet|JetROI|LAr|LVL1JetElement|LVL1Result| - LVL1TriggerTower|MBTS|MDT|MSeg|Muon|MuonETMis|MuonROI|ParticleJet| - Photon|PixelRDO|RMTr|RPC|RTr|RVx|S3D|SCTRDO|Segment|SiHit|SMTr|STC|STr| - TauJet|TGC|TILE|Track|TrigS3D|TriggerInfo|TRT|xKal)+> -<!ATTLIST Event %eventAttributes;> - -<!ENTITY % attributes 'count CDATA "" storeGateKey CDATA ""'> - -<!ENTITY % type 'type (FLOAT|INT|STRING) #FIXED'> -<!ENTITY % unit 'unit (NONE | CM | RAD | GEV)'> -<!ENTITY % integer - ' %type; "INT" - multiple CDATA "1" - %unit; "NONE" '> -<!ENTITY % float - ' %type; "FLOAT" - multiple CDATA "1" - %unit; "NONE" '> -<!ENTITY % string - ' %type; "STRING" - multiple CDATA "1" - %unit; "NONE" '> - -<!ELEMENT BJet (charge|clusterIndex|clusterKey|clusterLinkCount|energy| - eta|label|lhSig|mass|phi|pt|secVtxCount|secVtxFitProb|secVtxMass| - secVtxMult|secVtxRPhiDist|secVtxTagLh|secVtxTagLhErr| - trackIndex|trackKey|trackLinkCount|weight)+> -<!ATTLIST BJet %attributes;> - -<!ELEMENT CaloETMis (et|etx|ety)+> -<!ATTLIST CaloETMis %attributes;> - -<!ELEMENT Cluster (cells|energy|emfrac|et|eta|id|numCells|phi)+> -<!ATTLIST Cluster %attributes;> - -<!ELEMENT CompositeParticle (author|charge|dataType|daughterIndex|daughterKey| - daughterPdgId|eta|label|pdgId|phi|pt|typeEV)+> -<!ATTLIST CompositeParticle %attributes;> - -<!ELEMENT CSC (barcode|hitsFull|id|identifier|kine|length|numHits|sigma| - x|y|z)+> -<!ATTLIST CSC %attributes;> - -<!ELEMENT CSCD (barcode|charge|id|identifier|kine|length|x|y|z)+> -<!ATTLIST CSCD %attributes;> - -<!ELEMENT Electron (author|clusterIndex|clusterKey|clusterLinkCount|dataType| - emWeight|eOverp|et37|eta|etCone|etCone20|etHad1|f1|fracs1| - hasTrack|hitsBLayer|hitsHighThresTRT|hitsPixel|hitsSCT| - hitsTRT|isEM|isEMString|pdgId|phi|pionWeight|pt|trackIndex|trackKey| - trackLinkCount)+> -<!ATTLIST Electron %attributes;> - -<!ELEMENT EmTauROI (energy|energyEM|energyTAU|eta|phi|roiWord|thrPattern)+> -<!ATTLIST EmTauROI %attributes;> - -<!ELEMENT ETMis (et|etx|ety)+> -<!ATTLIST ETMis %attributes;> - -<!ELEMENT FCAL (adc2Mev|adcCounts|cluster|dx|dy|energy|id|layer|sub| - x|y|channel|feedThrough|slot)+> -<!ATTLIST FCAL %attributes;> - -<!ELEMENT HEC (adc2Mev|adcCounts|energy|eta|id|layer|phi|sub| - cluster|channel|feedThrough|slot)+> -<!ATTLIST HEC %attributes;> - -<!ELEMENT IDScan (barcode|chi2|cotTheta|covMatrix|d0|hits|id|numHits| - phi0|pt|z0)+> -<!ATTLIST IDScan %attributes;> - -<!ELEMENT InDetSegment (hits|numHits|phi|theta|x|y|z)+> -<!ATTLIST InDetSegment %attributes;> - -<!ELEMENT iPat (barcode|chi2|cotTheta|covMatrix|d0|hits| - id|kine|numHits|numPolyline|phi0|polylineX|polylineY| - polylineZ|pt|z0)+> -<!ATTLIST iPat %attributes;> - -<!-- cluster should be an array of calo Cluster IDs, but it's not provided in - the event files nor any processing exists in the Jet handling code --> -<!ELEMENT Jet (OutOfTimeEfrac|bTagName|bTagValue|cells|cluster|clusterIndex|clusterKey|clusterLinkCount| - emfrac|et|eta|fcorCell|fcorDotx|fcorJet|fcorJetForCell|fracSamplingMax|hecf| - isBad|isGood|isUgly|n90cells|n90const|nbadcells|id|jvf|numCells|phi|pt| - quality|qualityLAr|qualityTile|sMax|tileGap3f|time|timeClusters|trackIndex|trackKey| - trackLinkCount|mass|px|py|pz)+> -<!ATTLIST Jet %attributes;> - -<!ELEMENT JetROI (energy|eta|phi)+> -<!ATTLIST JetROI %attributes;> - -<!ELEMENT LAr (adc2Mev|adcCounts|BadCell|cellGain|cellPedestal|cellTime|cluster| - energy|eta|id|layer|phi|sub|channel|feedThrough|slot)+> -<!ATTLIST LAr %attributes;> - -<!ELEMENT LVL1JetElement (energy|eta|phi)+> -<!ATTLIST LVL1JetElement %attributes;> - -<!ELEMENT LVL1Result (ctpItemList|ctpWord0|ctpWord1|ctpWord2| - energyEtMiss|energyEx|energyEy|energySumEt| - itemListEF|itemListL2|passedEF|passedL1|passedL2| - passedTrigger|prescaleListEF|prescaleListL1|prescaleListL2)+> -<!ATTLIST LVL1Result %attributes;> - -<!ELEMENT LVL1TriggerTower (emADC|emBCID|emEnergy|eta|hadADC|hadBCID|hadEnergy| - isEMSaturated|isHadSaturated|numADC|phi|sumEnergy)+> -<!ATTLIST LVL1TriggerTower %attributes;> - -<!ELEMENT MBTS (channel|energy|eta|label|module|phi|quality|sampling|time|type| - adcCounts|cellPedestal|cellRawAmplitude|cellRawTime)+> -<!ATTLIST MBTS %attributes;> - -<!ELEMENT MDT (barcode|driftR|id|identifier|kine|length|x|y|z)+> -<!ATTLIST MDT %attributes;> - -<!ELEMENT MSeg (cotTheta|hits|numHits|phi0|x|y|z)+> -<!ATTLIST MSeg %attributes;> - -<!ELEMENT Muon (author|chi2|dataType|eta|etConeIsol|pdgId|phi|pt| - trackIndex|trackKey|trackLinkCount)+> -<!ATTLIST Muon %attributes;> - -<!ELEMENT MuonETMis (et|etx|ety)+> -<!ATTLIST MuonETMis %attributes;> - -<!ELEMENT MuonROI (energy|eta|phi|roiWord|thrName|thrNumber|thrValue)+> -<!ATTLIST MuonROI %attributes;> - -<!ELEMENT MuonSegment (hits|numHits|phi|theta|x|y|z)+> -<!ATTLIST MuonSegment %attributes;> - -<!ELEMENT ParticleJet (cells|cluster|et|eta|id|numCells|phi|pt)+> -<!ATTLIST ParticleJet %attributes;> - -<!ELEMENT PixCluster (barcode|barcodes|eloss|etaModule|id|numBarcodes| - phiModule|widthx|widthy|x0|y0|z0)+> -<!ATTLIST PixCluster %attributes;> - -<!ELEMENT Photon (clusterIndex|clusterKey|clusterLinkCount|emWeight|et37| - eta|etCone|etHad1|f1|fracs1|isEM|isEMString|phi|pionWeight|pt)+> -<!ATTLIST Photon %attributes;> - -<!-- PixelRDO - object derived from S3D --> -<!ELEMENT PixelRDO (etaModule|id|phiModule|x|y|z)+> -<!ATTLIST PixelRDO %attributes;> - -<!ELEMENT RMTr (barcode|cotTheta|hits|hitsFull|id|kine|numHits| - numPolyline|phi0|polylineX|polylineY|polylineZ|pt| - x|y|z)+> -<!ATTLIST RMTr %attributes;> - -<!ELEMENT RPC (barcode|id|identifier|kine|length|width|x|y|z)+> -<!ATTLIST RPC %attributes;> - -<!ELEMENT RTr (barcode|chi2|cotTheta|covMatrix|d0|kine|phi0|pt|z0)+> -<!ATTLIST RTr %attributes;> - -<!ELEMENT RVx (chi2|covMatrix|numTracks|vertexType|primVxCand| - sgkey|tracks|x|y|z)+> -<!ATTLIST RVx %attributes;> - -<!ELEMENT S3D (barcode|barcodes|clusters|etaModule|kine|numBarcodes|phi| - phiModule|rho|x|y|z)+> -<!ATTLIST S3D %attributes;> - -<!-- SCTRDO - object derived from STC (SiCluster) --> -<!ELEMENT SCTRDO (BCIDError|etaModule|firstHitError|formatterError|id| - lvl1Error|phiModule|preambleError|secondHitError| - syncError|timeBin|x0|x1|y0|y1|z0|z1)+> -<!ATTLIST SCTRDO %attributes;> - -<!ELEMENT Segment (hits|numHits|phi|theta|x|y|z)+> -<!ATTLIST Segment %attributes;> - -<!ELEMENT SiHit (energyloss|trackid|x|y|z)+> -<!ATTLIST SiHit %attributes;> - -<!ELEMENT SMTr (barcode|cotTheta|id|kine|phi0|pt|x|y|z)+> -<!ATTLIST SMTr %attributes;> - -<!ELEMENT STC (barcode|barcodes|etaModule|id|kine|numBarcodes| - phiModule|widthside|x0|x1|y0|y1|z0|z1)+> -<!ATTLIST STC %attributes;> - -<!ELEMENT STr (barcode|code|eta|id|phi|phiEndVertex|phiVertex|pt| - rhoEndVertex|rhoVertex|zVertex|zEndVertex)+> -<!ATTLIST STr %attributes;> - -<!ELEMENT TauJet (author|charge|clusterIndex|clusterKey|clusterLinkCount| - emRadius|eta|etEMCalib|etHadCalib|isolFrac|isTau|isTauString| - logLhRatio|numTracks|phi|pt|stripWidth|trackIndex| - trackKey|trackLinkCount)+> -<!ATTLIST TauJet %attributes;> - -<!ELEMENT TGC (barcode|id|identifier|kine|length|lwidth|swidth| - x|y|z)+> -<!ATTLIST TGC %attributes;> - -<!ELEMENT TILE (adcCounts1|adcCounts2|BadCell|cluster|energy|eta|id|layer|phi| - pmt1Chi2|pmt1Energy|pmt1Gain|pmt1Number|pmt1Pedestal| - pmt1Time|pmt2Chi2|pmt2Energy|pmt2Gain|pmt2Number| - pmt2Pedestal|pmt2Time|sub|pmt1ADCStatus|pmt2ADCStatus| - pmt1RawTime|pmt2RawTime|pmt1RawAmplitude|pmt2RawAmplitude)+> -<!ATTLIST TILE %attributes;> - -<!ELEMENT Track (author|barcode|chi2|cotTheta|covMatrix|d0|driftSign|hits|id| - isOutlier|kine|numHits|numPolyline|numTsos|phi0|polylineX| - polylineY|polylineZ|pt|tsosDetType|tsosPosR|tsosPullLoc1| - tsosPullLoc2|tsosResLoc1|tsosResLoc2|trackAuthor|z0|numDoF| - nBLayerHits|nPixHits|nSCTHits|nTRTHits)+> -<!ATTLIST Track %attributes;> - -<!ELEMENT TrigS3D (barcodes|cluster|dphi|dr|dz|eta|id|layer|numBarcodes|phi| - r|x|y|z)+> -<!ATTLIST TrigS3D %attributes;> - -<!ELEMENT TriggerInfo (energyEtMiss|energyEx|energyEy|energySumEt| - trigInfoEF|trigInfoExtL1ID|trigInfoL1|trigInfoL2| - trigInfoLvl1Type|trigInfoStatus|trigInfoStreamTag)+> -<!ATTLIST TriggerInfo %attributes;> - -<!ELEMENT TRT (barcode|barcodes|driftR|id|kine|numBarcodes|phi|rhoz|sub| - threshold|noise|bitPattern|timeOverThreshold)+> -<!ATTLIST TRT %attributes;> - -<!ELEMENT xKal (barcode|chi2|cotTheta|covMatrix|d0|hits| - id|numHits|numPolyline|phi0|polylineX|polylineY| - polylineZ|pt|z0)+> -<!ATTLIST xKal %attributes;> - -<!ELEMENT OutOfTimeEfrac (#PCDATA)> <!ATTLIST OutOfTimeEfrac %float;> -<!ELEMENT adc2Mev (#PCDATA)> <!ATTLIST adc2Mev %float;> -<!ELEMENT adcCounts (#PCDATA)> <!ATTLIST adcCounts %integer;> -<!ELEMENT adcCounts1 (#PCDATA)> <!ATTLIST adcCounts1 %integer;> -<!ELEMENT adcCounts2 (#PCDATA)> <!ATTLIST adcCounts2 %integer;> -<!ELEMENT author (#PCDATA)> <!ATTLIST author %string;> -<!ELEMENT BadCell (#PCDATA)> <!ATTLIST BadCell %integer;> -<!ELEMENT barcode (#PCDATA)> <!ATTLIST barcode %integer;> -<!ELEMENT barcodes (#PCDATA)> <!ATTLIST barcodes %integer;> -<!ELEMENT bitPattern (#PCDATA)> <!ATTLIST bitPattern %integer;> -<!ELEMENT BCIDError (#PCDATA)> <!ATTLIST BCIDError %integer;> -<!ELEMENT bTagName (#PCDATA)> <!ATTLIST bTagName %string;> -<!ELEMENT bTagValue (#PCDATA)> <!ATTLIST bTagValue %float;> -<!ELEMENT cellTime (#PCDATA)> <!ATTLIST cellTime %float;> -<!ELEMENT cellGain (#PCDATA)> <!ATTLIST cellGain %integer;> -<!ELEMENT cellPedestal (#PCDATA)> <!ATTLIST cellPedestal %float;> -<!ELEMENT cells (#PCDATA)> <!ATTLIST cells %integer;> -<!ELEMENT channel (#PCDATA)> <!ATTLIST channel %integer;> -<!ELEMENT feedThrough (#PCDATA)> <!ATTLIST feedThrough %integer;> -<!ELEMENT slot (#PCDATA)> <!ATTLIST slot %integer;> -<!ELEMENT charge (#PCDATA)> <!ATTLIST charge %float;> -<!ELEMENT chi2 (#PCDATA)> <!ATTLIST chi2 %float;> -<!ELEMENT cluster (#PCDATA)> <!ATTLIST cluster %integer;> -<!ELEMENT clusters (#PCDATA)> <!ATTLIST clusters %integer;> -<!ELEMENT clusterIndex (#PCDATA)> <!ATTLIST clusterIndex %integer;> -<!ELEMENT clusterKey (#PCDATA)> <!ATTLIST clusterKey %string;> -<!ELEMENT clusterLinkCount (#PCDATA)> <!ATTLIST clusterKey %integer;> -<!ELEMENT code (#PCDATA)> <!ATTLIST code %integer;> -<!ELEMENT cotTheta (#PCDATA)> <!ATTLIST cotTheta %float;> -<!ELEMENT covMatrix (#PCDATA)> <!ATTLIST covMatrix %float;> -<!ELEMENT ctpItemList (#PCDATA)> <!ATTLIST ctpItemList %string;> -<!ELEMENT ctpWord0 (#PCDATA)> <!ATTLIST ctpWord0 %integer;> -<!ELEMENT ctpWord1 (#PCDATA)> <!ATTLIST ctpWord1 %integer;> -<!ELEMENT ctpWord2 (#PCDATA)> <!ATTLIST ctpWord2 %integer;> -<!ELEMENT d0 (#PCDATA)> <!ATTLIST d0 %float;> -<!ELEMENT dataType (#PCDATA)> <!ATTLIST dataType %integer;> -<!ELEMENT daughterIndex (#PCDATA)> <!ATTLIST daughterIndex %integer;> -<!ELEMENT daughterKey (#PCDATA)> <!ATTLIST daughterKey %string;> -<!ELEMENT daughterPdgId (#PCDATA)> <!ATTLIST daughterPdgId %integer;> -<!ELEMENT deta (#PCDATA)> <!ATTLIST deta %float;> -<!ELEMENT dphi (#PCDATA)> <!ATTLIST dphi %float;> -<!ELEMENT dr (#PCDATA)> <!ATTLIST dr %float;> -<!ELEMENT driftR (#PCDATA)> <!ATTLIST driftR %float;> -<!ELEMENT driftSign (#PCDATA)> <!ATTLIST driftSign %integer;> -<!ELEMENT dx (#PCDATA)> <!ATTLIST dx %float;> -<!ELEMENT dy (#PCDATA)> <!ATTLIST dy %float;> -<!ELEMENT dz (#PCDATA)> <!ATTLIST dz %float;> -<!ELEMENT eloss (#PCDATA)> <!ATTLIST eloss %float;> -<!ELEMENT emfrac (#PCDATA)> <!ATTLIST emfrac %float;> -<!ELEMENT emADC (#PCDATA)> <!ATTLIST emADC %integer;> -<!ELEMENT emBCID (#PCDATA)> <!ATTLIST emBCID %integer;> -<!ELEMENT emEnergy (#PCDATA)> <!ATTLIST emEnergy %float;> -<!ELEMENT emRadius (#PCDATA)> <!ATTLIST emRadius %float;> -<!ELEMENT emWeight (#PCDATA)> <!ATTLIST emWeight %float;> -<!ELEMENT energy (#PCDATA)> <!ATTLIST energy %float;> -<!ELEMENT energyEM (#PCDATA)> <!ATTLIST energyEM %float;> -<!ELEMENT energyTAU (#PCDATA)> <!ATTLIST energyTAU %float;> -<!ELEMENT energyEtMiss (#PCDATA)> <!ATTLIST energyEtMiss %float;> -<!ELEMENT energyEx (#PCDATA)> <!ATTLIST energyEx %float;> -<!ELEMENT energyEy (#PCDATA)> <!ATTLIST energyEy %float;> -<!ELEMENT energyloss (#PCDATA)> <!ATTLIST energyloss %float;> -<!ELEMENT energySumEt (#PCDATA)> <!ATTLIST energySumEt %float;> -<!ELEMENT eOverp (#PCDATA)> <!ATTLIST eOverp %float;> -<!ELEMENT et (#PCDATA)> <!ATTLIST et %float;> -<!ELEMENT et37 (#PCDATA)> <!ATTLIST et37 %float;> -<!ELEMENT eta (#PCDATA)> <!ATTLIST eta %float;> -<!ELEMENT etaModule (#PCDATA)> <!ATTLIST etaModule %integer;> -<!ELEMENT etCone (#PCDATA)> <!ATTLIST etCone %float;> -<!ELEMENT etCone20 (#PCDATA)> <!ATTLIST etCone20 %float;> -<!ELEMENT etEMCalib (#PCDATA)> <!ATTLIST etEMCalib %float;> -<!ELEMENT etHad1 (#PCDATA)> <!ATTLIST etHad1 %float;> -<!ELEMENT etHadCalib (#PCDATA)> <!ATTLIST etHadCalib %float;> -<!ELEMENT etx (#PCDATA)> <!ATTLIST etx %float;> -<!ELEMENT ety (#PCDATA)> <!ATTLIST ety %float;> -<!ELEMENT etConeIsol (#PCDATA)> <!ATTLIST etConeIsol %float;> -<!ELEMENT f1 (#PCDATA)> <!ATTLIST f1 %float;> -<!ELEMENT firstHitError (#PCDATA)> <!ATTLIST firstHitError %integer;> -<!ELEMENT fcorCell (#PCDATA)> <!ATTLIST fcorCell %float;> -<!ELEMENT fcorDotx (#PCDATA)> <!ATTLIST fcorDotx %float;> -<!ELEMENT fcorJet (#PCDATA)> <!ATTLIST fcorJet %float;> -<!ELEMENT fcorJetForCell (#PCDATA)> <!ATTLIST fcorJetForCell %float;> -<!ELEMENT formatterError (#PCDATA)> <!ATTLIST formatterError %integer;> -<!ELEMENT fracs1 (#PCDATA)> <!ATTLIST fracs1 %float;> -<!ELEMENT fracSamplingMax (#PCDATA)> <!ATTLIST fracSamplingMax %float;> -<!ELEMENT hadADC (#PCDATA)> <!ATTLIST hadADC %integer;> -<!ELEMENT hadBCID (#PCDATA)> <!ATTLIST hadBCID %integer;> -<!ELEMENT hadEnergy (#PCDATA)> <!ATTLIST hadEnergy %float;> -<!ELEMENT hasTrack (#PCDATA)> <!ATTLIST hasTrack %integer;> -<!ELEMENT hecf (#PCDATA)> <!ATTLIST hecf %float;> -<!ELEMENT hits (#PCDATA)> <!ATTLIST hits %integer;> -<!ELEMENT hitsBLayer (#PCDATA)> <!ATTLIST hitsBLayer %integer;> -<!ELEMENT hitsFull (#PCDATA)> <!ATTLIST hitsFull %string;> -<!ELEMENT hitsHighThresTRT (#PCDATA)> <!ATTLIST hitsHighThresTRT %integer;> -<!ELEMENT hitsPixel (#PCDATA)> <!ATTLIST hitsPixel %integer;> -<!ELEMENT hitsSCT (#PCDATA)> <!ATTLIST hitsSCT %integer;> -<!ELEMENT hitsTRT (#PCDATA)> <!ATTLIST hitsTRT %integer;> -<!ELEMENT id (#PCDATA)> <!ATTLIST id %integer;> -<!ELEMENT identifier (#PCDATA)> <!ATTLIST identifier %string;> -<!ELEMENT isBad (#PCDATA)> <!ATTLIST isBad %float;> -<!ELEMENT isEM (#PCDATA)> <!ATTLIST isEM %integer;> -<!ELEMENT isEMString (#PCDATA)> <!ATTLIST isEMString %string;> -<!ELEMENT isEMSaturated (#PCDATA)> <!ATTLIST isEMSaturated %integer;> -<!ELEMENT isGood (#PCDATA)> <!ATTLIST isGood %float;> -<!ELEMENT isHadSaturated (#PCDATA)> <!ATTLIST isHadSaturated %integer;> -<!ELEMENT isTau (#PCDATA)> <!ATTLIST isTau %integer;> -<!ELEMENT isTauString (#PCDATA)> <!ATTLIST isTauString %string;> -<!ELEMENT isUgly (#PCDATA)> <!ATTLIST isUgly %float;> -<!ELEMENT isolated (#PCDATA)> <!ATTLIST isolated %integer;> -<!ELEMENT isolFrac (#PCDATA)> <!ATTLIST isolFrac %float;> -<!ELEMENT isOutlier (#PCDATA)> <!ATTLIST isOutlier %integer;> -<!ELEMENT itemListEF (#PCDATA)> <!ATTLIST itemListEF %string;> -<!ELEMENT itemListL2 (#PCDATA)> <!ATTLIST itemListL2 %string;> -<!ELEMENT jvf (#PCDATA)> <!ATTLIST jvf %float;> -<!ELEMENT kine (#PCDATA)> <!ATTLIST kine %integer;> -<!ELEMENT label (#PCDATA)> <!ATTLIST label %string;> -<!ELEMENT layer (#PCDATA)> <!ATTLIST layer %integer;> -<!ELEMENT length (#PCDATA)> <!ATTLIST length %float;> -<!ELEMENT lhSig (#PCDATA)> <!ATTLIST lhSig %float;> -<!ELEMENT logLhRatio (#PCDATA)> <!ATTLIST logLhRatio %float;> -<!ELEMENT lvl1Error (#PCDATA)> <!ATTLIST lvl1Error %integer;> -<!ELEMENT lwidth (#PCDATA)> <!ATTLIST lwidth %float; > -<!ELEMENT mass (#PCDATA)> <!ATTLIST mass %float;> -<!ELEMENT module (#PCDATA)> <!ATTLIST module %integer;> -<!ELEMENT nbadcells (#PCDATA)> <!ATTLIST nbadcells %integer;> -<!ELEMENT noise (#PCDATA)> <!ATTLIST noise %integer;> -<!ELEMENT nBLayerHits (#PCDATA)> <!ATTLIST nBLayerHits %integer;> -<!ELEMENT nPixHits (#PCDATA)> <!ATTLIST nPixHits %integer;> -<!ELEMENT nSCTHits (#PCDATA)> <!ATTLIST nSCTHits %integer;> -<!ELEMENT nTRTHits (#PCDATA)> <!ATTLIST nTRTHits %integer;> -<!ELEMENT n90cells (#PCDATA)> <!ATTLIST n90cells %integer;> -<!ELEMENT n90const (#PCDATA)> <!ATTLIST n90const %integer;> -<!ELEMENT numADC (#PCDATA)> <!ATTLIST numADC %integer;> -<!ELEMENT numBarcodes (#PCDATA)> <!ATTLIST numBarcodes %integer;> -<!ELEMENT numCells (#PCDATA)> <!ATTLIST numCells %integer;> -<!ELEMENT numDoF (#PCDATA)> <!ATTLIST numDoF %integer;> -<!ELEMENT numHits (#PCDATA)> <!ATTLIST numHits %integer;> -<!ELEMENT numPolyline (#PCDATA)> <!ATTLIST numPolyline %integer;> -<!ELEMENT numTracks (#PCDATA)> <!ATTLIST numTracks %integer;> -<!ELEMENT numTsos (#PCDATA)> <!ATTLIST numTsos %integer;> -<!ELEMENT passedEF (#PCDATA)> <!ATTLIST passedEF %integer;> -<!ELEMENT passedL1 (#PCDATA)> <!ATTLIST passedL1 %integer;> -<!ELEMENT passedL2 (#PCDATA)> <!ATTLIST passedL2 %integer;> -<!ELEMENT passedTrigger (#PCDATA)> <!ATTLIST passedTrigger %integer;> -<!ELEMENT pdgId (#PCDATA)> <!ATTLIST pdgId %integer;> -<!ELEMENT phi (#PCDATA)> <!ATTLIST phi %float;> -<!ELEMENT phi0 (#PCDATA)> <!ATTLIST phi0 %float;> -<!ELEMENT phiEndVertex (#PCDATA)> <!ATTLIST phiEndVertex %float;> -<!ELEMENT phiModule (#PCDATA)> <!ATTLIST phiModule %integer;> -<!ELEMENT phiVertex (#PCDATA)> <!ATTLIST phiVertex %float;> -<!ELEMENT pionWeight (#PCDATA)> <!ATTLIST pionWeight %float;> -<!ELEMENT pmt1Energy (#PCDATA)> <!ATTLIST pmt1Energy %float;> -<!ELEMENT pmt2Energy (#PCDATA)> <!ATTLIST pmt2Energy %float;> -<!ELEMENT pmt1Chi2 (#PCDATA)> <!ATTLIST pmt1Chi2 %float;> -<!ELEMENT pmt2Chi2 (#PCDATA)> <!ATTLIST pmt2Chi2 %float;> -<!ELEMENT pmt1Time (#PCDATA)> <!ATTLIST pmt1Time %float;> -<!ELEMENT pmt2Time (#PCDATA)> <!ATTLIST pmt2Time %float;> -<!ELEMENT cellRawAmplitude (#PCDATA)> <!ATTLIST cellRawAmplitude %float;> -<!ELEMENT cellRawTime (#PCDATA)> <!ATTLIST cellRawTime %float;> -<!ELEMENT pmt1RawTime (#PCDATA)> <!ATTLIST pmt1RawTime %float;> -<!ELEMENT pmt2RawTime (#PCDATA)> <!ATTLIST pmt2RawTime %float;> -<!ELEMENT pmt1RawAmplitude (#PCDATA)> <!ATTLIST pmt1RawAmplitude %float;> -<!ELEMENT pmt2RawAmplitude (#PCDATA)> <!ATTLIST pmt2RawAmplitude %float;> -<!ELEMENT pmt1Gain (#PCDATA)> <!ATTLIST pmt1Gain %integer;> -<!ELEMENT pmt2Gain (#PCDATA)> <!ATTLIST pmt2Gain %integer;> -<!ELEMENT pmt1Pedestal (#PCDATA)> <!ATTLIST pmt1Pedestal %float;> -<!ELEMENT pmt2Pedestal (#PCDATA)> <!ATTLIST pmt2Pedestal %float;> -<!ELEMENT pmt1Number (#PCDATA)> <!ATTLIST pmt1Number %integer;> -<!ELEMENT pmt2Number (#PCDATA)> <!ATTLIST pmt2Number %integer;> -<!ELEMENT pmt1ADCStatus (#PCDATA)> <!ATTLIST pmt1ADCStatus %integer;> -<!ELEMENT pmt2ADCStatus (#PCDATA)> <!ATTLIST pmt2ADCStatus %integer;> -<!ELEMENT polylineX (#PCDATA)> <!ATTLIST polylineX %float;> -<!ELEMENT polylineY (#PCDATA)> <!ATTLIST polylineY %float;> -<!ELEMENT polylineZ (#PCDATA)> <!ATTLIST polylineZ %float;> -<!ELEMENT preambleError (#PCDATA)> <!ATTLIST preambleError %integer;> -<!ELEMENT prescaleListEF (#PCDATA)> <!ATTLIST prescaleListEF %string;> -<!ELEMENT prescaleListL1 (#PCDATA)> <!ATTLIST prescaleListL1 %string;> -<!ELEMENT prescaleListL2 (#PCDATA)> <!ATTLIST prescaleListL2 %string;> -<!ELEMENT vertexType (#PCDATA)> <!ATTLIST vertexType %integer;> -<!ELEMENT primVxCand (#PCDATA)> <!ATTLIST primVxCand %integer;> -<!ELEMENT pt (#PCDATA)> <!ATTLIST pt %float;> -<!ELEMENT px (#PCDATA)> <!ATTLIST px %float;> -<!ELEMENT py (#PCDATA)> <!ATTLIST py %float;> -<!ELEMENT pz (#PCDATA)> <!ATTLIST pz %float;> -<!ELEMENT quality (#PCDATA)> <!ATTLIST quality %float;> -<!ELEMENT qualityLAr (#PCDATA)> <!ATTLIST qualityLAr %float;> -<!ELEMENT qualityTile (#PCDATA)> <!ATTLIST qualityTile %float;> -<!ELEMENT r (#PCDATA)> <!ATTLIST r %float;> -<!ELEMENT rho (#PCDATA)> <!ATTLIST rho %float;> -<!ELEMENT rhoEndVertex (#PCDATA)> <!ATTLIST rhoEndVertex %float;> -<!ELEMENT rhoVertex (#PCDATA)> <!ATTLIST rhoVertex %float;> -<!ELEMENT rhoz (#PCDATA)> <!ATTLIST rhoz %float;> -<!ELEMENT roiWord (#PCDATA)> <!ATTLIST roiWord %float;> -<!ELEMENT sampling (#PCDATA)> <!ATTLIST sampling %integer;> -<!ELEMENT secondHitError (#PCDATA)> <!ATTLIST secondHitError %integer;> -<!ELEMENT secVtxCount (#PCDATA)> <!ATTLIST secVtxCount %float;> -<!ELEMENT secVtxFitProb (#PCDATA)> <!ATTLIST secVtxFitProb %float;> -<!ELEMENT secVtxMass (#PCDATA)> <!ATTLIST secVtxMass %float;> -<!ELEMENT secVtxMult (#PCDATA)> <!ATTLIST secVtxMult %integer;> -<!ELEMENT secVtxRPhiDist (#PCDATA)> <!ATTLIST secVtxRPhiDist %float;> -<!ELEMENT secVtxTagLh (#PCDATA)> <!ATTLIST secVtxTagLh %float;> -<!ELEMENT secVtxTagLhErr (#PCDATA)> <!ATTLIST secVtxTagLhErr %float;> -<!ELEMENT sgkey (#PCDATA)> <!ATTLIST sgkey %string;> -<!ELEMENT side (#PCDATA)> <!ATTLIST side %integer;> -<!ELEMENT sigma (#PCDATA)> <!ATTLIST sigma %float;> -<!ELEMENT sMax (#PCDATA)> <!ATTLIST sMax %float;> -<!ELEMENT stripWidth (#PCDATA)> <!ATTLIST stripWidth %float;> -<!ELEMENT sub (#PCDATA)> <!ATTLIST sub %integer;> -<!ELEMENT sumEnergy (#PCDATA)> <!ATTLIST sumEnergy %float;> -<!ELEMENT swidth (#PCDATA)> <!ATTLIST swidth %float;> -<!ELEMENT syncError (#PCDATA)> <!ATTLIST syncError %integer;> -<!ELEMENT theta (#PCDATA)> <!ATTLIST theta %float;> -<!ELEMENT threshold (#PCDATA)> <!ATTLIST threshold %integer;> -<!ELEMENT timeOverThreshold (#PCDATA)> <!ATTLIST timeOverThreshold %float;> -<!ELEMENT thrName (#PCDATA)> <!ATTLIST thrName %string;> -<!ELEMENT thrNumber (#PCDATA)> <!ATTLIST thrNumber %float;> -<!ELEMENT thrValue (#PCDATA)> <!ATTLIST thrValue %float;> -<!ELEMENT thrPattern (#PCDATA)> <!ATTLIST thrPattern %float;> -<!ELEMENT tileGap3f (#PCDATA)> <!ATTLIST tileGap3f %float;> -<!ELEMENT time (#PCDATA)> <!ATTLIST time %float;> -<!ELEMENT timeClusters (#PCDATA)> <!ATTLIST timeClusters %float;> -<!ELEMENT timeBin (#PCDATA)> <!ATTLIST timeBin %integer;> -<!ELEMENT trackAuthor (#PCDATA)> <!ATTLIST trackAuthor %integer;> -<!ELEMENT trackid (#PCDATA)> <!ATTLIST trackid %integer;> -<!ELEMENT trackIndex (#PCDATA)> <!ATTLIST trackIndex %integer;> -<!ELEMENT trackKey (#PCDATA)> <!ATTLIST trackKey %string;> -<!ELEMENT trackLinkCount (#PCDATA)> <!ATTLIST trackLinkCount %integer;> -<!ELEMENT tracks (#PCDATA)> <!ATTLIST tracks %integer;> -<!ELEMENT trigInfoEF (#PCDATA)> <!ATTLIST trigInfoEF %string;> -<!ELEMENT trigInfoExtL1ID (#PCDATA)> <!ATTLIST trigInfoExtL1ID %string;> -<!ELEMENT trigInfoL1 (#PCDATA)> <!ATTLIST trigInfoL1 %string;> -<!ELEMENT trigInfoL2 (#PCDATA)> <!ATTLIST trigInfoL2 %string;> -<!ELEMENT trigInfoLvl1Type (#PCDATA)> <!ATTLIST trigInfoLvl1Type %string;> -<!ELEMENT trigInfoStatus (#PCDATA)> <!ATTLIST trigInfoStatus %string;> -<!ELEMENT trigInfoStreamTag (#PCDATA)> <!ATTLIST trigInfoStreamTag %string;> -<!ELEMENT tsosDetType (#PCDATA)> <!ATTLIST tsosDetType %string;> -<!ELEMENT tsosPosR (#PCDATA)> <!ATTLIST tsosPosR %float;> -<!ELEMENT tsosPullLoc1 (#PCDATA)> <!ATTLIST tsosPullLoc1 %float;> -<!ELEMENT tsosPullLoc2 (#PCDATA)> <!ATTLIST tsosPullLoc2 %float;> -<!ELEMENT tsosResLoc1 (#PCDATA)> <!ATTLIST tsosResLoc1 %float;> -<!ELEMENT tsosResLoc2 (#PCDATA)> <!ATTLIST tsosResLoc2 %float;> -<!ELEMENT type (#PCDATA)> <!ATTLIST type %integer;> -<!ELEMENT typeEV (#PCDATA)> <!ATTLIST typeEV %string;> -<!ELEMENT weight (#PCDATA)> <!ATTLIST weight %float;> -<!ELEMENT width (#PCDATA)> <!ATTLIST width %float;> -<!ELEMENT widthside (#PCDATA)> <!ATTLIST widthside %float;> -<!ELEMENT widthx (#PCDATA)> <!ATTLIST widthx %float;> -<!ELEMENT widthy (#PCDATA)> <!ATTLIST widthy %float;> -<!ELEMENT x (#PCDATA)> <!ATTLIST x %float;> -<!ELEMENT x0 (#PCDATA)> <!ATTLIST x0 %float;> -<!ELEMENT x1 (#PCDATA)> <!ATTLIST x1 %float;> -<!ELEMENT y (#PCDATA)> <!ATTLIST y %float;> -<!ELEMENT y0 (#PCDATA)> <!ATTLIST y0 %float;> -<!ELEMENT y1 (#PCDATA)> <!ATTLIST y1 %float;> -<!ELEMENT z (#PCDATA)> <!ATTLIST z %float;> -<!ELEMENT z0 (#PCDATA)> <!ATTLIST z0 %float;> -<!ELEMENT z1 (#PCDATA)> <!ATTLIST z1 %float;> -<!ELEMENT zEndVertex (#PCDATA)> <!ATTLIST zEndVertex %float;> -<!ELEMENT zVertex (#PCDATA)> <!ATTLIST zVertex %float;> diff --git a/graphics/AtlantisJava/geometry/AGeometry.xml b/graphics/AtlantisJava/geometry/AGeometry.xml deleted file mode 100755 index 0d903668879f..000000000000 --- a/graphics/AtlantisJava/geometry/AGeometry.xml +++ /dev/null @@ -1,233 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE AGeometry [ -<!ELEMENT AGeometry (ADisc | ARectangle | ABarrelCalorimeter | - AEndcapCalorimeter | AGapCalorimeter | - ABarrelSiliconDetector | AEndcapSiliconDetector | - ABarrelTRTDetector | AEndcapTRTDetector)* > -<!ELEMENT ADisc EMPTY > -<!ATTLIST ADisc - p CDATA #REQUIRED - c CDATA #REQUIRED - n CDATA #REQUIRED - rIn CDATA #REQUIRED - rOut CDATA #REQUIRED - nIn CDATA "256" - nOut CDATA "256"> -<!ELEMENT ARectangle EMPTY > -<!ATTLIST ARectangle - p CDATA #REQUIRED - c CDATA #REQUIRED - n CDATA #REQUIRED - xMin CDATA #REQUIRED - xMax CDATA #REQUIRED - yMin CDATA #REQUIRED - yMax CDATA #REQUIRED - xR (YES|NO) "YES" - yR (YES|NO) "YES"> -<!ELEMENT ABarrelCalorimeter EMPTY > -<!ATTLIST ABarrelCalorimeter - c CDATA #REQUIRED - n CDATA #REQUIRED - sampling CDATA #REQUIRED - region CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED - eta0 CDATA #REQUIRED - deta CDATA #REQUIRED - neta CDATA #REQUIRED - meta CDATA #REQUIRED - phi0 CDATA #REQUIRED - nphi CDATA #REQUIRED> -<!ELEMENT AEndcapCalorimeter EMPTY > -<!ATTLIST AEndcapCalorimeter - c CDATA #REQUIRED - n CDATA #REQUIRED - sampling CDATA #REQUIRED - region CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED - eta0 CDATA #REQUIRED - deta CDATA #REQUIRED - neta CDATA #REQUIRED - meta CDATA #REQUIRED - phi0 CDATA #REQUIRED - nphi CDATA #REQUIRED> -<!ELEMENT AGapCalorimeter EMPTY > -<!ATTLIST AGapCalorimeter - c CDATA #REQUIRED - n CDATA #REQUIRED - sampling CDATA #REQUIRED - region CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED - eta CDATA #REQUIRED - phi0 CDATA #REQUIRED - nphi CDATA #REQUIRED> -<!ELEMENT AEndcapCryostat EMPTY > -<!ATTLIST AEndcapCryostat - c CDATA #REQUIRED - n CDATA #REQUIRED - sampling CDATA #REQUIRED - region CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED - neta CDATA #REQUIRED - nphi CDATA #REQUIRED> -<!ELEMENT ABarrelSiliconDetector EMPTY > -<!ATTLIST ABarrelSiliconDetector - c CDATA #REQUIRED - n CDATA #REQUIRED - layer CDATA #REQUIRED - length CDATA #REQUIRED - width CDATA #REQUIRED - thickness CDATA #REQUIRED - tilt CDATA #REQUIRED - nz CDATA #REQUIRED - nphi CDATA #REQUIRED - r0 CDATA #REQUIRED - phi0 CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED> -<!ELEMENT AEndcapSiliconDetector EMPTY > -<!ATTLIST AEndcapSiliconDetector - c CDATA #REQUIRED - n CDATA #REQUIRED - layer CDATA #REQUIRED - length CDATA #REQUIRED - width CDATA #REQUIRED - thickness CDATA #REQUIRED - nz CDATA #REQUIRED - nphi CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - phi0 CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED> -<!ELEMENT ABarrelTRTDetector EMPTY > -<!ATTLIST ABarrelTRTDetector - c CDATA #REQUIRED - n CDATA #REQUIRED - layer CDATA #REQUIRED - nphi CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - phiIn CDATA #REQUIRED - phiOut CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED> -<!ELEMENT AEndcapTRTDetector EMPTY > -<!ATTLIST AEndcapTRTDetector - c CDATA #REQUIRED - n CDATA #REQUIRED - layer CDATA #REQUIRED - nphi CDATA #REQUIRED - rMin CDATA #REQUIRED - rMax CDATA #REQUIRED - phi0 CDATA #REQUIRED - zMin CDATA #REQUIRED - zMax CDATA #REQUIRED> -]> - -<AGeometry> -<ABarrelSiliconDetector c="PIX" n="Pixel" layer="0" length="2" width="1.9" thickness="0.270702" tilt="-14.0063" nz="20" nphi="14" r0="3.32803" phi0="22.2819" zMin="-33.6323" zMax="33.6323" /> -<ABarrelSiliconDetector c="PIX" n="Pixel" layer="1" length="6.08" width="1.64" thickness="0.306424" tilt="-19.9962" nz="13" nphi="22" r0="5.10491" phi0="-0.391852" zMin="-40.5702" zMax="40.5702" /> -<ABarrelSiliconDetector c="PIX" n="Pixel" layer="2" length="6.08" width="1.64" thickness="0.307646" tilt="-19.9962" nz="13" nphi="38" r0="8.88103" phi0="-0.12952" zMin="-40.5702" zMax="40.5702" /> -<ABarrelSiliconDetector c="PIX" n="Pixel" layer="3" length="6.08" width="1.64" thickness="0.30793" tilt="-19.9962" nz="13" nphi="52" r0="12.2722" phi0="3.38916" zMin="-40.5702" zMax="40.5702" /> -<AEndcapSiliconDetector c="PIX" n="Pixel" layer="0" length="6.08" width="1.64" thickness="1.51617" nz="1" nphi="48" rMin="8.91479" rMax="14.9795" phi0="3.75" zMin="48.79" zMax="49.79" /> -<AEndcapSiliconDetector c="PIX" n="Pixel" layer="1" length="6.08" width="1.64" thickness="1.51617" nz="1" nphi="48" rMin="8.91479" rMax="14.9795" phi0="3.75" zMin="57.29" zMax="58.29" /> -<AEndcapSiliconDetector c="PIX" n="Pixel" layer="2" length="6.08" width="1.64" thickness="1.51617" nz="1" nphi="48" rMin="8.91479" rMax="14.9795" phi0="3.75" zMin="64.29" zMax="65.29" /> -<ABarrelSiliconDetector c="SIL" n="Silicon" layer="0" length="12.609" width="6.144" thickness="0.83814" tilt="11.0677" nz="6" nphi="32" r0="30.134" phi0="3.24616" zMin="-74.8273" zMax="74.8273" /> -<ABarrelSiliconDetector c="SIL" n="Silicon" layer="1" length="12.609" width="6.144" thickness="0.75531" tilt="11.0546" nz="6" nphi="40" r0="37.2063" phi0="2.63207" zMin="-74.8273" zMax="74.8273" /> -<ABarrelSiliconDetector c="SIL" n="Silicon" layer="2" length="12.609" width="6.144" thickness="0.836751" tilt="11.2967" nz="6" nphi="48" r0="44.4326" phi0="2.10644" zMin="-74.8273" zMax="74.8273" /> -<ABarrelSiliconDetector c="SIL" n="Silicon" layer="3" length="12.609" width="6.144" thickness="0.776445" tilt="11.2902" nz="6" nphi="56" r0="51.4693" phi0="1.80488" zMin="-74.8273" zMax="74.8273" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="0" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.03842" zMin="83.5567" zMax="84.6532" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="0" length="11.77" width="6.31592" thickness="24.099" nz="1" nphi="40" rMin="33.7464" rMax="45.7959" phi0="4.46486" zMin="86.5567" zMax="87.6532" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="1" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.01417" zMin="91.5768" zMax="92.6732" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="1" length="11.77" width="6.31592" thickness="36.6061" nz="2" nphi="40" rMin="27.4929" rMax="45.7959" phi0="4.5" zMin="91.5768" zMax="95.6732" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="2" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.03842" zMin="107.327" zMax="108.423" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="2" length="11.77" width="6.31592" thickness="36.6061" nz="2" nphi="40" rMin="27.4929" rMax="45.7959" phi0="4.46486" zMin="107.327" zMax="111.423" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="3" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.01417" zMin="128.167" zMax="129.263" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="3" length="11.77" width="6.31592" thickness="36.6061" nz="2" nphi="40" rMin="27.4929" rMax="45.7959" phi0="4.5" zMin="128.167" zMax="132.263" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="4" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.03842" zMin="138.147" zMax="139.243" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="4" length="11.77" width="6.31592" thickness="36.6061" nz="2" nphi="40" rMin="27.4929" rMax="45.7959" phi0="4.46486" zMin="138.147" zMax="142.243" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="5" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.01417" zMin="175.317" zMax="176.413" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="5" length="11.77" width="6.31592" thickness="36.6061" nz="2" nphi="40" rMin="27.4929" rMax="45.7959" phi0="4.5" zMin="175.317" zMax="179.413" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="6" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.03842" zMin="209.697" zMax="210.793" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="6" length="11.77" width="6.31592" thickness="24.099" nz="1" nphi="40" rMin="33.7464" rMax="45.7959" phi0="4.46486" zMin="212.697" zMax="213.793" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="7" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="-1.01417" zMin="248.677" zMax="249.773" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="7" length="5.2475" width="6.83547" thickness="11.0247" nz="1" nphi="40" rMin="40.2836" rMax="45.7959" phi0="4.5" zMin="251.677" zMax="252.773" /> -<AEndcapSiliconDetector c="SIL" n="Silicon" layer="8" length="12.1235" width="6.2019" thickness="24.7693" nz="1" nphi="52" rMin="43.8426" rMax="56.2272" phi0="1.01417" zMin="273.747" zMax="274.843" /> -<ABarrelTRTDetector c="TRT" n="TRT" layer="0" nphi="32" rMin="56.7302" rMax="69.8248" phiIn="-6.17382" phiOut="-10.7369" zMin="-70.975" zMax="70.975" /> -<ABarrelTRTDetector c="TRT" n="TRT" layer="1" nphi="32" rMin="70.1346" rMax="86.6458" phiIn="-10.7202" phiOut="-5.99874" zMin="-70.975" zMax="70.975" /> -<ABarrelTRTDetector c="TRT" n="TRT" layer="2" nphi="32" rMin="86.9559" rMax="107.232" phiIn="-6.00171" phiOut="-10.9221" zMin="-70.975" zMax="70.975" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="0" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="85.85" zMax="98.55" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="1" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="100.18" zMax="112.88" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="2" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="114.565" zMax="127.265" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="3" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="128.86" zMax="141.56" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="4" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="143.12" zMax="155.82" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="5" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="157.388" zMax="170.088" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="6" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="175.008" zMax="185.408" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="7" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="187.185" zMax="197.585" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="8" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="199.34" zMax="209.74" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="9" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="211.49" zMax="221.89" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="10" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="223.64" zMax="234.04" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="11" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="235.795" zMax="246.195" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="12" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="247.96" zMax="258.36" /> -<AEndcapTRTDetector c="TRT" n="TRT" layer="13" nphi="34" rMin="64.67" rMax="100.1" phi0="0" zMin="260.083" zMax="270.483" /> -<ADisc p="YX" c="Sol" n="Solenoid" rIn="122.9" rOut="127.4" /> -<ARectangle p="RZ" c="Sol" n="Solenoid" xMin="-265" xMax="265" yMin="122.9" yMax="127.4" xR="NO" /> -<ABarrelCalorimeter c="ECAL" n="LAr Presampler" sampling="0" region="0" rMin="142.173" rMax="143.858" zMin="0" zMax="325.0" eta0="3.1225e-17" deta="0.025" neta="61" meta="0" phi0="-0.175783" nphi="64" /> -<ABarrelCalorimeter c="ECAL" n="LAr" sampling="1" region="0" rMin="148.175" rMax="158" zMin="0" zMax="325.0" eta0="0.003125" deta="0.003125" neta="447" meta="1" phi0="-0.175783" nphi="64" /> -<ABarrelCalorimeter c="ECAL" n="LAr" sampling="1" region="1" rMin="148.175" rMax="158" zMin="0" zMax="325.0" eta0="1.4" deta="0.025" neta="3" meta="0" phi0="-0.175783" nphi="256" /> -<ABarrelCalorimeter c="ECAL" n="LAr" sampling="2" region="0" rMin="158" rMax="184" zMin="0" zMax="325.0" eta0="0.0" deta="0.025" neta="56" meta="0" phi0="-0.175783" nphi="256" /> -<ABarrelCalorimeter c="ECAL" n="LAr" sampling="2" region="1" rMin="158" rMax="184" zMin="0" zMax="325.0" eta0="1.4" deta="0.075" neta="1" meta="0" phi0="-0.175783" nphi="256" /> -<ABarrelCalorimeter c="ECAL" n="LAr" sampling="3" region="0" rMin="184" rMax="198.47" zMin="0" zMax="325.0" eta0="0.0" deta="0.05" neta="27" meta="0" phi0="-0.175783" nphi="256" /> -<AEndcapCalorimeter c="ECAL" n="LAr Endcap Presampler" sampling="0" region="0" rMin="29.0" rMax="203.4" zMin="368.075" zMax="371.425" eta0="1.50988" deta="0.025" neta="12" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="0" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="1.38444" deta="0.05" neta="1" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="1" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="1.43452" deta="0.025" neta="3" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="2" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="1.50965" deta="0.003125" neta="96" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="3" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="1.81009" deta="0.00416667" neta="48" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="4" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="2.01027" deta="0.00625" neta="64" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="1" region="5" rMin="29.0" rMax="203.4" zMin="375.424" zMax="380.073" eta0="2.41048" deta="0.025" neta="4" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Inner Endcap" sampling="1" region="0" rMin="29.0" rMax="203.4" zMin="375.424" zMax="420.125" eta0="2.51004" deta="0.1" neta="7" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="2" region="0" rMin="29.0" rMax="203.4" zMin="380.073" zMax="424.326" eta0="1.38381" deta="0.05" neta="7" meta="0" phi0="-0.234375" nphi="256" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="2" region="1" rMin="29.0" rMax="203.4" zMin="380.073" zMax="415.624" eta0="1.43388" deta="0.025" neta="43" meta="0" phi0="-0.234375" nphi="256" /> -<AEndcapCalorimeter c="ECAL" n="LAr Inner Endcap" sampling="2" region="0" rMin="29.0" rMax="203.4" zMin="420.125" zMax="424.326" eta0="2.5094" deta="0.1" neta="7" meta="0" phi0="-0.234375" nphi="64" /> -<AEndcapCalorimeter c="ECAL" n="LAr Outer Endcap" sampling="3" region="0" rMin="29.0" rMax="203.4" zMin="415.624" zMax="424.326" eta0="1.50867" deta="0.05" neta="20" meta="0" phi0="-0.234375" nphi="256" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="0" region="0" rMin="37.2" rMax="203.4" zMin="435" zMax="463" eta0="1.50824" deta="0.1" neta="10" meta="0" phi0="0" nphi="64" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="0" region="1" rMin="37.2" rMax="203.4" zMin="435" zMax="463" eta0="2.50892" deta="0.2" neta="4" meta="0" phi0="0" nphi="32" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="1" region="0" rMin="48.5" rMax="203.4" zMin="463" zMax="510" eta0="1.50755" deta="0.1" neta="10" meta="0" phi0="0" nphi="64" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="1" region="1" rMin="48.5" rMax="203.4" zMin="463" zMax="510" eta0="2.50817" deta="0.2" neta="3" meta="0" phi0="0" nphi="32" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="2" region="0" rMin="48.5" rMax="203.4" zMin="513" zMax="559" eta0="1.6" deta="0.1" neta="9" meta="1" phi0="0" nphi="64" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="2" region="1" rMin="48.5" rMax="203.4" zMin="513" zMax="559" eta0="2.5" deta="0.2" neta="3" meta="0" phi0="-7.95139e-16" nphi="32" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="3" region="0" rMin="48.5" rMax="203.4" zMin="559" zMax="605" eta0="1.7" deta="0.1" neta="8" meta="2" phi0="-3.97569e-16" nphi="64" /> -<AEndcapCalorimeter c="HCAL" n="HEC" sampling="3" region="1" rMin="48.5" rMax="203.4" zMin="559" zMax="605" eta0="2.5" deta="0.2" neta="4" meta="0" phi0="-7.95139e-16" nphi="32" /> -<ADisc p="YX" c="ECAL" n="FCAL EM" rIn="7.84392" rOut="47.5" /> -<ARectangle p="RZ" c="ECAL" n="FCAL EM" xMin="466.85" xMax="511.85" yMin="7.84392" yMax="47.5" /> -<ADisc p="YX" c="HCAL" n="FCAL HAD 1" rIn="7.90558" rOut="47.5" /> -<ARectangle p="RZ" c="HCAL" n="FCAL HAD 1" xMin="512.3" xMax="557.3" yMin="7.90558" yMax="47.5" /> -<ADisc p="YX" c="HCAL" n="FCAL HAD 2" rIn="7.96007" rOut="47.5" /> -<ARectangle p="RZ" c="HCAL" n="FCAL HAD 2" xMin="559.75" xMax="604.75" yMin="7.96007" yMax="47.5" /> -<ABarrelCalorimeter c="HCAL" n="TILE Barrel" sampling="0" region="0" rMin="229" rMax="260" zMin="0" zMax="282" eta0="0" deta="0.1" neta="10" meta="0" phi0="0" nphi="64" /> -<ABarrelCalorimeter c="HCAL" n="TILE Barrel" sampling="1" region="0" rMin="260" rMax="344" zMin="0" zMax="282" eta0="0" deta="0.1" neta="9" meta="0" phi0="0" nphi="64" /> -<ABarrelCalorimeter c="HCAL" n="TILE Barrel" sampling="2" region="0" rMin="344" rMax="386" zMin="-36.5199" zMax="282" eta0="-0.1" deta="0.2" neta="4" meta="0" phi0="0" nphi="64" /> -<ABarrelCalorimeter c="HCAL" n="Extended TILE" sampling="0" region="0" rMin="229" rMax="260" zMin="355.95" zMax="615" eta0="1.1" deta="0.1" neta="5" meta="11" phi0="0" nphi="64" /> -<ABarrelCalorimeter c="HCAL" n="Extended TILE" sampling="1" region="0" rMin="260" rMax="314" zMin="355.95" zMax="615" eta0="1" deta="0.1" neta="5" meta="10" phi0="0" nphi="64" /> -<ABarrelCalorimeter c="HCAL" n="Extended TILE" sampling="2" region="0" rMin="314" rMax="386" zMin="355.95" zMax="615" eta0="0.9" deta="0.2" neta="2" meta="10" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="1" region="0" rMin="299" rMax="344" zMin="346.435" zMax="355.92" eta="9" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="2" region="0" rMin="344" rMax="386" zMin="325.05" zMax="355.95" eta="8" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="3" region="0" rMin="264.6" rMax="295.9" zMin="354.45" zMax="355.95" eta="10" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="3" region="0" rMin="230.5" rMax="264.6" zMin="354.45" zMax="355.95" eta="11" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="3" region="0" rMin="182.7" rMax="230.5" zMin="353.2" zMax="354" eta="13" phi0="0" nphi="64" /> -<AGapCalorimeter c="HCAL" n="ITC Gap" sampling="3" region="0" rMin="146.5" rMax="182.7" zMin="353.2" zMax="354" eta="15" phi0="0" nphi="64" /> -<AEndcapCryostat c="HCAL" n="Minimum Bias Trigger Scintillators" sampling="0" region="0" rMin="15.3" rMax="42.6" zMin="319.187" zMax="321.187" neta="1" nphi="8" /> -<AEndcapCryostat c="HCAL" n="Minimum Bias Trigger Scintillators" sampling="1" region="0" rMin="42.6" rMax="89" zMin="319.187" zMax="321.187" neta="1" nphi="8" /> -</AGeometry> diff --git a/graphics/AtlantisJava/geometry/AMuonGeometry.xml b/graphics/AtlantisJava/geometry/AMuonGeometry.xml deleted file mode 100755 index bf6ea122c013..000000000000 --- a/graphics/AtlantisJava/geometry/AMuonGeometry.xml +++ /dev/null @@ -1,220 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE AMuonGeometry [ -<!ELEMENT AMuonGeometry (ABox | ATBx | ATrd)*> -<!ELEMENT ABox EMPTY > -<!ATTLIST ABox - n CDATA #REQUIRED - zi CDATA #REQUIRED - zo CDATA #REQUIRED - ri CDATA #REQUIRED - ro CDATA #REQUIRED - w CDATA #REQUIRED - eta CDATA #REQUIRED - phi CDATA #REQUIRED - dphi CDATA "0" - sh CDATA "0" - RPCi CDATA "0" - RPCo CDATA "0"> -<!ELEMENT ATBx EMPTY > -<!ATTLIST ATBx - n CDATA #REQUIRED - zi CDATA #REQUIRED - zo CDATA #REQUIRED - ri CDATA #REQUIRED - ro CDATA #REQUIRED - w CDATA #REQUIRED - eta CDATA #REQUIRED - phi CDATA #REQUIRED - sh CDATA "0" - dphi CDATA "0" - RPCi CDATA "0" - RPCo CDATA "0" - zis CDATA #REQUIRED - zos CDATA #REQUIRED - ws CDATA #REQUIRED - or CDATA "0"> -<!ELEMENT ATrd EMPTY > -<!ATTLIST ATrd - n CDATA #REQUIRED - zi CDATA #REQUIRED - zo CDATA #REQUIRED - ri CDATA #REQUIRED - ro CDATA #REQUIRED - wi CDATA #REQUIRED - wo CDATA #REQUIRED - eta CDATA #REQUIRED - phi CDATA #REQUIRED - dphi CDATA "0" - sh CDATA "0" - a CDATA "0"> -]> -<AMuonGeometry> -<ABox n="MDT_BIL" zi="33" zo="124.607" ri="474.091" ro="515.705" w="267.15" eta="1" phi="1 2 3 7" /> -<ABox n="MDT_BIL" zi="51" zo="124.586" ri="474.091" ro="515.705" w="267.15" eta="1" phi="4" /> -<ABox n="MDT_BIL" zi="56" zo="147.607" ri="525.691" ro="567.305" w="267.15" eta="1" phi="5" /> -<ABox n="MDT_BIL" zi="125" zo="234.628" ri="474.091" ro="515.705" w="267.15" eta="2" phi="1 2 3 4 5 7" /> -<ABox n="MDT_BIL" zi="235" zo="326.607" ri="474.091" ro="515.705" w="267.15" eta="3" phi="1 2 4 5 7" /> -<ABox n="MDT_BIL" zi="235" zo="344.628" ri="474.091" ro="515.705" w="267.15" eta="3" phi="3" /> -<ABox n="MDT_BIL" zi="345" zo="454.628" ri="474.091" ro="515.705" w="267.15" eta="4" phi="1 2 3 4 5" /> -<ABox n="MDT_BIL" zi="345" zo="436.607" ri="474.091" ro="515.705" w="267.15" eta="4" phi="7" /> -<ABox n="MDT_BIL" zi="455" zo="546.607" ri="474.091" ro="515.705" w="267.15" eta="5" phi="1 2 3 4 5" /> -<ABox n="MDT_BIL" zi="437" zo="528.607" ri="474.091" ro="515.705" w="267.15" eta="5" phi="7" /> -<ABox n="MDT_BIL" zi="547" zo="656.628" ri="474.091" ro="515.705" w="267.15" eta="6" phi="1 2 3 5" /> -<ABox n="MDT_BIL" zi="547" zo="638.607" ri="474.091" ro="515.705" w="267.15" eta="6" phi="4 7" /> -<ABox n="MDT_BIS" zi="1" zo="110.628" ri="440.793" ro="469.207" w="167.15" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="111" zo="202.607" ri="440.793" ro="469.207" w="167.15" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="203" zo="294.607" ri="440.793" ro="469.207" w="167.15" eta="3" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="295" zo="386.607" ri="440.793" ro="469.207" w="167.15" eta="4" phi="1 2 3" dphi="22.5" /> -<ABox n="MDT_BIS" zi="313" zo="404.607" ri="440.793" ro="469.207" w="167.15" eta="4" phi="4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="387" zo="478.607" ri="440.793" ro="469.207" w="167.15" eta="5" phi="1 2 3" dphi="22.5" /> -<ABox n="MDT_BIS" zi="405" zo="496.607" ri="440.793" ro="469.207" w="167.15" eta="5" phi="4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="479" zo="570.607" ri="440.793" ro="469.207" w="167.15" eta="6" phi="1 2 3" dphi="22.5" /> -<ABox n="MDT_BIS" zi="497" zo="588.607" ri="440.793" ro="469.207" w="167.15" eta="6" phi="4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="571" zo="680.628" ri="440.793" ro="469.207" w="167.15" eta="7" phi="1 2 3" dphi="22.5" /> -<ABox n="MDT_BIS" zi="589" zo="680.607" ri="440.793" ro="469.207" w="167.15" eta="7" phi="4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIS" zi="681" zo="730.558" ri="454.864" ro="466.145" w="85.15" eta="8" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BML" zi="15" zo="184.698" ri="675.194" ro="754.205" w="357.6" eta="1" phi="1 2" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="39" zo="184.67" ri="675.194" ro="754.205" w="357.6" eta="1" phi="3 7" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="87" zo="184.614" ri="675.194" ro="753.005" w="357.6" eta="1" phi="4 5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="63" zo="184.642" ri="675.194" ro="753.005" w="357.6" eta="1" phi="6 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="185" zo="354.698" ri="675.194" ro="754.205" w="357.6" eta="2" phi="1 2 3 4 5 6 7 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="355" zo="524.698" ri="675.194" ro="754.205" w="357.6" eta="3" phi="1 2 3 4 5 6 7 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="525" zo="646.642" ri="675.194" ro="753.005" w="357.6" eta="4" phi="1 2 3 4 5 6 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="647" zo="768.642" ri="675.194" ro="753.005" w="357.6" eta="4" phi="7" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="647" zo="768.642" ri="675.194" ro="753.005" w="357.6" eta="5" phi="1 2 3 4 5 6 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="769" zo="914.67" ri="675.194" ro="754.205" w="357.6" eta="5" phi="7" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="769" zo="914.67" ri="675.194" ro="754.205" w="357.6" eta="6" phi="1 2 3 4 5 6 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="918" zo="966" ri="743.8" ro="753.8" w="304" eta="6" phi="7" RPCi="15" RPCo="15" /> -<ABox n="MDT_BML" zi="918" zo="966" ri="743.8" ro="753.8" w="304" eta="7" phi="1 2 3 4 5 6 8" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="15" zo="184.698" ri="777.694" ro="842.905" w="309.6" eta="1" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="185" zo="364.5" ri="777.694" ro="845.705" w="309.6" eta="2" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="368" zo="513.67" ri="777.694" ro="841.705" w="309.6" eta="3" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="514" zo="691.35" ri="777.694" ro="851.305" w="309.6" eta="4" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="692.5" zo="790.114" ri="777.694" ro="841.705" w="309.6" eta="5" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMS" zi="790.5" zo="936.17" ri="777.694" ro="842.905" w="309.6" eta="6" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BOL" zi="15" zo="232.754" ri="924.444" ro="989.055" w="498.6" eta="1" phi="1 2" RPCo="15" /> -<ABox n="MDT_BOL" zi="39" zo="232.726" ri="924.444" ro="989.055" w="498.6" eta="1" phi="3" RPCo="15" /> -<ABox n="MDT_BOL" zi="87" zo="232.67" ri="924.444" ro="989.055" w="498.6" eta="1" phi="4 5" RPCo="15" /> -<ABox n="MDT_BOL" zi="63" zo="232.698" ri="924.444" ro="989.055" w="498.6" eta="1" phi="6 7 8" RPCo="15" /> -<ABox n="MDT_BOL" zi="233" zo="450.754" ri="924.444" ro="989.055" w="498.6" eta="2" phi="1 2 3 4 5 6 8" RPCo="15" /> -<ABox n="MDT_BOL" zi="233" zo="378.67" ri="924.444" ro="989.055" w="498.6" eta="2" phi="7" RPCo="15" /> -<ABox n="MDT_BOL" zi="451" zo="620.698" ri="924.444" ro="989.055" w="498.6" eta="3" phi="1 2 3 4 5 6 8" RPCo="15" /> -<ABox n="MDT_BOL" zi="379" zo="524.67" ri="924.444" ro="989.055" w="498.6" eta="3" phi="7" RPCo="15" /> -<ABox n="MDT_BOL" zi="621" zo="838.754" ri="924.444" ro="989.055" w="498.6" eta="4" phi="1 2 3 4 5 6 7 8" RPCo="15" /> -<ABox n="MDT_BOL" zi="839" zo="1056.75" ri="924.444" ro="989.055" w="498.6" eta="5" phi="1 2 3 4 5 6 7 8" RPCo="15" /> -<ABox n="MDT_BOL" zi="1057" zo="1226.7" ri="924.444" ro="989.055" w="498.6" eta="6" phi="1 2 3 4 5 6 7 8" RPCo="15" /> -<ABox n="MDT_BOS" zi="1" zo="218.754" ri="1019.19" ro="1082.46" w="379.6" eta="1" phi="1 2 3 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="73" zo="218.67" ri="1019.19" ro="1082.46" w="379.6" eta="1" phi="4" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="219" zo="436.754" ri="1019.19" ro="1082.46" w="379.6" eta="2" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="437" zo="654.754" ri="1019.19" ro="1082.46" w="379.6" eta="3" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="655" zo="872.754" ri="1019.19" ro="1082.46" w="379.6" eta="4" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="873" zo="1090.75" ri="1019.19" ro="1082.46" w="379.6" eta="5" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BOS" zi="1091" zo="1284.73" ri="1019.19" ro="1082.46" w="379.6" eta="6" phi="1 2 3 4 5 8" dphi="22.5" RPCi="15" /> -<ABox n="MDT_BEE" zi="877.9" zo="1023.57" ri="433.023" ro="452.33" w="91.15" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BEE" zi="1023.9" zo="1169.57" ri="433.023" ro="452.33" w="91.15" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ABox n="MDT_BIR" zi="52" zo="143.607" ri="592.407" ro="634.021" w="267.15" eta="1" phi="6" sh="11.65" /> -<ABox n="MDT_BIR" zi="52" zo="143.607" ri="592.407" ro="634.021" w="267.15" eta="1" phi="8" sh="-11.65" /> -<ABox n="MDT_BIR" zi="200" zo="291.607" ri="596.1" ro="637.714" w="153.65" eta="2" phi="6" sh="68.4" /> -<ABox n="MDT_BIR" zi="200" zo="291.607" ri="596.1" ro="637.714" w="153.65" eta="2" phi="8" sh="-68.4" /> -<ABox n="MDT_BIR" zi="292" zo="392.617" ri="594.083" ro="635.697" w="110.55" eta="3" phi="6" sh="46.85" /> -<ABox n="MDT_BIR" zi="292" zo="392.617" ri="594.083" ro="635.697" w="110.55" eta="3" phi="8" sh="-46.85" /> -<ABox n="MDT_BIR" zi="394" zo="485.607" ri="596.1" ro="637.714" w="153.65" eta="4" phi="6" sh="68.4" /> -<ABox n="MDT_BIR" zi="394" zo="485.607" ri="596.1" ro="637.714" w="153.65" eta="4" phi="8" sh="-68.4" /> -<ABox n="MDT_BIR" zi="541" zo="614.586" ri="596.1" ro="637.714" w="153.65" eta="5" phi="6" sh="68.4" /> -<ABox n="MDT_BIR" zi="541" zo="614.586" ri="596.1" ro="637.714" w="153.65" eta="5" phi="8" sh="-68.4" /> -<ABox n="MDT_BIR" zi="616" zo="725.628" ri="594.083" ro="635.697" w="110.55" eta="6" phi="6" sh="46.85" /> -<ABox n="MDT_BIR" zi="616" zo="725.628" ri="594.083" ro="635.697" w="110.55" eta="6" phi="8" sh="-46.85" /> -<ABox n="MDT_BMF" zi="62.5" zo="280.254" ri="777.694" ro="841.705" w="309.6" eta="1" phi="6 7" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMF" zi="406" zo="599.726" ri="777.694" ro="841.705" w="309.6" eta="2" phi="6 7" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BMF" zi="728" zo="873.67" ri="777.694" ro="841.705" w="309.6" eta="3" phi="6 7" dphi="22.5" RPCi="15" RPCo="15" /> -<ABox n="MDT_BOF" zi="62.57" zo="280.324" ri="1028.19" ro="1093.06" w="379.6" eta="1" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOF" zi="405.46" zo="599.186" ri="1028.19" ro="1106.21" w="379.6" eta="2" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOF" zi="727.92" zo="873.59" ri="1028.19" ro="1107.41" w="379.6" eta="3" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOF" zi="1002.6" zo="1124.24" ri="1028.19" ro="1106.21" w="379.6" eta="4" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOG" zi="-60.821" zo="60.8208" ri="1028.19" ro="1093.06" w="379.6" eta="0" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOG" zi="282.07" zo="403.712" ri="1028.19" ro="1093.06" w="379.6" eta="1" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOG" zi="602.75" zo="724.392" ri="1028.19" ro="1093.06" w="379.6" eta="2" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOG" zi="877.14" zo="998.782" ri="1028.19" ro="1106.21" w="379.6" eta="3" phi="6 7" dphi="22.5" RPCo="15" /> -<ABox n="MDT_BOG" zi="1147.2" zo="1268.84" ri="1028.19" ro="1106.21" w="379.6" eta="4" phi="6 7" dphi="22.5" RPCo="15" /> -<ATrd n="MDT_EIL1" zi="749.146" zo="785.86" ri="207.6" ro="317.228" wi="132.15" wo="186.9" eta="1" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EIL2" zi="749.146" zo="785.86" ri="319.1" ro="428.728" wi="186.15" wo="240.9" eta="2" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EIL3" zi="749.146" zo="785.86" ri="427.23" ro="464.774" wi="207.15" wo="207.15" eta="3" phi="1 2 3 4 5 7" /> -<ATrd n="MDT_EIL3" zi="749.146" zo="785.86" ri="427.535" ro="465.079" wi="174.15" wo="174.15" eta="3" phi="6" sh="-16.5" /> -<ATrd n="MDT_EIL3" zi="749.146" zo="785.86" ri="427.535" ro="465.079" wi="174.15" wo="174.15" eta="3" phi="8" sh="16.5" /> -<ATrd n="MDT_EIL4" zi="745.796" zo="782.51" ri="472" ro="509.544" wi="153.65" wo="153.65" eta="4" phi="1 5" /> -<ATrd n="MDT_EIL4" zi="745.796" zo="782.51" ri="472" ro="635.691" wi="235.15" wo="316.9" eta="4" phi="2 3 7" /> -<ATrd n="MDT_EIL4" zi="745.796" zo="782.51" ri="473.105" ro="636.796" wi="165.15" wo="246.9" eta="4" phi="4" sh="35" /> -<ATrd n="MDT_EIL4" zi="745.796" zo="782.51" ri="511.445" ro="639.094" wi="128.15" wo="191.9" eta="4" phi="6" sh="-62.5" /> -<ATrd n="MDT_EIL4" zi="745.796" zo="782.51" ri="511.445" ro="639.094" wi="128.15" wo="191.9" eta="4" phi="8" sh="62.5" /> -<ATrd n="MDT_EIL5" zi="745.796" zo="782.51" ri="508.04" ro="635.689" wi="253.15" wo="316.9" eta="5" phi="1 5" /> -<ATrd n="MDT_EEL1" zi="1116.5" zo="1148.11" ri="651.3" ro="772.942" wi="336.15" wo="396.9" eta="1" phi="1 2 4 5 6 7 8" /> -<ATrd n="MDT_EEL1" zi="1066.09" zo="1097.7" ri="671.8" ro="817.47" wi="244.65" wo="288.3" eta="1" phi="3" /> -<ATrd n="MDT_EEL2" zi="1116.5" zo="1148.11" ri="774.97" ro="896.612" wi="396.15" wo="456.9" eta="2" phi="1 2 4 5 6 7 8" /> -<ATrd n="MDT_EES1" zi="1011.9" zo="1043.51" ri="589.3" ro="734.97" wi="201.45" wo="245.1" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EES2" zi="1011.9" zo="1043.51" ri="737" ro="858.642" wi="244.65" wo="281.1" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EML1" zi="1411.25" zo="1447.66" ri="177" ro="346.698" wi="118.65" wo="203.4" eta="1" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EML2" zi="1411.25" zo="1447.66" ri="348.5" ro="542.226" wi="202.65" wo="299.4" eta="2" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EML3" zi="1411.25" zo="1447.66" ri="544" ro="737.726" wi="298.65" wo="395.4" eta="3" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EML4" zi="1411.25" zo="1447.66" ri="739.5" ro="933.226" wi="394.65" wo="491.4" eta="4" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EML5" zi="1411.25" zo="1447.66" ri="935" ro="1128.73" wi="490.65" wo="587.4" eta="5" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EMS1" zi="1369.65" zo="1406.06" ri="177" ro="370.726" wi="83.55" wo="141.6" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EMS2" zi="1369.65" zo="1406.06" ri="372.5" ro="566.226" wi="141.15" wo="199.2" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EMS3" zi="1369.65" zo="1406.06" ri="568" ro="761.726" wi="198.75" wo="256.8" eta="3" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EMS4" zi="1369.65" zo="1406.06" ri="763.5" ro="957.226" wi="256.35" wo="314.4" eta="4" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EMS5" zi="1369.65" zo="1406.06" ri="959" ro="1152.73" wi="313.95" wo="372" eta="5" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOL1" zi="2124.25" zo="2160.66" ri="277" ro="446.698" wi="168.15" wo="252.9" eta="1" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOL2" zi="2124.25" zo="2160.66" ri="448.5" ro="618.198" wi="264.15" wo="348.9" eta="2" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOL3" zi="2124.25" zo="2160.66" ri="620" ro="765.67" wi="348.15" wo="420.9" eta="3" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOL4" zi="2124.25" zo="2160.66" ri="767.5" ro="913.17" wi="420.15" wo="492.9" eta="4" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOL5" zi="2124.25" zo="2160.66" ri="915" ro="1060.67" wi="492.15" wo="564.9" eta="5" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOL6" zi="2124.25" zo="2160.66" ri="1062.5" ro="1208.17" wi="564.15" wo="636.9" eta="6" phi="1 2 3 4 5 6 7 8" /> -<ATrd n="MDT_EOS1" zi="2165.85" zo="2202.26" ri="277" ro="446.698" wi="124.95" wo="175.8" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOS2" zi="2165.85" zo="2202.26" ri="448.5" ro="618.198" wi="175.35" wo="226.2" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOS3" zi="2165.85" zo="2202.26" ri="620" ro="789.698" wi="225.75" wo="276.6" eta="3" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOS4" zi="2165.85" zo="2202.26" ri="791.5" ro="937.17" wi="276.15" wo="319.8" eta="4" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOS5" zi="2165.85" zo="2202.26" ri="939" ro="1084.67" wi="319.35" wo="363" eta="5" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EOS6" zi="2165.85" zo="2202.26" ri="1086.5" ro="1232.17" wi="362.55" wo="406.2" eta="6" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="TGC_T1F1" zi="1327.15" zo="1334.15" ri="190" ro="397.54" wi="57.69" wo="112.34" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23" dphi="7.5" /> -<ATrd n="TGC_T1F1" zi="1345.05" zo="1352.05" ri="190" ro="397.54" wi="57.69" wo="112.34" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24" dphi="7.5" /> -<ATrd n="TGC_T1E1" zi="1345.05" zo="1359.95" ri="388" ro="1068.2" wi="64.49" wo="154.85" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47" dphi="3.75" /> -<ATrd n="TGC_T1E1" zi="1327.15" zo="1342.05" ri="388" ro="1068.2" wi="64.49" wo="154.85" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48" dphi="3.75" /> -<ATrd n="TGC_T2F1" zi="1460.05" zo="1464.42" ri="252.59" ro="432.15" wi="75.51" wo="122.78" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23" dphi="7.5" /> -<ATrd n="TGC_T2F1" zi="1475.55" zo="1479.92" ri="252.59" ro="432.15" wi="75.51" wo="122.78" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24" dphi="7.5" /> -<ATrd n="TGC_T2E1" zi="1475.55" zo="1485.42" ri="418.4" ro="1191.7" wi="68.47" wo="170.84" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47" dphi="3.75" /> -<ATrd n="TGC_T2E1" zi="1460.05" zo="1469.92" ri="418.4" ro="1191.7" wi="68.47" wo="170.84" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48" dphi="3.75" /> -<ATrd n="TGC_T3F1" zi="1502.05" zo="1506.42" ri="261" ro="440.56" wi="75.51" wo="122.79" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23" dphi="7.5" /> -<ATrd n="TGC_T3F1" zi="1517.55" zo="1521.92" ri="261" ro="440.56" wi="75.51" wo="122.79" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24" dphi="7.5" /> -<ATrd n="TGC_T3E1" zi="1517.55" zo="1527.42" ri="436.56" ro="1191.7" wi="70.84" wo="170.84" eta="1" phi="1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47" dphi="3.75" /> -<ATrd n="TGC_T3E1" zi="1502.05" zo="1511.92" ri="436.56" ro="1191.7" wi="70.84" wo="170.84" eta="1" phi="2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48" dphi="3.75" /> -<ATrd n="TGC_T4F1" zi="698.06" zo="702.43" ri="217" ro="443.4" wi="62.38" wo="121.99" eta="1" phi="1 3 4 6 7 9 10 12 13 15 16 18 19 21 22 24" dphi="7.5" /> -<ATrd n="TGC_T4F1" zi="693.04" zo="697.41" ri="217" ro="433.4" wi="62.38" wo="119.36" eta="1" phi="2 5 8 11 14 17 20 23" dphi="7.5" /> -<ATrd n="TGC_T4E1" zi="730.87" zo="735.24" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="1 4 7" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="2" dphi="-5.5" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="3 6" dphi="5.5" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="5 8" dphi="-5.5" /> -<ATrd n="TGC_T4E1" zi="730.87" zo="735.24" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="9 12" dphi="15" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="10" dphi="9.5" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="11 14" dphi="20.5" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="13" dphi="9.5" /> -<ATrd n="TGC_T4E1" zi="730.87" zo="735.24" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="15" dphi="15" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="16" dphi="35.5" /> -<ATrd n="TGC_T4E1" zi="730.87" zo="735.24" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="17" dphi="30" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="470" ro="619" wi="83.33" wo="108.09" eta="1" phi="18" dphi="24.5" /> -<ATrd n="TGC_T4E1" zi="730.87" zo="735.24" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="19" dphi="45" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="20" dphi="39.5" /> -<ATrd n="TGC_T4E1" zi="737.53" zo="741.9" ri="520" ro="619" wi="91.64" wo="108.09" eta="1" phi="21" dphi="50.5" /> -<ATrd n="MDT_EIS1" zi="707.746" zo="744.46" ri="207.6" ro="335.249" wi="89.85" wo="128.1" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="MDT_EIS2" zi="707.746" zo="744.46" ri="337.1" ro="446.728" wi="127.65" wo="160.5" eta="2" phi="1 2 3 4 5 6 7 8" dphi="22.5" /> -<ATrd n="CSC_CSS1" zi="708.102" zo="738.022" ri="86.6016" ro="207.832" wi="40.29" wo="75.7865" eta="1" phi="1 2 3 4 5 6 7 8" dphi="22.5" a="-11.587" /> -<ATrd n="CSC_CSL1" zi="744.539" zo="774.459" ri="92.0422" ro="206.732" wi="61.01" wo="117.027" eta="1" phi="1 2 3 4 5 6 7 8" a="-11.587" /> -<ABox n="MDT_BIM" zi="107" zo="216.628" ri="519.465" ro="561.079" w="153.65" eta="1" phi="6" sh="-56.6" /> -<ABox n="MDT_BIM" zi="107" zo="216.628" ri="519.465" ro="561.079" w="153.65" eta="1" phi="8" sh="56.6" /> -<ABox n="MDT_BIM" zi="217" zo="326.628" ri="519.465" ro="561.079" w="153.65" eta="2" phi="6" sh="-56.6" /> -<ABox n="MDT_BIM" zi="217" zo="326.628" ri="519.465" ro="561.079" w="153.65" eta="2" phi="8" sh="56.6" /> -<ABox n="MDT_BIM" zi="327" zo="436.628" ri="519.465" ro="561.079" w="153.65" eta="3" phi="6" sh="-56.6" /> -<ABox n="MDT_BIM" zi="327" zo="436.628" ri="519.465" ro="561.079" w="153.65" eta="3" phi="8" sh="56.6" /> -<ABox n="MDT_BIM" zi="437" zo="546.628" ri="519.465" ro="561.079" w="153.65" eta="4" phi="6" sh="-56.6" /> -<ABox n="MDT_BIM" zi="437" zo="546.628" ri="519.465" ro="561.079" w="153.65" eta="4" phi="8" sh="56.6" /> -<ABox n="MDT_BIM" zi="547" zo="656.628" ri="519.465" ro="561.079" w="153.65" eta="5" phi="6" sh="-56.6" /> -<ABox n="MDT_BIM" zi="547" zo="656.628" ri="519.465" ro="561.079" w="153.65" eta="5" phi="8" sh="56.6" /> -</AMuonGeometry> diff --git a/graphics/AtlantisJava/geometry/ATLAS_IDS.xml b/graphics/AtlantisJava/geometry/ATLAS_IDS.xml deleted file mode 100755 index 81f4d7c3a445..000000000000 --- a/graphics/AtlantisJava/geometry/ATLAS_IDS.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE IdDict SYSTEM "IdDict.dtd" [ - <!ENTITY InnerDetector SYSTEM "IdDictInnerDetector.xml"> - <!ENTITY LArCalorimeter SYSTEM "IdDictLArCalorimeter.xml"> - <!ENTITY TileCalorimeter SYSTEM "IdDictTileCalorimeter.xml"> - <!ENTITY Calorimeter SYSTEM "IdDictCalorimeter.xml"> - <!ENTITY MuonSpectrometer SYSTEM "IdDictMuonSpectrometer.xml"> - <!ENTITY ATLAS SYSTEM "IdDictATLAS.xml"> - <!ENTITY LArHighVoltage SYSTEM "IdDictLArHighVoltage.xml"> - <!ENTITY LArElectrode SYSTEM "IdDictLArElectrode.xml"> - <!ENTITY ForwardDetectors SYSTEM "IdDictForwardDetectors.xml"> -]> - -<IdDict IdDictVersion="v1"> - -&InnerDetector; -&LArCalorimeter; -&TileCalorimeter; -&Calorimeter; -&MuonSpectrometer; -&ATLAS; -&LArHighVoltage; -&LArElectrode; -&ForwardDetectors; - -</IdDict> - diff --git a/graphics/AtlantisJava/geometry/IdDict.dtd b/graphics/AtlantisJava/geometry/IdDict.dtd deleted file mode 100755 index 5077ec98a636..000000000000 --- a/graphics/AtlantisJava/geometry/IdDict.dtd +++ /dev/null @@ -1,118 +0,0 @@ -<?xml encoding="US-ASCII"?> - -<!-- IdDict: Identifier Dictionary - ========================== - - o This describes the possible identifier ranges. - - o One may describe several identifier dictionaries, each by a IdDictionary element. - A dictionary is identified by its name. - - o Each dictionary may describe : - - + individual identifier fields ("field"). - - - This is useful when the field values are individually labelled. - - purely numeric fields do not need to be explicitly - described, in which case, their possible ranges will be deduced from the defined - regions. - - + identifier regions ("region"). - - - they are the alternate identifier ranges for this dictionary. - - a region specifies a contiguous range of identifiers, complete for the dictionary. - - it may be labelled with a "name". - - it may also have a "tag" (see alternate regions) - - it contains the ordered list of fields with their explicit value range. - - each entry in this list may be - - a range assigned to a given field ("range") - - a reference to a subregion ("reference") (see below) - - a reference to a complete identifier domain ("identifiers") - - a list of alternative ranges which are differentiated according - to their tag ("alternate_ranges") - - + alternate regions ("alternate_regions"). - - - this contains two or more alternate region specifications - which are differentiated by their "tag". An empty tag is - default. This allows at generation time to select a specific - tag. - - + subregions ("subregion") - - - A subregion speficies a contiguous range of identifiers, describing a - subset of the identifier fields in the dictionary. - - it must identified by a name. - - the role of subregions is to be referenced by regions, and they typically describe - the parts that are common to several regions. - ---> - - - -<!ENTITY % DTD_constraint 'IdDictVersion ( v1 ) #REQUIRED'> - -<!ELEMENT IdDict ( IdDictionary )* > -<!ATTLIST IdDict - %DTD_constraint;> - -<!ELEMENT IdDictionary ( field | subregion | region | alternate_regions )* > -<!ATTLIST IdDictionary - name ID #REQUIRED - version CDATA #IMPLIED - date CDATA #IMPLIED - author CDATA #IMPLIED> - - -<!ELEMENT field ( label )* > -<!ATTLIST field - name CDATA #REQUIRED > - -<!ELEMENT label EMPTY> -<!ATTLIST label - name CDATA #REQUIRED - value CDATA #IMPLIED> - -<!ELEMENT alternate_regions ( region )* > -<!ATTLIST alternate_regions - name CDATA #IMPLIED> - -<!ELEMENT region ( range | reference | dictionary )* > -<!ATTLIST region - name CDATA #IMPLIED - group CDATA #IMPLIED - tag CDATA #IMPLIED - next_abs_eta CDATA #IMPLIED - prev_samp CDATA #IMPLIED - next_samp CDATA #IMPLIED - prev_subdet CDATA #IMPLIED - next_subdet CDATA #IMPLIED - eta0 CDATA #IMPLIED - deta CDATA #IMPLIED - phi0 CDATA #IMPLIED - dphi CDATA #IMPLIED> - -<!ELEMENT range EMPTY> -<!ATTLIST range - field CDATA #REQUIRED - value CDATA #IMPLIED - minvalue CDATA #IMPLIED - maxvalue CDATA #IMPLIED - values CDATA #IMPLIED - prev_value CDATA #IMPLIED - next_value CDATA #IMPLIED - wraparound (TRUE | false) "false"> - -<!ELEMENT reference EMPTY> -<!ATTLIST reference - subregion IDREF #REQUIRED> - -<!ELEMENT dictionary EMPTY> -<!ATTLIST dictionary - name IDREF #REQUIRED> - -<!ELEMENT subregion ( range | reference | dictionary )* > -<!ATTLIST subregion - name ID #REQUIRED> - - diff --git a/graphics/AtlantisJava/geometry/IdDictATLAS.xml b/graphics/AtlantisJava/geometry/IdDictATLAS.xml deleted file mode 100755 index 95314ee2c0db..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictATLAS.xml +++ /dev/null @@ -1,56 +0,0 @@ - -<IdDictionary name="ATLAS"> - - <field name="subdet"> - <label name="InnerDetector" value="2" /> - <label name="LArCalorimeter" value="4" /> - <label name="TileCalorimeter" value="5" /> - <label name="MuonSpectrometer" value="7" /> - <label name="Calorimeter" value="10" /> - <label name="LArHighVoltage" value="11" /> - <label name="LArElectrode" value="12" /> - <label name="ForwardDetectors" value="13" /> - </field> - - <region> - <range field="subdet" value="InnerDetector" /> - <dictionary name="InnerDetector" /> - </region> - - <region> - <range field="subdet" value="LArCalorimeter" /> - <dictionary name="LArCalorimeter" /> - </region> - - <region> - <range field="subdet" value="TileCalorimeter" /> - <dictionary name="TileCalorimeter" /> - </region> - - <region> - <range field="subdet" value="MuonSpectrometer" /> - <dictionary name="MuonSpectrometer" /> - </region> - - <region> - <range field="subdet" value="Calorimeter" /> - <dictionary name="Calorimeter" /> - </region> - - <region> - <range field="subdet" value="LArHighVoltage" /> - <dictionary name="LArHighVoltage" /> - </region> - - <region> - <range field="subdet" value="LArElectrode" /> - <dictionary name="LArElectrode" /> - </region> - - <region> - <range field="subdet" value="ForwardDetectors" /> - <dictionary name="ForwardDetectors" /> - </region> - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictCalorimeter.xml b/graphics/AtlantisJava/geometry/IdDictCalorimeter.xml deleted file mode 100755 index f94f801d91ea..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictCalorimeter.xml +++ /dev/null @@ -1,731 +0,0 @@ - -<IdDictionary name="Calorimeter" > - - -<field name="DetZside" > - <label name="negative_DMTile_side" value="-5" /> - <label name="negative_DMLar_side" value="-4" /> - <label name="negative_eta_side" value="-2" /> - <label name="negative_lvl1_side" value="-1" /> - <label name="positive_lvl1_side" value="+1" /> - <label name="positive_eta_side" value="+2" /> - <label name="positive_DMLar_side" value="+4" /> - <label name="positive_DMTile_side" value="+5" /> -</field> - - -<!-- Dead Material Types --> -<!-- xxxxxxxxxxxxxxxxxxxx --> - -<!-- 3 types of LAr Dead Material --> - - <subregion name="DMLArOutside" > - <range field="DetZside" values="negative_DMLar_side positive_DMLar_side" /> - <range field="DMvalue" value="1" /> - </subregion> - - <subregion name="DMLarInside" > - <range field="DetZside" values="negative_DMLar_side positive_DMLar_side" /> - <range field="DMvalue" value="2" /> - </subregion> - - <subregion name="DMLArBeamTest"> - <range field="DetZside" values="negative_DMLar_side positive_DMLar_side" /> - <range field="DMvalue" value="3" /> - </subregion> - -<!-- 2 types of Tile Dead Material --> - - <subregion name="DMTileOutside" > - <range field="DetZside" values="negative_DMTile_side positive_DMTile_side" /> - <range field="DMvalue" value="1" /> - </subregion> - - <subregion name="DMTileDefHits" > - <range field="DetZside" values="negative_DMTile_side positive_DMTile_side" /> - <range field="DMvalue" value="2" /> - </subregion> - - <subregion name="DMTileBeamTest" > - <range field="DetZside" values="negative_DMTile_side positive_DMTile_side" /> - <range field="DMvalue" value="3" /> - </subregion> - - - -<!-- Dead Material Phi regions --> -<!-- xxxxxxxxxxxxxxxxxxxxxxxxxx --> - -<!-- 3 types of Phi region --> - - <subregion name="DMPhi-1" > - <range field="phivalue" minvalue="0" maxvalue="63" wraparound="TRUE" /> - </subregion> - - <subregion name="DMPhi-2" > - <range field="phivalue" minvalue="0" maxvalue="31" wraparound="TRUE" /> - </subregion> - - <subregion name="DMPhi-3" > - <range field="phivalue" value="0" wraparound="TRUE" /> - </subregion> - - - -<!-- LAr DM Samplings --> -<!-- xxxxxxxxxxxxxxxxx --> - - -<!-- 4 sampling region: 0 to 3 --> - - <subregion name="DMLArSampling-0" > - <range field="samplingvalue" value="0" /> - </subregion> - - <subregion name="DMLArSampling-1" > - <range field="samplingvalue" value="1" /> - </subregion> - - <subregion name="DMLArSampling-2" > - <range field="samplingvalue" value="2" /> - </subregion> - - <subregion name="DMLArSampling-3" > - <range field="samplingvalue" value="3" /> - </subregion> - - -<!-- Tile DM Samplings --> -<!-- xxxxxxxxxxxxxxxxx --> - - -<!-- 4 sampling region: 0 to 3 --> - - - <subregion name="DMTileSampling-0" > - <range field="samplingvalue" value="0" /> - </subregion> - - <subregion name="DMTileSampling-1" > - <range field="samplingvalue" value="1" /> - </subregion> - - <subregion name="DMTileSampling-2" > - <range field="samplingvalue" value="2" /> - </subregion> - - <subregion name="DMTileSampling-3" > - <range field="samplingvalue" value="3" /> - </subregion> - - - -<!-- LAr DM regions --> -<!-- xxxxxxxxxxxxxx --> - -<!-- type 1, sampling 0, regions 0 to 5 --> - - <region group="DM_Reg" name="DM_4_1_0_0" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" minvalue="0" maxvalue="5" /> - <range field="DMEta" minvalue="0" maxvalue="49" /> - <reference subregion="DMPhi-1" /> - </region> - -<!-- type 1, sampling 1, region 0 to 7--> - - <region group="DM_Reg" name="DM_4_1_1_0" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="14" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_1" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="14" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_2" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="15" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_3" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="15" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_4" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="4" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_5" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="2" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_6" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="6" /> - <range field="DMEta" minvalue="0" maxvalue="18" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_1_7" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="7" /> - <range field="DMEta" minvalue="0" maxvalue="17" /> - <reference subregion="DMPhi-1" /> - </region> - -<!-- type 1, sampling 2, region 0 to 5--> - - <region group="DM_Reg" name="DM_4_1_2_0" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_2_1" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_2_2" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="4" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_2_3" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="17" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_2_4" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="4" /> - <range field="DMEta" minvalue="0" maxvalue="17" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_2_5" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="6" /> - <reference subregion="DMPhi-1" /> - </region> - - -<!-- type 1, sampling 3, region 0 to 2--> - - <region group="DM_Reg" name="DM_4_1_3_0" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="32" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_3_1" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="14" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_1_3_2" > - <reference subregion="DMLArOutside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="2" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-3" /> - </region> - - -<!-- type 2, sampling [0,3], region 0 to 5--> - - <region group="DM_Reg" name="DM_4_2_0_0" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="0" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_0_1" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="1" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - - <region group="DM_Reg" name="DM_4_2_0_2" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_0_3" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_0_4" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="4" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_0_5" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-0" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="19" /> - <reference subregion="DMPhi-1" /> - </region> - - - <region group="DM_Reg" name="DM_4_2_1_0" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="0" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_1_1" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="1" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_1_2" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_1_3" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_1_4" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="4" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_1_5" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-1" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="19" /> - <reference subregion="DMPhi-1" /> - </region> - - - <region group="DM_Reg" name="DM_4_2_2_0" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="0" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_2_1" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="1" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_2_2" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_2_3" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_2_4" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="4" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_2_5" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-2" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="19" /> - <reference subregion="DMPhi-1" /> - </region> - - - <region group="DM_Reg" name="DM_4_2_3_0" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="0" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_3_1" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="1" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_3_2" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_3_3" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="3" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-2" /> - </region> - - <region group="DM_Reg" name="DM_4_2_3_4" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="4" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_4_2_3_5" > - <reference subregion="DMLarInside" /> - <reference subregion="DMLArSampling-3" /> - <range field="DMregion" value="5" /> - <range field="DMEta" minvalue="0" maxvalue="19" /> - <reference subregion="DMPhi-1" /> - </region> - - -<!-- TILE DM regions --> -<!-- xxxxxxxxxxxxxxx --> - -<!-- type 1, sampling 0, region 0 to 1 --> - - <region group="DM_Reg" name="DM_5_1_0_0" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-0" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="9" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_5_1_0_1" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-0" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="4" /> - <reference subregion="DMPhi-1" /> - </region> - -<!-- type 1, sampling 1, region 0 to 2 --> - - <region group="DM_Reg" name="DM_5_1_1_0" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-1" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_5_1_1_1" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-1" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="2" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_5_1_1_2" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-1" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="3" /> - <reference subregion="DMPhi-1" /> - </region> - - -<!-- type 1, sampling 2, region 0 to 2 --> - - <region group="DM_Reg" name="DM_5_1_2_0" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-2" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="7" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_5_1_2_1" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-2" /> - <range field="DMregion" value="1" /> - <range field="DMEta" minvalue="0" maxvalue="4" /> - <reference subregion="DMPhi-1" /> - </region> - - <region group="DM_Reg" name="DM_5_1_2_2" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-2" /> - <range field="DMregion" value="2" /> - <range field="DMEta" minvalue="0" maxvalue="1" /> - <reference subregion="DMPhi-1" /> - </region> - -<!-- type 1, sampling 3, region 0 --> - - <region group="DM_Reg" name="DM_5_1_3_0" > - <reference subregion="DMTileOutside" /> - <reference subregion="DMTileSampling-3" /> - <range field="DMregion" value="0" /> - <range field="DMEta" minvalue="0" maxvalue="16" /> - <reference subregion="DMPhi-1" /> - </region> - -<!-- type 2, sampling 0, region 0 --> - - <region group="DM_Reg" name="DM_5_2_0_0" > - <reference subregion="DMTileDefHits" /> - <reference subregion="DMTileSampling-0" /> - <range field="DMregion" value="0" /> - <range field="DMEta" value="0" /> - <reference subregion="DMPhi-3" /> - </region> - - -<!-- LVL1 part --> -<!-- xxxxxxxxxxxxxxxxx --> - - <field name="LVL1sampling" > - <label name="EM" value="0" /> - <label name="Hadronic" value="1" /> - </field> - - <subregion name="LVL1" > - <range field="DetZside" values="negative_lvl1_side positive_lvl1_side" /> - <range field="LVL1sampling" values="EM Hadronic" /> - </subregion> - - - <region group="Reg_Lvl1" name="Lvl1_0" > - <reference subregion="LVL1" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="24" /> - <range field="phi" minvalue="0" maxvalue="63" wraparound="TRUE" /> - <range field="layer" minvalue="0" maxvalue="3" /> - </region> - - <region group="Reg_Lvl1" name="Lvl1_1" > - <reference subregion="LVL1" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="2" /> - <range field="phi" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer" minvalue="0" maxvalue="3" /> - </region> - - <region group="Reg_Lvl1" name="Lvl1_2" > - <reference subregion="LVL1" /> - <range field="region" value="2" /> - <range field="eta" value="0" /> - <range field="phi" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer" minvalue="0" maxvalue="3" /> - </region> - - - <region group="Reg_Lvl1" name="Lvl1_3" > - <reference subregion="LVL1" /> - <range field="region" value="3" /> - <range field="eta" minvalue="0" maxvalue="3"/> - <range field="phi" minvalue="0" maxvalue="15" wraparound="TRUE" /> - <range field="layer" minvalue="0" maxvalue="1" /> - </region> - - - -<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --> -<!-- Online L1 Trigger Tower regions --> -<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --> - - -<!-- Fields used to describe a TTower --> - - <field name="barrel_endcap_fcal" > - <label name="barrel" value="0" /> - <label name="endcap" value="1" /> - <label name="fcal" value="2" /> - </field> - - <field name="em_had" > - <label name="em" value="0" /> - <label name="had" value="1" /> - </field> - - -<!-- Subregion definition --> - - <subregion name="OnlineL1-barrel" > - <range field="DetZside" values="negative_eta_side positive_eta_side" /> - <range field="barrel_endcap_fcal" value="barrel" /> - </subregion> - - <subregion name="OnlineL1-endcap" > - <range field="DetZside" values="negative_eta_side positive_eta_side" /> - <range field="barrel_endcap_fcal" value="endcap" /> - </subregion> - - <subregion name="OnlineL1-fcal" > - <range field="DetZside" values="negative_eta_side positive_eta_side" /> - <range field="barrel_endcap_fcal" value="fcal" /> - </subregion> - - -<!-- Online L1 EM-Barrel --> -<!-- xxxxxxxxxxxxxxxxxxxx --> - -<region group="Online_L1" name="l1_barrel" > - <reference subregion="OnlineL1-barrel" /> - <range field="em_had" value="em" /> - <range field="tower_eta" minvalue="1" maxvalue="15" /> - <range field="tower_phi" minvalue="1" maxvalue="64" /> - <range field="tower_layer" minvalue="0" maxvalue="3" /> - </region> - - -<!-- Online L1 EM Endcap --> -<!-- xxxxxxxxxxxxxxxxxxxx --> - -<region group="Online_L1" name="l1_emec_region1" > - <reference subregion="OnlineL1-endcap" /> - <range field="em_had" value="em" /> - <range field="tower_eta" minvalue="1" maxvalue="11" /> - <range field="tower_phi" minvalue="1" maxvalue="64" /> - <range field="tower_layer" minvalue="0" maxvalue="3" /> -</region> - -<region group="Online_L1" name="l1_emec_region2" > - <reference subregion="OnlineL1-endcap" /> - <range field="em_had" value="em" /> - <range field="tower_eta" minvalue="12" maxvalue="15" /> - <range field="tower_phi" minvalue="1" maxvalue="32" /> - <range field="tower_layer" minvalue="0" maxvalue="3" /> -</region> - -<!-- Online L1 HEC Endcap --> -<!-- xxxxxxxxxxxxxxxxxxxxx --> - -<region group="Online_L1" name="l1_hec_region1" > - <reference subregion="OnlineL1-endcap" /> - <range field="em_had" value="had" /> - <range field="tower_eta" minvalue="2" maxvalue="11" /> - <range field="tower_phi" minvalue="1" maxvalue="64" /> - <range field="tower_layer" minvalue="0" maxvalue="3" /> -</region> - -<region group="Online_L1" name="l1_hec_region2" > - <reference subregion="OnlineL1-endcap" /> - <range field="em_had" value="had" /> - <range field="tower_eta" minvalue="12" maxvalue="15" /> - <range field="tower_phi" minvalue="1" maxvalue="32" /> - <range field="tower_layer" minvalue="0" maxvalue="3" /> -</region> - - -<!-- Online L1 FCAL --> -<!-- xxxxxxxxxxxxxxx --> - -<region group="Online_L1" name="l1_fcal_em" > - <reference subregion="OnlineL1-fcal" /> - <range field="em_had" value="em" /> - <range field="tower_eta" minvalue="1" maxvalue="4" /> - <range field="tower_phi" minvalue="1" maxvalue="16" /> - <range field="tower_layer" value="0" /> -</region> - -<region group="Online_L1" name="l1_fcal_had" > - <reference subregion="OnlineL1-fcal" /> - <range field="em_had" value="had" /> - <range field="tower_eta" minvalue="1" maxvalue="4" /> - <range field="tower_phi" minvalue="1" maxvalue="16" /> - <range field="tower_layer" minvalue="0" maxvalue="1" /> -</region> - - -</IdDictionary> diff --git a/graphics/AtlantisJava/geometry/IdDictForwardDetectors.xml b/graphics/AtlantisJava/geometry/IdDictForwardDetectors.xml deleted file mode 100644 index 588eb81db1c6..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictForwardDetectors.xml +++ /dev/null @@ -1,140 +0,0 @@ - - -<!-- - - The ForwardDetectors identifier is arranged as follows - - ForwardDetectors - part=BCM - <to be defined> - - part=BCM_Online - <to be defined> - - part=LUCID - <to be defined> - - part=LUCID_Online - <to be defined> - - part=ZDC - side module type channel - - part=ZDC_Online - side module type channel gain delay - - --> - -<IdDictionary name="ForwardDetectors" > - - <!-- - Start by defining some symbolic labels used for some fields - (other fields will be specified by numeric ranges) - --> - - <field name="part" > - <label name="ALFA" value="1" /> - <label name="ALFA_Online" value="2" /> - <label name="BCM" value="3" /> - <label name="BCM_Online" value="4" /> - <label name="LUCID" value="5" /> - <label name="LUCID_Online" value="6" /> - <label name="ZDC" value="7" /> - <label name="ZDC_Online" value="8" /> - <label name="Extra" value="9" /> - <label name="Extra_Online" value="10" /> - </field> - - <field name="side"> - <label name="negative" value="-1" /> - <label name="positive" value="+1" /> - </field> - - - <!-- - - ALFA - to do - - --> - - <region group="ALFA" name = "alfa"> - <range field="part" value="ALFA" /> - </region> - - <region group="ALFA_Online" name = "alfa"> - <range field="part" value="ALFA_Online" /> - </region> - - <!-- - - BCM - to do - - --> - - <region group="BCM" name = "bcm"> - <range field="part" value="BCM" /> - </region> - - <region group="BCM_Online" name = "bcm"> - <range field="part" value="BCM_Online" /> - </region> - - <!-- - - LUCID - to do - - --> - - <region group="LUCID" name = "lucid"> - <range field="part" value="LUCID" /> - </region> - - <region group="LUCID_Online" name = "lucid"> - <range field="part" value="LUCID_Online" /> - </region> - - <!-- - - ZDC - - --> - - <!-- ZDC - offline --> - - <region group="ZDC" name = "zdc"> - <range field="part" value="ZDC" /> - <range field="side" values="negative positive"/> - <range field="module" minvalue="0" maxvalue="3"/> - <range field="type" minvalue="0" maxvalue="1" /> - <range field="channel" minvalue="0" maxvalue="63" /> - </region> - - <!-- ZDC - online --> - - <region group="ZDC_Online" name = "zdc_online"> - <range field="part" value="ZDC_Online" /> - <range field="side" values="negative positive"/> - <range field="module" minvalue="0" maxvalue="3"/> - <range field="type" minvalue="0" maxvalue="1" /> - <range field="channel" minvalue="0" maxvalue="63" /> - <range field="gain" minvalue="0" maxvalue="1" /> - <range field="delay" minvalue="0" maxvalue="1" /> - </region> - - <!-- - - EXTRA - to do - - --> - - <region group="EXTRA" name = "extra"> - <range field="part" value="Extra" /> - </region> - - <region group="EXTRA_Online" name = "extra"> - <range field="part" value="Extra_Online" /> - </region> - - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictInnerDetector.xml b/graphics/AtlantisJava/geometry/IdDictInnerDetector.xml deleted file mode 100755 index 98c405c193ab..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictInnerDetector.xml +++ /dev/null @@ -1,559 +0,0 @@ - - -<!-- - - The InnerDetector identifier is arranged as follows - - InnerDetector - part=Pixel - side=barrel - layer phi_module eta_module phi_index eta_index - side=endcap - disk phi_module eta_module phi_index eta_index - - part=SCT - side=barrel - layer phi_module eta_module side strip - side=endcap - disk phi_module eta_module side strip - - part=TRT - side=barrel - layer phi_module straw_layer straw - side=endcap - wheel phi_module straw_layer straw - - - --> - -<IdDictionary name="InnerDetector" > - - <!-- - Start by defining some symbolic labels used for some fields - (other fields will be specified by numeric ranges) - --> - - <field name="part" > - <label name="Pixel" value="1" /> - <label name="SCT" value="2" /> - <label name="TRT" value="3" /> - </field> - - <field name="barrel_endcap"> - <label name="negative_endcap" value="-2" /> - <label name="negative_barrel" value="-1" /> - <label name="barrel" value="0" /> - <label name="positive_barrel" value="+1" /> - <label name="positive_endcap" value="+2" /> - </field> - - - - <!-- - - Pixel - - --> - - <!-- Dummy region: This forces the bit packing to be the same for all layouts --> - - <region group="pixel" name = "dummy"> - <range field="part" value="Pixel" /> - <range field="barrel_endcap" values="negative_endcap barrel positive_endcap"/> - <range field="layer" minvalue="0" maxvalue="2"/> - <range field="phi_module" minvalue="0" maxvalue="51" /> - <range field="eta_module" minvalue="-6" maxvalue="+6" /> - <range field="phi_index" minvalue="0" maxvalue="327" /> - <range field="eta_index" minvalue="0" maxvalue="191" /> - </region> - - - <!-- - Define few subregions which are re-used in several id-ranges. - --> - - <subregion name="pixel_barrel"> - <range field="part" value="Pixel" /> - <range field="barrel_endcap" value="barrel" /> - </subregion> - - <subregion name="pixel_endcap"> - <range field="part" value="Pixel" /> - <range field="barrel_endcap" values="negative_endcap positive_endcap" /> - </subregion> - - <subregion name="pixel_default_eta_module"> - <range field="phi_index" minvalue="0" maxvalue="327" /> - <range field="eta_index" minvalue="0" maxvalue="143" /> - </subregion> - - <subregion name="pixel_phi_barrel_module"> - <range field="eta_module" minvalue="-6" maxvalue="+6" /> - <reference subregion="pixel_default_eta_module" /> - </subregion> - - <subregion name="pixel_phi_endcap_module"> - <range field="eta_module" value="0" /> - <reference subregion="pixel_default_eta_module" /> - </subregion> - - <!-- - Then enumerate all the possible regions of the Pixel subdetector. - Each region corresponds to an identifier range. - --> - - <!-- - The follow region is the pixel b-layer. Normally, the correct - phi_index max should be 319, but we set it to 327 as for the other - layers to allow to calculate the pixel_id from SiDigit, i.e. using - the G3 numbering which is not completely correct. This should be a - temporary fix. Correct specif: - <range field="phi_index" minvalue="0" maxvalue="319" /> - --> - <alternate_regions> - <region group="pixel" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="21" wraparound="TRUE" /> - <range field="eta_module" minvalue="-6" maxvalue="+6" /> - <range field="phi_index" minvalue="0" maxvalue="327" /> - <range field="eta_index" minvalue="0" maxvalue="191" /> - </region> - <region group="pixel" tag="initial_layout" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="21" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - <region group="pixel" tag="final_layout" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="21" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - <region group="pixel" tag="destaged_layout" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="21" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - </alternate_regions> - - <alternate_regions> - <region group="pixel" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="1" /> - <range field="phi_module" minvalue="0" maxvalue="37" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - <region group="pixel" tag="initial_layout" /> - <region group="pixel" tag="final_layout" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="1" /> - <range field="phi_module" minvalue="0" maxvalue="37" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - <region group="pixel" tag="destaged_layout" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="1" /> - <range field="phi_module" minvalue="0" maxvalue="37" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - </alternate_regions> - - <region group="pixel" > - <reference subregion="pixel_barrel" /> - <range field="layer" value="2" /> - <range field="phi_module" minvalue="0" maxvalue="51" wraparound="TRUE" /> - <reference subregion="pixel_phi_barrel_module" /> - </region> - - <alternate_regions> - <region group="pixel" > - <reference subregion="pixel_endcap" /> - <range field="disk" minvalue="0" maxvalue="2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="pixel_phi_endcap_module" /> - </region> - <region group="pixel" tag="initial_layout" > - <reference subregion="pixel_endcap" /> - <range field="disk" values="0 2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="pixel_phi_endcap_module" /> - </region> - <region group="pixel" tag="final_layout" > - <reference subregion="pixel_endcap" /> - <range field="disk" minvalue="0" maxvalue="2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="pixel_phi_endcap_module" /> - </region> - <region group="pixel" tag="destaged_layout" > - <reference subregion="pixel_endcap" /> - <range field="disk" minvalue="0" maxvalue="2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="pixel_phi_endcap_module" /> - </region> - </alternate_regions> - - - - <!-- - - SCT - - --> - - - <subregion name="SCT_barrel"> - <range field="part" value="SCT" /> - <range field="barrel_endcap" value="barrel" /> - </subregion> - - <subregion name="SCT_endcap"> - <range field="part" value="SCT" /> - <range field="barrel_endcap" values="negative_endcap positive_endcap" /> - </subregion> - - <subregion name="SCT_eta_module"> - <range field="side" minvalue="0" maxvalue="1" /> - <range field="strip" minvalue="0" maxvalue="767" /> - </subregion> - - - - - <subregion name="SCT_phi_negative_barrel_module"> - <range field="eta_module" minvalue="-6" maxvalue="-1" next_value="1" /> - <reference subregion="SCT_eta_module" /> - </subregion> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <reference subregion="SCT_phi_negative_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="1" /> - <range field="phi_module" minvalue="0" maxvalue="39" wraparound="TRUE" /> - <reference subregion="SCT_phi_negative_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="SCT_phi_negative_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="3" /> - <range field="phi_module" minvalue="0" maxvalue="55" wraparound="TRUE"/> - <reference subregion="SCT_phi_negative_barrel_module" /> - </region> - - - - - - <subregion name="SCT_phi_positive_barrel_module"> - <range field="eta_module" minvalue="+1" maxvalue="+6" prev_value="-1" /> - <reference subregion="SCT_eta_module" /> - </subregion> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="0" /> - <range field="phi_module" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <reference subregion="SCT_phi_positive_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="1" /> - <range field="phi_module" minvalue="0" maxvalue="39" wraparound="TRUE" /> - <reference subregion="SCT_phi_positive_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="2" /> - <range field="phi_module" minvalue="0" maxvalue="47" wraparound="TRUE" /> - <reference subregion="SCT_phi_positive_barrel_module" /> - </region> - - <region group="sct" > - <reference subregion="SCT_barrel" /> - <range field="layer" value="3" /> - <range field="phi_module" minvalue="0" maxvalue="55" wraparound="TRUE" /> - <reference subregion="SCT_phi_positive_barrel_module" /> - </region> - - <subregion name="SCT_ring_0"> - <range field="phi_module" minvalue="0" maxvalue="51" wraparound="TRUE" /> - <range field="eta_module" value="0" /> - <reference subregion="SCT_eta_module" /> - </subregion> - - <subregion name="SCT_ring_1"> - <range field="phi_module" minvalue="0" maxvalue="39" wraparound="TRUE" /> - <range field="eta_module" value="1" /> - <reference subregion="SCT_eta_module" /> - </subregion> - - <subregion name="SCT_ring_1_2"> - <range field="phi_module" minvalue="0" maxvalue="39" wraparound="TRUE" /> - <range field="eta_module" minvalue="1" maxvalue="2" /> - <reference subregion="SCT_eta_module" /> - </subregion> - - <region group="sct" name="SCT_endcap_ring0_disks08"> - <reference subregion="SCT_endcap" /> - <range field="disk" minvalue="0" maxvalue="8" /> - <reference subregion="SCT_ring_0" /> - </region> - - - <region group="sct" name="SCT_endcap_ring1_disk0"> - <reference subregion="SCT_endcap" /> - <range field="disk" value="0" /> - <reference subregion="SCT_ring_1" /> - </region> - - <region group="sct" name="SCT_endcap_rings12_disks15"> - <reference subregion="SCT_endcap" /> - <range field="disk" minvalue="1" maxvalue="5" /> - <reference subregion="SCT_ring_1_2" /> - </region> - - <region group="sct" name="SCT_endcap_ring1_disks67"> - <reference subregion="SCT_endcap" /> - <range field="disk" minvalue="6" maxvalue="7" /> - <reference subregion="SCT_ring_1" /> - </region> - - <!-- - - TRT - - --> - - <subregion name="TRT_barrel"> - <range field="part" value="TRT" /> - <range field="barrel_endcap" values="negative_barrel positive_barrel" /> - </subregion> - - <subregion name="TRT_endcap"> - <range field="part" value="TRT" /> - <range field="barrel_endcap" values="negative_endcap positive_endcap" /> - </subregion> - - - - <subregion name="TRT_layer_0"> - <reference subregion="TRT_barrel" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" value="0" /> - </subregion> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" value="0" /> - <range field="straw" minvalue="0" maxvalue="14" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" minvalue="1" maxvalue="4" /> - <range field="straw" minvalue="0" maxvalue="15" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" minvalue="5" maxvalue="9" /> - <range field="straw" minvalue="0" maxvalue="16" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" minvalue="10" maxvalue="14" /> - <range field="straw" minvalue="0" maxvalue="17" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" minvalue="15" maxvalue="17" /> - <range field="straw" minvalue="0" maxvalue="18" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_0" /> - <range field="straw_layer" value="18" /> - <range field="straw" minvalue="0" maxvalue="17" /> - </region> - - - - - - <subregion name="TRT_layer_1"> - <reference subregion="TRT_barrel" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" value="1" /> - </subregion> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" value="0" /> - <range field="straw" minvalue="0" maxvalue="18" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" minvalue="1" maxvalue="5" /> - <range field="straw" minvalue="0" maxvalue="19" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" minvalue="6" maxvalue="10" /> - <range field="straw" minvalue="0" maxvalue="20" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" minvalue="11" maxvalue="15" /> - <range field="straw" minvalue="0" maxvalue="21" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" minvalue="16" maxvalue="20" /> - <range field="straw" minvalue="0" maxvalue="22" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" minvalue="21" maxvalue="22" /> - <range field="straw" minvalue="0" maxvalue="23" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_1" /> - <range field="straw_layer" value="23" /> - <range field="straw" minvalue="0" maxvalue="22" /> - </region> - - - - - - <subregion name="TRT_layer_2"> - <reference subregion="TRT_barrel" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" value="2" /> - </subregion> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" value="0" /> - <range field="straw" minvalue="0" maxvalue="22" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="1" maxvalue="4" /> - <range field="straw" minvalue="0" maxvalue="23" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="5" maxvalue="9" /> - <range field="straw" minvalue="0" maxvalue="24" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="10" maxvalue="14" /> - <range field="straw" minvalue="0" maxvalue="25" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="15" maxvalue="19" /> - <range field="straw" minvalue="0" maxvalue="26" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="20" maxvalue="24" /> - <range field="straw" minvalue="0" maxvalue="27" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" minvalue="25" maxvalue="28" /> - <range field="straw" minvalue="0" maxvalue="28" /> - </region> - - <region group="trt" > - <reference subregion="TRT_layer_2" /> - <range field="straw_layer" value="29" /> - <range field="straw" minvalue="0" maxvalue="27" /> - </region> - - - - - <region group="trt" > - <reference subregion="TRT_endcap" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" minvalue="0" maxvalue="5" /> - <range field="straw_layer" minvalue="0" maxvalue="15" /> - <range field="straw" minvalue="0" maxvalue="23" /> - </region> - - <region group="trt" > - <reference subregion="TRT_endcap" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" minvalue="6" maxvalue="13" /> - <range field="straw_layer" minvalue="0" maxvalue="7" /> - <range field="straw" minvalue="0" maxvalue="23" /> - </region> - - <alternate_regions> - <region group="trt" > - <reference subregion="TRT_endcap" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" minvalue="14" maxvalue="17" /> - <range field="straw_layer" minvalue="0" maxvalue="15" /> - <range field="straw" minvalue="0" maxvalue="17" /> - </region> - <region group="trt" tag="initial_layout" /> - <region group="trt" tag="final_layout" > - <reference subregion="TRT_endcap" /> - <range field="phi_sector" minvalue="0" maxvalue="31" wraparound="TRUE" /> - <range field="layer_or_wheel" minvalue="14" maxvalue="17" /> - <range field="straw_layer" minvalue="0" maxvalue="15" /> - <range field="straw" minvalue="0" maxvalue="17" /> - </region> - <region group="trt" tag="destaged_layout" /> - </alternate_regions> - - <!-- Dummy region: This forces the bit packing to be the same for all layouts --> - - <region group="trt" name = "dummy"> - <range field="part" value="TRT" /> - <range field="barrel_endcap" values="negative_endcap negative_barrel positive_barrel positive_endcap"/> - <range field="phi_sector" minvalue="0" maxvalue="31" /> - <range field="layer_or_wheel" minvalue="0" maxvalue="17" /> - <range field="straw_layer" minvalue="0" maxvalue="29" /> - <range field="straw" minvalue="0" maxvalue="28" /> - </region> - - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictLArCalorimeter.xml b/graphics/AtlantisJava/geometry/IdDictLArCalorimeter.xml deleted file mode 100755 index 9eac43e86363..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictLArCalorimeter.xml +++ /dev/null @@ -1,694 +0,0 @@ -<IdDictionary name="LArCalorimeter" version="fullAtlas" > - - <field name="part" > - <label name="LArEM" value="1" /> - <label name="LArHEC" value="2" /> - <label name="LArFCAL" value="3" /> - <label name="LArOnline" value="4" /> - <label name="LArOnlineCalib" value="5" /> - <label name="LArEMdisc" value="-1" /> - <label name="LArHECdisc" value="-2" /> - <label name="LArFCALdisc" value="-3" /> - </field> - - <field name="barrel-endcap"> - <label name="negative-endcap-inner-wheel" value="-3" /> - <label name="negative-endcap-outer-wheel" value="-2" /> - <label name="negative-barrel" value="-1" /> - <label name="barrel" value="0" /> - <label name="positive-barrel" value="+1" /> - <label name="positive-endcap-outer-wheel" value="+2" /> - <label name="positive-endcap-inner-wheel" value="+3" /> - </field> - - <field name="barrel-ec"> - <label name="barrel" value="0" /> - <label name="endcap" value="1" /> - </field> - - <field name="pos_neg"> - <label name="negative-side" value="0" /> - <label name="positive-side" value="1" /> - </field> - - <subregion name="LArFCAL-module" > - <range field="phi-fcal" minvalue="0" maxvalue="15" wraparound="TRUE" /> - </subregion> - - <subregion name="LArEM-extralarge-module" > - <range field="phi" minvalue="0" maxvalue="31" wraparound="TRUE" /> - </subregion> - - <subregion name="LArEM-large-module" > - <range field="phi" minvalue="0" maxvalue="63" wraparound="TRUE" /> - </subregion> - - <subregion name="LArEM-thin-module" > - <range field="phi" minvalue="0" maxvalue="255" wraparound="TRUE" /> - </subregion> - - - - <!-- EM Barrel --> - - <subregion name="LArEM-barrel" > - <range field="part" value="LArEM" /> - <range field="barrel-endcap" values="negative-barrel positive-barrel" /> - </subregion> - - <region group="lar_em" name="LArEM-barrel-00" - next_samp="LArEM-barrel-10 LArEM-barrel-11" - next_subdet="LArEM-outer-wheel-10 LArEM-outer-wheel-00" - eta0="0.0" deta="0.025" phi0="0.0" dphi="64" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="0" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="60" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-10" next_abs_eta="LArEM-barrel-11" - prev_samp="LArEM-barrel-00" - next_samp="LArEM-barrel-20" - eta0="0.003125" deta="0.003125" phi0="0.0" dphi="64" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" minvalue="1" maxvalue="447" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-11" - prev_samp="LArEM-barrel-00" - next_samp="LArEM-barrel-21" - eta0="1.4" deta="0.025" phi0="0.0" dphi="256" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="1" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="2" /> - <reference subregion="LArEM-thin-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-20" next_abs_eta="LArEM-barrel-21" - prev_samp="LArEM-barrel-10" - next_samp="LArEM-barrel-30" - eta0="0.0" deta="0.025" phi0="0.0" dphi="256" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="2" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="55" /> - <reference subregion="LArEM-thin-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-21" - prev_samp="LArEM-barrel-11" - next_subdet="LArEM-outer-wheel-10" - eta0="1.4" deta="0.075" phi0="0.0" dphi="256" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="2" /> - <range field="region" value="1" /> - <range field="eta" value="0" /> - <reference subregion="LArEM-thin-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-30" - prev_samp="LArEM-barrel-20" eta0="0.0" deta="0.05" phi0="0.0" dphi="256" > - <reference subregion="LArEM-barrel" /> - <range field="sampling" value="3" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="26" /> - <reference subregion="LArEM-thin-module" /> - </region> - - - - <!-- EM outer wheel --> - - <subregion name="LArEM-outer-wheel" > - <range field="part" value="LArEM" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_em" name="LArEM-outer-wheel-00" - next_samp="LArEM-outer-wheel-12" - prev_subdet="LArEM-barrel-00" - eta0="1.5" deta="0.025" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="0" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="11" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-10" next_abs_eta="LArEM-outer-wheel-11" - next_samp="LArEM-outer-wheel-20" - prev_subdet="LArEM-barrel-00 LArEM-barrel-21" - eta0="1.375" deta="0.05" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" value="0" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-11" next_abs_eta="LArEM-outer-wheel-12" - next_samp="LArEM-outer-wheel-21" eta0="1.425" deta="0.025" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="2" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-12" next_abs_eta="LArEM-outer-wheel-13" - prev_samp="LArEM-outer-wheel-00" - next_samp="LArEM-outer-wheel-21" eta0="1.5" deta="0.003125" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="2" /> - <range field="eta" minvalue="0" maxvalue="95" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-13" next_abs_eta="LArEM-outer-wheel-14" - next_samp="LArEM-outer-wheel-21" eta0="1.8" deta="0.0041666666667" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="3" /> - <range field="eta" minvalue="0" maxvalue="47" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-14" next_abs_eta="LArEM-outer-wheel-15" - next_samp="LArEM-outer-wheel-21" eta0="2.0" deta="0.00625" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="4" /> - <range field="eta" minvalue="0" maxvalue="63" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-15" - next_samp="LArEM-outer-wheel-21" eta0="2.4" deta="0.025" phi0="0.0" dphi="64" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="5" /> - <range field="eta" minvalue="0" maxvalue="3" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-20" next_abs_eta="LArEM-outer-wheel-21" - prev_samp="LArEM-outer-wheel-10" eta0="1.375" deta="0.05" phi0="0.0" dphi="256" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="2" /> - <range field="region" value="0" /> - <range field="eta" value="0" /> - <reference subregion="LArEM-thin-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-21" next_abs_eta="LArEM-inner-wheel-10" - prev_samp="LArEM-outer-wheel-11 LArEM-outer-wheel-12 LArEM-outer-wheel-13 LArEM-outer-wheel-14 LArEM-outer-wheel-15" - next_samp="LArEM-outer-wheel-30" eta0="1.425" deta="0.025" phi0="0.0" dphi="256" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="2" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="42" /> - <reference subregion="LArEM-thin-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-30" next_abs_eta="LArEM-inner-wheel-20" - prev_samp="LArEM-outer-wheel-21" eta0="1.5" deta="0.05" phi0="0.0" dphi="256" > - <reference subregion="LArEM-outer-wheel" /> - <range field="sampling" value="3" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="19" /> - <reference subregion="LArEM-thin-module" /> - </region> - - - - - - - <!-- EM inner wheel --> - - <subregion name="LArEM-inner-wheel" > - <range field="part" value="LArEM" /> - <range field="barrel-endcap" values="negative-endcap-inner-wheel positive-endcap-inner-wheel" /> - </subregion> - - <region group="lar_em" name="LArEM-inner-wheel-10" - next_samp="LArEM-inner-wheel-20" eta0="2.5" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArEM-inner-wheel" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="6" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-inner-wheel-20" - prev_samp="LArEM-inner-wheel-10" eta0="2.5" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArEM-inner-wheel" /> - <range field="sampling" value="2" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="6" /> - <reference subregion="LArEM-large-module" /> - </region> - - - - - - <!-- - - LArHEC - - --> - - <subregion name="LArHEC" > - <range field="part" value="LArHEC" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_hec" name="LArHEC-00" next_abs_eta="LArHEC-01" - next_samp="LArHEC-10" eta0="1.5" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArHEC" /> - <range field="sampling" value="0" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="9" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-10" next_abs_eta="LArHEC-11" - next_samp="LArHEC-20" prev_samp="LArHEC-00" eta0="1.5" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArHEC" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="9" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-20" next_abs_eta="LArHEC-21" - next_samp="LArHEC-30" prev_samp="LArHEC-10" eta0="1.6" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArHEC" /> - <range field="sampling" values="2" /> - <range field="region" value="0" /> - <range field="eta" minvalue="1" maxvalue="9" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-30" next_abs_eta="LArHEC-31" - prev_samp="LArHEC-20" eta0="1.7" deta="0.1" phi0="0.0" dphi="64" > - <reference subregion="LArHEC" /> - <range field="sampling" values="3" /> - <range field="region" value="0" /> - <range field="eta" minvalue="2" maxvalue="9" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-01" - next_samp="LArHEC-11" eta0="2.5" deta="0.2" phi0="0.0" dphi="32" > - <reference subregion="LArHEC" /> - <range field="sampling" value="0" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="3" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - <region group="lar_hec" name="LArHEC-11" next_abs_eta="LArFCAL-1" - next_samp="LArHEC-21" prev_samp="LArHEC-01" eta0="2.5" deta="0.2" phi0="0.0" dphi="32" > - <reference subregion="LArHEC" /> - <range field="sampling" value="1" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="2" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - <region group="lar_hec" name="LArHEC-21" - next_samp="LArHEC-31" prev_samp="LArHEC-11" eta0="2.5" deta="0.2" phi0="0.0" dphi="32" > - <reference subregion="LArHEC" /> - <range field="sampling" value="2" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="2" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - <region group="lar_hec" name="LArHEC-31" - prev_samp="LArHEC-21" eta0="2.5" deta="0.2" phi0="0.0" dphi="32" > - <reference subregion="LArHEC" /> - <range field="sampling" value="3" /> - <range field="region" value="1" /> - <range field="eta" minvalue="0" maxvalue="3" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - - - - <!-- - - LArFCAL - - --> - - <subregion name="LArFCAL" > - <range field="part" value="LArFCAL" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_fcal" name="LArFCAL-1" - eta0="3.2" deta="0.025" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="1" /> - <range field="eta-fcal" minvalue="0" maxvalue="62" /> - <reference subregion="LArFCAL-module" /> - </region> - - <region group="lar_fcal" name="LArFCAL-2a" - eta0="3.2" deta="0.05" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="2" /> - <range field="eta-fcal" minvalue="0" maxvalue="29" /> - <range field="phi-fcal" values="0 7 8 15" /> - </region> - - <region group="lar_fcal" name="LArFCAL-2b" - eta0="3.2" deta="0.05" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="2" /> - <range field="eta-fcal" minvalue="0" maxvalue="30" /> - <range field="phi-fcal" values="3 4 11 12" /> - </region> - - <region group="lar_fcal" name="LArFCAL-2c" - eta0="3.2" deta="0.05" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="2" /> - <range field="eta-fcal" minvalue="0" maxvalue="31" /> - <range field="phi-fcal" values="1 2 5 6 9 10 13 14" /> - </region> - - <region group="lar_fcal" name="LArFCAL-3a" - eta0="3.2" deta="0.1" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="3" /> - <range field="eta-fcal" minvalue="0" maxvalue="14" /> - <range field="phi-fcal" values="2 10" /> - </region> - - <region group="lar_fcal" name="LArFCAL-3b" - eta0="3.2" deta="0.1" phi0="0.0" dphi="16" > - <reference subregion="LArFCAL" /> - <range field="module" value="3" /> - <range field="eta-fcal" minvalue="0" maxvalue="15" /> - <range field="phi-fcal" values="0 1 3 4 5 6 7 8 9 11 12 13 14 15" /> - </region> - - - - <!-- - - Disconnected Channels - - --> - - <subregion name="LArEM-barreldisc" > - <range field="part" value="LArEMdisc" /> - <range field="barrel-endcap" values="negative-barrel positive-barrel" /> - </subregion> - - <region group="lar_em" name="LArEM-barrel-00disconnected" > - <reference subregion="LArEM-barreldisc" /> - <range field="sampling" value="0" /> - <range field="region" value="0" /> - <range field="eta" minvalue="61" maxvalue="63" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-10disconnected" > - <reference subregion="LArEM-barreldisc" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" value="0" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-barrel-30disconnected" > - <reference subregion="LArEM-barreldisc" /> - <range field="sampling" value="3" /> - <range field="region" value="0" /> - <range field="eta" value="27" /> - <reference subregion="LArEM-thin-module" /> - </region> - - - <subregion name="LArEM-outer-wheeldisc" > - <range field="part" value="LArEMdisc" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_em" name="LArEM-outer-wheel-00disconnected" > - <reference subregion="LArEM-outer-wheeldisc" /> - <range field="sampling" value="0" /> - <range field="region" value="0" /> - <range field="eta" minvalue="12" maxvalue="19" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-11disconnected" > - <reference subregion="LArEM-outer-wheeldisc" /> - <range field="sampling" value="1" /> - <range field="region" value="1" /> - <range field="eta" minvalue="3" maxvalue="6" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-13disconnected" > - <reference subregion="LArEM-outer-wheeldisc" /> - <range field="sampling" value="1" /> - <range field="region" value="3" /> - <range field="eta" minvalue="48" maxvalue="63" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-outer-wheel-15disconnected" > - <reference subregion="LArEM-outer-wheeldisc" /> - <range field="sampling" value="1" /> - <range field="region" value="5" /> - <range field="eta" minvalue="4" maxvalue="7" /> - <reference subregion="LArEM-large-module" /> - </region> - - - <subregion name="LArEM-inner-wheeldisc" > - <range field="part" value="LArEMdisc" /> - <range field="barrel-endcap" values="negative-endcap-inner-wheel positive-endcap-inner-wheel" /> - </subregion> - - <region group="lar_em" name="LArEM-inner-wheel-10disconnected" > - <reference subregion="LArEM-inner-wheeldisc" /> - <range field="sampling" value="1" /> - <range field="region" value="0" /> - <range field="eta" value="7" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_em" name="LArEM-inner-wheel-20disconnected" > - <reference subregion="LArEM-inner-wheeldisc" /> - <range field="sampling" value="2" /> - <range field="region" value="0" /> - <range field="eta" value="7" /> - <reference subregion="LArEM-large-module" /> - </region> - - - - <subregion name="LArHECdisc" > - <range field="part" value="LArHECdisc" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_hec" name="LArHEC-20disconnected" > - <reference subregion="LArHECdisc" /> - <range field="sampling" values="2" /> - <range field="region" value="0" /> - <range field="eta" value="0" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-30disconnected" > - <reference subregion="LArHECdisc" /> - <range field="sampling" values="3" /> - <range field="region" value="0" /> - <range field="eta" minvalue="0" maxvalue="1" /> - <reference subregion="LArEM-large-module" /> - </region> - - <region group="lar_hec" name="LArHEC-11disconnected" > - <reference subregion="LArHECdisc" /> - <range field="sampling" value="1" /> - <range field="region" value="1" /> - <range field="eta" value="3" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - <region group="lar_hec" name="LArHEC-21disconnected" > - <reference subregion="LArHECdisc" /> - <range field="sampling" value="2" /> - <range field="region" value="1" /> - <range field="eta" value="3" /> - <reference subregion="LArEM-extralarge-module" /> - </region> - - - <subregion name="LArFCALdisc" > - <range field="part" value="LArFCALdisc" /> - <range field="barrel-endcap" values="negative-endcap-outer-wheel positive-endcap-outer-wheel" /> - </subregion> - - <region group="lar_fcal" name="LArFCAL-1disconnected" > - <reference subregion="LArFCALdisc" /> - <range field="module" value="1" /> - <range field="eta-fcal" value="63" /> - <reference subregion="LArFCAL-module" /> - </region> - - <region group="lar_fcal" name="LArFCAL-2adisconnected" > - <reference subregion="LArFCALdisc" /> - <range field="module" value="2" /> - <range field="eta-fcal" minvalue="30" maxvalue="31" /> - <range field="phi-fcal" values="0 7 8 15" /> - </region> - - <region group="lar_fcal" name="LArFCAL-2bdisconnected" - eta0="3.2" deta="0.05" phi0="0.0" dphi="0.4" > - <reference subregion="LArFCALdisc" /> - <range field="module" value="2" /> - <range field="eta-fcal" value="31" /> - <range field="phi-fcal" values="3 4 11 12" /> - </region> - - <region group="lar_fcal" name="LArFCAL-3adisconnected" > - <reference subregion="LArFCALdisc" /> - <range field="module" value="3" /> - <range field="eta-fcal" value="15" /> - <range field="phi-fcal" values="2 10" /> - </region> - - - <!-- LAr Online --> - - - <!-- LArOnline -Barrel --> - - <subregion name="LArOnline-Barrel"> - <range field="part" value="LArOnline" /> - <range field="barrel-ec" values="barrel" /> - </subregion> - - <region group="LArOnline" name="laronline-barrel"> - <reference subregion="LArOnline-Barrel" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" minvalue="0" maxvalue="31" /> - <range field="slot" minvalue="1" maxvalue="14" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-EndCap Standard --> - - <subregion name="LArOnline-Endcap"> - <range field="part" value="LArOnline" /> - <range field="barrel-ec" values="endcap" /> - </subregion> - - <region group="LArOnline" name="laronline-endcap-standard"> - <reference subregion="LArOnline-Endcap" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="0 1 4 5 7 8 11 12 13 14 17 18 19 20 23 24" /> - <range field="slot" minvalue="1" maxvalue="13" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-Endcap-Special --> - - <region group="LArOnline" name="laronline-endcap-special" > - <reference subregion="LArOnline-Endcap" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="2 9 15 21" /> - <range field="slot" minvalue="1" maxvalue="15" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-HEC--> - - <region group="LArOnline" name="laronline-hec"> - <reference subregion="LArOnline-Endcap" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="3 10 16 22" /> - <range field="slot" values="1 2 5 6 7 8 9 10" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-FCAL--> - - <region group="LArOnline" name="laronlinefcal" > - <reference subregion="LArOnline-Endcap" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" value="6" /> - <range field="slot" minvalue="1" maxvalue="14" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline -Barrel Calib --> - - <subregion name="LArOnline-Barrel-Calib"> - <range field="part" value="LArOnlineCalib" /> - <range field="barrel-ec" values="barrel" /> - </subregion> - - <region group="LArOnline" name="laronline-barrel-calib"> - <reference subregion="LArOnline-Barrel-Calib" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" minvalue="0" maxvalue="31" /> - <range field="slot" value="15" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-EndCap Standard Calib --> - - <subregion name="LArOnline-Endcap-Calib"> - <range field="part" value="LArOnlineCalib" /> - <range field="barrel-ec" values="endcap" /> - </subregion> - - <region group="LArOnline" name="laronline-endcap-standard"> - <reference subregion="LArOnline-Endcap-Calib" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="0 1 4 5 7 8 11 12 13 14 17 18 19 20 23 24" /> - <range field="slot" value="15" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-HEC CALIB --> - - <region group="LArOnline" name="laronline-hec-calib"> - <reference subregion="LArOnline-Endcap-Calib" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="3 10 16 22" /> - <range field="slot" values="3 4 12" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - <!-- LArOnline-FCAL CALIB --> - - <region group="LArOnline" name="laronline-fcal-calib"> - <reference subregion="LArOnline-Endcap-Calib" /> - <range field="pos_neg" values="negative-side positive-side" /> - <range field="feedthrough" values="6" /> - <range field="slot" value="16" /> - <range field="channel_in_slot" minvalue="0" maxvalue="127" /> - </region> - - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictLArElectrode.xml b/graphics/AtlantisJava/geometry/IdDictLArElectrode.xml deleted file mode 100755 index 948ccf3d0996..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictLArElectrode.xml +++ /dev/null @@ -1,327 +0,0 @@ -<IdDictionary name="LArElectrode" version="fullAtlas" > - - <field name="detector" > - <label name="EMB" value="0" /> - <label name="EMBPS" value="1" /> - <label name="EMEC" value="2" /> - <label name="EMECPS" value="3" /> - <label name="HEC" value="4" /> - <label name="FCAL" value="5" /> - <label name="EMBPUR" value="6" /> - <label name="ECPUR" value="7" /> - </field> - - <field name="configuration" > - <label name="Atlas" value="1" /> - <label name="TestBeam" value="2" /> - </field> - - <field name="zside"> - <label name="A" value="0" /> - <label name="C" value="1" /> - </field> - - <field name="module"> - </field> - - <field name="hvphi" > - </field> - - <field name="hveta" > - </field> - - <field name="hvgap" > - </field> - - <field name="electrode"> - </field> - - - <!-- LAr Electrodes--> - - <subregion name="AtlasLArElectrode"> - <range field="configuration" value="Atlas" /> - </subregion> - - <!--EMB-FT=-1 --> - <region group="LArElec" name="EM-BARREL-ALL"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMB" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="15" /> - <range field="hvphi" values="1" /> - <range field="hveta" minvalue="1" maxvalue="7" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="0" maxvalue="31" /> - </region> - - <!--EMB-FT=0 --> - <region group="LArElec" name="EM-BARREL-FT0"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMB" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="15" /> - <range field="hvphi" values="0" /> - <range field="hveta" minvalue="1" maxvalue="7" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="32" maxvalue="63" /> - </region> - - <!--EMBPS --> - <region group="LArElec" name="EM-BARREL-PS"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMBPS" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" values="0 1" /> - <range field="hveta" minvalue="1" maxvalue="4" /> - <range field="hvgap" values="0 1" /> - <!--note that this value 'electrode' is DUMMY until confirmation by Hostachy--> - <range field="electrode" value="0" /> - </region> - - <!--EMEC-INNER-WHEEL--> - <region group="LArElec" name="EM-ENDCAP-INNER-S1"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="1" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="0" maxvalue="3" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S2"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="2" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="4" maxvalue="7" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S3"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="3" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="8" maxvalue="11" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S4"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="4" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="12" maxvalue="15" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S5"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="5" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="16" maxvalue="19" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S6"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="6" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="20" maxvalue="23" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S7"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="7" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="24" maxvalue="27" /> - </region> - <region group="LArElec" name="EM-ENDCAP-INNER-S8"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="8" /> - <range field="hveta" minvalue="7" maxvalue="8" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="28" maxvalue="31" /> - </region> - - <!--EMEC-OUTER-WHEEL--> - <region group="LArElec" name="EM-ENDCAP-OUTER-S1"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="1" /> - <range field="hveta" minvalue="0" maxvalue="6" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="0" maxvalue="23" /> - </region> - <region group="LArElec" name="EM-ENDCAP-OUTER-S2"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="2" /> - <range field="hveta" minvalue="0" maxvalue="6" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="24" maxvalue="47" /> - </region> - <region group="LArElec" name="EM-ENDCAP-OUTER-S3"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="3" /> - <range field="hveta" minvalue="0" maxvalue="6" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="48" maxvalue="71" /> - </region> - <region group="LArElec" name="EM-ENDCAP-OUTER-S4"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="4" /> - <range field="hveta" minvalue="0" maxvalue="6" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" minvalue="72" maxvalue="95" /> - </region> - - <!--EMEC-PS--> - <region group="LArElec" name="EM-ENDCAP-PS"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMECPS" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="0" /> - <range field="hvgap" values="0 1" /> - <range field="electrode" value="0" /> - </region> - - <!--HEC--> - <region group="LArElec" name="HEC-ETA1"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="HEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="1" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" minvalue="1" maxvalue="8" /> - </region> - - <region group="LArElec" name="HEC-ETA2"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="HEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="2" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" minvalue="9" maxvalue="24" /> - </region> - - <region group="LArElec" name="HEC-ETA3"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="HEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="3" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" minvalue="25" maxvalue="32" /> - </region> - - <region group="LArElec" name="HEC-ETA4"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="HEC" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="31" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="4" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" minvalue="33" maxvalue="40" /> - </region> - - <!--FCAL--> - - <!--FCAL1--> - <region group="LArElec" name="FCAL-S1"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="FCAL" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="15" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="1" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" value="0" /> - </region> - - <region group="LArElec" name="FCAL-S2"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="FCAL" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="7" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="2" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" value="0" /> - </region> - - <region group="LArElec" name="FCAL-S3"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="FCAL" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="0" maxvalue="3" /> - <range field="hvphi" value="0" /> - <range field="hveta" value="3" /> - <range field="hvgap" minvalue="0" maxvalue="3" /> - <range field="electrode" value="0" /> - </region> - - - <!--EMBPUR--> - <region group="LArElec" name="EMB-PUR"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="EMBPUR" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="1" maxvalue="5" /> - <range field="hvphi" value="0" /> - <range field="hveta" minvalue="0" /> - <range field="hvgap" minvalue="0" maxvalue="1" /> - <range field="electrode" value="0" /> - </region> - - <!--ECPUR--> - <region group="LArElec" name="EC-PUR"> - <reference subregion="AtlasLArElectrode" /> - <range field="detector" value="ECPUR" /> - <range field="zside" values="0 1" /> - <range field="module" minvalue="1" maxvalue="10" /> - <range field="hvphi" value="0" /> - <range field="hveta" minvalue="0" /> - <range field="hvgap" minvalue="0" maxvalue="1" /> - <range field="electrode" value="0" /> - </region> - - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictLArHighVoltage.xml b/graphics/AtlantisJava/geometry/IdDictLArHighVoltage.xml deleted file mode 100755 index b0a26c9558ed..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictLArHighVoltage.xml +++ /dev/null @@ -1,222 +0,0 @@ - -<IdDictionary name="LArHighVoltage" version="fullAtlas" > - - <field name="configuration" > - <label name="Atlas" value="1" /> - <label name="TestBeam" value="2" /> - </field> - - <field name="cannode"> - </field> - - <field name="hvline"> - </field> - - <field name="partition" > - </field> - - <field name="canline"> - </field> - - - <!-- HighVoltage Lines--> - - <subregion name="AtlasHighVoltage"> - <range field="configuration" value="Atlas" /> - </subregion> - - - <!-- LArHV HEC --> - - <region group="LArHV" name="LArHV-HEC-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="48" maxvalue="79" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - <region group="LArHV" name="LArHV-HEC-C"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="148" maxvalue="179" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - <!-- LArHV FCAL --> - - <region group="LArHV" name="LArHV-FCAL-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="80" maxvalue="93" /> - <range field="hvline" minvalue="0" maxvalue="7" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - <region group="LArHV" name="LArHV-FCAL-C"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="180" maxvalue="193" /> - <range field="hvline" minvalue="0" maxvalue="7" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - <!-- LArHV EMB --> - - <!-- EMB-A-SIDE--> - <region group="LArHV" name="LArHV-EMB-A-STD"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="200" maxvalue="231" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMB-C-STD"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="232" maxvalue="263" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMB-A-SPE"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="296 297 306 307" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMB-C-SPE"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="299 304 305 308 309" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - - <!-- LArHV EMBPS --> - - <region group="LArHV" name="LArHV-EMBPS-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="264" maxvalue="279" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - <region group="LArHV" name="LArHV-EMBPS-C"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="280" maxvalue="295" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - <!-- LArHV EMEC --> - - <region group="LArHV" name="LArHV-EMEC-A1"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="0" maxvalue="47" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMEC-A2"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="320" maxvalue="322" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMEC-C1"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="100" maxvalue="147" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="LArHV-EMEC-C2"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="324 325" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - <!-- LArHV EMECPS --> - - <region group="LArHV" name="LArHV-EMECPS-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="312" maxvalue="315" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - <region group="LArHV" name="LArHV-EMECPS-C"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="316" maxvalue="319" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - <!-- LArHV EMPUR --> - - <region group="LArHV" name="LArEMBPUR-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="300" maxvalue="303" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - <!-- All these lines are free to use --> - - <region group="LArHV" name="NOCONN-NEW"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="310 311" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="NOCONN-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="323" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="NOCONN-C"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" values="326 327" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="FREE-A"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="94" maxvalue="99" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - <region group="LArHV" name="FREE-B"> - <reference subregion="AtlasHighVoltage" /> - <range field="cannode" minvalue="194" maxvalue="199" /> - <range field="hvline" minvalue="0" maxvalue="15" /> - <range field="partition" value="1" /> - <range field="canline" value="1" /> - </region> - - - -</IdDictionary> - diff --git a/graphics/AtlantisJava/geometry/IdDictTileCalorimeter.xml b/graphics/AtlantisJava/geometry/IdDictTileCalorimeter.xml deleted file mode 100755 index 76ab90dd0d52..000000000000 --- a/graphics/AtlantisJava/geometry/IdDictTileCalorimeter.xml +++ /dev/null @@ -1,398 +0,0 @@ -<IdDictionary name="TileCalorimeter" version="fullAtlasAndTestBeam" > - - <field name="section" > - <label name="Online" value="0" /> - <label name="Barrel" value="1" /> - <label name="Extended-barrel" value="2" /> - <label name="ITC-gap-scintillator" value="3" /> - <label name="Testbeam" value="4" /> - </field> - - <field name="side" > - <label name="positive" value="+1" /> - <label name="negative" value="-1" /> - </field> - - <subregion name="cylinder-pos" > - <range field="side" value="positive" /> - <range field="module" minvalue="0" maxvalue="63" /> - </subregion> - - <subregion name="cylinder-neg" > - <range field="side" value="negative" /> - <range field="module" minvalue="0" maxvalue="63" /> - </subregion> - - <subregion name="cylinder" > - <range field="side" /> - <range field="module" minvalue="0" maxvalue="63" /> - </subregion> - - <subregion name="pmt1" > - <range field="pmt" value="0" /> - <range field="adc" minvalue="0" maxvalue="1" /> - </subregion> - - <subregion name="pmt2" > - <range field="pmt" minvalue="0" maxvalue="1" /> - <range field="adc" minvalue="0" maxvalue="1" /> - </subregion> - - <subregion name="tower0AB" > - <range field="tower" value="0" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower0" > - <range field="tower" value="0" /> - <range field="sampling" minvalue="0" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower1" > - <range field="tower" value="1" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower2" > - <range field="tower" value="2" /> - <range field="sampling" minvalue="0" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower3" > - <range field="tower" value="3" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower4" > - <range field="tower" value="4" /> - <range field="sampling" minvalue="0" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower5" > - <range field="tower" value="5" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower6" > - <range field="tower" value="6" /> - <range field="sampling" minvalue="0" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower7" > - <range field="tower" value="7" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower8" > - <range field="tower" value="8" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower9" > - <range field="tower" value="9" /> - <range field="sampling" value="0" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower10" > - <range field="tower" value="10" /> - <range field="sampling" minvalue="1" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower11" > - <range field="tower" value="11" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower12" > - <range field="tower" value="12" /> - <range field="sampling" minvalue="0" maxvalue="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower13" > - <range field="tower" value="13" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower14" > - <range field="tower" value="14" /> - <range field="sampling" minvalue="0" maxvalue="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="tower15" > - <range field="tower" value="15" /> - <range field="sampling" value="0" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="D4" > - <range field="tower" value="8" /> - <range field="sampling" value="2" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="C10" > - <range field="tower" value="9" /> - <range field="sampling" value="1" /> - <reference subregion="pmt2" /> - </subregion> - - <subregion name="E1" > - <range field="tower" value="10" /> - <range field="sampling" value="3" /> - <reference subregion="pmt1" /> - </subregion> - - <subregion name="E2" > - <range field="tower" value="11" /> - <range field="sampling" value="3" /> - <reference subregion="pmt1" /> - </subregion> - - <subregion name="E3" > - <range field="tower" value="13" /> - <range field="sampling" value="3" /> - <reference subregion="pmt1" /> - </subregion> - - <subregion name="E4" > - <range field="tower" value="15" /> - <range field="sampling" value="3" /> - <reference subregion="pmt1" /> - </subregion> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower0AB" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower0" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower1" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower1" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower2" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower2" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower3" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower3" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower4" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower4" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower5" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower5" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower6" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower6" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower7" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower7" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower8" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower8" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-neg" /> - <reference subregion="tower9" /> - </region> - - <region> - <range field="section" value="Barrel" /> - <reference subregion="cylinder-pos" /> - <reference subregion="tower9" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower10" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower11" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower12" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower13" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower14" /> - </region> - - <region> - <range field="section" value="Extended-barrel" /> - <reference subregion="cylinder" /> - <reference subregion="tower15" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="D4" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="C10" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="E1" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="E2" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="E3" /> - </region> - - <region> - <range field="section" value="ITC-gap-scintillator" /> - <reference subregion="cylinder" /> - <reference subregion="E4" /> - </region> - - - <region> - <range field="section" value="Online" /> - <range field="ros" minvalue="1" maxvalue="4" /> - <range field="drawer" minvalue="0" maxvalue="63" /> - <range field="channel" minvalue="0" maxvalue="47" /> - <range field="gain" minvalue="0" maxvalue="1" /> - </region> - - <region> - <range field="section" value="Online" /> - <range field="ros" value="0" /> - <range field="drawer" values="0 1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20 21 22 255" /> - <range field="channel" minvalue="0" maxvalue="15" /> - <range field="gain" minvalue="0" maxvalue="0" /> - </region> - - <region> - <range field="section" value="Testbeam" /> - <range field="type" minvalue="-1" maxvalue="10" /> - <range field="tbmodule" minvalue="0" maxvalue="255" /> - <range field="tbchannel" minvalue="0" maxvalue="63" /> - <range field="tbdummy1" minvalue="0" maxvalue="15" /> - <range field="tbdummy2" minvalue="0" maxvalue="3" /> - <range field="tbdummy3" minvalue="0" maxvalue="3" /> - </region> - -</IdDictionary> diff --git a/graphics/AtlantisJava/img/atlantis_icon.gif b/graphics/AtlantisJava/img/atlantis_icon.gif deleted file mode 100755 index ea1ad1a27796918182df08347719cf5efdfb8723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2939 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 diff --git a/graphics/AtlantisJava/img/atlantis_log.gif b/graphics/AtlantisJava/img/atlantis_log.gif deleted file mode 100755 index 7afe0dde1b99cc58b127f5ffb0c12f622a5f6326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18919 zcmWh!XH=6**L_MFAqk-e5-?Ol4?Q4iNGK6SBcc>hLlIG0K*Xr%eNrHy8j6aF*C?W( zr~%Q7^$kTtK@93u6x7fZJ9e%GKfiyoW}VqTX4aY6XP-Uci^5m|iQfSY@Zw*9yXwmC zWFYxqYD7dtW#27Daj^%Jxi~XRHXu8?Z{zQWK=aL;`(udwvNHMJy<2Pdb(nSy3;_Cg z{mpm&POvbj{#Sjj4Ql=VeRKb<Z6eXimKIU5Vr%1xs;!v=-)9>C`KPdF*ZzhEuSMa? zQfz8tV`iEC?^&Q~=F9i$h@`(}HtgSDL&W|XaTz!R$(v5h-p&3I53Em4o*gXn%+9ed zIk5F&yYggJ?Zu0^XOZNhqS<r8A1^ljdbw<Sj^6j-CECjhx21H&rHiK@pZ!_n^W$~p z`imDM^A;bkt84vuZ&|v>w$7ceUjw;6W~!&}S-T{E`PAI3L?z6LTe=k2+EVl@pPsl? zbnyoE_pssbDX(7xz}<J}6c37TpW3`Q(k(q_?wzIJ_qV{n7cGNG^hsYb0sxyMuv9y{ z*`~PFv9agxDhCF)xb5Dsr?ezb7~#p^^mjc*`=;8sR)45$`R#k<@|sc)cfG2y%X5aT zzJ9vSTPfIG>>b<PJ#h&<fBN*<7gtxVH-0<;$lDwD(sHM7fVB?~)f^ZQT{ty10^GiR z%JTSa#ZX<wJ)7D~Ck(T8-o4;hKJu)uHZ3bXU9`9O=g=|5iMcOkXKy@wNDNzYdXM{) zf#sEz>g))QZ66-=Tv&Ran4ugfeY|OtdEcA;eFxmNaV58FP0Xo;l^Lg=>fH4`J{?-~ z`vv91<%UfcPK{29@XmTyj(aUT^7qD?k|pKpe{Xqw`37v+mX<d>aw8kHuU0Gy&41ZT zN%%|9o8wzlRA;p@zUK6qq)o!q+IH=iIf<{{r<ava{+JMz?CCm)9lvDvUW|@;q<bV= zaCS%AgWG+(U+l_nY+u)?xzM5dG%%;6{=D)@+3(-KzkU1m{{8zGFJ3%-`t-qr2X%FI z0|Ns+Jv|K#4Og#TJ$?H0`Sa&%YHBL$>JHV^96f#dOhbeE>ebzK)tv(a*Uq;cK2kRE z>V5s`qkq;6j8FVQ`Su6$5AN@8t>-nTIfQ|$J->gyZ#aGa#nTscWfe6wbyv?{1pwf8 zD)1-B=06npXAHRhnF0PkCji_m@LP|@Q>!|pIAiC8UiFbKIoU3vj@NSZdMU+w(@1Yi z{f*spZV7Es>#>{Fj1?ynZnie`?PDh2s#|pK`0azN&96poo;z{pFk6bZifC&btmjob zuesIMbngVeKH^Zsmt^1chplVR6-}Rfa8}SIxqaM?df{xssgqA)-^O3qY=bvp?7My7 zN%~Olrq}shp^6-viVW(K_G!ax8>8RO=1B+t$+Va-8!}ru{NQ};-1x4Z%wZ`l_4}7T z?=!>xo5yG=bme%jggU3^=72I0&Ky2(*GI~!|Ax&R#jEt5+*$HBcFcL*K>w9f!@7Wv z3P0nQ2OW&YaX*dBlQjU`5HVY9z3keR|8|WM3GB^wJO!nj7`@!^=;{mU{~mb#tlur9 zf_8KfQsn<$)@3DnUKmqi@zg@ghJ8bL9D?BkpilaW7*m2WQml$F&0z6imWATsZd7;o z7}0+yw)*g{m2uU#{l|g?NE)26xeJD)2S<w=2y{r#qEQW6jVZiItS7?c$Nv1>bLKVt z{Nw`x<BT{BY+#~h`#s7t?u7rR<c$E`EMVyxW`u)X-q<4Y&441sC!+rht2TJwxad=) z|N27>drE&NOpXQpXR+yF(C?A+G1co^x=dFk?mgFGhwj#n%4tY)TzsapgB{D6rac0p z$^33V*T)T!HM1kU;%B9l#A>VDQQ->n)0u@YBZ-qK!g|y;!NX0BVPC%A#%Ss+Aq<)k z{yO#SJL7JT5#h@6n4!Fb=5Z~XjMLUWmg%SZ+0X=R!thU{Zdf;UX=LH2_Aj?tc1H(~ z;GAn7*tT-YFM-G}3YkMh=Y4w5K3Lqu+22{kkMn<p7)xN1HaHx#M<pt3?of>4Ft)oA zq`l}yaxrLyk40Gj%TSl^obfD+3>;H`3?_{24=&Sx1iiVJ`i#Pz23m^inT@evxLkh} zS6c6{7V01n{ker0FhNKiFbo$y*^)RRO0EdlO<c8<6+Z2H0Hl5n)?g-SF631swBY_( zs8SJw#}47Hu2?<7nr6#k(I@uCPq%pW`gw1<au>oO^J0fqmsSVcKi!{*k<%)^B_lNV zS{qN>AT{D2Wp4hKWx&|C%J<D@agpb9lj%f1$!l3;fU_)B<L9ew`OLnPiGZwWQ}g10 zU`-Uje3mJC`emqEKIY$%Ba{ZX9A+V`dCs?w`#w?d>-=vwYKe_k@5!#^HJAu+Or2}N zN<Uo?x!VvX&!L*}Q8^j)_!pIICxYs4u$zvta{)3PDHa!l)bsvb5qv@Y!8zx?&ODs5 zG$&~qBxr4D-v*2H$wRw&{cdSyk5>I;C6#A4%c;*<fT!evStjEhW;UaJxsxqe;j`_P z<&$19L_~@RQ(d$<Gi-8}`UEc27RHQV0^28`8wx40S$&j+6H3t<^~O==2(dS(ewS(# zheBd5Ug-coP;|7GnI2z86mcLnwaBss!;%QakRnW)f3wJ+r$!*02RuiI+>MVe-zFTV zO=?mMOF}w&)i&_TUhykeDN&S{?jmy9S956)yD(9@YU?<GHN`H={d`)m_A%mr$*_XR z3x_fooLSuqa)v0GK-6Mf!GOw5DakNOAx<k3b7nJjv`a3OfPoK)soN6zkjfC9xdLU{ ztpl$yVVFCPWc5mIO5&fh&q&I%GVIJ=%nG<^ul@l@byDgWU7VJ{AZ3zQ*nH@{;knTh z&g!k+Z_rZYcO}oxJ4i>>h>tJecmq4TTMWK!OY@Ux5sQMkJC5Ge_*2dsUdim*5gf7% zbD@$bLZoo#JghC%)-IO<63Ur3tZhzOWHqX2M{aV#YdIt=Dv|1M1X9P^k4ueYRD*VF z`GakUMK`qC;Ho0%%qVyHc00rXH{#o#NbqT1hTfjQTUIT^`OC)lgzUi?t<=g%U@~oA zvp8U6QxWv0@uYrJnEx?546IOrX>_qYUWY6QcA`CFmag$j-&fX~MoVjiSQip2oEhhq zKO$q9OHKNJ7XG_`j56D0G@>m(^4!$+;Y<%)LAOj2jW3v-(iG!`740ofHYK+(55A)+ z=AoTk@<&zG*FaKs>_h5pbWM9+=puz+97C-g5bW|K`32mghVou|ToFH%u<n6t0j~Aa zt;320n5H#~G#nacWH<NGPLRRK)0T^~1YZ}NXj>dKQCyDhrW<*(VNb^;qs~EOB8?8V zT^oE_q#nmCr!E6~KZqep8-ECQV|0Y~bo{9s70n1nS@MU!Z#Vy6(VKABgy9>WBur2X zF4)i7*+5iNj}Z!janKEAh8k>mVbSG}D<G!}rEsu7T8t6amOda9H{;52OKmE~BiewP zTF=>?nQzGXx|nt&9b)}YAyKFv!;R6G67GUslGtSMP_IN~(UMxY#N^g<&n~}=z7@0c zRaT(uQUO!*^k?iv;FY(Acq_=j#a{zuH*yX?x}yA%#BOg8KC}M83(r-LhM&sOC{O() zx}^kzaYMm4$}epJ1u|<93Ek4{I&Oy^#fQdn;T|Oxc0~qB!AW4g8Qo85hg<*m{g8&_ zA_GO&qLrd9YOXLT%6sD4j$UB<$O*S(BZL;P7YWDKku!zBL&;N(^5F4u(zCZKAN!X6 zqiNe`2aE&T8fo&TI&yK<GMf5n4>ToQkf{~#dZ8Ggx+=xFze9=wE{3sYm+rJR((d~= zy}!kxLWf)~T1kI6Q)qxXg!UD^qW%zRDvqpSaD0DKt3<<K%HBr@<{#Uw6LuJWUb3H9 z7aKN=JB#uX6dJJ(jrvzso>31Nea>M&X*&Ks^+GU`88VjnoF1HD+*eK<3Dl2C8v~bo zF1r`jZTUj!xUF9a8#ObIeab6cKe2z9Sj*j6!zExvwdFY(Y)DS&0FJwwh#CdvKCH36 zl}VG>sqqj?)fMj>;@z23Pk^1wfIEg&<=BK^uzeP@EkuC3%uR_lK(2!dJ4-{F>fq_B zO8;mT*!}$?)p-V4t$(3BSE$>$b0o};G$_s5x9yYvO$^a>R;V!QM^=8?RJ>;qyTZ7| z_RK(Da6o@W{lSXw*Ab8V@pgkHt6enMsQ>_*nwoc3fp$GuXg<OYR~?zZO$GII5rfqQ z0Zfv$JSgJ}_^PL1Se5^i3ollpa4DD<%1m|+@wVE)n-2+?P!@Ahg1M1VDD+%wV{|T@ zzm+s0%&!MY)ahNBABeshkh7Qf>l5G!?7$1rJ@oj)9H$+g@hNtG$>)emI@iR3v<VHk zfMeajCR7TX$8%_fJxsHG%dCwkA$M^W6btH5wEF{Nkv9peL(2hNmKtQ#NUTPe+;g<< zY}-`+PneGa^MXw<P$d1bv)rbG?w<!|g(_f^*1&si8ix<0R?3<ZVLc_jkByGj8O$QZ zb-l$5jeeQZv!-LsQe*vUV>(s{-W|1R8P9GE%}1-9j`_j@CF%#@ND>0S=#V~>v;<=k z36oYbF@{21m_Qa5ZnV<`dLgvC^f_YiTh@8H<*u}(?(R*HDV@kiqmXnij=-DFj{)?D zbpTCG%4MTL06s8O@ouK#U2jDn9qXrZM5>4*0I5d}Uiqi=iYa~9z9Pm21C-ie5V3P) z!WMjUBL}@xz5og!ow{Lss}=Ot>|8s&GvChWe_Q~}1BQX}p3l+SW6H(2Ekvd@MnyQ) zh*$4JFVoF}XXWXq06nhG;0<nf;Kk~96krz6^AixZz>ZIp-YeNO1Fyi9I$-X9#4I+- zcP_?}Nf)A}##`*t`0&<3(>%t)FKq@`wxouMp{j+>GeinK(iSNGFL4QlO)^$sbb|6- zsoAG^0o`nCh2XC^9r$H#+B{9gQnlXv{nbI+Y7bBVP@^vvEJz8qJKhfZ-VLh{-uK&4 z@5>2bK3kt=OA6OPN&d@^RDwI`q^Hx=HBJjt&?Joxy;uNV<L`xD#*L8mC+A{9$v(c( zsOhhMlY;$gV}Y#!z{@SRVG!XQd-G}aJ}H2XL7>@b^jjXfi4KP-ixvA1&CZg6XrcY) zUW-vRK<mbA)${jtT;8MHf3OMrsy=P`-24$XWW^!5Gl5hc@IRJGb`_W`#L1Z$3qgTJ zqI{HY>FDqDWEvQzlhU?sL3<jQ{ZsIZnMdX0kJiMEl5t;808MJxO^e1)Lq#tQ=CL>X zHyvWUG8j}c-C9kHCq(1R@h`$xk@!asTtuxE;3m{gPlYIdmeVs8bTpCvi;u3^U{aA> zna$SUuEd7d9KhuepQ?c)!GuvjIwHV@GfDRbv6kAx@}!(A4?T9|z@c*Ym0CsIG!!^p zwE#K9x(MT$I4N+*spM$1mh>z&@8BrWl5IVuBcgTiZ2JS)P^;(62Y7eAo=)pKhPms= z`csCaSM}LLCyGW>2;OYH#nYH%L}FxPH)cd~*R4uZrxZfTWuyKRs{HPh^?8UWG=A+` zu|J84289?-E!s<n&OQMzD6aMZ(14KO1;8-hAn>A|Y}<+A094KMq%Fsxg&f!1KwQyx z{GEM7yKgD|;h_d>Y_OL26k)>x(k~t6DYFvnvKZC^dF#<B0rGv$<bPGfBK0CQJpnTf za36&K5W;*1%LxJQ#q`O?f|Bt;U~-Sy!9lD66SY7O4q|U!Fb%11U>A^qbvhJ-spqDI z=Ce^9C#%2E4-LGkSiuKI1haV;L!tRAS_+uZs%bp-ak#K1Ilz|meJpcCgRvE0Zs}Gz z3wH1ZxuZ%rOm{dLDNEQ&45wSYoCax~_~6a!eA%SFec*0-^e#;DB@wUfd-fC)ZTI*% zhou+C1ePk%O)3~*;v6pNxglt$*UelNbOycog|Noqaos8%?&OBELmFyM0L4uPZZ(2v zWIeRA;7z=VS5(3^0a~C#V}aObDdc~(gg8^ZH)KmSbBTxkzN3b)KDkQmvpsRxz*)F+ z>pdb>iFY_yYkCSO(4p@l7$*R|jGl(qKxen6=WqXqVF{G6vu&~ZvCI==d-brw29)^R z3-$SDv-HUSEfPM_w*Q(2-p_Sjw+*lpK-pSchA;?|LmZ|<Mq1+CX!H+(V15LoUt;%y zopY*`i1o2{RuiX{45uD2sOi);05H>`-2mV(`jwd;$maw+PY-7DFZYyID>XG2zYxwo zgjO*j4?4JQYVFdmVC4m1k`BUx<L<T%`g9PZD_uV56V8OQ($MAV=#8SY&1_dNukh>r zGNU%){OWno#wAtGmMfVTUW5WBBh~Y?uoE9I*I=bcdhVv{9!>C@#@azW*hARj!M|df z(NWa|%5HU7XV_Bt$tauUMK`>#>P5eF^;b5ZUH8x+05~2w$khS*YslcNp<4eaTJ(TV zdb0yQ9)<dg18sQd`^pXs7vSEpm)P#BI$C-0+=KA9Y`_k``{GF;O$!+UXpds_*Ax2l z0m2O(oS;K3P{UjuYTYy>)uHf0Oyren5P=T8sfZTnyQ%=bw!=dO*8B$uN)}iOQ7d)C zAJbr}rgT(e`YrT41|d~mHd*BS2Nn}Xh7X(~at`bno5syi{s|*Ooq?|$u4Xo`cGkPR z(^>B-VK-BFeZBzvOM`V|-&&*8=L?|g&S?eov>>5Yl25=R(8cCzh6YMNTHp5`>L8%+ z-+(Q2#BqV`nZBN0t^tLf@>uKeOBL|@05MNEo3GaKHw`k;>Lv#fO?BU34tqsv&icD3 z(%d&;O$QH`-z8d3+coAU3<*(3`FH-V!+UJJxKs%Ns{M8v>|(Y)UyEOh=$o>ExJV#h zi&>$?SJPoG8y#@5;_rSKPe&gT9(_vznx?n&0bG<Ch2^h~U2p64eOK0??E?YHUjU@4 z0UgsxCnPl}v86>8#B)Tf64gcq_wNNiJ2bqY(`l+wj6izsd7<emo6v)1-?rR$vIHo@ z@KPb}iat=F0_Kr1*#fAI4t@AIx9y4jGc9R?3|TPIAu2df1E-PE^PON#->Jd<wb_Tz zOWFDd12C_@-;0~H(adf<TU<r#QDr$^b^GcVX&`7@>AC6=V$g@_J;;R7=T}iwS=;SM zST@O*xoM{l=@ex{Mgo_l)dm&+q1KR-3Tvj;Tfirn(+&RBp&bQ~57T?Zm_*n$_XXtm z3?cb5(Ii*mjfmO}x>JY+@C5+Yk%2&Rf6;ern+8au=QAGw9JlmD2VV3hU^l(;x9XZd z9c(2wL=2ie0SKx5KlmsIpb9;$|LQZy_^cnVm-)?f?a?FP3ug2xM~xE|2w?)-wD81Y z-Ec16L8x;e!xsel#t2AZf){iUl}W1S2}hZvGNoRe4tJ4_K3<mY3iPdG*9K~#*&9r# z|0?R%0sI)5_19N`?qwYyJXV*Uz3josE&W6anO&uscRS~-T5Djzg!i%a+W62l?bP>F z;<RwiuCK(uO1i!NKA8uc5S>zZ3vq1#aX3nkBE*@{!6Z5m0YG#FxHj<m%2NDMy55fs za}vjZ6Z9+AuTVFXXm2^X34ogrLgO@cF%y!jnprn-MjMH9)bU2j@_D8WPx+5vGOk8W z90N$kfwynl@J=~MpJ|5Hvh}kCnEz>W+*_A?b3V*6dd2*Q*mkg$i9pL#syrpikq_+= zU~zQ7PK|ODpjWHWEENi;eyy2(O;@3g0dD_(CN|}w34bUKpS@Wq$6n&&opdNO0B2NQ zT~@6=+5t9hMpf=OTO4>}<`E-J&l;_}x2clYqK$o^2uaiGM@<*mD&eP05h{oHRvY%0 zvEEBS`a(^b*;(tQ!}it@-zu?Y+SqGLiEHQ>6E>Kn>x2;C>eCO`-hHLqd5z<Po1)Bq zb-}0H`rCWp8v+p4VN_<H4)D-4fyLx@TU#A;@DTac53uIb)BgsyPu|GdFJ7>3*8Eh_ z+3#LNTLCCg>l4+st3SB8Gp$e1ErX{c?B-8K3#b3SYvIc#Zc&OO5V+kPlQfMrqeGAy zZ8hiT|K5G2-FcnAd-)SSuuF+9&|Zj{)pQuDQI#=wKn>c)X<!Vjdi2xaqm~#<kMzA7 z{*dmkKLHFsGkHjcbRYC<wyqoH<30JPDGeqW_#T{fAV3R@{mJPN$iE5;jJ~zJki+<C z6;jK$>5PuI&bw#!E*R~AL-AGgFa%j6UsB*x*^Ps$=rstv80fyWXKrx8NzaPa7xMkj zq};sQ*>}WYaae)aQ*h*efbXRi{Y2GaRPv+Q`GuCI&VGSU?L)>iryu_>gPQcYv?20U zZ0q{le}^7imH8+m@B5KaUCnDa_ZR+6pZxSN%fCi*#jp~!M9<JRmmF(ZdhmRfSU~tw zxE7iPj<l6`X^gtBn;Pb4&MxBg$tX&*OErwd5TK&OX{9asTtf;0`>b`RUB^*0Vv?P< zEdW<fNO4BDZW-5}UAIU0;BNenFaf&>4gFs8sVIBfr}Iy){)Jt3A^soCug95}zh(zv z3{w{rY|eUX>7R}5aV-|8u(j5yq|e@5T7K&`I?`K&*Ad*h2a66uZv-#x9gdMB@lGm@ zRzc*6=6Z<KHi*>IbqOS|StZFNY$9kn%!F-*H;67D0lH+NiLyh}3+Zg@GKTmO66^%0 zRAcu&F`4(JU9TI^>+Wz2ayoG=>SX!_PYnUmUCyEkzu!bCEvl2xEi-R5B@y(~T9kYJ zzvpo4GQKy?PHGAvZLlJ<?Z4+1%WV@jmb%+AgG&r~?K(;BM?R+vTo7DoGS4UyOLQt@ z<~V@e<ni(~Y}`=<Zf1)2;=*)XvCDwguob{-k5i3mPDvKGHNPA;_a@9VP}7?Si)x|o z%M<&ZZ&tlOkX|?M!lR7Taxv**Yodd6*LTX?`AsKV91m_T+n<Pv4{J=;a|!9C%U8Xv zAr$YNna~;UNr>OL&;J%#XGkzP0?4zio1PysE(#cxMFg=sE0!(T?}Kx?GIU+v$(AgI zKr)llvzug*_>W=hkhlcihMG&oN($(=+S;~h9<S3TzrgrpDRscRipj4BGAw^S-<Ojy zdo%S^YEw#c$u5na&DCwnzSfx3%70G*{$b2SnKfx!{oWfx^Lf}?Ne;nl_wX&}6&o$J zVIzzK6i1X{tB(M&NMdtkQJ6*v;7B(agJQQckCg4UXC|35kCAE0AQoRx?OH&QyvEMd zou89b5Lv47@E#IuAoa7tQF`{v|GQk*vQd3d$PqXwQO|`FB}+1_;%}u_d5!PSx^U?( zl{xP(lK<otpj%>XtCom8NIyIEtYSq7HEV4Cpnd5v#u((2B<L(`U#UulbFO@NuE@Od z=mdb>v{3{2WQ@v2jW>ZmiRAny5!&+@3n>UQ;UlC6rWU-KGExIT#?D5_o5eCaGAvxi zYD@I-$$(wsm-n5;R1vcZx~QjDV`<C|NwCgdAKwe<U-{7XSUi^+AS$&v9tx!=E?&Li zkD&QcRR;rHlp)aF4J<F3B%(1_+9md>V*sZvWi6c^YJ~9hI0a*nfs#$~(-dW@j{xgj z0W3=?_9#iF4l@9~$KC|{yd#+ZsU@gcvN%wgh;AdpuD5b5SScNPU--S|KoglFq}z7$ zD{5tadpC*FY3N><`aMT>D@Zj5GZVHj73pY6BU9(S4h!h+5Xa918`y`~ECp&K>Ig}N zZiG9c)PJvM{B#b4nE;rTzxNE|1~GgJ!xYUf-|c&~1CLAv8yXuSR=6W6PjMlOoBu&O zP3TY&>`ps-m4v7quMD6EyQKmsJw`ZW#0a&HwONoOy93zP9%clw&pQZG&|3uMc-LyN z3vC>YFYXlL;>1EB7k%rd)L;F<B`klOn#$&qFWHDGLLK!7Q;KT!Bo$UIT5$LchSmK6 zftIL<r`s1fgN?UVp7hbbtFm&voJ`#OhKaMFv;DIE3D7-xMcw-*{PU$m>FJ%L25oAI z>0WlXOrz6NM`6K)D5Kzxqk8md1czZmIf^c{6`dPktkn0fSrM>dWd$fZPYi5iLl+d? zz|v`~r>od(KA9W3AaS;C3MosUr9jOb1T#so!|BvS{TrL%1_CnY-ZmLFRBKQ`36E0| z<o-R03O|h)?Z4b%abz0Dq*Z0SLQ`npog-D<{5)?+a}?a9lv@lv2dnPC@jcnXYfVU| z;e4cU>nKr5w+Ftk)}j!WB>0tJu`6{rdZkphjM)JMFc6lX763#?lj{3I?fOerwLPfE zrTP?Qyd@VVUKzD>7z$m)OVn7YHNa}BMc}a*c(Px!11k(pKa#uuEJan?z(o0X8kX*o z(P16q28+cPJGG5b>gSI}c$QVWw5d#2XxOd^07;PoQ~Pq?ZfyhgnO05Uv#Br=fsdbs zWNhl=#)j?99jnhoR|Gs_XaIwcXbkNWdFyGpnHT#oUU_?a;XDvmOUIlkk)m)lZ2T&A z(Jp%%^I{=-+n}>}>B>ZSm|29g1_*G1Ms$ol7}45lj-CSlhi#I385ki>GMKt^DAB23 zMKgR;<#I=P40Yjy*tvF`if)vE-<1H1CPh=THZDFVL@#*5CUW?}xGRJ5?EaKE*Cije zwkNg;Lypclk8=Xw?UfQzbS9Ku4Aw2D>o4{V%B{rEX01(%4EKVV&B`@MRf?U{Fb)t; zf~^sPdO`uMKEwq;8Loo!5X?UEr?{ADIfJJG?1#cIBGXIs*`K4n$tz_3MZ<WrB}r>A z+E2laZ27W4cEDVIg+=R^nsr+ydBigu(@i!q!&alNQ$a`c;*@&xb)D#mG;CSqmF8{7 z9>@7IHBPw2lB>1#bH-TLRhLEgf>2`K8p}MPe09RSm*GB+qAu{H9B`_GPNgEDF^Rmj zZfDt$k|*=%e6qV_xdi&9QQ+^c!4qhJ9xbOl!tq2oQJ12`N`mQaqr*K(aYl|6D+8tg z!d4vzvp|X2=zArR^n-1{5(ek@4VIUC-yc`EVf<-8DTvxb9iJ)jFLDr*O^^;jyugoq zk#=nZGPE`DRX8I|9Mz2Rq48x_mP#0_m`$FV@RiPOZ<d?%3tnD!0`DDu3Y#imGoyCI zC}<k1*CHe1-NGH?b(s7QQ#5VB)QcMKb}TB`;Iv}i#+U9p%><nW=jp*9hyUtY{rC4? zhi-hXNvbpG?$kV}(ge^?*AZ(-fnn9`ALo}#`&?xB5N4=RRRm^sg^uVj13S*hwlWF{ z6#2*4OD46=kvwq%&fiH<G>;7H#ey*uFm+0TC1Z(9#E~wu6#BQ?6mL+NE(a{E6m>Q~ z0%f@7tm&ezMj4HV%$WwmMXbHI+9Jor2B#1rLoQ^r7!S9+x9bE~{Il!NnSLy?1+X#R zu#g?})vjuIe=`is%F}0xoErZpQ%QU%*xX*}8kNj+$jb?Up&6Mm6Y+*mHW<S|JBkjV zaX5c=W1-iS+>}w6pp^wq$%AHW{bLcgKReZ=0GWo8r2Q^@B$!MON(RR92tbj*vB(@X zQ+tc4pt=FC)T?I1_%x(bAIi~TY$jT4qeHXE@+d}OMiVB3fn*9hy?>PKO2ap{TTS9h zhvSO=#{s#oFkH5tCu@%>02$1nh-5LuJKHeN#WD>Q6AK2~dpHSXtX}S1o|wa?PbveG zlmO@|@lryivBk?M@{AcICJmfBB)(DGeM2R&(SjC@XSGJBUnYZdX2f>0D!KDChC-Eh z4kNWu*JbwY*{s4Sruwt`PYo$OO92SH`UajwBSLb0jLFbojAmR;R2gqh^V-9d7%Bjx zAr!=v4xgl@r3420AnxRI?g|j^icTE@?hgZjjS}h%%0LMjipuv0!OXNG=Uz!N3$<1y z*)alcOcU3<0vBk4myY;cwnK>1_)ceZE{>V?U(rVvB%EGQ=-Nr+5MXAX`y)(AH$q?- zz(d%zT}9b5z~ZUB#Gy`^R#KHHZLukK<Asscg%%8iC<?5Nu3(U5H%!j47*bQFG=(P- zrX!g{fVU3CQOah#imTP&wH1r}c_6??&!VTGrvMTSA-g-6W^{=YTkcGe=gweg<CrAj z`MEEhvV`YHIDMmSMZ#EQm)hb*JH~sHD}gNk%|v2K@c#|9n16S1o|caEm$ACU?rG3M z3P7aDvGlI%vM@cZAC7X?z1{_*0uPvY>yc#;P{r6GTc`np7eOeEICrYV1kjqOBc1}< z=zt?G0&qSe-GW1zGOjF+YFziIBxB}egXoy&O-%YtAW(OH)V1@2dhf(fY+QHME`<!c z0)HW>?}QG+ZTB8yN$Y=Ns8jPxkwTS^l*mACCS3xVml~>(+)@dH<>IY|JlhK+0soJ= z=-@_)kpP{`oW;b_Wl2-wg*wF$AHr%eSY{+pDCv0#GFX^7BG8JxBA^#ppeA(K`MfN^ zX9&Ta{EAFE^5j2kCa;3{mT%y|$yD#P&{b@(!8XwAGZ|N+H1}Gkit<H+N3`I^*znD@ zKn=SxZG~hjMVd41-)02Qi@$TuG71k!&P70aGm^!z%VHGLd9ku&1!CO@-8KR3buv(6 z`LjuZT7iWk#gWruD-jf=k(!G@>uGRhJCu;-CZb>`8R*Z7lBZ4g=sHqnt*MVdy5P&b z|Gmb<7%$Ioi)P*ga(K~M%u>+|CSa;BQh_m>;$_ndt77%&?Z`5ukSFR8&KkojgcAN+ zIbS7q?sdnf$ySpOox3Ds2{3ciz`_K);gqwtS{B(Z4rGGt-c#-@;AJt@V@hnsYcM0n z8NY(ijfK}K%SntAQ8>`7q&K&5#hP4FCQkAX1IT*&z(h)Vwp^S(iR6^a;(}t%sf%)z zaDEfkeHtvZ#BSgse$#*r86*xBNuj$@?Xuw2B@||12qQ=jz$_a&(hv*6wP1u&(jbHY zT+wn0+S>?p>@_!510H1f0Zz7`iCF*uKCunfJkVdzP@P$L;j^2o^xo@f%>K9XO!cZ4 zQw~09|2q`9Sjeh6d^*mEF3+`$4|yw(V#iofIkS>aMeEwC0g-sgv^PoURn0<}Y0&xY zi+e)mvaW;%tGGa;Jb?*Bli}7}$UAL#xu`HyG`w6Pg(%o{LTvM;8sir6ejSoLGrVU^ zYR2RPNub$G-^?_|wR%-KL7dAtkvW5Q@4zhjBWa%-iSDyGjD9?THa<#xa-CHnxnz^h zg6^Z|S@7Ut;hOEExP>fn6ziPB`u<%)NtjTwi(Q!e8nI_e&u)R{vI{S)5zmX2vH&Os z=gn-nY72<BF{Df4^r&jLjcm-usqi_-sJRlf;uS_yAZI12zqmJehtVHv(Z~7E#L-Lj zEdefb@3+Er{SJH69mIBw*%RFPF&XV*kcIsH>iq0_^SLwPfEi2%Th1CTTf;}CGYX+; zOhc@|n7C#x6CKP0vrtF^8AVu&ueAqq6*5~kkPblGLxFir)uQ%9XGF{?5`%bzq|{Fz z!dRPO*Iq8NW65*9#<Pb?6g3El^Ru75ylJNBQX2A~?|tui5A~udC`_}kug`iB&;pTW zw__4S{-rF$)4lLR@HqN{*(6!IT_tm87A`~$HRwa}_s2I4-Dv^Ad3;7ruVKDeOycjK z^E`3a!KI6KCE2|574}X<K2O;VFO9Ukukwxdb`SENDtZ|(Ir!FhGcS1Fpg1N~?qL>O zp_an4e}|$|ml%?zrVQ!kTT(`?Cq@aaqojU3DbBk$E^3rcL1H|B6$$5^Su_!vl`@G_ zr~jS8wCG)o!OA~B&(3!vn{K!{iP$mk6GUx6bTOvmF|6K08$+KFgQBS<b8>KLBedF0 z^J2-k=`<>sbt>vl>w|@gp22&P#hy%LF<II$jO5gUJNVExru3CXBoqLbtV)sSgVqCS z<=v?j&#P#!p4*wdG&@-&WD{zi;*Bz!r-H2xjbY4QV-3^#GMAzc^uWJUVBUUb9~^8? zL2Ol_wav92y*QXX9yKLNXoLl#SLdpb#Z$n}AyjnivOF?&g~H2#2hDEcKS%XpNUDpK zm8p`;Q@ex+dhA*G08;Vv`MIU(52F?X9rq?tPfAi=1f5SeWMETUiZ<&c*X&CcP4(I# z-iy&<cb0e=Wq!6O$n*7!K!x<?HG3ZlvY3I61JIsqjLz!Mg%8FdMP8y;UT2okRPx_& zB$<g)C{UH+)bZ&})=yWJ52U(xkT&bTe0=86Si<6Wu>*{Ww~g8&TgF^N<X+YkF#c5@ ztu)T&%UE1wVI#_cC&y5*i|A*U2B7F{IEe616d7f_4`B(Hym34mrGO(u=$u|adsB*0 z0me*;8%vL%{M(T&=3X$S^!B>sr|>XiH}<@pd^3xU3`+-Y?7zxDV`7$i+q!x;O6&&Y z5M!=4<=J04Oql5Y5f;3!UhcTr7By5zXCwMd#A9qUpcR1IVSQE_@IgY~!uA(R-I;fU z-l!a=3?@Sc3^3;<sK-W@HJS>w@Jaz_p~@Z;rTpvuabxDlrze=8J=Y!1iXFFpbRI0q z6kZo!#$=yF17K%p{D51G3LIa2#zI2mZQ!ytlQm-dG|8jTe~2uZd=C&8D_daT?>!?8 zvcJ1a0pl6s<lW0YT$HUKOO2<?z0~#AOu(N7_-G{7Ln!N^P8(5!m)^66sgG-2um!AV z4m(P2u1A0SmB(M$`QYhugIVGED3*N9N4Imi;=5uw{f7%{x{}z4dp--VzmHhZ<%eX( z8z^F*ci4p{@G<~tAfr|=3r%$KZMR?_XSCxGI!uM&5XkEd=)@GS2*5;B5G$=AJw~yf z*_W=CWep*F-M-N*_ujY;1pQmY*2LwDzCGT*aBfq=6jOfPMXq~r{TROjVpwJ9kpJO< zAe=Y@2XYt@n*s}c*LCe=0YtUrd}Oko7M@h-a`9_dw9EV*&tiv)up)q?liAa2?3swa zQev-092lnYfXuMHa62N7j14}@17@@sZW;osx6N@pynoUt<E@-R#~vbXH$N%vTv7Fb z?le0ofM1JB(gCcGyV;tNqSdM?Z}ORJ%|;Xjs2M`P|15<S=-Vbc<nQH0cer@+rbcPk zV&?60UToJ(0IJpnMUj>U0}cu?u~z&q4e{r@$Hz*n>9#-d^D-F&otJNFBM&rAk4f$1 z;esTlMSI^uvp8Bn3uX7bRTXy1ZzrZFS_=!W&zMdjDBK(<5K%n1v#b<Q;NG*DPJ2cb zCA;wEUKvBnIPQf;J|V#k{4#1`Lllp3KJg$vIsd?YBLG4{C_1iCw@N>*#ANOED`4A1 zc_CM>s%gU7Eo;vr*?+cEX#rOH@4d5q&yRL><xue{=X%_t{zn`?<N0>>)fbl`b<&M0 zx5Z!Mam|%&ZvXC0q%QZPwR)a@P%iCs)?IUJJb5|{_)CH{wkC|<Y|nU#JLIEEk=3q= zbS|KD6)g>uA29V=-CKr{-3C}0!}L)|5gv7+F-Y%dn12?f0^|*H#1gahVIi!P!skZp znlhTAVfx8ncEtYFapjS9O_{@__TKz=!3(pWwjX%=?$^ATmIs>3*AI28&mT9asCl(d zyeTF#_Qw&Mu>St985WTFyZ0Ul$v3U59FCx~#VE&`=^neoK8b9@VH1HS^?;L_46I}e zD!DXuO9ya4l@n~_C{}eZ!kMUU8*WPY06F4QJnN0O6QJw3Su<C|U;`fu8_vR1`om?W zBgbwefN5-V4*09?Q)Ga}dbZrJuW+lw-ni{6BUzK5y~9`$>$#nVCaHYbe~s_fXwENO zZw1Vq@qb}5$@-!P!3rC|iS@Gsg`3M$cKI3bV{Nz_Tqpii-LeNt{FsSQ1Lmuicg=A= zqOhI&Ot>P%tXjjqZs9Sb($EX~8Oi!~>_jx(jAtWurA!1b2^gYXH1Q86kdOIcC^~52 zQ=qtKL37%<Q+sa*uHNfAIzkuY7WsxgKbwXUTdx=rJly?<Ck@^KM-z+(Og4X)7s8JV zj8PG+V=~0BivHmyGc|}_;VHL$y!)t8BzRz!PI&7w0B<{HhhWX}T0%?c1sqe>iUgYz z0uZGvA-E>k)R)ES@(IGlpP2v?jdT(H9>yk{f;|)TPXAxsz%a`sKN+z|T=2tNyYBX< z+jb4LE#<xs3pQ&EV=aWzJB!!Yk(MW^D!B`jGL+?h&C@5|2?BLch2L2JK_lGipUY)d zvNy|1JR1^!dFT@wv|>7$?9dTDrcErut`Pw!w``os30KtZc+=ji;E*Q)RMDjdF^aN- zP;5;SLJf-zUW{4`d>ZtB+^)ZrWl<A@upYC>DXfVwE1$OuH&=s&#ap-%(1`O*?7wR5 z<^ga#i@6RSO|c{O2!2RsBjyKDI*I-?mCyS{Q35s(eTz2@P|-r&+0+7Z0~sJ_`F~tA z1<`C%%n+voZQD!-Es_+Vr;|+zTw&G-NIUPtK+y-RX^I-IEIc_!O%4yBDaCLN9a^lG z7=F}VO8@DA`6cWKX!Wev1xSg%=;F#vCpuGCO8;1{{>8Kpk_@(w<M4VQwf)oXO@eW% z4Xy*yg7$j+NvfY{qz+;inztoUA2H-s1NlY{ybd!Ny<4wei+n53_Lh>nI1!0(T(lUK zLB{HZXc1#ZhuLL~p<6E-gRf!ht(+?I^V6|@7aUo*@DW1v8tuSFzqEWb6&B#7Mb=!I z?eN!4C4&7-V39Cc)SRXPuF1<yb3aD>+l#T1=z@(3#?7Bjg@boJ&p@ce>NSfV`<@vj zj(@hpiYAaxC@$Js@y75;Zy3lE+diyoEXk)Ua356?sEk{HO*7zLV;Fib83+4E5PU?7 z+!4{hm!~0Uy8!a+Z6Rg%cCpGnpqwXinG1({{GacYXHKatA8Lv&SMY%q1$I=D+J<^E znV2E6!=*CW(}7L=_X+TvG?wB`r=bF*&~a%ZME}~6uCoFu@vWznWnw2!=tOV;MeN=< zR)Ianb2w1N!7T+K`?^j77FYc2kKL1Jas(vOLt!62LaeKtCH3&dk;|rw-Rg7(VaSkK z6<uOorZaF<6*^JGl6*V{)1nLWw?9H&9shDqQ9lM7R|)Fr>`)08i~Kok_es~bGaK~8 zD1sI%+{UF2yu`A~j+AEz>YLZLg!v1OD6#yr7`WfTu@xzt%lbgg<99OGND=$CQAjq^ zjb3Wwx=6h=aCkb5r5P>HQE)j1jS|#Jp_qu!2^3}LXi@Q8hwe^%%puTFiSskDPo;7T z5SQ!q6=Yl=IKsyV;Sp0K_4P9k(0wAo>+-0YPU<7p=^fEZPAgKy!2No+YIEF48<oc3 zDG>|ubB~_W(;3)L15UKh3L4JEV0LxEGSEvSwovF(`~@6Sp`dKVo1^+4H#J3sEH4bY z(t%pcfMb4vQZ|40-T<{(+?DeWA#GxHehzqNYTFajtqqosnMFHrYy#AKmkcwmLq-vM z)2!GwG}Yhs)~jnH?<X@Yf9xhOwGZ>V%|nM)6dP9YW%{&ga$UQInWfqdnFva!=XdD+ zM1V!QaTDl|h0|+ZC|MzapG}8Ze`f2)m#KDN4C(MwgB2GI>o29`9KvR+5B;T@q=me~ zoQo}Zl3td)*??E(d*I$NJD%;u<iVbQo;!6uH+013yDtG02)H>7rbRj)Pp{FT>8f!P zYd)%bIs~_H#s<4>R#R>JQwTwnBWOn@$6USDw)i4Keat}2qB?+hpc5a887{gwdgm)e z;G(U15WGf9^t2cc*u31Q{d7(R=JPo0T=4*Fj}+NvTy_<{%~{ypM@+(9JOuJ`*L8g$ zpeSiWT}y7d9|L4-qIHJW?Lg-;;q+El#B@9P1@5W9%K=9p`gooTmPN{$$2iO{fDCN` z_yuUsZQte@6F1a>*{r$?=IswZ+t0`6#9EF#yxjxezk2=x?d+UUA^Ud6SW^7a4(j&j z5@ClKvPb~X<P!*a*6rEeuQzf0My}QN&qan>d%ep%2}nwWjDIGYn<xm6v()8a%cvfA zX7;gpGZ|!lroRN~_6eWJ$H1RM>ea8ph*@R3W$|6qyxLRGGS@y#&*%ag+QBuCJS(oI zs&M00`tiHAbY}dqlE3L^R{gtxo`aG+Yszm*%>g_eR7v4$SP2o0!PVzhM_wz@As;V^ zNp32jc->S7`q}i$jwKxlOKnQ@NdjQs+)FNHzu8V0Hev!9|51(3jh#&|&t|Nmjp=TE zm1?{<XZyIWvgwKS#m^jbS%c*<0PC(q1-?J#+<{DDM1Gt8zNiGf@7_Q+ZwXl;Z7Y-p z?)-a>C!%*>)=R|TwX~!!wI~6?sS6)-3*B5x_Rfr&$sG8${_xS!gtdbmn`eK)e%g*# zjK!a<%)Ws)Kc4S5EHjz<g~bPfE`Q!BkyM}2S#Taxg40miFr*qWg(5Z}0T2$+i$$&o zMm%!3I21?dw8p}<1BV2|7|rKcX=$<4BPbkwftp{~1>yQUw5EP6jZ+h_Myx9dU2Ix& z@O)?=k!Aw+S7^691w;sk+;zbh3k~S>abi}GO?9+pF6)uW`n>=jK%)}V+lo*$4xEAn z3d;kOY)6LX`o!HE<;cx~4ikdq5wWzLhAxm5-pZ8jXir!zM5^A@QCn;MRO{@?QQK3b z_#kY630r&Bh^1O*%G0f)@5SF=UDN^K+aS=ycJ^U`6cz$@1)XZc6-L$&$#rb5l0&o? zOHvY8-5kq)1vmqoXzDZ9$<VREb`x>F1yLYyldIy#t>oUlLhzpeEP3n-r|Y6)2XRwF zuI}-;l&A{v;eh+2_u6b?6S_QHW%?N;Fyrn;6TmBXrJ%0En9K%08$XnF`3W@`fd-?1 zn!nt%X+((8h)o8f-}rz)gXj|-7-r`UVUl~ou}d1Z!L-C237(hx)K7VklLp+{g7#C| z^kqo*g+MO+XG_;#pClez6Ni3~0_bTAOSi0ENb7*Lh5uc@$MInk6r+PLQ;Pnj+el#R zoTo@0JYUr1rw+EJL7eNeJp!vJ`)KW)-d;~uuybAVyyas2eF;v>F`{t6`x*{eI_TMV zaRewX<dTEJQ8~KH6ry&yLun$neov>BGdjVI{W-G_eL%<RO<tG=u%^g<8C+-eoR|(^ zGLLhxW5sF`&cA@`M(YG>2C^hva7aUAK_;=l95q4;8YX;)oqpW`flge%hNIB1Cb|;0 zNNsB5c%Unw#?i7wnh;0daBbAzJ_IaSzdEQZzEbL$BAwr3bgrNZp3(PAyB}3hW#65; z*$6`@5YwjqIAwyN8PL59#wrns9~;%Lfwf|*CBZI@w=$<YfIQIb*h2z_O{^`Qzmsb{ z%a@p{l2%@+@>8<slr46e09N&{Pjo7uS)|#qcf*Fe;z2U7rekGbjRZHsPS1tGI_`g= z@%C=rm^^rEY*)*N4S(S=mA`HP%Ry5iK|e)2InC>x2Inw<IRJ8U1|j?m|BIrT{?E`# z_hMmeg9T5lSJMf$9gjIS3NeaNntRVP`fLutR^3ZK);X4+AtxPqwxf2axK)f&!cN5- z!iY}(N`T^KR^?t;_3lK5-^;%Q!TPKYdYQ%%0Ono_rn+kXG&UO>7hBXgC5{|YMmRHX z)}!dDq#D)zKMWNaUG1~TV{g1^5S#QfV%6-%@>{fulGK2@u3!fvy*!6mtionR#vDEN ziiJT4CF}r;4aLWwT&M=-v~|$c8qX;)GzFNVdh|2?J^$P&aGG0nsp9#5IWAU=wqKT* zxsIrWmlHI8wcO8cY*qp6g7jgP`cBZPEt!Xt3JnT&Re4Uq&Zf(hDMy>V3hyd4|M379 zm6O3X?!3D6&F+<?D+sBsq-;t9`ZgIYO0R;9uUsECEZ|~l0D8aX@$G}xICB3QDW3c< z7FP)J5SB=Z*UarWL-7kSs+e!&XFo|~{T--5Ya%#%)Ph!b6g3xX;AwH;JC+baB3#jw zrGPgF7R}F)Tn&b(A(;mxcW?P={M6iInOzh_Y&bE?Ch5A)(q8#dx;zr4NsL8=?xpO# z&$R9)NlvRU(P9=Eunu5v3*mS>p)6g2m6W}AHJ$aTh4OdWi%QM#`qOi^oi6KTU;VWq z#`DA_6cR9VCs+GognZL*>J}+c8lcb^)o48KOE`@rOxy6+(LxKKE{0p5&M4D<k;cgf zLAj<oy&X4HbQP#N0%XxgGY@0xmMt_95Bj?JYdd<jpZV(*+l<{oXAPJKJs3)|H#K3i zG+B>ZJ8nT;EcN^5@123pAp|9tu6g;NVdxyC22KGEkg_}SrI^psaY-p$(8VHaz%-3V zhP0|({`ltE`*m~MIwgZ{H~xq}hO>ED4>~o#jFd#+;MpA{jiy>+O|S=&FA~h1ovgZ# za8%XWz{CC&4o2;?i_HG{PU$zXWT6_QZsI1MRsmb9Hbn8}&76kwq{dreYU82jp%B<! zAJc2}-Zg||-*cwdh&rTcPkL=Go3<cyE;=+#a2|&lcjo7C19jE*%^B8L=1%VF%0FQ4 zCh7n*O&h-c=?`g6TDKg%7~6WZW1vo(A1w`X-L101Q=@Z;>F?pPQVtEUs+sB|)U3}D z*Cx5($zswJ`~CV@fFQQ{yz*{77wm@4Xzp+(z&(^zs@5A^5tjgTQityTW~_3mla}at zwRfzfbs8_Hz_YuIHU`i@hd=)vV?Vg$bYU8g<GPhL4N|}MC4Ms4>X`nGz}-F3&W+21 ziDdc$y%RQV;noCXlWkV<wJ84}B!K_XPr-$08XT<?%mCK%*a7@PL--SC=UtD+l_YgS zTiD5}EF?e#7xDn_d7IB|lKyb-{)TXI6B;-J?xWoGH$n7q%5Tnx779UZ8|op#rLAb) z(U@l{1A>-#_-j5LQNRH#HlGEMYY|*q_>9Vp?Gk^Nyw};kn3BfUv)zkvZL^E<ME~Xn zDfkD2P_8La3mXlsnh7tqbg_om5RS~sZd|BhgB18tosZts6PJaOh*NBw&-p5|S$06$ z-|r4AK4#HHsAU_dK&Ss+E;E1QZvw8W1+gJ+NtH-I&7yal*2E8d$M|g15a9y~p!epb z;G%w@ngdO9=6>4%l;Q2$*`Q40u^#qEQ1N$|u62?xMqPH1?_2hC9Wl}P`5Y>KnY8<K zJ&v}1-G*lue@dz-nv$9EcfAe{<{D!ANRrEK`<N4M%4JTCfM-Tm+U3#!mWH*Y!;9Bc zw8d|0`jUw}KZpq0GdY+tE{jKf#;M0QI<}jDR^9a>6wdPn=j;(_(8-G3ukZ#$hxR2> zb62qk%WB>GubegT>Ddwxw^vw=<nwbet{Tit+gCGoYQJzRCw<{8L4(Oa(&|kY?BveN z;Q9mtR?VG6ri3`831o7xf=O=$ylK(FK1viT1F=uYD%#-Fmm&=aLU76|-L1Qrp{?&q zx`;J!%ru$9#<Eh_KGI<GZZEOR-+!B?tmK{+&O6@1c4zTF{a*l^31s$Hylqrh!8Qn| zp)`aD5Q77RkP9ab--1;)d;^^0CFixw%SdXeZ2-kGL=~t&UtL3b*wb!a^H(U1lEt=> z=gLwLR1rLca1NGzn+!2T?3Aw<4*?O78~`EtBQ)cKaVf+eKR^K2g`Sas8RUTKVuMzz zKowwkDKr3S^wVO;Lp;2rSe#!TK&t^*GTHd~mT=*qpF<6pL;h@&!!LjXJ4j79B&!5? zL#EqPHypqlM8E-P)IU!;C(Xn1lp(n&c-k8GHh2(UaX@PiIyVFb`zDPx{G19Lfc1jQ z0kqPUG?euoKm!yaJovg<*i$%gfHEsY0gyut7`vo?19muc3|Wa)6o3(c!5DbgfLlB5 ze3Cev1BHmd<fg3y+yFU%p&5{aVt<7_Cf-1myZBrJw4w=}XL2UrQ_{9P*X*VuJxv45 z00u~SS$t9mi~}vB5;^3zr0z~!u$wGrLkNrkEp)-bL;Q6~ytV^3VQ0e;Xgt*@1RH3x z&6`D}9RYulKn7&Mt?Y|-c!O%G7Q#Hh1317`L_!S^{sS7!fC#8G8~kFeW7;E_&_mF4 z(<SLUD+IqpD#&94J{&*<j6ef0tI`K_wo`}!Bs~v-0|t=8c0q29`~7!pU%Q@<uw=gG z3(LPOgaNpfcPQxtoI{h;GQdAl?1sa)ki(G*uJd(64uGN?tZ%g+KF~zkIGn?;m;o#J zJvQ|35p+7Zm_rae(!<w<$#uT+GlU2@*YOh?K9oZQ8^95Gg9?NLJG>)2guuTBv75R6 zVQIrYEW8mo(evAWmc&Coc*8G%JE;4)vp+yNe7i(sfMizEcVI(Yi;D#Gf5kEcKuG8( zL7)UP0|v}c5hDi)65_ydyY`P_MT-~zUAqzfMBo5#<QjmRSPk2eBK`VpBhhUlMwiy| zfg5v(QU-3;T;|ldlV?w#KY{)v3GP=Uln=aR!)Z;MI0EDf2<#Ur9EqDitzqjHLfp7* zP)XD<^o$kR8W{?Z+cs`rh;ZNRanq(P+cj(Rg8s9X&D?<;eY`~~qD^nMZ5jr$;m{2y z&}!Gd9k5`5#<y$L@@Ce&nRDiA;cAdWNn)JRf7SQ~+2+jvN;BuqHO6Y~n%!&Ivdz^^ zw{C6Ucky;Eysg240;T#9)3$e9j)CAdFxG61o3RpLL?p#5oO^fgKOt}MCa{Ww<)^Wg zGbHXvq*5xjnf^XM=iYD|o|@@5z})_g+y(OJrxbN!xoWe$9Pq`2B*Zz7z6T-fjJgNZ zY0ZG>E~|zcU<NpX8xb;KX}bvL+v^)+ZXl;MGuZgWfp5MkptS+QA;v(?=3ytCJgl&w z3YJI=Qb?YtQ(=Jt20}_HZZbfw!$(x`MjN|^lrWoc9Qfr3BugoP020E{1{_w9LxX?< z9OUkrbTZHbkQu<iX2dG#40120jOs^)akSwEgK*s2kDM>X=>{9whOEXK+HmVrK8h60 zX3QJ5K|{a{K5#)wZM;!Iphz$fCmVT6)Mf)CXqh2CMC)voK6$VKr-&mudf+W`42cmr z0}7zWkOIP~i&gaK!p2y;7XD3E*<~5UjT>&h@n)NS9@t=<5FWvXqO7>_W&?bVXswh; zzTse-DY5Y;7L?d1AcJh?^lq;Z8Ue!#G>3InUp2oWCLAOsAYmJBw%XtvHd>Pa4R3CM z&roYdyyk;PHpqYjbG^w}+Kg9QZR3o^;oyM`Y^gz<1wsgcoD9$~V4Op<`G$@l$|*p< zQZU^h1c|C4i2wsi@g^JtNYEC-p(L{c7|Zr;T3&4=c_hyR9_S`F=x#V727wI70G}HQ zh)Ai&f*2qYw8SX~9DK_8<%1jE{vhtQ!2#!pb~8Z8j8dd>t$=Qz`=A^&c4cFM2g;dp zJEjU~;2TRN;K1kz{;%mKha_leB+hu9?mVcy3Ru7#{S2r<scT|(ponuKNq7LmMUJSc z15m0RrBZOuU3c7V@4a?|49Ecu5*A<s-~qOA!2xg--!_|WW^S?{5f;n0R0qZ|!3a^U z_uPA(tmz{LV9^kP6$i8GW*kXwFee7&N<pIlIvgM&h6DEI+xPu@C&&ylM1Te~WMCU1 z$QU=a@xFeTArkap#Xi3AsH}X$0pmDMKMbIObG1ZBd+|mi4l#lp+~|8H)X6-)fh03* zqXsdM5|#cTk85b-8{6POIuckA5wHOq3+ToXq~#TH4AEVYsD%+Tz=k1;V=b#W!V|Z# zjc{aO0pbY$R6o!_js-Z39gT@pj0nI6{X~uphT<HF9`lVVSRev<2#1_Z7)OktMkVkI z-JTv+5!z@Y9O59x0=5we{RjvR5XrzPg5ZKkc%yEOteZK&5s4rK;Y=AI%lyQ_$PI{K zKjJut3xGAH;1mWNv3P_y#u$qNeB)62qRs}AU;<yPN{+Rp$UL+n2@;Gk1|Kk))gT6` zJz|LiVC%pDkdpy#s6!p!=*Bl384hWJ!<pZB3tfu!8*Q*+9Dyi+H@MM7J)$lgp|hEQ zR6qw-cCShvbORVlfG=CxGJSN&!SV0`%80a5nAo7<FCM^w1-PIbhl)o$6veD$^=wh# zdtUxGo<$dk?L~bYD2E^ySOs*f^Lz1#)eIu=2FG1yp0(uGI8<-|fiUnKHK0S7V5k?= z5$qg!)C@y!W2`=fV;doh#SP{Hjt9_e09=EGI5--|%H^O0OMnv`ODf05h{+hlK#rhp zK!TU{=1N_m<~O*J4Y6k9SiUjqZN{1nXhGA0?jk`X#$W)c93TTEI8$q;rvY(rgP$gC z${1+j3+_eLmZ&>N$nqc+j}Slw5FyS22Vj5(R3Qc%Pyq+fQh+5c5pN=UKqP<x3lT)t zcLo_i0UqHEBnc=F#sDWtqdG4)ETIG&AR%E*xW_&eKzOwqfG2an3N!Srv;;A(asK&N zyHXfnfJgWnr?!R?5o`ddW5X?^u<;FGOlAhsxvo^X<*giWav%nXggL&^jB}8K9Fd3w zLJ(pA`ObH~@QuOv$l(-mgy0!PD8M+3L4vD_pbExdUQEBcEpBYU3ripd2NN8}$EfuK z4$wdz2Dw~YY=ByH5XS~EfPo^6xCnbNv57H|0Xne30h*E~MCVc$c$7m04G>sZgBjtA zcyI<x)3GfTg$-yqw*Z<A)@|5<x;{ON$xY5?Z6MaOi;(15bs6Q4r;Iw-VtJm6GHZ^x z9A+_(napK2^O@0{W;L&w&24t`o8cU1InSBSb++@J@tkKp@0rhi_Vb?s3ms@d51P=0 J?sGr@06SDv1aSZW diff --git a/graphics/AtlantisJava/img/atlas.jpg b/graphics/AtlantisJava/img/atlas.jpg deleted file mode 100755 index fc381ca49e94fa5a0cfa5a3c64aa925e9239c761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32018 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é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 Br{4eo diff --git a/graphics/AtlantisJava/img/atlas_logo_big.png b/graphics/AtlantisJava/img/atlas_logo_big.png deleted file mode 100644 index b41fa2deb8cbd1f2cf2163c921f70966e684c3ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7956 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 diff --git a/graphics/AtlantisJava/img/cursor_DnD_invalid_32x32.gif b/graphics/AtlantisJava/img/cursor_DnD_invalid_32x32.gif deleted file mode 100755 index 64c265d3e9f3f1d8e9486b0c6562beb6249452e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmV;K0A~M3Nk%w1VITk?0FnOy|NsA)nVA3p0KmY&A^8LW00093EC2ui03ZM$0007N zoIjw8?QfKrRKbe?-4$P5EgRrDpkN)+M3xcPW}OS3vC7injOSkc^7U>IU=Srk{)7ph z5%WB@qD7w6rc)+SOsMtP^|Ed&t*aSQ1it4JCwxx0$MMf1RnP19{J#GW7$`VMSZH_{ HSO5S!I%Gk4 diff --git a/graphics/AtlantisJava/img/cursor_DnD_invalid_64x64.gif b/graphics/AtlantisJava/img/cursor_DnD_invalid_64x64.gif deleted file mode 100755 index f0da1d0b3a4529cc22d74c22e7e9c64b174ab157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmV;-05ktbNk%w1VL$*t0HFW?|NsA)nVA3p0RR90A^8LW00093EC2ui06+jh0007= zoIjw8?GK}TO4zHW-u!?IV%<o3;PQ#(I;BG9xd2N$t~EDu%_q2uNacDf*)9kqj)aDz z>7^_&o5^XkWA)*l!|Nuig=)LrRx(`KmN{Uwdi_0z-*AmF=&Z*vi-25j7IFe8b%R4j zh=qcf*y#8O87VnQS!sERnW?$S+3EQS8Y((UT55WVnyR|W+UoiW8!J0YTWfoZo2v_1 G0028RE?e0E diff --git a/graphics/AtlantisJava/img/cursor_DnD_valid_32x32.gif b/graphics/AtlantisJava/img/cursor_DnD_valid_32x32.gif deleted file mode 100755 index a2d986bab98db68aec96f8a155c2bc7079ad7486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmZ?wbhEHblxI+2nE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNTbkJOfjTPs_^Fx{Q6Z zMcle(?%kPxFZ6(g*TT<J)xEYoo3-Q#_i1C9?Mo9MoL}?lsgjr!pOPk*plw=!N3fpw zrIm}gdNVqsl9zeAWcBabB)(a<KRZiYFPCk??eoGBI%<#KU)%SeUxFi;fx#L8@_08! diff --git a/graphics/AtlantisJava/img/cursor_DnD_valid_64x64.gif b/graphics/AtlantisJava/img/cursor_DnD_valid_64x64.gif deleted file mode 100755 index 167754d0f3c04bc1c9e24829957dd640c15b7a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ?wbhEHbbYO5`SjfQe|NnmmFbQNR{$ycfU|?d<0g3=+9f0iFAxbMxzvW-d&2X~2 zcuDB*`a)TcX>1LB&$>ES96i?m`;?jU_3v|ESKs;k*Jo#Q;SQm~gcDD)Z?g0)2vq8c zQZ@8nwPy2cRj$KQi+}D>J+GD1CB0@Ii}p(kz1HK`-*!32?LU6}>vW+L&)q%LcYM3X zu|1=qjm<MMv$AvM%AF@~zWm84rDf$6l~vU>Yt^n(w_g3?lGe8Nj?S*`o*lrzU=09% C&t1m= diff --git a/graphics/AtlantisJava/img/cursor_fisheye_32x32.gif b/graphics/AtlantisJava/img/cursor_fisheye_32x32.gif deleted file mode 100644 index 274cae270ef0f05f0ffe6e2c4bb40f2ab81d9121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1191 zcmV;Y1X%k=Nk%w1VITk?0OtSz000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@<y}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^<P#>dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1<F+1c9K z+S}XP+}zyV-QC{a-rwKf;Nall;o;)q;^X7v<mBY#<>lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP59EC2ui03ZM$000R70R0IZNU)&6gZ}>gLzqyZLxl_lD#X!Y zVL^pSaD-_S1%-|z5D)%)BEyJ9g8zQ}fRv2eG;Pk1xiT{3<iLMIWVw1_GvNtN<=ip* z)k_wvRLH3P(P8snm{0n4^!x{d*}HVprgh6Ss8T0T)xweDVeuamQ2%_vXv(5iK7GV~ zk#kpwN0CB=IN5^-Y=%N1;1v2<dlLqkdi(U<;$`a75f?13>`^q%-nmI+l63k9Z4cR- zAY|0z*Y6%BPDmOwSfJnpktoLS(d%a8#pceRZ_+4JuirjKn(9PQfIvZzBVWATtCmFu z&cOc$H|2oop1oa|Abn9$;>eUFtL}wGTa#j;S+r`WazIq?-K<1~=CJuPWeq!VL`>d% z8ntJ_5j_NR&M<z&0ml`Hd~?hXE=-lvPX7I40}dygBFr?y%yP;IGd$v7LL}*DkV8EP zv4agBbWj98A4>EOMJ+b;P>d+i7}1S5=BVS2Jof10k3a?~<d8%bY2=YeCaL6-Oad7Y F06RyhM6Lh; diff --git a/graphics/AtlantisJava/img/cursor_fisheye_64x64.gif b/graphics/AtlantisJava/img/cursor_fisheye_64x64.gif deleted file mode 100644 index bd9f9e8f6fe33b42f1bad61e8ae8f64970c5a51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 zcmV<H1Qh#6Nk%w1VL$*t0OtSz000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@<y}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^<P#>dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1<F+1c9K z+S}XP+}zyV-QC{a-rwKf;Nall;o;)q;^X7v<mBY#<>lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IP59EC2ui06+jh000R70R0IZNU)&6gZ}>gL&&h9!+{DTMs%nU zM~8(EGd@(91V@-QQBdeeq7dP~Co+s+)X4JSzaKv!CF3?tn=@ptj0{-`QHU&8FL<^b z`tJm%a_*S@>Lm+SDrD6D=-~M;%qM+2gbro-4+gV$>84HVmT6F>PN1rVBgF&bKPI65 z`GTQ!>qZu}^64Y?i=4YcJc<+|#K|5!U^5g70jJOpUAry2lBu^(-z{FIJ{@tv;>sRH z<LsTAL?%h6f6(@{h0GO%jC%a~-J`?_NrMIp6r3Ou#TY(%-E6!#oq9EEjsIwrsn>5G zBTaQ8C_tbf$dNDJ?p4bo<KN=OkB`Y`{Ko;)J$t(_LHeSi#E~gUR^5xXCdI<Hap%?* z?~((edhg7VNFj5u@x>Htup<r;DnVowR{Qa1&_5&e5X?El_z?#jS0M7uF+aE<ly^S` zCE<8B;Bdkz!b~&FET@bx!y|Q_lv0Ez5)@GnLhN9J2OSi_PlOd+lp}Hym9!C#M>gr? zlTbz}<&;!bY2}qzW~t?tTz2W@mtck|=9pxbY37+|rm5zdY_{p<n{dV{=bUubY3H4I V=BekNeD>+*pMVA`sGR`;06VT9WwQVP diff --git a/graphics/AtlantisJava/img/cursor_fisheye_bw_32x32.gif b/graphics/AtlantisJava/img/cursor_fisheye_bw_32x32.gif deleted file mode 100644 index 31b8d566e033c12980fea7c35d4814ffc71832f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmZ?wbhEHbRA5kGSjfl#1pi?`@h1x-7XuT64oDOv&%jhMrGKTi;GH=o7c3a!cI`;s z#WJ_8<NlF}?G-D}W**9!dDcYg@XXS8*}b0`vK?-7s|)(2>{ISq;qxkF&C-G?YqsTG z(*BZotH|==d4C`6q{GsSUT^i=`|zyLO=hl*k|$1Oy%X24@QBE$=$Nr$$B7#+esD-? NT6#uiMlvv10|3B^Nkaet diff --git a/graphics/AtlantisJava/img/cursor_fisheye_bw_64x64.gif b/graphics/AtlantisJava/img/cursor_fisheye_bw_64x64.gif deleted file mode 100644 index 817fee3d0bc475f0c82ed063cc40d8d994ff2b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmZ?wbhEHbbYO5`Sjfl#1pi?`@h1x-7XuT64oDOv&%m^HO8-i2L7v4n>%v|#RBS%K zrghd~7RBdFyDg&>ymHmnT+307k~TX3HUGuSBFS@S*+V#El_Jk~`jk!cdBp8L*=fc3 zXBT!}_FK3nZ8ZmPw_#>+_LYkC>#MhY7t_9Uyljq@#^>$fNu{Ce<{gYh+gqpqcxbfT z;ZsCrW#`P5J5Szx`IA#h%gQS%tEy|(s$HjUz52x^t!?ccon75Md-d+qw_pF}meH~C QiOH$ynX_h37z2Yf05A??I{*Lx diff --git a/graphics/AtlantisJava/img/cursor_move_32x32.gif b/graphics/AtlantisJava/img/cursor_move_32x32.gif deleted file mode 100644 index fb4d30e49177e62158f4e654cc3d6ac44ca82995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmZ?wbhEHbRA5kGXyIo7f(9^d08<S>UIPdmIB?)UQ2al`e=r54fh;nB;!hSv1_nL` z9iU-A8x<HBSThzV_dRi*m$AyOVdXvp?kxqir;Ky2SFC%#x_yIc31hxn*rke)zBx)7 z0n`2jF5mempgVb8&4Uf+XTQqoJgRf;)W5e&3chdIWwYp9RCT1!HS4OPI{&Pu_}W(g Wj;`*W-oE|`6DLicGPO&Q!5RP%)qnc{ diff --git a/graphics/AtlantisJava/img/cursor_move_64x64.gif b/graphics/AtlantisJava/img/cursor_move_64x64.gif deleted file mode 100644 index 1312c63e98e5b27e17c32c04111bbc8880568a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmZ?wbhEHbbYO5`XyIo7f(9^d08<S>UIPdmIB?)UQ2al`e=r54fh;nB;!hSv1_nL` z9iU-A8yy%JSZ6O#?t9`qFJslZ9BsRXm*+}q4>{z#ujzWeYu<%#%xvu**OEDtPffaT zX|rXN+u|$N4XZ^TExUbZvp0*?Y(L|jIXSzpX5V@*<K6u@$KXfD^!Bf{Hepf0$&D^P zrOoZOt_3~4xos1yi>G+TOn06<Ywo=H3l=U~ykzOJ<ttXMTD@lNy7e12ZrZ$M>$dGX bcJA7}XYaoK2M!)OeB|h{<0n=tGFSruJQJW= diff --git a/graphics/AtlantisJava/img/cursor_pick_32x32.gif b/graphics/AtlantisJava/img/cursor_pick_32x32.gif deleted file mode 100644 index 381e8e27aeeebf84f1b6d6b308471777ca4917c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZ?wbhEHbRA5kGSjfl#1pi?`@h1x-7XuT64oDOv&%hKvMZWO#+tm$KQ`jog?{awa zaYc$1Jq{0BKFuoo(6(coS7zv_&8u6O`hOBfvKBvE+n1Sr?kf7GO}yo6GtxYo%$DEO m`h4rF)%+bd&2(PhY)EA>y54vC`IlXP`_8}qUK7K}U=08S{XCBV diff --git a/graphics/AtlantisJava/img/cursor_pick_64x64.gif b/graphics/AtlantisJava/img/cursor_pick_64x64.gif deleted file mode 100644 index 933ee9025e4ffa057890de5c5681cb3faa9e6ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmZ?wbhEHbbYO5`SjYeZ|Ns97(+r9~Ss1w(m>6_GT#!5i)8r}gg{R;0D~C9o?EcI> zHJZ0AI=u6lW`*3TtgM^IF8)6G%}M>M?EVAyA8svK;_`I6@U982=M7g*`B4(0Y-06t z#i}r!jO^NVd%Rz5_Rtfa`?w^nI&Zh(gReF$b@%o=sO9{3n_9#gkx|hxW5tdWH(vbU skkqvFjLfX;oVjx6$(t{Ka!P4gc|~Pab<J9}>(s4Rzqob>FfdpH02n${2><{9 diff --git a/graphics/AtlantisJava/img/cursor_rectsel_32x32.gif b/graphics/AtlantisJava/img/cursor_rectsel_32x32.gif deleted file mode 100644 index 735e03ad7ed142cfc3c718381ecc73112c91a385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmZ?wbhEHbRA5kGSjYeZ|Ns97(+rCLM4gLL6H8K46v{J8G895GQWe}ieFGR2f3h%g zF)%UcfYgCBGB9OK=@&cscIUh~2~pwe?FwJNi;UEmB%WcFajGZhah@XsLvd~R5AK^^ zX8rnGAu~V!nDDh}9+!M77vFRWdU4+DuSEa(^lv3k%G!-ST6mfE@4r<%J+^GI?;%rz XcdG2ucihd^x!_{r5m6Dqz+epkb<adM diff --git a/graphics/AtlantisJava/img/cursor_rectsel_64x64.gif b/graphics/AtlantisJava/img/cursor_rectsel_64x64.gif deleted file mode 100644 index 6af540579930f5b3fe343ccb10159401343bf607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZ?wbhEHbbYO5`SjYeZ|Ns97(+r9~Ss1w(m>6_GT#!5i(}F4eVkh77Cr59(^_t;c z%qzaOE{~#+&Z?JOwQsuT80ef|lYM`uB!k0+->j_rZt-1V{@1r8Ws+tQS7X5B3++q8 zR2^0tW!yQ|b^U$5W}3(HyLwi(W!s<U|2Sy5y#3*iKiAhCn-<Pqp?<?HVnxA^B^C$E zwk?;K68hwYf%<~dlQ&=f<do8~@`}o;>YBA`*Qr~tesM`_TYE=mS9i}|z5Dd-(*X<& F)&O_rTOR-b diff --git a/graphics/AtlantisJava/img/cursor_rotate_32x32.gif b/graphics/AtlantisJava/img/cursor_rotate_32x32.gif deleted file mode 100644 index 61b6efdc627f8271344f4822dfbc560f0bdea2b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmV-s1eyCsNk%w1VITk?0OtSz000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@<y}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^<P#>dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1<F+1c9K z+S}XP+}zyV-QC{a-rwKf;Nall;o;)q;^X7v<mBY#<>lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IO;3EC2ui03ZM$000R70PzVNND$vYaLSq$T*$B?!74Wf8FR?+ zU%!6;GX5jjC{U6rOOipONDv)>lP5P4+$O4(7c){OlEl{!8UvIn7v2I!hfA@U0<jcG zNf8{EYd|R(SP%g~PKMsZC^<$loCXG-bU7uNtw)Y^6frTVgU_G2rwz}+$mWpO2@Ab| z5>!G%Awym?1j!{hY)7(&%UsmjJFplLqzt2tSVmajFdp9;R`UU@F}_na)HQ@wB$j19 zF4{F@cf>_G!j3-d(C6@)ke?*~`Rj*IiiEfh$yL$um*PJF+%91t;f^FVEv;e`sPRF; zt(obPbQ$K%;lBhE21t=x?n)Ris2W86BQPKVfp2IV(nHpS39Cd4{{@(TGTz>2OQJM6 sWQf&3jq}Wt5n;CMp~N0!Sw@j3dXRF8f)GY1;e-@cXyJtzHWUy5JDGV9h5!Hn diff --git a/graphics/AtlantisJava/img/cursor_rotate_64x64.gif b/graphics/AtlantisJava/img/cursor_rotate_64x64.gif deleted file mode 100644 index a376b6b532e11f4472aab2b577d2da106b4c0601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmV;X1X=q>Nk%w1VL$*t0OtSz000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@<y}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^<P#>dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1<F+1c9K z+S}XP+}zyV-QC{a-rwKf;Nall;o;)q;^X7v<mBY#<>lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IO;3EC2ui06+jh000R70PzVNND$vYaLSq$T*$DY!-o(TR=F|A zSj3AM9scXr@1Mti1RDiPQe{apXc<#xL<gW{OOOP&iE8D=j1-G1b2{t?je$#;3vU6V z!=;$cqYSYWc=-?<mupC)3Z!IUK?DFm8F~|=<e1c>;WRMtqzfy=Y&~+U`<fFIgF5*9 znakSn9E@yiQ}Q}tp_fV}G!*8&$cu)coWph`8+>t@i&{C05rN7WVzd#<5cBv}8Dcdb zz;d3lp|0~oXhmY><l~~9X@~5NxG0y>(T5%SUOT)d#3;mn{`%pQBEhfjhUBW~Sp4uG z0B)BskZ^b0AvG<neiNwiLBXx+4%37s=`zfj#sm`vNCE$_+?6n3P&NEVU_b%_-{`U* zNDo;PCaff~&_4kb*it<EIrPjDQ8aOgA*>Aa(LD2bl%PYl?4iUSa9wzmCwh=_iiaeY zXyS<|rl{hIEVk(4i!jD0<BT-cXyc7I=BVS2Jof10k3a?~<d8%bY2=YeCaL6-C<X)o EJ0^8NZ2$lO diff --git a/graphics/AtlantisJava/img/cursor_rotate_bw_32x32.gif b/graphics/AtlantisJava/img/cursor_rotate_bw_32x32.gif deleted file mode 100644 index 6833e4bb8a3619f0bb523896726efb0ed8713672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmZ?wbhEHbRA5kGc+3C>j0_A+49pCy><kR-oU9z&?6UGQ|NsAoNTQL7KUo;L82A}< zK;j@X7+7Y1IH@^tZ^x^%>P+qeG7VQtBf2_M%Yx(;_}8UNI{&=2X+g1Ad~W-PzX44T zIUOg+HZn97eb$VacYrCZnIlDSw|n_3#)`wU4s6?`w#`1JT&C~YzT5g%CiC{sf1Q+7 zlbo2);>{3N#1T~^8kA==A<whfw$FgUNn@6gS}O-L+k68{zZo-?v{pAH$tx;XtX;Eq T>$dGXcJA7}XYW2)K?Z98b8t+t diff --git a/graphics/AtlantisJava/img/cursor_rotate_bw_64x64.gif b/graphics/AtlantisJava/img/cursor_rotate_bw_64x64.gif deleted file mode 100644 index 5ba49f2c75c5ea37270b345b1bdb4505dea40816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmZ?wbhEHbbYO5`c+3C>j0_A+49pCy><kR-oU9z&?6UGQ|NsAoNTQL7KUo;L82A}< zK;j@X7+7w8IH@^tZ^x^%yZ_5F$v74;h^<(s^(;ws*2WTDrXL3W(+wAFO?a)wP^5Eo zZoy7RkzU2dNuI6(1s9YX43@IFvU-1ukf_e=aCmkpXnw0wxo$#Tz02LOyK=Yg|E-a# zC}?Q3X^pCEYwGarZ7l3kESc18Q&g^*Idz&SL!v?jN9vrp{9$v<qn9pI3Yz4yX4!HE z&su-Y%?ml0*>;NTiRj;4n5D13OD9Q1?eIzW6X!2ozH;^2^&2;D-M(}8-u(v;A3c8Z j^x5+lFJHZW^Y-2Q4<A2${_^$P_a8rh{r;mZ$Y2cs!q9rk diff --git a/graphics/AtlantisJava/img/cursor_sync_32x32.gif b/graphics/AtlantisJava/img/cursor_sync_32x32.gif deleted file mode 100644 index c383ec1293a38aa62b98f1fb5095a73eceb8b700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmb`GziX6n48~J%xQe3Sbx@?7KPpxfhb%3nLkBBPRd8_Vpbi0xgVoLHY`v|Miv&BJ zh=YTmxXOVbRwE(~PR_01;8+KVpM3uY1IK&0Bu}2_$$J+sEzZo|=t)nu4+zn3pMHDv z$@&$e(J1*nCEJ51-w1yDf1x5K;v!L-$W%p5)I~!yt7s}_VlEb9S-q~}Chp=Po;4aO zVG=G862(+fB~8*L1KI^#&|oo4ch;T?Q+3r)&00%lrsis)mc@dio4TuqdKM{q!!%qY zG!l-CYMQ2Nh9+BK4H%?h2`y?Y1{-Lw7|s$@IpJnumZguiWbWo+o+TF+6vHjTB2f=1 zdM({DERlyF&}14r&<_a|!WuA0!;)5buo!Hh!OC*3%H%}2XBmk;){;edB)%dS78E_h z6CZIJ1K>qFMxz!h@dKJnV+WiNj6zrg25Bat1rHX34RqFts+%%7kz5QT(Z^b{XfIj$ z+U{M&cEYl`U8Q=P(dBycu11?3b%ds{kQ(W_N#jw#4Vu@1D`6g*Sas~rp0RrQ&emI9 z{|V`=N{%0$`TbyFt#jzi)m<5_4-TH#dwcit@WR9H`IXI`J5S$lOrBfYcX;*W*5K6q zk>#ydy-$y)#y)IL-|KyTGI8bY^3S{53y-FkZvHymo%%W)UqAl$dH2@0;nHAnes*H# X%d=~*SAKka^Wyu<>+kOG@5tOgZNZLs diff --git a/graphics/AtlantisJava/img/cursor_sync_64x64.gif b/graphics/AtlantisJava/img/cursor_sync_64x64.gif deleted file mode 100644 index 1853af35b54f06708257342985a282853ba158e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmb_by=#+k5I)hNQn5%7v4|*A4N+WfiLFSCT0atX5CuUBMZKxu7f2DLuLZ$Dqe2l6 zQBhnf*pCdR;Lu1=i@i}@Y!R)XbSgMGozMOL1`ooU%iTTqJkPy3c(}K?tG`4g`qe>* zEPb-{$dF|b&1Tc_yOXB}p7@5qZ~rftNQjikViPiEVj)&yBlai?lL(2D7>P%(GO3U% zsgZh&8j}f`k{MYrC1-LWS8@aG01jwiVHn*Wdm@BcnT^?FEiw@nWib{H7AUH)Dyy-2 zkV3Bso3a_3gCj=Sg<aW=9b3T~U?2^apoJP10~^r5!mx*+$Pp@HA|Cp%7MZH3iF(Kd z3lvSoOw6Gkq|hs_;wBDx@B=h44LhJ8B%lzi0S3}wiB|ByVqgOrSRT$r89BmKJ&c4t ztVL#~=I|AA!2(5fQ-_am8U}zD+F>-*!b<o7nwW+i-~_=?2-W}tX-t9^cwjNG0qt?3 z=tdbi!f`Pe34K_L%+gC1zNULeF`Y1MPFIQEWOTTmyo=FfM;sw345UOlZjyKeaDv9` zfGfc~Xu_(^e^)Gvmv2YB)$yO8wwL59Hx!p{>>X~)70%2|JZlYg(C)!Qlg|&_T(hlj zZsvaf``V^`<&k{-=exUGPjv4et)DMH*m<`0DW7}s_EE9@$K2^FUD?yp(CSr3M&$VI zo(qfBYfHa-A0Dfe?{r=+e6F1u-_tdE^4yoPwbR4b^H&F2by-(9I{W(7*T%(#kB=*j svH3THe-`Iw8{^-mv*qm@t5Xx-TeouC`)q1*;lsTxl_%BpmrB(055haHy8r+H diff --git a/graphics/AtlantisJava/img/cursor_zoom_32x32.gif b/graphics/AtlantisJava/img/cursor_zoom_32x32.gif deleted file mode 100644 index 6880193d449f3c7f2e895ed742024d78d2bc460c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmZ?wbhEHbRA5kGXc1sgS64SSHnz97_xJaYjg8I9%Brug@9OHBHf`FHB}+DM-hAlL zp^FzU-n)12&6_v>{{8z;B2fIv!pOxSz@Wnb1Ry&ZSkEY^^!aD@Wvp8DRA7%oz&aCe zo@1XZ&ImH}&-!4fVBpoA+{qxaPL8!{@s((ek_*d(T|;L1^iFaRxZ|{-ZGF{ui;V3q zN2}geSa;s|dEHLs$ye1H)4~R|($oUh%vOGmre@~2Dkh^eC4LsxR<?d;*TigAhRkU( z%og0iJRD369L7skTo{uLC-%<T7*ou^z-P6qnT>~sjiuwDCO_w5mlG#d^f-A^F6eCG s<k)#FhLM?b=J{*<j4W(Sx9?16WS#Qp@xAwVHoW@!?fZ|P(-ax30hG$1m;e9( diff --git a/graphics/AtlantisJava/img/cursor_zoom_64x64.gif b/graphics/AtlantisJava/img/cursor_zoom_64x64.gif deleted file mode 100644 index 72d75f2a100a07b6a5173a1461dde5d071718b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmZ?wbhEHbbYO5`Xc1sgS64SSHnz97_xJaYjg8I9%Brug@9OHBHf`FHB}+DM-hAlL zp^FzU-n)12&6_v>{{8z;B2fIv!pOxSz@Wnb1Ry&ZSpO-g^!aD@Wvp74^Lo)!fin&P z`zqE=K9Zor&;D3|!KUnlN~S}?6tQzc2Uo0lB*)sc*d#`yA!1eOnkt?}YQc+D1Y}MY ztWoskx8qCtabwMj>#~(qp=k+qnT<`J{4A|)svVuyHGOIg`4hWXi>L5&OqgMrmeIy! zw!o{Kbqd@3<>5ZrrK}9a>zbMExTASEm>4+Bx2;HH%r#A)yXsJL9RmZO!|5u1HXa@} zmg$$m_&K+v-MYQPh?6JpQT0(yj#Dq18JRg*-oEQ%WMO0a@^um;>(YlmTARcJ5>_;^ z32Vii*s$<$yMVIS9FL8Qj&@5JXWcomaq;nf1?Mgq&rM5CPS)TEUKMk4)6(Mt4AuZ9 ChPv4R diff --git a/graphics/AtlantisJava/img/cursor_zoom_bw_32x32.gif b/graphics/AtlantisJava/img/cursor_zoom_bw_32x32.gif deleted file mode 100644 index 9e2afd655574cbbe2991ba2b52ca0e71a7ddff91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmZ?wbhEHbRA5kGSjYeZ|Ns97(+r9~Ss1w(m>6_GT#!5iQ_&RpmB-)CYnbyg(j#=j z!(Y4^QqOH~&v1=BIVZ_$Q<JvVLap=VvF(;;rPoFrQ1A;g`87diajwT5&FLppxK2&k zCuYg);oVuPJejB6YTZk}7wa^8O3nAF|7^XtP5HsE@0RzzPrbg}*u#RkV#SUVH(vb6 J2xnlh1^`V8K-~ZU diff --git a/graphics/AtlantisJava/img/cursor_zoom_bw_64x64.gif b/graphics/AtlantisJava/img/cursor_zoom_bw_64x64.gif deleted file mode 100644 index 2efd87e0d4d1a5f4cb08e46a16fe2bd9199564a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZ?wbhEHbbYO5`SjYeZ|Ns97(+r9~Ss1w(m>6_GT#!5i)6yyOE04eBU!1~uWA?Ip zGKr!Qj_%Xs7@8KH%v$&>G}+raUuyl=y5(G2w?8)6$$Le-77aC4@!rW}HUG$pk|?gw z#qMi3qpnnX8s(MG5!LN{k-tVsXuIWyZmWB9F4s1RzgpwI`0I3WkJj`VEsQf}wB4xi z;E+6N;i;bP88+kO&6htprL?TPqOz*GX06(F>ej1YT+-Us-qG3B-LqHkK7IT3Z*Cc# JKLHF3)&K`XRH^^~ diff --git a/graphics/AtlantisJava/img/downarrow.png b/graphics/AtlantisJava/img/downarrow.png deleted file mode 100644 index 17b7273d22a682f1fe269ed260d78559fe342144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_8<4DKZ~;+_#X;^)4C~IxyaaOClDyqr82*Fc zg1yTp14TFsJR*x382FBWFymBhK53vJdx@v7EBj4O9zks(HNN^6Kp}Ha7sn8Z%gKNK z|F>sWJaEK;<v_@h6F=sAsa^CG+|@ksM~}wCmNg&#*So#Bc2H%4h`?Jlw^gp(3>$U` V3)nnaa~5a>gQu&X%Q~loCIGGWIavSz diff --git a/graphics/AtlantisJava/img/interaction_clock.png b/graphics/AtlantisJava/img/interaction_clock.png deleted file mode 100644 index 0078909d9bd3ec15a13d2c8fe542faa1618e61d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmV+k1or!hP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5(zIU_!C_K00W6hL_t(I%T1C|NE>$m#=rkRcNcSNa?2ST4NVtk77X3Aahi-6jq^b$ zgFySBTU~|}L6}TO9D5q9dly=Y4>N<#!XB2!M%V`Kp&L!Ngke)!R;xJDX~D@@NbWE( z%iSfn2fMQG^@AVZ4?cqbB@hVw(%;|Da~zif@cHQITWD!*37+Zf48DK)@|q+`Nt?~4 zO;1n90HmYQC<p*dO}&Smo$WXF_V#{FCX=+Osi~UF<(2?^8jr`lPN#EGRn-gg^Ya## zWgFFM^#=gwlh>bt0f3Qk7>^(SHnhCFOg$bC6h%?8*=#hQ&wpexnV3SM@aOpWc%`?u z*TS+aWm&cZ0Fu|g2J^w(9Cn`l1DDHngHk%5PN!`f8yl8jFxcwo=+p(l0>9tye7(2N zuzGW~HZd`A|LExG_J7)p#cal-zX-lhr7Cv2z1?~GwCT89)}>;Rp6lyHn<%2)X2XNr z{l;r&&$0&x2XD^I%!~touVWS@7K`DD)`yps%+KB3-ND`MZH$eLVI&knO;K=Mt>RRB zI|!xF0X=c+76Bo@19&yFrh#U&S%@tJk|g=%l2jiFg%BPd1~nL9G#Wt&0ihI>QfR75 z&N!XN-X3qax5o<rFqBFX*yDYN!{JzT*zI_GY>ZS74p80SM^RN#*L7H}RuD?T8I7=7 zt>l|T!mzoy`7I~@eaMu{N6>ZM7Y>JE00?Wb06Y(dQhXPSfvPGxmzKcWY@n2)-e?%s z*VnPQxHt^p0RsR-Lqk7SDit_7I#gZPxx@W^boKP${FN&(o6RVcO3?CoxIG@ovaB>W zHyaCu!c71tM`|^jF&YjlQ<pB0z~CUm^E_CN1AXo;$ucZF4~-C9y>?9#1fdR~X<=aj z)aUcz;iDW(Ces&!@Dj7TyQ>-)2GDirx{i9i4$*1_SQcAbTUsKKVBBu^4Y%8k7Yo{K zZ3qPXU>WW(5{cOV$mf;0xjByKc}S83zPTA+t*&aRREn9LoIC{3IWRDQm6eqfKxjCG zd+B=^2@j*)b}BbGFz8#my#`HHb&DWCmSrLcf`0MB#fJcVT3v(7<$@@RCjbEGdZi0b z^H15$Oy<jXqS337NaPc@+dbOQ8mifB&fNLw&SxLa&VGE(@1F%wi^t=TW%&hw0N_MX z43*1eZ>?5K0$>2p=Y0c!Mk#$)5QHbiV(~5j1%Uc5q{3DVVE(Lr00000NkvXXu0mjf DX)M-h diff --git a/graphics/AtlantisJava/img/interaction_fisheye.png b/graphics/AtlantisJava/img/interaction_fisheye.png deleted file mode 100644 index 6ddbd1b556a528d332b6e98e3272b4ed832b56d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcmV;n0!jUeP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5(*j3Z`B6?00K5iL_t(I%axM7OIu+S#(%dYgJ=|?LlEN-k}4=QH=z!x1ZpTm(Lsj_ zLU7Db^A`v%>Rh^CAsrM<X`n-(ba83PP=^M(IQW4>f*+M@9irEmr$aO}!P5GJcR1&H z-{-uCa|~|j>+9oxIXpb%O&UIYeT)krkw~z)nZ5UNS63(J=f9eAv$L-VJPY#V=XTw| zaU711PySl5RdXDN&tJatGX4VB>xBjO_x6!$0F=vR%H=Wuk^tD={?=q*+vj}zbV4q_ zhpVfz6Tjb2Fc<*f^z?-B@$sey6B85n#y2-NxUR0Qn#AShWqG|`Y}@AO=!j@EYP7Zx z2>2C=L;ws|p-><kjsUQ>wx;#<b&ACz7Z(>)DisC?2Q@#R1TZq0cLak0WilDs+S=-F z9UUGP7SiPNc{z@wt*tGcot<fPbX2RWtFkOhwrwjCiAa(T4h|$qp-@PnP^fMa4u@5( zR#mA~WLcIx9*^4F+tuISuj%P&U0z;lcXwCA!^4uK#l=P4!Xtoa^toYK7Luq|tIW*I z(9_ey(9jTbb93zM>@YbwiQ_oN)YKF!D=V0$iD{bkJunPNrBX&L7E?BxrBo`>-QA7X z>!r81mt-=D+wC@r#Ug+akH@vNwAA=M>2w-NNTN_EFg7-(k&zMkd_MVnzJ}I%YPA~1 z-DphH1YlrbfQ^lf#>foAXe?AKlIktwayd$+67Hu7e!PFnLwNLOkctI(D8_xsyLSG? c_4PHs0UEs*fFkCv7ytkO07*qoM6N<$f;Kfbng9R* diff --git a/graphics/AtlantisJava/img/interaction_pick.png b/graphics/AtlantisJava/img/interaction_pick.png deleted file mode 100644 index 5bb9411ccf89581a77f9a6a4ddec694bb70562c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBj4OMj>w1-_kP<0)<*UT^vI!PA?61 z<U63i!Mu5Kas9{W&-3@46t>Q>a%R|m;m8TbRa+Pon&)k1@jB{KuB((~$;>#1BVE(3 zNm*6iG5f6RhO1HGmML9wkI$`L%qQplZBa^Wf9QMl>c3|DmfYBXC|+v2$An@wzfbHd xdOxl?zJ^;qzgS%7<C<83=!>@w^B+!r7WXK}u15OnQIH=QJYD@<);T3K0RSc+TpR!Z diff --git a/graphics/AtlantisJava/img/interaction_rotate.png b/graphics/AtlantisJava/img/interaction_rotate.png deleted file mode 100644 index 511c2837239dc8849ab31e74e1a9a3178ad12a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmV-m0-ybfP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5(_$Z6O}Xo00H1hL_t(I%Z-yiXcR#d#((#x^6(B6QAiWGXiyMOM36wN0*i@_g@q7s zMFr1BltT&Hsw5$%kUi1_>_QL`H3~tj6hwt^o(e%YD+Li$WHY-nJM50lZrE(@Ag}u7 z&3qs4z4=~_9&z*h!!w?zb^y-o!g#M|<g$soSC{%cq2@fHPOiEBW2Mv`U<HUCEMM*| zaBpHcr*(MI7i!uQs_Y4cCww9k8Q?cC3CsW{EtF3{6h(td2G^ww%1UaK)My<h*E@kJ z;2BW1t>$Kd#^i}r<?Dk=>KQ46P)Usr!dE~iRq-e=oo*ptuh-WPx93m$vkT)5<?A6S zgU`ZMZ-9NktrX`1a6GA^&~CR0!*Ii3THls_4D1@2m%je#{*%8Ry}S0hHZax?)Z)2C zz|&UeIYq5?*YA0<(g=VrsnmVoY>W@Dw_uE6i}5vu_ih^E7Gf}kSGx+>mQ%1Tr<Xw5 zMIRDSv@K^FPzFjs6<D*a=G(+Dw$;o76TrEcV}QjCPP8p&7&r>KKHvaQ0ow7KVPJn| zm{$@v7Gs_Fz^T|MRiFSI>(a){xSH<EWLwQkvFEpEh%Rsgn9D9yb{k8T((cNk>S(P} u+H=I1DF4U(-ul>i@kz+PE+7CeP52LK!o?=qzBp|F0000<MNUMnLSTaCunB$u diff --git a/graphics/AtlantisJava/img/interaction_rubberband.png b/graphics/AtlantisJava/img/interaction_rubberband.png deleted file mode 100644 index c101f8ccd9fb2b067b6debd4d7bff251884d6dc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmV;s0!00ZP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5)2c2;G3TS00KKnL_t(I%axK{Xp&JF$N%Tu>t|-07OTbRV<HtbnD$}9EW?YzmN5y5 zMifa?h(Ux!27?F}L9AU#tzG1mP?^D6BvQ%-(>K_xB%)RWTlHdFq8BfP=(LOA&5t?g zxjN7J{h$9i=Q$5SS&ToOz>Og{v|25MLLrRCBQTqfA{>ceOG^t*+ib{Yv#=T8ZGJqx zeh`3z1OkB)%d!AKyk0Mo$t3)KKg41&SeE5kC=^0IpGWVW=Z%|o4@^G^&g=p}cmqLu z7ph~!&jc#i@^5TS4`U)U5B-5o03h_saG11PFO>Q_+pg6(pp9P@^1m8By*OdMGrrJ# z-PJesaLHl?0D7HV&Wjj^ImvOHy4I)!NoEYbXNx#@s{2Rdj!W;cG!FovbGaNZ<2X)j zGMQ@1zc5!Y@*oBG)ian~P&Jn`Di(`jwRjtGV|a8DgBPu6Qafrm<#akr`9yHV;@6WN zc*Y*VHP8*^&hr&46ZIn#^@FN+@`o88?v38XWyfJ`>~H}fE9z*A#X?4>K9|Zj<Fl{e z^^CyY*MaQ^Z-S79n!+ai@xM=~2E}3#sjnZQ(d>iz&}~ox$*Mh~H5v_{$YioPN54(I zt#vK->U$Ao-u#<`LIH#j$mR063WIn&&L=vZ&X-DkZ|&(h_AQ-G3uu}yNhFe@R4QGr zcZ2^M<*Hu*K=>Zy6G37(sEFO5A{u&;+&bGu%GsJELzw$RWWOj)>;@I7+Z3fz36V%t hms1o4g+jsSe*n`u)A`6UA=>}|002ovPDHLkV1mM>Fp>ZO diff --git a/graphics/AtlantisJava/img/interaction_rubberbandyx.png b/graphics/AtlantisJava/img/interaction_rubberbandyx.png deleted file mode 100644 index eefdf1e4425d59f0b758beef4d94654db23d5f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmV;s0!00ZP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5)3XQh}Vt)00KKnL_t(I%axK{Xp&JF$N%Tu>t|-07OTbRV<HtbnD$}9EW?YzmN5y5 zMifa?h(Ux!27?F}L9AU#tzG1mP?^D6BvQ%-(>K_xB%)RWTlHdFq8BfP=(LOA&5t?g zxjN7J{h$9i=Q$5SS&ToOz>Og{v|25MLLrRCBQTqfA{>ceOG^t*+ib{Yv#=T8ZGJqx zeh`3z1OkB)%d!AKyk0Mo$t3)KKg41&SeE5kC=^0IpGWVW=Z%|o4@^G^&g=p}cmqLu z7ph~!&jc#i@^5TS4`U)U5B-5o03h_saG11PFO>Q_+pg6(pp9P@^1m8By*OdMGrrJ# z-PJesaLHl?0D7HV&Wjj^ImvOHy4I)!NoEYbXNx#@s{2Rdj!W;cG!FovbGaNZ<2X)j zGMQ@1zc5!Y@*oBG)ian~P&Jn`Di(`jwRjtGV|a8DgBPu6Qafrm<#akr`9yHV;@6WN zc*Y*VHP8*^&hr&46ZIn#^@FN+@`o88?v38XWyfJ`>~H}fE9z*A#X?4>K9|Zj<Fl{e z^^CyY*MaQ^Z-S79n!+ai@xM=~2E}3#sjnZQ(d>iz&}~ox$*Mh~H5v_{$YioPN54(I zt#vK->U$Ao-u#<`LIH#j$mR063WIn&&L=vZ&X-DkZ|&(h_AQ-G3uu}yNhFe@R4QGr zcZ2^M<*Hu*K=>Zy6G37(sEFO5A{u&;+&bGu%GsJELzw$RWWOj)>;@I7+Z3fz36V%t hms1o4g+jsSe*n`u)A`6UA=>}|002ovPDHLkV1mlNFem^3 diff --git a/graphics/AtlantisJava/img/interaction_scale.png b/graphics/AtlantisJava/img/interaction_scale.png deleted file mode 100644 index 6a4699d2530b7a1ecc737e10e23055bd2be2e433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBj4OMj>7)X?3A0pebseE{-7<r;kqF z=yf<iqILgj&LtNDkEe0;mKAEap3n-)c>QF-(S6N7n4U?>{1Oqp;wi8&`i@M@W($)G z4#Erh^vv(YuxmyH&c1YTv)sAkmVf>*t+=smFE59fcfZ?Wfet;thp!Tu7hlaXWotey z&9&;btsTpvSL;q+JFVO{WztC%%~|eVoCj(@xD?m(AKv7(?3yJ*p^WhHkLlrS>sfr3 zukSVSy>}?!>GkdBoevkz+4MS$(c^MU+3vsT&3?;^`4&v6djHk0uV?+Tpvs4qUYbj$ zoMGH@Zsys@3cj_isZ-BbHe}8^^Gt+cjdfpeT(aw0J^`k`>v?<X_S^F`Jzx;n8nyOi z<-MCh3<{rW?WOvUw<PY^=@Y^6<&^Ng{RK<o*1!Mr=&a^xBi1{$3|#UB(OH|t-U9=X N!PC{xWt~$(699D`tXcp7 diff --git a/graphics/AtlantisJava/img/interaction_skew.png b/graphics/AtlantisJava/img/interaction_skew.png deleted file mode 100644 index db0c357a0f7014f917abe4dd102b4fdedcc0b886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBj4OMj>8(-znE3fkOSBE{-7<r;`&T zG7fMY{qJ$5nc=3TWg8C<&v6L}38#(=Jq!Cf`=?*;Z){vRABa0Rm<_HN*8ceLP=uNJ za26XIo3|3rfso_JjvebbUFlNUJW)_iZDD|?6T|vl|6Pu;#K;=YYOw|?b!TI1%Vyy@ zu(Gct|HX?J0Z(|Jg|Ck@40yrI^MKcMuEd_o1IEhC4CV)PZU_X2sREtG;OXk;vd$@? F2>_m;Tc`j4 diff --git a/graphics/AtlantisJava/img/interaction_synccursors.png b/graphics/AtlantisJava/img/interaction_synccursors.png deleted file mode 100644 index d19b2253e87ad4b95163fd50e26c924cd322f7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBj4OMj?KlyGM_%1e)UR>Eak-aeC?G z^IlAWBFE~>XKdS*Y0G`FK(yzASqF!kyn_5f*Izmpy*b2qw{R>fHSA_#j@8~#;J};n z^2FZdt(kpiRc^Agzx#R4wtipn&Mtk6K4&4e=0=OY#by@kUKM=b)X)2%Qts?C-=xMI zGw0=(dke3=vi!N2iT%B9&VjB)CwknHFKv+QUevMtx%oLi{|)-trkCG;6*OdMN%W9t zW9Z;uSbHsd&4H3%2md~n_`k4y?%9+RPm4sjDjC!!8$K<voEES$M5uPH>9-uSZq}`4 z_HKTYmv24B)uiCoHDd;2*5u!2i9c;7ZL;5br#Z+gXnV}+tAc_qEeafA&vVmy4kmHe zz2)g<^4e&;CTQi6`VFt%?$Tp8nl#aEvEXC{rB36n6OZ(N>^omzk@Eh+;_B+Z=A5t3 v9WAUY=X@P;iZNsR?MJ)v9_{^Eb54Dw@WBk3uP>Q_q0Hdv>gTe~DWM4ftv<bj diff --git a/graphics/AtlantisJava/img/interaction_zmr.png b/graphics/AtlantisJava/img/interaction_zmr.png deleted file mode 100644 index 06e95704d7442d5bdc2f7606e93ca4badc0bd7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010 zcmV<O0}cF%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXY$ z5)Ubs!4d8N00VMKL_t(I%YBevOj~6D#m{$dOADo?YZ<M<F<TG<b1pDt)P;72IZS~y z5n@S-@kK)TqnMa<n&9FlXtLn422&rpMcAV=8b{4!8APW|J8)S*$0jZEf2Ad(Ev&b_ zExn&FZXufN_jYn}PEHQNF0PKcOSBqo1H&@UWHOmxXnp<1lP8-3UwkxHvK5JYqLFyP zR`d}sP$2}Me&l-heF6Y&ZEuOKt*wL8{%F^oK$J-cgo<ef75ikgsw~fW?-yK)MUv-Z z54rM0GPx$sVhbsyln`>903fc5mz)#R$#)Wp!fn%QhnO9yBrQs%;QjfokXZKbF(1yp z)Y;k5_2yB><*jJq8|||S6@Xy?9NXQ~QyER|ary=Aa!u2bm3{lwTv#Gm)2L-}Nr8H8 zDVRv6BAdqzmBsF_zdhr8PI+wUyU7o3A1XG#KnST2<tY@F=@5A&KJvVGNhFDi!K&h7 zLRLYsBFfs>Db>sVy1APFiZ;&z;LZ(y9}fV8kN^Od;d%ZOK`M_j%G^jsED8dEgim=W zr6et+*R%4n<C$zl1b}w;;gnJ{r8F(_dcDxUS}6@NBn<#jPMFMQ3Ehq-y@X+M*as0= zVQNPeo|Eg|KH+QtC<r0%Q%YY1aFdyt`2z<F1SPi^(xk;KfA?H(!(O#?L#C9)GC4VX zOvFGL=T)hg`~)Fz6GGeo>IfloBiFl4Y$}z)!E#-`p}6RcQP)?>E9Xwto#}a3$<~-x z!m|%b%<QJ+Xmu_Vm<ybZZF2XM>G<u)_L}3?y({)DE|e4jfWvX&bNeajW?6dqG{+@S zB$Lz{f{XhVl91ZxasSC{3QX^P-2CCf-}AP{#>T6=zhD6%S1#{Vsg<psUp>|1Hzv|A zAAV`{hmkLfe7}v)`h3170_23lVN;F4(9&wPZVV3(|Nf+*s;cVz{DPmZhl3Qr0msk< z3ZVC=v1{~UG)(JXuOHLtbi`(}o$l-F%lK|h3O=9jQ;WsIJnmrf_vZIDHZ{!ttE~V~ zT2|^RKTvUY_uP(-j;?`$f%N#q1f80iy4c>{o&^A?HP$i!U^-@;SzcYDZEdy{0BCM$ zCio9_yS-&-Xoz#W-PG&#e*eVK7wZWC>%!tZ)#>%0;VJa@_t&{xuE^lvV9)=|>gwvJ gh96@z8Z`j$4+}VgyZ<SIYXATM07*qoM6N<$g8K#F#Q*>R diff --git a/graphics/AtlantisJava/img/interaction_zr.png b/graphics/AtlantisJava/img/interaction_zr.png deleted file mode 100644 index c6f46cc29f0c9381097e522bebaef22c65ce5b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBj4OMj-*lJiYB*K%p#87sn8b)5!@E zpBe;bDj(hOz~1P;q%)JUT_GC~sFj>OFCiqsndu^ye(KB_m6Io5v~4&u*IN8=<PwHy z_xINuKj30d;z|AW|G#~kaA7NB7_&yN+mr}}V{SamB_$;uml|a5hIo1$23nQQZ7@4F S=%YB0$>8bg=d#Wzp$PyGeMznW diff --git a/graphics/AtlantisJava/img/left.gif b/graphics/AtlantisJava/img/left.gif deleted file mode 100755 index 279e6710d4961d7644ea2e3e39e6afd300147aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!<X%m>-Xz@**Nzw-3iM{+%$5nXSNI_AHs_0#Z5ammWC>ec*qNb!1QNo>>3 NI{94w6cGjnYXFzvI#mDw diff --git a/graphics/AtlantisJava/img/minerva_log.gif b/graphics/AtlantisJava/img/minerva_log.gif deleted file mode 100644 index b7ba3677b6b3ad098bbbbf5c7b639d41de2aac10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19469 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 diff --git a/graphics/AtlantisJava/img/mode_loop.png b/graphics/AtlantisJava/img/mode_loop.png deleted file mode 100644 index c4573849c5c3555e80b5f91df2659d592a11d9ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmV;{0V)28P)<h;3K|Lk000e1NJLTq000;O000mO1^@s63?#pm00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXV& z5DqFI>3sPB00CA>L_t(I%jMKDYgADX1>i5cWHm)%WN{&oI)#!-5DET;blTX8R+d7l z{DE|-V`Jfu5Fw2iL<oU&!6Gr}rb)L&^g-0-EDVp0Bm`_681B7im~-Bpx%2oR?KzgS ze~kV39^T;2q@*eIa4SBC>EP8?(BKdQyuk04e?q4wbuf?PBp%=>=eZ&>z_&uQgL`-y zU&nc3530Zb!}tRFS%)}@NC%tv5`qyv<_6W?CB9n0(~$L3CRzKzj|+Z31n)2C&)dYG z)bjL_I7)qG9R>e|o0oh5(`}#=vZjzLA`N~{X!fOTe1l#ogHonR_>~13>|(angW2F+ zoLxs`;V-Xfm?u2dYVuBtV->IQHSrJF7zeu{JuGuD-p{v&=57ei@htEC5tee>@r*Qh zSihi)nF#f98#me$8T&k8de^Xs?>WD`PDvNBjUPqeRVm@tKm9ZQ0egvCbyUn(761SM M07*qoM6N<$f`~84z5oCK diff --git a/graphics/AtlantisJava/img/mode_loop_on.png b/graphics/AtlantisJava/img/mode_loop_on.png deleted file mode 100644 index 1a6b5bed230293c52fa71d78d228a3a7fc2ac3e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMv3P)<h;3K|Lk000e1NJLTq000;O000mO1^@s63?#pm00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXV& z5Dq6{SO7!-00CP`L_t(I%jMKPOI%S92H?kC){jDCSh65&ZDFtyLJ0W_cBV-iVr3}^ zf{2Ypy410;@JEC|nh*&A38V`aCSukmorSufrg<+ME*lXR(l{`jGw<A)IrDY7kMtVz zxi8^+_#1ZdXpqqeM)4p#g;wyAo}rH;bg+z@8h=5fG-_ZP$1(hYpOL4EARU|(j`r~w zFT)$Sitb4npo3m`2JM_ZoF+&EZ*dq0XZV~9N_rptVhR3<vv$fPXFK?DfiJ|thkx{E zFZvf{c}8P+hV^`~9(e)R7{B8HwCX@3O{;h__-27!4runBsmh?@t>9ZV+%N(9IKU*f z^V;pm2WaAam>@H^Oi?c*JW^}&e$B@scJM3uPk2))n{j$n>_K&(t}V@699-d5=KVQl zlWnyleLO8+(8NRnweb*R^^FXD9k9J?=;C+em0?QS#YbEe0al9=zWc9##=kQhUUfCu RORoR`002ovPDHLkV1m->!f^lq diff --git a/graphics/AtlantisJava/img/mode_random.png b/graphics/AtlantisJava/img/mode_random.png deleted file mode 100644 index d7861bd112a56079c81778995267ee6d15259878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1032 zcmV+j1o!)iP)<h;3K|Lk000e1NJLTq000;O000mO1^@s63?#pm00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXV& z5Ed~Pmn}>H00W3gL_t(I%bk>8Nb6-7$3MSKH?{5TgvDT}sf7kP?QkT>JFkw2ghL`T z4hJ;I2z3{`aSkuMP;Zopqa}D_ricc?h8!nYL{Nv8n^=xhEB43jVxyc##WT14e!njI z?J&fk(*qB@&-?OzKhN_%ypO<h*wob2*O^S_^;j&Xcez||h@u$tcsx=#9KL95Y`ix* zI{N7P9o2sox7lprL?Y2*Fc=>Bd_G-1pD*)xJUAQ<mDOs!6_3ZiU0GS_{NI3RG+MW@ zvGH<EP0fe>{rw4m`uciICKGD4nvszaO)M7s^xpsipaBeu-vY{&eH5|dwzf8LXlUp{ zk|Y&CYilbzJ3IdfsZ^v=shXPrDn;~n-~jj$I0XIx^hJmyNoV)(-+ymyZEa+IecdFA zq6mmZp=>sb-|v6nCcsNT2q*(O6n|TZe^nr=LZR@Y)oT6HU@&~s)z$U%^z^j<=;$cD zx3`De?WVoGooF;F%+1Yxb{!B>)@I<Z5;p@f@C#6;)9EgZMk6MZ>9);gD{O6T&4$C_ zN}WzeRaF&UuNS-B&i3~9N5jLzm$EDiC|PP0v2!4&z;a4_7x)3F5CkE=xw-l9<m6;8 zl}aH=QoOgf_v3+qf$f8X1M2GP2nK_MLLoXjIw~Cw$77&b0R9A;m8`E@HSj&~*7*4N zesy*At1T@pc)ecP<#K5RK`0y_A8%%}*>`t$cj@fxM3!ZimX^?JwPI~;?E?WgD*@z6 z#5E;=H-RV9)6-uZ9v;5m)YP<JQBkp>)oM@s`uZL^ozBGa^0LZevCz=az~bT}Jv}`b zjm9U%3Ub$;NuxCPXP^MQR)kxv)`-*TY%rV6Qh9l~90&x|$z<|QE|*)my1Ft02!eoG zt!8y~HC?6%?<-<=O91;yC9OcdSe9O||7~Vw=5xQ_e<lb5fk1#*EcVs;`S~ldEE5Wa zh(scEcXxAnd08z0YT!2TQ%Qq0%KDD-gi>i^#>U1H3kwT10Ks6;l}@KWk!2ZxiHQlK z(I{4{6-ko5EB;iqB3h-y5^$+xF5NKnJQ|HAVX;^yL!nSQ9*+yn&CSow1wp{)^JVAf z=PQe&LIj?c{DBN`b(1*2<mBW#@p!y1lgaGa?RLR#x06gJpPhTXUb(5M$wKL@d0un7 z-S;Aq$cA38&-?v;(eL-C08tc01_uWp&(6+%0Pr`641u;s+#A*a0000<MNUMnLSTY6 CspO9U diff --git a/graphics/AtlantisJava/img/mode_random_on.png b/graphics/AtlantisJava/img/mode_random_on.png deleted file mode 100644 index 19c332640d439e2f44b055430f1326603626be51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 zcmV+w1nT>VP)<h;3K|Lk000e1NJLTq000;O000mO1^@s63?#pm00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXV& z5EmcPS`oqk00WgtL_t(I%bk?nOCwhp#($G&{Me+~qD3~<Zgg!F>Id!GKftRMkz$Zi z%OV9WR48gLa$^)rz3>C7D27_W8*3HOLLouc2zDvGSr|5g)F4f1W@3UEs9M+BsF|5w z>`5z&g?0}d-Z}5#JkN99_n9N{KgRIz@b|~Z$JMH;+Wdb1Tbib+fj~fyMx$pH6%`M9 zdwZX}c*gW!!M$E@G?7Tu*zNWwp-{+rb#;{!2m}}$95i`6o>$`W_zw#U3ym*LpeV{4 zD=RCnm6n!%+}_@v0B|~;I2;blW-~oKJr-3}zx+1>6JQ0(#C#nnye`1$bne&J*K1u} zU1z$kn*i$S>e$%Wcn)APad>!GdJ{p806hVI1%3e(;1sx%CDC>Lw4<ZrgQcaVp5^6b zho)&7pk;y5=`^w|-@1vwC4eR1U7$up35W}loJ=P3s>kE`)^4{yZfa`!^W@~DeRp>^ zwY9ay?CdNJ4Gk!YB27$8eDxy1PvW~;sE>+RE%GXmZ?#&_N=iy_I2^aVUT<b?ZEY+X zjTTs~RtgIX2?m4sd_LCK*FWj*?mjmRL%QCB`@jL<1q=}nMBV`Gk|bTNuC6{hIy%}? zRn?~Jdc3u@_2KmNG~?srD2l@N_BN47gyQ1jg2BPTJwzFFph_q=uH8-o-V`^i?C<Y? zTvSwaucoGkU@&O-{eFuiNtylq{nd0j{r=|WCXJ1a7>2>z+#Gp%d0JUn*+*G|cSKpd zz-Pecz!yLzAOjV^{>aG4H#<8!AG%zwr}_E$D|vZ&Cv9zQkEW)k67%!(Cb!#7d3iZA zGc&Zbv`|t~@_UxR5H&vl&V*&}0DEHZw#ei0cw$piQ{}a_wR&!Dt`QE0&B<i)?aRx{ zg^P=eS^!CsFq_RRE-t2Wg!-of>^|@Za7*L>?g8i7y4h^DpGQYWzm{eBRFWjZ;V`PI ze)sIzv%7|25Q#*H#bPu!H*<b|UL*k);4Tmm82Yv5R{}{ObKQD<eSL}P>FH8{?d@%U zDwX=wFrK$>U|;}6QSf*?=(_%+B+ghwS&GCu1N<hGXKr}(0v3xU;dZ-+B9TZc9*;{^ zRaO7ELy`!ELg~rL$%3rXOW;U2DGJ2IpPaerT^br1dM_T2w;dlJZ~1&a$>;NtOeX){ z4+evV%jI%st@u)7c6RnbEEZd_*=$#`ENikX9|D@DX>@jW?v0I&Jp}j*RH}o%%uq|M P00000NkvXXu0mjf7Ov<J diff --git a/graphics/AtlantisJava/img/mode_sequential.png b/graphics/AtlantisJava/img/mode_sequential.png deleted file mode 100644 index e4c2d857205282a26b8e45ca5427cf8d14d47acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^5<o1#!3HFGRQ68=QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?i-Fp&gD|6$#_S59AbW|YuPgga4i*7nrFU^NfO3q?o-U3d7N_4{ z+3R&AK!EkZ`Chj_j;#%wdY76h{a|Q{=-#n(t$*T6=AQyd${ka0+=x2j<|<MjVY+c< ztH3o47HwODJ7?~kJ~Pw!ds}@?^TbnDZJi&y_dKxO7cKfCf$jMZ2l>Z>@duM{D}6q3 zc-M)fvxTxpt?f^2ZthJ?&sU0UGfB$)VYyE0quQHRuISQExeYzHC%CUY!5Q{ArmI$` zZ4UFEM9$Ycj_dWUl1+)<aH^p5=7;6Ysg_6L76)`D`y9;JAQiE<d5h9{rw!IeGM(AW zEe>4HKl6a;_SfFL!@8#o!z=ZDUnB~9)}HWGvFwi6f2cyYEqY7sNl%rzJo^t6XGH&b cJO8fwVkM^wOt<Bi14D?x)78&qol`;+02^MQjQ{`u diff --git a/graphics/AtlantisJava/img/mode_sequential_on.png b/graphics/AtlantisJava/img/mode_sequential_on.png deleted file mode 100644 index c083bef019f8924502fcfff9cce53910dbcfb8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5<o1#!3HFGRQ68=QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?i-Fp&gD|6$#_S59AbW|YuPgga4i*7XLz`W7{XkQgJY5_^EKa|@ zZ0pVJD8Tl>oi}_&_K`zM89FxHs}uA)wsuV0_LEnvY}UQ`kNO3?-!?5>yHvh+Qo+fi zX?%UoJ_=DUxewR8d3R>d=G}jixx}3GlO(ktidP&}c(e0@gS7G!i8i@~qDP+};yb1& zo3ik9g!Zf%ZOL!yuLcNq8Z8m@J}l2ZxulIL_Df;J{${4#6-OlXE*uu!R?zQjqj=EL zY*9t0%<UV8rTq$nQzx|AuI%XG-x!y8ZT(yARDo8t9j?Kt+s<0tS#98<9Cxlnch~M? zcg=a?3Oc{v-_gu2b5-0bI4-dI*z&3-W}U0zlRRc!|K})oQriCG<jE3;vwkSsJXU^V b-{Zeq*n6+ci%TlN0AlcT^>bP0l+XkK$IX_4 diff --git a/graphics/AtlantisJava/img/right.gif b/graphics/AtlantisJava/img/right.gif deleted file mode 100755 index b256e5f75fb1f5467251abbf9442f338892e6ab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmZ?wbhEHb6k!l!SjfQe|Ns9p|Nk?9f#N^Ekc`Y?g~Xx~1t67~r%;lSs!&jxl#`jP zkdmL9n3<=i;GJ3ql<+7`&qyuSQOE}IG8|GfOZ1ZSb9EGgQwvH`bCXhw6bvmbO&Jt_ zvM@3*Ff!<X%m>-Xz@**Nzw)%~qgf4szES6oR(^g_8+4;}QR+O8Rat3Y55;}UDY3n~ OBkprQ{}oXN25SJ<qdqzS diff --git a/graphics/AtlantisJava/img/toolbar_next.png b/graphics/AtlantisJava/img/toolbar_next.png deleted file mode 100755 index bd1b428684b001ef8ebe6fad7b5d10b3271953eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmV;E0&M+>P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02{9W02{9XUK)`c00007bV*G`2iXV% z3jiBk5G7>*00I+9L_t(I%e9kBNL5i3hQG7-d0dT?rdE<f5N1wmpwqB%H7iXLsR(LT zgUBGLrVW||5lvFm8d^jUWb_zFL@5r8Gz+!NdwpH6=iGaqdpGDYD1;>Xr~l$xi?!Ad z|0rWEqyBLBB}2+dVaWdX{cURk#9Bt|Wv|BGLSGUTdUqY^-nec+n4jkSnf=sn&$Op; zX}F=SuX$a7Xl0h#EtQ<=XyHIh{Z2{pa#w3_S3_IB_+tk(O{eohS`|7CNs5c4K^_$q zx!KnPTBEflx8N}__<`(V_!J>JChoR>`30!j)2X{IoWyoASeA{H5<~oGq%}$@(ljB8 zV}^!j85z$nXvB$$d&eF~0DE)eWw)XR*L4xnL?cidQl*I#O%x}DVN4iCRJnp`m-4T< z)mC@+p(+zV#Q~F_auiA?b#+^*-sG~O+{Us5hM`FlMHD3jrGUapf#t;|lF|xF*_Z%n z93V{#CsRh63JP9|UkXu55yvs5AjJ1P^2<xiOi!`uhx5Y99RK{}%0mMnvtwUgNUH*s zpdt?)d+4~t*=qv?VTkV+$z|sleftXE_a6(>>C6t@m;=5~5KKL*{QZnhO`|T$IHW3N z=HnP|hMtEh;-Vp~>+`Q~>z{Sznm;OSqQGbHeh=egqwl0$ezY+DXymW6;MDHb2!Rmh tEkoMpic>F&>q?nZ*L=s>)^w2nt#1c?_#WV$fCK;l002ovPDHLkV1f)JA;|y$ diff --git a/graphics/AtlantisJava/img/toolbar_open.png b/graphics/AtlantisJava/img/toolbar_open.png deleted file mode 100755 index c2d8efa7b0707f148900b981c51a5fc9adc92067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?kEP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10i#JoK~y-6jg!4@6G0S(zxmmjStGAyq99zLM4_Ofh=fE(LGl0~ z<rz|;yh2*?BB>}SXem-sKm%n8Tl|P3u@#b#*s*;nW;V_)(ZZ3gMw*%P%{{X_N<;uq zO057ZETs5blE#6E4C0Ik3Gz(-Q)w?Eg5B6VoQROEZ|?)}?fVamF{w04sYL;uPN&k6 z1@!LAdwluWjT6>jtwn1cODUArF^`I=*0=W$p1(c>Km#2AnsRbJO@L^=?!sEEiBM|{ z09#Mm>}=jm9SG{;N*G7~!mKqqjb(&V<0)KR#rw2EWi0{{q>NDq)bF5@?>c+UT!Gwx zsfVu)1Ymx7g7)oOPpNA@K1GN4HLS}FFP^S4`q^h|<1wd~^G0(!Xx_a4O!xjOZ$I?0 z!8yh==pRiuKASN*pEUv|Q$zn~LTed<bJ*NxIHPF?L&!9_lSV+u;$CMoxzDh<cPtf- z-(649vJ@@*&pYUKJxhfn_YNC;#&XBeTI(?wHRmt&XsySc!V$_2-hCRTrD3D7sv)^| oDB=@-K>Dq@{TbIKz#RDc2lQW)UGczGVE_OC07*qoM6N<$f|ic$PXGV_ diff --git a/graphics/AtlantisJava/img/toolbar_previous.png b/graphics/AtlantisJava/img/toolbar_previous.png deleted file mode 100755 index 940797b8a588cd4a74ce79ffd8c3957041c319e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmV-=0)_pFP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY8?OKW8?OOg8j&0T000McNliru*9;sHE){3)r;z{v0tZP% zK~#9!wbRXO6G0fq@!#xjvfJGdgDFi(6@{khsiCQ0jE5?%BKA-!2-+6$D2NI@sNk&# z)|28z4_b&y75oSE=vma>Btj8dji$CWjoEB=citM4UJ9wN_<`s6d|`$e{40W==$&{9 zA^C*lynEr<+3RRQ!!~+OJq$DV`&~|Jlal+WYZ*|`LUMdAQ(v4<>^3H^oF9g_zJ%>) zTNj@wQi`i8*!1zCL|`!63j)9|fBto#XMC<p3jQb-)rZE06X<9U!Ku0cA@D0jgcC=k zYDA!!Q4m#!;IzE@>RyC2mQOz(B@nay$w+%P9Y-(_fU0Ux6r~aPK?(uRIVknvdoE^f zKESv69MQT@&fd`#@8ZE!l*D5p)M`E$1GE4(Bh7#i5{z=#wu^lJ12}V=M-bEj<337j z1VI%D?*NQ81wo-g)i|Uipj4ph_*g4dP$(>8rT7(sHUsMV`{yr=UD-EFAD54QDy&$x z1C(vvn2OC{I~<NH;Ccd-a!|%mwQYP^%!8H|rU^F1vKKl9^KzDD9ZL;l&=Ko|WtlK^ z9k(x!fdty>6M_;90gBeRM0fFJWXnt3nLa}#r&B7#jeXfedf&hSgiI4NQzzi9<_UgR zI62a9?LGW1J#tB2yZ>71v6TGdzhLeeG$r?M3Bk@m2zbS}1b;)1?;q8>GCBM&8?MXX UHoH%CfB*mh07*qoM6N<$f(*zK!2kdN diff --git a/graphics/AtlantisJava/img/uparrow.png b/graphics/AtlantisJava/img/uparrow.png deleted file mode 100644 index 339e331a52746b8c5d30b968cacbe4e6745576be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_8<4DKZ~;+_#X;^)4C~IxyaaOClDyqr82*Fc zg1yTp14TFsJR*x382FBWFymBhK53vJdx@v7EBj4O9zks;>z(;MKp|UC7sn8Z%Udsc zb1^9JI3HZ{egEg;&_7K|vtkoDTBI)MEo?q>;+bRcHlEyzj2l!q?;Pq9(s_5fG=Adz by-OJmToo4S`}f)kXb^*^tDnm{r-UW|tsOe{ diff --git a/graphics/AtlantisJava/lib/Jama.jar b/graphics/AtlantisJava/lib/Jama.jar deleted file mode 100755 index 4c76beca1d5499cd3f996b3e3f30d77b02c7d319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33329 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 diff --git a/graphics/AtlantisJava/lib/batik-anim.jar b/graphics/AtlantisJava/lib/batik-anim.jar deleted file mode 100644 index 6913e421c916241b2c96081e5402191b6e18e1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95479 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�BKLF<5Q}XZ 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 diff --git a/graphics/AtlantisJava/lib/batik-ext.jar b/graphics/AtlantisJava/lib/batik-ext.jar deleted file mode 100644 index 8c904e1f2ab5de46eec36952299a181769e867c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10261 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 diff --git a/graphics/AtlantisJava/lib/batik-extension.jar b/graphics/AtlantisJava/lib/batik-extension.jar deleted file mode 100644 index 106e4ac3cbd922d89f6b08087a30485ad0d2799b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68051 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⁡=b?%7aeQWlDp(sh3bqB?+k`|W^L}i4&frwRF;c)xLLErCQ#7f zq{I)~je{uyURe5OE~ypsGxV#B6txl5983n%Je-AzIu2xQ%J(azg0e3u66(+O5h%fG zA7z~|PT!&HF7YCITGfjbV<yN7W<t!*E}QZ<07O;?@D3(nxSBuiJ&{b7&fR>TYr=<u zq~X7jAeZ`~Yky4-Ss5y<6Rx1CkF?(223;<3eu0W=9_m5esufAJ(80wP1a&gTsLoFZ z)a}pv0!sNQ<qt>KY<qND-mjqbE&enmu`dAu7z2|B4m6-@_Bbrz!`q^m9!L$w70gun zfK15eigy7!cXEG*$?(EjeeeGYle~eW!C%89^;?{VJ|_PrPMvr`s7>7M;ylGb0&}^c z{Bhxw4tJcSE-N~pE>5!vCHpDjnNQ62+o7M?gdd*^@kh6N<^HI9+aC&%8{WmWO;YFs zg+t@frX&g(!>#sgJuvu|*H~?6f=9oXqUMSYh1E`lallELJO!?RKOu!1xL4-VxV8O- zZM2HXtoNckFmD6uS1+{fqbWHN#wseBYDNo8lI!RC4&jD44teRqeD2mGCqm~Ke65_V zo4b)wHZl6m`1>KBYj<%pYfM)}!U$}+7WxRy!j*kn!_Y$;-c9S_Z*|fo;yKipdDOvq zlA!^kZK=EY#EDaRb9m`w+5($ML9bmic3?z2_@)^boj_~!R{<}n{=%m@eZvS|pg0k0 zWTcKFY3;`Y4P%)P*(Jn&D-IC}Ci^Jsg1P;URflpWVZcMJP(il%x#LoRxh1=);2r)q zPWzM5oQof>UP>lxYffDsHQ{7M(g@!`k&i#<-2r@X4`_dj)8g>w0&i7J|8nj;fw`Rz z%v%I-Q$A0_1U-=QV1zMKkOr8$D3yEVL~KuYz3m0#i3oY)4Jc`L;F4nRnf|vvS!7B) zRIo>In(W!rPH@L?)U%|cIDj@Jo-5o(&5r*EPGCJCp+}!M(R{W#<^MLDJ{NhP!vjG_ z69cQiq)JIg4oLu+XU?`mQLCr?7ZM66ux}OQb(t_xBIy8-C`?#P!>R+u^16j-$=46b z9C2m_-rIs{uCe?$RV*Yt(~I#mjziz^wSwI#J%s_IwVK>WE86OgRs{h-Hk~y`ht)x5 zArA%8S#C4($q73K_OWs*bW%=6gwwZWv}c+JBEb_Jlq>THD~kt?qg0zTM(HM^rVr6T zMG`5^tMw%D0YU~FT=XJ7dS$f);iLV~lCs>>8ZOC@&z#cN`phZEB_wcBVv6f7XS%y& z>P5xtQ3}pmHE@|xLi}ZUVY&lOF7FsG1UW&wIrFr@iShM!!7Ue+vnJ)~mbHUdJNs($ zB2UfE6mZsEK$3DrHBgwS?Rc0Zncp!brIq!AA6Kr@5ap2m$Cb4(LU74AJy%ZyL+71R zK^b;QojTcr_Begz$EG2Z^gHEP@OL7hUBhH3KITg8L|!Q?BO8{BEb$qJHjWA|UsUzi zIj!jNZj0|XbAB@3=qAF5siI+?5xt<Lb*Vm@=~Rtc_+!J#xY+(aqtR1y)-Q06UqU9! zYl%7nF-b=lwfT9_+(ARy(Mo*;w%7Z`Hs!ekZ?8*Ye?h5^3SVSukBgk05Yn3Tv1p41 zpo40Uq^dCpG|N^X7SqdGr!2dT8S(wc-ZyDvtv@6R<C848{~K9<3DrM5iY$W~_K7?% z@J1$2ghnsox0o|WA+yMb<x66BVKw|ct3LjoRSKaF^`J8{Nzk7Xb^j7+_FKzO-H@+A z;3&y=(<4r4ZI$JFWPZ0lhtIaR5gW!lg%Mt1<pncYj0q7esz<srL4F_PJM<RHJ<$#2 z-Z<3McshQZ>XXJu?Mmcwr}{~iR$QovVLLayq@Q8weZ26|#BZV!R(*<uV&FV#>9}*S zo@S7SK8cd(x}(3-)zA|g)GFE7zg@Oz_sRujbB;l)cmwtw?g}N#Yq4sS?z?B7o$=g) zRX%f3rmz2b|C8?`(p*7^hIiN~!z^0338VCD9t+Nh{E7+@PH1%_i^aa8yJeV)b`N%c z1IE)~y@~pWg!N;JuO+j}&K+j5-{v5r(B=1}RD*Xr2G>_$1avei<%=@5QTICrPOciS zYkU8En{fMNExyxb_DfJR(v9X#S5*xs4!MMJaUdyj1w4jU02YJ>I7y=*)l*}PmDzrz zTDsly2<D%<z!m)lu*w!XS=fTGx5gN>d1-*n+wvtqO?Kp+es_=H;biu_AAl>R`p`zh z>m$7|hGr>s^k7T&pfrle_AZs$!U5I^rX*{ES@X1Imq~}d|1tU0VayWS{lB(8C3}Ov z9CQA2X7HOQ2`!+&%a~-;rfFA%zxTdGTz|@6N9%tV^X7ku`QO%g#N>iIJ9R_ZL$}d9 zn||K!;oOVYwSk1Tt*ys9s*oIOt`19sJZR7`gESaYw~++j>)WTctShSZQ?16-J28a2 zr|sJC;!A$20>VACCA(&E;5d;Z1#2=XlV$P7xC#DQq*nhSQeL>1w_EbRMXHNTHYyaU z%#e=b!h^1=CNDqB>2lWCG3(~b=PJ+9y?d5-XJ`%DW9^pnQ>4^BMQR16v--D4fqjb9 z^B*Fm7vXj@Z~58zblN{fD&bS4qA`#7nTx8#Y@~aFNs=7^nP9M#=3~rF)N!HzAyS8* zA_a^l1yl2`<biSEhh{j%hxpB*PP!;NRZg@3Zf1GaM&ykkyg7_-Gz-VY`tAHz@o4qx z<@25%iX2oLArLgV{0IFfO>hk{5=LRF8J{%u6)@Gx9p8&!+QfXT>NPkepKIsl4utyb zeA<F6z@5QDI8e&n_-<G3=U6vp_Pp;vD_XtT#j!8_zeS36R}!jvi_#J~uD^--hVx)p z)k3ugXI!ySY9?YZE$7c7)fSB{{eKoI<<AYgf1OVMvq-^J{e?(z^aaTU{JThf9H#w4 zqyR4x75YfvQh2l}h(aoGtG!yc{~=NgzeNh;pCU!~Tcp0g3Es?eYF^o=VC^raHRwMm z_sQD@J==@nu1v^_GB(rDR<hb*P@c0Vn-c9w5K>gH&lDft@}hao!nLZ{c_WUnD{$T? z1Z02AKc#d2<i4hrC1oSGGaznB?BCs={5{Pa-p&4Q6BX_ib(h)CvhC)w$JT_-Zez6n z#|Y|kRK5^b;See8b8IO<A}h+6*z&6fVnwkU?^hj=D$eg=rh$5v;+uFCjFb_O+hYQL zUGTGgd|<)meeLko8DCS1!Mht#v%e2TWeADouK{mHOrFq##R%7VynOSF$AYyLg`ww7 zTRY1Y*avOAcdNk!Vx{mNpzu4t&siofoKuQ~QJSjNCr&%-Mzs&e_ZFDzc);EHU+qe# zD;Z$~Q9i?IGB+78TS+?G`WKO7&Bgjh<SPTzrSCV%vMVpBHV&9^d|Ox4!`U~=$pYDM zY}&%nh*To20u6*EdMV48`4&kgzW>;NSMA9x==9m@YGD8XSpSQ5_qQ)wiqy2!KDXSx z%jQa>8(J9UDQjXfL;XM2-Z55`fLYgEwrzVa+qP}nwrzXuW!tuG+qSLQ_kK5%IX9D; zlg#|=?sWg?RI1;udg`qveoLF~<P9_=pe6eRd8)GIBx7-~6Qo(`wl?p35&Vz6%wK+d zoe#rRMyq$=F9q7y3~7msX!(V-_ZPRB_m>^B(<$Dh|H<Jv>jSZ%uGV1;E22y)R0-c( zpj0Xxp;ncL8!8MFSBc%L_nT1}Iv$4x%Aj^Hd};TiQynaPDfT0y`Ye1&_ODWb6^)~! zD8ooLmgN;0ivRr^NP{}KK>eqzOk7e)t*+V-BnrwE1p`VN6ivu)rSA1X#daF&Z@GqT zD!Psq4*d`swG^^N5LfKU+ofYiG3YAnScFP-)g}#X4Rfh!@Q7RBW6mrpt-F1JoUHNF zwtWBJmRm4#+G3kQw0E9u8r482Bc`oow-cAq=E=ZJsTTV7d_Sq6YD~SSl@lG>K&HVR z7@HDP`+7rc@MBe%Rh{jHZ7&$yLZeHVY>Un!hNp=Nn&qiLvK9CKyae|dT1TU7XdOqt zy2a`<<<m?Ktz@OHi6~SWm3RiFCcSA#ip}IkEm;o_V{50E_cIhBISnVZU|Z;Ip1T4w z%nl3djuTbuetQFF>egvDkBL21juf{L+Y|}coYW$l$>Oh4Dbjonl-{Tjyy_E-nZ$(o ztb)1921REAknhCUKW+*oA+2IsOf>7J6SGk-$r`%a^p!DK9?Ln2DiO&~b2>RiCi0K2 zGAPYew3ExbieVD%gBZL6xRSorhM8Lu#!aJtPsS3{ns_XD%!jgy?qGsYSF3j<ieF@m z8aQ^w!VJ7!b0<-d!k*>YTn8N5RSpW0$7*Luv!H4%Ay+F$myNQ<bK?_{#AM+IFD(2n zjv~V318{{<ljX=wB>BF*y%+{`1AZjWxQ6Q1b)(a~NWCJb)iU?@%Y|?kF$=VOxeU^| zns<M#L?%=V-588FA21hQy0}ept=VSl@HRVLnmCxKn~y*L5i_hp^weE}uXBN8EgQB1 z1GJ2@<z0}QE?BNnJM7iup-$7X-P&s_k<Of9LY>D7>rx^G&r5eE@J`wE<B&4x`wx#& z1UiLjt1zti>&JnlWzj7=JcPuh)1)5Ev2Lwfej?;g^UR{VR*2f8>;RzBy5vt;M5#o^ z!Dcl)z@I_U5H|~rli1P+MxG;B(Dv}JkeGP-8|ZPL2jW+){*DKrCP(rdK~1$;cPY5{ zW4D0k)#ydIVGGjXO~e%0P$@H^;#@%s&SlKlL_EmJCxXRJ>2~58=*zT%M!mXmZo?^@ z1=zE5-{i^?UKinrKGUUUmuIA&Go`1O;mAJQrRW!D#2dGZQ7$kD-A9XT7Z@a->!oTJ z7(|}Sr4gK=5k2RNtry}*KAWYtOALa}$>xtRTSYv8*iXwp!My!Z%7IWZnQtIKnQK9@ zw{>y1_r$(^v+j|4cS&jyKO?r^lHyi?@a1TTijun=(nx4ypAfiHkOL$Jk@9#;*ug@< zw@7eE6VzZ3yTn(-T_PCdT{3G@Z@dQ4cfg*akbERxp+A1%H8;Qin`+NY3i!GBhY^?l zV_W{aY3v_8EM#Zv<ZNK;?DU^B=96;nxgm-YYGw_tWT&yg?!anhvp7s9@miG04}=08 zAr9QKD3W4;&=4XVQkSi(>GuTWso>*D0>}xph5u6M)?+ur;bgj>>-YPSNu7wxs7>~4 z@(`McEfO&9RpQ(ytx_f-szV`RDwIaqUV@`ls@mVo-KifOaJXJep+Wb)L(tS!XVET{ zL(WN>DG_{1R|3410|8|8(d5Y{QzexWN_1wbqXhTouO(xCA~~3Hye15oC-)3RdrE8? zv&f>1k)CO>WdR$7N8*Lby1u3ex@AelIg3ETZXmPle33D9alFWQxKv6MEZOn+kFiYx z^`$yj-jQiVzddYaSVm7Os?Dx(J>A3yYZ41uK44OTZ^===w+1H#C9Hy^b+2(`luf~w zbd#Rh;wq?)_|PuJdJcYXnbd%;A)^^FMFXeg_h%KvCnwcz!I38w-d+ukNs$nBGb7J> znuzMKBUj_8ibRbv=8A`CEu^Q2YW+_B5#9z(HSegAk|RFuIQwu_W#)Qz!AQDlrjZk) zjB3$Cm-=W%g^5b?(o}^kW4kUJ3|ZQ-qN8uZbn(%=NXyv<eIq3WEd2|Ghj&6fSyTa0 zO!m&NajLR|^&_Q+dqVY=d~$tlu7!<G+Qht$u{6>>=g*k1l_Y17dL*P<OQMEdJjb61 z9Gi2Bb^k=JMMm9i9FL}$LI6V2KcRdunq60I+#RN>XIbK>`)}viSEBI5q_barwCX;U z%f}&wV@i9cgs)(+x2RyHt_G%fq-qP~DqNf=G-J)%u!BF7g8N;kH)Q>;g>6ax$<`oS zcpa+puiI`d@Lr7|`+3lnG`r8hhf|PR_S9^hGXzi9eHZ1vbB)@ka^VQ=bg)^hVO!8} zQyPI`I5Pr0haYCtu{}sW7hAF2YD)1lS~qpDmwK@y!l%y6mA0UDFO%i<81|ROBvi4Z zV!5Kbf&Nc8KRW`5X0lwtR8BfKYdYeYml^@r{zjxvpIk=j&_phQmtwvcAKj3(9bHKk z9HUlF@P^g+@ZkB24w^}*LVgE0vYog#`$VsMkQx^-I&IWe-~Mg|Xd#4Q^D#<z!Su`9 z0XggRUWibE?GhI_$#Q5Ag!qXxZ~NLn9Ux8oj(w9#S-A(V2(<vUM7qGbVqJjVnD?lA zmEpC3y>V~AdzayC0d@pEkX<2fXmd70ZvMAKJ>Xq2Z@hQFL+}CkguXCeAP!5paR_{% zKN$DqeYr$GFz(>@wDy4aOnax{dH{a0Z_s;mh<>17EC+V}y&_*oZ>R^i{=H&fz;|)s zen4ml=mApUBKnXHm~DY=P}Ib}uw87ZdIH)(zsY6ytuOfhRa1-GEeg*3`$Izl1prX} zZ;GJ*(JT4C$msuoa{qx;{>P<%ndRSLyYqie|0lb2EB~jS)Y@6sq)e3?S>Vr{aLdw< zt|UklgONCbq4~kvncYOZsnNjY{f+hmP|J&fjQ0ijLou*zb3d#~gVi`bmF;wz<8?Zf z{q5`Y4U5KFmmCzcPQ59IGsWR9i@{2Rimrz!nL=;baiIQ2bM84%My!^DU2cSG$;NBb z(Fxgt9&E-kvJ2Wk)4U#|Tu3PuZ2c^lnaVt2HepkovQDT?^9y=9o3DFe&-LT@uY2*d zt6JTAE9BX7+!<4M?W*%{RI;Bo3|4|dIXM+yb|WX+asV15qb#@w;(|zVyaRe8!aO(w z|G0E{%Y^XgwK-LR1HpmXW4Hg?gyKcEKT@lQgS_iYDC12vR%GZtc)Fj27$MiZqtr22 zn}s{VyS)@i<K#2f=rM^M)gxM;Fpdz0OP$2~Yqf&iU0@CW$a%O`*P3WQb4bayJTCzY zS8-sgb~}yd<Fj@9byxFay8D>43SJQi?LEv8cyBdPn|2m1z9zzsd(tRYEz(Db8(npE zh0XN3HgCC^Zp_=1B1i#mG#zY(ut62pNEO#(MAuF54gg+hLXb_sFvh7v+ET`lD#FAH zi%DA&EKYG{G@4-BWS{bJ^NVMY`%3G-Mv$>HX4U`bm8Aar2K{$?CI9yk^gkLV|Fa}1 zVQXslpTMbB)R9}_N8w?j>AYG11sQ@D7FG)(TQe(UFo>}FYt5`M0BpB-t!|20QbO~G zFET#9jp4o@e-Hm5)4kN1RdNO02>)g(%WIbBRr+*sJuJ??F5uHe*}gFpvTDtKGIW{h zMtR;iJ(`j7W$-OLAOyyxI(jSmGt(i?pY@ojTqOS^F}4#XWptwK0Mce<;N|86E~qnQ zBsuFG;r@MJfTYm|(L(Tq(?abGH-XX%FVMEW)G;))+BRk4#ARYHWMs@*DvCQT8IH>$ z733i1>}H&R=>3}?4|U;)ibY^YE--a?gVU!|=1qwPzKBvYBNBQ2tMHLHv|JdiIzi0L zX1hcAeKLV2a7;aDg0t6yJb7zXuQ*IYttBPf=lHe)-m`#?o7sL<2sH`Mvdk+zP;Hne z)a-X0cCcz0vWZ^ej_6|CRsl}ZZ-1XpN<Sq>2sE!0h>Pn=>@e*QN8VZB4frC8*;!FP zBp}+?tNzadz?L1{-rFQ_TWPS<l%jS~&0g;Q16|pDZTiVB{cP_c((#uQ?}>f8vId2V zMtkE#*OrD&*qn$qCKY(oMg`<A?%Tb1g`vPtq4jk(I*b;R_HZ+U@hj2$srrKpbqpaF zIr^BH(HIWfM4PlIe=3HFtr1?c-hU0I9~$=GO9B7@5itM&zW*=j=zoQew}-y+^7Ajp z>-3ZtlgBz4<^e#11idj~IL4sAIT8{Q3?Z2TWC6Vd*?6BZ*^Km>wmf3IWp!s@BsP`^ z4F(DSp(gs0<@QCZiq++;Z?mt}rXBjFTIbkp)~7BRGNXaQZ~E(v@9cNha}K)ub7n3# zEEGz(70z7HALb{^wIahtVCpu(VKnfyx9tl6*v<C&+~7a+w|y!Ydx~M90<c0@u9ofz zp$4$TRH7<Zj{eYUTm;CgcLP=)SDdJ;k4WfFlcd@m$@ppO=k@&oX@{s-y5m0B9#1M* zwg<1Kc#R2}t#^l(HMaYss;GW@{@mIIrK2paU1)w|#g|vi7h-T-cy{vlqTtd-A9jv? z&f5Krwz30ScdDp%hdG<L^3j{_E3Up<{Wfk7{+)^T;5*aZuk<dj74Esfk`AD3yR*Qq z6>t8)RM9N>M-1Cv?%|(!EB0xjaU}iX-pK(SI)md_yrvx3{_@&mOukk7w%|AYqwNcY z`;^-2mHWcJeEIvlzONN+yRqPRd7*p`eIaY5`$=0r$&qqgd7!xtdyQ{dz<!alTz8<} z^8s}Ggs{+<{%I=S!+?M#bpEvuw0w<+R&Sn2KRCO4Mm^>GTHL=jsJjaHI$S^KKMR1B z_i9)@rTd>$zI*;r_k$#71H0yLTBv-EePCbmgK;Wf*}yeJ@VIY~z7tYkI{~@-zw}N& zeSiFB)_VJ^K8e+SkNWryf64as?r8BIm|%Y^_IEL=dN=Q(zrdB8fz^7C7JePh|M+@O z$N4=R>S6tC2K@HhDRWmr&Vg78nhVa`mxrEOr5EMbKt@qj!MV$?UEO8Lzvtf%&cK87 zC7uQ7Jskd@cUR1*Bt+8}EMY&_RzL)=B!>hl=+SFpy|gyHBRo~;&!N*oyAvbo38PX% zj4%J>)iPf_)>J^Xgd!+XRiIPr>S`&fF}BtewJ4%mK)fWHGhf+VL@q#;s?<K!yr7Bt zSQUoUpQJXp+O2KkJcm@CoyLR?ARGBGAu=BSJ$|&p#sXIr6;GL7R$)1wl)9Xdnjw8K zmeP6OssLqqR<5r8Q>!k|)?1XH?+q8YBHvS#-%=D1?ufJxD=dg(kg}X_ua)1rxVd%n z$NJzAy`?%9D|kj{$(~sgyju8)EM+NKg|<v<XHH#9He5Mv@yBKI(n@Ng!tw-3BMN<K z8ndk8G<9`(EYT*F?<{UcRNj${POvUHL^HfjS+uRBvTz*T_Kp>_Y*+)=@&yddW6-xI zGbYu%lP{3o>5L(qQ;+@t9u%6maudp^%A{fvxF;6FE8<~^Rj+Aeb3ba%dv~CNYJk_Q zp}*drZB12OE)1q+o<AE*lFFSqJH0}sUwjGMx?}_7FH>+NS-Y5lbtQ>k5%tnMX5<^D z59hsNFm<ms@x`mCkJI4JjH{nhk!WCiwz<TK+*e%&7@@RUa%@x`{V9gC_`NPR3%{0= zr;~wHS>YUrNr{L3?O$_)%(x9Jp&xzc4V(=Ti`W_w_Gfl<F@DZ~Kl^wP=R2urPR2rI zRonRH0_>li^D+&@Kmw^rAX$y9*k0`5(=7W=EG`PC{#DqG2&umK{CN3~43WyY46(-S zTWBPhvP>gxBHsZ6mVUtsiUYhC_&!e|qDaY3z?YnxRvH!JK!!%<^N&uktQ>^fqaLOa zt!XXt-qtSh@oItESd&#IO<|;x7AFp}SZbG~`;oUDzn^(&EWyv(4X+env7_QpYvH+L z?KA@AIYx2yESS5pcIoC-q)Cj?WaI?F)Pj7$LU;4UIBBm@v1d=j?Bbv6P1E<aWSyHQ zF)g11+O?!nGWxCdjWIc}(xC@2%n6lTNE-_^E2?@J`QGX%7wFTthFs)ix+C0et=wyZ zB%3A)B?{|k5Q*6bf@W*29UY-ZC6X--YJ`p0r9j`lp=gbu7Djm1q+FP>4P&4ZY1cim zGiRKK$>Qwl>V+`u7v44`PEB&tulWP_R2e-R=&>K;pvfR#HUdG=>H?bVMLaW;C799- zWsF3j8@Iyh!~dKxl&Orx#s=Yug0H08@S&y9G3`~16*Jq}1^4Bt!gUb!+UyBAjyLSf z*3l#48}aKdh@|CDaVK}-a8kCDnrcOn1=;(@<2uX?L6FWC6~y^D`4V3TT%NRqdR+}Q zD)|sFWD#Hd$bYC~9tBjGYhsd#Voe^qvj;OXkrkSP4G~~n762*h>e$}3zLtBIdjJGQ zfg;8Kay&hF0pF96Jwpg;WDN2e&RQlOIj?A~Tn_)3d-04)4e7RoG9)FNel&Zks>EVN z6u{B_Gts%qL}#vkVrdjUPpBzb0F<<m=~<CaUum9)vbh3)4mBLsU%b<2Cdzi_K*v6^ zN1LZ@fGCB5z7yn>lE_313pYgq>8|=C4Wxz%)kJ?86*uxXvEMr)cRaP?&lNeC#O$^t zO!z|OPMyXYqETRQ%L29q+n$PtGKUs3>BNh690C(3SHv=5EF+Dt1-6p3wnbh5l~^@H z&$L;v-G?lrm-H`+O|FM^eGa#>XTgbeaKvaMc)s|-3M#=APKo=(q6KrgM+!BkQ|wmC z(ar@ay|}LuXICXeoPFjlb8|7rAjYc^MtlGZyFbk5=0+iPcD^~Ya90zEclFeYYOI%L zgxuj_9|J8dYQB9Kn`TeT`sz3#Lhcm4b%JJMSHmBq=hlx;BiBFcH;RT8td$)4x?woa z`8D>9wF9%SS@nZ@`XzTQoLw-rb9FD~O^ZtEZ7sy~!|dxQyvA3~O#+qeU<1*1K4yaH zj?wMh)mesKOel&W&<4r_QNzMm7o?U|4>G3+#Ln)(JIW%dRI&>pTG31UH13Ne+xD;J z+RQLrT_Ks--e$~E#+eYRPY<XH7ly8a*aJ<8s&wi2je5<ySSb+^kKo=#3LO|UvMa+F z465jdL+*^Akiv>#yM1;p3;|#USS6Qtc5lLArTKEGrDui(V`RA|jPBEaS(H|?Xxr&+ zE|$urGvIOu@jap>j1@Iw+~d(Riw1Z1p>?vT9G&0by#>|U4x@!#7%-hw5-Ov(6KbP? z7(~!R3@fN)7l)Z0I0e^V_XZ&%0d;60!@4imlFr?!PRa~BXlD?J$FE`PxjHD2%ov-7 zJJJIxXt}@ADNWB0s2Q|S%`Ojc6bhmg@t#qh5{x((p3e$kc9w^66l4?3x`<(G9-1+P zmkhe$!1Lt7$j=F>hBAuMfE&a{O87RY?i|~SquL7+m%0Xb7m)7G&jt{^dkd$P6^f%g z4zzJc_uX}rqux8p5FaIOR^PM=t~=EGQu4DfjeCtsgi)J0yWsKfL^|-7DRF<qgY`}1 zXNa*je5~u86-J@ucyIJ0N>?ij1kj;}iBzaphLPsWB8xlN^{ADGK|9*ysaJ=glt0&z zZfDF{S1wSNW|czJ&}9lVP-&v;<<P66b53A|kB8;aZSH7A63O>AR0Md7&NeyBRNh?b z6{`*o72+9q^YOArLL2+mvYfyG{g^UR4-R+hN!GUTpc=2<0v9acZTF_RoDoruQm%0G zYr^T8{)VMwon@RnZh<np=~q@6crhE5(lXkfdUwWj6aZJoh;QXb%IatjB_g6Bs>E-( zIG8l67e+N3X49?=W_Gk;=qe18cC;yLmqfy%T*$MpQ+1PQfLc^^j_L9aqTM>`XcN{f z?Q6K}qGPW^cJY(CC*afFA0lwi{w2$9qN-UKCacfj-ebt3Kc^cW1s!1~;_rA?XIa0y zsrN+UdRL!b*g%EA(Mkh506Td_V<nhv1oX&(oqx2R%ROa6dVVK2<U=gMi?brCmAVll zLy-tQ_4Tr2r5LV`tUPaU50tQ0u@)(N^F^Afcmvb{kv%&I-;=~}h&Me|R<<8YcQt0T zk54<31K#jPckuuQDfwe|_8fxT22UE^8OQbQO+@&4A31S{xo{LtC&^?8aZEzMLrWVe z=Sk}HcN{-fc-r~8sNbM@%3Ve_S@-yg86A7Y1&ia>Q&vd<yIT9!4oW;;3@-PDnC7{q zX~?fhJd1>T<1{%xy0YRx$mE2Cgd=7Q8wHB+O2#{iJ@)JCH79^OK)Rq~1OI-Kj+Bx? zhXNW@(0Hs`29U0^wdtathk0@)1F?N7&vtzww<C3ZsH)9t&5#ilI89S+0M5{l{4@Um z<Zm*6E0PJcB3LOmd*S-R0Ee(%UCeDdiJovesaV4*9_E-}S<g>qBNG-Dm64HSY(m}Y zSBZK8{8UC3yV5z%#>Bc|xn)o<<?u`)Vo6k20Igxd#!bx9SbgM_SKApvM2R}l&ol3# zm2#G<bmZt#5$C>IRX$t(&yaW*Drtxv*(Lt-u(imj+f;Fmd5HrMX8wfyT5pbKS3rY2 z#nu5lk^n5>%wGC<sR*QOcHZ&OOOAE`eXOgVG1%+i6^|)Gz_KC$I4lO%)?fD&kZ+Xa zJ925phVPs1<IZBcP@Io15G)Z+2F@FONb{93HdTxp2Xz5V;aI}(`l1bbJsRYr9WuP( zVj2?E2eEHn;#_1K+c+)1lY7krLa&BKJlEBRkB>K<Od)}u&FOnFPT(CE2y)mY5y>`^ zxOi3l@vn=Inwc2{Gk|q?$L&6k2YZcj5Uk3C^NJU@x59ggWYxglyYSg}%3>9#iqy1O zI+|Q2F<))I_793fGe<ls-Z<A_M2^3hskvF*h>I;`pTypDX0Mm0%=dE$9&KJD3Pn?0 z=I%i|tR889m2?#v>N*TO)(1L1KwX?aqn)%JDSqdLXW~UukD$ZUssYd6S}gQ-{P|2L zGA)07!h7v$xqLU5=)g{f-R2a7ddP+-ABqaYamg7B14ln7wWv(UsFi#Pte!)B`b~HH zT8GvL%T$0$6W=m_>Y|PFqm-(hH+Hj3$R-dJgS=&+<Ml3IM>!z-v^tpcJ=eOjvmc`N zh717llPOoG{g<3OT{G;=4De7|l9?5_Ae)w;H!bn74VVyaKPdH~5V)d`Y)uPZ1llVX z<SF(JyNZhQZ4KV{;uuZwD^;03k^Sf$YvQhCFZvLelrG|XCac<zJbWDW;0B}BXi`GI z+6In=Ghz?BDoG7}iQu6R`+<1)=b732rZZRoJozkoav68!GH=a}yqHe`jy^#jzYE@d z$G!0rZ>cq3P259rY89*Fcf{?iZhZSj%L(?(o|?u-Nbj(CT#Nv^;P^_}99Pz}wDo0G zvkYeumFS`~D~3vXQuHevkCgQW%IyZZPL?c~|9&>{)-m6JUnV>PJ3Kb8ed+aeo_u*b zS><zk4o!(~NgK>G_4)PFh22;eW-k-F=_cu$L4QH*FrBI?%H+2e!Z(c+6@BaTIfleI zhB%B+IDyi3!{d+nf`4K07Ga{z1YlPxHcGnqPq%mPjqyQ9Ky>HX1#wc56EC5#E0y)& zmY}gKnd~nCnf;}XrnE1a46N)sPX_Jo%OE80e8>%%;<aZvIXOPL4MXgXPs!YcCSP_Q zJPQokBRlQ_f7<E_G&3-!i=Lo43z=sD4TJOJBoI;}h{(|*fUP0R--LSH7puduCH&ce zy0*s--gj-oXc<IR-UV@+NRlJxC`=lX?cs2Jm_8YAgcy$7`$ZJw9XL07!%d;S+r5j3 zxJT0rSRI?0Ciax8NvLJOi`sOAu(qAVYb^#JL8D03#Sm-8s3$%u0*9Qi6%PqB&(xs@ z#ET%N;u2MMjV`l(Q${Ktz<A^F7A-1Tko*PqBS@tF%I`N;@V9iu>ix6pe`8z6ZEGJ1 zY1AX}q_l;0>aLNvJ;Yu506;R22=y`uV#^s~s@`ePzPZsGUyV)GK4P`*PTDF{6MuqZ zmufyl(wg#iq_AC~y<FJNaw<G-W|*&)Qu#=<-qp3~d3NUmY+V%q<H;*9wIx=pn=buA zfetr-Y3yQ}Aj27TB}d8)9<^6Gv~!vtbv2{ez=AzCp)KQjBC2V^weJqTUK%#;PG2wy z!)zFS6Uc{XN+AVSplz6py78#`#>B7%bUX+2D+SZKz}vV-w`5wVBP!J|Z&3?FiGdaK zWd-x@T~Xe&;fl;H#io7PG8C{n%mOw`)!#VM*Z2~oHcO1blDTPGv4E+}=u8<W8On&b zRl;hbFfLzeOojQ8EXb}E4qil_<lb!^^c)7~21~#bBMly(AxV_P5EvbrIl~tqt0q0c zn>523ChNvAzRqGCZ%fwL6hrSN^B2`);2)lDWNsUm-@YxZ6og&0pl)u$_Z6esw9w&1 z>d0#O&E;)Cv?}WYKE1`EYzi69p3zJizpk9B(K>9i4PW{)S-k-ZtpQ*(H=7z>`HdzO zn0=|Lp(w!*J9TZ_Nm*_YoQI~BRLT%avJeKx$LVhXTD15GJ#dFl0<V|Y<SVl9!6I?l zyNC0}mfUAhCK_B!K@bk*oDWJX^hY~}YAYIROR#P`P6BCF_3(>9+ik>t8*|Ww{Q9w& zd6jGb*PJejnqftC<JXh2owY2mSkX~sA=W`rm!&P*8m7>;ltXV+zBgR7aed1sP&9t) zvSm2n1-OO*SsA!Hy{qCIq2)2$m*zH2jfSjNQ(Ct<y~~opV_DjRXV}Jwcg<<rHNu1L z$Q@@0utI_~V=B`ayTShKE)o#ToggGOL4YLIA2D4dxYGbAHrNmcmdOETs=wZz!*mcW zOW6OkkLN5fi~-p<+5_oH_VA5i&TW)`7Z=#a4d!Y4-$7=cmGO{9pAE@gngpPlL|<A) zi2*d_GM@!17iGLG(LHMY+5mpM%<Vl~wPoR}A+Ya*>m$@bAD!V8G#KO+<rN@LDiE+E zV@^pMS^dDP;7txt1oGzyF#DbzSv}~Gp#7dje8?gJx?EVfJ6OLmNU=NF)L?lX0uNH+ zI+z55INIpf>_Pf(dCEg^pE3sJ@uZ;YASJv_@q^z7eA$*XL44?*nNPeJp|r0|fC)Yd z%2Qvmk9_(ki1ai$w9Cc;Z@OrAsTZ{meKwStd(}6nmY)C%sq$s0PF1z2xP4`^qz!_w zS_ccIlx-(q;^1|>V>@g~y|4y?#DKVW)D|nAV~PK;?M7`|0$^4>KDVeA+f-gexufBJ zgtW0^1FR3bv%5n;1H38P7-DLw4}FxBna7o60<%b?g|;GF){QJDgc)&r)qyU1skqxY z?I@3TYJ#m7eDae3rGfm3W1Dj%u{P&)@x2p53%;)i<-&YY0ZOs!AXe*iiYLMZ=-vC` z){44J&0pzCvRz>0Ey^(d+aM@S#~SkC?8Hkl*y<}jXS`c=lcswRIBiAUKxx~YQ(1;g z^T|rZ`4s7*k_OA1DEr&}n430$N0kRUf3u)a(xDK=u^~o`pksR~)%c_75KMK6L^aSy z2i`XaK#)7`aD5)_K-fA=^uz|*0Ngc*PkT!4pwq!icfv2Ew82w%TJM0zJuB-#yE@G4 zwNQ&TC?<OU!g}CQLxfU&h^TuaZuCxjz-E>MP3_Q22M*n6-YyVgcS_xmw0)K~z}nGC z2W;JdZFka}0hu=v+mTay=$-(z!%gNN<Stdq;mY`N$E{jaWya<}$zAd4xjW*97rg}4 zEXh9rj%(bg@bSyP(M^V6H)NZ?nCGgLyyAF!ObZ1bZ9*3bqG|!nig8!=kikWG9P}|? zjH9lujCQvLG2Ed+(HmA}`PoB0P|;%G&F5_}HNzwt9Z;I`rHYLEO{hs0aVUZoOeOMK zRHFJEB@1{K`ulvw3_N{U1u=z%J|)6SFv7H4U?Q|yMHL!g<(k4^nAV|F@xvNC2%xl* zRI1~=(|iytf|i3)MGBg9)N6pH99HeZe@#jSw&`~~ax~o7FWU&GHSAc|o(xl(X8#r^ z7Mo+BOfsXxglEEF-+LMkz{Ur#A+xvkVY*{a4cN%XZsx<?5&^dYtL}Br1-uSoc>~Z6 zgOAg3gRJfk+H>&&x$W7y1K0(3uOXwe-b7&z_%H~y%`yjLaf?zP@N>iB#aA`Smz||m zH7NqL55PF13DR&z#85RSC%q;Z5dY#vjtArX9i8#J=AY_zl%LYE6OIb%<J$~xu=(Co zvOdtJV3;hSzXzaxFmJb=wwb&M8McPiBl5Gtq}O)Xf3*<<332y-IWOGK4F>XtDmh%V zN8<%{y5~^$pH-rN1d3RQDry0T98Eh6OlxMSS{bR+l+s<lE3~>N8Q@PKWy?1uL=iL% z=gAf%6P*?X^z9Lr2?3=?5<3`Ywxo=>#dtXSqMIGrcSmmiET6&gq}y#DLSU3qtWSZx z3bgT7Jx%Nao>RA;cB74P**xe-Q+$0NZt*^4Y}~w(D(o>?as!k)Xya|GOW<C9@IHmQ zR5A`nJ#F|9#nSA>@0v9(muR&H|8q0$#tN%b6oF<zyMjc!fYKUnO1l6~6Qi+0t(E$> z*yI*`*WaBE2p#uLrUAeXv33^>y$9InUX31eH^|#NSN#d_Juxm1iH}U-6Ia_mcfj)t zr>2i@K=cdx3*lF^{$zKb_bajLymycEi>)g<>~QF-8{={(DX-A_vw6JZwdjp%=!nfe zunU(oiIg*BqiU#T)Sf8CdZ+|8oo4vU_HK`asy;ne@_+`@bW`LxiGqqfK6e$m8ayxN ziRTxfX;S|O;LQZ0JyE!AEaz6jP>QiooX-Q>y!}X6t^LZ|FS%NoxIN^E7b1T8;>^?! z&HPB7=S-rc6M)OoQHc=g_6YBc8v-5C?5yKb!bI=HzBFFysp#)S>Ix0*e)BrHTawoi zY)jDgK(lmB$l}O0FcqdSwAVFrd1_}m%U7J30-27#?NI|Q^N)m$4ECHVI_Q+e{luTS z?2(Dgq3Now^BZSO3cH~7k@jrkr$iLDicQJ+P#8{SOv^Q}5G-vcj&Wgvbr|ntGzm81 zOJ_4-+BB{$$DmSOVdN~wftaDpGgfm4avo?MJaVUrq<Qd4Y%l$3U-ipzXRhqatjo{6 z15vk7E+;<if_U7vC9sC?2HrLO7CpROUlDw5ix#^pJ3hRDJvHHU2eG&I;41)a5#jNI zOo*MMaeFfy|LKL5_AA;BQd<LtM9wv1>jaLfsy25gG&FQb=zNKjL`k(ti`3KtM4bGN zBu|6O#`x25N3(WD%Jjlj2&f|x7rc{Qc=k1^y6<sEfy95FR8h3kM;6w;i(3|9KaCN> z-i3<EJFto;we={)izAgscb{*HbRu^*gSl-Bt^JB6<>)m$;+(K}<eh+}m|Q0eXmax5 z<H)zgQGTHw2yk5GMkQC<5`VA`->7AoV!bPVr_LFv*y667xpX>kP9#f33~hl{2Sb#l z0ZYY$U=jdr6Cja?AjZ%%;_0^NRicBLhA8gB=jF*p`ali2t5A^jo7q8Eq9W=9j0a5< zfZ4*m+f-2cvI`JgBg^Zgq=R@BK=30lAq>f=4yc{O8ySR>_r?oQ$RioEXsPNIl?}4f z!=!{+z=UB%hk&*yF7Cn#@a&MF?`i8H+#-kH!qo%gqKe;=)kAM1$-a`z(Nz&qIv^tE ziKxjU!pG2c3dF0>PQzIYd({764RO{BR+T28FP2FSsn!c@QPHBiMg18PGAukpRf{Mc zBD)V<qt->`L%9vV9I_jZ8@e5SKA<}QyN7oud=uTO${SO`F>FYrYN5n5>|_+&%5NLa zp1^QOW6YT_i|kC%IKVT>X;aIfyHUa#{+6s<D-Rw9o&dYgYe?C!LyDttixf)<8#bE2 zyEiiFU7KdbR_mj*7W=eeO_6q!B7NMb!08)LpS($x^k8HfE(VIkscslTtdL2KHeaf~ zif_>gf}EgH7k9d@lfev9DnIhKJ{IlZ@)ch__CChS8o4La&Z8b)wCFZguTI``?vN|# z^E{@eF4$Jw=QL?>zOg{b{MG1qa?XM%-OpfNm6$&pH$6v$qKI?=OTh~Rd)kwR+RGu5 zV}&*oDw+Enjc}q+=gL%dh<rcVoFUX?6oyFEhkQ1TtUmgcJdfQ+f=@8Z60#u{rn^>` zMf6Bz3=Hgs;uPy(gs-rt6`7MQPAG7?nU=o^R#2B<T1W|_G(2G?f3K$MFu_=TDupDE zNrDBoD7oZDVfz}hf2Z1{S$I`I@z<e~QR&#+0A_pYiviy!3z>fMC&wR8M>ZKhATW-| z?NgrzPZ~}#p2<zvX`5N2Jc;3{=bu295_dl{RiXi=l;bliXV!CM%@AzCqFN`2>e>Xs z6xTRIQ?|-60k7_}N<Mk+n+D%U1Kb?@R6JgJo3Oc0**yHSX_!K+czXakHyq_$lQxdk z1w=e-MK93>R~pH-?|hFYjo$0;G}I|i<V!irF_1^(I-|%PS4Nh9#COZu2#!h;(8Q=p zqC$e|WG!~DmE+VY?Bm-rv?by&h&ybVx}k1eC|_H@rZ^9)8u$0K>yK~x4qsKTo0zwq zqn};<@Kq0&L+kQY54l6DjO$_y*{sLy9HM6G2w?GYA*G0B&STFTVq@0pzlCLl7nh+x zryi!u1Ir9E*`~`A%gU#~qRXa-70X7m*kihm0|jIA;P9-bW*X7@3&rg?pZQ+!5`ttX zeadafrUUKHCLPFF2Bgk&UNqJrR_8w0+#qptp9K5AoZWnV3hbdfV7a-Wf(Ma65|OBk zsHmcpSkY=%@_8iv%%qs6RORv&MFPc%aHmw5@|DJd#OFIuq|llvN&3Z%NP-g->XlhA z*vSla5}43hDfh;dWPLUh!fW})gR&+_+(k!yMv}Bw3J-gEiU6}zN_(Wm2)Zh=L2Sv3 z`!*(=-gzkfqZ1i-?TRpdDyDsWsPKV|$k!9p(xlkViHz7{2`X5n$p*2E;Brb6#arJo z#PU_)+lPOQqod*_SYw()nu4lEjWMq^$6J`?BWS7EvC${Y*&xjhh%m2XOR--KF|Qp< zj38MR%aKqTt65i8BtOiWLJVy(4Q*D3H(W<H@S>Wp1GF5<t-Z#tmiJ&A)q+|HBTtjI z7wogvO-t3iq7zO@t*!@57F?~|1+Jj4iWgD=vX+72uR|*E+}-J>E(3JD@{7Rn)}f8O z_U5~-JMlK5*<SnNUI(gq>b&T-R)D=;2CjMT-gMVq+F-oFdpc4kiyGmUjoHx=`dsKm zyWo+B?FiJorThCz<w<_{*$y3nUIkgP+p=!v_|Zd2I@Z+pAU~cL?D#0Z1QMY50Doo$ z7WPY@a=>`PL7piR0t#(h)nj`58q0Kq@LT3T4J&^C?qHuypI`qu|K8RA{r#^T1uog7 z0`Nb#dZvGT`#+T8|IID!|J`8dKRiXTl8)UXJqnNR0$H$Ne)K)d8W{XFm=%~8zoF3r zg@|+om9PO)oUN&%kfB;cCz>xRw+c`MeqWs6nnhVjO`t^Ao9=Fw)6ISJ<Kt>8eqCLJ z7ak6E=5b3D7p*Ezl_!P%djH>`PLN?8+O`eiI?Ky25LY2QhCs(C=oP#noz$-UZE-a! z8qB$~c(Sdl$AW54Zc_6mW2BEJxgfm9PUZVJUTjJ-McR;Dys#f8C9iQM(!t;nn~Wjm zgIpJdNYf!hvL(2F+v?{4yni;)L{D5)`$StDG~Ogee!ZC$!C)8dFkqPL>~t^4FFA41 zi%N_jpd2XFgk?Dj33(`tDcS8ZMm|f!8z0=;4WgL*6{zc*tKcB9`h%{l!a@w&p_>9L zL&_|}mtz7*b?95tbsx9$OEQ~CGyP1Hq=Cgd+U)(3a^*kByZFNjK8`~j=X~9Wf#1J9 z6oI9F^X@6z0UkKG&y<Yy@28u|y)J0*e^=s(RFun5tUmfV3G4y0*G*A8-E?nTTu4ef z7{J~ul0cK6F3us8S(-wjIseG;w}m&v4n;Gdv(NcO6c;u+{Ptr&HzH|K92k(*a|RqE zk#$B(l3ngWp|Skkqe^vLpWaGSsqc{{jnX*3hZI{`ns4S%_Dbzw3$r}rv^`o9%Yg3t zjveS^h-~~if$ZV3@nI6${($|jafUEg7IXB^E`Q^nUH*R;{`!A3vidL7pqh;n_A;t( z4XKBT1u3~CPGgJ&#N6I%$Q+hh34hjFZ24gkn!=^LuIhs34ng&h<uS&Fq9#-_8b!8j zMn3&D%v3xbKXB8(ot)P&OmmdE>F2p;t+IanrL)^9IHS6~`i$Rs+nuL5PO}`dPBYzV zzi+o;_{710T_}SBS&;|MD7z~3$U+#UMHI-xJ`Py|s{OAA=7X<B>BH+3HxY-vUj(85 z$d+X8qCEppQ4|i)cMR7;1iWvqyuN4y{1X(EO?vo0p_lfuw4dSL$wej_mYYyiP!&Mc zZkjE}JERB~H{(#jaVk(H{GZ7tnTyYkGtM_mj---`N-13m6IijNz1RbFTz1PKWTjNH z3TzdkzB@}!p;kNvnNc+st5uQJt7wrQWy#rfmbS%b7{}+4O8<bjLlo7k`a}&@8@Hu; zC=sXNoTw5mo8)OMHKy4qX{f8~n+#4fY7Ecux+u>P7wS%Nk(5YXX+<r9nOTX>6D-#p zJ+=i?9chl)u$}|SX|9s}zlW;hEVzUN+gj;3m20$*SocdayE&`SDGfW}e#rYO&}it| zJ_8IDkE%VaGG)NZXM$`qogFHyXB!OHf#>3FE_`!{_%P)P%;#1kQ%vWE<J^v23@UEb ziM|VEu^{?&%Li3KU7Zy6ldSa!;!_@}G0C8uKnVo(Jvkcc^U9ft7PTj~8(^A8>kXAI zt^Js>S0sa>yO@n*AINLHka<8hJ&gOwIu0y7Ks0FR;ww}x<aVsUq$HqDGi7O8C1EcW zMkzF_n)I28^p$PY1S9X2<0nuQcXd2$qGWK@e;>IVwO``6TGH7n8-mI<I9L0Grq!-M z7af>X`;R)9w);)mXSDdi!56j%eWS5zF5hHIS&^o(iaGf}&4gklER8VXkpyM$`&>8u z<VT7R5NuJ{*>5|Rn`-D%rGk95gBXWUV?kf0!D}e!9b#OGQR4#B$rvloRpgcS3ux^x z(`a~5q1kKo6^4!6wfo^!z99Hi?}8(9_aspHhG)}X(2N_I*vu?bPVgj>Qz|=82$-@C z1x*F?S5e_h9Z%ISk?u-CVsCL+_`3HMCbce4frK{0PMQ?b6M!wM_bgCn_cYok=#;s` z^eWy^bJXsEbdwwOptrgeUc{VORv8{_$+-5zoI2K>)EqhhZLA(~w45~_9+(~0MG<eU z5#Lt9uAlsNKGa@vuUW5US;vP|YSvao)>p$iOIK27#b-Se{BYt_FI@9okJ|d4r-{9T zWL{2UkO(u)Fn~OgH#O9Z+_Z%3os_<>uofGaIk35#b!1rwjpX>pxXr@P=S`*L%s@gr zS8tClNdsC-b*xOdg(XXLoKL$m3D_QVrVB~9_HTu`H-NvM?;yOcDz~$0syvRRwQkRT z{3i}WTqycpRhM~aVd3ozMq<v3+~^{5a5Fic=gteO4rzQ?q9N`M;0`_%O;E4YO;>bl z(Nu4mbsuMJ7cliqfD?D%X0ToJg(Ia<%@UcpmL)Bg%llfo-N@xZhW~6|_b8?=XgLga z7(=4hsOZ?L26Cqjd|8p&1N*D?c=+r;lKGx{L-!DOOCj7k&IM*-OZHX2apqRk`VY2+ z*r{T8VvPX99?Dl7A7Cx!tCZxUF75y<&S@^%f&YEU?=|oY-f*P##N1ye6<*oE*E7M_ zsmJfjv!nZo!PubuH2d{OTOs<p&>FqstQ_SV8s1h$NqLM^K=X#Zv0$UAY~_W_P|bqd z37`_CD=1BX`$$b$Y{HGJ7Pjo0ph!oED9D*l%FF+N`eYGd(ga_LZcmZj6}{c)^R3C4 z66qbx)0m(9Hv`rxVhZWyr&%ec_X}&|K(V=7Nyg>t23}qfckqb}_I27)g0eYnj<UD* zuocY@egml|Rn}2PMq|X6X1zC>mc}E2gBK#nuhNZ$o@26igC9;};-yazoJx3KL2-YN zbq8sYJr22R+Xq~ZD5})_oB297|E1Bp$A9-g<O`8*ANC9E_VE(AD|+@Gs;93KZ>Dw; zx!!t@T8#5j)V*+%yXNT3HCAxv4Ev2NN+CAX9=uXAHuRpxkzC9on%|%*_ds?=6!W~Z zDvWDR^krvAXDNzd<J5so%wgmU=cZr5F?$#pW0--&9!{sqpP}X+>^p9eb^IMt^L_ad zzb5bQ+rIYf5fj?VfbqpkxMK$jR;1~Uu?9a<yASqURbrFBc4eceTCM@@Mg20osVA0J z&tUrrP_|dZFPptj)rxUmYPN6FyC(?cC%Aj6Iw>8mFSq;|-Sm}^xHlU7u0HGvl1~<1 z#Jy0$l%i|Cd#ZaFTcSxwo9Xfx|0FUg{lGeS{pK}3UdLhKGU5DxUkL!OPFME)Pp%F9 z<EcgeKgl*x3u|W+$N#9dl(=chLH>UpA)7-ZE43d;i8#)5o)1K*fq`cN_q-8<9WF^U znaz=LC;xUj<PS+ixg!>Zy&v)QX1srS{_+P3U74*-*QFU0&@<xLeLIzD?6cF=c+>wq zQRZu?q1Ygwu2oo+T52I2<h1|n3!ob9XrgswM-_gJVjo{6M|p+H$Z|lpE{s1Cp>%mw zD)m^09;t+7B+`N_;dvWyozLW-Zia{D_#~6rt;rK((u^Ni*BiCpjF5GMF8n>FkoHV; zUBdEFnr@4QT6EFlew_)MRBdQ?llqVsFd#?;5Lfa*#!jSwNuW6-6P;uqNu@w(8HTTW z{NHp+ffAo4^S?a{U<d#JlK(%vSav~+|FznwT1~?qM-7$7u4ScZBbA2Rp~zi=`cDSt zINs<G^5_E<M-XTtY=coDJE294W}&KSM@mjATWb260uoY2T`&(|*l;ksnqmlPbQFpT ziq!oe{`($ySwSRKB>c}9{J~bveRTEE3Q)zu^=rqi=Z(*6&-=HZ?+@I-S}>c7H<TQN zhhkU+A?!PQBF4YR#-fN4ac%A_AL|H^W1<>DV@5gu!kG^#Q9x0i+wWOotkxsRLEj&_ zXavz&k~x#u3yzJ8W(`;nni+ciMDNipJi-vL^3ohJ75p>~+;ia0?p1}(TDhx^ie@d^ z>yCE2%MKQWp0af1A>8wH7UelY%`0?XbwcGIc5fv|-Lw@WwBqhQJgl_Mx~xCIcmC@l zSWCUM>k=BpX1*)@VKV-BQNp}T&SjAM!0a?etBN+`7)&*TL#>vcp;eSnyP&v!ZW~0g zyJ*C{+!MAKdx(XI5_HPVWQ!7$nN9V1HW@0FgKCFwGT|`UbYVP34v}u{;v%>~=WcYK zdzLhv=N(L|QL69m-hAmq88D%%t#i4rVR{qfc>_-@FD{!aI}itOW6vPk(|rHnO`L*c zug`8V`s_q)km6^Xt0THi9U=Fw3=I)9Yp|Q*Ht?;x;;*}M$T(8+jn9iGNY<<iSB82N zl{YM{jEW!E)X-a%uiH{I-5rBq@*QHzet=jMYEMtz1dy`X);2<gUa_ye8Y?f8OHi0+ zGC}Sx@JcilZMUBAN<G&?h1{g1c%miRdWR9ypgk}slg3${I_9-b9f?xqyKJZE5-MSu z(uDmaF4BsdP3wa~NlnYNe^4w{Mtl%MxzP*E)1{O~1KO9PJEONw)o1Q9--C7^@0(0t zu<!3fzmFV99bU-^fOE!rL+Y{CuZ@>kv)=QyW~syWg1O>P3$4X?qjJS`N9|<xp6*+{ zhYk5eOaBABJJc%t-U<t|S0^~ijhm15>(64n$K@^)tjBhz<1IHR;&2S>5JEy+V~4m9 zg9p4j3eWsC*B5seDrlO}F2BYc7yQJt*hxz+tE0HqPS97qFAXo(dZ`}krz3!{t^1{J z@cUaR^6*B@{rVX?(PMV<jn{hS+095cvTc}WpSRHc`cq3w$=&AeRxv`nAPG5%#A$Jy zC->&cuxJ+xuA@-v;)i#mGQI>$EmqxiE9s@j@QRxWIE;cczEi<J?+le8BxLkOO*805 z{!rM@oENd=EhdmEV5VrEw`25D$ETSg1y0>bFDYbYx9N1AFH9)Yu}b+_LR?ry)9&YI zxue^i7}$*G<*x=*V6XN7)}G0ySn!7<Zb54T3QfjimBYY8Wz5Tc2j4?atG8W)&YoZr zlPHRRyika*m9CEW1R^pilt3@HF~L}pR@Tb))HL3TktR)eX%yT{|G{VQ?BssI^RgBy zMtO8n+06t<B&mIm*51}4pT^g5n=GX*ENvczJq1BPd?a{F&4d?ZR@$YP)ZOyvaE{=c z-p$K>5N>?aIqYw!XXYdV9>H?ZY9?ag8*9x?Ssh^%c+h2C=(T&eWb#yYMFX`5O0K9U zR{kCHK(Fvo_1_WoI~%RM>9RYO=6W_GH5D<kIY{9}K9Q#foc(Mz2r;XHEMJv<oc3WE zo^96<tP;dZ@TRN;AfDvSS*x!>Hjv`gzy;u|p@8l+wPg*GIPsPevv5VHAPQAA1UWb9 z#hDQc<`tW!1-U)qAx;S$AM*jgDnUBUyZOGIZB!W+uWA(p6Vg;r-kH%zlV`aP%ezgl zV4@#v;T=<cQNPEAnM(DVy`w-CWVKD=>q_F<p4hbu@fx2Bp9?efdSXx5Kj2yg&J7-5 z_!r3Yv6bqm1F`BKSV%$VscXzP>HQZLTjS=MhHCQ#1aYb%^AZAn)|RL@6MAEo`_@A2 z*uB9l5nv9ah`V3LErj#&bF@URkdw2cDnva<jp$~-f5XjO9G#r3enuYe*M+~D*LxG% z8MeDv=hNrH$g}^br;)vO1mDQTveX{?`rxh+Zb^7XtGr4u?<r6Z8mY&O)&t5RuqN%n zA+~VC^%K$TQCoL~Gwkq0c15qfLHfPvjIh@nSbSlbd<9&(F$D1Kll;u!JN%BE69|}5 z`L7~9;YA%Alo(<DAQn*xSNa)bxG*MQ--(rUB#rNc>M_iBORo}kjVt>_o7ksne$L6o z&CbsV)L_v=#^HQZ_f8&tu&Z(Ms7J}!FN^=_a#D%1P3^#Xn_7Kb*?rd%Ue;1{bz{1H zrNG%@j)7elCwhQxlIUTBgYx~-;|qGht+!Y03^t*e4_-my^43-I7Ts-U|E#rYbEDrL zKWY_ThPkQ4pQ{$QGdrJXtlDz=^7z7$8+&xV18v$Tbxlk2SSodAq@~}Y<ouKb*x(;t z#xj4WGLMm7K@3DJ2*ttcR|s4gNpgwa7cILc^u;&M)8VFxJ75>sjClbdI9G@R_2v2b z-)4RwIw?4x{|O$*f3>Rr?#$2stx55J)K0eIwk)y$2G3y2w&tJV$X|-Q2$W>F`iO`? zGAMKLza##M_8dAR*Jn4<OkBm!)lU@>WW4_HCRyt>uq&3~Y>z%pjx+DRraixJ53qPE z4y_>g&^K)=L)S!TKGZ4kqk(ZI_-+tTT7poI(S4QGct}Sr%M9dY%pphBx?3k7uvTJd z<*X`w1wthuoo4zo&ccFq>&l!(Rg-~mr8cHR;1l4Xlfo1dNlEcN_G`TGUWkjeDo+f` zj%)`EX{Jf~l`Gz}vKTSxFy{gDf}u(<aVpZet;mHM`mV}zQo}Wef@+U$hI^b}gP{bq zABk3hDNLM5$wIaZ8d}sX#51d^rSGcLlZZ%{W4kxEh;NCnTIUa0Ln@bSflc8;)kV&E zo}7DhA)8wVyK0JV#}n*fiCiZTrq6cFe{L`qeFV=5VlN64E^2n%A3@@NKLsGLe&>1? zsx}b?8a|;hD_Lh0=O<cHq+ycC`WwDOc_AYGryXtey}0b`V6h{FRznGLZ5V?Zc%)c? zUa4I`(XCbS66m8MV}@w{Fs(KE?KaNqb^hvyXGlOt0<kJa6(iC#+OLcJAC$d=cjax? zG~Au;*tTtUjE<cX+qTV)ZFOwhwr$&H$NbJcGw=7zJ?mZTooB852dT4b|LUq;rKq5R zpUhyh@;%v(v`%a4<+gOQsK$se5HI6&7~93sDU5}U(u-3#weN@KR6hJ1-LGAh{pcVH zsZ$r3lkmM+Hu=SgtiP*LX;~{J^FUR~9}aj)_Fry$|5rr)yBbxYqG5|NgvwLlHE!;L zpg$vG$$+6}d8a)@5*7o2aVHQ;gQBc18jBxctWm~a$8|eij<CPOEfx~5i#!B~7&H2e zf%hSK{(?kh_sphLG79)mNc>bJ)e%2%b9asns3&L{R<?S)xb(2e>O69Oyu14NbGAhk zK-Z2v#6RADEd?`W?n)QMV7%*!XQGcG)!l80Lv~v#I>=Cd+JYgXs5Q-i?_aQEiL+LN z&?jzWX+bd<+beaqoQ3d~3n<k1;NVzppmsmUM<t9x!cn53nm||FDeVpK6Xl2^O`ogA z>2o`H@(Zdmdusi87ot@AmIsov*qHv)wR=R;_rgF~JSsW7ZZ?C(*y@2~2xqPus6&-F zH!z=1X=HZaFb>fgMhN$%C#R_OHK8%tuOyRB*-K#Bl*Dl4yvU3Rtgx;_4)N;PN(eU6 zjK=x&Hr#@)OkqOL;<JU#=Am;qxhrOuG+3RN*BBaF<|z&vdM#0*78ffpcIVcEA_3bY zxwj}%EH8>Cz-a1va8eRWcI%ABCQXhah1I#YT0?t&DcrWCe*C;xCuELy2}_}R`G{-` zB;`YH#xo&!RT2{{?4q%?4WEO6$dy<~m(Jd7+f&!wGLDbWVmey9mi}6CnstLso0!j~ zi=9b6qGg<yEZldWpO&JpE!7-F$ungKU*2<6Vp-fHl`-NJrbn7yv<)T1O<hHXm|s^} zO;O#ZZ<79p8FVBuQcR!m9I`J<C6hLFx<G=Kak%SNRHgMKAu0dNgnCn^Y4K41TmB5~ zV0+|s<Ahox{YELX@9&*gYtn(c_H^da#w_M@rZhqodv48CY@+t0A9czPW7T_Tus)_M z3E{kdbPhBYDccHh8s}T_HZ18Kse?IJr|GV*+pp*!jF`rR+uCX)tQ&F@Y00LyHxI<O zm%mvH!_uEVp><a5aB+5qhXc>$_FkLw_rP7nhv1cNh}-)EI(;lvKnSV@17}ldUu)Y; z-SAQnO*LWHN>=J-?-s&*%J;_DX=6G~;!K;%_l(+e_rj>W{ZyRZ6j7^kwEE6CH@nlY zHfL{GE15jgY>BHKU|ISy_o~OKNv<I7)-AkN)`zoMaF?!)4iH+Xy+NXF0)2CgvQ~<s zXt(BUrL)hFtppEeI<_|orrKGx#Pg}02f#V6%+o8=($Tmqn)Oz1=Xt%!@AlMuHy0z< zTnqpc&^dNq`1C(ClAu03ZA<KIu1uBzoRv<##V{V-cI)j*`m$shlmb(w*rEhYq~Eh_ z->tY|AMGA+0Q6(+N9$&#>9<D(Txi>!7Bru_=<`9S;}I2G?me^%)vK=whyjz1u8Tn$ z;A^f(!Oa$!i@9||+uZpY!NG}g^M@vWr^RemL-EMIJDaaMlHBS%Cn`2u85L#d0@J9v z9JW~%YzG>R2O6h%%XUZV!;uld$Ab|^z=Ez^LHF~g3W^H+18uPLo^nMZv+0h@CO<@d zX%*LE`&U)x>O?(SRnb)&fj2(^T+T9y?IB}y$&TD#)>Qttdrwje&1L2|5{vJi87DbE z{!)|3&3^|iradgM@B~aLOJ`*_Vuf#rxW14Pon1s%)kG^@^gZFYQ$09&$VHQA1#xlO z5U!$MqKIFpgal5bi{FXN#bOuxV8fn>$x8;?5N=`@2<Qv*YvjeqLb+Fo1X?Kto*u(R zSu5nhcGR3LJ7BLBadE~+#%}2jIa0LHa^cE|*0ROE6*IRmui8ON^V~PZ?wa#1pu^vj zRPLQ9?#d&lPLSm*+$X08lAY7xET-iprx_%>oHSLN^l-0Fmv5L|YEj@=OOaOE?><!q zQMX}Lt#|h=LE0BIT<HtsBbB^7e!kW@zJaN?Dz^9}-qby@j44dV7&($X+wleR3^N)T zW4xMRbePzoOz9<5g^P<ljL!`A3U@+j4-#$mL%X8Wc|*eE|53UIPq-1~h53judJ8o0 z83KJvtMWtWM7;ikrUSK~JsKUy8?8NnS<pA`+xqi#2=VY&kk1bE{tqcbp8-f125f~p z&JaTTP5&)}-*G`8m3jg45h0`O;^p`KMtk8;NW0Av^#<pX2z!X!fp&+(L;dz)^51SQ z2fi1GeAj_m(0s+dU|BR-6&4NLvE`Hssv^3b4$jF8$$g5=9CkWC3#W=}Tb-NP&qGb+ zLK)MmeOneS5xe`wtthw5kiLH%oL-dzp>CT!D#~R7wuCrDt$B~ivZG|)E|RfSau3$x z8hq9zqPz*c>sIR*e|`@d-OOxgMzH+NWO%<gjGPp855eouk0R*AF5#A9?-{~*&&)IM zro7KF232PuzI^Y_E+HK^eDM?h@3c8KJofzpxQOilFZqA`m$dnBf&Tvzo8*B{gg+6| z%QBV&ei9^H324Nas+(3Kgo3NbWYZSQCj^60-MHFC?|1WxJ`{{h`4x!~+yJYQLU@LR zl(2Gc?c2CEQ!+HRs<yU#dV9$5lD73m@E$$aA8XF_3IafqxXayLyJgqq)KgSoWUSsp zdNv}XNd*f^>Mdb&qog*&WyHi9Fu{qqkwR;o;93id<b#SP*iY<d(D?zkQ4FWh$;8A? zrTP<d@pL{0HI0ZP-W0?o6RdqQ70+tv5O`1<2UhVE8ymdT4mhH3PUJsAA;z_FV3=y} z)y~Op<FV9qObjugZe+&-^e)oFU=Au-R$w)Va>HpC7mrSqi^o{=^C|dn@EBax;WSo8 zX$EAlS^X?SghS=chx|!mY!Ww??pK88FJhSJvJIoD>t_;pnP?s(fc`B{l)(GY_tu5X z%Ou~=qftz(Pu+G&p{^o7$4`1DBdZJ(xEW^y>BR=|8i}c~Z~pMIhpS_9PO+t6!p1X^ zjLU2iXtITMLWr(H6&B4xYHqUuW5u$D&WtVHUpvf#bDM6SM*eyX!~rJXAyLOSYW5nd z$W0jXX!a2~%}sSjYC1DN9w=s1DU9fY@$elCr*O7%1fNdI>rCdfHV3Y8+^ZdeT>E5S z+ePfs_*|iEWkq$yJ8iuGN7|z+(`PCNP-LTr|MG?Fe~+KPFIyHiI4YRlQIAY#_x&|X z+G~<@(z6MbRT@~QFY>A3R}~g%<sG_Mr%^6LXQ3u8<Ks_ph50V)L4~jfsj}H62>iv0 zielmtiZ3}^vRy<ZB>5j-cnNR5DuHA&w{_YeCF_rvY;qiRWE^o{c^H4*UGcpk^49MH zFPfwRuMHtm{Z1I(enSyQN<ny`PBS8lpw-zALg@YE1q3q`>(YH!;HQg_*gq&o?UjXy z7JGFA-Ga)4Q|K|M@z08SY-If&{ZU2`pw}1cPmPMUUyZ^20@=>@+=w#BG#PM%GD+pi z8DKN^<p_m4Z(GfGTTo=v79Z_;09yg%1CKfn`W%n-_GMVWTD@tg!7QFRR*$+Og>r&* z-@|V9Y7#4|+rKX<L)!F@y1Oz!%A%4nc{*8(=L$oacZbFpnS5V!cHx{?Vd})~F~G{O z)}3w7(8)z;>;%s0J~Unsq~T_8XKpn&iJ`%hHP+FJIIAF6LYV$r39W3;QcnAx`7_HF z+>EgX*qnAmzk2cYou8g@T-_=+ZQ-s9!*R_m-Q)B{2`#QTIg>J-+<2!)o0ap7v}>g( zgih1<*<|Nr(8~=yjITZAxukiJ30!5Bpm6Jy>;NO*8dPrjY?OE8t{hM8CJ(6zJI72_ z{kCMc31>$xMt;_a6=ii7oH5>ZLOxOZ?EaC2f)>CGeIPT6B@|fjF9SnEk{)K-u}SE2 zN(>80Yoam-k8hmFv*U~t83oB-yd*?IwLc_-?@*;4?jxcz_gTTB;U58!Gw}?~iS>y( z^HywX5VlO(FA<Feob`QmriSTS%t0roWsay2W|bD`#YM(<m{vWG3aKsKDp?f{8(CQ= z28-ZqLbQs2E~6usCL4~5skU;kk-q!}-J*MML2DPl$*5_(wIWN7+IFSdQpS}8Ns@!H z2H`VnOLPO1f$ic~M4xRRDgjXXVpl|Z%BQF>)b{diRMevzE!3)Azpy1+Uz$!HTZ=a2 z;v{y=Iq1sGBxao8YG}m@113%{bwHcFK~-5Z#XI0v15z6)Gm0l*0Q;#k41ahh_$f9F ze{6@`RM}R1!01h}CymNGC=0oiE1O=nj*xF6eWx}v_T)_<`&~Irsu0ZmzTU{9Qri?i z?Hak+hP?TawrxMzQnfN~o7Q)6O7R!S<2qG`^oybO>SD@Cs@A20Q!A3!J)Bo=VF0$T z#KYNM*>p4sDCh1PwBxJPNLjY|84g!q$x+>9xl3q`J3Qh8{}^kgzH;h{ftvH+Fmi&O zg<lEzffjMhsvKCB-Dl*vKR5=@z=vVJ4JOy0=gKTAHD2EKhQW3&ia{xn4YduthwYUF zfrHiogH&*>ReiSmArI^oKQ9`s-qbp@6!tcU_AVVxnAA6#7~})9Ir}@tDcjErdJ<NE zs7v^xwKOm)=(@0-8-A<sj!d(UMN`oE<#b^%3k!pYTP?#eI*DCa+?V;2K43}XF-mVs zyR?Aa-~X*LTrfL!%Z#6Q<$|N}nzpBCn|az1cb5ms=&h87!dD(!v?2TF!s`>t6VfF; zRufvJS8VN;6(dh=&wP`ydwxKPO_`aB_#FM7Z|=$ae3C^@+BHC1RJZK?2KFH*w*&ve zwOUu_0X-ovlP)<`!<u0Ezy=ZVz$?J>7)sIcyMeC-MOVP6DnV}l8ymtUgnW*^H2+Gr zEFtPVTp(0i7}Vye(Ro|w=*VHx@MSl6aq6A0Gb#Cd&CgrTQoj5RIy3YWh?&a62j?GY z=jKq(2eh%Px_@AW*814wL?KSwsLW>&V5?L!V%0r!>K2!@T~MiKS`&kYamZ^k%)PD! zyq*KW?!g`=3%IDy5*L=d99AYvO*f1bhp4cq=vfuD+JoLzS~?n<+K!9Rz-QAu16g08 zDqdH0pY$_A7KQs%KI(AFnu7!@?Atvu3~ja<hU6&3i2Uq?+=Q<L!=${@r8owNU&-(W zkui4R6YM^Ia|B}2=%Y>b?4t{2KGp}i>}-3{>=38-46%pv?U}uy9$iCb_H5nI@D4Z- zjbF`e0IgSjl0;FcGrq|KU$hY^)6uaeLpj>14sTLb`_J&4DjBh7^Tco|ow5~XL*>z1 zQ#umxdR4>#!m8sp-yzWuG4HaI1Ca`rc<<t)E_N}%C@9CDvoP{e^c(SQMc+wwM4x!@ zdh*^5?ijuO^|*te4n6UR`-O}SO&CQ=;-1r<s0yeqFQH`Q!)&8%kQ(IXcWs)59PtjS z=&z8AR7pOwRRX8T(}Wy+^*?@Z<*DjkadkfYGMwFc=vKlxhLV_UU>)#_rAJd;q7gqL zKe>Eoz=G(E>;Mh48e7ox4!$|9$-+I%+$~{cWV%Khq8|TaW&9**{uaimQgUyRd#{mu zM>qAr1AoyYkokla8%XYzan>78)>6d;0G=r4O(g`^0DVo@u$5r8Y!5N?MIp|ZUJ}+k zJ!k|z(NH*~mqUIBpa0QgA*h=xQ3KrON`b8WUt|ORTd~f+lX0TrmJ6~l%15EN%bX$Q z^lhIKVvI79M4cG5n4d22C=yHG%oP8+*rYavj5uv0ePSBl$JfWd^J$p+<<}xOd}lXD z`d(N5<_b+teaU?CN*gdN@Y3ZfgNy#-;~k!aA=Dg8G#1b!z9RvKzgwzZC?!>NgIHN$ zhl_796-kI9JKvc`#yis8ON-nj?P;zb)YDAqRbtIZQrq$)$dIxaIw;TRBz&|_Svug+ zb%J<GjKj92X;84_)4)Xjhf(m3IR^wboQ*>hWjdD1tuJw7!ZjDub;hJfA0?<Zf-+ly zeOg^kIh#<d082pWb<#0{ba^EWWBTyn=++JFrR%y4yArBI7yr-jUvjpQ#>2qAa|s%U z6Y8L=x>tjxTm%_5dCF_lP)d>N3Cg7sa9Wd1WZIq2<UbAHu(3zgVBFd$H)H}&6*NNv zZ>0}}1jLMcl{8?`;VFY>%`NnC5_SxAXkq#grRF`lrOu0mB3o@C8eoinekp0hTn1@a zzwhO!k>T^6U(&KO@FbdF6H(#lYhfc1j&S_piqWdie`;Z8uG96WRTC}BAYjK*p~Shz zu2EgP)5BOBf2)nHb)f2r%$PQT0eFC#?^O>-l%i38f{`TSZMp^>MZ46U6dLGFR&BHe z=7|^iGli@!p_=XBwvX8!d}<p9t@9U6&2v)iSC&@NcJ_CkJgHrzZOJ<-aE85x9iA<3 zqA}v+<fz8zi6*AbmbsV|0f?F1hlksnHqd55R4@nOodnw)npP2aq=;Kx_Ur<@$MGTr zqHw?GVwF>!h?9aIu&nPYc55A>*9E5!dNDdYp0H<7j8u-MicW!XxPQaC57(<cw0r!D zTKDz>CyqySJNBS?MZdSbzK7WD1~cct{d4M!@ryWv*P0n_0bg)uM5lkUH|T3h#Mkuf zg^+Z&^!$ZW5L>9Cld)^G^WWT<@yNvAq90|8T;z~>PS?DOLp$d6b*Nx}CXZSpSciD7 zmFsG5^2g=q^7htSUFyc*ePro!_hPPjLgmHODj)-NKZ54r#nwtdE^wBBM>aJRN1ty- z*i(8Res_D2Yp#9~#@vE~GVhRQLzh7r?oi>*<QMxVJ-9fG*Amy3iZe_j?SenF3(qg( z#!)qYCQ`M9QI_vuO}tnsG6cV>_NoNDr8;-=!*1#0a!WYlnq|nQmp4vscNBkFV-I&g zk=8gGkq}yZMIppgGr%ZXB&qg=H(mM(#!E*89gmPV97``eGiVEmY{;k?RS)=p{`+U$ z#mSf7&%n>RC*UAp`+u+H|272vm6QE%A9jCvKUc{d0|hW6qI+0lRM}K{iu=E<#bjg8 z=9dbfklh>`7yck|PHeV#R=EZ?w0VEwgVHM^l(HHa3ctFa;5gd!*uCQG^z`?)TBq$D z2;;GKYrfE17*I!aD{oeHu?x<wCeNP+K&GD_GV)jE$guObP?Ffd_QFML*U9KoB^KVQ z*^U$GU70Z!c@U8mvnkCNluy0k72y^RfRBo%j;T_J@6FL!75@~z$eH%OV%R23c2Cx= zS_O*gn6SUkXB(pe&MzmSGKyn(&-yv_J9%Y42ng52q2EKgkcqigB4GHnVM(JQSU-S{ z&-nw+m6`#8x>b26hfM30Y#IXAu(ydaVi1*EJ!-}YdCMlf4M6I0X%5O7u=wjOusVu% zN?oqbN`gH&mxm6C=B11Adl^r~D}Vwwkl(6Sbb@unlFapK>k|3=)AtV(<Ko9o;|IpF z>(iOW;MTL`)KR0cDJ-eMM1E9_wRQ$H2t0$@<fVmm_@Ode?DFX%#(teRnk<vaj1aI5 z*m}EtL;@LsF58l*M!Nt+^st1BtX1O?Kca?#mS3)0hNy<sw*ZN?EkJ_kY?mnsCUqOC zvaojTL{nzqIYAsPZg!6unPWw0%%Ql&?DPZ29B#>$r+`<Y@JoBua2IYK!vr6D-(&3} z8`AuLYU_4KW&MA>)*J)T#Qgt8(_cw{|I@4We~|Rge$q>_71Hk@W-aKeenN9VQ@RBA zG#VtZK@vqc<R>X!MnxJ1>!#^a%eBfi3M2{duV{e?Hc7?Vkg;$RZr-Eun`K~b|1%gk zD)(^TK&{rLd-IXrz<@cP8cmz3gIyM3Q&~OJ6lVJEAfuo$A9pOwK<jMn%vGb|ok%@M zX~Jm^y`KRhWg8$Ib54%&TUD@JT6pF)S6owo9DXwn=3l{)c<`%l3=qLTey~Frs+iaH zRclmsp?~Z7mb2DwMpUrIbtEj)OXo8aCQah00R8SQ&`9UdA(mMh>*OR8M2HR75P`Ay zDHoeFokZ56Bj|XdE_o2?)+#KZ_EReC_Tr2fOl3@u81r|*vUQ&opP7D{&<I<f_x_lm zQBlLwD@JLf@K^MhrZH4`u8ef%a>s}ho;}Zb*iz(AC2C$=TET-ZvdQX4@V7F<-w(oR zhX%TPJyms-K4<jr+N)SI4}!SZInoh7UX18~@#?h^9po2uv({-ubqf=W%O*grAo~XZ z(N%2PNi(;c;p+}l7)nZp9F?t*&RWi~HLpAOU~l<%Q8<mz{?qSC63gdQ5~1bc!Ze7f zJ6M%PwTbh|3iiCxqz>XICzzs>^D~hg^W!v5HgG@u)0z|Ivq<Q^Tv69v4GvG-T9`a- z*56-zcRKoyHc9g(l|p3XFJJ12|Ernw7m9$H#iEvOwx&{gZZ=N;GT$_)dw9+-Bz|VT zdW;(y-)4@`^C1!V_Dcx}Ah1OEgZ2?4K)^%#A)*?`i8CP>?~VrqFP63~K7KPR2$Yyv zO+9Tyvw+_9FMw}YZCJIgsI<E1vtGMcZEe)jSflcov>`)aF?}+Khd;{n@OjL1xNJG{ zylQ#AK5vW0^9>>kbKf39ME_U_%%k({8}r|~+tqk#j3L)@9rZ7|!9~x!@AkhsyxI5p zv&-Q*6?nu$(G4xoNxu(H_tpkZ`ji7rA2yC3TAZxuy7CSBb0@HuTKf%y4-t_s@v^M; z)I`9WPQiyT+?#S^N$8*|;H@Y|$0K`>O~9Lazl&QnXbbXjOF$d_)`QRo;WjAd6Y;h% zh7amFK86qaS%=UD@;RL1rOehQyuHh9dvMDr{1ahr^JW{f2Kd)atl_@o@5VkDKoAf> zL70l56++lQ?jNivuuc<ltGQ43`)CmPW?WMMP;H=KXpzr>yq0NZJz*$+b1X}?SeMNg z7v^Z9U*i0MK0>14u-IfmF4Aa}`l>%dJ5d&QBV>Ho%RwIG5g#h$fE~Y3BLtvn_{EXL zS>#R2uM=|~iU`HE8@e2pLp!5tE=|JOO-zbAayi_+Dn>>3zMh?V5?usY#~D}Bc{r?_ z-^RCy6KS}cmZqjn6B|X2JaJOtHDUE_#45be1P%Ti<NPY*Tnx_W5TRboC0&+n(h5;? zgS(lVNlf-^ZH0McbJLMVuv(@@XK_01luXg*co1@6wo+0U*k96??L$$MQcctBo!)3v z1Z%YWZ36ek@zBd_sHR=Rd7;?|$#X+rbWy9l_P9eH(yilsX`#mYx%?h@$zt{X8l7un zVZ9f=RB0!pOIu~jf@1jNTCR!QJ-)r&_5C%`)Jxyx4~8Fr*Ff}+;?Kn8*Av9IJj1A$ zOrQ0q^ZK{T97QTJ(YYZaH){Ms1}-@o6EpK67?1|Wx(rMMjdt?6Db~B8U9Wc>V$yHz zBcw9GI^JJ_RtLug;q1f!Pu*y8RsUv#=jkslN>gwGCyT07$VbyQxFL_E%7^-s+aXcI zVGlxnd!__&GDFLf$U|@gSSF3<ZVaevoO~&2c;fd1ZqXtxtn*^KDNaR1Wy?D?J<Zd! zH+JlV)RafxX)}+ViS&Ne8R?SP-Zk&(EU*!*uo}Cv&$!w<mv&YJ1kHsOw)an?nFKgd zF=~fDTB5@bxkuY9ry&8N?{2|l0x~r;>ll(Q(H7cWUrq+os8hp)S?P@d?npIOe?&P8 zj}geK*fJ%!ipCr~;wHZzf)RVRBRWTV5bQ+M(25w3Wz*P=txi52v=iwpKaX4x=j>iY z!`wOd6Y<;#;kUUG%=TT{*X*97anBf%#jn>E7ez0%#((2EtNohNWk!(^`e@H>lupnT z4CX<Uvb<WOUrzkwJL8CTGDG&ou+TpAU<GM~PT9UPR7D<G)g-CM)v*#Y(z6BHbA$gu ziO}ptL%<S`^KE4geQ(vF=cL;`t)G@F^(qx-iOSn)Qm>*9Yfa_W-rB`b!@-06Rk||w zqJk$aJt8cB@j!t3$We4UR|x(nMd%<qAPq~m@uSa^9V8M*J9Bbhwv=lT4c%z*mA?L@ zRtcZ8I-TFUJ<0%rcSSH@a1PP~-)-b5*ApLAHYYl)_&3{+%Vt}-lIS-STRF^}-EaDl zO~Oghqb0q<iM**|@w}Q7kh-@shNZW14XW&crB4DF9Y_6#s?q0~j#8xaQP5eQih>Qi zoc^a6c`_H4zBf-4F5ywx(WfOn!gHSUV$!^+GN`=fg_yjY3gzjPhG-cFd36JuXeX0} zK#~=h)azyH<xM5lnKJV8xN*bx3OIZ*#mhL#Q&wY)K72Lxl~NOf<y9xq#FoCF(U)rx zDy)ZAqcTj9IzgySSAMz{Ucbsqywyu&fA>_MsOFhuzn3c-Rue>jGOY+vCEphy)DoaW z5?mZx3Xi>>Ar+u2fDK><wEfyEk2uPWkwq)Ve~qJe`=mHB@FD5&J8+-_J9~y(M3x!i zBQhk2JGRiq+~_x99TLWdj0Z$XQ)0P}{<I|F<=A-D2R>aI=RiaHGVY~(C0ai0&grT! zIB10pPpVR%YtU0VJ6#+o(@>$clM67yr5{_S-z!@*kMh~$S&FiNT!ORwL!lHtsJ0zF z`y;5UR)2{ET=Y`)0W8nlj(g)UK_l+9rK~E3eA1<|M9yJ_8I;=_N#qCE(3eq#rLXGw z!8xo5o?UkK%LP3(bfApx1EIIRux9waBt!TH%~Q6Q4kni%tg9T8d*CB&lF{cxnNeKP zsKm?OvB#q(TDW=UNGn&TGe)6{<V!XL%e;j?fA-AOI>=f$v8|EZFWypP))Y-XdM)P$ zAbX`Rq12f-m)4$eFSx1P<K!n@cTbckqil-MVu?sJ4(_~czs@+%fP3?1jLBWez}Z)D z8<hWi21Y`X_-dXfN6A@xPS4IQ_RE}x<TLNyYQl&KCzn07-_-XRceNr<Qp>8M1IF!< za>t0*G#mmIyc<2*W2lB74(w9OFhpm?{QS?hi7x4RT3+I()l$lW&Jpjh_i)dS+{hC{ zG;k8N;q2TJO#)G)k2MmdhK$6*PIWzAUmD#@%7oCDeqPAOdAy3yr+ZRO3}w+~o)Zcq z$&-%qvKIv{C(H;EcTRw|(;scewk8v^XqcJ^)}427VNtq=_J#CooIIWf?GU(@c3Fy1 zEf=*DKi#;ec88hM_~YN^`R5lJwEB5q>s`}toBdu~HarXd32z6`D~PazW+8;1s|jnV zt7W$1RpyH0KJLd#B3=hoJsW?}#ia{4wAE@3X*kg1p_?@SBkd18@ykuPFP1!88DgQg zmBoGew=)J9p(U%a272JeX3Uf`Zjku$H%WH%9g20mrVHMX_6)+T&A2OQR9C^kP1zZP zYe%<^;B8oR4?$9O$&>1uDneOK=JTcvzz*Tsr_vJ~u};l*TAb={0KF{S;ZrK?K_zE3 z8BhM@S_#WD0;sDunswz7hIJWwMQc>G1G%v#4}2=4d{g?jN!ent)&asytkIP=bT`XS z2IDBBd+{W+nwne<G~BjXXFga5)z3ZyiWANN`Np~Nilts7Ch75ppn+fO&3u~H;ODpg z+Z_p%<?--Q<ym}SWn*wS0&dOil(Oc@E~^K@ddTXQYd#prAxE_UDtlf^2tYMC`>02M z2vtRaK8CQfTebjKgaqu8vTQby?v}%Oq@EWqmuas!T%2~XUx!?*lWb>SP*{-N<Otr3 zBws(Vnw;=#wP-;KMrnevylJl1V51b8#XGoM1GsR~p8`&-QXJz%WQUAUBIi+=GA68B z2refR3cxB>*=#CCM}v*Yu!n%%;#9n4h89c79Cqp(#vR?7O)|cKRr4sTYjbIQ?*dAu zz6x$XriWcpy_3g`Df*gq*)ihx3vuT}%br_RH)XkmM?E*EwkLv92a{fCtX_rtq*T2I z9gC6$^+{X9^B$gAnY#A#kqzhjxu;`0o5bp-^OD;ZM$I4PU|VO6H<wq<2H$>oY&*4c z!EA)KjpXgOU7X?o|Iw#Wp?%k5vU7M(wFd5s=O?sIUs*etWZS^qlyj=s6irdVPAkKs zq@d<62ar-$+LMWkUnrF|E*uM2lpavzcAM>kVwl6rZXf5Qot@ZC0gx(dJ=Y0(t-a6O zQf6i*P${Uepx>T7cV{`qsFqPm@q@;wAQm+4m8;qK5Y4N}G+^aS_*qyc%!ez?_kX4j z`kMX-N-Y;Lv3=CKW`~JJQIp20K7ZE$?6|%S+y)hX`mk@MP7Za#Ti+Z==b?Cyo1+w| z->2o~jKEl}P#ACl5KVoVMTD_@iqB!)XsQgPS@wB2eD@vho{lzSR4ht%m{X`qi|k{# z5Ic`DV9RZ4yRlrRtV<?#e_k{+07Hy_R``D-sxyV3MDvNvcC;-&pY&U&u+h|z@Uz&x z?6R6xf9pHmdHXYkqKXF5dkS{K@#|<?am6&f)^aRmo}_qfws(8b!D`JJtjKoI-UZ}w zrG4cq*pMhf>muN*PhYG@l-J?Yec_L7wZp1_&}c$@m79ClA5=F}#XUoE!DrLI&Ynlx zz8>v}(DcxH`fiRUFI#!OZ%i(2(ph#}3*AuO{b@wTVKZ9~^y%f*20q~SdwYVoFn551 z-?(x6zg~j`-9X`WS6$OT!FC30?R?qn6?8?1SHOddg^!jce29-6D!~#h`MQ;j<{5vu zqrrl|Rfy^ux5$j&H^&lkHLc7osItS+ino=w;hM?okA7VDM7R--e&YQWf_L};*)Ak{ z1Jx0bHBEn`;Evms-E=MKj$Jjwca428XrqMaT|{;5@dMPR*uA~Pcstsh^&>xNd+HRV zy?}MwssYkRf$~jD%im=_lD*IwaUM_plx}wZJ-_UmVX6PVGC<DPJu_?`Td{DHNU}rv z;1u7m%z%YoL9qnXG?&%4v>vN;@zgYo)xXfZu2?2bl;4VS!J@2$KU_8st>{EOXmY-? zAZ7KQMRHBt#4Ia&WmU^Dsxhl~^~f~pL6}p8>nHvUUSZ2Be=1N{QNEy<Sjx-?U9GE^ z_3%YAqgP0KFi<b=kdSOxG7WrCY5hsAUY1rbLthAe|HbKqRV!a*hSZ(bYT7?xda970 zM=JRwoU(#GFQPN3@f2~j(54XAJ&bOtX%_Y6$DQ0e*vsz^$d~5M=*qdP!n6C=6R>wl z$8hgo)=T(B8835=!5`cgvpNNU)2_mem$dpJf>n#-`YDRS_d%hTb~%6!1J(&Iv5*c+ z>+#s2i2L-i5O~DcF`)sM*Ftj`9;<bJ6?W4!;hv0p{}W3hw#!`JAOnvzw-^8eeg<(5 zq6si7x5x2Pcmv`!<{H>(^_H5+^6_&D!)CT_FzcjkkkNDWZU)*I(rc^!1l;(?`*e98 z`h@XIEJw076Z-U+F?NSOT~XHWj5`Gfp7-&HS^9B)Z3m7HvV$xM-O2>(=I_Z8_e1Mo zboe7XMB|jdjf0qT)5f|y9iZJ2_HL(a9&*vWG&z-1lkF?}IkwEl8<zXip`DD$Sq;8e zC(dpx_qrt%v7QKvF&)V*nc5h{aL{9oD>X-O;3uU_h}l&h7zD0_z(k{Nd)DCzj-%>F zx`8z^sRY0pgEsEiqY#@X?LpyD^N+)9=cV5ih+(*}50qswJM$fVihO4`xza@m$%_yL z!-TH%9cWn_U`C=S0(%!81j`hqePM1+YGFz(!Z#`p>Dyf&H|cNAJc2!KVm4kMURQcq zXbx>y@qDmbAHOA=_WIo|W=~3WOv-aCRw>I|e}t)qRIFInaK+F`!XS4s+sH6#*-zq> zyf~3W+I-rgqcMhdDUj%{dZz2R5@_xuYcWKgl9szUduvPXps=u(Ix?If63JQkz`$D| zS4P=@on?FpGZ~YNSyd^Nf%hv-&H~*J=Vs#x<_zK#+6*>N733c09vX8D$#i=;Ya%46 zn`QDB*@HAlWcoJ+j145yS@`RcjlOlqJ$@096^#nDVG}Cvhcs3`a6|mBb#NC^Lu2DD zzfWBIn34^sc!&OsazK%BYS&FrWEGv;gYe;88tsqsD!8-9Ia<HZ?TeJ0SXo>%xyW1; z`a@*7R-+8}`P)rMUu7pmaYQEtopX|-ZQJT>yAlVtMPDeNgVGZ__$?idWKq>&HNc2k zVoGvNCsefD2U%WNvY37q+!70B6g?V(3e?&}=u)@^=FGYTaj$y@P=CqNbbr=9GRtka zzECM|U`O939EW{9uo8es0F$^JB<zgake4`ax%I!QUMkqr%>A=3!X5HQT_WEMwk<ye z-(Irr*BP8OS`bveT7Mu2n-#6_EX@a2Qoxg4PZhDw!MEBg@!=0sj?PuL)vtBIE$LMC zxA_61_#)FgfoUk)kCC_(kO`;Qj}8S|rl@!JGjh{u+oCC3&R(z=jUx+opD<%{7SF80 z6>rB&ZsX7OB(LII?0vTn>H~5gwE<iDx0kA;fKd6}3GByqkMRc$Jd@ai1I)%VO7EW; zN#_*MeBuwGrcZdrjAhJ?7!>kkM{(iIgA;DC!JG#Jjt6}!rC$h@LO493CzS?Fl}J^K zC2CaFR7))#OCgVU*X;6ABX~Or=@k@W<$g4)FYLIZ_FH)xY?ffzCZ`5@C=uhyO1p|l z4;grd<H?!qVw<CRS5Ed?l!8|Msdx$E47QnP*eX7Xlbj&#QWu*rM{Fn?=x;qnYDjRO zXId@iG?k?-N?U+>@lzMpkvrm=c{67v%h2@g<LREVvS%M5Ik1hh!!qe%P{Fc``XpMt zB8c@BcLZ0#(=mprEL^)LI0}IN;mF+Cdvhg%yV3naTmbLQ5!NG)@poC<*o_jnzhFHq zJQoIcFw+y3!}D*+<ef7(uqJuG8F>a*LM!L$LWuB^tUq);80`sVNrIOAkc;x@cy<iU z@pOZFjXzH-0lRYCgBa!4%?{oGUGOGkSM=LYnZ`O{fI?`!CN7U?1nejH-?e`@9R`LC zpjx{LRBL(uJGB<5v;9@>^G}&gM9;v{#@_9px^0Jomc?JK&}{e{SlAjG4ayZ*p4AN% z{`dq)h$L8$<;s?jV)%y6%qvoD8<6qht8WmW;k>9QfA#p>Tv}(#mZ0H#E_+<1w>*xg zc({1Ky}jTHTV^ZsV=i%PR%QRf#!KQ^zq1WzxR)Yd<snB=QC<s>?{h@aTU-it=URtP z*hu0ZA8xl1z-%g5IB^F_(geUm0K5!{316AcDG|kr9s@WXsW46BLwYEXCYEv9IUUy` zUhFM{Dk%j`&YNX^Ls!Jf;MySaRy?)YlLQ(_wcAdf>K-c=&BP~-C0N~%x3qW8jUpfT zBF8el?q<w{dOX#7!?;NA3dK)&BswNo+4h&;FKnTT5+`T<mRLC*BT4Q<3TK)RXfr_( zz7_!68s^QZp4){>vv$dT(he^wK0t0|C7J)AN|Rk-62vYolv(TYRM)vG5@Nn)kao3g zTxpLQde@eTL)#?dejduXm8$dTXA12%t}YYkd|l0Y_43R9ga7f1)turcZ~N=lHwp?X z^fiZer1Ma(=S{?8$wn<bu0&rK+sq58%<j(7Oxv$@@w?IKD#kkRLA}8Z_mKs&h+$cP z817LqyrWR$IF{7D0n4s1HyT@EEUjK6?>;j}(D3pU+aCrRFaPmyTwRXQX9UDeBQQgR z<$r}685={Rf64rD(tzHd2tiw*`La+H1m5^8x=*sDCNSv4p^$`RNSDyox~Lj+bi;hN z=RKy}u0L)>F^d8*<}n=M>$vK!UJVO3njVkPzt==d<3fv_4eN496qN^|!j{485SxiB z89<<gSp`kkcoAa6!J360Ubhmbqg}xi$C)o{@tQh_x<A)r$a|eI;jma1ncQM;UO?CN zCAKpSs6vh<HX60&WvbyXH<24G<eJAnDFp>kzuiShN<sz`>O4W7L?&<$m%76a&X-%5 zbcXWtH3iG4%oi-#A8ODiO7iZ4^-i;tW2z1X`I4YvQhla{>YXhqlRXCefO}7(pFujA zw}feE5$!__Jpa+hCVc7Hg!<*?FBc)J{Kui2g2yj06T$W8^`?q2CE0P}7mnLQ#6CJl z0LP4i_4FhH`9i<~k;<<Jsb|z1$}_lF`DbWmVU}#M8lg#^{1aUF_49tN19$S5T_I!D z+m4d|aB!}_pjKuA&uB)W{x`DvUq5$QJu_fy*S`*iE0i}BfSsnF8!?7;Bcq}ex|S9V zve*K%RuvNBzrrYUC>ayrb7;*s0!Y;$(wf_PZu5Ch4ZLP=CcuZ-OihYai}L1b;6LO} zThb6f#7UjTr7kx;CR>hNc&|EqKJLem>k0j8(Y-JbXZ(xN86$2FFz^Sxn!{X#Q>CA- z@peHfp9%EkfA&J-i+KL-b^0nU)4n6jRrnmUyZ_iBW)M`?Myb0f*(&;doH3-Z@Cd3@ zX&!U3Fib>7Swe!fY7}!|cJW}nkd(gou{<rTP@@#lz&6^v)i{#59uyoMGyP^aY;-zy z*71kd=5X<#UmPXEKo*s8VsEa#sizhxXGOa)lcx1|A{ZsMhFrR|G!70q3U5}oDb9%V zu@Yr@Hd^7SxKiJ3UFySI>2xNQMaU=R>t~PIeKDGbLQASzVM({%S{Pb|#`#27ZN>ze z6UkYfnlKT|Y9f`!dcX8psqkOvt+*k~LtkXq6Uql|JB3NWqLrAt>JXL35650!gt*1e zx9!IyGDM=N4Gl*^ISZVS;wsn+EK$eM#5rmF`HMy3n#HwLB3=0zr4yTL4z;mMJ9Dv0 z38yqf>@uJ#=-9p~X?-U}d647ITM=kzZ~rq;8>@tjRh8B`=-1p`k#r3uBjJkq_3Iy` zml}edZ!{9By|iDONY{I61K{mcy2+7H3^7*WgJlKKs9`q1=OO!K8`&j)QR$&_1jT-y zX9RGwKw79K%XSBS$HfK-Ly~w>^!s}IJPZ9OP{%Wb*>C%z109dWx}0CiRd#{QS6sWI zTP8j0&f#nrj!mkM=Xi?#sZi8tE{MDZz&p2$F|n;M4>DUB(oKIMj7?Q*<znMVOc$Sm zCTLX^%yVoo?*ADndVHk5DlnXo!&y9nR;LiG<kXRU%;82>S7_Yw2d^S%+M}4^wD!;@ z|JETU=0p*aRcWoTT(;@{JGPs@3x)B%<Uzk41mBfs6VILzgO2=N7z^d)?D%&8gc3l$ zscb<8mJ;<gETz%Pyk@QtN~7Sd6H^PvdPG*Dfll|g^>a3lx}xaP8`yoyJ)5FSbxOpW zAIHF%W6$H)?3e8#;)!&YqQ1C6h5ERYvEwr+9+0)1&~HU%j%)pYToXk~h<-7<Ms^aF zaBFOMjvmI0g4<fI5rBJa<=5bULluAc*5e-f;%JI)bu!G{OthABO_wfbVoHHyd)b=^ zchxgdjpF@94;~NP+aJRTRCDUu$q-&UsQ8u9vk9L+4C?D6p0+;84Bq`Y^1v?ygvaTf zZuy@uuFf-RYHuMs?sk(WFK8V@R(l?AFkA2MqTS*|m02@9C@TY@!_Kr~m|+yxaDm3Z zd+h`9v>BfmC2DYs5VQt_rM9iyGb0J3zE|qO#j6&kNK7$&Tapt&(%A*;>}9zm4!k-s zdO)7R*GKD`y}#!|yZBzNETAI&B`c#3+c_pnKFrTB5*ok|g203IzTAV*i*gzM6qFf5 zxEs0SpqVYz2I&!hOgJ4LU70KC3XNAQMo2BV?;Gs7QWfq!JL=OpbezL}&l_NHBo@?1 z!ej})2Sqox1gLYSV$FPx9=?bs{P+*kaSYcZ-6N2x_JAACf5}vT_00X<+7PE@gT#*# zv~>c~MifTmt+HmWZ`J@)GYG9AU5{S~DNLN$Kc>eOIAfG_4i}hJphA-R1gvcyWF8A* zNf7EtVRpFfoO&L9dwG8+$Fbbj!=ppHu$$`hf|sOA`ZKIQGY}RI4$}hc8FU-iR$Nqv zNy)fYWkNZV7#qx9N}7o^1y7({5Y+iji%9t@6OTEk#3)#SCxT1&(t9Pb39NV8u{X?* zQYv=yT-|x)XRq(?`1z2}ssXc>_+ny5<x1cf%qE@hXmZAVz<z$Sbg?Yd%hr~|CpO+V zp~)9VZf>~78LT%PBuGmfwBSR+gu*#X@{Ls}`jARx@z5?jzt-<}$n9S6w|_iGul#OU zHt&<>qtvf61U^Ue?~i#IEh%NL2revAY=hiBH1}?2<bwniR5HG!r$@W<J2CMu>=vyV z6@P5aVrEWk1SPU+*lgkA#lCxCPz!!Zbulk{FPOwmTf<JtkR1{+MK%cJ{SA!;o~<zm zCsq}Hx0*j}>Ffpb5J?A3F`ZHb!A*2RMK@EyfcTFmX)PHj_H3OCS;r-OK1>5Ww4PW& zT7DXUA!YAoWp0A5mZo6JJj{|E@ql%{7YFIl8A^(z{M3}=z7$t0$53iYLub0d#5S6B z(PEJ}`me`tD*%Ii<M%d`x6S&y3?Zk-|KLvFU=XyY{~eHI_3ZWj4kY050}x0&bD(I5 z!iZgERzGU$)q_;`{42;-;pe{B#7gY$RcG`bU&5{6Lh(sviLu;(KjlTZB*B_dguXC6 z5+9{|T#fwyIQk02kpq47s~b&=Djh+%Fgi6I9>ad4Qt>!7SW)Yu@$mVv!HBGRu`DY% zzo>|4?w&%?`gG>?8j*aXOd95#0;6C@P97b)*Umlg9xJcYmV=2YA`uRVql4E@JiIWm z^Jk`*oE81$N><)*g&r?NXSXpSs&nfM6^_NPJ{zIZB;0jn9sB}~7Kbmf+;YTiiyW9i z<#<6%`l|1u!a@2fsr%i95XY4gPF9)Lp|WTQ@wsnLJHL8h52{nxjVYa1ZRaF|mg(f6 zXn8`oTdK;n5;5`3okbAQWvi!9gWklUbX89==X`peDXuNzq0N=OPw50NKBY`tS(jj; zts1sEeO!d@1aYYaK^(6Vlt0JP*&3VJn7BA2A|a$BP+xTEj&XqA2A-JGa78P5!^SpV zuvd{0V5K}71xPeRYnWsLDmj6sNGMU=VLk}>T^VlJ<;xzq0nNCC?Y=C4B#FFQ@vk!o z8ABkD0;m51QsRc#qy6aQQi&m*84q7wEc3?kA&$9m(u+ON+n~{$A)iI2@#PuVO@Kwr zHnzpnHw6&g5|?%P&qikZd13GmAd)_TBk8}mgZRtb0K7gmv$6h1`Q_gLl_9SI0Df|P z1X;B;D3_rEzmmx0WjTe~N&Lv{nMoS3!lXUZ>H3@vxz^5Q%zTn~f6Vmb1KT4qSFEuD z$gp${HE*>hIokMqyk5V8Q@hIk3RinwpV-sJbD%qf9@bwR@C$#1X@La}ripFEq*R!c zifdV>1apZo_o}(L8DCS-dCDaLz;|gxN{yn42(z-^JHoUPo^-9f7LuDtBDfA54Dv%% z^W3~Q&(;VJj|G4OW0HXz83Hc(G^e0QiHkaRL~exDBUoh0i>fSiE*P#iX=>Kk>v8Af zd!*V7)}_e(Sghrf$q@#_zRo1XzFj^lCKNBTIG(dy!82)<B(jqv2&1ozl%vtF9x#<j z@9y^Ok~P-vKj;~2v~p3f^yqK*D{EEKQaqzd8>n_cpdMNTctw47F%DM;9d+z^kH0U> z@G4ob@^bXmeZC;U0LU|knXo3BuC{PvMuQoYgF+kw7_IK<ozohdm>D#3q9Uis20`9E z=`e1;7-6>2DWR9B=M7uBxIsK5#!;f2(8_+tLvln+rl5}c*&Kl+Yz#<*I-kM6l66eR z=fTrI{mU{_7TW&?@ej+)D9|!v@tcgL&uLxENM*Jqz4nh0O^T%Y6hL}Eg1nW(H<d%u z>xXY@5AC{42_TO0*PDwWA8ahw*cR`=RCL7^NpZ^7-@oPE?1*RXfUvp)!s@>;^ZpO4 z{)VW;e<13g=kaBUVXlH-rL(ggAxL;3ep4g|<eNb#A>kK|RcmczSUDHfe^7gw=Z5li z;~Tvhw^@s=xw<`DdrUslaq)S3zr#UeyQ=#|f*RnV-ZX~@V@s0m*XSCo3?c{hRu*x; zhxL?JWH9bO^f`>knz>4_dhlzA*a)u`Ni-mG_VOXen%vg^p2MX#UN#Si9TQez#~oP{ z@W5}uF)h&trj~U&KF8ue016~ea)9?KcW`~y6*v5vP?yjLw@Fdl2bWT(>A}Du73D;N z<AuQ45nu^M>qzXj13RvZ%mnjXU1iu`{SqApW2ACwI8X>-TGz6=%CZ5K14BS2{Cs)$ zyGOZpOUl}qqEN$UO+58Cm7GLHH9E)bFf({sR<qECBjp~J#Nay7n=qK3>bdEL*T^%$ z^;sV6X`!&QLD0k}4^Q7FJ_Y%R(!`e4383>PxU0+Pt*gP)z+7kzUa35AmNDsMU`3Y# z1m$47F+r=yGL4&g;hu0A9m-giOoIr%9KjKlje;urXLBf&n=xG?6wVxT)9~8aR3<zl zGhL5dw=q!-i(df}S*q}l*akanhXCVd|7S&K;*7CU^(^KQ0eN>jBO>aw<4Y8C>-1K( zz|=mTbwG*62+GeJ?Axngiikh(mDk~FXW)>hJM@3YQ8R)##s6|+Qn1yt{tp!Wi|7Ki zgiwUvDjOGohGw;TGO|Xq+{9F}5D}`-=ssttyfK*ng6MYi@bHp=L>K(ZQSPcbK^$%b zZ-Ix$(A*|3UN^L@$hr!X;^jqy5e8c#<gk1davb6!aGHR{xviHbI=g7bY~aphT>Qgv z{{HzFIM0qtbF7XhBdfrGJT)Kh#S3^2UIUosg5V7L=sCl=GFH|z<)dI_tM{0Yypzjh z8O~YfXDxDC2>4+GToB|+<p~^-9np|;g##0e8jn1YzUn8C=mb=L?{|}3&1oHs4iaq; z<<I~zbaT^3=wH-d{7<4Y<r4dg=x%9wB0%g2Dzpwb@JpRV{xa|ZiEjNbqC3H4cHMd1 z^H$B!mTkCYcEK$DG~w*43$#`>Eqg!QSR>BuTB>0o`T00$+R!!bX5?{Sv$90Rs+ode zao58=%>kT99t6ONv|0$9NDd$mk#VFb#}f+Q7a`SqNJpU*5a{y6V$~eveFa|@;Dl}d z%<MrX9g>>c-jKwqX7tKKrfCUN#@^e)8VN9K4n-<DQ*Vq>a_E@ES<kwA8xxx}&P;&L zk8?ZOeElDyYXK5nYInxb($uv>-HZ#;{086Ofz)tOKYRroNW1_2>iuuE;s3`A`hVM) z#CHF=F$G*tFOu=Xt(`Ena!EP|_fE}{BT4_IC+=k!k;0OCw~u!`?x#EOG5up4fn&RB z`h^R>aswkz5rM0><gmeCtG6gjAniXGZhk2W(|&Cx)UdcdF)4$8Iq@d;7%V_>EtVW; z1*O&irghvY_D)-h)=UZOxblp&^%es(qax-*!&m^5o}K7IeZ+pw-!LVtSTP$<FQRv) zu78?l;isya`TWTp6Gypa+vxA_W#)=y6B}?I7vM`OGB+G*)$NOk4pJY4Df>JgmVGD? zM?VjVc_>|2I($|RF@l8T7<~kP1#(-Tj5{NB%|;L{y_LRPTmoDk|M>`y(UekJi(uaa z#U7HxL(8Bn_XGrtB#*%hJqLauzd<d3-zuPLZ2GAykGcMXz!g2*8{jr_X=7Mw{!uWY z5gu#FH5-b!N}`(cdEnRhm11n=y|`6MDV(V8_yyw}niQI1P9qnBoA8vXQdT)L#ugPd zY<!c9dASJi*T$X2i*2B{=$H4)*t~{2#|VwJEy~>dY!}SD-?%wcBjrMbHCe%l7eEV5 zdAGYRH0hYT=8)f_c2dSMi*vbcP3Dy;^A)9w@KZ0Mx7_<Ey_4O_i{5DCKhINiS$#-0 zfyuF8<X^rp{l8Vlf7n08fhv_AP?P?bB&`nZnsAWl4KOB)Pk9p;6M!Hju%Baq{ElMq zT_`@L+f+;d=~DT(6xql&Lnw3nm(#`7+_U#t^YBV#1k^H9P!iTteU}ZTCF`|~Rp&LU zvqh`2H76@87Z0_jB(EtpAF_A^>r2qg^gmj_lIN?p0Je{(UO9FKK(BWBAfIbB!j{6d z7wBj4HaL`b@wO<`ru;Pk%Da5q3iPvln;go!blU`KQ|`Lb&qwas0razUn+No>aN7&C zOZIxq(({*&(caRN3+{Vxly@F>m(q2c<s07T$zZVcTQc0|_JEY<KDYCGjX~?XsMcKU zuSX#i!{hlKv}APDxRZna3Ia*rAzJN$6)2k9c$|*7vN>*0<n}mv(3RhWf!Zk)!cb%< z^{P|Si^QZ*g%lJ{V~X_VhN<@4W5ja@mRgxPx`mlpiL`Y_QBjjOqb>4<x|J&F@`s37 z3Dm{141gZbCPk?7q{Ww@!$qYZ7Z>+q8?`^TOT<a^ccMOoLfSq|Sy0Ntzwh42YF1a< zS?ChTra)YXDHh5&E#80E_thmr`SXW7<~VXf=7JV+{|5_e)!O>8P3e~An!1idi>`pj z`^&?G(?pqi>Jkg>*0~PduzF3Sm&5<p+F1ugy>t&BK|s2@Lpr2WknZl5ZkCo5>F!R0 z25FQA=`QJ%Zjeracey@_^7!+5@AJ+d?6NTPIddlWJ9Ewvuv6gLo*bPXsCQoWi;F#y z0?kEP8a@(U41B^|!iu<#zyZQ7MU1nlk<3<fKo8KVsw&9LDooonHip?B8l^WU8&jU? zKw@u7<r3|uw+46p!s#f|G#G(p2;rs6w0l2SLJQ!*+z8{@cTd~oQF=iP!zh6zEC9xi zS_d%N#_yT0u3%o3%W_d)maj7Swry7Rnc*vX#4RW#$NR|h`BXKK$g$OGVg)z>rVqpW zrjR``0Z#A19fw=IiR!kOot!(;4D8;lPBo1UuoZ64_X&m*l8DX)9s@LxCML#ERBXI; z8>_NcsrUQVveN3KgH26};K2O>he#IkL-ws+URYw<p4-RZXr(Nu+Xidaf>2KFK|a;U zmXGHPeM;=x$UM%~ds&sZSu!Q6A<e*S^3=HbYq*AM3Q9BCaHUczQc#)V{nF=K82MZ$ zOgCK4Is3FEAV-fJ<zLhabH2~@&=8>*#a|1s&U{tEh8ge{uBC~y0wXmr?NKQ2wG(~} z6>6xzYkKUS=Z<*u!`}0c`S(M=L_R66DXr3{7Mg2oDrF+cBsR7mI_P@}_$1xvRa#|C z)g5cxwJ(XaWbcpM$pQhH{y~m4UUzOKkF&ccad#qRZ1`-ODUowXafytiui4a&W*RRH zT0Ca~D!o}#e|E*T*i3OjP+$sY64SjibY8JrOj==L1+E<jY!9iC^<!yjog8upe0y}D z)qAJHhr)&PCTub>BkO!BUKlE5rmXN|;8MM+0WoE7%H@N0)D<G5upwMW<qDq|8!w8I zRd#)WbD;>=V+-qgEk{k}y?=4R2^JVps)?qDe}9oGN~ee`A>3ys(lT4}xO~&B<Ao*S zv(;i#MyYqzeiBrCs+J380f!KkBU-HWB1XxV58-fRs@=O@$QxamsL(Il3c9GdWTnQW zjiSz~#=ni(;TavXCTz+`4~K^2Php5OC!XIiu~SjebYBc;X%;TR3v6R;P*#yHBVnE5 zJPNNNpH6gRliy4?Zi_c%f_NR#l}Hh9o_${o{7s`QqpCxrvQTQ5fwcp|xQtqHToF8; zCTAOd0Sy@qb!3DXv<m5Xj&ip;cF1_^(A4M@0gNAZQ&wrH`1qN4S5v4{7eAyIIwzVB zsy*eJ@_=`-Zvk}SM^nK@R&cpP^|hhFk!l<TM3o5Hfp95w2>TNkx2`6*%D$#-hjXm0 z(qcR=nynTVD>ai&=gKkKRgF?ny5bDzmlaF=x$k$$PcwYsR5#;-Y1C+jt=cGc)El=@ zUgoNeSrL>O<Z4Q`8YcQ4shW2_w9WN(;LK~RiyIbC^)<Ii)flgdNh1Y`6|VCI%sq$E zQL$#@q0V8C&dWV+7-}NIeLo)jw%8!^l$P6@Uc(7CymFaQf-YWILRl<YBZ=0O2uH2p zl@ecaIrTL_-AR6?5+S^pg}s+uaeYkHL<vXX$e~o*nWr$%Z3yUVbC5Qf2KY@-w==eM zf>whDO4R=$-@3I#07hoAvO=+TBZRJJ%A?~<6vZ@M1r7^ayTwYo&Nmu33t+mugofD{ z8)eTY)r=@6-ElXIbaW_HRM^p1-H7{f$L5OrB|L(q$H99!Xtko()3U5DO&!@yQ%|P% zT!K>UOWknx{e5?2d`M#RLEX6(WLb^GbP(L5L|kTs2n29F<a4tkd00Fuu}s!O{ZU|f z3JnLxld)IK%+;8!v~zi}dt4J*T`XNy^NB9}YAdCzE!pu|rLf#9<odIOw5Ix;h+EhO zPy$*(xuOfAing5e&)U@(5ljm&v$FBWMXOoD0GyXs3T>_I^v!{v7Nh+SC_2kk#NEZL zQ#LHi7sXixP!{x4K5S7PynK}}fApE_4D7mLHt^yS?u%W}dr#Zt@XCDP(-mZBSrlW} z%_Nul!_f9^TCtTq>+(ZL;+4ycUT7={lAcKyQ1^4RWG<J7iHM!l*wI5_=7J&(H7IR< z)la)9c=VIT%Gw@|5<s<B97`i>0wzT+T~=BS!L4-72ObrghKiU>MjM)Q^=F`^rZ61D zE^=*$P%1QRgiAm%6(i=~TR?VCV5b`NpO`yhoqf6(I)1+q4cB-MB}FHZ^;6GTT)Fd$ zh{y1UGTEU5tUIMP6`>RRn6)EqDifPXIDj$+E<*2%t+SEivxLw^R_XDC$B~U-$Igy? z5M@Y=33&dETW+vMs|LGp$LHDGt`@H!WXo6J*r3e6ly5YTfFdVk_;i4%(}rX~VNGF8 zWlh;}Xh`6x!57zWa~~gE8+?L?15`qUqdGaCP^R%d_*u2wt5>r9Qi`$}Lt>m%$FT&B z20E=sF>C66p#GrQMQ#ri?swHTo!~w@W%7}SR7Bp98mR--X+_LhU!&1EBa$R&n!q}x zGRooZZ*&RW(r)R2<K~gr<u=;nWYeTFYs8I})h+aN7N1WcN=d#q5*E$qx*!!MR^7?= znWYl%V%|P))__MP5#yW+msDeInpj|$qe@=79u22bc}MltK-HXckAj1{cS4a7X<^1g zgrw8z#9gJfLg8Q(rQKK9Rh18XRf9TJ{Y-&wt%m0{htol+oj>*~gsOTeRia91TDBRQ z5LpOuU7LmIbmqYA0}x0YaMGFD9!&QQI)v2VU^=idELbgWxQCQqhLn1T6k|9qn1|#8 z81kMs1-OJ~d$b0e<LPgZOcQFm2?v!(7!{u+hbL!ZS9BOwDuGr?HC1XAw&7L!s-H#; z`e=0CGs+mGGRoLX;)ABGOwGn4ga0hq_Iham9SeKt`r1ZS+Mh<1Z6S;<4rH$ITHx8V zRP?ld4+~}PVR03Ebuh_ujQyU+VncIo`cxkdh|#THIrq7;J~Ydks2qzZjq<mU7oRJ8 zZ#gCUWTIB{3i~Z;q^%V7q*_UqwlgD_W)PF9d8<{Dh7CGx;kZCLHQlSnXc!+ef)YEI zgMvdjUV5uA`6smXE4!hWDV7M)Q}(@1M_v7>5_GUe*NU>n&>Fpl(~7cA+bU$QdRC^- zU7n0zO~7%=ggVdXvO?6;h{1q>un4-<*g7r&;O1}GYR2a7;=jh+Zg`3B<TZaqDsVyR z_vs$Q!jPnovC~C2w@pNufaF5+sU3Ix%IkOqd>4-8*ZqULVhBn}9GDr*>z)j=&P2Uj zg)z@|npfMaG#?%BcQ0yRHC3i)>C;~yRmMLXGHKUw<YijfA8V`o0#e}qWqF|l>Fi`t z`?<AdpPD|02VlAzA(QT8JX7!e#@oj7_*NE<p6SwI70!SI_e^ytOc|1L@<{YuFoQ+^ zkaz-J=-DRwFYLYTWtQ4PyNqF8!Y%&1@MF^@njYeXyd*QvI*zn#FV83|ch1-~587<q zUut^rRX321A#@y#WzSW|Ped)blxW#NZ;w?BOjJQyk$>W8AIH3~Oe%v`=$niue&>_z zK<|+-Jd1*O{wP%TdC)*QCI8D(fh^^rCCccax1EoYTu#dpc#Wq{O|KL;Kf4EDtQR>4 z<flO5LZ(2XX0gi<0p`NFU15X8+;Shpi9yhzi6k+<d(SL=2{d6#(g<X_BLB!9!hFu8 zj@`-s&WR#4{-c2ccJRlg4Cg{tr9d;aURJDp?#Mhy53&ArKocjPgo5syBPaUFa@@^@ zrQtS2bi=2qjzZBxoN4nU$2+@Z8n2Y<gUZo!>;?Dj6pbn87PSLF6Mgg&L0`tm2j{9% z8taBiia-)vX@n?+xV=ZmvM6jYSOCCLSG@<vrjsdUC4X6nVd9V$FJ`vt#(h}~b?x<~ ztc-w_uV1bYzh^l|5Uhv62L^Wl!n_IqCei(t&JxYuc$6^Do-()U7$yC1`07OsRv+!8 zGi)@@h|}a=4P>A9d+^7uC6k9SNxotNq0Et;XM2{WC8iP%&uW1lDEHxG-4HQm!*lDG zB(?`2O0~(=%8Z`LF`bC^e{9^jFYi~D0gA?m05g$68!1i`e^9L6mwkjmM2t}!ncswG zG3(eZG)@w{_m-xSx)c@A(dr~Y*T^Lwe3Aj*5V?HnJshln-9kd0A^OF1dxmt%6((^X z@-&jz0>ix%Nq<bQ#h)@>;hN=RSa)~=RuazCk(>t{lY3u$?PQ?M3Wengje-Uv&tcd^ z{z<ZGs?%`Q@<Tv02SdLudcD_%v(X2fgQ$w&L&X)n>?-vI`-F#S)C|-j#zn`mkCcOj zVc#We<7OaPsrhP}@<%csxV`~j6{SWmR;U)7Ea4x0B{!;@`c|aE;>k;kmKU13u*DR) z!c<Td$wdMT>0rX!;3gl+XjI^zdq^7#*x<p<4|`<4liIVCA1Jl+ZS%(S;mDjMg_|eF zP*#G~vjJ<2G8<{c*28=9&OEH1`oukw;k6EJYjtdUZo7))<$e$gE;;FHNIDeBd7mKq z(M(SatZYAgPYmIT7`ZozPj@Cva>mr!I~qy_@gnN+s~qiC)jn%{(s#L)K7-g<+DsFO z9=;^x$pvSa3mvV|^m7j{lJ`lnZ1Jmh%Ay^^bFawKQ^@%6l&C(ps7$1zpjEA?815J& z0QQT-nR?ZhXTzUF)==0XG-M|rL|e&wpjSCo8Su4RZovn``lg3tqL7JEgcG0aw#Vmp z%%p$PiMHCnPUEat%N|Fhb9@@F5j5SkJE)J4<&IK}^85wbK*o$gFLOI#oRabSizw&g z=4h?d<(&QTH)aL)D*1D2BXNG)9jl#tLR5xeHKK`tC_c@oC1J1_cm-PJ)KbnoS}QG= z>k=@bw7ir{?ziX5q=3&|k#ACnKhNra4nGfJA$U*!#z>$FPqk}6O)#i+qE)RdJC^;W z$o7I}%`0{ZTM_IE^2Ejn%UyBQ=rax#Dx048`*|5J#TZ^dO!PgS@Qm0JR4i--)AZ2f z3Cvz{QI6DNr(#=hsDc7?^_~_^dwuTScGB4SP-9Cz8(*{QIo+FQi@+1pFIG5BuCNTl zDB#$Q>->ajnXgI~KT2YmZZxUxBWZYt@Pf3n<omA0kK`AIPtxYrvkk(zEkPZhF}BDP zBwdV`5U||5u$U8XtmU7=96aAz>~@N|ry;(st^2e_R$A*SC|z<zg-v6baM~&Laz4K{ z*|(uN*(uZ<zqU8I$ZpAS^%(ieuV!NFEyNy#NStQa(N>IiN92s=HS$&5vd|&MBgay< zsqOyqB|BN;G;aabD|XF3unj*izTt50j4I)AZ#O{%-8Z<>=KNWi>Tim&lbR1K7gkC- zF$J3wq}8=CPnvge$VrPWXgpQgh~|cM4#w{*+h$313P$T?J}#t%*&6gJEGeHAHP<7{ z+UOBXQr`?w@W3)us2f$3eBxc1VgG=dQPn^h`XYR3`lTlsdPn!EowM~UA$HB@=SCq= zpIYvpvDRItMykLpQ)Vr*4na{YXLnUNmBlQwl>|R4Q+>6)<NfJeuP+|ADX%$)%O|Uu zg3D*6nSB*e9bW&OPk$gX&K2H)HodM(?n4)Q;sLB%d%&?4EBoXE$AI6b^wiO}h~(Nn zSK;~6qq_YbcTW0Qnf1|K!9hU8fR~#X{{Csv_b@~9h6Z0B7Nsg{08m6wuiE0ZrY54E zsO1Fq7NFuLx5S`gfQr4EH?kIeKt`%5U$osi+Y<j2fSfI#DZc!gemPUd-Rz)6L+GKX zkgv%|`&HOgSk|X4>}Y=K`*FuTDTz$0ZmV3zj+d*S8hHFME>)q4LW23+UX-K8XSk>Z zg($WQRC+;Cl4Vv>wZ@>1Wr(r*Y$hn%q{A>J#4ePgvSn7HE$mI%#zkg5%K(0o6~uw| z66QYi(Z)iQB|12Fg%xzpd%0Xyc{I~|I<t8!%kZmRl=(&zB%tm3i7x3e%;=%~6Ot=% zQ|h8gv|Ofd$Hnr^VtNdk-=g*UsY!+nwsffUP?kBB0+O!UHiQ&jap{lrP)m%|PIPox zdRivBH0DU+z)5Uu3%%5Ok6Cxk+no3=OR4B#a(CvEP`>Gy1Y9~*^8=^kP_GXq&p;{X zDhh%+bNIws%toW0IJPn#w3U{u@5T(4_xeRgn>^V1^3r`p_MI8i&LfE_G#<m!Y396O zY0S^1a`Tf^FXLV)GXg`&aHDNT_qeKTlPooi2(MU*jhLfpNS~pr^kcs#vOZ^tV8f2v zCLM*i@N*w^_O04-PEQn%p<}2ku|H?2z~l1oN<8k^dYsQH6ijSiP(MtOu!={n!8QhX z!Z`#y!hu5)WZ7!NhlAM1hL+#rFA91Cp+NO4lR```uBoZk4_r}Ek!4sG1JlhPU$!J? zKJ9QUVu88OB!J}gYbauwS|R#+p)X8lSu>BI-`j08)o4AcfR`ZU;;^FOtfRaLJh32~ z+DTE>sV-xm(jLApbF+$VPhGL>S8W6_W_$al7ahJ!nWaE}!f`cPx%=&aRse0J^e1ty zRGbAr4YM7K@FPnvc1!fF>aD0Wm9c>6_6Ib_Zz`yS3u00_`t6b-iHkt3q9fyyp2P>U zZXQpQg(jNpR~u~7%THgoQ8R_QyLtQFtIr}zM%Zs}vll)l%Ovo+tPZ#3eTPn)x!vf* z{{<B3gvXP-UTIEk4XSp};q>&hyLqpJ=@SYC@6bnY1iVkshAI0b_VbAE7av`oDByg! zx3lF?C(paq!XuiDslVeF#Ivwx-N))67eIZ8@@B-lg>zUp=)(h{N6YE3nP2oo1G7L8 z7~%ug?#-;iP;ahb%h%@43558dJ$B-yfB;>N$;+oNPkYKyp>`s{a)qg_rPNUQc&=N@ zS_y%wx~TU3-qhub0Wi6lml{*2L_8Om_&Q<SwLQm7hqBKlcfycY3E#;SgHbZNr=+Ak zofXi0>?;SW4@#1-XyIv2J$;>&-O!rQ+@;0V4Nr~Gq0Y;(yNI(-rUo_0)0r60P~U>o z=N3}lG%ly^tBcZzU&_+;d7W@fQTYUaP!Q?W5jgH5jc7Qf+vEzX6art{dDw*ODMi1B z;1kBZfXtEFO{dS#EILWk-e^2c5D5S90P^@r*Q(SRf!=hod`Fpdp=~wqB$@o+NaN?m z(96JMY0?wasaj0vmS#_f+Ru}xr6*{wsR!SM^6p&t?qsiSgPP;;ay-x`I^|~0Dn>IU zvkCMu94B0qwDUrhVO-9y457T@>e!!g#&eL2P7rfzy@X6~cu>EcHA%)EwCp&A_v*;T zf9}3cJvpuyWTbu|X(Q#d4aH%Zk1-xJnlNWbG<+ladv-(UfqqK#@jCYO!{zy$wuy9? z1w$$#<1_fwUXBRIN~6@I{H<^~PNaRU8OLLc`TOkB!m81Dt&!UBT)~u|vY_G4ny+R9 zx*wf|b=91GmiLJjv2kYN?6G_8O|@gMoi+%wwz5jmq|Gfz6{eRaMvEwiwt9+&O)iIg z6ce27?Gp7c2)Q67ltVC&W=PGy!)nE*kBE^U`{DfaE*^hoUnIwhKvbII7Q1<ZpAU|3 zF4p9-fY(%IU_d}<|9&RFxvwQ=Wd!&-i-#&%+F>i9K92*b`4A=ek-1IPdveks*?vkr zpRB}^pFiVcEpy~}OCFBuQ-#vt;@9-YfK!YwOYEE^_QJ+DXGiUJJN!CvXw9&z+^##$ zJC9E|jORalT%E!QB(x*gWR&1FGw+m4=$3V_NU(ylx?0rh*}d%LNd{xp>2^XCL7sxH z*S)4q{)~#bg)o7N7K54q+kF$)4VngA1lK9&Roj)SA8m8wBSpI)#`<`~&QaXv*jFnS zQx*nh!eyqc4^z4cuxJI?@T*)}?Zb{}+e>H6^H+tAiT6U^Je+?Mznm1V<v!tnGddq= z9>=JZu8XQw7MWf&&k5IsprnpmUOSYtCOku-EOj|xUEuGMxx8W6?s#<6wBxcZR;T_b z7+=7&TDZA47GEL)XvUkRg^W-tXNKiCm|?BVUuwuA6EbN_AD01BsreyI$u=KZkENTn zMzwIrFHVkRrQW9`PE1B<Vf1ZKof;jRR1{IQ!9<*^LQ^;s7#jO>tBl9ICY{8~OHcnk zbW$HC>A)S1sBBlu6kLL&P_4yc;Yh{V*WIWgey#m8Psa<?hkGZkICE@=tklB_*fh{m zpLI_d`rFGWO2${%no2bt_H12C^2hAQGY!9<(B7bI(@hX9n$~WbmV6R={TNqssW12p zGbu6iKp$0O6J9JOc%%0|?NCODe9rE9u{Fi@d2J4^3kRcEe$_G@9Av99GpDh0{;PF4 zO=JH;OBK?T^;|iot)LyD+}+bKyN?t}YQZ(pTb<7nnUvgo{DPj@@U=o#=IB9`Q88=E zGqfAw$1AN_6c$%?tzh#g+Tda2kX`FilP{Nwb%o&`N{bC~HAE;6`gE`O%yu2#OGi%@ zIXoqlV$3>N*w-dA#gdAC3R6y;4WorBwaVlQyRcr!t$mD=M}oJjy|<xdF@VrUxf<be zu+Nk1FEacLOXi^@T!PRbo{PX6;W}wvbZ&)9yfr{j_Rt&p87@27^I=J=IWwa<Gsn4& zs~01CPoPXJvex^-MF--AAAEUDiJS%@=9KhseziJ{Ox&q%v&jB(q%eCO`Ko%H9x9OR z5Mm<yo|w=BDj}73s}bcAmOkZGtbXNZtWA?nm7xKw_@*RzQi4+v@1UySgpy?^158m$ zSQjRpYD0Zk6HNpzLyw{6QA*j?P@f{{(h&LeKMG04Y^If5V4VRZZm7PVWKx``QYsO~ zQgcyn&u($q81V*Q5Fi}oLk@_20M()n3)N!g1FrX&7_@{~&QlddjZj$#DZn8Rs->$1 zT+b5Oz6*JTIEE;TR65k8f#h&AIA2KU5xKZhosU&6vev#bh;xTbJ&I_(RP|wW^YeWS z&n2{|qL;X56C!<(Q7T}aa=d3&gwCPrV={3bdy#CQotvHptunK)q#pR9VP~Bho=cj9 z96RIy$f(b<80Vc(4Np%%JI_8qDO|eGLXi#?0ph=)7#>WP@kZ8O<2L6;!V5bqaygO2 z?ptSgmkd_H_gQm6Ww%kLac<JKaV3b>t?MT4W%#4D0f0VJoVuC=;b)~&4~oV8?RUc( zR+^|;csECJ-|UpkG&%3vsJkLK)P|2Y{5;{EQ>WI@0Z++8fI$i9|9--g(zP`<wfbSo zlQ##Ts31Nbt9h?)Eak+}=ou&C#17L53Jy&wyZ^Lt?mi_$<Q$B8a%fp#8O{VwS2%wx z)kuM&(&fENIi-HhB7x##0a|B#<Ijm4Oea?dpI>@3f543k#%%Wn4LX(U5nu>!;YKeb zG?MFyChi^Le%`g1$iF@^)hpcVexh4eQa&gv%c4guHy&K~Xm+2|zy978sx&M@;fS)z zW<R(R^rFDw*?Ha*EO7G&Re(*0Mp$r?FnHA|r4C2$W9hdM=E63(+tdko9vb_EU)KC# z#cTZQ*vH}3wQ&VsH?=sDpF1}LnACR8XYqkf+V@%sVHdKYTl1(JCNCyvN7Vy)&NGI+ z2XuI+0p~M*V_S$ETH)&2#@(9`QRJ_%KHq=rn|zcr<yZ?=^lp($%5lc-OMeN$@%Z4n zyBU|cb_Jf#J8LfWS66u&(aKfsp;V|Y&uimaj7DMs%2VMugN=wRd1bg??l;0Ex<8OX zR2`MTBz{QjV5OgckuVnZF2&%>##C=H9sQ=_fSm|i3;nd54HM_qdpEWSUGjQqhK5b| zeHzV{C|@y2HFokWVk7k)X9f(}(p|jz3fb1TO<UKqNSWg9*^9oGt5SAjfL8SZbUFcT ziqoPG{9>~)wV0BRc%5l@TfZEZe1SbEYu{&-9PAxOU7u7z=1o042wcUSv_n28HrH%< zIN9BErB}dku5nBtdn`$Sbzw%}=U#v?l*V|`F{v=YW9!H<CNfL6dVzVNL|w`6iU&Sl zdW@UyY-X2p$QnCs817o>cTpJ#nJ}Ll%15C25E?J=c_v9BVLC}-<3OaO?uO_}$A&0b z=enp-=cZU8dGuC^*CT3gvF9R<_!#pTf)#tATc%n|MBTh^w%TLro=gPC><LQLF;m!+ zzVpHf91e<$(Cxv9WPaYR*%A-AnH+i4+i`AEs*^0eft5B$w+A2RyhvR;s5E13D?68? z%VC=H)Xu}3HLR}@<_s=TC#-9Qd2NGnbnc0~u#J?dfqu*v;#lr@aaNH|dWFt|+@&pw zsyJ~+`OYf2{Y}Mv%V{y9)rOFWG5OACdjinT7BRJH;`P}wGk2Yu8&H}i*8wl7Yy&Ns z{$S{Ry@>h4(3ATb@mM<AXuGM}!O+kx)E&fh;K73B3#!+z#iOb4L5^l<$yhSr#cQox z=jf&QL5a3?d0!CtI&S+A-4|8eKiWHbe1faxac$!mhV57~;S+2Q*R;t~cv0C|%!pAH zhmyu4WBA61-xPxNX%26+_y$iiKl`J6Ha+W;vI?))EHUD>+$o_#SAO9NUFH5*4w!qI zNkDV7BSmyr1V6R3mM<hPC55<G)Sm~mmZ0ZFBnAaLBR3#JHG&<{xr%>mFPAYP7))cd zM}95h!THwr@%}jF)%lv=sO5o!V}eY}6Ktje9V&!R2OJ1<`Xn#>IR!p9z@1k%7weuf z@P4!*F2$;oW>yiS!fzPI%D^HA({_M>6c2RcT^1rTL4JN}7qNM5;VE^Fivi-TKaG@! zbX@YJgs(zI>Da8i&aPtfIan}yLsMWierx~X+$*sX%j9X2F7!BS0z4np49Nykk`HJf z-aPDj6s+!p8yp8ULZeQ!q;6pFIL|`=T`BUAX@d44c;9-a{lrdWEKHY|co;AaYwQw_ z5>AOr`DOB6R__kdYT$OUva%L-p$3T&r+M5^t7Z2aKs($t|01ZY#63_{FyP|?U~*C; zWB=>Te||uL05_n2B}9;IzMD5vLW+E}V$#C&S6v_=w^<*6JOgGG(Q6jC1pbpLuq&bd zmF??~3{UDGvr6$viwO%UDAGv@|5$>xzBLQjDl?Kf&@;Lg4G0J@3gP#Z;i(QR^E+Hp zOh8ClLFmWa&&rb6Ix%*Ubb$Z&7TAq}g?vvLo(I6fzUP*fQ3U3{%?ynEt?7E>^znN_ z{{HT!-X6eTzh|~Hv~@JqH?#xZ7yPET2Ot(e(V2yIKL`QAZ-FY~_?{mGB*U}lm-zv< z#&o*Yy80%Dbb7k>rsi~dwx$NghIC(@$^s2c4Xx~e*PVaFU?s7#R%iBki32e&ftVZD zg5Oexrv%!s#QZOe0l<<@5McQW00_vm>d)=}t@UpjW1DXU<7<rcTao@d2k^_vf6`5k z2be!aRsS*L{2dhVhSLuj8Gg?Amx6xKI0(qxo$NT@a{ndi(_du=8t{Ep=??`x_^Y5# zT-p~Yz<zT9)a%Vdvu`QGGx7HYeOKa7_dai{`L%fD2X6~dft#8xU>$$%89vxQ>E~-T zZ{-xR)wMP;)wlaIjENvqZUk`uBoFjsEby%gz}F1V&xF6l$l4kjnL6p}Sr{tVJ6qhm z{uxky6)buM*hMUWjsA1J=16}F{8P+-H#5Qadfjv{JgVPf>>Q2%tEpEFuhhwbGS@-f zm0A7o3*)~Tr+3EZ*YDeRn_PT&Ab11Vqtt+?r{871X^U~Xzm@qf%#TBq^si68KdY4n z*jnmZn7RO^0eri0{F4p(U1_!odIVR2(r^H!QT<7pC&2CwoFVAHPDJ!~JK&85{|{+? z84B#TQurXggPa9QfdrI7`X?z;ffL!klj4WSD!*l;9E?J&0NHpzw(L*rRhECj{%`lc zzon0Be{x?2(&2z~$)D(4?Eiv(W3+JVF7~%%-<2Tqh5zVW>L+p#=f5QXU>NvYwBC+| z>e4UKW8D7|{evmlZ_yAR?gJmb0w0?J^{x0*t;v9~6aR5fyEPK|(e~)K5=f$I{MF)E zKnY}ilHdj3|0KbG7MkC}wHQ-H7JsSvkHB@|UseAH+lJqwtHN+4f8FSWz);=)3jM=v z_}`)nU6}dpfa)%W{c8F1P3sw+0MUPr{`It;9PN3v0bF9Ufvd-jb<ww!;mHadU4K$N z;L0ihu(Gq)wX(PSHA56I#NP*OJ!If1p7J*U@HNBJUhdBrH~sYot$kgvzOErRe**G> z8zK9zAOBhg1ADBuH`7KOu&zH(8}AkV7a4Bmj=#px?RUq!Yt<Dk`}HOvFeIhO*FdM= zG?3v52Gqu%sQ8!F|8+g_$hzggfSW!hV7~$Kz9-;j`q`hse!D3D8j3iO6S@T44o(8M zgFh>`%=!NV^mpxwph}-}1gvEXux)|k@q5bf1oix1(88t`-~D3TZP2?><-b8QJT<)j zcjj%3`Mcb^5p!?3CxL&){pA+t*KK+?nCdM|EaZQH{jM$V2BNz~zKH%a<PV#tU)Snx ztg>6ghuD9N_+4G@hG4k`$*2A;=!ebN?-+L@Jlrx=UjGxuZ@=o@b^Lz|$xQ!S$j!uc zyRZ9olic+Qe+$^m{38Hx0s1cw@pp&LU58k=5QVBgh1@Jazi^Lr7j@T%(k&{u=AWQ$ zJu2NL+;#VJOW?2jCxoAz|J;S#b+B;@VQKm!$Pc^fUpM?+&kMJN=PiFk_+j(>Yr<WN z{98gt+aD4BFZ=wv%DQW#eG4M!{0E@l4#d0mySEJE?muGuu;cx;y6zfw-V%y?|A_Fz z7VX!ByOw{qguVX1CH%q;@NPTYy(@NGKEcA@mj8X@^Zn-7-Qw?FV7M)Qef4jP|M@z@ z-J<Uv72Xy-x%Ib2-#s|ITln3>klVtQcK^2UyGJ9k65znC-i?b3E)Z?t^HZJuo8SH) D5d`4g diff --git a/graphics/AtlantisJava/lib/batik-parser.jar b/graphics/AtlantisJava/lib/batik-parser.jar deleted file mode 100644 index 286b3799c3f922a0ddf66a99eec096f4ab01429b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73710 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 diff --git a/graphics/AtlantisJava/lib/batik-script.jar b/graphics/AtlantisJava/lib/batik-script.jar deleted file mode 100644 index 433f02e67c5561b54ae05161e9578cc6f474bbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61893 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%0D^F!FMsLy;1}Q~>nkrO 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 E4>EvKeE<Le diff --git a/graphics/AtlantisJava/lib/batik-xml.jar b/graphics/AtlantisJava/lib/batik-xml.jar deleted file mode 100644 index d05eb25f7778d3463f07380cf5ec1df675d534bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30862 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 BOe_EZ diff --git a/graphics/AtlantisJava/lib/commons-cli-1.0.jar b/graphics/AtlantisJava/lib/commons-cli-1.0.jar deleted file mode 100755 index 22a004e14e16720cae9af97d4d1475b12d2388aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30117 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 F{{Zietb70f diff --git a/graphics/AtlantisJava/lib/commons-codec-1.4.jar b/graphics/AtlantisJava/lib/commons-codec-1.4.jar deleted file mode 100644 index 458d432da88b0efeab640c229903fb5aad274044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58160 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 diff --git a/graphics/AtlantisJava/lib/commons-logging-1.1.jar b/graphics/AtlantisJava/lib/commons-logging-1.1.jar deleted file mode 100644 index 2ff9bbd90d63f92cdffea944869ed9bea7ead49c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52915 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 TS2tko1Nh1OwZ!fF_38fs60)DA diff --git a/graphics/AtlantisJava/lib/jas-aida-dev.jar b/graphics/AtlantisJava/lib/jas-aida-dev.jar deleted file mode 100755 index a698fcb714e42754a7e62a44c5934d5767d1aac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3738 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 diff --git a/graphics/AtlantisJava/lib/jas-aida.jar b/graphics/AtlantisJava/lib/jas-aida.jar deleted file mode 100755 index b539738f665293379179708c453af1b88deb7d95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40424 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 H{`CI=ECbWP diff --git a/graphics/AtlantisJava/lib/jas-jel.jar b/graphics/AtlantisJava/lib/jas-jel.jar deleted file mode 100755 index 384f9eeb7a4e3652719925331a5f94fc0d1e0def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33570 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 PKmRa1$BpKl{(Sm>VgE-2 diff --git a/graphics/AtlantisJava/lib/jlibeps.jar b/graphics/AtlantisJava/lib/jlibeps.jar deleted file mode 100644 index 6d049b27ce2c17e20455e390b0c554680c49808a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17486 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 O0^vp`28MQU!UO>Q&vP08 diff --git a/graphics/AtlantisJava/lib/oncrpc.jar b/graphics/AtlantisJava/lib/oncrpc.jar deleted file mode 100644 index 3910ab9f555e0a3cf6f8bcc3d2ef7fbacc09e6e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86081 zcma&OW0Ymtwk;ePwr$(CZQHh)5gE#`ZQHhO+h&H5VSG`i&OP^5z3<k0yREtQ+O3Tr zYxcp}=a^ew3J4ey;EzvXcnABx9{zoU000J%5m6SPk&qRo`xpZNkpH(RI6%RdsBqDm zgVL9%-q%3>8vhZM5s;M-6;V>Al@Yy@nHZOrqM@CIk)olTnwYLvq+ej#Idq&5LUf=O zm!1+=0SNm>GI=lU(V7vih$N+`<eW(<@Jr@5^d3y43k(bm3Ntnoq@yAV_g&m?W{+0) z*8jW&z`tJN->>?wFW|4coue7uf4%1aDe=cV|Bx^+vbT2rA98=6Il^D$>}-u3?T!8; z{^#r=;TV|SzQmHg0RT|^|B1`l8Y$Wv2^blf*gGpZ8#uc-(HdDBI60Zb%u4ptBL_`u zG^-S+r>BQ3Z)tf2pj*<cxDc=Rlp_kEN5v)4{@(4l{^mu_KoN#;b$j#9M|SMx)zt~q zL!%u)4`<*<Kbo9SY2M40FqA>0A4Xr4$cvskshUs;X$=H_v^|P49&cDrtQE)083+!g zXF@SOlE%xv{Hm1iP4lDzVc<p_3e|^rsf=gva92sz6;)4YIuZJ<FGS6TXz^XD6rR?J zMuR3ap^S9{d>+^KVNV5LTWyjSv5r<o*<y8p@dZyLrOjR$vNQblxHHbw{4qEylR1D2 zJjc#rXX%9f{%Pd4c9>|K3^!X7*OR-}>*%I|>$Ji%+vnSVY35G|FJ!2JmcF1P_=1q~ zA0TvbHW#w9b#gYab^bSoHc`E@ee&=kSH6k@2<q?-S8Hf|yQ|6uvq=s7_KVzlm<i0) zG9JIVo^a8;eepn`iHUV;Qbsd2xLO~59$&$BKzP7(z#an(&|78~WV~9X54>1qb@@zn zrE?&1&yGxu5^JFnRV<KlXm)cScBI_6Av%a-x`r7a0t95dqx+tjc_DuYl1-H>7TaxW zNTLUdiUlSmzH^#cXD$B{L&&;yBuSuUq;kw37Yv8e75qFwO=YA)@UBv_(b~X(nX=rA zJq|lfEA>OISK7xqa*gEbfM_m$z5I`5|A|gr>7h967cviDgY2Kt`Jd+HGCM2VN002g z>x51(A^?ogau1^I70~A5AV_|C)Ir>+Azx>0?97{i#_J1bV$F~Sy06pyc3d#|aP#~C z3&2M2VsPFEoI8xltM@{68?#Zl0{x9Bph^#wiv%(;tYZqh^BcI3=WP-&Z?T_52z@P5 z@#BKriJje>jtm8yjN^yK`|0G*#eiBdNmJ5B_#xLYREkuwZ^bur2dsTPQv{($+tUsR zoDLdlj8J;F&;|pLqs?&(zc^F{7u(Mw-BG~ROd1~oHjc)qpfqd>-Pl8B*z$F0!y1RP zSW}f>Gy{UV4#A6d_?5~{c)v9?>WmlRX<eFUtMe{iYF=7oYg}4oYvG#1(deD~teX3D zy#fB!;5?*Cm1n=8Wc-4Z<ewo`_OLhk(_eL>Wo-NC;RCnfB_U}*2EtI-dVV3uOM;}g zjKTe)WlS23CM1)@A+A~i0o##Ru~D^U%YWYLnC)nN_tN{;VTfpmY$%O>$1cg6XP9bs zMtF1+#*fuUUv{62ux2f?TGn&9lg$>*mMu%xH?Ta<BFD&f0x$ZpW0T0qfe$@bW>fH; zFDZ=vP?NM#yXh!K$Fh+<v>tz=+;lpiLaLvVCS9|xn-yyaLxbWz>t<6zV!nQKwic}| zg`g(!ddD!wjN|@k)^U5^?~p7y`)V5Y>V5ogaqN8)Ueo3a4;erJ0Oo(j#KhLw!pOkc z!p>I2{g0^j_3$S|i3;tqfC9)o{YnlVA$B$LR5<`Fnik^V`UCJX!l%Iwfca;%tC=j` zzS)KrMtKaiH7vFFSZ}cVCIsgBp@S0}PRAQgvZh<S*?Iuh`W!*<sALEOipZ(tb<h-Q zoMGuUr!8YmvREvju08P8Yf0s;h3gyl#!q`iA2;7$vj}+~ovRC5A2!k!v{MJ{=!IPq z3!PI5608o^os}<`Mq{igrEtF|<D6z(M@eKl&!ZX-k0xA~V9fCxGFGtJ6l?9}+5L*M zfheYv6iZ^i42SfPl%nco39QhATE#==g08({M{c8XIRt|}x<#g0s^bwG;bF1Yd{wG( zpQ>*82IK(5AkBdMi56mTnC!;@QhxtJ@Dd5Y2u=hTR1!^U9$TzeF95uT6z~86cESu< zdV-`*@EX$7IW0Mth0mfN@7!eWibWxKC&XJ63;Jdmba|3ZAKn^kIXcYWa_!r*sZP7c zHr^G%KpbI=J_@T2rT15p_Srz-B>%&lztl(bzpGEs(aylw$iT^2z}Udv*~IZry+y`O z%K|dM4|Uh|Q2OIjqRC|e!`g=21TZM%7e^ACw<KQzOD$a%CCGSD%aP)G0pN|Xx7*JH z)84s!ym8J?Jx(8^`F`VMaW{Wuzjrv;SI_xg80oqUsN2kjK)y|a0KqI|bK>yKN%Bfv z%pkUAkY~&tt9tywsqRYmonQtEi3_Sg(g=-MbX6IID1WH5tuZtrLAxbgyeR5iKF5F} za(k#i+zc7wz8!1#H6jA*Xx<}%!>^tO!f#Eft|1K9nfHA3lPPoBg!HT=XN=A68P-o# z7NnNBUY|KLey_GIeMg=S8>8+}DZw4;?MFu(BGsemSv^_}<dWnk&|atbRZS&oFR$zB zk{U>fL9|NEwt9cE2+xN<8pw(U$+EupnppkGGUYEg@4uz3<?;?I!7sSmzUmFC{|CrL zT)!OW-+(LX$RT|>%Dk&qk4O!Fp;t+ccso8;HUqIdeyN3Tj`Fr~8&@yM`sU<$(tzGh zxLwyPl-JC_&;Xc^FW;EESzDTV^RNC5&*Lc$r|C|n?Jl2Z$Q^<vQu)4j2jto+X_?eE zMpXzb5^F~3VZrYkc2F3e2KGxEX8O?>q*w;<WZdFw8&?qdb)S0|XKu$jph{sQK8<H> ziUSNng)XDjEjS?qws8`7>(ENE&^Wsf1?<0ExCG}KWr7R`NUjj=a#6;h(z#-@R}6MW zMryO$9h>)|_AuK(bMZX<lF#Xd8~JvJ{hTm4%xo8~c@T)#R|V7Z&mwqBn=v3GXHXVI z$D!t6vm7~%$eRU&j|MF)8|2~x4+_O}Dx>3C$%HOBxn*Ii5>zc|U_Ivuj(&A>5uu<F za=hDI-Zj3Ij7Gl$Gf^Y_qI04}x;1`Ey=~;=S!m&u+_u~cUHX1fDqF4rV?#kfYI@T% zKwOoc($^4*MV_7_kZN$zJ=8~Eto4f|%kFH#;aHKKQV)yy>~5zIm-sZcMi8%6_;aHN zaEKl@PO=@lYL*a#laypF9{s|sfeoB1oTCn9tuxmv_ARdQ24iCFoXCvkF}ArZkQY*Q z@udH$WR-1{*8H4yvsUakrm{h{EoToQEQ1^w*Uxr&5@P2D@$gge(y>$V)3Gyg3aS%v z3#G9n2PzfQcs1$%mw=66J;X3hkAm@3Ab!oLUDiwEm`H=$dg)t8Ri=^WN1=l|>D$eT zvB2FiUDD?)(aQI~)d)O`br~67Cb;-DX#XEfQQE@E*~Iq0+&?ga0kV%DS@?K3r3Bv{ z01lo;yW#@463`F);cS|Wm^!^i14wtW56GQ-7MYb*_9kU-l3VW)%$KH!VGkXtZ$rY$ zwzWpN6FI;oj<rfTO>1ApXtl9|aol6vbNR&I<ruD0y<002qF%|#g?e}l+~7ICP~~_q zY<;0^IpARXVwsFOD3Eb2iL!m6kCzZ05IQ%8UXYzRf)5(L^KUL!pYCu!`4#1Uf4Lp` z|2|J418Zv;6DKDFvw!FAz}QLKd4A-;Y2%C{2HSa5O>&#~4?ll2VexZ*Yw8%nK;Xi` zH=3D+)S@cv^}0;S4nVv9K0(7?plkUMPcl%5Z++oRW|x^9kM-{tugTQ_xI0ymCg-fP zJ-AZoh5dEYjx#+5Kw^O9`MGS~yPc2OQF1T&xxOb*748xlXq2>GD3gr^9hfNb?C8aQ z)%D!chJK=HB=gdfBRcODETyO?quld=QqleF)LHWF>&3@ebow5n0i2Zr=x4iLu0{1q zE~pA7MlryYw<@T&U6h)GA}LVVaB<daN&=WDJc1*0Ic$u?Sz&p{oYRZSe0j6=ffsVX z#>vI2WTV_r_w_OTO&={zpNcvZU}x;E_FzpvQIb@WP{%Q?{rW$rQO!U1XR3izmpeWh zA#d)5$|`|gpvLb_&Q?T`SW70iF<?0e3Fy#=Dk?2?n5-f<I9bK3=P!va&KfS;xv~kg zHS&&@q{Q8t0}d|}OWM;_Lks1Oj$r0kWk7Z3XtHm06<(~$x(TA1Pj+xvOJD6{LuodE zBic>SR~b|$*^lCe7*b7Iny6?^*!`lYe2(KLNK&OfK&%9RvIJ%-Jth1?Lq=D;n$zb9 zAAywGX=?4f1Nv*?JHBSyNd*A_(1iv7Ao>TBu(tS5^vzV2vR_w5=9x~S(Ne%V-e>-7 z(Zeo`OrO(>L&Ox6)SfG_QH;N?BrJ~#BgD|4HR%mfajUs>4kCd<H%~1(jlpO$7=&K8 z)#y*+>Hjeuw(oG!AY^*GwK&i7nB}(hL+#^zThAMWKB&%LmwI^iCzjX9%`Ojb1-bg* z>&6TJP%xz7QwSX1-7Zp>mr|}ka&3`5A2fys2n26B<eEcxH}!~mbgyE}fKAksauAKt zPXSFgDPE!FH=FmUEC*@6_(B8D?8ga3i#UOYN|<??c&PC?rCBGaELryFsMAF1<y>%) z<^1K{cGWE0`?~Had-tv1kQkffYu-aH(ADO~s5txIXH#lv=5LBeLk-2~)T0jN7@!NV zil^tc?W6LhT0G)&UA7!20&j=XPHE1pSSuT*+k<S6ou~Jvd-EnBY)(Xij3&*sE8Ue> z;E_i4nkAuyJm*P=(IIx)gRGE>jMEy7TvG*7JFQYgvJc2d@g+2I?(Q`4`-SgtV7r-5 z4|H!kkZ~BSn}zEF<^?6^!bh^@%=Cb(4mvFq?dzVgaB~xh=_kBap`!e!YD<)4V!S&i zV-G|!##t>GvZg++4kSnKlies4CBuKovr(@%NfzyLdJyI!TWXunua3<vW{w@gwPx-m zo*Kw*_+H-I&vW(c=8c$0^3hPfslT8|X4LQRKpvRCkOZS>hs#Pb*2~6WcAZXg2BkM= z017dd0BX5Grjl&ui^S&C&&+f>nejD#2oEz{y->ZCQA*jaGEGRKb~D*Da*J}v4k~0Q zG589g{5Vl#7^p-BHEE#?dy*a`fM&$@NTeG2=|OoUujr5z%ro+{Gl~hil=KPf8M9)0 z!)}%QQoGKSc5!`FNJrTLcfkqvA}qeqraotVUN^Txz_09bA;tevO%kIm-cg&c(X<HL z@u8CIh#amtXOBKA<~WONJZ43vxy5yz*}PPUTEmvKT|K^T$l)|R&Q5W#3BzPMpS+{2 zIz$sKP$sgtSi)?_1wrQSfq!wkTkL970_@akMrs=m1Ch_Hj@bLe5Et@DnH~@NNT^qu ztGG3?BA-17UKeNuo>1PrF~`Qw!sakO9o&K_9o*_YJ*L4=MmUS`J8hYZ$d!u-QYqcl zk46X%ip^nl#yIy6ng*KzRk0@c?2z9BFJN)8Wb#vzJhf!z&#<qgdwst``R3#1NEgHs zTtT5m6vnVs2e1XxhA0{kGhxMZbsK7c#A|GcF>I1x3`5Mb^!w4xFilq+sB09cYoQ&P zw~dWj24xLW47H2t&Y?$h4FagwkfZj2@u_K1kx-K<h^c9n)z!5rCDikcMMlhEF*1Y` zc<*x<g!PV;LgsPUbr4{eN5YBrH1&MkcPJisDr`x{kZLsqB+A)A%m!()vLL8X;6uX; zcF`0wAryIX7QvIrDSk{FWgw=u(4AmEhXQu4uXIZ)gEq~)*kgtE*b=q>V3}<Sj51U4 zzQ{n*65<;tnzY?z)<V;kQ>#;Ml~wuI1yS19hl!H6SZCUy16(0?l5Mn_&uK75n5yZ4 zkuj4(F8>n9zdLQj4PJ|AUSauT%}6*Z+ueU^(;Sj)psUF8xk%Kq@%s@aDc}nwse{0b z+6}12?xq*w{(E4B4k)zU9${ogFXOYLw%In&`MRiMW2Y4qSeC^PXBpR2W#D%N#8-${ zi*B5Av)+<&|4PPR0}c8E*QkpYBtoLxKnQCFC&8ShO;!bAzy|1Bw%|#>db?SGr&)o; ze)ak=1MBs1!Sw9D%=v7=b1&1^Yi2)B2klVPg6&Y;qApIaE4%&Rcnbu7Z5MqrS9vQr z@!`H{PqE`KX!l0@><|wqJA`zh<E7gxD@n0ZzE0HNSEkx%7SZ|vt<fg&qb^FP1VmE2 z5@KC(bK7ON^&ao9k$w3an55iSvgiFu_WwY92>mOv3w)77f7aH43NliHU$u3<oL=g- zX?A*n$WoqIIjShUDZIFUkZ`*Lw#xy>6+_hSwk1l#3D|vpUTQKp$s+Y-rYHOH1kc3l z@EMjb(|Ixca8kGp8W->=6hUAYafn)UJFqOziIcy!lDIcp`h81VG0!&splMIZcA?~o z$2ZRJ#6`ftll(9|V}g2~e#Vr>x>9wnBfq+K6!j+WOGM>U9#w=G_x02|wht}&?Ui*B zd8y3>VYxINI7?Rt6(c$Jb5Z>=+E!d@#bOwOmNzgzEKn7?(oHZDZFuFqIP2Plckw2% zGWCnlyAfEmp3MU08Ghthu#3Yhf51q`G<!`KJDxOtH=1JZ?WL<TVf9xmK=gB4*UXaz zVYoAUV8?d_Qi?adl_o19lhx(Vnj`^TUN8pEGMZetNBedrj?wrt5`0v+0=;eogF3no zQdM|#0ysU^>KW;;I*I+>wDt!>F#OMJp8wW~tex$@Yp_Tq9XZS|z0`+OS3r3$C3%M# ziqu;3#XSfZS(V60fD?Pq>`B$r5?TLjH`c)Xlzhc{F-#LzjDP6lD?80J0SZz7vBJf~ z_L#x+xUtIT<MRP{4Na#k9IIUGD}q8nP2pZa7+?Zofnq?MkF1JZ!6@AP@VMnenH07T zJq|Klc^b58?cQdTZacpq)zmuA>;x0OzNNZej)s$7%@pvJNN!m%4(=tt2m`0G41+xV z)s7Wj-h<05hn1WO=U#?L(N%jI2iQ1*YTHKiBH6ObCL2V?<6Fzrb}{Fl_lHzo&|}o? zO=qne?7C=ijJX(!Y!qhl&2rLP_te9-6eHy7Mj;3vG-$s*RUV{hDWjLLDUCzYgF5@8 zwYSQ`KfKCe(Fw6kiLPZgUDm2bw>A0_2FQ!+vm@z(Kw%g_<d}_fsocwEy|S5%t5Xtt z5Ccsx^R{*O{YA{w+hzk;O3=;3b+snweMDsBQVc|$bG4$f=wOV|s<N?vE_o7ptmh}k zPlZE71n6S(qpji8z>z%OiO<zX&%p`0hQnI0iF(#08)nFIR!SSIap@N~#L^2eoRcY~ z6qL9?(I55;r3^u<K-dSWhAwGgJVVdPpTtihpu0=lpllk%J61D<v++J_C*$LzwQIbf z9}bcbZw%qYN$=R=x5BN85i^>_bPJ%2s|`#clu1+KM7&>)50xqd>^<=lg8?~)W@-B$ zT<XNNM}ztCSo!h9z5N(TU-M;C>_O}8&#DdYLZtVOvM&TW1S2f|z<xny9TemB`uJO< zFox&Ojr*zrS-)z)e^`nCw^gdxTDbpvC9bMvkEDYBA?viN-9!>Nrzz2@G#3dkuWSh= zNvEIFuqK%6+gGO(H)xE+idE#EuAp~)>l@v{J~e~kd?3(+JPh@66v6az6b{!lmS4>o z^^#q`E`!-5$at6inek4y{rq{geK73P)dr<cMmsbUSc?v8#0`7{u@Rn!grwckGZ?Nd z?Z_}V7>gd7ubm#XiykGF5}FG`X2>3@q}?$vIIf)$wF|9GJ0&?oJi!=1*`!I$R6{M) zQDW)QzaZ0C!c>9HRjsSc1hP0`Qe-_&?*s(xS0*6qhn*}ChZ2+&f3T)GnoP}AomStU z#5)cbj9zdPIuBMyqy)Vy(9e9{3B6hRnr~W9R{vuj*{+3I%0n#zA>hXHrot9SVHy=U zF0Kf*NM(G-^O4^C7-p=?rNa1-u}qbAB{i;8!-R&(z%t&%rbYjxsI%JgI67?zTj1(e zW)i7+dQvmLNOYCs$zqdJ%t7f9jQ27vmhAb=(!tjg46;ok&XC^P8=Wj@<s_ph*(Tpu zmG}gaT#xEG`UJcG^9YSp>hAT}n$g&NUfD^J&+Ig@V?K|+><U<@Aa7j>7Q~-IAyRyb ziva1D4OS|)t?`g$wxr{9lXkp;SlM*6umPld0uy<Lmh#C#&t9lJ@o@krwj{@WjAJ-i zuQJ}Twy``_O9Nq!F+w_}3XRORoxQj7>#RPP7?BZD9ik)SExj?fzb!_zVPpjH^7j_? za2G~a$6APVlZs(bh+~ruK*8=G7=1U`31c(LTk6&Q+``=f{t<*PCMhdK`2h+TCfYIj zqb2(ML6MaGNx^xH{Xt-B3>A7qL;Zs_k_|)TCUr<K#i2n#I%O;0V~>Q&HBm))4UvEM zi{|zmM^Sp)m)4%py2K0-3?o>3U6a#~Y@L|Mq?>N9(*|j+n$uTWxrPo^%yVJ43QIFJ zgw}n}ErY6pb|8H^(&a>ywKY2szLd3FM^2cx0mnK4Sr@T0f}qJ@ENHY}3Sl|D^xQ~1 zAyVCgsoczvXdvxj&lI=K-9!oK(Yx*(!=XQvYH-Gv@6Z+!mso~Zjbjm)l!HMi<Wd*9 zFA7<fa-<;u$P$Hbr!eGG-N)!-;Ku-^xWu(CEN;&j5zm!-^S_5IkT%D*3ZG$L^POSe z%Hc0=If+sTz^`;5$vkfjT)`PQgEu7XVXs6Y%-l=)e!8dI){;znSp-EGIeZcjM<4ir z-P3Uka)4)_nsl-$yoZTc5QsLj7Ugq1`@*tjia3W;@kEQG%`fPPM_RxX+P%$9G^@rg z=`r{4MKL87@=DxF#EXpRj5cRhf5np)E9Y-i)$wiSWOVu}oIPyX3wC@_D#R+5LQ#-z zS++U@tZ8RL%meWyd&oy8rzGg^C}`K17S;PS9e!>%q`W=rPw-beloz~xo-IL-A|T63 zIIsqEgAQdZSBs9g>#@0-m-sx=)2@3CWxGfVh6+Mnl35!@q@BJ|(;0lwU?8f;@y@?( z-kw#?%g{t~;}=;*-pbrW7TbQo1)?5lzVBfn5Ii&Zb;{=O5s){B_%t*4W1<{tVGlp< zF=oQzUqLcC2a;X2_bCk+1Y6Ayu*fDA2>q1b3F>373Q7gvx|Vl_wEYx5{KQar6Z~}c zCTV*oWgM5qW@E~SICXP6C$Wp7tf<JfpH%+HG~BZ4!F{L+9;}$(CQ7UO#-=KIE)XwS zPzD4Q-p_~W8^DeKlR0IQ|0#tH=sDi&LlZQFNhyMm`wWQq?O74OVi0Y_=>sJ;&9{bK zP+AvMe6DhYcRNg62E_oUi$CbiPdLr*9zLdV9N^T!5Be1_lo{ysHwdG@Lidtzx}P!l zNR)~1^&^>F2OgN0uW-6n{W_R9@HEjGXEl=CNipfQ%sHze8^~1Kt3}*Y2;K|aUki>M z!R}PuuY#lOtKj$tX6w(;{(ta3kxJWg^YX|aw66-RkkIh(7@WX`){+9=rSOQE`bp68 zJ-b$?ze-Nm3eUhlM0nH5Nz<NAe)=Tbv=_=kr_KdmWq4k?UAj&2H1m0TKZELjJF_TB zk<A5jBi@iP0!_O&B{?8LCf<m*=ZoYxfjmN?1|Nu2wWp?6d3Z~+O@Ses;aR@ND(X5* z^Mt8CSxLg;Ca{pfZ?$cAts#h6mVB#<VbaPKo-Nk|d^cHdbk+P#G|opKg)Is?o@K#~ z(%*c@2|4uBs9hq^2Tzw7+icyEH8O3mP4Tx=voZ=i$+yB?PnPYHd9K>GqKno8dQ;8C zB)P~1i^Xl{$(jm`i@Lcp^L1CNS3f(9-!;+b^}t2df@tD)S!t?7InGMGKp^4J7oIfR z4NcaorcFX@PIi$<LLz)g%J+G4gW#el)aB~EWnsbSDmUVNE)YhDw&Hz8C{`no=4zcR ze(RYfXcDck1+H#@LUo3l5BGDIfhCAt@E$hFF0`A;zH3?HqcBh44fKs<X=lCdpjM~9 z1y9GWLS;W5pCO<drfFVO6HD#rM}7DY?SxP~`tRFL9*KmocPRM*CDx?9xw#myKcQps zq`U-|gJU?v&xImdLXeYEnj;9RSf`xqVfy(`9PGIjzGt8?6%P9awqkIw{F0Jeiotin z)~GWE(X$}=tcm#yS;5$wBPC3as6br394RulXzR+COY6g!yJFA;pZ^Tvi>#2xb`P^f z))-+zZ41S2%Gu>Os*O}Rw|@jtqf;2db-+XEfW*S(psU@yCLpzsx7o<cKG2Oqo7@f7 zRO<d42fHmy-nIb*0FVv_06_PDBcc>d?5#ciLQzJlY}z5KAb(C?Hq2*cCIv2)sWi~c zT-xSBd0*RDQP9vLr#Cd_4wTHF)?~J2Zca==$^b*aO9u>~$ppka;TuFEiU2Xsfy0qT z-q7vDiXq|2oTuMpa5e8^mR#6AOmG}$-En2RJv4V;ZGzPRiMcQnqV$6nq&hRKmKmf+ zVLI2x%+_RPb2%^MrY}<9(CwNmb@m;o;BeK3w{A*5n6H!@WCJczzs^Il!k~0$4>g2& z@G05TRGXUw=~xw*|31c9|NS}=5@GeoRki;}ej;Ag%gZ8r{T@i6)!Rle+_+6WExWdr z!jVcg8I<d9ax^S6ZJ<G^;<H9Uaq{AGjnJNw&1IP^X*yL@kS1v|PIxNJk)3@;)O510 z1erIw-~bY2m5t3l$XUEYxsoAW8GxgSV0^xi;5O4F{3}zA{C5hs>&8aO)#_1235%pI zvLVe8<UPHvM89{O7?jC$9T?7K|4`!CMHT}eJq+_c3y_Ta7(d*1n2so2kjnDKLE9go zur&^kkVD*Tkf-XTp31Ec`D*<FKtSls_8~vJdebWW`pwzw16YJ2GBoc_%uiKo-m6uJ zmNOh6Q_t-ei7h%7Zd-<n^1DuxE$kAgVK$JlYAO`tHJX^XJ%^eEE2pHosT-<!=>Wmm z2+v*!IS0cgK{-q<HuvK2(y0`uY|6J_L4Fe)v|ME76x;^J4<rhE+*pvY(U3IE2HF%n z0wne;k;#&DVaOr<2r3W|K7l$p^&mg3;tF}=R|K9$wBb)U!M$AxM}No-EI8`HoZj`| zw~vr~?-%XBXYdSwW-hcN`i=r~FJCRFL?xfkCUmc9z=SU!*`u3B>5fqOEon}Y<9e0Q z=m(YHURDn{uOE+n>`yPG6KW4tq3(i^Z(~{8fj#u^q^R;t2$^CRG^U8(M+OC}Xb<)X z%;?p6X~POarJK|aX9@1iHTXAyHQ*C)TS$_=9U*k1sCFa$78Wa+V$l3>=m<1&M;qSV zu}QdwmEGs@ijeRE#L^=QUUzoHt5@07gl=C9auqzZ{UN!z7m+ll<7TiS(CKvxj=4am zK*zWyiNO;?Hd|BOt*SClSl-HC94oSmOYrJ~Vr|e&1+B~$J5w?O7EM81H-;38be7<b zP>a&*A;`O|X5Zp3q&U}idFd_4yN>&46JuTBf6`sfMWlUn0(Sw8_!N@nl$7QSYmrgh zJWZncb9~`^T7S=}Bbsh!7m{~Ct;P4OB?wEHszoC56L))8Y@;wSeOTx%Ky2VW3gpc% z`-TkWfbLDvg(j)bsy0AoMVi76AsjbX<s83M=^*(H?5`<JQQp#o?<=MGex<bkE3cvC z>|*$DUPD>yk3GYWqD|LRMUZfskOjvZ#jv&;3?V~sVi`;cU=P>!%mkA4%*ji@4<bF1 z8&tgeNwBYEmVO$9FVHrc%Hc%2{XCUA`tfo14(5yIev}h|0#>eGo)ZwP>1n)Q8%YLe z!Ut`f0MYQB5~D2(FF3WFkT3Ly8{O^pz(*6rit))fK4cw@pJ}_>dFFRpVy5Qt!$tj= z5$4VFTP;51nx;j5$ccM@@h)DB-zJVbzlAg{c@8~ybCZEzGO#Mo$;CmIY^%DnGw(-x zITa~JS*ytK^@l?-Nw>uLojo`cB``}uJZdFV*hJilyig$7xvqX-nB5n#uCXqGsIDWK z=A=_S=SoVnuPhah$(yb}1FNl_A(@?=m&XqzxBFdocsKSQx0O>;s@Khy8Uo3c*D$CI z{-8$i+4BW9ozxbj!))_>H#&`9y7if(eL+iM((rR^_e`#s#5%k2Ch~ZwHn}SbW-wq~ zg4{Mug-c2<OfNE3sO}N?HqV_oTmJ5pSq+~VS!lXhmfV$ljWOty236wN8A-T|Q*@aZ zL~DD~z#^M(2TH$2eF?8=#Uj~j?nWV!zetfZi<y9URGN&@=<69YV<>B$+&<+p6i~HW zE0+Oe+QGt&xqkwM8)c!S-FvKZ{FIN~z4#okM@RkZ0;(cPzYs3v62oNwnB%9lKdW@8 zM}4#eb=uJO?0T_Jk125{5O>cEd|4VngQMWx^8gyT%n-Ox-(gk0WZTOy)JYw~P_n)x z2lOW~spa$Ex;;|Q5)@y)l2pzYzef5G$?9+IRxy*3{eNtu*`yb#mN%j*+wUR~qi(c9 znk<N?#Y&7cMF@e@7$D9q1Uu~lJ<0D0zm+z%zdFD^W;tzd>FIuxrf+hvHWFq>vK}%* zWwOhnM|kGW5UaiJ=jtO@A2T~WQZ%zwR)fmiga@4$thOvY6Fxd?2uA8VeF#f^>;dt6 zYibp3r|}*UA^K@wOT+j5=AKs{0t!>ktXZt4I(8;H%%yN{T_g)}NSjKb?5c#Sm_o3H zx@;n`Y{IH}ri?Q2by^JlL-j~*TzL`LYEPSES!W)U25GR5W9<aJ4!UuM#XA47-!teH ztHbU||0h@w+~>(8SQPK^?%zDPQ6nP%{L6#Azc`0~@L*vV8+%0)Cl~Ag+Vzi@QbH1d zAO4I7P9iQ35CcF-0FL2KKmqo;j=7#Q4~SEz*ln^dvM-&qwXDx2pZ0>F)8(+TATJ!d zHBHR!tH%>OUmd^)UKqE2w08USVcNXAI4+(B5RHY!4`>Mx2EZM7Hy2^_#cHA0K&T~0 zv;~><SJ;gJvB%m+Bn6CNpm4nuZ=u@7{i(e70NX4DeUWP8BBnAHWlPRc#gW7_IKy3; z-o`Y(6FKMv-33B5jiJfZHmWujC}Yc~#s)(hM<c`HSXK$u-E``t`%Bp!-)L1UtPBN4 ztX6uG)^e<@v=XIp&@s1VNXn$2faKG5OP7(Q`NO_~;ZWqF+1AzsC%rt7;@d)jhRM8v zzD1o2)3h5zA|(U#ha5yu&s^0|c$94_3B)7Gf;j54p2WsBnZ(o*7mE0IjdE)%FAX#_ zWZoZeM0p^LoHL{FoSU#1Hs;CnG)AEHjJW!;qL6pcJZ2QdB_NEn`(Y6v&XVd0wE-qU zCmfR_ZB8*$PV)!=LX5b32to(hov$*MB}YkhZLKmD(C^0ui+1U`{gZPvB%LqAwnVx@ z%i=Y>RCh@x_KCM%wJ>h{QZH1OvQ#hu*;pO?#}Wwg>`75(vR|yknze3?tNR#zQdw`I z6S}Nx-I#o494Anzt$gsJSC^{P2y57oQ^?Fu7{A%qf>{)sLa_^ya7;O?ln#$&Fu_ou zngIgtGq7uK-z%C6j~S6OkuZRvo&4s_FbC&&GBu}}pHlZGdGE+HzdG})<rZW*g0HCj zCG0?CUQ^(0K_;2DR=3zfNJniEwSJ(8>&?Wyfp>#>>NXv7tns~ElHwpm;ESJO6Jz$P z7KH9Fobn3bF^23>I8^E*mZuCcg^jcYK;)eiH74hABjfa|)OB2jmM`?R1$pO1$81U~ zC_u-sh2*YjD3|T#+7&?JiL1hUMb=!y5>%7H+2{I)zl!liDXeeyTLqNO585bs^bekv zp_WOBiNAdRd0(SN_5k(Ql&506UiJ<2t3LtiAH&Vx+Q}MKwXBi9xH;HP8L2`O^HxgO z97Rxj0TGewy3MZ&*|mA<vMG-cw!VJdZ!^`zwTZ@(89fA)ZkC@JGoq^`ltDByXaF7W z$F)dy1TTjB>`DCW(+<tY@%hxHMDLSv{OA4W$GF?a=S1r{nvc&dhHs{O0i4yfJ>F8^ zFOmyzJZlgTkSPB=|2TgQkShOt$S4YOsuJ>R<R{27$S5js<OSpa$X}30$P<tHxnN}I zpjNUwnuiu-C9Pe_awHfl-a+MvU20G?bQw)!F2!eig=U{m7q2YG=t*fxq5Z2~ga*d- z$Z5ZFZhLYZod~n0FiwR@Ee0lUs2}Nr4r9qI?4vEfhY^E5Mq*j!By7)Otczk(j+&;5 zXp+;I<5In%*4s)fZPQsN&W$O#Fs4Z!96Z?)CogWiY_kp0FygU1(Lq}r#wH?;=WkBk zE&bC`f^tVXQi_{1<6;zF3TUx9g>`6cNR8o4ora99etno`KHvK}o07^nw?a45ML&`4 zD;WuAvBB8t4$)&LCQQvhMihrkF%PUk)89LgMcb)^rXNNe4G%#x3CTpr7@M|;nW@h{ z9L$e4Sy|N=U@*nwW*5kz<Dog(Sv``<O!BN_v;hs5J>v?=4VEre#0m8xiB)n?sWx>e zQe%NusjUe)c<M~UTp6CAuQE=~q+UZIbJFjAmu=JK*aPM`6W1VqWxZezf56!-s%6S> zv4X}Td&@ztKeyzFc+SF6zEB^kpDeSXUXf)fppis^iPq-j$&N+n9gAJ)W(P_$CLUbu zibIkWt%Q!WZdGLJL^fi5E%H`ONc?@~cM;Lrv5_mHvN=NW5<4WoYy9E>fc3)QClOR` zGd|DFw}3regfeTM$wEcGNEL;q*lR`T)@#uURIExDtZ2Ej62*0Fp6X0E1O%ySE>X%d zOhtWL8G%pZq5-uTrZn@$=};Ag?G#B=t+Jsx2zj9q^gDLEEVy1dQ_I;V+^v{HU}yeC z2MI(Os2f=wg@J?RG6@S$L2E%Oyn3^$DP`}Lu_{r}x>z1AWAF}I1fdbBai&!G5N4^< zD2wmvW?-iIow2_RH5o4erMwI!GyuKO^iUVD_yEyp2f1J&ZhscXqFG5Ri|DuEECh4* zck-ln4-1F%tTwd}?ers{ZK}pKJ6sYPZUvXTX{q=jbC5$p=2mZ;Ef}*#Mm`<|zJ{Dn z7yT1f^Q)^QlrJ_>Lki4`CGyOkWpj7=+7sh!v?`XZ4-3LB?%E}wI{6wVfKAFh;2IU; zETCD^9c%Xju`AYIx{nL|D&bltz%J>UCcsVNNwu$8;>oqIox}@lmj`i6>PZ%2Tja?W zVq1uvc2}Vf0)h+z3lW!yn|Aj{fD+=CoM5uw%qj2A74q{*RE|T~3~e3Lhy3Z!pJ+Y2 z@P3cCk3k<l$F7QQWj->P`(i|7xmzs`(vg*rM~%RKL#Ycg<K+u&zc6sFYg2MsNYAm0 zcI>0)FmfD^iR#A3Tg@vIBAqkIJp4o^%EIsMii)>u2W*uvg6&jZU?ki<&?Kr9;q`qT zXtR%$s~47bs$rN!ES?4C+DtRu<m#9fn|WH_THqsljyoV6Wh3T`dlS4Rdu|t3jWs78 z7jI&AT)~YahN$FiFSU5(Gf6w3AEh33(7DJv{El^XYS}EmwXlero3X4SLT={Ls77w) z+$cv*=HgN+kLuj0N8VMXOOlXRMT;~>po0T1DXRt+=*X{@3}vFMrjmQUw1^_Onp-X; zxLQ%(FQ`#nP8G;lQC=P}S6yBnI5+#zf;Z;}LjBUh`eOsIOAtXXKfrExj|+Q{B;f{# z@(F_1TNI_6u;;2|mu^7=>`0vrRh{pB2D>NU8a=vp(LJMb7|9w)wr<ir?v#Ddb%(hf zL#}qyJ?&x;gEh=7#qW6K8~5~_yWin8VS2BIEBNtBzk4Xk4WrWy<lPM=lzkS>4$A|% zt{K@4C|6+f8drK|6f2%Z<m9kDAFlc3c}mayPsLC0%&TV2OVpvqLZRhFPG`8i8I(A# zEuDn7Q<Qi-M1|nbzcqhpZH9y`f7PqYUnI*v91{>TahA7pbpA`>_0?{<!2i{5nN+D& zj!#~ZjZa9eQ;2{^fSzYgiM8ZQ(B&FD%2^<tZo7QlEDel^_w?<Jd_VIPR7X7_cxt2C zY3d@=^Wp56!dFfGR=#(iQuKPDpV^d~d$1zhjP^*I+swX>nGRijKwcwJ64eUY^@l?; zquo4DFa27Ar1fvuHNsEqW~8tPHYHrLb_d$VZ8*+BwN;Z8yCM&=2#+LWgEIH5o0`HW z*CD=;JtPX7a9cVGRrIo8&*z{$QNvtsjNgUXNoDm)2ZX%pvplN-hAHi`96y^KMnqIc zlwEWt+SSQbwnKf&((ZG9*>^$(7Bt5{IMQxO@kFo1Z0oK?cMtM%Z`?Zosi3*wg@bD| zdv)|kA+}9jqYp95r3{oIHLbn+E0wTT^t;?KGO5L6$pstq!H+RVX!?klee#)re!k%l ziTq&yEiPwG?rg75(%=ORR9G2q&LL*5hoSwFf{RE~D}y>2A)DQyqHg?6*B%gcMXaVP z-fR~&v$<52uJfmfU>7M~0K+2sAo?b>8@=pennk8<_@yP$)3-D92Ry=Q;-wNlwjkp= z>hpMWD?qo<bKF&wF&V?K4$Mov0$9vpd(iLHrF@9Lj}jN)XchRFpTxTVW*+2pU0#=8 z^@SGtKNjWU&d&CKvc-Qct1Hz!yp(?<d`^v<ZeNZ|)nV23f-C?)j>g5Hvs8YIhR=b3 zL5u?rok=pei=*B=r}eZ~U;jR{X30}lX?9q~N@IvZf<-{7h!Tyv_C29VwY(Fq{I_+b zq}kTGHU298MX^su>hq+XsrOy__M55q)hOH}FZd2J<?Kw@8B4=1D47x)WQ#=4B%m$A zHO;r?vXzS7P#VUSGQ)IGoOP3H8<b`X@_`G+r>K$paqaG~E68>|)TgX49L68PzL|iR z3-k!vY7WUk6fIiFt`Nsr+#BJZ#w}WdzCnfs%+mciVXw>?5f`xM2p!9Q1ig=3*S<h- zoHcUFxQI*Mx!yZH{d=QCeICmF-?&NjyRUJVuYt3We+BPtM+dyrhGm<l{4B<H*SwYk zd6VwR-`i%A1)b(x?KTrR<Z!TPm*%EJ;zP5S@29(#+I^R7x{e4#Q-0IzH{>RP?IizB z>Mk*8r`#cJe=oWhTGKs^kIYhiQ+=lv__mu>)+9`gewj*i7b@I9f+z)F5-JaW0>S#y zuR}nzv?q7ZNQ4MGkmolPk;t4+f+`^l7z;0e1O=0ugJ6nPpGH)hMd^c&DXFaCuW}Z- zs1k`08zjzd4UE_;o`SZ#C)yJJesU6q;ANze%15`lX)}Nt0EB>G+zjJ`XZ4GLNFR6^ z<}Ar%F;V3hE1&to>F2Kg9(CVFUF{7!s;rWd(leufCBfX_F1a;qP^44*kMc<Mb|04! zXeZ(wIGVd*e@0m*o6s%&4Ei4x*;0Les!?{N{O5U?ks{v>KX{9lFlyO{!(fCbndVTf z!O;~U@U*z@e75~sLByDyLd;AU7Vo!L#$W;n9k$G6QzJqsqDinLlv!v--6z}Y9h}_< zna0x6>asL>z^td9n2J2Mylg{&rqwkVqIWiCP_*VYaoE^}AH>thaUAe7=nZR)nGKwA zPQyvNm@z+Si97){gX5>PQFW{b_CIicvfLSpGB-G=vq-JsRjpCh5w$&-Pn^Ko;$yRs zW~sK-OMBz@$p#}$infSd<|;L<!%K{j%(Ev7^&?T*{pjM`WxEpQ9t$;4PfeW;r!QU( zVZ++2P#G!4p>K<;b#AK@=4=ldekjSVk22!4c)PAg#*ztI(Pt2A%}rJT42{JaJI*3W zJeb+=tF0U4(U3t-PBbf5@u22W44F_Ua(CErc%EA$998d8M^E57#`w`_8ZLw59RSji zXM~Y-cGBa)$qAA{*UtjD=75{~mLip!@>&^%qCQ%9qF$at{w_OQd~MMeVML{uck79h z-AjpsAPj+2r_F%l6H{929T7jl`9ZFAiE>T$rm^%S)ifEMJd<~=hU3#;&iN6wtlUwx zkGCgq%1#P<cMqdY^ve!WvThr=>lo(u<YXb|R^PhU%~^nZaH!(c+XKjNmEwu2Bg~lU zQ+KrG)2CuzpIsi=z<^o;1r(U)pB+=(H(gP1_K{(5F4%pZoLcya$eE5KMM|`JoU0%u zEm8Ci6?DDu+fELNk1VaVot=fuu?O>TiLl$PinR2xDNhox-()kH$L1xDYZSXuXmbQJ zwHcj_S|vp|W#DBQJiy7YI~5U3qmafQ^s^BpNMWH)m+cFq${k<~eu+I`_T7l_m}bf8 z9o59@Z$}9KP(!<7&!TuGS$zpw#T}Ps=8`hQeH6flv`mSvBw86{`~H(ZosUArc4No_ zqtuLm7QTz|<_ulfq!2?xdz><*d+h`wNUUtW;Kq=!Z!T0?ftH`Co=-}Y$5i;N<>nVn zGKV)|WCf33c-C_lxURl)Aze;}V3ID4>&1t8!fyza)v(*AO*6*qt*3fUuHFwAH+)ZW z8FSR_U!qNQj;9l}Ozt$=jare75=2uRDz4JgsAqw3A?iY`%$ojY9-SUoNVkyo)zKhG z8&4BisYj(IR7V;boE%oLQ+LCWYx65UL_c)XN_(;!;sB%85p1<A=(S^7vu}S@iaBqL z89~=+NV7*N)ronyYbuUv+rBAd{%&JIs+k@OE25=x6UC;DA_MxCbuJquh;;^}$PhtW z@07*&mSrLJgf!anobYw{!_l2xmjt7g{PuVUu33{VDkx=Tv47~LpK?WFW1g>!V4_#~ z!@_D`PZSK<qEDJ)u25zp7T2xl=GlU`SqI69jD?|DY)BS9`D~FJ_WDE+w>%=;t6rN1 zB@s8BY}v?d6-=OAI+HdC)5!kad0!J<nne@yL=;Y6aStIi;VCaA!9CtcaYMj>sT5zS zm2|KgV&z7o=z^Lr@{@V6Tz;*bu3jx_R@Y;JS{J59O{hq%GHK|umn!!qMRE8EP4@K> z*C{iC%ZoURqUsnd_o)aPe^`wJAbr{ji@$1mAKiEJSOF~O#q_JI56i#aX(>U#9B5?U zZ|jtH5dRiTz9+v=cH8y<rf*OSbM?^rfWZsr*4h59J_p$DR_;>ke0H6@|Fz_+V@C`U zlLBmf)Kt{4@KB2s5hqpLIfWxXMOlm!5yw>8nshNeN;nt;sa>LyfrubsV1R*=^lh!q zP!J_zaLjUb=o>Pm<PAiewJRGWtbSV#GAVd@4&LCT1)*K7g!1{mM>ENhY%h`YV+}fz z$8nnQVVBPNAaNJM;kn-qrfwrPFVgakGSaeBQqy(Ejx27oerYJzv#Yad-uf6~j$p~# z2l>wNFmPIk#KE9)nm>j!_m~Bum$Vv#PJc_3tT2zvp?P+|pfjVUIc5@LXT+)OkawCz z7C(j9(y%*?A$EQtMp%A4FG^@$B**;9Cp)4lv{NVcDWR)vcjeM$?RFmYvm!Z0pRh#a z{?nao>V*9qKIw9)P|BPIOjNa#xG@D;AW}ye$^jA;$dy1TU^qh~9@4K2p_C<yM^2>_ z-jMhQnB4=}<~|Dc{HaqH)Jf@F>(=Gb+g3paRkr?qq{CDQ77#ook$Oh#*Vv4_Fy<<5 zY%SV}szvU!a?8YWPUUnmS!Iug4V8zOwf3?2<n{J4)#ih;vs)66r+Spky;-Fagk7aG z$bd5wzj;UCtSrIG_1CBOsJ6ZgO*Prd^hh;3q4?p+4Vw%PLY<WTUG1_&jb^s(eMc2f zD4xsL>spnH@dZ-0*4y=9ipn4H<=^8UoIi6D#MUF6qAbVqaW)f%J6GF4`qP#opIWem z{aoNdPJh-gen3m*RIx6{pMh4V52sKz8I*~)YYU~!bA+^tm=)P41xKHpBTpgNRQJzS zKXSSnWvOjO2GNi=x!=hwh6zyX*CL~CMa<73;l7$mBSp%sH1$yl6Cu$`lp?3u`gh_r z=GB>JFOyPwUP~|~3%ey->oagUUGiE{S(;L%p9jD2skekn3A3<On2;awg`u603{_L4 ze;tlirB!MIXC3B}w~oTlQj4>knXre&X2#>B8F1DNu(TY;aK=5FWn9vVV%6+bi;_Zj z$x8<eQNW|kp=VV9R+CTgQCZqk4cm8>+@X~;j9J=cXakU&6=4@g+ec|bzM3;RUsX{S zUsi(H<Tr7qQkg|9%dK?gw8?L6$UK_2SrBYi!ulOAz(p?THY2(wfi{=v46!+m>N>xe zkf&uH!#a=KmL6nIw<#Ar^Yb3~BLDbAVe1v?9uX%e`IO;%q;8?x2@I#O9cAEslcK~G zRU;$?OjsVZqP1ju9u-xh7fFuv&Wbw+BN@3GW#L%l7<AOEv`M*Qk+m9S0*+*1ol>d7 z!<_aZLE#cL2c4tU3BR9)d4{q-khr4;T@K|&sEc~EVAMIR^$y}?-u!HIq;%`)VS}h& zU1s<%P3@kADFfUhDz+V`H(_~&O6{oWeJE-qCCnQU?E#u2{7(Py)v%!(?hvVzvHcR> z2&vS#&ymiRfwQA|g7e|ziJ`cB?w-m`YwEF&-G_k%lL?~um$1dGlov|c<gec-(yOpk zDa755(1i$erWO`vwx!tG{z>BgjJ6o3IUq%;^}F&@ep01uKUEAVOgIa$)KYQc4!{^} z+J><2!pFy+3*F49*JRAlQj?seNNqx|e@A$$X!0fh#>r1yhgF)IB-aZ+t0O-?$1dz( zEWc%wF17pk8;{>E$kc`TwW5sw8pQwmF34Z@>3_)ge(iz4|A;S&l*zADD8~=kS}TLe zLZS1A4*_jB=-Q-ZA(0VGgY-@cCUn0BdLwsWy%-EnX1m+E^z5Jb*HK9-?A4Nfo4$dp zpdV0RsBHm9+BB$!Wp5CEUV>KrVs@>B%(i>Xw001t(^q2Jmvs>17x=P^`;NS-gW?fL zsvG$6grUL+R$T~_w<NmovOg<Qz6%~noSKwUJDvuXdW{|Se_vqf^`1%!RDN_w{C(`g zj#S+zfD{aiS%YoeOPKM7Cvjq)o*d%*D{wzGjwE;KOza4QPVYDz9Uo^H=X9X#mPMbb zDJAf&e`gKX%NKN*3LVHOaLv=i1ziUga0-KN#WfTMx^`01&Bka8v`jX7b~kgZ{q=uP zzJL6ULiE|pe)Sio+h5}!j%xiI+y6dhZ4xyO>CcZIIGtU12%-sM<LMiOOHhDcgB+ft zBHfQ48nH)mvZ#3vz@yA88J@HG42zd>_nj{b0QH)h9aY;O>GF;JcKU-69K3<R-MgwR zt^8%AUKCRktoPmWh7wZNMhw_9o2@YB%!(8uUOu!1UQ0uTJ2u#p;FzM@p^uslX-Fh? zky<T}8u*n7Vt>g5Lk$9ot`xbkv^%HR?R!cezutTfky8Ed{{G9YlJSTCVNicenht>u z*XWDqPK5bKisBD`!p7h)%g{(Q4JBl?uTG_UW+qnf5+HE$ygh(Dab;wBD8M~pYmB52 zEDTdkYbNRFdh}#!(fAJ2a>=sWgfeb*4crArMTo>o#YD-k>yUtM)XH0oa=UZ0A)nC_ z#d+KFvh~<&dll3B^(y@ez<IY4KaCz^fK=Kd<$=HBT>>6=0+`%epnn#hdBTz%RTyCS zC%a!frYuOVk!*jsfU=<^<o>s+BNk%+lGva)fr?-PykZt=V1@8ffT<p6dl%M_<e0c< z5f}@YBz}Fv1|LIPLvB_Q{5(JuAXU!f=;Ax38|B_>c=AMNEecj%>@z%_)hXyf()@iR z#lnb3Mpf2s^l9h<X`)QD6>dWlG{PHU(!^->Q(@NlkceWWTIoL36QpZA=6TZ(3cr`@ zk=3VXcVe3ZA_d-;_|b~k@!yS;;O<}*1q3y&1JYPVfrB1ITqxOc3W`jIBzvW)?n?=t zVkeW?3{HTRg<f*VM#R8Z7*t{vxr^^mz`?Y{5z<@6;>^attV#TsiSpx28dP>96$$)8 z6g-6`hm#`xlryz-v2~6E7Z6g<Yam2=*hGFbyG>$23i~vp;oo4yPJKC$nO7Bm<w;3w zksJhCd&QRDiL#0jR2uIk(1)!{YNRmNEku!KGRJ8UB>IRi1l#yB6q0owslr<!Iy79M zGsP<S7lGMe%b3DxsE&n5_4o;{b)G}5t1TByXm1S(FL3qQ4CBE)Eh$?53>=JrTCysV zs|RZ0D^jo<lBTP%C#@7@HNa*yQCX@~^lCT$aRP3X?S&0*PHXW0@%4?3nQq&bl}g37 zlZtKIwv#uuZB;6^ZQHhO+qPL@XWw(W``q1q_lNZZ)_k6|)|_*UImR!Jll5r#BgcAu zQL}>*p&0wd`b-UAg{T7Q_jg30u{`!sED+S8y?wxtTYI?y`own+$%cF_9|P1YD!Lev zMX}cFWpTI?Fo*-+$gt*q88<^3X3fPLNbQ9iOzkCG;UTQ%(ml*gstM!W%@mb_R1Oqb zTA{(CDNKmaMe-Ok;oLppVl2tWF3fLf5_oHno7L{j-1Sczk1=R$Q0y+S{&{6Aa=b+b zIwweL2lRhtk1m!=PpUwXILoaY(ijs{_NO^H(9_Z|qG0XWDo^=JSGcd3Od}>bqFEJV zFb1bbA1j0!#YFhn?_wi<BUNze8PSN$xjE~Td3x@Da76<(UYE6mY!T3&)?iHNN)OW_ z0h+e}^+`u-p^t0idWv>9`BdR7qpK}vMeX5Nd>*384JHt~g$h@4p|{(D@q2{l`xJ(h zxkzo_8bWnhBb@9mj?}-&lFfNw&rQwNzgZ?WxiBSG=>K8-^~|f9m}bSjWZz<-Uio-i ze-4EAijAkExO?Ey>IGpGp;NpjI2tt%cJXcD&B|0K(4;YM@T{yhar+hW<7`<X<#3ow zT9Qn4Hq_{caam~+{M!f3HtKhvU)g1N5J#lFe^R=C=}mpgq<ZT@dQ%Wwu%IUm*Gn3% z;uENDgkE>Vvn69oY^;-?UNr4=`7u8QUDyO(;2lW22pD>tDJb_ufq8pOkD0VV{<fMR zt=O=Y{*!RMMZm~26wZeS%OUrXn>qM&&2YaGI7qT6DqQ7)kx(b8wpJ$fa@O(C$ywYg z<D(N$sSsGX>4LR@XE4EFUfedh=`Fs8KWNWMze)#a@!if+?)8f<<_jzCb(SC5=|a`g z=XUQ0y$=I`+=1tu>q2MtD^fJ{S;q(6)R#K8xDSThR);o$p@a+Z!qPL~i<o}%BLZNT z;A1-ve@K)ujB&%Rz-W&wHibXb?RVrX(VoOwc5LO8q0AIe5uGg5oH#e%vy2>vfKv#g zo%RD+B6;O6`mxM}aqnj5qU6o71SN($MM;(o6)fz{p4yp?pzyNg%Ztm#W=C~4MQ<a_ zl98Yr`K<o1xe)@bTq8M-S;2NVaU<r|G3i*+JEGJ-a#{{J)?4#B*Pk9hj&s4*=qG33 z@=>uvY#T_|CskZHt-dSS)z(|Os6BIDJ`o~MsYY&2l4^gVbAu&>jg!q7srANapsH#` z2+?W_c!34!w7;i$j9goG1%ufVz)Kj*aG7qt1C2<y;|&5Ng`V2j!5-{>Ukn>7MnOxd zmMkBlJVsWnk=1l~ZJW#?oU7T&Ap~3eCSukUS7d<hBC-g157E>nZL-NCK8!1H7zN|L zPjj3`L6eZKN%@6tyYJ$t%)S<*Uge6k2Z`MHa3)z`%iU_vQ2_6_E&QqZ&u;o(PgT=f zE8)i1+br>w`%wMQxzE3!Dn%oEXEOt%|1G-{J@KU%fh^KB_N}ifxAGoHbM+bg$4vC^ zIlAq|`9l2YnvD3~zLvj)i}tKk>ui@C>}S{3vbL&hzC|^U*d^?xPREs%c+wtWeWwQB zOQ{>mwscio7%^N&)Qe8Npj4fy2hTIqKEzTlj~fGj-_LBM#1KxSlhS9=qCqP;xt1>A zbhFBQO2A)7QK_<^&Vb7*rHSCZYGCKVo>xb>%-Dh`IHLeJX{c&=ZX%J=r=>7*$$e%+ z$7yYc0NCML$K*`Rhg69qvD?^2wQOwz-BtGx9@_cQ?%HfKWRQCQU*!6)Fijh<WRiS^ zXyj{g{6m=RZA|R-tYmDya0ipWhU@K(4F85^XUL670Q19_v!qc~hJ@VM!T;zW#?=fs z7QR7*5fX?m_Q;Y7bTX`~8<!!{*^zw)$@~HL>-W|!Yp~V*wlF-c)`qaM(_Gcn6z#Xi zYSirCtx-mJl>UIqa#Znr%SvhY4Q~8tjGS2(vrC~<f*2{K8YI~*To%BS|7?s*11AYG z=0xyz!-N<@DR)Nchas2JqXaaP@hLYUyNWH_)K>nHwWAE%F$PwUfN=<vG=&vO-<=XH zgPWeT<v_E|I^O_?%V_D$iBjqKja88U_N-L763#ou;<KO0k;-}q!(okt>AMNJ-W}Q+ zT*%Tf3!$Z6Bpwv};!e)6+O8Qak4r!44^6b>6_ZHx_Y1%S#625QLJMd(-*BUrQZuFZ zNOkZjRU?Zcjn{v0YX6G<EhVl=>sQoYzt%s{l;rGf9BmA2EdTv`YDG#yekt_?ngFc4 z7QmYAjv$~ja|l{%a#WfS1rdme3Z%Kyq2RWGxFVg9`R(ZYJbCfn96U5DztII`!uh~y z`K#1J8sJ{CFh>5C^#94!S}m|vA!l?N%l!-xAJz#8n*JaPBigZ6R(6S9EF3rD;4MYg zLpQ@Pi9H&`G*hBy52@orPkZb3ACET@8RLpOpAtOok}CA)sW$bNC@5h05oE4~J~JPD zDg^7={{hDuoW{GJE1lJOHTfUIc7N^Ov7f)Q>1*egU+W*F#T1OpjST*~v{<C{UjYc% zQfv4?K}OqM?dTyClRp=rG;`9>2hWYKpP&Cao!@XJq{5(j2D&}lZIYk<l|yUZYe9qW z*&f|>WGU6b<X$j5vi^Vs&&)bWLs-QY22c!T`p~_cjtRDltE30DLk3TW)z(Ivdx@jy zA)1dkj4UXNBVp)`uDwxQ`qGVsG9od^!i?2Z*^hiE_g2TMQ{1Nn6j7M2NtiCn!bt68 zo0TXluGPNwWwaVKZF>A|s0)WkO`7eCWCj04ll;fs|36IX*ez>B`7bpaU?^lYK<F&M zY9_Jqdjm+vLNZe@1cVh#{d(%$MIjYUTbj|#J;Ynpls*CdO|R>PAchGn6zi%QVrL5D zIQv~1#;^B}58!SuE;0Ow2qFctTFY9?8q2zMBl4Q~xME#W9}kFg$b7H4I$91NXc0l6 z8RY2#y<}}Vn3K*G)`%5)qqeHnLf(4KAeyK0yUp|X*t~4kiLp%VOh-)FOx`t{D?Fx1 zEGr+W4W~dKN8ieNQRDb*e0Xm|c9m<jp8yIMkor~+V@Rrcsv$0H7#ZnLwaiuIkp@k{ zRjm^ZPgp;|bY1bH%GkqH+3fXs_9;i;6~+SLkg11Ang=Ickf5725Arg#R-#%`Blm<w zX_RkHXk+)GvbFpxj>|sQp<>ub;wR|x*;tao5aOewQp`+F-FO{UwV^tyy8SSb+?-hv zhR-gFI}({@EVJaaL}|gjE+Sj!HCgk`=iranorJ@bM%a%iAP4~VOc}^zkTZV$$}~+N zOVK%GWeiHQ%&#AAFOaGI3@0$5&<hx3s<~S~DOS;ABpky{jjW*~I?yH4iF+8Hgt_Yk zS|f<e;ONzUERlwzDfJg_fs%FeBhW}(+s4)2izBS}mI`R}0>H21w9^PR%FaE7?FXwz zp)JOvm(U6D3_?BA>2E{4ZQBb~H|6qdN-kXHH$6(Peb9Ln7G&!mrb6?$OHk~qRlBVQ zR1^&&$fCfolyRd}6mj8L3%PJ@G~Kv#wTE#AYX7r0@Ymrp82d16{5p8&U+W+0*Z(5& z|EKPn(SKb&$ii25s$JROzKUqNwh*x@cG(Fk=@QU6Y61Xrie_donr`8c8p56x?)5v@ zr-xr$KvZ<s(|6OP;e9w!k8kx6OGU&-Js<GTKUU#ExfoR`!?_`~N?SRB_3ratd#sV3 zw|v1j*eIb&RM0BG<EDqnl43?5xEp&Dm)t0<|2ld85GfX841{5twY+h3Z>>^Lan;x9 z6lNOM@aC7YFpBdtw)5r12g|QJ&J8t+2bX^<W34>k?y|m)Uf37E@gMg7S5jbPFK+mM zgf#-<EM({9-~+enF06A@T1Fthj}na5lA#Px4)%kaA`!$0--o5nS}pEcx3MGpHuZNI z<|aS);B7}SOs2Dp6-chbF*?xP@i02HdVhSp!05t0Nhde2M_6m>F%A@t8?O>6($o8u zkyPp}{<hj~^<f9fBhG7eO#9xOvrtLf<VS{locqppn;ZChGt`hu&K2ID|4ojMQr2er za<BLh>c0F(&ZlKj%gLCNOC3MwJ7vrf3yUVkHOI#Mo=Z<-_r3(tS>ss)W(`h2rls4X z`Ef-<dnql%#rzwcb~eK(?0YhU@}zNl>4@-Fm^r^%)!?j48kDEvTG>eC?{g<02eYX= z4SJ_mtL;FawC@}7UC8dGB}m1m&twgZSIYxJnkf9c#>}fRnO)e|nxQF=CQa*FO9FT= z)M{*2JJ4ykEFG34be6iCz0~V0wnM#I>qyDZpK2iP>MPdGdK=ms>$lvin5RnbUtFF& zQn5x-Qo8IPe#6cxa2LiFBT_=$=CW%$v-h>`7m+2Rc(mfu#w7|T7LIbcS8M*=<j00) zmiON9T<ixP3R`8KnFOgcD?oq_p-2MV=3AuP+;_gnh(QsPxKEKF_H<$oT#(u@e>H-2 zh7n%;kRo(nKYorHM0{jBnVpwoA|FrU04_?hVQ@ha42HpI{tn;+cKO9%1>#W-v-Y1G zFv2Oa@d}Wl>y>f{tm%pfP30xQX^YCteU5_*RB=Zdg{8*EcmcpK7zq!l44d%p6$Gep zYgW19rG)ux5_Ue5gSI{@X!Mz<uO+|C3U6^*ywJ}Z=Fdu|;&{7Jl@&FPdp#(c`TZ<n zHC@4V%=aYyX^pOtE*@81tt-MzGF+)2+)wX@Zt%cAW3IEnKU1!CWcp3oy7KEu{+<A* zR&u?ue+hwBqx@rTp=9v4K8=N^h7rbRms#vwVbR(w3znA42@A_C^ddcIFUO!nQ;Pst zUWNe<uz1`YOEd|7QjMK_OwM--iqL9Ef?VOt1s0=l`XBtlK6V+JO6cEtd7t^cU!;3J z9VSQ2R+%?=_Pw&6*r(nfJKb*PNV7m~DR^#nG|yuWNbmqPMZVKZOr9HHaGm%;X+|x= zkxh{I(s-Q#He)v|>YapRE=GSc1J}HgeXgJu;F#8T1S6cDbE?-%c4+>17G+-{dwDQJ z4<F%;*f&u<J<CPmSu`&NfxZbfUm_)DLB4!Qyg@%fElh#1l8pgl{@UrI;yM;2#6|3Z zgE}Jo&JEx{u7R}YA!!~uU?Uo%^?F7L1Ysp0z?+F)qC4$NNo<o9Lw+=Kt;K%zQi~`O zS_YbN=F2W(#-6_p_hpR>*EBOkdAm^ccL_{G6lpA(6Jn-3UL1-L;WElc@x2&vv{7V> z4K+!N4H4r&F>9qmI1v+W6jI0#j^DpG3KwGfng>NC-VztRLy#?e2oX~#=BP6xT&IPc z6X_4W;3C=MF!*jD&4MFi_+pSEMU}FQc*Yvb{*u3XynU)hkf@a>hlhPv9U&>nl*+=8 za@g27SOIytXgDvIyooD`j<)~O7IB|w>yn;)`e;amy@e?=v~NkcvC^p~qPK$#WEL?L z?*C(EBWZj(F(uAIbz0%X(1v4O*0d-F^%bM@p^ZR<LNXa}7|*m`%atId__02#M3Pd) zxin{x&uOqU{o$qvpEeI@gcp=0${dd_pdxb>CeytcjFq-R<8Thm3s=<KDc99l%XhQT zJ5H7KMz|pc29y`+NqG}k<j=JzEe1!j4v-dFGWE)nugQ_;sDuK<TSF#;JYeiq3L}&} zU3{EQ=F4#eI0rQnSlrPEc?jpM@97-pQdWWyCJHV>2?8>9dRNjQ8Sln#&S&lLQ34Kk zk=15!CPiKV6LeE>G6)A3h*Gk$TuCPelZ|Qb$xf@iI7|-ZPeZ#mYJnB;!L$A;0u1VC z6X(=7KEyqsWyCrbc<;e<7y*&S3CqN&aHQ^O%SA$|<d33}g%v!h@%A312^v_I>EWwO zDdPo%gMrEQCKvuRnk3L1G~KZ3G;=dw394kIO)3Ob3hVYA2TczNPS;=^$D&?G;F04S z=+v1j(9-EMb>-p>r_ZmbG89z2rE#Pk+SBFW##!vWpp3{n+s?=_gv0r?d<3UAejbph zrbDMU`Sez`#H8z5^!reOJ-ek2I_%k-QrFL~e$@@==KOVHByDJaA7X2tYo?Y*`Q+ja z>H5#v&BdF@>W;7{$2axtuHfRXT`wFwaK|5MOrFJiHokwr@f<Rxxe;9B;zt{l$Am>J zkzhE9{h)?M%c*f$-TQ759c?PJKF}bn$vRyz&r4ROv&IauS|b9PVa5jX&YUz!$5d?v zPx#mtM%8(Y?%6X|Y9R;(OwCRttzut2Uw$Bi#WHyjIq}<PAi!NE&ge$M@_JOou|Bs5 zy9Dw&Fv+;r_qEqX*d34OAM;(4rInA7=$(&RhY7RGJCB^g9@VC6gcag;QWNFM=47v{ z5Ajo^CdPaAO8uN4SjlHRDQ%6|RMWQvpP)f;-l<qdX*fjD;xR)ESj#<ufWzD2$eE`* z%IGhSI;qqfpJ0VBz-&m17EE30$-i4<=%5p%IvZCsJ0oeY6ben2Bg)%SSVK+FJR(5A z^{~HrzDx{e3PfPO3cLtdt7pWTJY+aLyM$D++G*ZSE|E({g&^f9*Jxm-wtw)qbCQ3} z7+%{>mIbBS_G?b?M&hy^*(TYKb(`Fv&Rbe%SDwgF1$My+_42?!VY#bE(f$SGnN#3! zn3xbD0F%N%gNW^N?W5&WH^Wb6D4&a@@eS$a`=0~|yW!M%o)iW$K{P#D`Uuaru+EFd zPP!W0%Y<Co?M$g16~%NiO|uvdNJ^Z5gveeAjU2xAKGR*H1y0L__vv7;QmO@@C=2Au zkWm+Uo;K+N3o3n4w}ia*QF-kHvZ~qyC`WSqDS2Z}<CL695|zCsps{d_P5JnMx0VCK zY;h0yOPg+t%-=&-gI-+CZr~R|MHa}L2&OsHboB+AqrjV76e7t@de7@_gK>Db)4-Xp z*-+Tm`zIwK=`6798N0@g5E|W#ke}eCA;os^4TRv~AP1TsW#2DF3(lC7_V`<G;SaYF z(t|}$mcbe0O<K75pC0K4WC?tWqWggYZ`jwz(fYNyY(O3I4r-Ccfk=~qW$3`tbz#|h zu&e#Z;cc`6tv%KLs8rW^__v9z{ETe>jk$80%nt72A*OCu+Bm)7mM+JqdWT&-?Zb5n zX)2N(jw<Vy1vu2B_g$AYp-k`VU}Fdpd%!%|{CRK|KAraVD;e7+?nukNLy&W;k3svc zXwT~wFUKFQ8Wpcrnb$tGG}VLEU}z`=xWeh@i{Vhkn597u;5Qlcn8OljeU5K{Q;Ei@ zF`pLpsKMi}c}a;c-8L5)?j^Up<gU>+JQ%G-y&ei_fquL)lN^8HgoB#mNekiQenrEr zpaB|qHTxuW$^I-R(?kHXnV(;=x^gF8gw|&3Etf!^n!B9oQ!lq+n6`e1v8gPLf=ZEk zvmz+HmvRdTZ5bu6S`kcM$s}j^!Ba1%sd+rDUlz<#O{nZfm@yX8^}3%(j`mI`8qD`} z5#2<#$M43&i9@4pLWAx*T<^LW8f;HH&}byb^*Q)<`%)|`>R{AKOhX0SnNy&=Ubeyf z+L6c%QrE!fy>yrhmJMnkDd8FkIu(OQN)_gb8(cQsRCnz?<mfMB4_#!cxW^KG1O)~y zsUgP9P-pWHo{dX8`pj5KCGPhnEn+1B!^MAwOF-9)G3~-2<!>R^b7cB9%!zU3Ea>yU z<Rbvlsz*D&Iq;^6!>(gbyYU-9u8JjXg)X|clvyuAW>SApcZRa)RQXa=2%G|(N?T<r zlvrmcxy>6|#Vh1l%V17X8{{_%8+X0UgIYJJX1UYN*%Mok4cWPG5KePQ@xcIso~-T= zR*uK0GqXJX%avmbh?+i>7<~*20nH1ur?b6mKj&rB8FKuYVZn(pt{9M7L!&)3{}iP_ zl-+#lMLk^i*B;p<DE_$=58JRpdmR}V(B@vMw2D$*!)=2PEOy6@SUb;m#JIvPHrZC0 z($92HA-;iBDHfDEDO0P`HjvorHGbgWn8#|?#Br`nfaMgzy%V4s@3+MV_wRQ~f-u5( zW;nHC7F5UnL2TnznI>Jbcz+joDmufpqo9b_m&ZfjFjZfSouMsbK2zd)f?{Zu!;@25 z(S@b_TGLwgaxP!aj$V2M!%WfwIIMdi_4-6BEb-10c`p(ZtjNn*oUw(eY+z<eG2sCa z;lptfbQptpnupF%f7b|)<;7sRBUw}Ks=u7&nv99J)8RB;V<N{=Wgpc-N#40dSvhby zzul93t~CSuY+cS(U3Ol%%Q?8YDQqzhm7;W!dMy=q+WUL*xhnokDd~&HT>AwUvVT>W z|5uFu-y-w>QjPygJ{4^YEQ}n*j4W-9?1{eQ&#k|DJ!X22Hvg9H%}`vkMp8xA8p^!c z9_gpg+5ZkBjZZWgtxGm7nO)x!y*n7Pz$W0^H1f=ZaXQ|-XQ%8f(e<+`LdbVsqCzR3 z=N^xY%h%oQRJuM_%jEnwRsq?m-xJSk<Kw19RF}ugfa<r&ykrqLn$+RlSoe;~ek_T0 zvu$c5aw&}F@^eawcB@^AP5Da~>C`z;W9V^=W)fYt1PQV;C!fw;t0N@Rt1&X2>}2ad zv{0rEKf`|r@n?@g?H5&+3u|vfVOuG?@^{L$Hl7*tm*O_#i6>(Jf>n>yf(D#v*VodR zU{)a8h5eanRmEc`jiv<M0c_e?ERf+nTdO(T5pQW#woqDEfY@rOSTHDYSGsnheSHpg z+nJA7ltCNYft73m5ckkb+9XV@G6qdMm9qPLRN$qOO<Muk6|17c!vm5!pDRh$+jKH; zGgQ-nI^`nmq;PGHZ8gFSGEFKB7BMS^qCpAQbCPGy`kD0ur8QFu8)In^oN}o9qruNT zY_r0|wFOb<x(}x~ZQkI-gCQ8&_yn`A7Ign}x_OCmjt@X5)rQEi@Pv$79X6AI>ZC_# ztikK0vkJZ%TVxV7wBC5{&q#H)aBV2jYs5dBjG?2cN71k6dO3K&sFAr--5#iwl=Z%d zR|Zns&rl-F)jw@_ys-s;zG6EYamUL9gdJ*MV>s<6sn{R|ZIPEe@K{0~TQe8OmDC@J zGC+SxWQ)SFpalLYnz;4O5)h~vQWZczw_rfDm_@QsfHtfPbzJ3e6-&?d3|Pe6!+gm0 zGRErd4D-)e7n#jm4m5_d65I;K4<vt8gIpH{jN|)Vty}_OarKwo!xEP8*&-JCJQoB? z^wTn{#9oNdFPc+4kJ#I0Q-$i^NakCwx-4J7-nY?(rioEY)2y;4b;=VKED#lT_|Xi; zW#vRsyi>c!ulh7VcuAzSH$gZ^WVN#vdv^$%M!>w<fh#5tVn0Cq!h*7F`mIo|aW>xn z#-00+jKW)eXrl5yobZc4r>pu@HNDqnc*jL*8!nd{e^W>34e8D`)aVVT>Q_uXG(54W zZ*2ItJx_9(F)I$l=Wi?y^Q*+^dQ3e}KS<VChZUimFldZ^eOPwK+lN**hb%~#0z;-p zggv4bJ)y##Yj|2e!8Z?BI^~B~l;mAydmsVq!sKzx7L7P$X=V7)irhZv)%1}!2+;D% ztXlUfriQ#2rW$`yC!)~_STQX6sWYTL|E-^*rk5i=2L8n{LHb9m<!`6`U;OkARSR3i zA(Ri5L{FnX-+x_KLy*8iL{edt`TH}G5Tm2{DgHr_41gRK6hr&tOBF&na)^)$Hcdj5 zFP_R&Af4(jx=un9z|^RLO&3jGf8rR(n=v9)l)+;>Tgb~fm-1#-w56@(ZwV#AnesM$ znYmGCGWBQD#kq>-?dhcMTjFjw)YDJpLE|7OBQfzAxoGDepYZg_QDeTIY$(ne$sTL8 z(VC$E(HhmBC9UL;A!M$~Z3qzAR=EH#8YSH>UtpT?9v+Y_TRq%P^0cCTAX!Q_vH%lg zuCso8w9{&x(W#L`4aiKFT@W->y)Ldt;T2Df9?9GBB&}!I#{|A__Ae+ao=YLszI{fT zADK`S&z(r}AXOBu6CpgLj_gmsq^-#9mD?~t4b&-OrZM5TlSD9~IPu|)u51~Lv)>C& z3=P{75sL3^py2$yAgK4Ck`*a`96ng2bQ&^c8+`{5v~sjLl^OrI-$?C#OLyi<5B>vf zWs&~ql~KshG%;m!wm^`|lZ|p&Z&^vL&)B74xE8*iixT#mTVKS%0fDzTZW3L+gwI6c zY5~dJxS-qesU93_X--aqLE^RU&0XMZ^wDM}T-Q}Hol*JYtE|+)V{s(ch<lXEl9^xs z$Va#fAS`hmOp+1`SL$EN2)-{Q=n<nZ@yI}xHM@O7Y~m6Q(X?CF*cJgxTQr@Yo;^Xq z!HE!N_}OeA!yn$mLļ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 A=Kufz diff --git a/graphics/AtlantisJava/lib/ostermillerutils_1_05_00.jar b/graphics/AtlantisJava/lib/ostermillerutils_1_05_00.jar deleted file mode 100644 index 79be1c0549dbce8d17fe99aa94815a442b81dc33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34346 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 diff --git a/graphics/AtlantisJava/lib/test/fest-assert-1.2.jar b/graphics/AtlantisJava/lib/test/fest-assert-1.2.jar deleted file mode 100644 index dcd667e53566009670eb087365eb064727f1525a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89901 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 diff --git a/graphics/AtlantisJava/lib/test/fest-reflect-1.2.jar b/graphics/AtlantisJava/lib/test/fest-reflect-1.2.jar deleted file mode 100644 index d33ddb65349ebd5b6ee159a2cf7d569bf7f5d4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37208 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%0DX)y0o)U;4(#N*Jt_MWgdCi`%FGOoUVC* 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 DWLVZo diff --git a/graphics/AtlantisJava/lib/test/fest-util-1.1.2.jar b/graphics/AtlantisJava/lib/test/fest-util-1.1.2.jar deleted file mode 100644 index c5f608bfabb4b04653c0c6384e9a4ad28aba2d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18962 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 diff --git a/graphics/AtlantisJava/lib/test/jcip-annotations-1.0.jar b/graphics/AtlantisJava/lib/test/jcip-annotations-1.0.jar deleted file mode 100644 index 9ca41331f9d84cd668a8620850fdc5b1724a10b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmWIWW@h1H0D<%f6EiRaN^ml;F!;KLIO=-(x#|Bq#lR2%RmuTY`sf$azBr)LEFcyE zVz^RYM?X(D*WeI6U$@V`XHNTg>*`(P_14uocjo-&AcHH$51tmCaTY4n@$fn45z5fT zsCxE`Pvy=z-9f_MLBS<+wH#mhe&u<@d!}SEkB_KHllNzl8so{`pSrcXy@QIoMQuJ$ z`f5_SvtlRQJ(x~s0lFtIwL~B0VoVjBP!(CpnFV;1i6SdY%*)F!Ni50C&nt#&frP~w zomf3?Mh1p0K&*mGi+gEeQA%oxQ>9*VPGWI!>jZ!QLk<E*?<Xwm>iY5gk)x_yM_i6g z^`(d@EJvoiI(j)s?W|d<_bpw{__NLO2l!KEY#7*u_^p3$`dppA>GR*uKUp7$9oL(s z#}_LjxXO6yG#`tdyWXj0E!z_^^M>@TnAt!20_4+D<qF-GA2ONeHMPI;kHP-P1ud5s zn1uQNh!wAz@@cQ(%+Rp(WeRiF9$lGwm^)N%^VBD&&(_*M<&>5_w_GP+>*cT2{Vh@V z`RB7MMa_<7j5h2P^8YRW#MHagMEnBpy|_bp_tob}Z;KOp`Eu6657YLmnuJem4m>nb zH6~}yrYOhR4l7RFoHTc`b3uS;sN>u9yKYR|t(xU7@tj%IO?G$pruM%_g%>wA$HSrt z5|~R8d)EB|2I4w=f$5o>TUwHsl#>bz%=2E%h62a-uUxx2H2do_$JKIGB_H2-ZfI?) zKedbNk!G*+$w|Im=Fu-!SAJlu(RjJ0{o3KC#*-<}em|9-@qYe!eTM56eFYK=r5|=& zsQdOb=JSOJwGy|=I5yLbHB(o%D$P+@%B}W1JXqr8J*(%<T*r1d6%@uBZVb(nTD?`^ zer4>lH%#?+1pHpl3^}`8#wA~Oif-zMR9o{6F_BA8OLE`wxqpoLP^Inc0)db?r*Hoq zkKL2nD`MakCwKW`^Nx9ze1*%-zB%8n6!*UQ!rcfvU!!Y{7go>R6d5$%A;TkQp%t%5 z{d=)(s^6DLd)^bQ{VsbXBbonq=ur!YbXL@`+j3KO?>}JJZ3Bj#2CjtYmtPW+QIwjP z5}cTZ6n=*tz~OiC*ZObI99P+X$@l;aKPSg*&&3M!w!Mrn&nfrbr1|Bl%@2lJjlxF< zwOC?i%)R-y?lbS1U!VUnA5gu;*vGVmNk({9a(D{o{j9?+-!A<8p_^<fyE=TI$JHP~ zzeR_tY@e&oeckymJ9}<;ob_zsbML*>OirD1`l{SwuBZ7d$JT#6$MUN_Yc@$%UzGMv z<&wO&_SvsC@6{Ds6B=KC{Jg^7Vs)DGw<a&ul=t!}PkQ{qnAk2pHjum1oqc^1|792b zI@2c)=g$?0lD^&Ud8$*rL`ywa?5eUrmQb{YKkwJ~yBl*)%Kqe4dEc?`H&c?y#`eFT zj#?aeD2^J2s_hRd{s6;n127C#afKmf0Q!0Z6JXo@E7vmqW&ji5Do6s%Xl;^Dm1g}o zWm)psNol9^wq4l&?4bMwdDU}O1-3d89%{z#jo%;0*=J|R81pb<k@Cf<7D5^Rmz0c4 zvSm3-u2j2KnO)2;nfYR>m_;YI{F|nExp~X`^7i;Q^O=3!dEjU4Nf*E0l}qYdGbYSR za<sefChEbKd4X25gA?{{y|nJZN%60DE(B&Sz2=>?V`bbi=f=%dX3Gv}{GajWe{)Z8 z`q^2IlJ>SMF52$?X49%+SoU+dV*jdEjuP$j$1|PO3WDFx$nvgbY-GEyJ7sy}v-7tP znH`r4S3NF!tvp_lBlk_>{xclx7Jt|RycwB9m~mGkz%T>?0fx7ZAR1mzK&lj&R_v7u zNCOBgY19UiaIHvH3_i<2)c^#5EZ+@eLMjEAo!F}dgpRvV9neYww>D5U0RbS3Sbzx! zWD!^!YNY`)0(-RqGh|7lIW8m6DiMV5v6r0)6I+;YI0~&KMK=+>L_wH%fEkC0Sjrc4 hQ&rLO7{XK*Rvf0H=ePiGRyL3}P9Q7;dd?Zl0|0#=814W7 diff --git a/graphics/AtlantisJava/lib/ws-commons-util-1.0.2.jar b/graphics/AtlantisJava/lib/ws-commons-util-1.0.2.jar deleted file mode 100644 index 3fc364e7f605b580850530c281998a1f861cc0c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34407 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 b7v1ZoM@AeJ>=!c8%a=P00KlB<uiyS3FvepM diff --git a/graphics/AtlantisJava/lib/xml-apis-ext.jar b/graphics/AtlantisJava/lib/xml-apis-ext.jar deleted file mode 100644 index a7869d68aacd655c782bb373c7334e5ff667ca58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85686 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 KSr6gFI^h3trdb>S diff --git a/graphics/AtlantisJava/lib/xmlrpc-client-3.1.jar b/graphics/AtlantisJava/lib/xmlrpc-client-3.1.jar deleted file mode 100644 index a76e6ec96dd62265a199eb3ab72c54b7ebb99368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45124 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 J03a6D{{SgA>IVP- diff --git a/graphics/AtlantisJava/lib/xmlrpc-server-3.1.jar b/graphics/AtlantisJava/lib/xmlrpc-server-3.1.jar deleted file mode 100644 index bb64a504ee8997cca1f08ae0814b6cdf90d0cdbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75310 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 G0R4YsfpO>n diff --git a/graphics/AtlantisJava/share/InteractiveServer.py b/graphics/AtlantisJava/share/InteractiveServer.py deleted file mode 100755 index 1b1adeb2a9cd..000000000000 --- a/graphics/AtlantisJava/share/InteractiveServer.py +++ /dev/null @@ -1,483 +0,0 @@ -#!/usr/bin/env python - -# InteractiveServer.py -# -# author: Zdenek Maxa, UCL HEP group (zdenek.maxa --at-- hep.ucl.ac.uk) -# -# CVS location: offline/graphics/AtlantisJava/share/InteractiveServer.py -# -# Interface between the Athena Python interactive prompt and the Atlantis -# event display. This server script takes over the interactive prompt of -# Athena. The Atlantis user can then type Athena commands directly in the -# Atlantis dialog from where they are sent to Athena through this server. -# Commands: e.g. changing/querying job options and executing .initialize(), -# .execute() and .finalize() methods of algorithms, etc. -# -# -# setting up Atlantis - Interactive Athena: -# 0) get_files InteractiveServer.py [from 'run' directory] -# 1) athena -i <job_options.py> [launch Athena in the interactive mode] -# 2) theApp.initialize() -# 3) execfile ("InteractiveServer.py") -# 4) if the server started successfully an info message is printed and -# denoted string has to be copied into the Atlantis Interactive Athena -# dialog (Atlantis menu: File -> Interactive Athena) -# -# Once the InteractiveServer is started, the Athena prompt is taken over -# by the server and the user can no longer access it. The server can be -# shut down by Ctrl+C after which the interactive prompt should be given -# back to the user. -# -# -# setting up for Athenaeum: -# argumentInteractiveServerNoAlgTools = True -# argumentInteractiveServerServerPort = 2323 -# argumentInteractiveServerServerKey = "someKey" -# execfile ("InteractiveServer.py") - -# Multithreaded version, modification made by Julius.Hrivnac -- at -- cern.ch -# Athenaeum commands can be executed in several parallel threads. -# Unlike in the single-thread version, all stdout and stderr output -# goes into system streams, so into the server log file. The result -# of the "remote script" should be put into answer array so that -# they are given to the client. - - -# --------------------------------------------------------------------------- - -import os, sys, math, traceback, random, time, StringIO, getopt, md5, base64 -import SocketServer -from SimpleXMLRPCServer import SimpleXMLRPCServer,SimpleXMLRPCRequestHandler -import cppyy - -class AsyncXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): pass - -# --------------------------------------------------------------------------- -class InteractiveServer: - """ """ - - # <configuration attributes --------> - debug = False # debug messages to print (False / True) - keyLength = 15 - minCharValue = 33 # ascii table range (generating key) - maxCharValue = 126 # ascii table range (generating key) - minPortNumber = 2000 - maxPortNumber = 20000 - maxAttempts = 5 # number of attempts when creating the server - resultLengthLimit = 400 - # </configuration attributes --------> - - # other attributes - serverName = "" - serverPort = 0 - key = "" - server = None # XMLRPC server instance - - vxTool = None # access to vertexing tool (Athena AlgTool) - visTool = None # access to JiveXML (EventData2XML) (Athena AlgTool) - - keyForbiddenChars = ("'", '"', ':') - noAlgTools = False # if False, AlgTools will be initialised - - # answer in a multhreaded invironment are passed in the global array - global answer - answer = {} - - # ----------------------------------------------------------------------- - def __init__(self, noAlgTools = False, serverPort = 0, key = ""): - """ """ - - self.serverName = os.uname()[1] - self.noAlgTools = noAlgTools - self.serverPort = serverPort - self.key = key - SocketServer.ThreadingTCPServer.daemon_threads = True - - # __init__() ------------------------------------------------------------ - - - # ----------------------------------------------------------------------- - def makeServer(self): - """ """ - - try: - SimpleXMLRPCServer.allow_reuse_address = 1 - self.server = AsyncXMLRPCServer((self.serverName, self.serverPort), SimpleXMLRPCRequestHandler) - - except Exception, why: - print "\n%s\nCould not create the server on '%s' port: " \ - "'%s'" % (why, self.serverName, self.serverPort) - if self.debug: - trace = traceback.format_exception(*sys.exc_info()) - traceString = '\n '.join(trace) - errorMsg = "ERROR:\n%s\n" % (traceString) - print errorMsg - raise - else: - print "XMLRPC server created" - - # makeServer() ---------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def generatePortAndMakeServer(self): - """ """ - - alreadyTriedPorts = [] # already tried port numbers - - for i in range(self.maxAttempts): - while 1: - self.serverPort = random.randint(self.minPortNumber, - self.maxPortNumber) - if self.serverPort not in alreadyTriedPorts: - break - alreadyTriedPorts.append(self.serverPort) - - try: - self.makeServer() - except: - continue - else: - break - else: - # for loop iterated through exhaustion of the list and wasn't - # terminated by the break, so the server wasn't created, notify - # the caller by raising an exception - raise - - # generatePortAndMakeServer() ------------------------------------------- - - - # ----------------------------------------------------------------------- - def registerMethod(self, name): - """ """ - - methodName = name.__name__ - try: - self.server.register_function(name) - except Exception, why: - print "%s\nCould not register method (%s)" % (why, methodName) - raise - else: - if self.debug: - print "method '%s()' registered" % methodName - - # registerMethod() ------------------------------------------------------ - - - # ----------------------------------------------------------------------- - def runServer(self): - """ """ - # this will probably have to be in a thread if the interactive - # prompt is to remain at the user's disposal - - print "Waiting for requests..." - try: - self.server.serve_forever() - except KeyboardInterrupt: - try: - print "Stopped from keyboard, exit" - print "Closing InteractiveServer:", - self.server.server_close() - except: - print "can't close the server" - else: - print "server closed" - except Exception, why: - print "%s\nException occured" % why - raise - - # runServer() ----------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def execute(self, param = "<empty>"): - - print "execute(param = '%s')" % param - resultMsg = "SUCCESS" - - try: - exec param - except Exception, why: - trace = traceback.format_exception(*sys.exc_info()) - traceString = '\n '.join(trace) - resultMsg = "ERROR:\n%s\n%s\n" % (traceString, why) - print resultMsg - - return str(resultMsg) - - # execute() ------------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def get(self, name = "<empty>"): - """ """ - - print "get(name = '%s')" % name - resultMsg = "SUCCESS" - - try: - result = eval(name) - except Exception, why: - trace = traceback.format_exception(*sys.exc_info()) - traceString = '\n '.join(trace) - resultMsg = "ERROR:\n%s\n%s\n" % (traceString, why) - print resultMsg - return str(resultMsg) - else: - return str(result) - - # get() ----------------------------------------------------------------- - - - - # ----------------------------------------------------------------------- - def callVertexFit(self, tracksId): - """Track IDs (tracksId array) are passed to vertex fit algtool""" - - print "callVertexFit(tracksId = '%s')" % tracksId - - cppyy.loadDictionary('SealSTLDict') - - g.std.vector(int) - vi = g.std.vector(int)(0) - - for i in tracksId: - vi.push_back(i) - - print " calling vertexing tool: vxTool.fitAtlantisTracks(",vi,")" - - r = self.vxTool.fitAtlantisTracks(vi) - if r: - resultMsg = "SUCCESS (get updated event data)" - else: - resultMsg = "ERROR while calling vertexing tool" - - return resultMsg - - # callVertexFit() ------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def executeScript(self, param = "<empty>", pid = ""): - """Execute Python code snippets from Athenaeum plugin""" - - errorMsg = "SUCCESS" - resultMsg = "" - - try: - exec param - global answer - try: - resultMsg = answer[pid] - del answer[pid] - except: - resultMsg = "No resultMsg" - except Exception, why: - trace = traceback.format_exception(*sys.exc_info()) - traceString = '\n '.join(trace) - errorMsg = "ERROR:\n%s\n%s\n" % (traceString, why) - - return resultMsg + "\n" + str(errorMsg) - - # executeScript() ------------------------------------------------------- - - - # ----------------------------------------------------------------------- - # the only method which is exposed (registred) for remote calling - def process(self, digest = "", request = "<empty>", tracksId = ''): - """ """ - - print "\n\n<incoming request> " + 50 * '-' - if self.debug: - print "process(request = '%s', tracksId = '%s')" % (request, - tracksId) - result = "<empty_result>" - - # generate message digest and compare - md5My = md5.new() - md5My.update(request) - md5My.update(self.key) - myDigest = md5My.digest() - # received digest is BAE64 encoded, so encode mine as well - myDigest = base64.encodestring(myDigest)[:-1] # without list '\n' - - if digest == myDigest: - # determine the nature of the request - # request 'runVertexFit' -> pass tracksId to the algorithm - if str(request) == "runVertexFit": - result = self.callVertexFit(tracksId) - - # request to process Python code snippet (e.g. from Athenaeum) - # multiline request - # tracksId is the client identifier - elif len(str(request).split('\n')) > 1: - result = self.executeScript(request, tracksId) - - # get event data from JiveXML - elif str(request) == "eventData": - self.visTool.execute() - result = self.visTool.getXML() - - # two last characters must be '()' if it's a method to execute - elif request[-2:] == "()": - result = self.execute(request) - - # if the request contains '=' - it's an assignment to execute - elif request.find('=') > -1: - result = self.execute(request) - - # it's likely name of a variable to evaluate (or wrong request) - else: - result = self.get(request) - else: - result = "Request not processed, keys (digests) don't match" - - - # don't print out result messages longer than resultLengthLimit chars - # in such a case print just the beginning and the end of the message - limit = self.resultLengthLimit - print "result to send:" - if len(result) < limit: - print "%s" % result - else: - print "%s" % result[:limit/2] - print "\n+++ %s other characters +++\n" % (len(result) - limit) - print "%s" % result[-limit/2:] - - print "</incoming request> " + 50 * '-' - return result - - # process() ------------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def generateKey(self): - """ """ - - # generate keyLength characters long key - random.seed() - while len(self.key) < self.keyLength: - k = str(chr(random.randint(self.minCharValue, self.maxCharValue))) - if k in self.keyForbiddenChars: - continue - self.key += k - - # generateKey() --------------------------------------------------------- - - # ----------------------------------------------------------------------- - def printInfo(self): - """ """ - - print "String between the quotation marks to copy & paste", - print "into the dialog:" - print "\t '%s:%s:%s'" % (self.serverName, self.serverPort, self.key) - - # printInfo() ----------------------------------------------------------- - - - # ----------------------------------------------------------------------- - def createAlgTools(self): - - print "Getting vertexing AlgTool (ToolSvc.VxWrapperTool)" - # self.vxTool = \ - # theApp.toolsvc().retrieve('ToolSvc.VxWrapperTool')._itool - self.vxTool = \ - theApp.toolsvc().create('VxWrapperTool','VxWrapperTool', - cppyy.Pointer(g.IInterface)(0))._itool - - print "Getting JiveXML AlgTool (ToolSvc.EventData2XML)" - # self.visTool = \ - # theApp.toolsvc().retrieve('ToolSvc.EventData2XML')._itool - self.visTool = \ - theApp.toolsvc().create('EventData2XML','EventData2XML', - cppyy.Pointer(g.IInterface)(0))._itool - - # createAlgTools() ------------------------------------------------------ - - - # ----------------------------------------------------------------------- - def start(self): - """ """ - - print "Starting Multithreaded InteractiveServer:", - try: - # generate key if it wasn't specified as a command line option - if self.key == "": - self.generateKey() - - # choose random port before creating the server if the port number - # wasn't specified as a command line option - if self.serverPort == 0: - self.generatePortAndMakeServer() - else: - self.makeServer() - - self.registerMethod(self.process) - # self.server.register_introspection_functions() # what for? - - # don't initialise algtools if --no_algtools command line argument - if self.noAlgTools == False: - self.createAlgTools() - - self.printInfo() - self.runServer() - except Exception, why: - print "Exception occured." - print "Reason: %s" % why - - # start() --------------------------------------------------------------- - - -# class InteractiveServer =================================================== - - -# --------------------------------------------------------------------------- -def getArguments(): - """Reading arguments when executing by execfile()""" - - # default values - noAlgTools = False - serverPort = 0 - serverKey = "" - - if globals().has_key("argumentInteractiveServerNoAlgTools"): - if argumentInteractiveServerNoAlgTools: - noAlgTools = True - - if globals().has_key("argumentInteractiveServerServerPort"): - port = argumentInteractiveServerServerPort - try: - serverPort = int(port) - except ValueError: - msg = "Incorrectly specified port number: %s" % port - raise Exception(msg) - - if globals().has_key("argumentInteractiveServerServerKey"): - serverKey = argumentInteractiveServerServerKey - - return (noAlgTools, serverPort, serverKey) - -# getArguments() ------------------------------------------------------------ - - -# --------------------------------------------------------------------------- -def main(): - - try: - (noAlgTools, serverPort, key) = getArguments() - except Exception, why: - print "Exception occured while reading variable arguments, exit" - print "Reason: %s" % why - return - - server = InteractiveServer(noAlgTools, serverPort, key) - server.start() - -# main() -------------------------------------------------------------------- - - -# --------------------------------------------------------------------------- -if __name__ == "__main__": - main() -# --------------------------------------------------------------------------- diff --git a/graphics/AtlantisJava/share/MINERVA.jnlp b/graphics/AtlantisJava/share/MINERVA.jnlp deleted file mode 100644 index f3e3897fe74f..000000000000 --- a/graphics/AtlantisJava/share/MINERVA.jnlp +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- JNLP webstart file for Atlantis event display for ATLAS --> -<!-- MINERVA version --> -<jnlp - spec="1.0+" - codebase="@CODEBASE@" - href="MINERVA.jnlp"> - <information> - <title>Atlantis event display for ATLAS</title> - <vendor>Atlantis team</vendor> - <homepage href=""/> <!-- should be used from codebase --> - <description>Atlantis event display for ATLAS</description> - <!-- <icon href="files/goofy_favicon.ico"/> - <icon kind="splash" href="files/logo.gif"/> --> - <offline-allowed/> - <shortcut online="false"> - <desktop/> - <menu submenu="Atlantis event display"/> - </shortcut> - </information> - <security> - <all-permissions/> - </security> - <resources> - <j2se version="1.6+" max-heap-size="512m"/> - - <jar href="lib/commons-cli-1.0.jar"/> - <jar href="lib/Jama.jar"/> - <jar href="lib/jas-aida-dev.jar"/> - <jar href="lib/jas-aida.jar"/> - <jar href="lib/jas-freehep-base.jar"/> - <jar href="lib/jas-freehep-hep.jar"/> - <jar href="lib/jas-jas-plotter.jar"/> - <jar href="lib/jas-jel.jar"/> - <jar href="lib/jas-JMinuit.jar"/> - <jar href="lib/jogl.jar"/> - <jar href="lib/jh.jar"/> - <jar href="lib/oncrpc.jar"/> - <jar href="lib/log4j-1.2.15.jar"/> - <jar href="lib/ostermillerutils_1_05_00.jar"/> - <jar href="lib/wired-base-4.0.beta.3-SNAPSHOT.jar"/> - <jar href="lib/ws-commons-util-1.0.2.jar"/> - <jar href="lib/xercesImpl.jar"/> - <jar href="lib/xml-apis.jar"/> - <jar href="lib/xmlrpc-client-3.1.jar"/> - <jar href="lib/xmlrpc-common-3.1.jar"/> - <jar href="lib/jlibeps.jar"/> - <jar href="lib/xmlrpc-server-3.1.jar"/> - <jar href="lib/commons-logging-1.1.jar"/> - <jar href="lib/commons-codec-1.4.jar"/> - <jar href="lib/xml-apis-ext.jar"/> - <jar href="lib/batik-dom.jar"/> - <jar href="lib/batik-anim.jar"/> - <jar href="lib/batik-svggen.jar"/> - <jar href="lib/batik-css.jar"/> - <jar href="lib/batik-bridge.jar"/> - <jar href="lib/batik-parser.jar"/> - <jar href="lib/batik-xml.jar"/> - <jar href="lib/batik-gui-util.jar"/> - <jar href="lib/batik-script.jar"/> - <jar href="lib/batik-transcoder.jar"/> - <jar href="lib/batik-svg-dom.jar"/> - <jar href="lib/batik-extension.jar"/> - <jar href="lib/batik-codec.jar"/> - <jar href="lib/batik-util.jar"/> - <jar href="lib/batik-swing.jar"/> - <jar href="lib/batik-ext.jar"/> - <jar href="lib/batik-gvt.jar"/> - <jar href="lib/batik-awt-util.jar"/> - <jar href="help/help.jar"/> - - <jar href="atlantis.jar" main="true"/> <!-- look for main class here --> - </resources> - - <application-desc main-class="atlantis.Atlantis"> - <argument>--config</argument> - <argument>configuration/config-MINERVA.xml</argument> - <argument>--debug</argument> - <argument>DEBUG</argument> - <argument>--source</argument> - <argument>http://www.cern.ch/atlas-minerva/MINERVA_tutorial_events.zip</argument> - </application-desc> - -</jnlp> diff --git a/graphics/AtlantisJava/share/atlantis b/graphics/AtlantisJava/share/atlantis deleted file mode 100755 index d9e99ce0a1c3..000000000000 --- a/graphics/AtlantisJava/share/atlantis +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -# running Atlantis in the Athena environment - -# Check JRE version. Workaround because "java -version:1.6+" does not work on lxplus -JAVAVERSION=`java -version 2>&1 | grep "java version" | awk '{print $3}' | tr -d \" | awk '{split($0, array, ".")} END{print array[2]}'` -if [[ $JAVAVERSION -lt 6 ]]; then - echo "Atlantis required Java version 1.6 or greater" - exit 1 -fi - -ATLANTISJAVA_HOME=`dirname $0`/../AtlantisJava -java -Xms128m -Xmx1024m -jar $ATLANTISJAVA_HOME/atlantis.jar $* diff --git a/graphics/AtlantisJava/share/atlantis.jnlp b/graphics/AtlantisJava/share/atlantis.jnlp deleted file mode 100644 index 39612b50c59d..000000000000 --- a/graphics/AtlantisJava/share/atlantis.jnlp +++ /dev/null @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- JNLP webstart file for Atlantis event display for ATLAS --> -<jnlp - spec="1.0+" - codebase="@CODEBASE@" - href="atlantis.jnlp"> - <information> - <title>Atlantis event display for ATLAS</title> - <vendor>Atlantis team</vendor> - <homepage href=""/> <!-- should be used from codebase --> - <description>Atlantis event display for ATLAS</description> - <!-- <icon href="files/goofy_favicon.ico"/> - <icon kind="splash" href="files/logo.gif"/> --> - <offline-allowed/> - <shortcut online="false"> - <desktop/> - <menu submenu="Atlantis event display"/> - </shortcut> - </information> - <security> - <all-permissions/> - </security> - <resources> - <j2se version="1.6+" max-heap-size="512m"/> - - <jar href="lib/commons-cli-1.0.jar"/> - <jar href="lib/Jama.jar"/> - <jar href="lib/jas-aida-dev.jar"/> - <jar href="lib/jas-aida.jar"/> - <jar href="lib/jas-freehep-base.jar"/> - <jar href="lib/jas-freehep-hep.jar"/> - <jar href="lib/jas-jas-plotter.jar"/> - <jar href="lib/jas-jel.jar"/> - <jar href="lib/jas-JMinuit.jar"/> - <jar href="lib/jogl.jar"/> - <jar href="lib/jh.jar"/> - <jar href="lib/oncrpc.jar"/> - <jar href="lib/log4j-1.2.15.jar"/> - <jar href="lib/ostermillerutils_1_05_00.jar"/> - <jar href="lib/wired-base-4.0.beta.3-SNAPSHOT.jar"/> - <jar href="lib/ws-commons-util-1.0.2.jar"/> - <jar href="lib/xercesImpl.jar"/> - <jar href="lib/xml-apis.jar"/> - <jar href="lib/xmlrpc-client-3.1.jar"/> - <jar href="lib/xmlrpc-common-3.1.jar"/> - <jar href="lib/jlibeps.jar"/> - <jar href="lib/xmlrpc-server-3.1.jar"/> - <jar href="lib/commons-logging-1.1.jar"/> - <jar href="lib/commons-codec-1.4.jar"/> - <jar href="lib/xml-apis-ext.jar"/> - <jar href="lib/batik-dom.jar"/> - <jar href="lib/batik-anim.jar"/> - <jar href="lib/batik-svggen.jar"/> - <jar href="lib/batik-css.jar"/> - <jar href="lib/batik-bridge.jar"/> - <jar href="lib/batik-parser.jar"/> - <jar href="lib/batik-xml.jar"/> - <jar href="lib/batik-gui-util.jar"/> - <jar href="lib/batik-script.jar"/> - <jar href="lib/batik-transcoder.jar"/> - <jar href="lib/batik-svg-dom.jar"/> - <jar href="lib/batik-extension.jar"/> - <jar href="lib/batik-codec.jar"/> - <jar href="lib/batik-util.jar"/> - <jar href="lib/batik-swing.jar"/> - <jar href="lib/batik-ext.jar"/> - <jar href="lib/batik-gvt.jar"/> - <jar href="lib/batik-awt-util.jar"/> - - <jar href="help/help.jar"/> - - <jar href="atlantis.jar" main="true"/> <!-- look for main class here --> - </resources> - - <application-desc main-class="atlantis.Atlantis"> - <argument>--debug</argument> - <argument>DEBUG</argument> - </application-desc> - -</jnlp> - diff --git a/graphics/AtlantisJava/share/atlantis_online b/graphics/AtlantisJava/share/atlantis_online deleted file mode 100755 index 1d9cace7cfa0..000000000000 --- a/graphics/AtlantisJava/share/atlantis_online +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# running Atlantis in the TDAQ online environment -# This requires the TDAQ_JAVA_HOME to be defined in the enviroment - -JAVA=$TDAQ_JAVA_HOME/bin/java - -# Check JRE version. Workaround because "java -version:1.6+" does not work on lxplus -JAVAVERSION=`$JAVA -version 2>&1 | grep "java version" | awk '{print $3}' | tr -d \" | awk '{split($0, array, ".")} END{print array[2]}'` -if [[ $JAVAVERSION -lt 6 ]]; then - echo "Atlantis required Java version 1.6 or greater" - exit 1 -fi - -exec $JAVA -Xms128m -Xmx1024m -jar $EVENTDISPLAY_SW_INST_PATH/share/AtlantisJava/atlantis.jar $* diff --git a/graphics/AtlantisJava/share/ntupleXML.h b/graphics/AtlantisJava/share/ntupleXML.h deleted file mode 100644 index c1282f14004b..000000000000 --- a/graphics/AtlantisJava/share/ntupleXML.h +++ /dev/null @@ -1,1351 +0,0 @@ -//ntupleXML v1.0 - Tim Martin - Aug 07 - tamartin@cern.ch -//Classes TopViewXML and EventViewXML to output ntuple -//events to a Atlantis readable xml file - -#include "TXMLEngine.h" -#include <TChain.h> -#include <TFriendElement.h> -#include <TFile.h> - -#include <iostream> -#include <string> -#include <sstream> -#include <vector> -#include <iomanip> - -//Main class, TopView and EventView classes inherit from this -class ntupleXML { - protected: - std::string dataTypeCon, etaCon, labelCon, pdgIdCon, phiCon, ptCon, typeEVCon, mainTreeName; - Bool_t FR_Active, TR_Active, FRA_Active, TRA_Active, TA_Active, isTopView; - Int_t nParticles, Warn, truthPref, Append; - TChain* activeFile; - vector<TChain*> fileStore; - TTree* activeTree; - TFriendElement* friendTree; - TXMLEngine* TVXMLEng; - XMLNodePointer_t event; - Int_t FR_eventNumber; - Int_t FR_runNumber; - Double_t FR_MET_Final_ex; - Double_t FR_MET_Final_ey; - Double_t FR_MET_Final_et; - Double_t TR_MET_Truth_ex; - Double_t TR_MET_Truth_ey; - Double_t TR_MET_Truth_et; - Int_t FR_El_N; - vector<double>* FR_El_pdgId; - vector<double>* FR_El_p_T; - vector<double>* FR_El_phi; - vector<double>* FR_El_eta; - Int_t FR_Mu_N; - vector<double>* FR_Mu_pdgId; - vector<double>* FR_Mu_p_T; - vector<double>* FR_Mu_phi; - vector<double>* FR_Mu_eta; - Int_t FR_Tau_N; - vector<double>* FR_Tau_pdgId; - vector<double>* FR_Tau_p_T; - vector<double>* FR_Tau_phi; - vector<double>* FR_Tau_eta; - Int_t FR_Ph_N; - vector<double>* FR_Ph_pdgId; - vector<double>* FR_Ph_p_T; - vector<double>* FR_Ph_phi; - vector<double>* FR_Ph_eta; - Int_t FR_PJet_N; - vector<double>* FR_PJet_pdgId; - vector<double>* FR_PJet_p_T; - vector<double>* FR_PJet_phi; - vector<double>* FR_PJet_eta; - vector<int>* FR_PJet_BTagged; - Int_t FRA_El_N; - vector<double>* FRA_El_pdgId; - vector<double>* FRA_El_p_T; - vector<double>* FRA_El_phi; - vector<double>* FRA_El_eta; - Int_t FRA_Mu_N; - vector<double>* FRA_Mu_pdgId; - vector<double>* FRA_Mu_p_T; - vector<double>* FRA_Mu_phi; - vector<double>* FRA_Mu_eta; - Int_t FRA_Nu_N; - vector<double>* FRA_Nu_pdgId; - vector<double>* FRA_Nu_p_T; - vector<double>* FRA_Nu_phi; - vector<double>* FRA_Nu_eta; - Int_t FRA_HadW_N; - vector<double>* FRA_HadW_pdgId; - vector<double>* FRA_HadW_p_T; - vector<double>* FRA_HadW_phi; - vector<double>* FRA_HadW_eta; - Int_t FRA_LepW_N; - vector<double>* FRA_LepW_pdgId; - vector<double>* FRA_LepW_p_T; - vector<double>* FRA_LepW_phi; - vector<double>* FRA_LepW_eta; - Int_t FRA_HadTop_N; - vector<double>* FRA_HadTop_pdgId; - vector<double>* FRA_HadTop_p_T; - vector<double>* FRA_HadTop_phi; - vector<double>* FRA_HadTop_eta; - Int_t FRA_LepTop_N; - vector<double>* FRA_LepTop_pdgId; - vector<double>* FRA_LepTop_p_T; - vector<double>* FRA_LepTop_phi; - vector<double>* FRA_LepTop_eta; - Int_t FRA_Lepb_N; - vector<double>* FRA_Lepb_pdgId; - vector<double>* FRA_Lepb_p_T; - vector<double>* FRA_Lepb_phi; - vector<double>* FRA_Lepb_eta; - Int_t FRA_Hadb_N; - vector<double>* FRA_Hadb_pdgId; - vector<double>* FRA_Hadb_p_T; - vector<double>* FRA_Hadb_phi; - vector<double>* FRA_Hadb_eta; - Int_t FRA_Hadj_N; - vector<double>* FRA_Hadj_pdgId; - vector<double>* FRA_Hadj_p_T; - vector<double>* FRA_Hadj_phi; - vector<double>* FRA_Hadj_eta; - Int_t TRA_El_N; - vector<double>* TRA_El_pdgId; - vector<double>* TRA_El_p_T; - vector<double>* TRA_El_phi; - vector<double>* TRA_El_eta; - Int_t TRA_Mu_N; - vector<double>* TRA_Mu_pdgId; - vector<double>* TRA_Mu_p_T; - vector<double>* TRA_Mu_phi; - vector<double>* TRA_Mu_eta; - Int_t TRA_Tau_N; - vector<double>* TRA_Tau_pdgId; - vector<double>* TRA_Tau_p_T; - vector<double>* TRA_Tau_phi; - vector<double>* TRA_Tau_eta; - Int_t TRA_HadW_N; - vector<double>* TRA_HadW_pdgId; - vector<double>* TRA_HadW_p_T; - vector<double>* TRA_HadW_phi; - vector<double>* TRA_HadW_eta; - Int_t TRA_LepW_N; - vector<double>* TRA_LepW_pdgId; - vector<double>* TRA_LepW_p_T; - vector<double>* TRA_LepW_phi; - vector<double>* TRA_LepW_eta; - Int_t TRA_HadTop_N; - vector<double>* TRA_HadTop_pdgId; - vector<double>* TRA_HadTop_p_T; - vector<double>* TRA_HadTop_phi; - vector<double>* TRA_HadTop_eta; - Int_t TRA_LepTop_N; - vector<double>* TRA_LepTop_pdgId; - vector<double>* TRA_LepTop_p_T; - vector<double>* TRA_LepTop_phi; - vector<double>* TRA_LepTop_eta; - Int_t TRA_Bot_N; - vector<double>* TRA_Bot_pdgId; - vector<double>* TRA_Bot_p_T; - vector<double>* TRA_Bot_phi; - vector<double>* TRA_Bot_eta; - Int_t TRA_LQ_N; - vector<double>* TRA_LQ_pdgId; - vector<double>* TRA_LQ_p_T; - vector<double>* TRA_LQ_phi; - vector<double>* TRA_LQ_eta; - vector<double>* TA_Tru_p_T; - vector<double>* TA_Tru_phi; - vector<double>* TA_Tru_eta; - vector<double>* TA_Tru_pdgId; - vector<int>* TA_Tru_barcode; - TBranch* b_FR_eventNumber; - TBranch* b_FR_runNumber; - TBranch* b_FR_MET_Final_ex; - TBranch* b_FR_MET_Final_ey; - TBranch* b_FR_MET_Final_et; - TBranch* b_TR_MET_Truth_ex; - TBranch* b_TR_MET_Truth_ey; - TBranch* b_TR_MET_Truth_et; - TBranch* b_FR_El_N; - TBranch* b_FR_El_pdgId; - TBranch* b_FR_El_p_T; - TBranch* b_FR_El_phi; - TBranch* b_FR_El_eta; - TBranch* b_FR_Mu_N; - TBranch* b_FR_Mu_pdgId; - TBranch* b_FR_Mu_p_T; - TBranch* b_FR_Mu_phi; - TBranch* b_FR_Mu_eta; - TBranch* b_FR_Tau_N; - TBranch* b_FR_Tau_pdgId; - TBranch* b_FR_Tau_p_T; - TBranch* b_FR_Tau_phi; - TBranch* b_FR_Tau_eta; - TBranch* b_FR_Ph_N; - TBranch* b_FR_Ph_pdgId; - TBranch* b_FR_Ph_p_T; - TBranch* b_FR_Ph_phi; - TBranch* b_FR_Ph_eta; - TBranch* b_FR_PJet_N; - TBranch* b_FR_PJet_pdgId; - TBranch* b_FR_PJet_p_T; - TBranch* b_FR_PJet_phi; - TBranch* b_FR_PJet_eta; - TBranch* b_FR_PJet_BTagged; - TBranch* b_FRA_El_N; - TBranch* b_FRA_El_pdgId; - TBranch* b_FRA_El_p_T; - TBranch* b_FRA_El_phi; - TBranch* b_FRA_El_eta; - TBranch* b_FRA_Mu_N; - TBranch* b_FRA_Mu_pdgId; - TBranch* b_FRA_Mu_p_T; - TBranch* b_FRA_Mu_phi; - TBranch* b_FRA_Mu_eta; - TBranch* b_FRA_Nu_N; - TBranch* b_FRA_Nu_pdgId; - TBranch* b_FRA_Nu_p_T; - TBranch* b_FRA_Nu_phi; - TBranch* b_FRA_Nu_eta; - TBranch* b_FRA_HadW_N; - TBranch* b_FRA_HadW_pdgId; - TBranch* b_FRA_HadW_p_T; - TBranch* b_FRA_HadW_phi; - TBranch* b_FRA_HadW_eta; - TBranch* b_FRA_LepW_N; - TBranch* b_FRA_LepW_pdgId; - TBranch* b_FRA_LepW_p_T; - TBranch* b_FRA_LepW_phi; - TBranch* b_FRA_LepW_eta; - TBranch* b_FRA_HadTop_N; - TBranch* b_FRA_HadTop_pdgId; - TBranch* b_FRA_HadTop_p_T; - TBranch* b_FRA_HadTop_phi; - TBranch* b_FRA_HadTop_eta; - TBranch* b_FRA_LepTop_N; - TBranch* b_FRA_LepTop_pdgId; - TBranch* b_FRA_LepTop_p_T; - TBranch* b_FRA_LepTop_phi; - TBranch* b_FRA_LepTop_eta; - TBranch* b_FRA_Lepb_N; - TBranch* b_FRA_Lepb_pdgId; - TBranch* b_FRA_Lepb_p_T; - TBranch* b_FRA_Lepb_phi; - TBranch* b_FRA_Lepb_eta; - TBranch* b_FRA_Hadb_N; - TBranch* b_FRA_Hadb_pdgId; - TBranch* b_FRA_Hadb_p_T; - TBranch* b_FRA_Hadb_phi; - TBranch* b_FRA_Hadb_eta; - TBranch* b_FRA_Hadj_N; - TBranch* b_FRA_Hadj_pdgId; - TBranch* b_FRA_Hadj_p_T; - TBranch* b_FRA_Hadj_phi; - TBranch* b_FRA_Hadj_eta; - TBranch* b_TRA_El_N; - TBranch* b_TRA_El_pdgId; - TBranch* b_TRA_El_p_T; - TBranch* b_TRA_El_phi; - TBranch* b_TRA_El_eta; - TBranch* b_TRA_Mu_N; - TBranch* b_TRA_Mu_pdgId; - TBranch* b_TRA_Mu_p_T; - TBranch* b_TRA_Mu_phi; - TBranch* b_TRA_Mu_eta; - TBranch* b_TRA_Tau_N; - TBranch* b_TRA_Tau_pdgId; - TBranch* b_TRA_Tau_p_T; - TBranch* b_TRA_Tau_phi; - TBranch* b_TRA_Tau_eta; - TBranch* b_TRA_HadW_N; - TBranch* b_TRA_HadW_pdgId; - TBranch* b_TRA_HadW_p_T; - TBranch* b_TRA_HadW_phi; - TBranch* b_TRA_HadW_eta; - TBranch* b_TRA_LepW_N; - TBranch* b_TRA_LepW_pdgId; - TBranch* b_TRA_LepW_p_T; - TBranch* b_TRA_LepW_phi; - TBranch* b_TRA_LepW_eta; - TBranch* b_TRA_HadTop_N; - TBranch* b_TRA_HadTop_pdgId; - TBranch* b_TRA_HadTop_p_T; - TBranch* b_TRA_HadTop_phi; - TBranch* b_TRA_HadTop_eta; - TBranch* b_TRA_LepTop_N; - TBranch* b_TRA_LepTop_pdgId; - TBranch* b_TRA_LepTop_p_T; - TBranch* b_TRA_LepTop_phi; - TBranch* b_TRA_LepTop_eta; - TBranch* b_TRA_Bot_N; - TBranch* b_TRA_Bot_pdgId; - TBranch* b_TRA_Bot_p_T; - TBranch* b_TRA_Bot_phi; - TBranch* b_TRA_Bot_eta; - TBranch* b_TRA_LQ_N; - TBranch* b_TRA_LQ_pdgId; - TBranch* b_TRA_LQ_p_T; - TBranch* b_TRA_LQ_phi; - TBranch* b_TRA_LQ_eta; - TBranch* b_TA_Tru_p_T; - TBranch* b_TA_Tru_phi; - TBranch* b_TA_Tru_eta; - TBranch* b_TA_Tru_pdgId; - TBranch* b_TA_Tru_barcode; - //Protected memeber functions - template<typename TYPE> - std::string asString(const TYPE&); - void SetBranches(void); - void FillBranches(Int_t entryNumber); - void SetActiveFile(Int_t fileNumber); - void GetFullReco(void); - void GetFullRecoAna(void); - void GetTruthAll(Bool_t onlyMuons); - void GetTruthAna(Bool_t onlyMuons); - void GetMET(Bool_t getTruth); - void StartXML(void); - void FillXML_ParticleDump(Char_t* nodeName, Char_t* storeGateKey); - void FillXML_TruthDump(Char_t* nodeName, Char_t* storeGateKey); - void FillXML_MET(Char_t* storeGateKey); - void EndXML(Char_t* outputFilename); - public: - Bool_t ntuple2XML(Char_t* outputFilename, UInt_t entryNumber, UInt_t fileNumber); - void Add(Char_t* fileLocation); - void Clear(void); - Int_t GetNfiles(void) { return fileStore.size(); } - Int_t GetNentries(UInt_t fileNumber); - Bool_t SetWarnLevel(UInt_t warnLevel); - Bool_t SetTruthPreference(UInt_t truthPreference); - Bool_t SetFilenameAppend(UInt_t filenameAppend); - -}; - -struct TopViewXML: public ntupleXML { - TopViewXML(Char_t* fileLocation); - TopViewXML(void); - ~TopViewXML(void) {} -}; - -struct EventViewXML: public ntupleXML { - EventViewXML(Char_t* fileLocation); - EventViewXML(void); - ~EventViewXML(void) {} -}; - -//Constructors// - -TopViewXML::TopViewXML(Char_t* fileLocation) { - isTopView=1; - Append=1; Warn=1; truthPref=2; - mainTreeName = "FullReco0"; - ntupleXML::Add(fileLocation); -} - -TopViewXML::TopViewXML(void) { - isTopView=1; - Append=1; Warn=1; truthPref=2; - mainTreeName = "FullReco0"; -} - -EventViewXML::EventViewXML(Char_t* fileLocation) { - isTopView=0; - Append=1; Warn=1; truthPref=2; - mainTreeName = "CollectionTree"; - ntupleXML::Add(fileLocation); -} - -EventViewXML::EventViewXML(void) { - isTopView=0; - Append=1; Warn=1; truthPref=2; - mainTreeName = "CollectionTree"; -} - -//Inherited public methods// - -//ntuple2XML takes an entry from a file loaded in the internal File Chain and writes an -//atlantis xml file for the event. -Bool_t ntupleXML::ntuple2XML(Char_t* outputFilename, UInt_t entryNumber, UInt_t fileNumber) { - - if (fileNumber >= fileStore.size()) { - if (Warn>0) { std::cout << "\nntupleXML: Error cannot access file #" << fileNumber - << ", " << fileStore.size() << " file(s) currently loaded. "; - } - return 0; - } - - //Set the required file as activeFile, main tree as activeTree & associate branches - ntupleXML::SetActiveFile(fileNumber); - - if (entryNumber >= activeTree->GetEntries()) { - if (Warn>0) { std::cout << "\nntupleXML: Error cannot access entry #" << entryNumber - << ", file #" << fileNumber << " contains " << activeTree->GetEntries() << " entries. "; - } - return 0; - } - - //Cannot proceed without FullReco/CollectionTree branches set - if (!FR_Active) { - if (Warn>0) { std::cout << "\nntupleXML: Error unable to access " << mainTreeName << " Tree. "; } - return 0; - } - - //Retrieve event - ntupleXML::FillBranches(entryNumber); - nParticles=0; - - //Prepare XML document - ntupleXML::StartXML(); - - ntupleXML::GetFullReco(); - if (nParticles) { ntupleXML::FillXML_ParticleDump("CompositeParticle","RecoView"); } - - ntupleXML::GetMET(0); - ntupleXML::FillXML_MET("MET_Final"); - if (TR_Active) { - ntupleXML::GetMET(1); - ntupleXML::FillXML_MET("MET_Truth"); - } else if (Warn>1) { std::cout << "\nntupleXML: Warning unable to output MET_Truth. "; } - - if (FRA_Active) { - ntupleXML::GetFullRecoAna(); - if (nParticles) { ntupleXML::FillXML_ParticleDump("CompositeParticle","RecoAnaView"); } - } else if (Warn>1 && isTopView) { std::cout << "\nntupleXML: Warning unable to output FullRecoAna Tree. "; } - - if (TA_Active && truthPref == 1) { - ntupleXML::GetTruthAll(0); - if (nParticles) { ntupleXML::FillXML_TruthDump("STr",""); } - ntupleXML::GetTruthAll(1); //Get only muons - if (nParticles) { ntupleXML::FillXML_TruthDump("SMTr",""); } - } else if (TRA_Active && truthPref) { - ntupleXML::GetTruthAna(0); - if (nParticles) { ntupleXML::FillXML_TruthDump("STr",""); } - ntupleXML::GetTruthAna(1); - if (nParticles) { ntupleXML::FillXML_TruthDump("SMTr",""); } - } else if (Warn>1 && truthPref && isTopView) { - std::cout << "\nntupleXML: Warning unable to output TruthAna or TruthAll Tree. "; - } - - //Construct filename - std::string filenameStr(outputFilename), ext; - ext = filenameStr.substr(filenameStr.length() - 4, 4); - if (Append) { - if (ext == ".xml" || ext == ".Xml" || ext == ".XML") { - filenameStr = filenameStr.substr(0, filenameStr.length() - 4) ; - if (Append==1) { filenameStr += "_" + asString(FR_eventNumber) + ext; } - else { filenameStr += "_" + asString(entryNumber) + ext; } - } else { - if (Append==1) { filenameStr += "_" + asString(FR_eventNumber) + ".xml"; } - else { filenameStr += "_" + asString(entryNumber) + ".xml"; } - } - } else { - if (!(ext == ".xml" || ext == ".Xml" || ext == ".XML")) { - filenameStr += ".xml"; - } - } - - //Write .xml file - ntupleXML::EndXML((Char_t*) filenameStr.c_str()); - if (Warn>1) { std::cout << "\nntupleXML: Output to " << filenameStr; } - - //Return success - return 1; -} - -Bool_t ntupleXML::SetWarnLevel(UInt_t warnLevel) { - if (warnLevel <= 2) { - Warn=warnLevel; - return 1; - } else { return 0; } -} - -Bool_t ntupleXML::SetTruthPreference(UInt_t truthPreference) { - if (truthPreference <= 2) { - truthPref=truthPreference; - return 1; - } else { return 0; } -} - -Bool_t ntupleXML::SetFilenameAppend(UInt_t filenameAppend) { - if (filenameAppend <= 2) { - Append=filenameAppend; - return 1; - } else { return 0; } -} - -Int_t ntupleXML::GetNentries(UInt_t fileNumber) { - if (fileNumber >= fileStore.size()) { - if (Warn>0) { std::cout << "\nntupleXML: Error cannot access file #" << fileNumber - << ", " << fileStore.size() << " file(s) currently loaded. "; - } - return 0; - } else { - ntupleXML::SetActiveFile(fileNumber); - return activeTree->GetEntries(); - } -} - -void ntupleXML::Add(Char_t* fileLocation) { - TChain* tf; - if (isTopView) { - tf = new TChain("FullReco0"); - tf->Add(fileLocation); - tf->AddFriend("FullRecoAna0"); - tf->AddFriend("TruthAna0"); - tf->AddFriend("TruthAll0"); - tf->AddFriend("Truth0"); - if ( tf->LoadTree(0) < 0 ) { - if (Warn>0) { std::cout << "\nntupleXML: Error, file was not added. "; } - return; - } - } else { - tf = new TChain("CollectionTree"); - tf->Add(fileLocation); - if ( tf->LoadTree(0) < 0 ) { - if (Warn>0) { std::cout << "\nntupleXML: Error, file was not added. "; } - return; - } - - } - fileStore.push_back(tf); -} - -void ntupleXML::Clear(void) { - for (UInt_t i=0; i<fileStore.size(); i++) { - delete fileStore[i]; - } - fileStore.clear(); - activeFile = NULL; -} - -//XML File Construction Members// - -void ntupleXML::StartXML(void) { - //Create XML engine - TVXMLEng = new TXMLEngine(); - event = TVXMLEng->NewChild(0, 0, "Event"); - TVXMLEng->NewAttr(event, 0, "version", "ntuple"); - TVXMLEng->NewIntAttr(event, "runNumber", FR_runNumber); - TVXMLEng->NewIntAttr(event, "eventNumber", FR_eventNumber); - TDatime* makeTime = new TDatime(); - Char_t makeTimeStr[26]; - makeTime->AsString(makeTimeStr); //This 'AsString' is member of TDatime - delete makeTime; - TVXMLEng->NewAttr(event, 0, "dateTime", makeTimeStr); -} - -void ntupleXML::FillXML_ParticleDump(Char_t* nodeName, Char_t* storeGateKey) { - //Create Composite particle subnode - XMLNodePointer_t compPart = TVXMLEng->NewChild(event, 0, nodeName); - TVXMLEng->NewIntAttr(compPart, "count", nParticles); - TVXMLEng->NewAttr(compPart, 0, "storeGateKey", storeGateKey); - TVXMLEng->NewChild(compPart, 0, "dataType", dataTypeCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "eta", etaCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "label", labelCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "pdgId", pdgIdCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "phi", phiCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "pt", ptCon.c_str()); - TVXMLEng->NewChild(compPart, 0, "typeEV", typeEVCon.c_str()); - dataTypeCon=""; etaCon=""; phiCon=""; labelCon=""; pdgIdCon=""; ptCon=""; typeEVCon=""; - nParticles=0; -} - -void ntupleXML::FillXML_TruthDump(Char_t* nodeName, Char_t* storeGateKey) { - //Create truth subnode - XMLNodePointer_t truBlock = TVXMLEng->NewChild(event, 0, nodeName); - TVXMLEng->NewIntAttr(truBlock, "count", nParticles); - TVXMLEng->NewAttr(truBlock, 0, "storeGateKey", storeGateKey); - TVXMLEng->NewChild(truBlock, 0, "code", pdgIdCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "eta", etaCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "id", labelCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "phi", phiCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "phiVertex", dataTypeCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "pt", ptCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "rhoVertex", dataTypeCon.c_str()); - TVXMLEng->NewChild(truBlock, 0, "zVertex", dataTypeCon.c_str()); - dataTypeCon=""; etaCon=""; phiCon=""; labelCon=""; pdgIdCon=""; ptCon=""; - nParticles=0; -} - -void ntupleXML::FillXML_MET(Char_t* storeGateKey) { - //Create MET subnode - XMLNodePointer_t MET = TVXMLEng->NewChild(event, 0, "ETMis"); - TVXMLEng->NewIntAttr(MET, "count", 1); - TVXMLEng->NewAttr(MET, 0, "storeGateKey", storeGateKey); - TVXMLEng->NewChild(MET, 0, "et", etaCon.c_str()); - TVXMLEng->NewChild(MET, 0, "etx", phiCon.c_str()); - TVXMLEng->NewChild(MET, 0, "ety", ptCon.c_str()); - etaCon=""; phiCon=""; ptCon=""; -} - -void ntupleXML::EndXML(Char_t* outputFilename) { - //Create document - XMLDocPointer_t xmldoc = TVXMLEng->NewDoc(); - TVXMLEng->DocSetRootElement(xmldoc, event); - TVXMLEng->AddDocRawLine(xmldoc, "<?ATLAS Release: \"RELEASE#\"?>"); - TVXMLEng->AddDocRawLine(xmldoc, "<!DOCTYPE Event SYSTEM \"event.dtd\">"); - // Save document to file - TVXMLEng->SaveDoc(xmldoc, outputFilename); - // Release memory before exit - TVXMLEng->FreeDoc(xmldoc); - delete TVXMLEng; -} - -//String Filling Members// - -void ntupleXML::GetFullReco(void) { - std::string id; - if (isTopView) { id = "FR_"; } - else { id = "EV_"; } - for (Int_t i=0; i<FR_El_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVElectron "; - labelCon += id + "Electron "; - etaCon += asString(FR_El_eta->at(i)) + " "; - phiCon += asString(FR_El_phi->at(i)) + " "; - ptCon += asString(FR_El_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FR_El_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FR_Mu_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVMuon "; - labelCon += id + "Muon "; - etaCon += asString(FR_Mu_eta->at(i)) + " "; - phiCon += asString(FR_Mu_phi->at(i)) + " "; - ptCon += asString(FR_Mu_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FR_Mu_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FR_Tau_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVTauJet "; - labelCon += id + "Tau "; - etaCon += asString(FR_Tau_eta->at(i)) + " "; - phiCon += asString(FR_Tau_phi->at(i)) + " "; - ptCon += asString(FR_Tau_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FR_Tau_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FR_Ph_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVPhoton "; - labelCon += id + "Photon "; - etaCon += asString(FR_Ph_eta->at(i)) + " "; - phiCon += asString(FR_Ph_phi->at(i)) + " "; - ptCon += asString(FR_Ph_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FR_Ph_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FR_PJet_N; i++) { - if (isTopView) { - if (FR_PJet_BTagged->at(i)) { - typeEVCon += "EVBJet "; - labelCon += id + "BTaggedJet "; - pdgIdCon += "5 "; - } else { - typeEVCon += "EVParticleJet "; - labelCon += id + "ParticleJet "; - pdgIdCon += "0 "; - } - } else { - typeEVCon += "EVParticleJet "; - labelCon += id + "ParticleJet "; - pdgIdCon += "5 "; - } - nParticles++; - dataTypeCon += "1 "; - etaCon += asString(FR_PJet_eta->at(i)) + " "; - phiCon += asString(FR_PJet_phi->at(i)) + " "; - ptCon += asString(FR_PJet_p_T->at(i)/1000.) + " "; - } -} - -void ntupleXML::GetMET(Bool_t getTruth) { - if (!getTruth) { - etaCon += asString(FR_MET_Final_et/1000.) + " "; - phiCon += asString(FR_MET_Final_ex/1000.) + " "; - ptCon += asString(FR_MET_Final_ey/1000.) + " "; - } else { - etaCon += asString(TR_MET_Truth_et/1000.) + " "; - phiCon += asString(TR_MET_Truth_ex/1000.) + " "; - ptCon += asString(TR_MET_Truth_ey/1000.) + " "; - } -} - -void ntupleXML::GetFullRecoAna(void) { - for (Int_t i=0; i<FRA_El_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVElectron "; - labelCon += "FRA_Electron "; - etaCon += asString(FRA_El_eta->at(i)) + " "; - phiCon += asString(FRA_El_phi->at(i)) + " "; - ptCon += asString(FRA_El_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_El_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_Mu_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVMuon "; - labelCon += "FRA_Muon "; - etaCon += asString(FRA_Mu_eta->at(i)) + " "; - phiCon += asString(FRA_Mu_phi->at(i)) + " "; - ptCon += asString(FRA_Mu_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_Mu_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_Nu_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVNeutrino "; - labelCon += "FRA_Neutrino "; - etaCon += asString(FRA_Nu_eta->at(i)) + " "; - phiCon += asString(FRA_Nu_phi->at(i)) + " "; - ptCon += asString(FRA_Nu_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_Nu_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_HadW_N; i++) { - nParticles++; - dataTypeCon += "0 "; - typeEVCon += "EVCompositeParticle "; - labelCon += "FRA_HadronicW "; - etaCon += asString(FRA_HadW_eta->at(i)) + " "; - phiCon += asString(FRA_HadW_phi->at(i)) + " "; - ptCon += asString(FRA_HadW_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_HadW_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_LepW_N; i++) { - nParticles++; - dataTypeCon += "0 "; - typeEVCon += "EVCompositeParticle "; - labelCon += "FRA_LeptonicW "; - etaCon += asString(FRA_LepW_eta->at(i)) + " "; - phiCon += asString(FRA_LepW_phi->at(i)) + " "; - ptCon += asString(FRA_LepW_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_LepW_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_HadTop_N; i++) { - nParticles++; - dataTypeCon += "0 "; - typeEVCon += "EVCompositeParticle "; - labelCon += "FRA_HadronicTop "; - etaCon += asString(FRA_HadTop_eta->at(i)) + " "; - phiCon += asString(FRA_HadTop_phi->at(i)) + " "; - ptCon += asString(FRA_HadTop_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_HadTop_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_LepTop_N; i++) { - nParticles++; - dataTypeCon += "0 "; - typeEVCon += "EVCompositeParticle "; - labelCon += "FRA_LeptonicTop "; - etaCon += asString(FRA_LepTop_eta->at(i)) + " "; - phiCon += asString(FRA_LepTop_phi->at(i)) + " "; - ptCon += asString(FRA_LepTop_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)FRA_LepTop_pdgId->at(i)) + " "; - } - for (Int_t i=0; i<FRA_Lepb_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVBJet "; - labelCon += "FRA_LeptonicBJet "; - etaCon += asString(FRA_Lepb_eta->at(i)) + " "; - phiCon += asString(FRA_Lepb_phi->at(i)) + " "; - ptCon += asString(FRA_Lepb_p_T->at(i)/1000.) + " "; - pdgIdCon += "5 "; - } - for (Int_t i=0; i<FRA_Hadb_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVBJet "; - labelCon += "FRA_HadronicBJet "; - etaCon += asString(FRA_Hadb_eta->at(i)) + " "; - phiCon += asString(FRA_Hadb_phi->at(i)) + " "; - ptCon += asString(FRA_Hadb_p_T->at(i)/1000.) + " "; - pdgIdCon += "5 "; - } - for (Int_t i=0; i<FRA_Hadj_N; i++) { - nParticles++; - dataTypeCon += "1 "; - typeEVCon += "EVParticleJet "; - labelCon += "FRA_HadronicParticleJet "; - etaCon += asString(FRA_Hadj_eta->at(i)) + " "; - phiCon += asString(FRA_Hadj_phi->at(i)) + " "; - ptCon += asString(FRA_Hadj_p_T->at(i)/1000.) + " "; - pdgIdCon += "0 "; - } -} - -//onlyMouns is set true when filling SMTr -void ntupleXML::GetTruthAna(Bool_t onlyMuons) { - Int_t sign; - for (Int_t i=0; i<TRA_Mu_N; i++) { - nParticles++; - etaCon += asString(TRA_Mu_eta->at(i)) + " "; - phiCon += asString(TRA_Mu_phi->at(i)) + " "; - ptCon += asString(TRA_Mu_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)TRA_Mu_pdgId->at(i)) + " "; - labelCon += "0 "; //Barcode - dataTypeCon += "0.000001 "; //Used to fill vertexes - } - - if (onlyMuons) { return; } - - for (Int_t i=0; i<TRA_El_N; i++) { - nParticles++; - etaCon += asString(TRA_El_eta->at(i)) + " "; - phiCon += asString(TRA_El_phi->at(i)) + " "; - ptCon += asString(TRA_El_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)TRA_El_pdgId->at(i)) + " "; - labelCon += "0 "; - dataTypeCon += " 0.000001 "; - } - for (Int_t i=0; i<TRA_Tau_N; i++) { - nParticles++; - etaCon += asString(TRA_Tau_eta->at(i)) + " "; - phiCon += asString(TRA_Tau_phi->at(i)) + " "; - ptCon += asString(TRA_Tau_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)TRA_Tau_pdgId->at(i)) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_HadW_N; i++) { - nParticles++; - etaCon += asString(TRA_HadW_eta->at(i)) + " "; - phiCon += asString(TRA_HadW_phi->at(i)) + " "; - ptCon += asString(TRA_HadW_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)TRA_HadW_pdgId->at(i)) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_LepW_N; i++) { - nParticles++; - etaCon += asString(TRA_LepW_eta->at(i)) + " "; - phiCon += asString(TRA_LepW_phi->at(i)) + " "; - ptCon += asString(TRA_LepW_p_T->at(i)/1000.) + " "; - pdgIdCon += asString((Int_t)TRA_LepW_pdgId->at(i)) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_HadTop_N; i++) { - nParticles++; - etaCon += asString(TRA_HadTop_eta->at(i)) + " "; - phiCon += asString(TRA_HadTop_phi->at(i)) + " "; - ptCon += asString(TRA_HadTop_p_T->at(i)/1000.) + " "; - sign = (Int_t) (fabs(TRA_HadTop_pdgId->at(i))/TRA_HadTop_pdgId->at(i)); - pdgIdCon += asString((Int_t)(TRA_HadTop_pdgId->at(i)+(600*sign))) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_LepTop_N; i++) { - nParticles++; - etaCon += asString(TRA_LepTop_eta->at(i)) + " "; - phiCon += asString(TRA_LepTop_phi->at(i)) + " "; - ptCon += asString(TRA_LepTop_p_T->at(i)/1000.) + " "; - sign = (Int_t) (fabs(TRA_LepTop_pdgId->at(i))/TRA_LepTop_pdgId->at(i)); - pdgIdCon += asString((Int_t)(TRA_LepTop_pdgId->at(i)+(600*sign))) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_Bot_N; i++) { - nParticles++; - etaCon += asString(TRA_Bot_eta->at(i)) + " "; - phiCon += asString(TRA_Bot_phi->at(i)) + " "; - ptCon += asString(TRA_Bot_p_T->at(i)/1000.) + " "; - sign = (Int_t) (fabs(TRA_Bot_pdgId->at(i))/TRA_Bot_pdgId->at(i)); - pdgIdCon += asString((Int_t)(TRA_Bot_pdgId->at(i)+(600*sign))) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } - for (Int_t i=0; i<TRA_LQ_N; i++) { //LQ - Light Quarks - nParticles++; - etaCon += asString(TRA_LQ_eta->at(i)) + " "; - phiCon += asString(TRA_LQ_phi->at(i)) + " "; - ptCon += asString(TRA_LQ_p_T->at(i)/1000.) + " "; - sign = (Int_t) (fabs(TRA_LQ_pdgId->at(i))/TRA_LQ_pdgId->at(i)); - pdgIdCon += asString((Int_t)(TRA_LQ_pdgId->at(i)+(600*sign))) + " "; - labelCon += "0 "; - dataTypeCon += "0.000001 "; - } -} - -void ntupleXML::GetTruthAll(Bool_t onlyMuons) { - //Loop over entire truth block (if present) - Int_t id, sign; - for (UInt_t i=0; i<TA_Tru_p_T->size(); i++) { - if (!onlyMuons || (onlyMuons && fabs(TA_Tru_pdgId->at(i)) == 13)) { - nParticles++; - etaCon += asString(TA_Tru_eta->at(i)) + " "; - phiCon += asString(TA_Tru_phi->at(i)) + " "; - ptCon += asString(TA_Tru_p_T->at(i)/1000.) + " "; - id = (Int_t) TA_Tru_pdgId->at(i); - sign = (Int_t) (fabs(TA_Tru_pdgId->at(i))/TA_Tru_pdgId->at(i)); - //Atlantis' True Particle Simulation ignores quarks, however with TopView - //we are interested in t and b quarks, 6 special pdgIds have therefore - //been set up in Atlantis (601-606) so as to display quarks from ntuples - if (abs(id) <= 6) { id += (600 * sign); } - pdgIdCon += asString(id) + " "; - labelCon += asString(TA_Tru_barcode->at(i)) + " "; - dataTypeCon += "0.000001 "; //If zero, Atlantis crashes on eta-phi plot due to rhoVertex - } - } -} - -//Branch Association// - -void ntupleXML::SetBranches(void) { - FR_El_pdgId = 0; - FR_El_p_T = 0; - FR_El_phi = 0; - FR_El_eta = 0; - FR_Mu_pdgId = 0; - FR_Mu_p_T = 0; - FR_Mu_phi = 0; - FR_Mu_eta = 0; - FR_Tau_pdgId = 0; - FR_Tau_p_T = 0; - FR_Tau_phi = 0; - FR_Tau_eta = 0; - FR_Ph_pdgId = 0; - FR_Ph_p_T = 0; - FR_Ph_phi = 0; - FR_Ph_eta = 0; - FR_PJet_pdgId = 0; - FR_PJet_p_T = 0; - FR_PJet_phi = 0; - FR_PJet_eta = 0; - FR_PJet_BTagged = 0; - FRA_El_pdgId = 0; - FRA_El_p_T = 0; - FRA_El_phi = 0; - FRA_El_eta = 0; - FRA_Mu_pdgId = 0; - FRA_Mu_p_T = 0; - FRA_Mu_phi = 0; - FRA_Mu_eta = 0; - FRA_Nu_pdgId = 0; - FRA_Nu_p_T = 0; - FRA_Nu_phi = 0; - FRA_Nu_eta = 0; - FRA_HadW_pdgId = 0; - FRA_HadW_p_T = 0; - FRA_HadW_phi = 0; - FRA_HadW_eta = 0; - FRA_LepW_pdgId = 0; - FRA_LepW_p_T = 0; - FRA_LepW_phi = 0; - FRA_LepW_eta = 0; - FRA_HadTop_pdgId = 0; - FRA_HadTop_p_T = 0; - FRA_HadTop_phi = 0; - FRA_HadTop_eta = 0; - FRA_LepTop_pdgId = 0; - FRA_LepTop_p_T = 0; - FRA_LepTop_phi = 0; - FRA_LepTop_eta = 0; - FRA_Lepb_pdgId = 0; - FRA_Lepb_p_T = 0; - FRA_Lepb_phi = 0; - FRA_Lepb_eta = 0; - FRA_Hadb_pdgId = 0; - FRA_Hadb_p_T = 0; - FRA_Hadb_phi = 0; - FRA_Hadb_eta = 0; - FRA_Hadj_pdgId = 0; - FRA_Hadj_p_T = 0; - FRA_Hadj_phi = 0; - FRA_Hadj_eta = 0; - TRA_El_pdgId = 0; - TRA_El_p_T = 0; - TRA_El_phi = 0; - TRA_El_eta = 0; - TRA_Mu_pdgId = 0; - TRA_Mu_p_T = 0; - TRA_Mu_phi = 0; - TRA_Mu_eta = 0; - TRA_Tau_pdgId = 0; - TRA_Tau_p_T = 0; - TRA_Tau_phi = 0; - TRA_Tau_eta = 0; - TRA_HadW_pdgId = 0; - TRA_HadW_p_T = 0; - TRA_HadW_phi = 0; - TRA_HadW_eta = 0; - TRA_LepW_pdgId = 0; - TRA_LepW_p_T = 0; - TRA_LepW_phi = 0; - TRA_LepW_eta = 0; - TRA_HadTop_pdgId = 0; - TRA_HadTop_p_T = 0; - TRA_HadTop_phi = 0; - TRA_HadTop_eta = 0; - TRA_LepTop_pdgId = 0; - TRA_LepTop_p_T = 0; - TRA_LepTop_phi = 0; - TRA_LepTop_eta = 0; - TRA_Bot_pdgId = 0; - TRA_Bot_p_T = 0; - TRA_Bot_phi = 0; - TRA_Bot_eta = 0; - TRA_LQ_pdgId = 0; - TRA_LQ_p_T = 0; - TRA_LQ_phi = 0; - TRA_LQ_eta = 0; - TA_Tru_p_T = 0; - TA_Tru_phi = 0; - TA_Tru_eta = 0; - TA_Tru_pdgId = 0; - TA_Tru_barcode = 0; - FR_Active=0; - TR_Active=0; - FRA_Active=0; - TRA_Active=0; - TA_Active=0; - - activeTree = activeFile->GetTree(); - - if (activeTree) { - FR_Active = 1; - activeTree->SetBranchAddress("eventNumber", &FR_eventNumber, &b_FR_eventNumber); - activeTree->SetBranchAddress("runNumber", &FR_runNumber, &b_FR_runNumber); - activeTree->SetBranchAddress("MET_Final_ex", &FR_MET_Final_ex, &b_FR_MET_Final_ex); - activeTree->SetBranchAddress("MET_Final_ey", &FR_MET_Final_ey, &b_FR_MET_Final_ey); - activeTree->SetBranchAddress("MET_Final_et", &FR_MET_Final_et, &b_FR_MET_Final_et); - if (!isTopView) { - //With EventView ntuples, MET Truth is in the CollectionTree - activeTree->SetBranchAddress("MET_Truth_ex", &TR_MET_Truth_ex, &b_TR_MET_Truth_ex); - activeTree->SetBranchAddress("MET_Truth_ey", &TR_MET_Truth_ey, &b_TR_MET_Truth_ey); - activeTree->SetBranchAddress("MET_Truth_et", &TR_MET_Truth_et, &b_TR_MET_Truth_et); - TR_Active=1; - } - activeTree->SetBranchAddress("El_N", &FR_El_N, &b_FR_El_N); - activeTree->SetBranchAddress("El_p_T", &FR_El_p_T, &b_FR_El_p_T); - activeTree->SetBranchAddress("El_pdgId", &FR_El_pdgId, &b_FR_El_pdgId); - activeTree->SetBranchAddress("El_phi", &FR_El_phi, &b_FR_El_phi); - activeTree->SetBranchAddress("El_eta", &FR_El_eta, &b_FR_El_eta); - activeTree->SetBranchAddress("Mu_N", &FR_Mu_N, &b_FR_Mu_N); - activeTree->SetBranchAddress("Mu_p_T", &FR_Mu_p_T, &b_FR_Mu_p_T); - activeTree->SetBranchAddress("Mu_pdgId", &FR_Mu_pdgId, &b_FR_Mu_pdgId); - activeTree->SetBranchAddress("Mu_phi", &FR_Mu_phi, &b_FR_Mu_phi); - activeTree->SetBranchAddress("Mu_eta", &FR_Mu_eta, &b_FR_Mu_eta); - activeTree->SetBranchAddress("Tau_N", &FR_Tau_N, &b_FR_Tau_N); - activeTree->SetBranchAddress("Tau_p_T", &FR_Tau_p_T, &b_FR_Tau_p_T); - activeTree->SetBranchAddress("Tau_pdgId", &FR_Tau_pdgId, &b_FR_Tau_pdgId); - activeTree->SetBranchAddress("Tau_phi", &FR_Tau_phi, &b_FR_Tau_phi); - activeTree->SetBranchAddress("Tau_eta", &FR_Tau_eta, &b_FR_Tau_eta); - activeTree->SetBranchAddress("Ph_N", &FR_Ph_N, &b_FR_Ph_N); - activeTree->SetBranchAddress("Ph_p_T", &FR_Ph_p_T, &b_FR_Ph_p_T); - activeTree->SetBranchAddress("Ph_pdgId", &FR_Ph_pdgId, &b_FR_Ph_pdgId); - activeTree->SetBranchAddress("Ph_phi", &FR_Ph_phi, &b_FR_Ph_phi); - activeTree->SetBranchAddress("Ph_eta", &FR_Ph_eta, &b_FR_Ph_eta); - activeTree->SetBranchAddress("PJet_N", &FR_PJet_N, &b_FR_PJet_N); - activeTree->SetBranchAddress("PJet_p_T", &FR_PJet_p_T, &b_FR_PJet_p_T); - activeTree->SetBranchAddress("PJet_pdgId", &FR_PJet_pdgId, &b_FR_PJet_pdgId); - activeTree->SetBranchAddress("PJet_phi", &FR_PJet_phi, &b_FR_PJet_phi); - activeTree->SetBranchAddress("PJet_eta", &FR_PJet_eta, &b_FR_PJet_eta); - if (isTopView) { activeTree->SetBranchAddress("PJet_BTagged", &FR_PJet_BTagged, &b_FR_PJet_BTagged); } - } else if (Warn>1) { std::cout << "\nntupleXML: Warning cannot find " << mainTreeName << " tree. "; } - - //Stop here with EventView - if (!isTopView) { return; } - - friendTree = (TFriendElement*) (activeFile->GetListOfFriends()->FindObject("FullRecoAna0")); - activeTree = friendTree->GetTree(); - if (activeTree) { - FRA_Active=1; - activeTree->SetBranchAddress("El_N", &FRA_El_N, &b_FRA_El_N); - activeTree->SetBranchAddress("El_p_T", &FRA_El_p_T, &b_FRA_El_p_T); - activeTree->SetBranchAddress("El_pdgId", &FRA_El_pdgId, &b_FRA_El_pdgId); - activeTree->SetBranchAddress("El_phi", &FRA_El_phi, &b_FRA_El_phi); - activeTree->SetBranchAddress("El_eta", &FRA_El_eta, &b_FRA_El_eta); - activeTree->SetBranchAddress("Mu_N", &FRA_Mu_N, &b_FRA_Mu_N); - activeTree->SetBranchAddress("Mu_p_T", &FRA_Mu_p_T, &b_FRA_Mu_p_T); - activeTree->SetBranchAddress("Mu_pdgId", &FRA_Mu_pdgId, &b_FRA_Mu_pdgId); - activeTree->SetBranchAddress("Mu_phi", &FRA_Mu_phi, &b_FRA_Mu_phi); - activeTree->SetBranchAddress("Mu_eta", &FRA_Mu_eta, &b_FRA_Mu_eta); - activeTree->SetBranchAddress("Nu_N", &FRA_Nu_N, &b_FRA_Nu_N); - activeTree->SetBranchAddress("Nu_p_T", &FRA_Nu_p_T, &b_FRA_Nu_p_T); - activeTree->SetBranchAddress("Nu_pdgId", &FRA_Nu_pdgId, &b_FRA_Nu_pdgId); - activeTree->SetBranchAddress("Nu_phi", &FRA_Nu_phi, &b_FRA_Nu_phi); - activeTree->SetBranchAddress("Nu_eta", &FRA_Nu_eta, &b_FRA_Nu_eta); - activeTree->SetBranchAddress("HadW_N", &FRA_HadW_N, &b_FRA_HadW_N); - activeTree->SetBranchAddress("HadW_p_T", &FRA_HadW_p_T, &b_FRA_HadW_p_T); - activeTree->SetBranchAddress("HadW_pdgId", &FRA_HadW_pdgId, &b_FRA_HadW_pdgId); - activeTree->SetBranchAddress("HadW_phi", &FRA_HadW_phi, &b_FRA_HadW_phi); - activeTree->SetBranchAddress("HadW_eta", &FRA_HadW_eta, &b_FRA_HadW_eta); - activeTree->SetBranchAddress("LepW_N", &FRA_LepW_N, &b_FRA_LepW_N); - activeTree->SetBranchAddress("LepW_p_T", &FRA_LepW_p_T, &b_FRA_LepW_p_T); - activeTree->SetBranchAddress("LepW_pdgId", &FRA_LepW_pdgId, &b_FRA_LepW_pdgId); - activeTree->SetBranchAddress("LepW_phi", &FRA_LepW_phi, &b_FRA_LepW_phi); - activeTree->SetBranchAddress("LepW_eta", &FRA_LepW_eta, &b_FRA_LepW_eta); - activeTree->SetBranchAddress("HadTop_N", &FRA_HadTop_N, &b_FRA_HadTop_N); - activeTree->SetBranchAddress("HadTop_p_T", &FRA_HadTop_p_T, &b_FRA_HadTop_p_T); - activeTree->SetBranchAddress("HadTop_pdgId", &FRA_HadTop_pdgId, &b_FRA_HadTop_pdgId); - activeTree->SetBranchAddress("HadTop_phi", &FRA_HadTop_phi, &b_FRA_HadTop_phi); - activeTree->SetBranchAddress("HadTop_eta", &FRA_HadTop_eta, &b_FRA_HadTop_eta); - activeTree->SetBranchAddress("LepTop_N", &FRA_LepTop_N, &b_FRA_LepTop_N); - activeTree->SetBranchAddress("LepTop_p_T", &FRA_LepTop_p_T, &b_FRA_LepTop_p_T); - activeTree->SetBranchAddress("LepTop_pdgId", &FRA_LepTop_pdgId, &b_FRA_LepTop_pdgId); - activeTree->SetBranchAddress("LepTop_phi", &FRA_LepTop_phi, &b_FRA_LepTop_phi); - activeTree->SetBranchAddress("LepTop_eta", &FRA_LepTop_eta, &b_FRA_LepTop_eta); - activeTree->SetBranchAddress("Lepb_N", &FRA_Lepb_N, &b_FRA_Lepb_N); - activeTree->SetBranchAddress("Lepb_p_T", &FRA_Lepb_p_T, &b_FRA_Lepb_p_T); - activeTree->SetBranchAddress("Lepb_pdgId", &FRA_Lepb_pdgId, &b_FRA_Lepb_pdgId); - activeTree->SetBranchAddress("Lepb_phi", &FRA_Lepb_phi, &b_FRA_Lepb_phi); - activeTree->SetBranchAddress("Lepb_eta", &FRA_Lepb_eta, &b_FRA_Lepb_eta); - activeTree->SetBranchAddress("Hadb_N", &FRA_Hadb_N, &b_FRA_Hadb_N); - activeTree->SetBranchAddress("Hadb_p_T", &FRA_Hadb_p_T, &b_FRA_Hadb_p_T); - activeTree->SetBranchAddress("Hadb_pdgId", &FRA_Hadb_pdgId, &b_FRA_Hadb_pdgId); - activeTree->SetBranchAddress("Hadb_phi", &FRA_Hadb_phi, &b_FRA_Hadb_phi); - activeTree->SetBranchAddress("Hadb_eta", &FRA_Hadb_eta, &b_FRA_Hadb_eta); - activeTree->SetBranchAddress("Hadj_N", &FRA_Hadj_N, &b_FRA_Hadj_N); - activeTree->SetBranchAddress("Hadj_p_T", &FRA_Hadj_p_T, &b_FRA_Hadj_p_T); - activeTree->SetBranchAddress("Hadj_pdgId", &FRA_Hadj_pdgId, &b_FRA_Hadj_pdgId); - activeTree->SetBranchAddress("Hadj_phi", &FRA_Hadj_phi, &b_FRA_Hadj_phi); - activeTree->SetBranchAddress("Hadj_eta", &FRA_Hadj_eta, &b_FRA_Hadj_eta); - } else if (Warn>1) { std::cout << "\nntupleXML: Warning, cannot find FullRecoAna tree. "; } - - friendTree = (TFriendElement*) (activeFile->GetListOfFriends()->FindObject("TruthAna0")); - activeTree = friendTree->GetTree(); - if (activeTree) { - TRA_Active=1; - activeTree->SetBranchAddress("El_N", &TRA_El_N, &b_TRA_El_N); - activeTree->SetBranchAddress("El_p_T", &TRA_El_p_T, &b_TRA_El_p_T); - activeTree->SetBranchAddress("El_pdgId", &TRA_El_pdgId, &b_TRA_El_pdgId); - activeTree->SetBranchAddress("El_phi", &TRA_El_phi, &b_TRA_El_phi); - activeTree->SetBranchAddress("El_eta", &TRA_El_eta, &b_TRA_El_eta); - activeTree->SetBranchAddress("Mu_N", &TRA_Mu_N, &b_TRA_Mu_N); - activeTree->SetBranchAddress("Mu_p_T", &TRA_Mu_p_T, &b_TRA_Mu_p_T); - activeTree->SetBranchAddress("Mu_pdgId", &TRA_Mu_pdgId, &b_TRA_Mu_pdgId); - activeTree->SetBranchAddress("Mu_phi", &TRA_Mu_phi, &b_TRA_Mu_phi); - activeTree->SetBranchAddress("Mu_eta", &TRA_Mu_eta, &b_TRA_Mu_eta); - activeTree->SetBranchAddress("Tau_N", &TRA_Tau_N, &b_TRA_Tau_N); - activeTree->SetBranchAddress("Tau_p_T", &TRA_Tau_p_T, &b_TRA_Tau_p_T); - activeTree->SetBranchAddress("Tau_pdgId", &TRA_Tau_pdgId, &b_TRA_Tau_pdgId); - activeTree->SetBranchAddress("Tau_phi", &TRA_Tau_phi, &b_TRA_Tau_phi); - activeTree->SetBranchAddress("Tau_eta", &TRA_Tau_eta, &b_TRA_Tau_eta); - activeTree->SetBranchAddress("HadW_N", &TRA_HadW_N, &b_TRA_HadW_N); - activeTree->SetBranchAddress("HadW_p_T", &TRA_HadW_p_T, &b_TRA_HadW_p_T); - activeTree->SetBranchAddress("HadW_pdgId", &TRA_HadW_pdgId, &b_TRA_HadW_pdgId); - activeTree->SetBranchAddress("HadW_phi", &TRA_HadW_phi, &b_TRA_HadW_phi); - activeTree->SetBranchAddress("HadW_eta", &TRA_HadW_eta, &b_TRA_HadW_eta); - activeTree->SetBranchAddress("LepW_N", &TRA_LepW_N, &b_TRA_LepW_N); - activeTree->SetBranchAddress("LepW_p_T", &TRA_LepW_p_T, &b_TRA_LepW_p_T); - activeTree->SetBranchAddress("LepW_pdgId", &TRA_LepW_pdgId, &b_TRA_LepW_pdgId); - activeTree->SetBranchAddress("LepW_phi", &TRA_LepW_phi, &b_TRA_LepW_phi); - activeTree->SetBranchAddress("LepW_eta", &TRA_LepW_eta, &b_TRA_LepW_eta); - activeTree->SetBranchAddress("HadTop_N", &TRA_HadTop_N, &b_TRA_HadTop_N); - activeTree->SetBranchAddress("HadTop_p_T", &TRA_HadTop_p_T, &b_TRA_HadTop_p_T); - activeTree->SetBranchAddress("HadTop_pdgId", &TRA_HadTop_pdgId, &b_TRA_HadTop_pdgId); - activeTree->SetBranchAddress("HadTop_phi", &TRA_HadTop_phi, &b_TRA_HadTop_phi); - activeTree->SetBranchAddress("HadTop_eta", &TRA_HadTop_eta, &b_TRA_HadTop_eta); - activeTree->SetBranchAddress("LepTop_N", &TRA_LepTop_N, &b_TRA_LepTop_N); - activeTree->SetBranchAddress("LepTop_p_T", &TRA_LepTop_p_T, &b_TRA_LepTop_p_T); - activeTree->SetBranchAddress("LepTop_pdgId", &TRA_LepTop_pdgId, &b_TRA_LepTop_pdgId); - activeTree->SetBranchAddress("LepTop_phi", &TRA_LepTop_phi, &b_TRA_LepTop_phi); - activeTree->SetBranchAddress("LepTop_eta", &TRA_LepTop_eta, &b_TRA_LepTop_eta); - activeTree->SetBranchAddress("Bot_N", &TRA_Bot_N, &b_TRA_Bot_N); - activeTree->SetBranchAddress("Bot_p_T", &TRA_Bot_p_T, &b_TRA_Bot_p_T); - activeTree->SetBranchAddress("Bot_pdgId", &TRA_Bot_pdgId, &b_TRA_Bot_pdgId); - activeTree->SetBranchAddress("Bot_phi", &TRA_Bot_phi, &b_TRA_Bot_phi); - activeTree->SetBranchAddress("Bot_eta", &TRA_Bot_eta, &b_TRA_Bot_eta); - activeTree->SetBranchAddress("LQ_N", &TRA_LQ_N, &b_TRA_LQ_N); - activeTree->SetBranchAddress("LQ_p_T", &TRA_LQ_p_T, &b_TRA_LQ_p_T); - activeTree->SetBranchAddress("LQ_pdgId", &TRA_LQ_pdgId, &b_TRA_LQ_pdgId); - activeTree->SetBranchAddress("LQ_phi", &TRA_LQ_phi, &b_TRA_LQ_phi); - activeTree->SetBranchAddress("LQ_eta", &TRA_LQ_eta, &b_TRA_LQ_eta); - } else if (Warn>1) { std::cout << "\nntupleXML: Warning, cannot find TruthAna tree. "; } - - friendTree = (TFriendElement*) (activeFile->GetListOfFriends()->FindObject("TruthAll0")); - activeTree = friendTree->GetTree(); - if (activeTree) { - TA_Active=1; - activeTree->SetBranchAddress("Tru_p_T", &TA_Tru_p_T, &b_TA_Tru_p_T); - activeTree->SetBranchAddress("Tru_phi", &TA_Tru_phi, &b_TA_Tru_phi); - activeTree->SetBranchAddress("Tru_eta", &TA_Tru_eta, &b_TA_Tru_eta); - activeTree->SetBranchAddress("Tru_pdgId", &TA_Tru_pdgId, &b_TA_Tru_pdgId); - activeTree->SetBranchAddress("Tru_barcode", &TA_Tru_barcode, &b_TA_Tru_barcode); - } else if (Warn>1) { std::cout << "\nntupleXML: Warning, cannot find TruthAll tree. "; } - - //If using TopView ntuples, MET_Truth must be fetched from Truth0 - friendTree = (TFriendElement*) (activeFile->GetListOfFriends()->FindObject("Truth0")); - activeTree = friendTree->GetTree(); - if (activeTree) { - TR_Active=1; - activeTree->SetBranchAddress("MET_Truth_ex", &TR_MET_Truth_ex, &b_TR_MET_Truth_ex); - activeTree->SetBranchAddress("MET_Truth_ey", &TR_MET_Truth_ey, &b_TR_MET_Truth_ey); - activeTree->SetBranchAddress("MET_Truth_et", &TR_MET_Truth_et, &b_TR_MET_Truth_et); - } else if (Warn>1) { std::cout << "\nntupleXML: Warning, cannot find Truth tree. "; } -} - -void ntupleXML::FillBranches(Int_t entryNumber) { - if (FR_Active) { - b_FR_eventNumber->GetEntry(entryNumber); - b_FR_runNumber->GetEntry(entryNumber); - b_FR_MET_Final_ex->GetEntry(entryNumber); - b_FR_MET_Final_ey->GetEntry(entryNumber); - b_FR_MET_Final_et->GetEntry(entryNumber); - if (TR_Active) { - b_TR_MET_Truth_ex->GetEntry(entryNumber); - b_TR_MET_Truth_ey->GetEntry(entryNumber); - b_TR_MET_Truth_et->GetEntry(entryNumber); - } - b_FR_El_N->GetEntry(entryNumber); - b_FR_El_pdgId->GetEntry(entryNumber); - b_FR_El_p_T->GetEntry(entryNumber); - b_FR_El_phi->GetEntry(entryNumber); - b_FR_El_eta->GetEntry(entryNumber); - b_FR_Mu_N->GetEntry(entryNumber); - b_FR_Mu_pdgId->GetEntry(entryNumber); - b_FR_Mu_p_T->GetEntry(entryNumber); - b_FR_Mu_phi->GetEntry(entryNumber); - b_FR_Mu_eta->GetEntry(entryNumber); - b_FR_Tau_N->GetEntry(entryNumber); - b_FR_Tau_pdgId->GetEntry(entryNumber); - b_FR_Tau_p_T->GetEntry(entryNumber); - b_FR_Tau_phi->GetEntry(entryNumber); - b_FR_Tau_eta->GetEntry(entryNumber); - b_FR_Ph_N->GetEntry(entryNumber); - b_FR_Ph_pdgId->GetEntry(entryNumber); - b_FR_Ph_p_T->GetEntry(entryNumber); - b_FR_Ph_phi->GetEntry(entryNumber); - b_FR_Ph_eta->GetEntry(entryNumber); - b_FR_PJet_N->GetEntry(entryNumber); - b_FR_PJet_pdgId->GetEntry(entryNumber); - b_FR_PJet_p_T->GetEntry(entryNumber); - b_FR_PJet_phi->GetEntry(entryNumber); - b_FR_PJet_eta->GetEntry(entryNumber); - } - - if (!isTopView) { return; } - - if (FR_Active) { b_FR_PJet_BTagged->GetEntry(entryNumber); } - - if (FRA_Active) { - b_FRA_El_N->GetEntry(entryNumber); - b_FRA_El_pdgId->GetEntry(entryNumber); - b_FRA_El_p_T->GetEntry(entryNumber); - b_FRA_El_phi->GetEntry(entryNumber); - b_FRA_El_eta->GetEntry(entryNumber); - b_FRA_Mu_N->GetEntry(entryNumber); - b_FRA_Mu_pdgId->GetEntry(entryNumber); - b_FRA_Mu_p_T->GetEntry(entryNumber); - b_FRA_Mu_phi->GetEntry(entryNumber); - b_FRA_Mu_eta->GetEntry(entryNumber); - b_FRA_Nu_N->GetEntry(entryNumber); - b_FRA_Nu_pdgId->GetEntry(entryNumber); - b_FRA_Nu_p_T->GetEntry(entryNumber); - b_FRA_Nu_phi->GetEntry(entryNumber); - b_FRA_Nu_eta->GetEntry(entryNumber); - b_FRA_HadW_N->GetEntry(entryNumber); - b_FRA_HadW_pdgId->GetEntry(entryNumber); - b_FRA_HadW_p_T->GetEntry(entryNumber); - b_FRA_HadW_phi->GetEntry(entryNumber); - b_FRA_HadW_eta->GetEntry(entryNumber); - b_FRA_LepW_N->GetEntry(entryNumber); - b_FRA_LepW_pdgId->GetEntry(entryNumber); - b_FRA_LepW_p_T->GetEntry(entryNumber); - b_FRA_LepW_phi->GetEntry(entryNumber); - b_FRA_LepW_eta->GetEntry(entryNumber); - b_FRA_HadTop_N->GetEntry(entryNumber); - b_FRA_HadTop_pdgId->GetEntry(entryNumber); - b_FRA_HadTop_p_T->GetEntry(entryNumber); - b_FRA_HadTop_phi->GetEntry(entryNumber); - b_FRA_HadTop_eta->GetEntry(entryNumber); - b_FRA_LepTop_N->GetEntry(entryNumber); - b_FRA_LepTop_pdgId->GetEntry(entryNumber); - b_FRA_LepTop_p_T->GetEntry(entryNumber); - b_FRA_LepTop_phi->GetEntry(entryNumber); - b_FRA_LepTop_eta->GetEntry(entryNumber); - b_FRA_Lepb_N->GetEntry(entryNumber); - b_FRA_Lepb_pdgId->GetEntry(entryNumber); - b_FRA_Lepb_p_T->GetEntry(entryNumber); - b_FRA_Lepb_phi->GetEntry(entryNumber); - b_FRA_Lepb_eta->GetEntry(entryNumber); - b_FRA_Hadb_N->GetEntry(entryNumber); - b_FRA_Hadb_pdgId->GetEntry(entryNumber); - b_FRA_Hadb_p_T->GetEntry(entryNumber); - b_FRA_Hadb_phi->GetEntry(entryNumber); - b_FRA_Hadb_eta->GetEntry(entryNumber); - b_FRA_Hadj_N->GetEntry(entryNumber); - b_FRA_Hadj_pdgId->GetEntry(entryNumber); - b_FRA_Hadj_p_T->GetEntry(entryNumber); - b_FRA_Hadj_phi->GetEntry(entryNumber); - b_FRA_Hadj_eta->GetEntry(entryNumber); - } - if (TRA_Active) { - b_TRA_El_N->GetEntry(entryNumber); - b_TRA_El_pdgId->GetEntry(entryNumber); - b_TRA_El_p_T->GetEntry(entryNumber); - b_TRA_El_phi->GetEntry(entryNumber); - b_TRA_El_eta->GetEntry(entryNumber); - b_TRA_Mu_N->GetEntry(entryNumber); - b_TRA_Mu_pdgId->GetEntry(entryNumber); - b_TRA_Mu_p_T->GetEntry(entryNumber); - b_TRA_Mu_phi->GetEntry(entryNumber); - b_TRA_Mu_eta->GetEntry(entryNumber); - b_TRA_Tau_N->GetEntry(entryNumber); - b_TRA_Tau_pdgId->GetEntry(entryNumber); - b_TRA_Tau_p_T->GetEntry(entryNumber); - b_TRA_Tau_phi->GetEntry(entryNumber); - b_TRA_Tau_eta->GetEntry(entryNumber); - b_TRA_HadW_N->GetEntry(entryNumber); - b_TRA_HadW_pdgId->GetEntry(entryNumber); - b_TRA_HadW_p_T->GetEntry(entryNumber); - b_TRA_HadW_phi->GetEntry(entryNumber); - b_TRA_HadW_eta->GetEntry(entryNumber); - b_TRA_LepW_N->GetEntry(entryNumber); - b_TRA_LepW_pdgId->GetEntry(entryNumber); - b_TRA_LepW_p_T->GetEntry(entryNumber); - b_TRA_LepW_phi->GetEntry(entryNumber); - b_TRA_LepW_eta->GetEntry(entryNumber); - b_TRA_HadTop_N->GetEntry(entryNumber); - b_TRA_HadTop_pdgId->GetEntry(entryNumber); - b_TRA_HadTop_p_T->GetEntry(entryNumber); - b_TRA_HadTop_phi->GetEntry(entryNumber); - b_TRA_HadTop_eta->GetEntry(entryNumber); - b_TRA_LepTop_N->GetEntry(entryNumber); - b_TRA_LepTop_pdgId->GetEntry(entryNumber); - b_TRA_LepTop_p_T->GetEntry(entryNumber); - b_TRA_LepTop_phi->GetEntry(entryNumber); - b_TRA_LepTop_eta->GetEntry(entryNumber); - b_TRA_Bot_N->GetEntry(entryNumber); - b_TRA_Bot_pdgId->GetEntry(entryNumber); - b_TRA_Bot_p_T->GetEntry(entryNumber); - b_TRA_Bot_phi->GetEntry(entryNumber); - b_TRA_Bot_eta->GetEntry(entryNumber); - b_TRA_LQ_N->GetEntry(entryNumber); - b_TRA_LQ_pdgId->GetEntry(entryNumber); - b_TRA_LQ_p_T->GetEntry(entryNumber); - b_TRA_LQ_phi->GetEntry(entryNumber); - b_TRA_LQ_eta->GetEntry(entryNumber); - } - if (TA_Active) { - b_TA_Tru_p_T->GetEntry(entryNumber); - b_TA_Tru_phi->GetEntry(entryNumber); - b_TA_Tru_eta->GetEntry(entryNumber); - b_TA_Tru_pdgId->GetEntry(entryNumber); - b_TA_Tru_barcode->GetEntry(entryNumber); - } -} - -void ntupleXML::SetActiveFile(Int_t fileNumber) { - if (activeFile != fileStore[fileNumber]) { - activeFile = fileStore[fileNumber]; - if (Warn>1) { std::cout << "\nntupleXML: Setting New Active Tree. "; } - //Associates branches with their variables - ntupleXML::SetBranches(); - } -} - -template<typename TYPE> -std::string ntupleXML::asString(const TYPE& x) { - std::ostringstream o; - o << std::setiosflags(ios::fixed); - if (!(o << x)) { - if (Warn>0) { std::cout << "\nntupleXML: Error in toString Conversion Function. "; } - return "ERROR"; - } - return o.str(); -} - diff --git a/graphics/AtlantisJava/share/specificconfig.jnlp b/graphics/AtlantisJava/share/specificconfig.jnlp deleted file mode 100644 index 46f896703eed..000000000000 --- a/graphics/AtlantisJava/share/specificconfig.jnlp +++ /dev/null @@ -1,83 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Template JNLP webstart file for Atlantis event display for ATLAS - with specific configuration file. --> -<jnlp - spec="1.0+" - codebase="@CODEBASE@" - href="@HREF@"> - <information> - <title>Atlantis event display for ATLAS</title> - <vendor>Atlantis team</vendor> - <homepage href=""/> <!-- should be used from codebase --> - <description>Atlantis event display for ATLAS</description> - <!-- <icon href="files/goofy_favicon.ico"/> - <icon kind="splash" href="files/logo.gif"/> --> - <offline-allowed/> - <shortcut online="false"> - <desktop/> - <menu submenu="Atlantis event display"/> - </shortcut> - </information> - <security> - <all-permissions/> - </security> - <resources> - <j2se version="1.6+" max-heap-size="512m"/> - - <jar href="lib/commons-cli-1.0.jar"/> - <jar href="lib/Jama.jar"/> - <jar href="lib/jas-aida-dev.jar"/> - <jar href="lib/jas-aida.jar"/> - <jar href="lib/jas-freehep-base.jar"/> - <jar href="lib/jas-freehep-hep.jar"/> - <jar href="lib/jas-jas-plotter.jar"/> - <jar href="lib/jas-jel.jar"/> - <jar href="lib/jas-JMinuit.jar"/> - <jar href="lib/jogl.jar"/> - <jar href="lib/jh.jar"/> - <jar href="lib/oncrpc.jar"/> - <jar href="lib/log4j-1.2.15.jar"/> - <jar href="lib/ostermillerutils_1_05_00.jar"/> - <jar href="lib/wired-base-4.0.beta.3-SNAPSHOT.jar"/> - <jar href="lib/ws-commons-util-1.0.2.jar"/> - <jar href="lib/xercesImpl.jar"/> - <jar href="lib/xml-apis.jar"/> - <jar href="lib/xmlrpc-client-3.1.jar"/> - <jar href="lib/xmlrpc-common-3.1.jar"/> - <jar href="lib/jlibeps.jar"/> - <jar href="lib/xmlrpc-server-3.1.jar"/> - <jar href="lib/commons-logging-1.1.jar"/> - <jar href="lib/commons-codec-1.4.jar"/> - <jar href="lib/xml-apis-ext.jar"/> - <jar href="lib/batik-dom.jar"/> - <jar href="lib/batik-anim.jar"/> - <jar href="lib/batik-svggen.jar"/> - <jar href="lib/batik-css.jar"/> - <jar href="lib/batik-bridge.jar"/> - <jar href="lib/batik-parser.jar"/> - <jar href="lib/batik-xml.jar"/> - <jar href="lib/batik-gui-util.jar"/> - <jar href="lib/batik-script.jar"/> - <jar href="lib/batik-transcoder.jar"/> - <jar href="lib/batik-svg-dom.jar"/> - <jar href="lib/batik-extension.jar"/> - <jar href="lib/batik-codec.jar"/> - <jar href="lib/batik-util.jar"/> - <jar href="lib/batik-swing.jar"/> - <jar href="lib/batik-ext.jar"/> - <jar href="lib/batik-gvt.jar"/> - <jar href="lib/batik-awt-util.jar"/> - <jar href="help/help.jar"/> - - <jar href="atlantis.jar" main="true"/> <!-- look for main class here --> - </resources> - - <application-desc main-class="atlantis.Atlantis"> - <argument>--config</argument> - <argument>configuration/@CONFIG@</argument> - <argument>--debug</argument> - <argument>DEBUG</argument> - </application-desc> - -</jnlp> - diff --git a/graphics/AtlantisJava/src/atlantis/ACommandLine.java b/graphics/AtlantisJava/src/atlantis/ACommandLine.java deleted file mode 100644 index 3c87dcf91062..000000000000 --- a/graphics/AtlantisJava/src/atlantis/ACommandLine.java +++ /dev/null @@ -1,399 +0,0 @@ -package atlantis; - -import atlantis.event.AEpsImageProducer; -import atlantis.event.AImageProducer; -import atlantis.event.AEventSource; -import atlantis.event.APngImageProducer; -import atlantis.event.ASvgImageProducer; -import atlantis.globals.AGlobals; -import atlantis.gui.AGUI; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; -import java.awt.Dimension; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.ParseException; - -/** - * This package-private class holds all the command line options - * as well as providing verification - * @author Sebastian Boeser - */ -class ACommandLine { - - //A help formatter - private final HelpFormatter formatter = new HelpFormatter(); - - private AGlobals globals = AGlobals.instance(); - - //The set of command-line options - private final Options options = new Options(); - - //The usage line - private static final String usage = "Atlantis [OPTIONS] [[-s]SOURCE]"; - - //The help message header and footer - private final String headerMsg; - private final String footerMsg; - - - /** - * Create all the options in the constructor. Options are sorted alphabetically in here. - */ - ACommandLine(){ - - //show HLTAutokey tracks - options.addOption(new Option("a", false, "show HLTAutoKey tracks")); - - //configuration file - options.addOption(OptionBuilder.withArgName("file") - .hasArg() - .withDescription("read configuration from specified file") - .withLongOpt("config") - .create("c") - ); - - - //debug - String debugDescr = "log messages of level to " + - "'stdout', optionally to file destination. " + - "Message levels are "+ ALogger.getStringLevels() + " (INFO is default)"; - options.addOption(OptionBuilder - .hasArg() - .hasOptionalArg() - .withArgName("level [destination]") - .withDescription(debugDescr) - .withLongOpt("debug") - .create('d') - ); - - - //help/usage - options.addOption(new Option("h", "help", false, "display this help message")); - - //demo mode - options.addOption(OptionBuilder.withArgName("projections") - .hasOptionalArg() - .withDescription("colon seperated list of projections for the demo mode (e.g \"-j YX:VP\"). " - + "Available projections/actions are YX, " - + "VP(" + AMath.PHI + AMath.ETA + "), " - + "RZ(" + AMath.RHO + "Z), " - + "FR(" + AMath.PHI + AMath.RHO + "), " - + "FZ(" + AMath.PHI + "Z), " - + "XZ(X'Z), " - + "YZ(Y'Z), " - + "LegoPlot, " - + "NE(next event)") - .withLongOpt("projection") - .create("j") - ); - - //loop mode - String loopDescr = "Set event navigation mode, supported values are " - +AEventSource.NavigationMode.LOOP.toString()+", " - +AEventSource.NavigationMode.RANDOM.toString()+", " - +AEventSource.NavigationMode.SEQUENTIAL.toString(); - options.addOption(OptionBuilder.withArgName("mode") - .hasArg() - .withDescription(loopDescr) - .withLongOpt("loop") - .create("l") - ); - - //color map - options.addOption(OptionBuilder.withArgName("file") - .hasArg() - .withDescription("read colourmap from specified file") - .withLongOpt("colormap") - .create("m") - ); - - // output image files - String outputDescr = "Output event image " + - "into directory dir (default: current directory) "+ - "of dimensions width x height (default: 800x828). "+ - "If height is not specified the aspect ratio of the canvas is used. " + - "If scale is given, images will be scaled by that factor (use for thumbnails). "+ - "If a filename is given, that file will be overwritten, "+ - "otherwise a new file will be created for each event. "+ - "The output format may be specified as PNG (the default) or EPS using" + - "the --outputformat option."; - options.addOption(OptionBuilder.hasOptionalArgs(4) - .withArgName("[dir] [width[xheight]] [scale] [filename]") - .withDescription(outputDescr) - .withLongOpt("output") - .create('o') - ); - - String outputFormatDescr = "output format for -o option (eps or png, default is png)"; - options.addOption(OptionBuilder.hasArg() - .withArgName("format") - .withDescription(outputFormatDescr) - .withLongOpt("outputformat") - .create('f') - ); - - //event loop intervall - options.addOption(OptionBuilder.withArgName("seconds") - .hasArg() - .withDescription("pause inbetween events and/or projections options") - .withLongOpt("pause") - .create("p") - ); - - //default source - String sourceDescr = "Set initial event source, e.g\n"+ - "* [file://]<filename>\n"+ - "* http://<url>\n"+ - "* xmlrpc://<server>:<port>\n"+ - "* oncrpc://<server>[:port][:stream]"; - options.addOption(OptionBuilder.withArgName("source") - .hasArg() - .withDescription(sourceDescr) - .withLongOpt("source") - .create("s") - ); - - //update config - options.addOption(new Option("x", "updateconfig", false, "update user's configuration file")); - - //max GUI width - options.addOption(OptionBuilder.withArgName("maxwidth") - .hasArg() - .withDescription("maximum screen width used by Atlantis") - .withLongOpt("maxwidth") - .create("w") - ); - - - //image server - options.addOption(OptionBuilder.hasArgs(1) - .withArgName("port") - .withDescription("Run a server on port <port> which accepts " + - "event data from a client and returns images") - .withLongOpt("imgserver") - .create('I') - ); - - - /** - * Now create header and footer Messages - */ - headerMsg = "\nMandatory arguments to long options are " + - "mandatory for short options too.\n"; - footerMsg = "\nAtlFast objects were supported up to " + - "AtlantisJava-09-05-28 via \"Fast\" option.\n" + - "Beginner simplified GUI was supported up to " + - "AtlantisJava-09-05-28 via \"Beginner\" option.\n" + - "CTB 2004 geometry was supported up to " + - "AtlantisJava-09-07-42 via -t, --testbeam option.\n"; - - } - - /** - * Parse and validate the command line options - */ - void process(String[] args){ - - //Create GNU style parse - CommandLineParser parser = new GnuParser(); - - //Now try parsing the options - try { - - //invoke GNU parser - CommandLine cmdLine = parser.parse(options, args); - - /** - * Now validate and process all options - */ - - //auto-keys - if(cmdLine.hasOption('a')) globals.setHLTAutoKeys(true); - - //config - if(cmdLine.hasOption('c')){ - Atlantis.configCommandLine = cmdLine.getOptionValue('c', null); - } - - //debug - if(cmdLine.hasOption('d')){ - //Get option values - String[] vals = cmdLine.getOptionValues('d'); - //this arg will always be there - String level = vals[0]; - if (! ALogger.getStringLevels().contains(level)) - throw new ParseException("Invalid logging level "+level); - //Check if there was also another argument - String destination = null; - if(vals.length == 2) destination = vals[1]; - - //Finally initialize the logger - ALogger.initialize(level,destination); - } - - //help - if(cmdLine.hasOption('h')) { - formatter.printHelp(usage, headerMsg, options, footerMsg); - System.exit(0); - } - - //image server - if(cmdLine.hasOption('I')){ - Atlantis.imageServerPort = Integer.parseInt(cmdLine.getOptionValue('I')); - if (Atlantis.imageServerPort < 0) - throw new ParseException("Port number "+cmdLine.getOptionValue('I')+ - " is not valid for -I option"); - //Check for other mutual exclusive options - if (cmdLine.hasOption('j') || cmdLine.hasOption('p')) - throw new ParseException("Can not use option -I with -j or -p options"); - } - - //demo mode projections - if(cmdLine.hasOption('j')){ - //NOTE: default is not null but "", so we can distinguish inbetween - //this flag being set or not w/o introducing more parameters - Atlantis.selectedProjections = cmdLine.getOptionValue('j', ""); - } - - //navigation mode - if(cmdLine.hasOption('l')){ - //Get arguments - String loopMode = cmdLine.getOptionValue('l',null); - if (loopMode == null) - throw new ParseException("Option -l needs an argument"); - Atlantis.initialMode = AEventSource.NavigationMode.valueOf(loopMode); - } - - - //color map - if(cmdLine.hasOption('m')){ - // retrieve the argument for options or assign default value - Atlantis.colormapCommandLine = cmdLine.getOptionValue('m', null); - } - - // generate PNG/EPS output files - if(cmdLine.hasOption('o')) - { - String format = "PNG"; - if (cmdLine.hasOption('f')) { - String formatVal = cmdLine.getOptionValue('f'); - format = formatVal.toUpperCase(); - if (!("EPS".equals(format)||"PNG".equals(format))) { - throw new ParseException("Invalid output format "+formatVal); - } - } - String[] vals = cmdLine.getOptionValues('o'); - this.processImageOutputOptions(vals,format); - } - - // generate PNG output files - if(cmdLine.hasOption('e')) - { - String[] vals = cmdLine.getOptionValues('e'); - this.processImageOutputOptions(vals,"EPS"); - } - - //source - if (cmdLine.hasOption('s')){ - //Simply set this as default event source - Atlantis.initialEventSource = cmdLine.getOptionValue('s'); - } - - //pause - if (cmdLine.hasOption('p')){ - //Check for integer value - String val = cmdLine.getOptionValue('p', null); - try { - Atlantis.loopInterval = Integer.parseInt(val); - } catch (NumberFormatException nfe) { - throw new ParseException("Invalid seconds value "+val+" for -p option"); - } - } - - //GUI width - if(cmdLine.hasOption('w')){ - String val = cmdLine.getOptionValue('w', null); - try { - int maxWidth = Integer.parseInt(val); - AGUI.getGUI().setMaxWidth(maxWidth); - } catch (NumberFormatException e) { - throw new ParseException("Invalid width value "+val+" for -w option"); - } - } - - //update config - if(cmdLine.hasOption('x')) Atlantis.updateConfig = true; - - //finally check for positional options (i.e w/o --opt) - String[] unspecifiedOpts=cmdLine.getArgs(); - if (unspecifiedOpts.length > 0){ - //We accept only one, which is a single string for the event source - if ((unspecifiedOpts.length != 1) - || cmdLine.hasOption('s') - || cmdLine.hasOption('I')){ - throw new ParseException("Can only specify one event source"); - } - Atlantis.initialEventSource = unspecifiedOpts[0]; - } - - } catch(ParseException ex) { - //Every error above should have thrown a parse exception - //Show help message and exit - System.err.println("\n" + ex.getMessage() + "\n"); - formatter.printHelp(usage, headerMsg, options, footerMsg); - System.exit(1); - } - - } - - private void processImageOutputOptions(String[] vals, String fileFormat) throws ParseException { - try - { - //vals[0] - directory to store events and png into - //Use current directory as default - String dir=System.getProperty("user.dir"); - if ((vals!=null)&&(vals.length > 0)) dir = vals[0]; - // vals[1] - WidthxHeight string - Dimension dim=new Dimension(800,828); - if ((vals!=null)&&(vals.length > 1)){ - short width = Short.parseShort(vals[1].split("x")[0]); - short height =-1; - if (vals[1].split("x").length > 1) - height = Short.parseShort(vals[1].split("x")[1]); - dim = new Dimension(width,height); - } - // vals[2] - scale factor, default is one - double scale = 1; - if ((vals!=null)&&(vals.length > 2)) scale = Double.parseDouble(vals[2]); - // vals[3] - fixed filename, default is null - String fixedFile = null; - if ((vals!=null)&&(vals.length > 3)) fixedFile = vals[3]; - //Now create a new image generator - if ("EPS".equals(fileFormat)) { - Atlantis.imageProducer = new AEpsImageProducer(dir,dim,scale,fixedFile); - } - else if ("PNG".equals(fileFormat)) { - Atlantis.imageProducer = new APngImageProducer(dir,dim,scale,fixedFile); - } - else if ("SVG".equals(fileFormat)) { - Atlantis.imageProducer = new ASvgImageProducer(dir,dim,scale,fixedFile); - } - else { - throw new Error("Invalid file format for output: "+fileFormat); - } - } catch (NumberFormatException nfe){ - throw new ParseException("Invalid parameters to option -o"); - } catch (IndexOutOfBoundsException iob){ - throw new ParseException("Invalid dimension parameter to option -o"); - } catch (AImageProducer.InstantiationException iex){ - throw new ParseException("Invalid configuration for option -o: "+iex.getMessage()); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/AOpenGLTools.java b/graphics/AtlantisJava/src/atlantis/AOpenGLTools.java deleted file mode 100644 index 02cbf863cc99..000000000000 --- a/graphics/AtlantisJava/src/atlantis/AOpenGLTools.java +++ /dev/null @@ -1,22 +0,0 @@ -package atlantis; - -import javax.media.opengl.GLCanvas; -import javax.media.opengl.GLCapabilities; - -/** - * Provides utility method to check if OpenGL is available. - * @author Adam - */ -public class AOpenGLTools { - - public static boolean isOpenGLAvailable() { - try { - GLCapabilities cap = new GLCapabilities(); - GLCanvas canv = new GLCanvas(cap); - } catch (Error e) { - // Expect some kind of hard exception if the class can't be loaded - return false; - } - return true; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/Atlantis.java b/graphics/AtlantisJava/src/atlantis/Atlantis.java deleted file mode 100644 index e54be406c3aa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/Atlantis.java +++ /dev/null @@ -1,770 +0,0 @@ -package atlantis; - -import java.awt.Toolkit; -import java.io.File; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; - -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Node; -import org.w3c.dom.Document; - -import atlantis.canvas.ACanvas; -import atlantis.config.ADefaultValues; -import atlantis.config.AConfigUpdater; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; - -import atlantis.geometry.AAtlasDetector; -import atlantis.geometry.ADetectorSystem; -import atlantis.globals.AGlobals; -import atlantis.graphics.colormap.AColorMap; -import atlantis.gui.ADemoDialog; -import atlantis.gui.AEventQueue; -import atlantis.gui.AGUI; -import atlantis.gui.AStartupWindow; -import atlantis.gui.AEventLoopDialog; -import atlantis.output.AExceptionHandler; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AUtilities; -import atlantis.utils.xml.AXMLErrorHandler; -import atlantis.utils.xml.AXMLEntityResolver; -import atlantis.utils.xml.AXMLUtils; -import atlantis.event.AImageProducer; -import atlantis.event.AEventSource; -import atlantis.utils.ALogger; -import atlantis.event.xmlrpc.AServerXMLRPC; -import atlantis.event.xmlrpc.AServerXMLRPCEventSource; -import atlantis.gui.ACrashReporter; -import atlantis.gui.ADemoLoop; -import atlantis.interactions.AInteractionsConfigReader; -import atlantis.utils.ANewIdHelper; -import atlantis.utils.xml.AXMLEntityResolver; - -import java.util.Arrays; -import java.util.Vector; -import javax.swing.JOptionPane; - - -/** - * Main class of Atlantis application. - * Initialises the application's main components and provides access to them. - */ -public class Atlantis -{ - // The main class logger gets initialized after command line options - // are processed. All other classes will just do - // logger = ALogger.getLogger(Class.class) in their attribute definitions - private static ALogger logger = null; - - /** Store for Atlantis global state. */ - private static AGlobals globals = AGlobals.instance(); - - // expands into SVN tag - private static String versionAtlantisJava = "$HeadURL: file:///atlas/scratch0/graemes/ao-mirror/graphics/AtlantisJava/tags/AtlantisJava-09-16-05-18/src/atlantis/Atlantis.java $"; - - private static final String FILE_SEPAR = System.getProperty("file.separator"); - private static final String USER_HOME_DIR = System.getProperty("user.home"); - - // This is the URL that is used as default for "Read events from URL" - // The stream is set to "Default" as this is the only one guaranteed to be there. - private static final String LIVE_POINT_1_EVENTS_URL = - "http://atlas-live.cern.ch/event_files/Default"; - - // expected file name of the user customised configuration file - // (stored in the user's home directory) - private static final String USER_CONFIG_FILE_PATH = - USER_HOME_DIR + FILE_SEPAR + ".Atlantis-config.xml"; - - // configuration file from the Atlantis distribution (default config) - private static final String DISTRIB_DEFAULT_CONFIG_FILE = - "configuration" + FILE_SEPAR + "config.xml"; - - // this is checksum file of the distribution's main configuration file - // if it doesn't match, Atlantis tries to update user's configuration - // or the --config <configfile> configuration - // it is an indicator that the master config.xml changed - private static final String CONFIG_CHECKSUM_FILE_PATH = - USER_HOME_DIR + FILE_SEPAR + ".Atlantis-config.chk"; - - // limit the total width of Atlantis to this number of pixels (0 = screen width) - private static int MAX_WIDTH = 0; - - /** - * The list of parameters that can be set from the command line - */ - // force Atlantis to update the personal configuration file - protected static boolean updateConfig = false; - // configuration file specified as command line argument - protected static String configCommandLine = null; - // colormap file specified as command line argument - protected static String colormapCommandLine = null; - // selected projections specified as command line argument for demo mode - protected static String selectedProjections = null; - // timer delay from command line for reading events in a loop - protected static Integer loopInterval = null; - // navigation mode from command line - protected static AEventSource.NavigationMode initialMode = null; - // initial event source, may be specified from command line - protected static String initialEventSource = "events"+FILE_SEPAR+"test_events.zip"; - // Object for saving event images in a directory - protected static AImageProducer imageProducer = null; - // Port number for image server from command line - protected static int imageServerPort = -1; - - private static final boolean atlantisWithOpenGL = false; - - private static final String INIT_ERROR_MSG = - "Error during Atlantis initialization.\n" + - "(configuration file related issues might be\n" + - "corrected by running with -x (updating customised configuration)).\n" + - "See console output for more information."; - - // main Atlantis components - private static APar parameterStore = null; - private static AEventManager eventManager = null; - private static ADetectorSystem detector = null; - private static ACanvas canvas = null; - private static AGUI gui = null; - - /** - * Returns the delay for timer for automatic event reading from server - * when this option was specified as command line argument - * @return the delay in seconds - */ - private static Integer getLoopInterval() - { - return loopInterval; - } - - - /** - * Set the default java look and feel ("metal") - */ - private static void setLookAndFeel() - { - try { - UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); - } catch(Exception e) { - AExceptionHandler.processException("Error setting default Look and Feel", e); - } - } - - - /** - * Check if the checksum file CONFIG_CHECKSUM_FILE_PATH is up-to-date. - * Create one if it does not exist or update it if it is not up-to-date. - */ - private static void checkAndUpdateConfigCheckSumFile(String distribFile) - throws AAtlantisException - { - if(Atlantis.updateConfig) - { - logger.info("Checksum not checked, run with -x, configuration update " + - "forced anyway."); - return; - } - - logger.info("Checking if the used configuration is up-to-date ..."); - - logger.debug("Checking checksum of the configuration file from the " + - "Atlantis distribution: " + distribFile); - logger.debug("Checksum file: " + CONFIG_CHECKSUM_FILE_PATH); - - boolean checkSumExists = new File(CONFIG_CHECKSUM_FILE_PATH).exists(); - - if(checkSumExists) - { - boolean comparison = AConfigUpdater.compareChecksums(distribFile, - CONFIG_CHECKSUM_FILE_PATH); - if(comparison) - { - logger.debug("Checksum file - checksum match, no update necessary."); - Atlantis.updateConfig = false; - return; - } - } - - // doesn't match, force update of custom configuration - // and re-generate checksum - AConfigUpdater.createChecksumFile(distribFile, CONFIG_CHECKSUM_FILE_PATH); - logger.debug("Checksum didn't match, updating customised " + - "configuration forced."); - Atlantis.updateConfig = true; - - } // checkAndUpdateConfigCheckSumFile() --------------------------------- - - - - /** - * Returns InputStream to read XML application configuration from. - * - * Evaluates sources from which Atlantis XML configuration is - * possibly loaded from (prioritised): - * 1) -c, --config <configfile.xml> specified on the command line - * here available in configCommandLine variable - * 2) if USER_CONFIG_FILE_PATH exists, read that one - * 3) or eventually read <ATLANTIS_DIRECTORY>/DISTRIB_DEFAULT_CONFIG_FILE - * - * User's customised (in the home directory) or --config <configfile> are - * also tried to be updated when the checksum configuration file doesn't - * match. Atlantis calculates checksum of the main distribution - * configuration file and stores that checksum in CONFIG_CHECKSUM_FILE_PATH. - * If this checksum doesn't match when Atlantis is run on the user's - * home directory configuration or --config <configfile> configuration, - * automatic configuration file update process is executed. - * - * Updating means that config.xml (main, base) contains some changes - * which are not consistent with the user's config or custom config - * and they need to be propagated there. - * Update process: - * AConfigUpdater.updateConfigurationFile(distribFilePath, configToUse) - * is then executed. - * - * Do not try to update custom configuration which is located in the same - * directory as the base config file - it means that such custom config - * comes with AtlantisJava distribution - no need updating this one. - */ - private static InputStream getXMLConfigAsStream() throws Exception - { - String configToUse = null; - - logger.info("Reading the XML configuration ..."); - - // configuration file from the Atlantis distribution - String distribFilePath = getHomeDirectory() + DISTRIB_DEFAULT_CONFIG_FILE; - - // distribution config file checksum only taken into account when having - // --config command line argument or when running from user's (home - // directory) configuration - - // option / source 1) - command line argument - highest priority - if(configCommandLine != null) - { - logger.info("Using configuration file specified on the command " + - "line: " + configCommandLine); - // sets Atlantis.updateConfig = true; accordingly - checkAndUpdateConfigCheckSumFile(distribFilePath); - configToUse = configCommandLine; - } - else - { - // check if we can read the user configuration file (in home dir.) - // option / source 2) - if(new File(USER_CONFIG_FILE_PATH).exists()) - { - logger.info("Using user's configuration file: " + - USER_CONFIG_FILE_PATH); - // sets Atlantis.updateConfig = true; accordingly - checkAndUpdateConfigCheckSumFile(distribFilePath); - configToUse = USER_CONFIG_FILE_PATH; - } - else - { - // // option / source 3) - logger.info("Using distribution configuration file: " + - distribFilePath); - if(Atlantis.updateConfig) - { - logger.warn("Update custom configuration flag is set, " + - "that doesn't make sence - no custom config " + - "file available, ignored."); - Atlantis.updateConfig = false; - } - configToUse = distribFilePath; - } - } - - - try - { - // try to update custom configuration before loading it - if(Atlantis.updateConfig) - { - logger.info("Updating customised configuration file ..."); - // check if configToUse comes from atlantis home directory, if - // so, then configToUse is from AtlantisJava distribution, should - // already be up-to-date and no automatic update will be performed - String atlantisHome = Atlantis.getHomeDirectory(); - String customConfigDir = new File(configToUse).getAbsolutePath(); - - logger.info("Updating configuration - customised config directory: " + - customConfigDir); - // if configToUse comes from AtlantisJava distribution, customConfigDir - // path start with atlantisHome path plus 'configuration' directory - // (does not filter off webstart since .getHomeDirectory() - // returns user's home directory when running via webstart, - // the condition below should be improved to cover webstart situation - // as well ...) - if(customConfigDir.startsWith(atlantisHome)) - { - logger.debug("Updating configuration - Atlantis home: " + atlantisHome); - logger.info("Updating configuration - customised config directory " + - "is in the Atlantis home, no need updating it."); - } - else - { - AConfigUpdater.updateConfigurationFile(distribFilePath, - configToUse); - } - } - } - catch(AAtlantisException aae) - { - logger.error(aae.getMessage()); - } - - - InputStream isConfig = null; // configuration file input stream - try - { - isConfig = AUtilities.getFileAsStream(configToUse); - } - catch(AAtlantisException aae) - { - String m = "Could not read " + configToUse + " reason: " + - aae.getMessage(); - throw new Exception(m); - } - - logger.info("Going to parse XML configuration: " + configToUse); - return isConfig; - - } // getXMLConfigAsStream() --------------------------------------------- - - - - private static void initAtlantis() { - - String homeDirectory = Atlantis.getHomeDirectory(); - globals.setHomeDirectory(homeDirectory); - - //Create startup window and set how often - //the progress bar will get update below - AStartupWindow startupWin = new AStartupWindow(9); - - try { - System.setProperty("sun.awt.exception.handler", - "AExceptionHandler"); - - startupWin.updateText("Atlantis initialisation"); - - //Show atlantis home - logger.info("Atlantis home: "+homeDirectory); - - //Create an event manager - eventManager = AEventManager.instance(); - - // reading Atlantis runtime configuration (text file in the home directory) - logger.info("Reading Atlantis runtime configuration, file: " + - ADefaultValues.CONFIGFILE); - ADefaultValues.readRuntimeValues(); - - - // read the configuration xml files ------------------------- - startupWin.updateText("Reading Atlantis configuration"); - - // evaluate configuration sources options and get the configuration - InputStream isConfig = getXMLConfigAsStream(); - - // prepare XML parser for parsing the XML configuration - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(true); - DocumentBuilder parser = factory.newDocumentBuilder(); - parser.setErrorHandler(new AXMLErrorHandler()); - parser.setEntityResolver(new AXMLEntityResolver()); - - // parse the XML configuration - String configBase = homeDirectory + FILE_SEPAR + "configuration" + FILE_SEPAR; - Document xmlConfigDoc = parser.parse(isConfig, configBase); - Node rootNode = xmlConfigDoc.getDocumentElement(); - // read the XML initialization node, and performs initialization - Node initializationNode = AXMLUtils.getChild(rootNode, "Initialization"); - - // parse the ID dictionary - String geometryBase = homeDirectory + FILE_SEPAR + "geometry" + FILE_SEPAR; - InputStream isIdDict = AUtilities.getFileAsStream(geometryBase+"ATLAS_IDS.xml"); - Document xmlDictDoc = parser.parse(isIdDict, geometryBase); - ANewIdHelper.construct(xmlDictDoc.getDocumentElement()); - - - // read colour map (colormap.xml) configuration ----------------- - startupWin.updateText( "Reading colour map"); - AColorMap.readColorMap(Atlantis.colormapCommandLine); - - - // creating canvas ---------------------------------------------- - startupWin.updateText("Building canvas and projections"); - Node canvasNode = AXMLUtils.getChild(initializationNode, "Canvas"); - canvas = ACanvas.construct(canvasNode); - - // reading parameters ------------------------------------------ - logger.info("Building parameters"); - parameterStore = APar.construct(AXMLUtils.getChild(rootNode, "Parameters")); - parameterStore.update(AXMLUtils.getChild(rootNode, "ParameterDifferences")); - eventManager.addNewEventListener(parameterStore); - // creating the Projections Manager (reading the projections) - Node interactionsNode = - AXMLUtils.getChild(initializationNode, "Interactions"); - AInteractionsConfigReader.readInteractions(interactionsNode); - AProjectionsManager.initialise(); - - //set the output flag: 0 normal 1 eta/phi/pt 2 px/py/pz 3 eta/phi/pt/px/py/pz - if(parameterStore.get("Minerva","alternativesimpleoutput").getStatus()){ - if(parameterStore.get("Minerva","simpleoutput").getStatus()){ - globals.setSimpleOutput(3); - }else{ - globals.setSimpleOutput(2); - } - }else if(parameterStore.get("Minerva","simpleoutput").getStatus()){ - globals.setSimpleOutput(1); - } - - // reading the geometry ---------------------------------------- - startupWin.updateText("Reading geometry"); - String geomPrefix = Atlantis.getHomeDirectory() + "geometry" + - Atlantis.FILE_SEPAR; - String geomName = ADefaultValues.get("GeometryName"); - if (!"".equals(geomName)) { - // name of the geometry considered after underscore - geomName = "_" + geomName; - - // do the geometry files exist - just try loading the files - String geomNameFull1 = geomPrefix + "AGeometry" + geomName + ".xml"; - String geomNameFull2 = geomPrefix + "AMuonGeometry" + geomName + ".xml"; - try { - // just accessibility test - @SuppressWarnings("unused") - InputStream i = AUtilities.getFileAsStream(geomNameFull1); - i = AUtilities.getFileAsStream(geomNameFull2); - i = null; - } catch (AAtlantisException ae) { - geomName = ""; // will fall back to default geometry - } - } - String geomIdCalo = geomPrefix + "AGeometry" + geomName + ".xml"; - String geomMuon = geomPrefix + "AMuonGeometry" + geomName + ".xml"; - detector = new AAtlasDetector(geomIdCalo, geomMuon); - AAtlasDetector.setDetector(detector); - - canvas.finalizeConstruction(); - canvas.readCorners(AXMLUtils.getChild(rootNode, "WindowCorners")); - // This is needed here, design should be changed to remove this problem - canvas.setCurrentWindow(canvas.getCurrentWindowName()); - - //Add the canvas as a NewEvent event listener - eventManager.addNewEventListener(canvas); - - // reading the first event -------------------------------------- - startupWin.updateText("Reading initial event"); - getInitialEvent(); - - // displaying GUI, Canvas --------------------------------------- - startupWin.updateText("Displaying GUI and Canvas"); - - // update colors to those selected in the config file - AColorMap.setColorMap(parameterStore.get("Prefs", "ColorMap").getI()); - // NB: must calculate the size of GUI after calling - // canvas.setVisible(true), in which the real final size of Canvas - // will be calculated - canvas.setCanvasVisible(true); - - // Now the canvas is on the screen and have a size, check if we need - // to rework the aspect ratio on YX projections at all as is the case - // when going to control room projectors for example - AD - canvas.correctAspectRatios(); - - //Create the GUI - gui = AGUI.getGUI(); - - //If we got one, show it (e.g. not in headless mode) - if (gui != null){ - gui.setMaxWidth(MAX_WIDTH); - gui.setName("Atlantis GUI"); // Name is used by JUnit/FEST tests - // Tell the parameter store about the GUI so it can inform the GUI of parameter changes - parameterStore.addParameterChangeListener(gui); - //Display it - gui.setVisible(true); - // and register as a layout change listener - canvas.addOverlay(); - canvas.addLayoutChangeListener(gui); - } - - //Before starting any loops, inform user we are ready to go - startupWin.updateText("Atlantis Ready"); - - // Set the navigation mode if given on the command line. - // Use SwingUtilities.invokeLater() to "defer until all pending events - // have been processed", avoiding the deadlock that otherwise occurs. - if (Atlantis.initialMode != null){ - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - try { - eventManager.setNavigationMode(initialMode); - } catch (InvalidEventSourceException e) { - logger.error("Invalid event source", e); - } - } - }); - } - - //Set up event loop if requested - if ((Atlantis.loopInterval != null) - && (Atlantis.selectedProjections == null ) - && (!AGlobals.isAtlantisHeadless()) ) { - // A loop interval has been given, but no projections - - // so create an event loop dialog, but not in headless mode - AEventLoopDialog dialog = AEventLoopDialog.getInstance(); - - //set all properties - dialog.setUpdateInterval(getLoopInterval()); - dialog.showDialog(); - dialog.startEventLoop(); - } - - //setup demo loop if requested - if (Atlantis.selectedProjections != null) { - //If user just gave -j, use default settings - if (Atlantis.selectedProjections.equals("")) - ADemoDialog.getInstance().setDefaultSequence(); - //User may also give the update interval - if (getLoopInterval() != null) - ADemoDialog.getInstance().setTimerInterval(getLoopInterval()); - ADemoDialog.getInstance().setVisible(true); - ADemoDialog.getInstance().startDemo(); - } - - //Add an image server if requested on the command line - if (imageServerPort >= 0) { - AServerXMLRPC serv = new AServerXMLRPC(imageServerPort, AServerXMLRPCEventSource.class); - serv.start(); - } - - //If we have a image saver, add it now as new event listener - if (imageProducer != null){ - eventManager.addNewEventListener(imageProducer); - //if we are also running in headless mode, add an automatic event loop - if (AGlobals.isAtlantisHeadless()){ - //Check whether the event source is a file or an ONCRPC server - //For a server, start the loop in a "try hard" mode, i.e only stop on ReadEventException - boolean stopOnFailure = !(eventManager.getEventSource() instanceof atlantis.event.oncrpc.AONCRPCEventSource ); - //If a loop interval is given on the command line, use it, - //otherwise, run in "as fast as can mode" - int sleepTime = (Atlantis.loopInterval != null) ? Atlantis.loopInterval*1000 : 0; - //Show warning in case of "as fast as we can mode" - if (sleepTime == 0) logger.info("No loop intervall given - processing events as fast as possible"); - //Now create the loop - ADemoLoop loop = new ADemoLoop(sleepTime,new Vector<String>(Arrays.asList("NE")),stopOnFailure); - //And start it right away - loop.startDemoLoop(); - //also wait for it to finish before the program finishes - synchronized (loop) { loop.wait(); } - } - } - - } catch (Exception e) { - logger.fatal(INIT_ERROR_MSG); - logger.fatal(e.getMessage(), e); - AExceptionHandler.processException(INIT_ERROR_MSG, e); - } finally { - if (startupWin != null) { - startupWin.dispose(); - } - } - - } // initAtlantis() ----------------------------------------------------- - - - protected static String getHomeDirectory() - { - // where was this class loaded from - String temp = Atlantis.class.getResource("Atlantis.class").getFile(); - - // remove "file://" or "file:" - if (temp.startsWith("file://")) { - temp = temp.substring(7); - } else if (temp.startsWith("file:")) { - temp = temp.substring(5); - } - - if(temp.indexOf("!") > -1) - { - // atlantis is in a .jar file - temp = temp.substring(0, temp.indexOf("!")); - temp = temp.replaceAll("%20", " "); - return temp.substring(0, temp.lastIndexOf('/') + 1); - } - // must be the current working directory of the user - return System.getProperty("user.dir") + FILE_SEPAR; - - } // getHomeDirectory() ------------------------------------------------- - - /** - * Process the options passed on the command line - * @param args the command line arguments - */ - private static void processCommandLineParameters(String args[]) - { - - //echo the given command line options - System.out.println("Command line arguments:"); - for(String arg : args) System.out.print(arg + " "); - System.out.println("\n"); - - //Then go and process the command line - (new ACommandLine()).process(args); - - } // processCommandLineParameters() ------------------------------------- - - - /** - * Try to read the initial event - * - from the given event source - * - from the default event - */ - private static void getInitialEvent() - { - //Get the file where the default event is stored - //if not a special source - String eventPath = Atlantis.initialEventSource; - - // if this is not a special source then consider it - // a) to be a file with relative or absolute path - // b) to be a file relative to the Atlantis directory - if (! eventPath.contains("://") ) { - //This should be a file, see if it exists - if(! new File(eventPath).exists()) { - //try prepending atlantis home directory - logger.info("File "+eventPath+" does not exist - trying in "+Atlantis.getHomeDirectory()); - eventPath = Atlantis.getHomeDirectory()+eventPath; - } - - //All non specified sources are assumed to be files - eventPath = "file://" + eventPath; - } - - //be verbose - logger.info("Reading the default event from " + eventPath); - //set the event source and read an event - try { - eventManager.setEventSource(eventPath); - eventManager.nextEvent(); - } catch (InvalidEventSourceException ies){ - //Write error message - String msg = "Can not access "+eventPath+": "+ies.getMessage(); - logger.error(msg); - //Show error dialog - if (AGlobals.isAtlantisHeadless()) return; - JOptionPane.showMessageDialog(ACanvas.getCanvas(), msg, - "Invalid Event Source",JOptionPane.ERROR_MESSAGE); - } catch (NoMoreEventsException nme){ - String msg = "No events in "+eventPath+": "+nme.getMessage(); - logger.error(msg); - //Show error dialog - if (AGlobals.isAtlantisHeadless()) return; - JOptionPane.showMessageDialog(ACanvas.getCanvas(), msg, - "No Events found",JOptionPane.ERROR_MESSAGE); - } catch (ReadEventException rex){ - String msg = "Can not read events from "+eventPath+": "+rex.getMessage(); - logger.error(msg); - //Show error dialog - if (AGlobals.isAtlantisHeadless()) return; - JOptionPane.showMessageDialog(ACanvas.getCanvas(), msg, - "Can not read event",JOptionPane.ERROR_MESSAGE); - } - } - - /** - * Get the SVN tag version from the HeadURL, which is automatically - * substituted by SVN. - */ - private static void setSVNTagInfo() - { - // SVN expands into $HeadURL: file:///atlas/scratch0/graemes/ao-mirror/graphics/AtlantisJava/tags/AtlantisJava-09-16-05-18/src/atlantis/Atlantis.java $, - // we only want the tag name - String s = Atlantis.versionAtlantisJava; - // 0) Check we are in a tagged version - if (!s.contains("tags")){ - Atlantis.versionAtlantisJava = "AtlantisJava (SVN tag n/a)"; - return; - } - // 1) Replace anything after src - s=s.substring(0,s.indexOf("/src")); - // 2) Next find the "tags" subdir and cut after that - s=s.substring(s.indexOf("tags/")+5); - //this should be the version - Atlantis.versionAtlantisJava = s; - } - - public static void main(String[] args) - { - - /** - * First thing always: say hello with a version number - */ - //Retrieve the SVN version tag number - setSVNTagInfo(); - globals.setVersion(versionAtlantisJava); - globals.setLivePoint1EventsURL(LIVE_POINT_1_EVENTS_URL); - globals.setUserConfigFile(USER_CONFIG_FILE_PATH); - globals.setUseOpenGL(atlantisWithOpenGL); - System.out.println("AtlantisJava version (SVN tag): " + Atlantis.versionAtlantisJava); - - // Any uncaught exception should be reported to the developers - Thread.setDefaultUncaughtExceptionHandler(new ACrashReporter()); - - /** - * Now run all the checks for system properties - */ - - //Now set the default look and feel - setLookAndFeel(); - - // Disable rename file/make new directory from the file chooser - UIManager.put("FileChooser.readOnly", Boolean.TRUE); - - /** - * Process the command line parameters - */ - //process args - processCommandLineParameters(args); - - //Logger can be created only after cmdl opts to catch settings - logger = ALogger.getLogger(Atlantis.class); - - //Do some OGL checks - if (Atlantis.atlantisWithOpenGL) { - logger.info("Testing for OpenGL"); - logger.info(AOpenGLTools.isOpenGLAvailable() ? "Open GL Available" : "Open GL Unavailable"); - } - - /** - * Now go and create the manifold Atlantis classes and singletons. - * Has to run on main thread so display is updated during initialization. - */ - initAtlantis(); - // Replace event queue by AEventQueue, but only after initialization. - try { - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - logger.debug("Waiting for AWT event queue to be empty."); - } - }); - } catch (InterruptedException e) { - logger.error("Interrupted while waiting for event queue.", e); - } catch (InvocationTargetException e) { - logger.error("Error while waiting for event queue.",e); - } - Toolkit.getDefaultToolkit().getSystemEventQueue().push(new AEventQueue()); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ACanvas.java b/graphics/AtlantisJava/src/atlantis/canvas/ACanvas.java deleted file mode 100755 index 41b32a59cbc3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ACanvas.java +++ /dev/null @@ -1,1113 +0,0 @@ -package atlantis.canvas; - -import atlantis.event.AEvent; -import atlantis.event.ANewEventListener; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.geom.Point2D; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Stack; -import java.util.Vector; -import java.util.Set; - -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JLayeredPane; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.globals.AGlobals; -import atlantis.graphics.ACursorFactory; -import atlantis.graphics.AIcon; -import atlantis.graphics.layout.AGridLayout; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.utils.xml.AXMLUtils; -import atlantis.gui.AClosingConfirmationDialog; -import atlantis.gui.AInteractionToolBar; -import atlantis.gui.APreferencesControl; -import atlantis.interactions.AZMRInteraction; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionEventInfo; -import atlantis.utils.ALogger; -import java.awt.Graphics; -import java.awt.event.WindowFocusListener; -import java.util.Iterator; -import javax.swing.JMenuBar; -import javax.swing.JPanel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -/** - * ACanvas is a singleton class that acts as a sort of WindowManager It knows the currentLayout (of the - * windows), their history and the currentWindow. It also contains the title (Menu Bar). - * Window changes are given via two letter commands e.g. "W5" inserted into the - * CommandProcessor (static). The command processor informs ACanvas. - * Each window also has its own layer that is stored in a JLayeredPane object. - */ -public class ACanvas extends JPanel implements ANewEventListener { - - //Singleton instance - private static ACanvas instance; - - private final static ALogger logger = ALogger.getLogger(ACanvas.class); - - /** The fraction of the screen width used by default. */ - public final double SCREEN_USAGE = 0.73; - /** Temporary flag to set the window corners from config file. */ - protected boolean customisedCorner = false; - - //the layeredPane - private JLayeredPane layeredPane; - //from some reason we count or layers from 1000 on? - private final int baseLayer = 1000; - - //A list of layout names and layouts - private Hashtable<String, ALayout> layouts = new Hashtable<String, ALayout>(); - //The current canvas layout - private ALayout currentLayout; - //The name of the startup layout - private String startupLayoutName; - //Everyone that should get informed if the layout is changed - private Vector<ALayoutChangeListener> layoutChangeListeners = new Vector<ALayoutChangeListener>(); - - //Save a history of the windows layouts - // - this is used for "Zoom/Unzoom colorimters" in VPlot - private Stack<ALayout> windowLayoutHistory = new Stack<ALayout>(); //History of ALayout objects - private Stack<String> windowNameHistory = new Stack<String>(); //History of the selected window - private Stack<Vector<String>> windowsActive = new Stack<Vector<String>>(); //History of active (i.e. visible windows) - - private Hashtable<String,AWindow> windowsList; // A list of all window <name,object> pairs - private AWindow currentWindow; // The currently selected window - private AWindow paintingWindow; // The window we are currently painting in - //Everyone that should get informed about changes of the active window - private Vector<ChangeListener> windowChangeListeners = new Vector<ChangeListener>(); - //Everyone that should get informed about window freeze/unfreeze changes - private Vector<ChangeListener> lockChangeListeners = new Vector<ChangeListener>(); - - //The title bar showing Event/Run numbers etc. - private ATitleMenuBar title; - - //If constructed from a config file, this stores the aspect ratio of the - //canvas layout which was saved into the config file, this is then used - //later to correct if the current screen is different - private double oldaspect = 1.0; - - private JFrame parentWindow = null; - - private APar parameterStore; - - /** - * Get the singleton instance. - * @return - */ - public static synchronized ACanvas getCanvas() { - if (instance==null) throw new Error("Attempted to access ACanvas instance before initialization."); - return instance; - } - - /** - * Create and return the singleton instance. - * @param parameters - */ - public static synchronized ACanvas construct(Node node) { - instance = new ACanvas(node); - return instance; - } - - /** - * Constructs the singleton instance by reading the config file. - */ - private ACanvas(Node node) { - - if (!AGlobals.isAtlantisHeadless()) { - // Create parent window - parentWindow = new JFrame("Atlantis Canvas"); - parentWindow.add(this); - } - - //Create the title bar - title = new ATitleMenuBar(); - - if (!AGlobals.isAtlantisHeadless()) { - parentWindow.setJMenuBar(title); - } - - //instanciate instance pointer for singleton class - instance = this; - - if (!AGlobals.isAtlantisHeadless()) { - // AClosingConfirmationDialog class handles closing Atlantis - parentWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - parentWindow.addWindowListener(new AClosingConfirmationDialog(parentWindow)); - - //Set the window icon - AIcon.setIconImage(parentWindow); - } - - // building the Layered Pane - layeredPane = new JLayeredPane(); - - // reading all the content of Canvas configuration node - windowsList = new Hashtable<String,AWindow>(); - // Allow null Node to generate partially initialized instance for unit tests of - // other classes that depend on ACanvas. - if (node!=null) readConfig(node); - - } // ACanvas() ---------------------------------------------------------- - - /** - * For testing only: create instance without initializing. - * @return - */ - public static synchronized ACanvas constructDummyForTesting() { - instance = new ACanvas(null); - return instance; - } - - void addParentWindowFocusListener(WindowFocusListener wfl) { - if (parentWindow != null) { - parentWindow.addWindowFocusListener(wfl); - } - } - - public void setCanvasVisible(boolean v) { - if (parentWindow != null) { - parentWindow.setVisible(v); - } else { - setVisible(v); - } - } - - public Rectangle getScreenSize() { - if (parentWindow != null) { - return parentWindow.getGraphicsConfiguration().getBounds(); - } else { - // If we're headless then make up a size! - return new Rectangle(1024, 768); - } - } - - public Rectangle getStartupCanvasSize() { - if (parentWindow == null) { - return null; - } - Rectangle canvpos = parentWindow.getBounds(); - Dimension canvlayoutdim = parentWindow.getPreferredSize(); - Rectangle canvbound = new Rectangle(canvpos.x, canvpos.y, - canvlayoutdim.width, canvlayoutdim.height); - - return canvbound; - } - - public JMenuBar getTitleBar() { - if (parentWindow == null) { - return null; - } - return parentWindow.getJMenuBar(); - } - - public void bringToFront() { - if (parentWindow != null) { - parentWindow.toFront(); - } - } - - /*public JFrame getParentWindow() { - return parentWindow; - }*/ - - private void readConfig(Node node){ - - //Get a list of subnodes - NodeList children = node.getChildNodes(); - - //Loop over all subnodes - for (int i = 0; i < children.getLength(); i++) { - Node child = children.item(i); - //Check wether subnode is a Window or a Layout - if (child.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = child.getNodeName(); - //Add a Window or a layout - if (nodeName.equals("UsedWindow")) readWindow(child); - else if (nodeName.equals("Layout")) readLayout(child); - } - } - - // reading all the attributes of Canvas node - NamedNodeMap attributes = node.getAttributes(); - // The startupLayout: - startupLayoutName = attributes.getNamedItem("startupLayout").getNodeValue().trim(); - - // Aspect ratio stuff: - oldaspect = Double.NaN; - Node n = attributes.getNamedItem("aspectRatio"); - - if (n != null) { - oldaspect = Double.parseDouble( - attributes.getNamedItem("aspectRatio").getNodeValue().trim()); - } - - logger.debug("Read config file with aspectRatio: " + oldaspect); - } - - //Read window configuration - private void readWindow(Node node) { - AWindow w = AWindow.createFromXMLConfigNode(node, getWindowsCount()); - - if (!windowsList.containsKey(w.getName())) { - windowsList.put(w.getName(), w); - } else - throw new Error("Redefinition of window: " + w.getName()); - } - - //Read layout configuration - private void readLayout(Node node) { - ALayout layout = new ALayout(node); - - if (!layouts.containsKey(layout.getName())) - layouts.put(layout.getName(), layout); - else - throw new Error("Redefinition of layout: " + layout.getName()); - } - - //Read window corners - public void readCorners(Node corners) { - if (corners == null) - return; - //Set flag to set default corners - customisedCorner = true; - //Get list of corners - NodeList children = corners.getChildNodes(); - //Loop over corners - for (int i = 0; i < children.getLength(); i++) { - Node corner = children.item(i); - if (corner.getNodeType() == Node.ELEMENT_NODE) { - //Get corner attributes - NamedNodeMap attributes = corner.getAttributes(); - String windowName = AXMLUtils.tryAttribut(attributes, "windowName"); - double x0 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "x0")); - double y0 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "y0")); - double x1 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "x1")); - double y1 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "y1")); - double x2 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "x2")); - double y2 = Double.parseDouble(AXMLUtils.tryAttribut(attributes, "y2")); - //Create an array with new window corners - Point2D.Double[] c = new Point2D.Double[] { new Point2D.Double(x0, y0), new Point2D.Double(x1, y1), new Point2D.Double(x2, y2) }; - //Set the corners for this window - - getWindow(windowName).setUserCorners(c); - } - } - customisedCorner = false; - } - - - //Finalize the canvas construction - public void finalizeConstruction() { - parameterStore = APar.instance(); - - if (!parameterStore.get("Prefs", "CanvasTitle").getStatus()) { - title.setVisible(false); - } - - //Bring the startup layout on screen - setCurrentLayout(startupLayoutName); - } - - public void addOverlay() { - - AOverlay overlay = new AOverlay(); - if(parentWindow != null) - parentWindow.setGlassPane(overlay); - overlay.setVisible(true); - } - - public void correctAspectRatios() { - - // If we didn't have a saved aspect ratio or didn't know it when - // the config was written - if (Double.isNaN(oldaspect)) { - return; - } - - // Only correct aspect ratio for the full screen layout, the other - // layouts have fixed aspect ratios and should always be okay - if (!currentLayout.getName().equals("FULL SCREEN")) { - return; - } - - // If aspect ratios are the same, we can stop - if (java.lang.Math.abs(getAspectRatio() - oldaspect) < 1e-2) { - logger.debug("Aspect ratio of config file same as this display, no correction required"); - return; - } - - logger.info("Aspect ratio of config file (" + oldaspect + ") does not match this display (" + getAspectRatio() + ") attempting to correct"); - - // Else, iterate over all windows - Iterator<AWindow> it = windowsList.values().iterator(); - while(it.hasNext()) { - AWindow w = (AWindow)(it.next()); - AProjection p = w.getProjection(); - if (p instanceof AProjection2D) { - ((AProjection2D)p).aspectRatioChange(w, oldaspect, getAspectRatio()); - } - } - } - - /** - * Mimics the behavior of a normal canvas paint, but with the canvas scaled to a predefined size. - * @param g Graphics object to draw on - * @param imageWidth width of the image - * @param imageHeight height of the image - * @param type extension of image - */ - public void drawScaledCanvas(Graphics g, int imageWidth, int imageHeight, String type) - { - //hide red ZMR center dot - AZMRInteraction.setPaintCenterDot(false); - - //anti-alias pictures by default - boolean aastatus = APreferencesControl.getAliasMenuItem(); - if(!aastatus) - APreferencesControl.setAliasMenuItem(true); - - // Calculate the scale factors. - double factorX = ((double)imageWidth) / (double)getWidth(); - double factorY = ((double)imageHeight) / (double)getHeight(); - - // Add the title bar, if required. - if (title != null && parameterStore.get("Prefs", "CanvasTitle").getStatus()) { - - //Get old dimensions - int titleWidth = title.getWidth(); - int titleHeight = title.getHeight(); - - if (AGlobals.isAtlantisHeadless()) { - Dimension d = title.getLayout().preferredLayoutSize(title); - titleWidth = (int)d.getWidth(); - titleHeight = (int)d.getHeight(); - } - - //Scale to image width (height is constant) and draw - title.setSize(imageWidth, titleHeight); - title.paint(g); - //restore old - title.setSize(titleWidth, titleHeight); - g.translate(0, titleHeight); - //Re-adjust y-scale for title height - factorY = ((double)(imageHeight-titleHeight))/(double)getHeight(); - } - - // Loop over all windows. - String[] windows = getCurrentLayout().getWindowNames(); - for (int i=0; i<windows.length; i++) - { - AWindow window = getWindow(windows[i]); - int x = window.getX(); - int y = window.getY(); - int width = window.getWidth(); - int height = window.getHeight(); - // If the window is visible resize it temporarily and then draw it. - if (isReallyOnScreen(window)){ - - g.translate((int)(factorX*x), (int)(factorY*y)); - - // Perhaps I should override window.setSize to automatically validate - // This is because AWindow is now a container with a view inside - // - Adam - window.setSize((int)(factorX*width), (int)(factorY*height)); - window.validate(); - - // Needed in headless mode because normally components don't - // do layout until they're really drawn - if (AGlobals.isAtlantisHeadless()) { - window.getLayout().layoutContainer(window); - window.invalidateQuietly(); - } - - //Now print the actual windows - window.print(g); - - // Show ATLAS logo only on the top left window if there's - // enough room and if the checkbox is selected - if(x == 0 && y == 0 && (imageWidth > 300 || imageHeight > 250) && - APreferencesControl.getAtlasLogoMenuItem()){ - g.drawImage(ACursorFactory.getInstance().getAtlasLogo(),32,4,null); - } - //reset old dimensions - window.setSize(width, height); - window.validate(); - g.translate(-(int)(factorX*x), -(int)(factorY*y)); - } - } - - // Overlay does not work in XMLRPC mode (no parentWindow) - if (this.parentWindow != null) { - //get the overlay, resize to our desired canvas size, draw it, then set it back to normal - AOverlay overlay = (AOverlay) this.parentWindow.getGlassPane(); - int width = overlay.getWidth(); - int height = overlay.getHeight(); - overlay.setSize(imageWidth, imageHeight); - overlay.paintComponent(g); - overlay.setSize(width, height); - } - - //do reset - AZMRInteraction.setPaintCenterDot(true); - if(!aastatus) - APreferencesControl.setAliasMenuItem(aastatus); - } - - - //Restore canvas defaults - public void restoreDefaults() { - //Current layout should never be null - if (currentLayout != null) { - if (!currentLayout.getName().equals(startupLayoutName)) { - setCurrentLayout(startupLayoutName); - } - String[] frontWindows = currentLayout.getStartupSequence(); - String[] windows = this.getKnownWindowNames(); - for (String window : windows) windowsList.get(window).restoreDefaults(); - for (String window : frontWindows) this.moveToFrontWindow(window); - setCurrentWindow(currentLayout.getStartupWindow()); - } else - throw new Error("Current layout is not defined"); - - // If an aspect ratio correction took place when we loaded this config - // make sure it is reapplied on a reset - AD - correctAspectRatios(); - } - - /* - * Return a string containing the list of currently visible windows - * that is then written to the config file by AConfigWriter - */ - public String getStartupString() { - StringBuilder s = new StringBuilder(); - //Loop over all windows in all layers - int maxLayer = baseLayer + currentLayout.getWindowNames().length; - for (int i = baseLayer; i <= maxLayer; i++) { - Component[] c = layeredPane.getComponentsInLayer(i); - for (int j = 0; j < c.length; j++) - if (c[j] instanceof AWindow) - if (isReallyOnScreen((AWindow) c[j])) - s.append(((AWindow) c[j]).getName()); - } - return s.toString(); - } - - /* - * Bring this window to the front, i.e. make it the topmost window - */ - public void moveToFrontWindow(String windowName) { - //Make sure the window exists - if (windowsList.containsKey(windowName)) { - //Get the window - AWindow w = windowsList.get(windowName); - //Get the current layer of the window - int layer = JLayeredPane.getLayer(w); - //Get the other components int the same layer - Component[] cc = layeredPane.getComponentsInLayer(layer); - //Check for the current uppermost window - int maxLayer = baseLayer + currentLayout.getWindowNames().length; - - //Now loop over all layers above the one the object is in - for (int i = layer + 1; i <= maxLayer; i++) { - //Get all components from this layers - Component[] c = layeredPane.getComponentsInLayer(i); - //Move them down one layer - for (int j = 0; j < c.length; j++) - layeredPane.setLayer(c[j], i - 1); - } - //Finaly move all component from the current layer to the top - for (int j = 0; j < cc.length; j++) - layeredPane.setLayer(cc[j], maxLayer); - //validate and repaint - this.validate(); - if (!w.isVisible()) { - w.setVisible(true); - } - hideNonVisible(); - w.repaintFromScratch(); - } else - throw new Error("Cannot find window: " + windowName); - } - - /* - * Return window by name - */ - public AWindow getWindow(String windowName) { - //Search for the window in the list an return it - if (windowsList.containsKey(windowName)) - return (AWindow) windowsList.get(windowName); - else - throw new Error("Cannot find window: " + windowName); - } - - /* - * Repaint all but the current window - * Used to update SynchroCursor in all windows. - */ - public void repaintOthers(Component current) { - //Fill all windows in an enumeration object - Enumeration<AWindow> myenum = windowsList.elements(); - - //Loop over windows - while (myenum.hasMoreElements()) { - AWindow window = (AWindow) myenum.nextElement(); - //repaint those that are visible - if ((window != current) && this.isReallyOnScreen(window)) - window.repaint(); - } - } - - private void hideNonVisible() { - for (AWindow window : windowsList.values()) { - if (this.isValidWindowName(window.getName())) { - if (!this.isReallyOnScreen(window)) { - if (window.isVisible()) { - window.setVisible(false); - } - } - } - } - } - - /* - * Repaint all windows from Scratch - */ - public void repaintAllFromScratch() { - Enumeration<AWindow> myenum = windowsList.elements(); - - hideNonVisible(); - - while (myenum.hasMoreElements()) { - AWindow window = (AWindow) myenum.nextElement(); - - if (this.isReallyOnScreen(window)) { - if (!window.isVisible()) { - window.setVisible(true); - } - window.repaintFromScratch(); - } - } - title.repaint(); - } - - /* - * Return a string will the names of all layouts - * to be shown in the layout dialog - */ - public String[] getLayoutNames() { - Enumeration<String> myenum = layouts.keys(); - String[] s = new String[layouts.size()]; - //Loop over all layouts and concatenate their names - for (int i = 0; i < s.length; i++) - s[i] = (String) myenum.nextElement(); - - return s; - } - - /* - * Get Layout by name - */ - public ALayout getLayout(String name) { - if (layouts.containsKey(name)) - return layouts.get(name); - else - throw new Error("getLayout, unknown: " + name); - } - - /* - * Return the current layout - */ - public ALayout getCurrentLayout() { - return currentLayout; - } - - /* - * Set the current layout and apply the changes right away - */ - public void setCurrentLayout(String newLayout) { - //Make sure the new layout exists - if (layouts.containsKey(newLayout)) { - - //get current layout and its dimension - currentLayout = layouts.get(newLayout); - Dimension dim = currentLayout.getSize(); - - // clear the frame - setLayout(null); - removeAll(); - layeredPane.removeAll(); - - //Toolkit is not aware of multi-screens, but "adds them all together". - // Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); - //getMaxWindowBounds gets max bounds, again added up over multiple screens. In contrast to the above, - //it will account for MenuBars, StatusBars, etc from the the WindowManager - // Rectangle ScreenSize = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); - //This is how to get the default screen, we should rather use the one we are on - // GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); - // GraphicsDevice gscreen = genv.getDefaultScreenDevice(); - // GraphicsConfiguration gconf = gscreen.getDefaultConfiguration(); - - //Final total Width, Height and position of the Canvas - int W, H, X, Y; - - //First get the screen size of the current screen - Rectangle ScreenSize = getScreenSize(); - - //This is not a real full screen mode, rather a maximised Window mode. - //In proper full screen, some window managers (such as Cacao) will allow - //to have the title bar/menues disappear, etc. - if(newLayout.equals("FULL SCREEN")) { - //Really take the full screen in this mode - W = ScreenSize.width; - H = ScreenSize.height; - X = ScreenSize.x; - Y = ScreenSize.y; - } else { - //if not full screen then have to take account of task bars - //First gets the insets (borders) from all sides - Insets borders = new Insets(0, 0, 0, 0); - if (!AGlobals.isAtlantisHeadless()) { - borders = Toolkit.getDefaultToolkit() - .getScreenInsets(parentWindow.getGraphicsConfiguration()); - } - //calculate new usable screen size - ScreenSize.width -= borders.left+borders.right; - ScreenSize.height -= borders.top+borders.bottom; - ScreenSize.x += borders.left; - ScreenSize.y += borders.top; - - W = (int) (ScreenSize.width * SCREEN_USAGE); - H = ScreenSize.height; - X = ScreenSize.x; - Y = ScreenSize.y; - } - - //Apply the new layout dimensions - layeredPane.setLayout(new AGridLayout(dim, null)); - - //Now check for the existing windows - String[] usedWindowNames = currentLayout.getWindowNames(); - - //Loop over windows and add them to the new layout - for (int i = 0; i < usedWindowNames.length; i++) { - //Get the window dimensions - Rectangle constraint = currentLayout.getWindowConstraints(usedWindowNames[i]); - //Get the window itself - AWindow window = windowsList.get(usedWindowNames[i]); - //Make sure its finalized - if (!window.finalized) { - window.finalizeConstruction(); - } - //Add window to a new layer with the given dimensions - layeredPane.setLayer(window, baseLayer + i); - layeredPane.add(window, constraint); - } - // adding the layeredPane to the frame - setLayout(new BorderLayout()); - add(layeredPane); - - if (parentWindow != null) { - //Set the new window dimensions and position - parentWindow.setLocation(X, Y); - parentWindow.setSize(W, H); - - //Validate and update - parentWindow.validate(); - parentWindow.repaint(); - - } else { - - // This is real voodoo to make the canvas lay itself out in the - // right way in headless mode - // It seems that because there's no repaint events things like - // layouts often don't work in the way you expect. I'm fully - // willing to believe I don't understand the best way to do this. - // This is rather a scattergun approach that seems to work... - // - Adam - - setSize(W, H); - layeredPane.setSize(W, H); - - Dimension d = layeredPane.getLayout().preferredLayoutSize(layeredPane); - - validate(); - repaint(); - - setSize(d); - layeredPane.setSize(d); - layeredPane.getLayout().layoutContainer(layeredPane); - } - - fireLayoutChange(); - - //Now apply window ordering - String[] ss = currentLayout.getStartupSequence(); - for (int i = 0; i < ss.length; i++) this.moveToFrontWindow(ss[i]); - - //Finally set the current window to the same it was before, if it exists - if ((currentWindow != null) && (currentLayout.hasWindow(currentWindow.getName()))) - setCurrentWindow(currentWindow.getName()); - else - setCurrentWindow(currentLayout.getStartupWindow()); - } else - throw new Error("setCurrentLayout: unknown layout name !?"); - } - - /* - * Inform everyone on the LayoutChangeListener list about the layout change - */ - private void fireLayoutChange() { - for (ALayoutChangeListener changeListener : layoutChangeListeners) { - changeListener.layoutChanged(getCanvas()); - } - } - - /* - * Store the current layout in the stack - * This is need for layout history, used by e.g. "Zoom/Unzoom LAr/Calorimeters" - */ - public void saveLayout() { - //Add the current layout and active window name - windowLayoutHistory.push(getCurrentLayout()); - windowNameHistory.push(currentWindow.getName()); - - //Also store all windows that are actually on screen - Vector<String> windowsOnScreen = new Vector<String>(); - String[] usedWindowNames = currentLayout.getWindowNames(); - for (String windowName : usedWindowNames) { - AWindow window = windowsList.get(windowName); - if(isReallyOnScreen(window)) { - windowsOnScreen.add(windowName); - } - } - windowsActive.push(windowsOnScreen); - } - - /* - * Revert to the previous layout in the layout history - */ - void unlayout() { - //Make sure there is a previous one - if(windowLayoutHistory.size() > 0) { - //Get the old layout and active window - ALayout newLayout=windowLayoutHistory.pop(); - String windowName=windowNameHistory.pop(); - //Only change layout if it has actually changed - if(!newLayout.getName().equals(currentLayout.getName())) { - //Set new layout and current window - setCurrentLayout(newLayout.getName()); - setCurrentWindow(windowName); - } - //now bring windows in the proper order - Vector<String> windowsOnScreen = windowsActive.pop(); - - for (String winName : windowsOnScreen) { - this.moveToFrontWindow(winName); - } - } - } - - /* - * Add objects that shall be informed if there is a change in the lock status - */ - public void addLockChangeListener(ChangeListener listener) { - lockChangeListeners.addElement(listener); - listener.stateChanged(new ChangeEvent(this)); - } - /* - * Add objects that shall be informed if there is a change in the layout - */ - public void addLayoutChangeListener(ALayoutChangeListener listener) { - layoutChangeListeners.addElement(listener); - listener.layoutChanged(getCanvas()); - } - - /* - * Add objects that shall be informed if there is a - * change in the current window - */ - public void addWindowChangeListener(ChangeListener listener) { - windowChangeListeners.addElement(listener); - listener.stateChanged(new ChangeEvent(this)); - } - - /* - * Check if the given window name exists in the list of windows - */ - public boolean isValidWindowName(String name) { - return windowsList.containsKey(name); - } - - /* - * Get a string with all the existing windows - */ - public String[] getKnownWindowNames() { - Set<String> windowNames = windowsList.keySet(); - return windowNames.toArray(new String[windowNames.size()]); - } - - /* - * Returns the name of the current window - */ - public String getCurrentWindowName() { - return currentWindow.getName(); - } - - /* - * Return the current window - */ - public AWindow getCurrentWindow() { - return currentWindow; - } - - /* - * Return the window we are currently painting in - */ - public AWindow getPaintingWindow() { - return paintingWindow; - } - - /* - * Notify everyone about a change in the active window - */ - private void fireWindowChange() { - ChangeEvent changeEvent = new ChangeEvent(this); - for (ChangeListener changeListener : windowChangeListeners) { - changeListener.stateChanged(changeEvent); - } - } - - /* - * Notify everyone about a change in the lock status - */ - void fireLockChange() { - ChangeEvent changeEvent = new ChangeEvent(this); - for (ChangeListener changeListener : lockChangeListeners) { - changeListener.stateChanged(changeEvent); - } - } - - /* - * Get number of windows - */ - public int getWindowsCount() { - return windowsList.size(); - } - - /** - * Sets the current window. Informs all registered listeners. - * - * @param newWindowName The name of the window to be set to current. - */ - public void setCurrentWindow(String newWindowName) { - //Make sure window does exist - if (windowsList.containsKey(newWindowName)) { - //Deselect the current window - if (currentWindow != null) currentWindow.deselect(); - //Get the new window - currentWindow = (AWindow) windowsList.get(newWindowName); - //Select it - currentWindow.select(); - //Inform APar class about the new current window - parameterStore.setCurrentWindowIndex(currentWindow.getIndex()); - //Move the current window on top of all others - moveToFrontWindow(currentWindow.getName()); - //Inform everyone about the change - fireWindowChange(); - } else - throw new Error("setCurrentWindow, window: " + newWindowName + " , doesn't exist !?"); - } - - /** - * Sets the currently window currently being painted - * - * @param window the window being painted - */ - public void setPaintingWindow(AWindow window) { - paintingWindow = window; - } - - /** - * Copy settings from one window to another window - * - * @param from the window to copy settings from - * @param to the window to copy settings to - */ - public void copyWindowSettings(String from, String to) { - AWindow fromW = getWindow(from); - AWindow toW = getWindow(to); - - parameterStore.copyParameters(from, to); - - // IMPORTANT! Do not change the order - // setCurrentWindow() should be always before setProjection() - setCurrentWindow(to); - - // copy the projection, group and scales - toW.setProjection(fromW.getProjection()); - toW.setGroup(fromW.getGroupName()); - toW.setScaleStatus(fromW.getScaleStatus()); - - // copy the interaction (no interactions valid for EventInfo projection) - if(!(fromW.getProjection() instanceof AProjectionEventInfo)) - { - AInteractionToolBar fromI = fromW.getInteractionToolBar(); - AInteractionToolBar toI = toW.getInteractionToolBar(); - - toI.setSelectedGroup(fromI.getSelectedGroupName()); - // copy the state of the panel - toI.getSelectedGroup().setGroupState(fromI.getSelectedGroup()); - } - // for LegoPlot windows we need to set the (x,y,z)-corners from the projection - // TODO: Check and understand this. Previously there was no check that toW was - // an instance of AProjectionLegoPlot, put perhaps this works because only - // ever copy settings from one projection to another of the same type? - if(fromW.getProjection() instanceof AProjectionLegoPlot - && toW.getProjection() instanceof AProjectionLegoPlot) { - AProjectionLegoPlot.setxz(toW.getIndex(), AProjectionLegoPlot.getxz(fromW.getIndex())); - AProjectionLegoPlot.setyz(toW.getIndex(), AProjectionLegoPlot.getyz(fromW.getIndex())); - //reset the center of detector dot on ZMR - toW.getInteractionManager().setContext(toW.getInteractionToolBar().getSelectedGroup()); - } - //copy the user corners - toW.setUserCorners(fromW.getUserCorners()); - } - - /** - * As each window has its own layer, find the window that is in this window - * - * @param layer the layer which the window is in - */ - private AWindow getWindowForLayer(int layer) { - //Get all the components in this layer - Component[] c = layeredPane.getComponentsInLayer(layer); - //Return the first instance of AWindow - for (int i = 0; i < c.length; i++) - if (c[i] instanceof AWindow) return (AWindow) c[i]; - //Otherwise return 0 - return null; - } - - /** - * Get the associated tile menu bar - */ - public ATitleMenuBar getATitle() { - return title; - } - - /** - * Get the top-most window at a certain point - * - * @param x x-coordinate in pixels - * @param y y-coordinate in pixels - */ - private AWindow getWindowForPoint(double x, double y) { - //Loop over all layers - int maxLayer = baseLayer + currentLayout.getWindowNames().length; - for (int lay = maxLayer; lay >= 0; lay--) { - //Get the window that is in this layer - AWindow w = getWindowForLayer(lay); - if (w == null || currentLayout == null) { - continue; - } - //Get the window rectangle - Rectangle r = currentLayout.getWindowConstraints(w.getName()); - //Check if x,y is inside the rectangle - if (r.contains(x, y)) - return w; - } - - return null; - } - - /** - * Check if a given window is partially visible - * - * @param window the window to check - */ - public boolean isReallyOnScreen(AWindow window) { - //The full area covered by the canvas - Dimension layoutSize = currentLayout.getSize(); - - //Run over every single point on the canvas - //until we hit one that belongs to the window -- aaaaaarrrrggghhh!!! (SB?) - - //This function almost always exits on the first pixel - //Profiling indicates it takes only a few miliseconds - //even in very rare worst cases - AD - for (int j = 0; j < layoutSize.height; j++) - for (int i = 0; i < layoutSize.width; i++) - if (getWindowForPoint(i + 0.5, j + 0.5).equals(window)) - return true; - - return false; - } - - /** - * Implementation of the new event listener: gets called for each new event - * and repaints all the windows. - * - * @param evt the new event - */ - @Override - public void newEvent(AEvent evt) { - repaintAllFromScratch(); - } - - /** Return the aspect ratio of the canvas drawing area (hopefully) as h/w. - * Sorry if this is usually defined as w/h? - AD */ - public double getAspectRatio() { - Dimension d = layeredPane.getSize(); - return d.getHeight() / d.getWidth(); - } - - /** - * Calculates the image height that will result if one resizes the current canvas to the given width. - * @param width target width - * @return corresponding height - */ - public int getRespectiveHeight(int width){ - - //Get rootpane dimensions - int canvasWidth = getWidth(); - int canvasHeight = getHeight(); - - //calculate factor - double factor = ((double)width) / canvasWidth; - - //Account for menu bar if its there - if (title != null && parameterStore.get("Prefs", "CanvasTitle").getStatus()) { - //if (getTitleBar() != null && getTitleBar().isVisible()){ - int height = title.getHeight(); - - if (AGlobals.isAtlantisHeadless()) { - // In headless mode the menu bar isn't really enabled - // So get the size it would be if it was - height = (int) (title.getLayout().preferredLayoutSize(title).getHeight()); - } - - return (int) (factor * canvasHeight) + height; - - } - - //Otherwise just scale - return (int)(factor*canvasHeight); - } - -} //ACanvas diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ADrawCalorimeterSummedEndcaps.java b/graphics/AtlantisJava/src/atlantis/canvas/ADrawCalorimeterSummedEndcaps.java deleted file mode 100755 index c7b6a307a492..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ADrawCalorimeterSummedEndcaps.java +++ /dev/null @@ -1,937 +0,0 @@ -package atlantis.canvas; - -import java.awt.Color; - -import atlantis.data.ACalorimeterData; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.utils.AMath; -import atlantis.utils.APolygon; - -/** - * Contains the function for drawing the summed LAr and HEC endcaps - * - * @author Mark Stockton - */ -public class ADrawCalorimeterSummedEndcaps -{ - static int minEtaIndex,minPhiIndex,maxEtaIndex,maxPhiIndex,numCombinedCells,binvalue=1,SmallestEtaBinNumber,LargestEtaBinNumber; - static double etaBin, phiBin, SmallestZMin,maxCellEnergy,minCellEnergy; - static String name; - - protected static APar parameterStore = APar.instance(); - - /** - * Draws the summed endcaps. This method is called - * from drawCalorimeters and should not be used directly. - * - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - * @param calorimeter ACalorimeterData current calorimeter - * @param etaIndex short[] index of eta values - * @param phiIndex short[] index of phi values - * @param side byte[] side of detector - */ - public static void drawCalorimeterSummedEndcaps(AWindow window, AGraphics ag, AProjection2D projection, ACalorimeterData calorimeter, short[] etaIndex, short[] phiIndex, byte[] side) - { - resetGlobalValues(calorimeter.getName()); - ACoord data; - double[][] EndcapBinnedEnergy = new double[(36/binvalue)][(64/binvalue)]; - calorimeter.makeDrawList(); - //loop over drawlist to find z of first plane and smallest and largest eta - setSmallestAndLargest(calorimeter); - //now loop over drawlist to draw - for (int k = 0; k < calorimeter.getNumDraw(); k++) - { - int j = calorimeter.getDrawIndex(k); - short detectorIndex = (short) ACalorimeterDetector.getDetectorIndex(calorimeter.getIdFromIndex(j)); - ACalorimeterDetector currentDetector=ACalorimeterDetector.get(detectorIndex); - if (detectorIndex >= 0) - { - ACoord coord = currentDetector.getCell(projection, etaIndex[j], phiIndex[j], side[j]); - if (coord.hv[0].length > 0) - { - //has a cell so get its energy - double cellEnergy=calorimeter.getEnergy(j); - //find the eta min and max of each cell - double[] etaminmax=findEtaMinAndMax(currentDetector,etaIndex[j],side[j]); - //test to see if the cell overlaps the eta border - if(etaminmax[2]==1) - { - //Only want cells upto the eta split - double middle=parameterStore.get("YX", "SplitEta").getD()-(0.5*etaBin); - //find the min and max of each cell - double[] minmax1=findMinAndMax(currentDetector,etaminmax[0],middle,phiIndex[j]); - //has to find out how many cells overlap new binning border - int totNumOfCells1 =findNumberOfCells(minmax1); - //Only want cells above the eta split - middle=parameterStore.get("YX", "SplitEta").getD()+(0.5*etaBin); - //find the min and max of each cell - double[] minmax2=findMinAndMax(currentDetector,middle,etaminmax[1],phiIndex[j]); - //has to find out how many cells overlap new binning border - int totNumOfCells2 =findNumberOfCells(minmax1); - //check found positive number of cells - int NumOfCellsTotal=0; - if(totNumOfCells1>0) - NumOfCellsTotal+=totNumOfCells1; - else - System.out.println("Found negative amount of cells!?!"); - if(totNumOfCells2>0) - NumOfCellsTotal+=totNumOfCells2; - else - System.out.println("Found negative amount of cells!?!"); - if(NumOfCellsTotal>0) - { - //split energy between the cells - cellEnergy/=NumOfCellsTotal; - //now add on energy - if(totNumOfCells1>0) - { - EndcapBinnedEnergy=AddOnToEnergy(EndcapBinnedEnergy, cellEnergy, minmax1); - } - if(totNumOfCells2>0) - { - EndcapBinnedEnergy=AddOnToEnergy(EndcapBinnedEnergy, cellEnergy, minmax2); - } - } - } - else - { - //find the min and max of each cell - double[] minmax=findMinAndMax(currentDetector,etaminmax[0],etaminmax[1],phiIndex[j]); - //has to find out how many cells overlap new binning border - int totNumOfCells =findNumberOfCells(minmax); - //if found cells - if(totNumOfCells>0) - { - //split energy between the cells - cellEnergy/=totNumOfCells; - //not overlapping eta split so just add on energy - EndcapBinnedEnergy=AddOnToEnergy(EndcapBinnedEnergy, cellEnergy, minmax); - } - else - System.out.println("Found negative amount of cells!?!"); - } - } - } - } - //if no cells then don't need to draw - if(numCombinedCells==0) - return; - //now need to order energy into a list aswell as get the geometry of cells with energy - double[] EndcapBinnedEnergyList; - double[] YXBinnedEnergyList=new double[numCombinedCells];//needed as could be FR projection - double[][][] YXhv=new double[2][numCombinedCells][0]; - int currentCount=0; - for(int a=minEtaIndex; a<=maxEtaIndex;a++) - { - for(int b=minPhiIndex; b<=maxPhiIndex;b++) - { - if(EndcapBinnedEnergy[a][b]>0.0) - { - //has an energy so store its cell coordinates - ACoord coord = calculateCellGeometry(a,b); - YXhv[0][currentCount]=coord.hv[0][0]; - YXhv[1][currentCount]=coord.hv[1][0]; - //sorts energy into a list less blank cells - YXBinnedEnergyList[currentCount]=EndcapBinnedEnergy[a][b]; - currentCount++; - //check if is largest/smallest cell energy - if(EndcapBinnedEnergy[a][b]>maxCellEnergy) - maxCellEnergy=EndcapBinnedEnergy[a][b]; - if(EndcapBinnedEnergy[a][b]<minCellEnergy) - minCellEnergy=EndcapBinnedEnergy[a][b]; - } - } - } - //store coords and scale for display - ACoord YXData = new ACoord(YXhv); - //now need to alter to FR projection if needed otherwise will continue with temp - if(projection instanceof AProjectionFR) - { - //convert data to FR and add data to loop in phi - data=convertToFR(YXData, window); - //now need to loop the energies - EndcapBinnedEnergyList=new double[3*numCombinedCells]; - for(int j=0; j<numCombinedCells;j++) - { - EndcapBinnedEnergyList[j]=YXBinnedEnergyList[j]; - EndcapBinnedEnergyList[j+numCombinedCells]=YXBinnedEnergyList[j]; - EndcapBinnedEnergyList[j+(2*numCombinedCells)]=YXBinnedEnergyList[j]; - } - numCombinedCells*=3;//now have 3 lots of cells - } - else - { - //If not FR then the YX values are correct - EndcapBinnedEnergyList=YXBinnedEnergyList; - data=YXData; - } - data = window.calculateDisplay(projection.nonLinearTransform(data)); - // Draw the cell frames - boolean drawCells = parameterStore.get( name, "Cells").getStatus(); - if (drawCells) - drawCells(window, ag, data, EndcapBinnedEnergyList); - // Draw the histograms. - ACalorimeterData.drawEndcapHistogram(calorimeter, window, ag, projection); - } - - /** - * Resets gobal values - * @param CalName name of calorimeter - */ - protected static void resetGlobalValues(String CalName) - { - name=CalName; - minEtaIndex=999; - minPhiIndex=999; - maxEtaIndex=0; - maxPhiIndex=0; - numCombinedCells=0; - SmallestZMin = 99999.0; - SmallestEtaBinNumber = 99999; - LargestEtaBinNumber = 0; - maxCellEnergy=0.0; - minCellEnergy = 99999.0; - //check if using 0.1 binning or 0.2 binning - if(name.equals("HEC")) - binvalue = parameterStore.get("YX", "HECBin").getI(); - else - binvalue = parameterStore.get("YX", "LArBin").getI(); - if(binvalue==3) - { - etaBin=0.1; - phiBin=(2*Math.PI/64); - binvalue=1; - } - else - { - etaBin=0.1*binvalue; - phiBin=(2*Math.PI/64)*binvalue;//(2*Math.PI/64)=0.098 - } - } - - /** - * Set the smallest Z, smallest and largest eta - * - * @param calorimeter ACalorimeterData current calorimeter - */ - protected static void setSmallestAndLargest(ACalorimeterData calorimeter) - { - double largestRho=0.0,smallestRho=99999.0; - double largestEtaValue=0.0,smallestEtaValue=99999.0; - //to shorten detectors to loop over - short prevDetectorIndex=999; - //loop over drawlist - for (int k = 0; k < calorimeter.getNumDraw(); k++) - { - int j = calorimeter.getDrawIndex(k); - short detectorIndex = (short) ACalorimeterDetector.getDetectorIndex(calorimeter.getIdFromIndex(j)); - ACalorimeterDetector currentDetector=ACalorimeterDetector.get(detectorIndex); - String detectorName=currentDetector.getName(); - if (detectorIndex!=prevDetectorIndex && detectorIndex >= 0 - && (detectorName.indexOf("Endcap")>0 || detectorName.indexOf("EC")>=0 || detectorName.equals("HEC"))) - { - //in a different detector - prevDetectorIndex=detectorIndex; - //find z of the first plane - if(currentDetector.getZMin()<SmallestZMin) - { - SmallestZMin=currentDetector.getZMin(); - } - //find smallest rho - if(currentDetector.getRMin()<smallestRho) - { - smallestRho=currentDetector.getRMin(); - largestEtaValue=AMath.etaAbs(currentDetector.getZMin(), smallestRho); - } - //find largest rho - if(currentDetector.getRMax()>largestRho) - { - largestRho=currentDetector.getRMax(); - smallestEtaValue=AMath.etaAbs(currentDetector.getZMin(), largestRho); - } - } - } - //if drawing cell outlines then this will have already been done - if (splitBinning() && !parameterStore.getUnknown("Det", "CaloDetail").getStatus()) - ACalorimeterDetector.setEtaSplit(); - //if using split binning and eta is in inner section - if(splitBinning() && smallestEtaValue>=parameterStore.get("YX", "SplitEta").getD()) - { - double belowSplit=parameterStore.get("YX", "SplitEta").getD()/0.1; - double aboveSplit=(smallestEtaValue-parameterStore.get("YX", "SplitEta").getD())/0.2; - SmallestEtaBinNumber=(int)Math.floor(belowSplit+aboveSplit); - } - else - { - SmallestEtaBinNumber=(int)Math.floor(smallestEtaValue/etaBin); - } - if(splitBinning() && largestEtaValue>=parameterStore.get("YX", "SplitEta").getD()) - { - double belowSplit=parameterStore.get("YX", "SplitEta").getD()/0.1; - double aboveSplit=(largestEtaValue-parameterStore.get("YX", "SplitEta").getD())/0.2; - LargestEtaBinNumber=(int)Math.floor(belowSplit+aboveSplit); - } - else - { - LargestEtaBinNumber=(int)Math.floor(largestEtaValue/etaBin); - } - } - - /** - * Test to see if using split binning - * - * @return Status of if using split binning - */ - protected static boolean splitBinning() - { - int test=0; - if(name.equals("HEC")) - test = parameterStore.get("YX", "HECBin").getI(); - else - test = parameterStore.get("YX", "LArBin").getI(); - if(test==3) - return true; - else - return false; - } - - /** - * Finds the max and min values of the hit cell - * Also tests and sets the min and max indicies for eta and phi - * - * @param currentDetector ACalorimeterDetector current detector - * @param etaIndex short index of eta values - * @param side byte side of detector - * - * @return minAndMax[0] double minEta of cell - * @return minAndMax[1] double maxEta of cell - * @return minAndMax[2] double status of if is an overlapping cell - */ - protected static double[] findEtaMinAndMax(ACalorimeterDetector currentDetector, short etaIndex, byte side) - { - double realEtaBin=etaBin; - //if using split binning and eta is in outer section - if(splitBinning() && Math.abs(currentDetector.getEtaMin(etaIndex, side))>=parameterStore.get("YX", "SplitEta").getD()) - { - realEtaBin=0.2; - } - //used for x when taking arsinh(x)=ln(x+sqrt(x*x+1)) - double asinhOf; - //have to alter eta so can be drawn at the front layer - double zFactor = SmallestZMin/currentDetector.getZMin(); - //do for minimum of cell - double calcEtaMin=Math.abs(currentDetector.getEtaMin(etaIndex, side)); - asinhOf = zFactor*Math.sinh(calcEtaMin); - calcEtaMin = Math.log(asinhOf + Math.sqrt(asinhOf*asinhOf+1)); - //do for center of cell - double calcEta=Math.abs(currentDetector.getEta(etaIndex, side)); - asinhOf = zFactor*Math.sinh(calcEta); - calcEta= Math.log(asinhOf + Math.sqrt(asinhOf*asinhOf+1)); - //find cell size in eta and phi - double deta=currentDetector.getDeltaEta(); - double minEta,maxEta; - //check for overlaping cells in eta and phi - if(deta>realEtaBin) - { - minEta=calcEtaMin; - maxEta=minEta+deta; - } - else - { - minEta=calcEta; - maxEta=minEta;//there is only 1 cell - } - - //make minEta in detector otherwise causes problems if SplitEta=SmallestEtaBinNumber*0.1 - if(minEta<SmallestEtaBinNumber*0.1) - { - minEta=SmallestEtaBinNumber*0.1; - } - - //now store in variable to return - double[] minAndMax=new double[3]; - minAndMax[0]= minEta; - minAndMax[1]= maxEta; - - if(splitBinning()) - { - if(minEta<parameterStore.get("YX", "SplitEta").getD() && - maxEta>parameterStore.get("YX", "SplitEta").getD()) - { - minAndMax[2]=1;//overlapping cell - } - else - minAndMax[2]=0; - } - else - minAndMax[2]=0; - return minAndMax; - } - - /** - * Finds the max and min values of the hit cell - * Also tests and sets the min and max indicies for eta and phi - * - * @param currentDetector ACalorimeterDetector current detector - * @param minEta double min eta of cell to draw - * @param maxEta double max eta of cell to draw - * @param phiIndex short index of phi values - * - * @return minAndMax[0] double minEta of cell - * @return minAndMax[1] double maxEta of cell - * @return minAndMax[2] double minPhi of cell - * @return minAndMax[3] double maxPhi of cell - */ - protected static double[] findMinAndMax(ACalorimeterDetector currentDetector, double minEta, double maxEta, short phiIndex) - { - double realEtaBin=etaBin, realPhiBin=phiBin; - //if using split binning - if(splitBinning()) - { - //if eta is in inner section - if(minEta>=parameterStore.get("YX", "SplitEta").getD()) - { - realEtaBin=0.2; - realPhiBin=(2*Math.PI/32); - } - } - //find cell size in eta and phi - double deta=currentDetector.getDeltaEta(); - double dphi=currentDetector.getDeltaPhi(); - double minPhi,maxPhi; - //check for overlaping cells in eta and phi - if(deta>realEtaBin) - { - if(realEtaBin==etaBin) - { - minEta=Math.floor(minEta/realEtaBin); - maxEta=Math.floor(maxEta/realEtaBin); - } - else - { - //inside split binning - double belowSplit=parameterStore.get("YX", "SplitEta").getD()/0.1; - double aboveSplit=(minEta-parameterStore.get("YX", "SplitEta").getD())/0.2; - minEta=Math.floor(belowSplit+aboveSplit); - aboveSplit=(maxEta-parameterStore.get("YX", "SplitEta").getD())/0.2; - maxEta=Math.floor(belowSplit+aboveSplit); - } - } - else - { - if(realEtaBin==etaBin) - { - minEta=Math.floor(minEta/realEtaBin); - } - else - { - //split binning - double belowSplit=parameterStore.get("YX", "SplitEta").getD()/0.1; - double aboveSplit=(minEta-parameterStore.get("YX", "SplitEta").getD())/0.2; - minEta=Math.floor(belowSplit+aboveSplit); - } - maxEta=minEta;//there is only 1 cell - } - if(dphi>realPhiBin) - { - minPhi=Math.abs(currentDetector.getPhiMin(phiIndex)); - minPhi=Math.floor(minPhi/realPhiBin); - maxPhi=Math.floor(minPhi+(dphi/realPhiBin)); - } - else - { - minPhi=Math.abs(currentDetector.getPhi(phiIndex)); - minPhi=Math.floor(minPhi/realPhiBin); - maxPhi=minPhi;//there is only 1 cell - } - //check for exceeding array limits - if(maxPhi>=(64/binvalue)) - { - maxPhi=(64/binvalue)-1; - if(minPhi>=(64/binvalue)-1) - minPhi=(64/binvalue)-1; - } - if(minPhi<0) - { - minPhi=0; - if(maxPhi<0) - maxPhi=0; - } - //check not out of eta array size range - if(maxEta>=(36/binvalue)) - { - maxEta=(36/binvalue)-1; - if(minEta>=(36/binvalue)) - minEta=(36/binvalue)-1; - } - //check physical eta conditions - if(maxEta>LargestEtaBinNumber) - { - maxEta=LargestEtaBinNumber; - if(minEta>LargestEtaBinNumber) - minEta=LargestEtaBinNumber; - } - if(minEta<SmallestEtaBinNumber) - { - minEta=SmallestEtaBinNumber; - if(maxEta<SmallestEtaBinNumber) - maxEta=SmallestEtaBinNumber; - } - //find min and max eta and phi indices - if(minEta<minEtaIndex) - minEtaIndex=(int)minEta; - if(maxEta>maxEtaIndex) - maxEtaIndex=(int)maxEta; - if(minPhi<minPhiIndex) - minPhiIndex=(int)minPhi; - if(maxPhi>maxPhiIndex) - maxPhiIndex=(int)maxPhi; - //now store in variable to return - double[] minAndMax=new double[4]; - minAndMax[0]= minEta; - minAndMax[1]= maxEta; - minAndMax[2]= minPhi; - minAndMax[3]= maxPhi; - return minAndMax; - } - - /** - * Finds the number of cells in the new binning - * - * @param minmax array containing: minEta, maxEta, minPhi, maxPhi - */ - protected static int findNumberOfCells(double[] minmax) - { - int numOfEtaCells=0; - int numOfPhiCells=0; - double minEta=minmax[0]; - double maxEta=minmax[1]; - double minPhi=minmax[2]; - double maxPhi=minmax[3]; - //calculate the number of cells - //add one as difference in index is 1 less than number of cells - numOfEtaCells+=maxEta-minEta+1; - numOfPhiCells+=maxPhi-minPhi+1; - //get total number of cells - int totNumOfCells = numOfEtaCells*numOfPhiCells; - return totNumOfCells; - } - - /** - * Adds on the energy to EndcapBinnedEnergy and then returns it - * - * @param EndcapBinnedEnergy double[][] energy listing of cells [eta][phi] - * @param cellEnergy double energy of each new cell - * @param minmax double[] min and max of cell in eta and phi - * - * @return EndcapBinnedEnergy double[][] altered energy listing of cells [eta][phi] - */ - protected static double[][] AddOnToEnergy(double[][] EndcapBinnedEnergy, double cellEnergy, double[] minmax) - { - //now loop over the min to max for eta and phi - for(int a= (int) minmax[0]; a<=(int) minmax[1]; a++) - { - for(int b=(int) minmax[2]; b<=(int) minmax[3]; b++) - { - //add to cell count if no energy already stored in cell - if(EndcapBinnedEnergy[a][b]==0.0) - numCombinedCells++; - //add energy to cell - EndcapBinnedEnergy[a][b]+= cellEnergy; - } - } - return EndcapBinnedEnergy; - } - - /** - * Calculates the cell geometry from its eta and phi bin numbers - * - * @param a int eta bin number - * @param b int phi bin number - * - * @return coord Acoord cell coords - */ - protected static ACoord calculateCellGeometry(int a, int b) - { - double realEtaBin=etaBin, realPhiBin=phiBin; - double eta=a*etaBin; - double phi=b*phiBin; - //if using split binning and eta is in inner section - if(splitBinning() && eta>=parameterStore.get("YX", "SplitEta").getD()) - { - realEtaBin=0.2; - realPhiBin=(2*Math.PI/32); - double belowSplit=parameterStore.get("YX", "SplitEta").getD()/0.1; - double aboveSplit=a-belowSplit; - eta=aboveSplit*0.2+belowSplit*0.1; - phi=b*realPhiBin; - } - double[][] temphv = new double[2][]; - - //all drawn on the front plane of the detector - double newrMax=SmallestZMin/Math.sinh(eta); - double newrMin=SmallestZMin/Math.sinh(eta+realEtaBin); - //store the cell coords - temphv[0] = new double[] {newrMax*Math.cos(phi), newrMax*Math.cos(phi+realPhiBin), - newrMin*Math.cos(phi+realPhiBin), newrMin*Math.cos(phi)}; - temphv[1] = new double[] {newrMax*Math.sin(phi), newrMax*Math.sin(phi+realPhiBin), - newrMin*Math.sin(phi+realPhiBin), newrMin*Math.sin(phi)}; - return new ACoord(temphv); - } - - /** - * Converts cells to FR using normal convertYXtoFR - * Then adds on data above and below so loops in phi - * - * @param YXData ACoord data in YX projection - * @param window AWindow current window - * - * @return coord Acoord cell coords - */ - protected static ACoord convertToFR(ACoord YXData, AWindow window) - { - //convert to FR then have to loop data - YXData.convertYXToFR(); - //new hv to store the values at + and - 2pi - double[][][] FRhv=new double[2][3*numCombinedCells][YXData.hv[0][0].length]; - //get corners and then shift data to be inside corners - double phiTop = window.getUserCorners()[0].y; - double phiBottom = window.getUserCorners()[2].y; - int factor=0; - if(phiTop>720.0) - //-2 as already draws upto 720 so doensn't need this extra 2*360 - factor=(int) Math.ceil(phiTop/360.0)-2; - if(phiBottom<-360.0) - //-1 as already draws down to -360 so doensn't need this extra -1*360 - factor=(int) Math.floor(phiBottom/360.0)-1; - for(int j=0; j<numCombinedCells;j++) - for(int k=0; k<YXData.hv[0][j].length; k++) - { - FRhv[1][j][k]=YXData.hv[1][j][k]+360.0*(factor-1); - FRhv[1][numCombinedCells+j][k]=YXData.hv[1][j][k]+360.0*factor; - FRhv[1][(2*numCombinedCells)+j][k]=YXData.hv[1][j][k]+360.0*(factor+1); - FRhv[0][j][k]=YXData.hv[0][j][k]; - FRhv[0][numCombinedCells+j][k]=YXData.hv[0][j][k]; - FRhv[0][(2*numCombinedCells)+j][k]=YXData.hv[0][j][k]; - } - //now store into data to be used to draw - return new ACoord(FRhv); - } - - /** - * Draws the cells - * - * @param ag AGraphics graphics to draw on - * @param data ACoord cell geometries - * @param EndcapBinnedEnergyList double[] energy of each cell - */ - protected static void drawCells(AWindow window, AGraphics ag, ACoord data, double[] EndcapBinnedEnergyList) - { - //Storage of parameters to be used later - Color[] colorMap = AColorMap.getColors(); - //AParameter frame = parameterStore.get(name, "Frame"); - boolean drawFrame = parameterStore.get(name, "Frame").getStatus(); - int frameColor = parameterStore.get(name, "Frame").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - drawFrame=true; - else - drawFrame=false; - AParameter cellGeometry = parameterStore.get(name, "CellGeometry"); - // Draw frames for the filled cells. - if (drawFrame && cellGeometry.getStatus()) - { - for (int j = 0; j < numCombinedCells; j++) - { - ag.setColor(colorMap[frameColor]); - ag.drawPolygon(data.hv[0][j], data.hv[1][j], data.hv[0][j].length); - } - } - // Draw the cell geometry. - AParameter cellOutline = parameterStore.get(name, "CellOutline"); - // Draw filled cells. - if (cellGeometry.getStatus()) - { - for (int j = 0; j < numCombinedCells; j++) - { - ag.setColor(colorMap[cellGeometry.getI()]); - ag.fillPolygon(data.hv[0][j], data.hv[1][j], data.hv[0][j].length); - } - } - // Draw cell outlines. - if (cellOutline.getStatus()) - { - ag.updateDrawParameters(new ADrawParameters(true, cellOutline.getI(), 0, 1, 0, 0, false, 1, 0)); - for (int j = 0; j < numCombinedCells; ++j) - { - ag.drawPolygon(data.hv[0][j], data.hv[1][j], data.hv[0][j].length); - } - } - //Scale the cell polygons. - data = scaleEndcapPolygons(EndcapBinnedEnergyList, data, minCellEnergy, maxCellEnergy); - //Get the colours of the cells - byte[] EndcapColor= internalEndcapColor(EndcapBinnedEnergyList, minCellEnergy, maxCellEnergy); - // And draw them. - AParameter colorFunction = parameterStore.get(name, "ColorFunction"); - if (colorFunction.getI() == ACalorimeterData.COLOR_FUNC_ENERGY) - { - switch (AColorMap.getColorMap()) - { - case AColorMap.COLOR_MAP_DEFAULT1: - case AColorMap.COLOR_MAP_DEFAULT2: - case AColorMap.COLOR_MAP_M4M5: - case AColorMap.COLOR_MAP_GRAYDET: - case AColorMap.COLOR_MAP_ORIGINAL: - // Use colors. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_HITCOL); - break; - case AColorMap.COLOR_MAP_GRAY: - case AColorMap.COLOR_MAP_BW: - // Use grayscale. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_GRAY_HITCOL); - break; - } - //draw the legend - if(ALegendWindow.exists()) - { - if (AColorMap.getColorMap() != AColorMap.COLOR_MAP_BW) - { - double[] colorEnergy = energyOfEndcapColor(minCellEnergy,maxCellEnergy); - ALegendWindow.getInstance().addEnergyText(window, colorEnergy,maxCellEnergy, colorMap); - } - else - ALegendWindow.getInstance().addEnergyText(window, minCellEnergy,maxCellEnergy); - } - } - else if(ALegendWindow.exists()) - ALegendWindow.getInstance().clearText(window); - //draw filled cell - for (int j = 0; j < numCombinedCells; j++) - { - ag.setColor(colorMap[EndcapColor[j]]); - ag.fillPolygon(data.hv[0][j],data.hv[1][j], data.hv[0][j].length); - } - //draw frame around cell - if (drawFrame && !cellGeometry.getStatus()) - { - for (int j = 0; j < numCombinedCells; j++) - { - ag.setColor(colorMap[frameColor]); - ag.drawPolygon(data.hv[0][j], data.hv[1][j], data.hv[0][j].length); - } - } - } - - /** - * Scales a series of polygons according to the user settings. - * Used for summing over layer in the Endcaps in the YX projection - * - * @param cellEnergy double[] list of each cells energy - * @param coord ACoord polygons to be scaled - * @param minEnergy double min Energy in a cell - * @param maxEnergy double max Energy in a cell - * - * @return ACoord scaled polygons - */ - protected static ACoord scaleEndcapPolygons(double[] cellEnergy, ACoord coord, double minEnergy, double maxEnergy) - { - int energyMode = parameterStore.get(name, "EnergyMode").getI(); - - for (int i = 0; i < cellEnergy.length; i++) - { - if (cellEnergy[i] == 0) - continue; - - double factor; - if (parameterStore.get(name, "ColorFunction").getI() != ACalorimeterData.COLOR_FUNC_ENERGY) - { - // The user has (implicitly) selected energy scaling. - - //each cell is scaled to the new 0.1*0.1 binning so - //density for each just depends on energy - double density = cellEnergy[i]; - double minDensity = minEnergy; - double maxDensity = maxEnergy; - - switch (energyMode) - { - case ACalorimeterData.ENERGY_MODE_MAX_LIN: - case ACalorimeterData.ENERGY_MODE_SUM_LIN: - factor = Math.sqrt(density / maxDensity); - break; - - case ACalorimeterData.ENERGY_MODE_MAX_LOG: - case ACalorimeterData.ENERGY_MODE_SUM_LOG: - double magnitude = Math.floor(Math.log10(Math.sqrt(maxDensity / minDensity)) + 1.0); - factor = (Math.log10(Math.sqrt(density / maxDensity)) + magnitude) / magnitude; - break; - - case ACalorimeterData.ENERGY_MODE_MAX_SQRT: - case ACalorimeterData.ENERGY_MODE_SUM_SQRT: - factor = Math.sqrt(Math.sqrt(density / maxDensity)); - break; - - default: - factor = ACalorimeterData.getNonScalingFactor(); - } - } - else - { - // No energy scaling, scale all cells by the same factor. - factor = ACalorimeterData.getNonScalingFactor(); - } - - if (factor <= 1.0) - { - APolygon.scale(coord.hv[0][i], coord.hv[1][i], factor); - } - } - return coord; - } - - /** - * Determines the color for each hit according to the color function set by - * the user. Used for summing over layer in the Endcaps in the YX projection - * - * @param cellEnergy double[] list of each cells energy - * @param minEnergy double min Energy in a cell - * @param maxEnergy double max Energy in a cell - * - * @return byte[] colors for each energy - */ - protected static byte[] internalEndcapColor(double[] cellEnergy, double minEnergy, double maxEnergy) - { - byte[] EndcapColor= new byte[cellEnergy.length]; - - int colorFunction = parameterStore.get(name, "ColorFunction").getI(); - int constantColor = parameterStore.get(name, "Constant").getI(); - switch (colorFunction) - { - case ACalorimeterData.COLOR_FUNC_CONSTANT: - //colorByConstant(); - for(int i = 0; i < cellEnergy.length; i++) - EndcapColor[i] = (byte) constantColor; - break; -/* case COLOR_FUNC_SUBDET: - colorBy(sub); - break; - - case COLOR_FUNC_CLUSTER: - colorBy(getClusters()); - break; - - case COLOR_FUNC_SAMPLING: - colorBy(sampling); - break; -*/ - case ACalorimeterData.COLOR_FUNC_ENERGY: - EndcapColor=colorEndcapByEnergy( cellEnergy, minEnergy, maxEnergy); - break; -/* - case COLOR_FUNC_JET: - colorBy(getJets()); - break; -*/ - default: - for(int i = 0; i < cellEnergy.length; i++) - EndcapColor[i] = (byte) constantColor; - } - - return EndcapColor; - } - - /** - * Color cells by energy. - * Used for summing over layer in the Endcaps in the YX projection - * - * @param cellEnergy double[] list of each cells energy - * @param minEnergy double min Energy in a cell - * @param maxEnergy double max Energy in a cell - * - * @return byte[] colors for each energy - */ - protected static byte[] colorEndcapByEnergy(double[] cellEnergy, double minEnergy, double maxEnergy) - { - byte[] EndcapColor= new byte[cellEnergy.length]; - int numColors = 17; - for (int i = 0; i < cellEnergy.length; i++) - { - if (AColorMap.getColorMap() == AColorMap.COLOR_MAP_BW) - { - // Black and white colormap. - EndcapColor[i] = AColorMap.BK; - } - else - { - // We have numColors colors available. - switch (parameterStore.get(name, "EnergyMode").getI()) - { - case ACalorimeterData.ENERGY_MODE_MAX_LIN: - case ACalorimeterData.ENERGY_MODE_SUM_LIN: - EndcapColor[i] = (byte) (numColors * (cellEnergy[i] - minEnergy) / (maxEnergy - minEnergy)); - break; - case ACalorimeterData.ENERGY_MODE_MAX_LOG: - case ACalorimeterData.ENERGY_MODE_SUM_LOG: - EndcapColor[i] = (byte) (numColors * (Math.log(cellEnergy[i]) - Math.log(minEnergy)) / (Math.log(maxEnergy) - Math.log(minEnergy))); - break; - case ACalorimeterData.ENERGY_MODE_MAX_SQRT: - case ACalorimeterData.ENERGY_MODE_SUM_SQRT: - EndcapColor[i] = (byte) (numColors * Math.sqrt((cellEnergy[i] - minEnergy) / (maxEnergy - minEnergy))); - break; - } - if (EndcapColor[i] >= numColors) - EndcapColor[i] = (byte) (numColors - 1); - } - } - return EndcapColor; - } - - /** - * Energy of each color. - * Used for summing over layer in the Endcaps in the YX projection - * - * @param minEnergy double min Energy in a cell - * @param maxEnergy double max Energy in a cell - * - * @return byte[] colors for each energy - */ - protected static double[] energyOfEndcapColor(double minEnergy, double maxEnergy) - { - int numColors = 17; - double[] colorEnergy= new double[numColors]; - for (int i = 0; i < numColors; i++) - { - // We have numColors colors available. - switch (parameterStore.get(name, "EnergyMode").getI()) - { - case ACalorimeterData.ENERGY_MODE_MAX_LIN: - case ACalorimeterData.ENERGY_MODE_SUM_LIN: - colorEnergy[i] = ((i * (maxEnergy - minEnergy))/numColors)+minEnergy; - break; - case ACalorimeterData.ENERGY_MODE_MAX_LOG: - case ACalorimeterData.ENERGY_MODE_SUM_LOG: - colorEnergy[i] = Math.exp(((i * (Math.log(maxEnergy) - Math.log(minEnergy)))/numColors)+Math.log(minEnergy)); - break; - case ACalorimeterData.ENERGY_MODE_MAX_SQRT: - case ACalorimeterData.ENERGY_MODE_SUM_SQRT: - colorEnergy[i] = (Math.pow(i/numColors,2) * (maxEnergy - minEnergy))+minEnergy; - break; - } - //may need check to see if lower or higher than min or max - if (colorEnergy[i] >= numColors) - colorEnergy[i] = (byte) (numColors -1); - } - return colorEnergy; - } - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AGLGraphics.java b/graphics/AtlantisJava/src/atlantis/canvas/AGLGraphics.java deleted file mode 100644 index ee0c032ad052..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AGLGraphics.java +++ /dev/null @@ -1,486 +0,0 @@ -package atlantis.canvas; - -import atlantis.graphics.AAbstractGraphics2D; -import com.sun.opengl.util.BufferUtil; -import java.awt.*; -import java.awt.RenderingHints.Key; -import java.awt.color.ColorSpace; -import java.awt.geom.AffineTransform; -import java.awt.geom.PathIterator; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.awt.image.ComponentColorModel; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.ImageObserver; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.text.AttributedCharacterIterator; -import javax.media.opengl.*; - -/** - * - * This class is an implementation of Graphics2D (although it actually subclasses - * AAbstractGraphics2D). It wraps a GLAutoDrawable object to allow Swing based - * components to paint and have their calls translated into OpenGL calls on the - * underlying context. - * - * Obviously emulating all the functionality of Graphics2D is a challenge - * so expect some visual issues initially... - * - * @author Adam Davison - */ -public class AGLGraphics extends AAbstractGraphics2D { - - private int m_clipx = 0; - private int m_clipy = 0; - private int m_clipw = 0; - private int m_cliph = 0; - private Color m_color = Color.BLACK; - private GLAutoDrawable m_d; - private GL m_gl; - private int m_depth = 1; - private ComponentColorModel m_colorModel = - new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), - new int[]{8, 8, 8, 8}, true, false, ComponentColorModel.TRANSLUCENT, - DataBuffer.TYPE_BYTE); - - public AGLGraphics(AGLGraphics old) { - m_d = old.m_d; - m_gl = m_d.getGL(); - } - - /* - * Draw shapes, don't actually implement cubic or quadratic curves yet. - * For now we only draw straight lines. - * Having said that Atlantis uses such a huge number of segments that this - * doesn't seem to be an issue for visual quality as of yet... - */ - @Override - public void draw(Shape z) { - PathIterator pi = z.getPathIterator(null); - float[] c = new float[6]; - float xpos = 0.0f; - float ypos = 0.0f; - while (!pi.isDone()) { - int type = pi.currentSegment(c); - switch (type) { - case PathIterator.SEG_MOVETO: - xpos = c[0]; - ypos = c[1]; - break; - case PathIterator.SEG_CLOSE: - // Ignoring close lines for now I guess... - break; - case PathIterator.SEG_CUBICTO: - drawLine(c[2], c[3], c[4], c[5]); - case PathIterator.SEG_QUADTO: - drawLine(c[0], c[1], c[2], c[3]); - case PathIterator.SEG_LINETO: - // Just do lines... - drawLine(xpos, ypos, c[0], c[1]); - xpos = c[0]; - ypos = c[1]; - break; - } - pi.next(); - } - //super.draw(z); - } - - public AGLGraphics(GLAutoDrawable d) { - m_d = d; - m_gl = m_d.getGL(); - } - - /* - * This implementation of create()/dispose() is highly thread unsafe - * Since it's not trivial to duplicate the GL context we do the best we can - * and hopefully it's ok for Atlantis. - * - * Essentially where Java2D would create a whole new object which would then - * have it's own state, we push the modelview stack. This means that - * we can perform transformations and then pop the modelview stack in dispose - * to emulate this functionality. - * - * Obviously if you call create twice in two separate threads then one of - * you is destroying the other one's modelview matrix... - */ - @Override - public Graphics create() { - m_gl.glMatrixMode(GL.GL_MODELVIEW_MATRIX); - m_gl.glPushMatrix(); - m_depth++; - //System.err.println("PUSH: " + depth); - //return new AGLGraphics(this); //????? - return this; - } - - @Override - public void translate(int x, int y) { - m_gl.glMatrixMode(GL.GL_MODELVIEW_MATRIX); - m_gl.glTranslatef(x, y, 0.0f); - return; - } - - @Override - public Color getColor() { - return m_color; - } - - @Override - public void setColor(Color c) { - m_color = c; - //System.out.println(c.toString()); - float r = ((float) c.getRed()) / 255.0f; - float g = ((float) c.getGreen()) / 255.0f; - float b = ((float) c.getBlue()) / 255.0f; - float a = ((float) c.getAlpha()) / 255.0f; - m_d.getGL().glColor4f(r, g, b, a); - } - - @Override - public void setPaintMode() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void setXORMode(Color c1) { - throw new UnsupportedOperationException("Not supported yet."); - } - - private Font m_font = Font.decode("Arial-BOLD-18"); - - @Override - public Font getFont() { - return m_font; - } - - @Override - public void setFont(Font font) { - m_font = font; - } - - @Override - public FontMetrics getFontMetrics(Font f) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Rectangle getClipBounds() { - return new Rectangle(m_clipx, m_clipy, m_clipw, m_cliph); - } - - @Override - public void clipRect(int x, int y, int width, int height) { - throw new UnsupportedOperationException("Not supported yet."); - } - - /* - * Sort of ignoring clip here... - */ - @Override - public void setClip(int x, int y, int width, int height) { - m_clipx = x; - m_clipy = y; - m_clipw = width; - m_cliph = height; - //System.out.println("Who cares about clip for now??"); - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public Shape getClip() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void setClip(Shape clip) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void copyArea(int x, int y, int width, int height, int dx, int dy) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void drawLine(int x1, int y1, int x2, int y2) { - drawLine((float) x1, (float) y1, (float) x2, (float) y2); - } - - public void drawLine(float x1, float y1, float x2, float y2) { - m_gl.glBegin(m_gl.GL_LINES); - m_gl.glVertex2f(x1, y1); - m_gl.glVertex2f(x2, y2); - m_gl.glEnd(); - } - - @Override - public void fillRect(int x, int y, int width, int height) { - GL gl = m_d.getGL(); - - gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL); - - gl.glBegin(gl.GL_QUADS); - gl.glVertex2f(x, y); - gl.glVertex2f(x + width, y); - gl.glVertex2f(x + width, y + height); - gl.glVertex2f(x, y + height); - gl.glEnd(); - } - - @Override - public void clearRect(int x, int y, int width, int height) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void drawOval(int x, int y, int width, int height) { - throw new UnsupportedOperationException("Not supported yet."); - - } - - @Override - public void fillOval(int x, int y, int width, int height) { - //throw new UnsupportedOperationException("Not supported yet."); - return; - } - - @Override - public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) { - m_gl.glPolygonMode(m_gl.GL_FRONT_AND_BACK, m_gl.GL_LINE); - - m_gl.glBegin(m_gl.GL_POLYGON); - - for (int i = 0; i < nPoints; i++) { - m_gl.glVertex2f(xPoints[i], yPoints[i]); - } - - m_gl.glEnd(); - } - - public void fillPolygon(double[] xPoints, double[] yPoints, int nPoints) { - - m_gl.glPolygonMode(m_gl.GL_FRONT_AND_BACK, m_gl.GL_FILL); - - m_gl.glBegin(m_gl.GL_POLYGON); - - for (int i = 0; i < nPoints; i++) { - m_gl.glVertex2d(xPoints[i], yPoints[i]); - } - - m_gl.glEnd(); - } - - /* - * Bear in mind that although Java2D is capable of filling arbitrary - * polygons, OpenGL/graphics cards in general use a very simple fill - * algorithm which is only guaranteed to be valid for convex polygons - * If you want to render a concave polygon you have to tessellate it down - * into convex ones. - * - * So far I've been able to do this by modifying the way geometry is - * represented but you can also have a go at tessellating automatically - * using GLUT if you really need to... - */ - @Override - public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) { - - // Prototype code for vertex arrays, actually slower for single polys - // but will definitely improve importance if we start passing in big - // arrays of polygons, say for complex geometry - if (false) { - IntBuffer ib = BufferUtil.newIntBuffer(nPoints * 2); - for (int i = 0; i < nPoints; i++) { - ib.put(xPoints[i]); - ib.put(yPoints[i]); - } - ib.rewind(); - m_gl.glEnableClientState(GL.GL_VERTEX_ARRAY); - m_gl.glVertexPointer(2, GL.GL_INT, 0, ib); - m_gl.glDrawArrays(GL.GL_POLYGON, 0, nPoints); - } else { - // Draw the simple way - - m_gl.glPolygonMode(m_gl.GL_FRONT_AND_BACK, m_gl.GL_FILL); - m_gl.glBegin(m_gl.GL_POLYGON); - - for (int i = 0; i < nPoints; i++) { - m_gl.glVertex2f(xPoints[i], yPoints[i]); - } - - m_gl.glEnd(); - } - } - - @Override - public Stroke getStroke() { - return null; - } - - @Override - public void setStroke(Stroke z) { - //super.setStroke(z); - } - - @Override - public void drawString(String str, int x, int y) { - //FontRenderContext frc = new FontRenderContext(null, true, true); - //GlyphVector gv = m_font.layoutGlyphVector(frc, str.toCharArray(), - // 0, str.length(), Font.LAYOUT_LEFT_TO_RIGHT); - //int ng = gv.getNumGlyphs(); - //Rectangle2D r = gv.getVisualBounds(); - //m_gl.glColor3f(1.0f, 0.0f, 0.0f); - //this.fillRect((int) r.getX(), (int) r.getY(), (int) r.getWidth(), (int) r.getHeight()); - //this.setColor(m_color); - - WritableRaster test = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, - 32, 32, 4, null); - BufferedImage testi = new BufferedImage(m_colorModel, test, false, null); - Graphics testg = testi.getGraphics(); - FontMetrics fm = testg.getFontMetrics(m_font); - Rectangle2D r = fm.getStringBounds(str, testg); - - WritableRaster raster = - Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, - (int)r.getWidth(), (int)r.getHeight(), 4, null); - - BufferedImage bi = new BufferedImage(m_colorModel, raster, false, null); - - Graphics big = bi.getGraphics(); - //big.setColor(Color.GREEN); - //big.fillRect(0, 0, bi.getWidth(), bi.getHeight()); - big.setColor(m_color); - big.setFont(m_font); - big.drawString(str, -(int)r.getX(), -(int)r.getY()); - drawImage(bi, x, (int)(y - r.getHeight()), null); - } - - @Override - public void drawString(AttributedCharacterIterator iterator, int x, int y) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - WritableRaster raster = - Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, - img.getWidth(observer), img.getHeight(observer), 4, null); - - BufferedImage bi = new BufferedImage(m_colorModel, raster, false, null); - - Graphics2D g = bi.createGraphics(); - //g.setColor(Color.WHITE); - //g.drawLine(0, 0, bi.getWidth(), bi.getHeight()); - AffineTransform gt = new AffineTransform(); - gt.translate(0, img.getHeight(observer)); - gt.scale(1, -1d); - g.transform(gt); - g.drawImage(img, null, null); - - DataBufferByte imgbuf = (DataBufferByte) raster.getDataBuffer(); - - m_gl.glRasterPos2i(x, y + bi.getHeight()); - //System.out.println(img.getWidth(observer) + ":" + img.getHeight(observer)); - m_gl.glDrawPixels(img.getWidth(observer), img.getHeight(observer), - m_gl.GL_RGBA, m_gl.GL_UNSIGNED_BYTE, ByteBuffer.wrap(imgbuf.getData())); - - //System.out.println("Ignoring drawImage for now..."); - return true; - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { - // Needed to render JComponent backgrounds - //throw new UnsupportedOperationException("Not supported yet."); - return true; - } - - @Override - public Object getRenderingHint(Key z) { - return null; - } - - @Override - public void setRenderingHint(Key a, Object z) { - return; - } - - @Override - public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void dispose() { - m_depth--; - if (m_depth == 0) { - m_depth = 1; - // This happens when the object is really finally destroyed... - // When this is actually happening if we pop we'll cause a crash... - //System.err.println("DISPOSE CALLED TWICE ON ONE OBJECT!!!"); - //(new Exception()).printStackTrace(); - } else { - m_gl.glMatrixMode(GL.GL_MODELVIEW_MATRIX); - m_gl.glPopMatrix(); - } - return; - // We didn't create so no need to dispose... probably bad... - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void rotate(double a, double b, double z) { - super.rotate(a, b, z); - } - - @Override - public void rotate(double z) { - m_gl.glMatrixMode(GL.GL_MODELVIEW_MATRIX); - m_gl.glRotated(z * 360 / (2 * Math.PI), 0.0, 0.0, 1.0); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ALayout.java b/graphics/AtlantisJava/src/atlantis/canvas/ALayout.java deleted file mode 100755 index 7710aff90f88..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ALayout.java +++ /dev/null @@ -1,231 +0,0 @@ -package atlantis.canvas; - - -import java.util.Hashtable; -import java.util.Enumeration; -import java.awt.Rectangle; -import java.awt.Dimension; -import org.w3c.dom.*; - - -/** - * This class is not an Layout Manager! It contains the possible window - * configuration - i.e. the possible subdivision of the canvas area in windows. - * Layouts are identified by names such as "SQUARE","FULL_SCREEN". - * Windows are identified by single characters such as "W","1", etc. - * Windows are furthermore grouped in pages such that they do not overlap. - * Pages are identified by the sum of the windows they contain, such as "Full","Vert" - * This class is used mainly by ACanvas and AWindowControl. - */ - -public class ALayout { - //The name of the layout - private String name; - //A table of the window constraints (i.e. corners) for all windows - private Hashtable windowConstraints; - //A table of the pages - private Hashtable pages; - //The default top window for this layout - private String startupWindow; - //The list of window names that by default are - //on the top in this layout - private String[] startupSequence; - - - /** - * Default constructor - * - * @param node XML node with the configuration - */ - public ALayout(Node node) { - //Create new hashtables for window corners and pages - windowConstraints=new Hashtable(); - pages=new Hashtable(); - - // reading the layout attributes - NamedNodeMap attributes=node.getAttributes(); - name=attributes.getNamedItem("name").getNodeValue(); - startupWindow=attributes.getNamedItem("startupWindow").getNodeValue(); - startupSequence=decompose(attributes.getNamedItem("startup").getNodeValue()); - - // reading all the content of Layout node - // - i.e pages and window settings - NodeList childrens=node.getChildNodes(); - for(int i=0; i<childrens.getLength(); i++) { - //get the subnode - Node child=childrens.item(i); - //read in window or page information - if(child.getNodeType()==Node.ELEMENT_NODE) { - //check wether it is a window or page configuration - String nodeName=child.getNodeName(); - if(nodeName.equals("Window")) - readWindow(child); - else if(nodeName.equals("Page")) - readPage(child); - } - } - } - - /** - * Read the window configuration (name/size/position) from an XML node - * - * @param node XML node with the configuration - */ - private void readWindow(Node child) { - //Get the nodes attributes - NamedNodeMap attributes=child.getAttributes(); - //retrieve window information - String name=attributes.getNamedItem("name").getNodeValue(); - int hPos=Integer.parseInt(attributes.getNamedItem("hPos").getNodeValue()); - int vPos=Integer.parseInt(attributes.getNamedItem("vPos").getNodeValue()); - int width=Integer.parseInt(attributes.getNamedItem("width").getNodeValue()); - int height=Integer.parseInt(attributes.getNamedItem("height").getNodeValue()); - //Check if this is a valid window name - if(!ACanvas.getCanvas().isValidWindowName(name)) - throw new Error("Undefined window name: "+name); - //Check if this window has been defined before - if(windowConstraints.containsKey(name)) - throw new Error("Multiple usage of window name: "+name); - //Validate window size and position - if((hPos<0)||(vPos<0)||(width<0)||(height<0)) - throw new Error("Wrong window constraints"); - //Add window constraints to the list - windowConstraints.put(name, new Rectangle(hPos, vPos, width, height)); - } - - /** - * Read the page configuration (windows it contains) from the XML node - */ - private void readPage(Node child) { - //get the attributes - NamedNodeMap attributes=child.getAttributes(); - //retrieve page configuration - String name=attributes.getNamedItem("name").getNodeValue(); - String content=attributes.getNamedItem("content").getNodeValue(); - - //Check if this page exists before - if(pages.containsKey(name)) - throw new Error("Redefinition of page: "+name); - //Split the list of windows in single window names - //('S789' -> 'S','7','8','9') - String[] wContent=decompose(content); - - //Check that each of this is a valid window - for(int i=0; i<wContent.length; i++) - if(!ACanvas.getCanvas().isValidWindowName(wContent[i])) - throw new Error("Unknown window name: "+wContent[i]); - //Add this page - pages.put(name, wContent); - } - - /** - * Break up a string of window names into a list of single window names - * - * @param s the string to break up - */ - private String[] decompose(String s) { - String[] strings=new String[s.length()]; - char[] characters=s.toCharArray(); - - for(int i=0; i<characters.length; i++) - strings[i]=new String(new char[] {characters[i]}); - - return strings; - } - - /** - * Return the layout name - */ - public String getName() { - return name; - } - - /** - * Return the window selected on startup - */ - public String getStartupWindow() { - return startupWindow; - } - - /** - * Return the list of window names that are on top by default - */ - public String[] getStartupSequence() { - return startupSequence; - } - - /** - * Check if window is part of this layout - */ - public boolean hasWindow(String wName) { - return windowConstraints.containsKey(wName); - } - - /** - * Return window names in this layout - */ - public String[] getWindowNames() { - // Loop over the window constraints and retrieve - // window names. - Enumeration wn=windowConstraints.keys(); - int size=windowConstraints.size(); - String[] names=new String[size]; - //Add them all to the array - for(int i=0; i<size; i++) - names[i]=(String)wn.nextElement(); - - return names; - } - - /** - * Return the constraints (i.e. position and size) - * for a particular window - * - * @param wName the name of the window - */ - public Rectangle getWindowConstraints(String wName) { - return(Rectangle)windowConstraints.get(wName); - } - - /** - * Calculate the size of the layout from all its subwindows - */ - public Dimension getSize() { - - Enumeration myenum=windowConstraints.elements(); - int w=0, h=0; - //Loop over all windows - while(myenum.hasMoreElements()) { - Rectangle r=(Rectangle)myenum.nextElement(); - //Check if they exceed the current size - if(r.x+r.width>w) - w=r.x+r.width; - if(r.y+r.height>h) - h=r.y+r.height; - } - - return new Dimension(w, h); - } - - /** - * Return a list of the page names - */ - public String[] getPageNames() { - Enumeration myenum=pages.keys(); - int size=pages.size(); - String[] names=new String[size]; - - for(int i=0; i<size; i++) - names[i]=(String)myenum.nextElement(); - - return names; - } - - /** - * Return a list of the windows that a certain page consists of - */ - public String[] getPageContent(String pageName) { - return(String[])pages.get(pageName); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ALayoutChangeListener.java b/graphics/AtlantisJava/src/atlantis/canvas/ALayoutChangeListener.java deleted file mode 100644 index 521e31440d1e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ALayoutChangeListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package atlantis.canvas; - -/** - * Interface for all LayoutChangeListener classes. Each time the layout is - * changed, the layoutChanged method is called with the layout as an argument - * @author maillard - */ -public interface ALayoutChangeListener { - - /** - * This method gets called each time the layout is changed. - * @param canvas the canvas - */ - abstract public void layoutChanged(ACanvas canvas); - -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ALegendWindow.java b/graphics/AtlantisJava/src/atlantis/canvas/ALegendWindow.java deleted file mode 100755 index b6397cf61f94..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ALegendWindow.java +++ /dev/null @@ -1,197 +0,0 @@ -package atlantis.canvas; - -import java.awt.Color; -import java.awt.Component; -import java.awt.GridLayout; -import java.awt.Toolkit; - -import javax.swing.JFrame; -import javax.swing.JTextField; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.graphics.colormap.AColorMap; - -/** - * The legend window appears when selected in the preferences menu - * It displays the energy scale for the summed endcaps as these do not - * have the pick interaction. - * - * Moved from package atlantis.gui to atlantis.canvas because of closer - * coupling with classes in atlantis.canvas and atlantis.data. Could move - * back later if can be decoupled. (Ben Waugh, 2011-10-01) - * - * @author Mark Stockton - */ -public class ALegendWindow extends JFrame -{ - private static JTextField[] titleField = new JTextField[2]; - private static JTextField[] textField; - private static ALegendWindow instance = null; - - public static ALegendWindow getInstance() - { - if (instance == null) - instance = new ALegendWindow(); - return instance; - } - - /** - * Check if ALegendWindow instance exists, without creating it if not. - * @return true if ALegendWindow instance exists - */ - public static boolean exists() { - return (instance != null); - } - - public void addEnergyText(AWindow window, double[] Energies, double Energy, Color[] colorMap) - { - if(window.equals(ACanvas.getCanvas().getCurrentWindow())) - { - getContentPane().removeAll(); - validate(); - getContentPane().setLayout(new GridLayout(Energies.length+titleField.length,1)); - - titleField[0].setText("Color Energy thresholds:"); - getContentPane().add(titleField[0]); - if(titleField[1]==null) - titleField[1]=new JTextField(); - titleField[1].setEditable(false); - titleField[1].setBackground(Color.white); - titleField[1].setForeground(Color.black); - titleField[1].setText("Maximum Cell Energy: " + (Math.rint(1000. * Energy)/1000) + " GeV "); - getContentPane().add(titleField[1]); - - String s=""; - for(int i=Energies.length-1;i>=0;i--) - { - if(textField[i]==null) - textField[i]=new JTextField(); - textField[i].setEditable(false); - //to even out the line spacing - if(i<10) - s="0" + i; - else - s="" + i; - s ="Color " + s + " Energy from: " + (Math.rint(1000. * Energies[i])/1000) + " GeV"; - textField[i].setText(s); - textField[i].setBackground(colorMap[i]); - //find out if too dark for black text - if( colorMap[i].getRed() + colorMap[i].getGreen() + - colorMap[i].getBlue()<=128) - textField[i].setForeground(Color.white); - else - textField[i].setForeground(Color.black); - getContentPane().add(textField[i]); - } - invalidate(); - pack(); - setVisible(true); - } - } - - public void addEnergyText(AWindow window, double minEnergy, double maxEnergy) - { - if(window.equals(ACanvas.getCanvas().getCurrentWindow())) - { - getContentPane().removeAll(); - validate(); - getContentPane().setLayout(new GridLayout(3,1)); - titleField[0].setText("Color Energy thresholds:"); - getContentPane().add(titleField[0]); - if(titleField[1]==null) - titleField[1]=new JTextField(); - titleField[1].setEditable(false); - titleField[1].setBackground(Color.white); - titleField[1].setForeground(Color.black); - titleField[1].setText("Maximum Cell Energy: " + (Math.rint(1000. * maxEnergy)/1000) + " GeV "); - getContentPane().add(titleField[1]); - - if(textField[0]==null) - textField[0]=new JTextField(); - textField[0].setEditable(false); - textField[0].setText("Minimum Cell Energy: " + (Math.rint(1000. * minEnergy)/1000) + " GeV "); - textField[0].setBackground(Color.white); - textField[0].setForeground(Color.black); - getContentPane().add(textField[0]); - invalidate(); - pack(); - setVisible(true); - } - } - - public void clearText(AWindow window) - { - if(!titleField[0].getText().equals("Select colour by Energy to bring up scale") - && window.equals(ACanvas.getCanvas().getCurrentWindow())) - { - getContentPane().removeAll(); - validate(); - getContentPane().setLayout(new GridLayout(1,1)); - titleField[0].setText("Select colour by Energy to bring up scale"); - getContentPane().add(titleField[0]); - invalidate(); - pack(); - setVisible(true); - } - } - - public void nothingToDisplay(AWindow window) - { - if(!titleField[0].getText().equals("Select LAr/HEC Summed and colour by Energy to bring up scale") - && window.equals(ACanvas.getCanvas().getCurrentWindow())) - { - getContentPane().removeAll(); - validate(); - getContentPane().setLayout(new GridLayout(1,1)); - titleField[0].setText("Select LAr/HEC Summed and colour by Energy to bring up scale"); - getContentPane().add(titleField[0]); - invalidate(); - pack(); - setVisible(true); - } - - } - - private ALegendWindow() - { - this.setTitle("Legend"); - AIcon.setIconImage(this); - this.setResizable(false); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - int numColors = AColorMap.getNumColors(); - getContentPane().setLayout(new GridLayout(1,1)); - textField = new JTextField[numColors]; - titleField[0] =new JTextField(); - titleField[0].setEditable(false); - titleField[0].setBackground(Color.white); - titleField[0].setForeground(Color.black); - titleField[0].setText("Select LAr/HEC Summed and colour by Energy to bring up scale"); - getContentPane().add(titleField[0]); - - // set the initial location - Component gui = AGlobals.instance().getGuiFrame(); - int guiWidth = gui.getWidth(); - int guiHeight = gui.getHeight(); - int guiX = gui.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit() - .getScreenSize().getWidth()); - if (guiX + guiWidth + (dialogWidth - guiWidth) / 2 > screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max( - 0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), - Math.max(0, (guiHeight - dialogHeight) / 3)); - - pack(); - setVisible(true); - } - - public void dispose() - { - instance = null; - super.dispose(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AOverlay.java b/graphics/AtlantisJava/src/atlantis/canvas/AOverlay.java deleted file mode 100644 index f4147695a913..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AOverlay.java +++ /dev/null @@ -1,193 +0,0 @@ -package atlantis.canvas; - -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; - -import javax.swing.ImageIcon; -import javax.swing.JPanel; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.globals.AGlobals; -import atlantis.graphics.AGraphics; -import atlantis.parameters.APar; -import atlantis.utils.AUtilities; - -/** - * AOverlay should be used within a GlassPane in the ACanvas. - * The overlay acts as a canvas on which images can be drawn over the existing display. - * This is currently only used to draw the ATLAS logo and Run/Event info as a floating image. - * Any drawing should be done with the paintComponent method, which is called as the Canvas is drawn. - * @author Tom McLaughlan - */ -public class AOverlay extends JPanel { - - protected static APar parameterStore = APar.instance(); - - public AOverlay() { - setOpaque(false); - } - - /** - * When the ACanvas GlassPane contains an Overlay instance, this is called - * after the Canvas is drawn. - */ - @Override public void paintComponent(Graphics g) { - super.paintComponent(g); - if(parameterStore.get("Logo","ShowATLAS").getStatus()) - drawATLASLogo(g); - } - - /** - * Draws a scaled version of the ATLAS PNG in the Overlay - * @param g The Graphics instance to draw to - */ - protected void drawATLASLogo(Graphics g) { - - int windowWidth = getWidth(); - int windowHeight = getHeight(); - - int logoWidth = 0; - int logoHeight = 0; - - double size = parameterStore.get("Logo", "LogoSize").getD(); - - logoWidth = (int) (windowWidth*size); - logoHeight = (int) (logoWidth*0.6); - - int logoX = 0; - int logoY = 0; - - double hpos = parameterStore.get("Logo", "LogoHPos").getD(); - logoX = (int) ((hpos * (windowWidth-logoWidth))); - - double vpos = parameterStore.get("Logo", "LogoVPos").getD(); - - int heightOffset = 0; - if(parameterStore.get("Prefs", "CanvasTitle").getStatus()) { - windowHeight = this.getParent().getHeight() - 40; - heightOffset = 40; - } - logoY = (int) ((vpos * (windowHeight-logoHeight))) + heightOffset; - - - long EventNumber = 0; - long RunNumber = 0; - String DateTime = ""; - Color textColor = Color.white, - backgroundColor = Color.black; - - AEvent event = AEventManager.instance().getCurrentEvent(); - - if (event != null) { - RunNumber = event.getRunNumber(); - EventNumber = event.getEventNumber(); - DateTime = event.getDateTime(); - } - - // Begin drawing - AGraphics ag = AGraphics.makeAGraphics(g); - // Fill the background - ag.setColor(backgroundColor); - //ag.fillRect(logoX, logoY, logoWidth, logoHeight); - - String iconPath = AGlobals.instance().getHomeDirectory() + "img" + System.getProperty("file.separator"); - - ImageIcon i = AUtilities.getFileAsImageIcon(iconPath + "atlas_logo_shadow.png"); - - - // Determine height and width of current window, and width of ATLAS logo - // These are then used to determine a scaling factor which is used in the - // scale function. - // - - int iwidth = i.getIconWidth(); - double factor = (double) logoWidth / (double) iwidth; - - // Call scale function to scale image to window size - ImageIcon iscale = AUtilities.scale(i.getImage(), factor, parameterStore.get("Prefs", "AntiAlias").getStatus()); - // x, y calculated to position image exactly centred - int x = (logoWidth / 2) - (iscale.getIconWidth() / 2); - int y = (logoHeight / 2) - ((3 * iscale.getIconHeight()) / 4); - - x += logoX; - y += logoY; - - int dpi = 72; - - // Set a scaling font size with window width - int fontSize = (int) Math.round(3.0 * logoWidth / (double) dpi) - 2; - - Font f = new Font("SansSerif", Font.PLAIN, fontSize); - - ag.drawImage(iscale.getImage(), x, y); - - ag.setColor(textColor); // Set colour for text - ag.updateColor(); // Update current colour for drawing - - String DateString = "", RunEventString = ""; - if (event != null) { - DateString = "Date: " + DateTime; - RunEventString = "Run Number: " + RunNumber + ", Event Number: " + EventNumber; - } else { - RunEventString = "No event data available"; - } - - FontMetrics fm = g.getFontMetrics(f); - int DateWidth = fm.stringWidth(DateString); - int RunEventWidth = fm.stringWidth(RunEventString); - - // Check if font is wider than the window and scale down til it fits. - while ((RunEventWidth > logoWidth - 20) || (DateWidth > logoWidth - 20)) - { - - fontSize = fontSize - 1; - f = new Font("SansSerif", Font.PLAIN, fontSize); - fm = g.getFontMetrics(f); - RunEventWidth = fm.stringWidth(RunEventString); - DateWidth = fm.stringWidth(DateString); - } - - ag.setFont(f); // set font as defined above - - if (event != null) { - drawStrokedString(ag, RunEventString, logoX + (logoWidth / 2) - RunEventWidth / 2, (int) (y + (1.1 * iscale.getIconHeight())), Color.WHITE, Color.BLACK); - //ag.drawString(RunEventString, - // logoX + (logoWidth / 2) - RunEventWidth / 2, y + (1.1 * iscale.getIconHeight())); - - if(!DateTime.equals("") && !DateTime.equals("n/a")) { - // If event contains Date/Time data, draw Run Number, Event Number and Date/Time - // and position text in centre of window - drawStrokedString(ag, DateString, logoX + (logoWidth / 2) - DateWidth / 2, (int) (y + (1.3 * iscale.getIconHeight())), Color.WHITE, Color.BLACK); - - //ag.drawString(DateString, - // logoX + (logoWidth / 2) - DateWidth / 2, y + (1.3 * iscale.getIconHeight())); - } - } - } - - /** - * Draws text with an outline, crudely. - * @param ag The AGraphics instance to draw to - * @param str The String to draw - * @param x x position of the string - * @param y y position of the string - * @param fg Text foreground colour - * @param bg Text outline colour - */ - protected void drawStrokedString(AGraphics ag, String str, int x, int y, Color fg, Color bg) { - ag.setColor(Color.BLACK); - ag.updateColor(); - ag.drawString(str, x-1, y-1); - ag.drawString(str, x+1, y+1); - ag.drawString(str, x+1, y-1); - ag.drawString(str, x-1, y+1); - ag.setColor(fg); - ag.updateColor(); - ag.drawString(str, x, y); - } - - -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AScale.java b/graphics/AtlantisJava/src/atlantis/canvas/AScale.java deleted file mode 100644 index 8359fe7cc7cc..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AScale.java +++ /dev/null @@ -1,356 +0,0 @@ -package atlantis.canvas; - -import java.awt.geom.GeneralPath; - -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjection; - -/** - * This class contains static methods which are useful for the - * AScaleBorder class and any potential subclasses. - * - * @author Charles Loomis, Ben Waugh - **/ -public class AScale { - final GeneralPath primaryTicks; - final GeneralPath secondaryTicks; - final double[] labelValues; // units are cm - final double[] labelPositions; // after transform - - final static public int LEFT_TICKS=0; - final static public int RIGHT_TICKS=1; - final static public int BOTH_TICKS=2; - - /** - * The size in pixels of the primary tick marks. This is a global - * property for all scales. */ - private static float primaryTickSize=8.f; - - /** - * The size in pixels of the secondary tick marks. This is a - * global property for all scales. */ - private static float secondaryTickSize=5.f; - - private AScale(GeneralPath primaryTicks, GeneralPath secondaryTicks, - double[] label, double[] position) { - this.primaryTicks = primaryTicks; - this.secondaryTicks = secondaryTicks; - this.labelValues = label; - this.labelPositions = position; - } - - /** - * Set the tick sizes (in pixels) for the primary and secondary - * tick marks. */ - static public void setTickSizes(float primaryTickSize, - float secondaryTickSize) { - AScale.primaryTickSize=primaryTickSize; - AScale.secondaryTickSize=secondaryTickSize; - } - - /** - * Get the primary tick size (in pixels). */ - static public float getPrimaryTickSize() { - return AScale.primaryTickSize; - } - - /** - * Get the secondary tick size (in pixels). */ - static public float getSecondaryTickSize() { - return AScale.secondaryTickSize; - } - - /** - * A utility method to add a tick mark to the given GeneralPath at - * the given position. */ - static private void addTickMark(GeneralPath gp, - int location, - float tickPosition, - float tickLength) { - - switch(location) { - - case(AScale.RIGHT_TICKS): - gp.moveTo(tickPosition, 0.f); - gp.lineTo(tickPosition, tickLength); - break; - - case(AScale.LEFT_TICKS): - gp.moveTo(tickPosition, 0.f); - gp.lineTo(tickPosition, -tickLength); - break; - - case(AScale.BOTH_TICKS): - gp.moveTo(tickPosition, -tickLength); - gp.lineTo(tickPosition, tickLength); - break; - } - } - - /** - * Get scale with given parameters. - * - * @param minValueTransformed min value after (fish-eye) transformation - * @param maxValueTransformed max value after (fish-eye) transformation - * @param scaleSize length of the scale border - * @param minPrimary minimum number of primary tick marks - * @param minSeparation minimum separation between tick marks - * @param location left,right,top,bottom - * @param isVertical whether this is a horizontal or vertical scale - * @param proj the projection this scale is drawn for - * @return - */ - public static AScale calculateScale( - double minValueTransformed, - double maxValueTransformed, - int scaleSize, - int minPrimary, - int minSeparation, - int location, - int isVertical, - AProjection proj - ){ - // Setup the two paths which will contain the primary and secondary tick marks. - GeneralPath primaryTicks = new GeneralPath(); - GeneralPath secondaryTicks = new GeneralPath(); - resetScale(primaryTicks,scaleSize); - resetScale(secondaryTicks,scaleSize); - - double minValue = invertTransformation(minValueTransformed,proj,isVertical); - double maxValue = invertTransformation(maxValueTransformed,proj,isVertical); - - double[] labelValues; - double[] labelPositions; - double[] intervals = getScaleIntervals(minValue,maxValue); - if (intervals!=null) { - double labelInterval = intervals[0]; - double primarySpacing = intervals[1]; - double secondarySpacing = intervals[2]; - addTickMarks(primaryTicks, proj, minValue, maxValue, primarySpacing, isVertical, location, primaryTickSize, scaleSize); - addTickMarks(secondaryTicks, proj, minValue, maxValue, secondarySpacing, isVertical, location, secondaryTickSize, scaleSize); - - // Now the labels with the correct precision must be made. - labelValues = getScaleValues(minValue,maxValue,labelInterval); - int numLabels = labelValues.length; - labelPositions = new double[numLabels]; - int ndigits=(int)(Math.floor(Math.log10(primarySpacing))); - ndigits=-Math.min(ndigits, 0); - - for (int i=0; i<labelValues.length; ++i) { - double valueTrans = applyTransformation(labelValues[i],proj,isVertical); - labelPositions[i] = (double) interpolate(valueTrans, scaleSize, minValueTransformed, maxValueTransformed); - } - } else { - labelValues = new double[] {}; - labelPositions = new double[] {}; - } - - return new AScale(primaryTicks,secondaryTicks,labelValues,labelPositions); - } - - /** - * Add tick marks at multiples of given spacing. - * - * @param path - * @param proj - * @param min - * @param max - * @param spacing - * @param isVertical - * @param location - * @param tickSize - * @param scaleSize - */ - private static void addTickMarks(GeneralPath path, - AProjection proj, double min, double max, double spacing, int isVertical, int location, float tickSize, double scaleSize) { - int minMultiplier = (int) Math.ceil(min/spacing); - int maxMultiplier = (int) Math.floor(max/spacing); - double minTrans = applyTransformation(min,proj,isVertical); - double maxTrans = applyTransformation(max,proj,isVertical); - for (int i=minMultiplier; i<=maxMultiplier; ++i) { - double value = i * spacing; - double valTrans = applyTransformation(value,proj,isVertical); - float tickPosition=interpolate(valTrans, scaleSize, minTrans, maxTrans); - addTickMark(path, location, tickPosition, tickSize); - } - - } - - private static void resetScale(GeneralPath path, double length) { - path.reset(); - path.moveTo(0.f, 0.f); - path.lineTo((float)length, 0.f); - } - - /** - * Convert from physical detector coordinate to transformed (fish-eye) coordinate. - * - * @param value - * @param proj - * @param isVertical - * @return - */ - private static double applyTransformation(double value, AProjection proj, int isVertical) { - double valueTransformed = value; - //Apply non-linear transforms if necessary - if (proj instanceof AProjection2D) { - if (isVertical==1) { - valueTransformed = ((AProjection2D)proj).nonLinearTransform(0,value).getY(); - } else { - valueTransformed = ((AProjection2D)proj).nonLinearTransform(value,0).getX(); - } - } - return valueTransformed; - } - - /** - * Convert from transformed (fish-eye) coordinate back to physical detector coordinate. - * - * @param valueTransformed - * @param proj - * @param isVertical - * @return - */ - private static double invertTransformation(double valueTransformed, AProjection proj, int isVertical) { - double value = valueTransformed; - //Apply non-linear transforms if necessary - if (proj instanceof AProjection2D) { - if (isVertical==1) { - value = ((AProjection2D)proj).inverseNonLinearTransform(0,valueTransformed).getY(); - } else { - value = ((AProjection2D)proj).inverseNonLinearTransform(valueTransformed,0).getX(); - } - } - return value; - } - - static float interpolate(double value, double size, - double value0, double value1) { - return(float)(size*(value-value0)/(value1-value0)); - } - - /** - * Title is put between last two value labels on axis. - * @return the position for the title on the scale - */ - public double getTitlePosition() { - double axisPosition; - int numLabels = labelPositions.length; - if (numLabels>=2) { - axisPosition = 0.5 * (labelPositions[numLabels-1] + labelPositions[numLabels-2]); - } else { - axisPosition = 0.0; // default to 0 if only one label (shouldn't happen) - } - return axisPosition; - } - - /** - * Get array of three intervals to use on scale. - * @param min minimum value on scale - * @param max maximum value on scale - * @return intervals to use for [labels, primary tick marks, secondary tick marks] - */ - static double[] getScaleIntervals(double min, double max) { - if (min>=max) return null; - boolean rangeIncludesZero = (min<0.0 && max>0.0); - double labelInterval; - double labelIntervalUnit; - int labelIntervalMultiplier; - if (rangeIncludesZero) { - double maxAbsValue = Math.max(Math.abs(min), Math.abs(max)); - double m=Math.floor(Math.log10(maxAbsValue)); - labelIntervalUnit = Math.pow(10., m); - labelInterval = getRoundNumber(maxAbsValue); - labelIntervalMultiplier = (int) Math.round(labelInterval / labelIntervalUnit); - if (labelIntervalMultiplier==2 && 2*labelInterval<maxAbsValue) { - labelIntervalMultiplier = 4; - labelInterval = labelIntervalMultiplier * labelIntervalUnit; - } - } else { - double range = Math.abs(max-min); - labelInterval = getRoundNumber(range); - int minMultiplier = (int) Math.ceil(min/labelInterval); - int maxMultiplier = (int) Math.floor(max/labelInterval); - while (maxMultiplier==minMultiplier) { - labelInterval = getRoundNumber(labelInterval*0.99); - minMultiplier = (int) Math.ceil(min/labelInterval); - maxMultiplier = (int) Math.floor(max/labelInterval); - } - double m=Math.floor(Math.log10(labelInterval)); - labelIntervalUnit = Math.pow(10., m); - minMultiplier = (int) Math.ceil(min/labelInterval); - maxMultiplier = (int) Math.floor(max/labelInterval); - labelIntervalMultiplier = (int) (labelInterval/labelIntervalUnit); - } - - double primaryInterval, secondaryInterval; - switch (labelIntervalMultiplier) { - case 1: - primaryInterval = labelIntervalUnit * 0.5; - secondaryInterval = labelIntervalUnit * 0.1; - break; - case 2: - primaryInterval = labelIntervalUnit * 1.0; - secondaryInterval = labelIntervalUnit * 0.2; - break; - case 3: - primaryInterval = labelIntervalUnit * 0.2; - secondaryInterval = labelIntervalUnit * 0.1; - break; - case 4: - primaryInterval = labelIntervalUnit * 2.0; - secondaryInterval = labelIntervalUnit * 0.5; - break; - case 5: - primaryInterval = labelIntervalUnit * 1.0; - secondaryInterval = labelIntervalUnit * 0.5; - break; - default: // Should not happen - primaryInterval = labelIntervalUnit * 0.5; - secondaryInterval = labelIntervalUnit * 0.1; - } - return new double[] {labelInterval, primaryInterval, secondaryInterval}; - } - - /** - * Get array of multiples of the given interval that lie in the given range. - * @param minValue minimum value on scale - * @param maxValue maximum value on scale - * @param labelInterval interval between values - * @return array of calculate values - */ - static double[] getScaleValues(double minValue, double maxValue, - double interval) { - int min = (int) Math.ceil(minValue/interval); - int max = (int) Math.floor(maxValue/interval); - int numValues = 1 + max - min; - double[] values = new double[numValues]; - for (int i=0; i<numValues; ++i) { - values[i] = (min + i) * interval; - } - return values; - } - - /** - * Rounds number towards zero to nearest "round number", i.e. a power of ten - * multiplied by 1, 2 or 5. - * - * @param d number to round - * @return next round number towards zero from input - */ - static double getRoundNumber(double d) { - double magnitude = Math.abs(d); - double m=Math.floor(Math.log10(magnitude)); - double unit = Math.pow(10., m); - double multIn = magnitude / unit; - double multOut; - if (multIn >= 5.0) multOut = 5.0; - else if (multIn >= 2.0) multOut = 2.0; - else multOut = 1.0; - double magRound = unit * multOut; - double round; - if (d<0.0) round = -magRound; - else round = magRound; - return round; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AScaleBorder.java b/graphics/AtlantisJava/src/atlantis/canvas/AScaleBorder.java deleted file mode 100755 index 8610ee38bfa5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AScaleBorder.java +++ /dev/null @@ -1,1282 +0,0 @@ -package atlantis.canvas; - -import atlantis.graphics.AAbstractGraphics2D; -import atlantis.graphics.ACursorFactory; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.Stroke; -import java.awt.Image; -import java.awt.geom.AffineTransform; -import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.Point2D; - -import javax.swing.border.Border; - -import atlantis.gui.APreferencesControl; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.parameters.ALinkParameter; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjectionEventInfo; -import atlantis.projection.AProjectionNGE; -import atlantis.projection.AProjectionTrackResidual; -import atlantis.utils.AMath; -import java.awt.RenderingHints; - -/** - * This class implements a Border in which the left and bottom sides contain - * numerical scales. - * - * @author Charles Loomis, Sebastian Boeser - */ -public class AScaleBorder implements Border -{ - // Constants giving horizontal and vertical index of the data arrays. - final static private int HORIZONTAL = 0; - final static private int VERTICAL = 1; - - /** - * Constant describing a transform in which the transformed x and y axes are - * parallel (or antiparallel) to the original axes. - */ - final static public int TYPE_PARALLEL_TRANSFORM = 0; - - /** - * Constant describing a transform in which the transformed x and y axes are - * parallel (or antiparallel) to the original y and x axes, respectively. - */ - final static public int TYPE_SWITCHED_TRANSFORM = 1; - - /** - * Constant describing a transform in which the transformed x-axis is - * parallel (or antiparallel) to the original x-axis and the transformed - * y-axis forms a non-zero angle with the original one. - */ - final static public int TYPE_X_SKEW_TRANSFORM = 2; - - /** - * Constant describing a transform in which the transformed y-axis is - * parallel (or antiparallel) to the original y-axis and the transformed - * x-axis forms a non-zero angle with the original one. - */ - final static public int TYPE_Y_SKEW_TRANSFORM = 3; - - /** - * Constant describing a transform in which the transformed x-axis is - * parallel (or antiparallel) to the original y-axis and the transformed - * y-axis forms a non-zero angle with the original x-axis. - */ - final static public int TYPE_SWITCHED_X_SKEW_TRANSFORM = 4; - - /** - * Constant describing a transform in which the transformed y-axis is - * parallel (or antiparallel) to the original x-axis and the transformed - * x-axis forms a non-zero angle with the original y-axis. - */ - final static public int TYPE_SWITCHED_Y_SKEW_TRANSFORM = 5; - - /** - * Constant describing a transform which does not fall into one of the other - * categories. - */ - final static public int TYPE_GENERAL_TRANSFORM = 6; - - /** - * Constant indicating that a string should be aligned vertically with the - * baseline of the text. This is the default in drawString calls which do - * not specify an alignment. - */ - public static final int TEXT_BASELINE = 0; - - /** - * Constant indicating that a string should be aligned vertically with the - * top of the text. - */ - public static final int TEXT_TOP = 1; - - /** - * Constant indicating that a string should be aligned vertically with the - * bottom of the text. - */ - public static final int TEXT_BOTTOM = 3; - - /** - * Constant indicating that a string should be aligned by the center. This - * is used for both horizontal and vertical alignment. - */ - public static final int TEXT_CENTER = 2; - - /** - * Constant indicating that a string should be aligned horizontally with the - * left side of the text. This is the default for drawString calls which do - * not specify an alignment. - */ - public static final int TEXT_LEFT = 1; - - /** - * Constant indicating that the string should be aligned horizontally with - * the right side of the text. - */ - public static final int TEXT_RIGHT = 3; - - private AScale horizontalScale; // holds tick marks and labels - private AScale verticalScale; - - /** - * String giving the axis labels. - */ - private String[] axisLabels = new String[2]; - - /** - * String giving the axis units. - */ - private String[] axisUnits = new String[2]; - - /** - * The initial font size for labeling. - */ - private int fontSize = 12; - - /** - * The initial font to use. - */ - private Font labelFont = new Font("SansSerif", Font.BOLD, 12); - - /** - * The width of the line used for the secondary tick marks. - */ - final static private Stroke thinStroke = new BasicStroke(1.f); - - /** - * The width of the line used for the primary tick marks. - */ - final static private Stroke thickStroke = new BasicStroke(2.f); - - /** - * An array to hold temporary point values for transformation. - */ - private double[] axisPts = new double[6]; - - /** - * Flag to indicate that the scale has changed and that it needs to be - * redrawn. - */ - private boolean scaleChanged; - - - /** - * The current width of the horizontal scale. - */ - private int currentWidth; - - /** - * The current width of the vertical scale. - */ - private int currentHeight; - - /** - * Minimum value on the horizontal axis. - */ - private double minHoriz; - - /** - * Maximum value of the horizontal axis. - */ - private double maxHoriz; - - /** - * Minimum value of the vertical axis. - */ - private double minVert; - - /** - * Maximum value on the vertical axis. - */ - private double maxVert; - - /** - * The calculated Insets for this border. - */ - private Insets insets; - - private boolean selected; - - /** - * Wether to draw the scales for this window or not - */ - private boolean drawScaleBorder; - - /** - * Wether to draw the scales for this window or not - * independant of the projection being displayed - */ - private boolean drawScaleBorder_preference; - - - /** - * The window this scale is drawn in. - */ - private final AWindow aWindow; - - /** - * Constructs a AScaleBorder - * @param theWindow the window this scale belongs to - */ - public AScaleBorder(AWindow theWindow) - { - aWindow = theWindow; - - // Give default values for the size of the axes. - minHoriz = 0.; - maxHoriz = 0.; - minVert = 0.; - maxVert = 0.; - - // Make the new insets. - resetInsets(); - - // Set the current width and height. - currentWidth = 0; - currentHeight = 0; - scaleChanged = false; - - selected = false; - drawScaleBorder = true; - drawScaleBorder_preference = true; - } - - public void forceDraw() - { - scaleChanged = true; - } - - public void toggleScale() - { - drawScaleBorder_preference = !drawScaleBorder_preference; - //only actually toggle scale if on a window with scale - AProjection p = aWindow.getProjection(); - - if(p instanceof AProjectionLegoPlot || p instanceof AProjectionNGE || p instanceof AProjectionEventInfo) - return; - - drawScaleBorder = !drawScaleBorder; - scaleChanged = true; - resetInsets(); - } - - public void hideScale() - { - //upon window change of projection check if scales need to hide or not - AProjection p = aWindow.getProjection(); - - // Check global 'Hide Scales' option (in preferences menu) - // If hiding scales, set all scales to false - // - if(APreferencesControl.getHideScalesMenuItem()) - { - drawScaleBorder=false; - resetInsets(); - } - else - if(p instanceof AProjectionLegoPlot || p instanceof AProjectionNGE || p instanceof AProjectionEventInfo){ - if(drawScaleBorder){ - drawScaleBorder=false; - resetInsets(); - } - }else if(drawScaleBorder!=drawScaleBorder_preference){ - drawScaleBorder=drawScaleBorder_preference; - resetInsets(); - } - } - - public boolean getScaleStatus() - { - return drawScaleBorder_preference; - } - - /** - * Set the font for the labels. - */ - public void setLabelFont(Font labelFont) - { - this.labelFont = labelFont; - fontSize = labelFont.getSize(); - resetInsets(); - } - - public void setSelected() - { - selected = true; - } - - public void setDeselected() - { - selected = false; - } - - /** - * Get the current font for the labels. - */ - public Font getLabelFont() - { - return labelFont; - } - - /** - * Set the horizontal and vertical limits for the scales. - */ - public void setLimits(double minHoriz, double maxHoriz, double minVert, double maxVert) - { - this.minHoriz = minHoriz; - this.maxHoriz = maxHoriz; - this.minVert = minVert; - this.maxVert = maxVert; - scaleChanged = true; - } - - /** - * Set the axis labels. - */ - public void setAxisLabels(String horizontalLabel, String verticalLabel) - { - axisLabels[HORIZONTAL] = horizontalLabel; - axisLabels[VERTICAL] = verticalLabel; - } - - public String getHorizontalAxisLabel() - { - return axisLabels[HORIZONTAL]; - } - - public String getVerticalAxisLabel() - { - return axisLabels[VERTICAL]; - } - - /** - * Set the axis units. - */ - public void setAxisUnits(String horizontalUnits, String verticalUnits) - { - if (horizontalUnits != null) - { - axisUnits[HORIZONTAL] = horizontalUnits; - } - else - { - axisUnits[HORIZONTAL] = ""; - } - - if (verticalUnits != null) - { - axisUnits[VERTICAL] = verticalUnits; - } - else - { - axisUnits[VERTICAL] = ""; - } - } - - /** - * Returns the insets of this border. - */ - @Override - public Insets getBorderInsets(Component c) - { - return (Insets) insets.clone(); - } - - /** - * Returns whether or not the border is opaque. This always returns true. - */ - @Override - public boolean isBorderOpaque() {return true;} - - /** - * Paints the border and window decorations for the specified component with the specified graphics - * context, position, and size. - */ - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) - { - //Get the graphics context - Graphics2D vg = (Graphics2D) g; - //Sanity check - if (vg==null) return; - - //Select background and frame colors - Color bg = AWindow.BORDER_BACKGROUND_COLOR ; - - //Paint the border frame - paintBorderFrame(vg,bg,width,height); - - //If drawing the border draw scales - if (drawScaleBorder) - { - //Now check which projection we have - AProjection p = aWindow.getProjection(); - - // Set the flag indicating that the scales must be remade. - scaleChanged = (scaleChanged || width != currentWidth || height != currentHeight); - - //set the Scales - setScales(p.getXLabel(), p.getYLabel(), p.getXUnits(), p.getYUnits(), makeTransform(aWindow.getUserCorners()), aWindow.getWidth(), aWindow.getHeight()); - - //Paint the grid if there is one for this projection - paintGrid(vg,p,width,height); - - //Paint the scales themselves - paintScales(vg,p,width,height); - - // Reset the current width and height. - currentWidth = width; - currentHeight = height; - scaleChanged = false; - } - - //Check whether Window Title needs to be drawn - if(APreferencesControl.getWindowTitleMenuItem()) { - paintWindowTitle(g, width, height,true); - } - - //Check whether FishEye Indicator needs to be drawn - if(APreferencesControl.getFisheyeIndicatorMenuItem()) { - paintFishEyeIndicator(g, false, width, height); - } - } - - /** - * Paints the part of the border that appears when the window is printed - */ - void printBorder(Component c, Graphics g, int x, int y, int width, int height) - { - paintBorder(c,g,x,y,width,height); - } - - - /** - * Draw the part of the scales that shows up in printing - */ - private void paintScales(Graphics2D g, AProjection p, int width, int height){ - APar parameterStore = APar.instance(); - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - - Color foregroundColour = selected ? AWindow.BORDER_SELECTED_FOREGROUND_COLOR : AWindow.BORDER_FOREGROUND_COLOR; - - // Get the horizontal scale. - if (scaleChanged) - { - int scaleLength = width - (insets.left + insets.right); - horizontalScale = AScale.calculateScale(minHoriz, maxHoriz, scaleLength, 3, 7, AScale.RIGHT_TICKS, - HORIZONTAL, p); - } - - svg.translate(insets.left, height - insets.bottom + 2); - - svg.setColor(foregroundColour); - svg.setFont(new Font("SansSerif", Font.BOLD, 12)); - - // Draw the primary and secondary tick marks. - svg.setStroke(thickStroke); - svg.draw(horizontalScale.primaryTicks); - svg.setStroke(thinStroke); - svg.draw(horizontalScale.secondaryTicks); - - ScaleUnits hScaleUnits = new ScaleUnits(axisUnits[HORIZONTAL],minHoriz,maxHoriz); - double factorH = hScaleUnits.scaleFactor; - String unitsH = hScaleUnits.units; - - ScaleUnits vScaleUnits = new ScaleUnits(axisUnits[VERTICAL],minVert,maxVert); - double factorV = vScaleUnits.scaleFactor; - String unitsV = vScaleUnits.units; - - // Paint the tick labels. - int numLabelsH = horizontalScale.labelValues.length; - for (int i = 0; i < numLabelsH; i++) - { - double valueScaled = horizontalScale.labelValues[i] * factorH; - int nDecPlaces = getNumDecimalPlaces(valueScaled); - String label = String.format("%."+nDecPlaces+"f", valueScaled); - drawString(svg, label, - (float) horizontalScale.labelPositions[i], AScale.getPrimaryTickSize() + 0.2f * fontSize, TEXT_CENTER, TEXT_TOP, width - insets.left - insets.right); - } - - // Paint the axis label. - float axisPositionX = (float) horizontalScale.getTitlePosition(); - drawString(svg, axisLabels[HORIZONTAL] + " " + unitsH, axisPositionX, AScale.getPrimaryTickSize() + 0.2f * fontSize, TEXT_CENTER, TEXT_TOP, width - insets.left - insets.right); - - // End this context. - svg.dispose(); - - // Now create a new graphics context for the vertical axis. - svg = (Graphics2D) (g.create()); - - // Create the vertical scale. - if (scaleChanged) - { - int scaleLength = height - (insets.top + insets.bottom); - verticalScale = AScale.calculateScale(minVert, maxVert, scaleLength, 3, 7, AScale.LEFT_TICKS, - VERTICAL, p); - } - - svg.translate(insets.left - 2, height - insets.bottom); - svg.rotate(-Math.PI / 2.); - - svg.setColor(foregroundColour); - svg.setFont(new Font("SansSerif", Font.BOLD, 12)); - - // Draw the primary and secondary tick marks. - svg.setStroke(thickStroke); - svg.draw(verticalScale.primaryTicks); - svg.setStroke(thinStroke); - svg.draw(verticalScale.secondaryTicks); - - // Paint the tick labels. - int numLabelsV = verticalScale.labelValues.length; - for (int i = 0; i < numLabelsV; i++) - { - double valueScaled = verticalScale.labelValues[i] * factorV; - int nDecPlaces = getNumDecimalPlaces(valueScaled); - String label = String.format("%."+nDecPlaces+"f", valueScaled); - if(p instanceof AProjectionTrackResidual && parameterStore.get("TrackResidual", "Scale").getI() == 1) - { - if(!label.equals("0")) - { - long tmp = Math.round(((AProjectionTrackResidual)p).getResidual().getLogMagnitudeMin() + Math.abs(Double.parseDouble(label))); - if(label.indexOf("-") == -1) //positive - label = "1E" + tmp; - else - label = "-1E" + tmp; - } - } - drawString(svg, label, (float) verticalScale.labelPositions[i], -(AScale.getPrimaryTickSize() + 0.2f * fontSize), TEXT_CENTER, TEXT_BOTTOM, height - insets.top - insets.bottom); - } - - // Paint the axis label. - float axisPositionY = (float) verticalScale.getTitlePosition(); - drawString(svg, axisLabels[VERTICAL] + " " + unitsV, axisPositionY, -(AScale.getPrimaryTickSize() + 0.2f * fontSize), TEXT_CENTER, TEXT_BOTTOM, height - insets.top - insets.bottom); - - // End this context. - svg.dispose(); - - } - - /** - * Calculate number of decimal places needed in formatting number. - * @param x number to format - * @return number of decimal places needed - */ - static int getNumDecimalPlaces(double x) { - int m = - (int) Math.floor(Math.log10(Math.abs(x))); - return Math.max(0, m); - } - - /** - * Draw the grid for the V-Plot - **/ - private void paintGrid(Graphics2D g, AProjection p, int width, int height){ - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - - // next part draws the grid for the V-plot - if (p.getName().equals("VP")) - { - //Set color for grid lines - svg.setColor(Color.LIGHT_GRAY); - - // eta grid projections values - these particular values - // will be useful for calo people to see the eta grid lines at - float[] etaGridPositions = { -4.9f, -3.2f, -2.5f, -1.375f, -0.8f, - 0.8f, 1.375f, 2.5f, 3.2f, 4.9f }; - - for(int i = 0; i < etaGridPositions.length; i++) - { - if (etaGridPositions[i] > minHoriz && etaGridPositions[i] < maxHoriz) { - Point2D.Double startp = aWindow.calculateDisplay(etaGridPositions[i],minVert); - Point2D.Double endp = aWindow.calculateDisplay(etaGridPositions[i],maxVert); - svg.drawLine((int)startp.x,(int)startp.y,(int)endp.x,(int)endp.y); - } - } - - for (int i = (int)Math.ceil(minVert/90.)*90; i <= maxVert; i += 90) - { - Point2D.Double startp = aWindow.calculateDisplay(minHoriz,i); - Point2D.Double endp = aWindow.calculateDisplay(maxHoriz,i); - if (Math.abs(i) % 360 == 0) { - svg.setColor(Color.WHITE); - svg.setStroke(thickStroke); - } else { - svg.setColor(Color.LIGHT_GRAY); - svg.setStroke(thinStroke); - } - svg.drawLine((int)startp.x,(int)startp.y,(int)endp.x,(int)endp.y); - } - } - - svg.dispose(); - - } - - /** - * This bit of the frame that is drawn when printing (appart from scales) - */ - private void printBorderFrame(Graphics2D g, Color bg, int width, int height){ - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - - svg.setColor(bg); - //simply draw rectangles all around window - svg.fillRect(0, 0, width, insets.top); - // Added -insets.bottom because sometimes this stuff is transparent -Adam - svg.fillRect(0, 0, insets.left, height - insets.bottom); - svg.fillRect(width - insets.right, 0, insets.right, height); - svg.fillRect(0, height - insets.bottom, width, insets.bottom); - - svg.dispose(); - } - - /** - * Paint the Frame of the border with the given colors - */ - private void paintBorderFrame(Graphics2D g, Color bg, int width, int height){ - //Draw the frame same as for printing - printBorderFrame(g,bg,width,height); - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - - // Add a bit of GUI-look-and-feel frame - if (selected){ - //white triangle bottom left corner - clears any background colour - svg.setColor(AWindow.BORDER_SELECTED_FRAMELIGHT_COLOR); - int xp[]={0,0,11,0}; - int yp[]={height-12,height,height,height-12}; - svg.fillPolygon(xp,yp,4); - //blue border around window - svg.setColor(AWindow.BORDER_SELECTED_FRAME_COLOR); - svg.drawLine(0, 0, width-1, 0); - svg.drawLine(0, 0, 0, height-10); - svg.drawLine(width-1, 0, width-1, height-1); - svg.drawLine(10, height-1, width-1, height-1); - svg.drawLine(0, height-10, 9, height-1); - //white inner border - svg.setColor(AWindow.BORDER_SELECTED_FRAMELIGHT_COLOR); - svg.drawLine(10, height-2, width-2, height-2); - svg.drawLine(1, 1, 1, height-10); - //grey triangle bottom left corner - svg.setColor(AWindow.BORDER_BACKGROUND_COLOR); - xp[2]=8; - yp[0]=height-9; - yp[3]=height-9; - svg.fillPolygon(xp,yp,4); - } - - svg.dispose(); - } - - /** - * Paint a small box at the top of each window to describe what is on the window - */ - private void paintWindowTitle(Graphics g, int width, int height, boolean highlight) - { - APar parameterStore = APar.instance(); - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - //Get Mode parameter - String s=aWindow.getProjection().getName(); - parameterStore.selectWindowParameters(aWindow.getName()); - AParameter param=parameterStore.get(s, "Mode"); - int mode=param.getI(); - s=aWindow.getProjection().getScreenName(); - s+=" Projection"; - //Add mode text if not on standard view - if (param != null) - { - if(mode != 0) - { - s+=" viewing: "; - if(param instanceof ALinkParameter){ - s+=((ALinkParameter) param).getCurrentText(); - }else{ - s+=((AEnumeratorParameter) param).getCurrentText(); - } - } - } - parameterStore.restoreWindowParameters(); - //Offset if indicator to window frame - int Offset=2; - - int boxsize,y; - // get the width of the text - boxsize = svg.getFontMetrics().stringWidth(s)+Offset*2; - //Get y position from offset - y = Offset+svg.getFontMetrics().getHeight(); - - //Get the x position from width of window - int x = insets.left + (int) Math.round(((width-insets.left-boxsize)/2.0)); - //Draw background box and set text color - //highlighting the active window if desired - if(selected&&highlight) - { - //If selected and not printing eps - //add a bit of GUI-look-and-feel frame - svg.setColor(AWindow.BORDER_SELECTED_BACKGROUND_COLOR); - svg.fillRect(x-2, 1, boxsize+4, y+1); - svg.setColor(AWindow.BORDER_SELECTED_FRAME_COLOR); - svg.fillRect(x-1, 0, boxsize+2, y+1); - svg.setColor(AWindow.BORDER_SELECTED_FRAMELIGHT_COLOR); - svg.fillRect(x, 1, boxsize, y-1); - svg.setColor(AWindow.BORDER_SELECTED_BACKGROUND_COLOR); - svg.fillRect(x+1, 1, boxsize-1, y-2); - svg.setColor(AWindow.BORDER_SELECTED_FOREGROUND_COLOR); - } - else - { - //If not selected draw background box - svg.setColor(AWindow.BORDER_BACKGROUND_COLOR); - svg.fillRect(x-2, 0, boxsize+4, y+2); - svg.setColor(AWindow.BORDER_FOREGROUND_COLOR); - } - //Draw text - svg.drawString(s, x+Offset, y-3); - //cleanup - svg.dispose(); - } - - /** - * Paint a small FishEye Indicator if FishEye projection is active. - * At the moment, the indicator is drawn in the top right corner of the canvas. - * One might as well put it in on the scale. Eventually, if the scales shows - * proper fisheyed coordinates, it might not be needed anymore at all. - */ - private void paintFishEyeIndicator(Graphics g, boolean forceText, int width, int height){ - APar parameterStore = APar.instance(); - - //Probe for fishEye status - boolean fishEyeStatus=false; - - //Check if FishEye is on for this particular window - parameterStore.selectWindowParameters(aWindow.getName()); - - //Get FishEye parameter - AParameter fishEyePar = parameterStore.get(aWindow.getProjection().getName(), "FishEye"); - - //Check if there is a fish-eye parameter for this projection, and get status (enabled or not) - if (fishEyePar != null) fishEyeStatus=fishEyePar.getStatus(); - - //Restore to active window - parameterStore.restoreWindowParameters(); - - // Now draw indicator if fisheye was on - if (fishEyeStatus){ - - // Make our own graphics contex, so we don't cause trouble elsewhere - Graphics2D svg = (Graphics2D) g.create(); - //Offset if indicator to window frame - int Offset=4; - //Check if we have custom cursors - only then use indicator image - if (!forceText ){ - //FishEye indicator image is provided by ACursorFactory as it is the same - //as the cursor used in FishEye transformation. - Image IndicatorImg = ACursorFactory.getInstance().getFishEyeIndicator(); - //Get the x position from width of window and width of image - int x = width-Offset-IndicatorImg.getWidth(null); - //Get y position from offset - int y = Offset; - //Draw an fisheye indicator in top right corner with some space - svg.drawImage(IndicatorImg,x,y,null); - } else { - int x,y; - //Get the x position from width of window and width of image - x = width-Offset-svg.getFontMetrics().stringWidth("FishEye"); - //Get y position from offset - y = Offset+svg.getFontMetrics().getHeight(); - //Set color to red - svg.setColor(Color.red); - //Use small label to indicate fisheye - svg.drawString("FishEye",x,y); - - } - //cleanup - svg.dispose(); - } - } - - /** - * Recalculate the insets based on the current font size. - */ - private void resetInsets() - { - int lb = (int) (2 + 2 + AScale.getPrimaryTickSize() + 1.5 * fontSize); - // int tr = (int) (2+2+AScale.getPrimaryTickSize()); - int tr = 2; - - if (drawScaleBorder) - insets = new Insets(tr, lb, lb, tr); - else - insets = new Insets(tr, tr, tr, tr); - } - - /** - * Set the scale labels taking into account the given linear transformation. - */ - public void setScales(String horizLabel, String vertLabel, String horizUnits, String vertUnits, AffineTransform transform, int panelWidth, int panelHeight) - { - - // Determine the type of the tranform. - int type = classifyTransform(transform); - - switch (type) - { - case TYPE_PARALLEL_TRANSFORM: - setAxisLabels(horizLabel, vertLabel); - setAxisUnits(horizUnits, vertUnits); - break; - - case TYPE_SWITCHED_TRANSFORM: - setAxisLabels(vertLabel, horizLabel); - setAxisUnits(vertUnits, horizUnits); - break; - - case TYPE_Y_SKEW_TRANSFORM: - setAxisLabels(horizLabel + AMath.PRIME, AMath.DELTA + vertLabel); - if (horizUnits.equals(vertUnits)) - { - setAxisUnits(horizUnits, vertUnits); - } - else - { - setAxisUnits(horizUnits + AMath.DOT + vertUnits, vertUnits); - } - break; - - case TYPE_X_SKEW_TRANSFORM: - setAxisLabels(AMath.DELTA + horizLabel, vertLabel + AMath.PRIME); - if (vertUnits.equals(horizUnits)) - { - setAxisUnits(horizUnits, vertUnits); - } - else - { - setAxisUnits(horizUnits, vertUnits + AMath.DOT + horizUnits); - } - break; - - case TYPE_SWITCHED_Y_SKEW_TRANSFORM: - setAxisLabels(vertLabel + AMath.PRIME, AMath.DELTA + horizLabel); - if (vertUnits.equals(horizUnits)) - { - setAxisUnits(vertUnits, horizUnits); - } - else - { - setAxisUnits(vertUnits + AMath.DOT + horizUnits, horizUnits); - } - break; - - case TYPE_SWITCHED_X_SKEW_TRANSFORM: - setAxisLabels(AMath.DELTA + vertLabel, horizLabel + AMath.PRIME); - if (horizUnits.equals(vertUnits)) - { - setAxisUnits(vertUnits, horizUnits); - } - else - { - setAxisUnits(vertUnits, horizUnits + AMath.DOT + vertUnits); - } - break; - - default: - setAxisLabels(horizLabel + AMath.PRIME, vertLabel + AMath.PRIME); - if (horizUnits.equals(vertUnits)) - { - setAxisUnits(horizUnits, vertUnits); - } - else - { - setAxisUnits(horizUnits + AMath.DOT + vertUnits, vertUnits + AMath.DOT + horizUnits); - } - break; - } - - // Get the size of the scales. - axisPts[0] = 0.; - axisPts[1] = panelHeight; - axisPts[2] = 0.; - axisPts[3] = panelHeight; - axisPts[4] = panelWidth; - axisPts[5] = 0.; - try - { - // Avoid using the following call because of a bug in - // AffineTransform. Instead create the inverse matrix - // explicitly as done below. - // transform.inverseTransform(physicsPt,0,physicsPt,0,3); - AffineTransform ixform = transform.createInverse(); - - ixform.transform(axisPts, 0, axisPts, 0, 1); - ixform.deltaTransform(axisPts, 2, axisPts, 2, 2); - - // Calculate the values for the vertical axis and the distance. - double vdy = axisPts[3]; - double vdx = axisPts[2]; - double vdist = Math.sqrt(vdx * vdx + vdy * vdy); - - // Calculate the values for the horizontal axis and the distance. - double hdy = axisPts[5]; - double hdx = axisPts[4]; - double hdist = Math.sqrt(hdx * hdx + hdy * hdy); - - // Initialize the endpoints of the axes. - double vmin = 0.; - double vmax = 0.; - double hmin = 0.; - double hmax = 0.; - - // Do what is necessary for the different types of transformations. - switch (type) - { - case (TYPE_PARALLEL_TRANSFORM): - { - double vsign = (vdy < 0.) ? 1. : -1.; - - vmin = axisPts[1]; - vmax = axisPts[1] + vsign * vdist; - - double hsign = (hdx > 0.) ? 1. : -1.; - - hmin = axisPts[0]; - hmax = axisPts[0] + hsign * hdist; - break; - } - - case (TYPE_SWITCHED_TRANSFORM): - { - double hsign = (hdy > 0.) ? 1. : -1.; - - hmin = axisPts[1]; - hmax = axisPts[1] + hsign * hdist; - - double vsign = (vdx < 0.) ? 1. : -1.; - - vmin = axisPts[0]; - vmax = axisPts[0] + vsign * vdist; - break; - } - - case (TYPE_Y_SKEW_TRANSFORM): - { - double vsign = (vdy > 0.) ? 1. : -1.; - - vmax = -vsign * vdist / 2.; - vmin = -vmax; - - hmin = 0.; - hmax = hdist; - break; - } - - case (TYPE_X_SKEW_TRANSFORM): - { - double hsign = (hdx > 0.) ? 1. : -1.; - - hmax = hsign * hdist / 2.; - hmin = -hmax; - - vmin = 0.; - vmax = vdist; - break; - } - - case (TYPE_SWITCHED_Y_SKEW_TRANSFORM): - { - double vsign = (vdx > 0.) ? 1. : -1.; - - vmax = -vsign * vdist / 2.; - vmin = -vmax; - - hmin = 0.; - hmax = hdist; - break; - } - - case (TYPE_SWITCHED_X_SKEW_TRANSFORM): - { - double hsign = (hdy > 0.) ? 1. : -1.; - - hmax = hsign * hdist / 2.; - hmin = -hmax; - - vmin = 0.; - vmax = vdist; - break; - } - - default: - { - vmin = 0.; - vmax = 0.; - hmin = 0.; - hmax = 0.; - break; - } - } - - // Actually set the limits. - setLimits(hmin, hmax, vmin, vmax); - } - catch (NoninvertibleTransformException e) - { - setLimits(0., 0., 0., 0.); - } - } - - /** - * This is a protected utility method which classifies the given transform - * into seven categories: parallel, switched, x-skew, y-skew, switched - * x-skew, switched y-skew, and general. The parallel category describes - * transformations in which the transformed x and y axes are parallel or - * antiparallel to the original x and y axes, respectively. The switched - * category describes transformations in which the transformed x and y axes - * are parallel or antiparallel to the original y and x axes, respectively. - * That is, the x and y axes have been switched. The x-skew describes - * transformations in which the transformed x-axis is parallel (or - * antiparallel) to the original one while the transformed y-axis forms some - * non-zero angle to the original one. The y-skew is similar; the switch - * skews are just rotated (counter)clockwise by 90 degrees. The general - * category encompasses all transforms not falling into one of the other - * categories. - */ - static protected int classifyTransform(AffineTransform xform) - { - // Set the default return type to a general matrix. - int category = TYPE_GENERAL_TRANSFORM; - - // Get the four non-translation quantities from the transformation. - double sx = xform.getScaleX(); - double sy = xform.getScaleY(); - double kx = xform.getShearX(); - double ky = xform.getShearY(); - - // Check the type. - if (kx == 0. && ky == 0.) - { - category = TYPE_PARALLEL_TRANSFORM; - } - else if (sx == 0. && sy == 0.) - { - category = TYPE_SWITCHED_TRANSFORM; - } - else if (kx == 0.) - { - category = TYPE_Y_SKEW_TRANSFORM; - } - else if (ky == 0.) - { - category = TYPE_X_SKEW_TRANSFORM; - } - else if (sx == 0.) - { - category = TYPE_SWITCHED_Y_SKEW_TRANSFORM; - } - else if (sy == 0.) - { - category = TYPE_SWITCHED_X_SKEW_TRANSFORM; - } - - // Return the transformtion type. - return category; - } - - /** - * A utility which makes an AffineTransform given three corner - * points. The first point must be the upper, left-hand corner - * point, the second, the upper, right-hand corner point, and the - * third, the lower, right-hand corner point. - * - * @return AffineTransform which does the appropriate mapping */ - protected AffineTransform makeTransform(Point2D.Double[] corners) - { - double x0 = corners[0].x; - double y0 = corners[0].y; - double x1 = corners[1].x; - double y1 = corners[1].y; - double x2 = corners[2].x; - double y2 = corners[2].y; - - double sx = 0.; - double kx = 0.; - double tx = 0.; - double sy = 0.; - double ky = 0.; - double ty = 0.; - - double delta = (x2 * (y1 - y0) - x1 * (y2 - y0) + x0 * (y2 - y1)); - - if (delta == 0) - { - // cannot successfully create an AffineTransform - System.err.println("Fatal Error: AffineTransform creating failed."); - System.err.println("Possible cause: wrong user corner values are set."); - System.exit(1); - return null; - } - else - { - delta = 1. / delta; - - double w = aWindow.getWidth(); - double h = aWindow.getHeight(); - - sx = -(delta * w) * (y2 - y1); - kx = (delta * w) * (x2 - x1); - tx = -(x0 * sx + y0 * kx); - - ky = (delta * h) * (y1 - y0); - sy = -(delta * h) * (x1 - x0); - ty = -(x0 * ky + y0 * sy); - - return new AffineTransform(sx, ky, kx, sy, tx, ty); - } - - } - - public void drawString(Graphics2D g, String str, double x, double y, int horizontal, int vertical, int maxSize) - { - drawString(g, str, x, y, horizontal, vertical, false, null, 0, false, null, maxSize); - } - - private void drawString(Graphics2D g, String str, double x, double y, int horizontal, int vertical, boolean framed, Color frameColor, double frameWidth, boolean banner, Color bannerColor, int maxSize) - { - Font sf = g.getFont(); - int width = sf.getSize(); - int descent = 0; - int height = sf.getSize(); - int adjustment = 0; - - // The metrics stuff did not work, so I made a work around and now - // even ps-printing works (CT 27/7/2004) - double xx = Math.min(x, maxSize - width / 2); - Rectangle textSize = new Rectangle(0, descent - height, width, height); - Point2D textUL = drawFrameAndBanner(xx, y, textSize, adjustment, framed, frameColor, frameWidth, banner, bannerColor, horizontal, vertical); - - if (g instanceof AAbstractGraphics2D) { - // No antialiasing support needed for EPS output. - g.drawString(str, (int) textUL.getX(), (int) textUL.getY()); - } else { - // For pixel graphics, switch on antialiasing for text. - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.drawString(str, (int) textUL.getX(), (int) textUL.getY()); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - } - } - - /** Draws frame and banner around a string. The method calculates and returns - * the point to which the text curser should be set before drawing the string. */ - private Point2D drawFrameAndBanner(double x, double y, Rectangle textSize, int adjustment, boolean framed, Color frameColor, double frameWidth, boolean banner, Color bannerColor, int horizontal, int vertical) - { - double descent = textSize.y + textSize.height; - x = getXalignment(x, textSize.width, horizontal); - y = getYalignment(y, textSize.height, (int) descent, vertical); - return new Point2D.Double(x, y); - } - - private static double getYalignment(double y, int ascent, int descent, int alignment) - { - // vertical alignment - switch (alignment) - { - case TEXT_TOP: - y = y + ascent - descent; - break; - - case TEXT_CENTER: - y = y + ((ascent + descent) / 2) - descent; - break; - - case TEXT_BOTTOM: - y = y - descent; - break; - - case TEXT_BASELINE: - default: - break; - } - return y; - } - - private static double getXalignment(double x, int width, int alignment) - { - // horizontal alignment - switch (alignment) - { - case TEXT_CENTER: - x = x - (width / 2); - break; - - case TEXT_RIGHT: - x = x - width; - break; - - case TEXT_LEFT: - default: - break; - } - return x; - } - - /** - * Encapsulates units and range for an axis. - * Used for m->cm->mm->um autoscaling. - */ - private static class ScaleUnits { - final String units; - final double scaleFactor; - - ScaleUnits(String units, double min, double max) { - double maxMod = Math.max(Math.abs(max), Math.abs(min)); - if (!units.equals("(cm)")) { - this.units = units; - this.scaleFactor = 1.0; - return; - } - else { - if (maxMod > 200.) - { - this.scaleFactor= 0.01; - this.units = "(m) "; - } - else if (maxMod > 2.) - { - this.scaleFactor = 1.0; - this.units = "(cm)"; - } - else if (maxMod > .2) - { - this.scaleFactor = 10.; - this.units = "(mm)"; - } - else - { - this.scaleFactor = 10000.; - this.units = "(" + AMath.MICRO + "m)"; - } - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/ATitleMenuBar.java b/graphics/AtlantisJava/src/atlantis/canvas/ATitleMenuBar.java deleted file mode 100755 index 85ad9daab256..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/ATitleMenuBar.java +++ /dev/null @@ -1,92 +0,0 @@ -package atlantis.canvas; - -import javax.swing.JLabel; -import javax.swing.JMenuBar; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.graphics.AGraphics; -import atlantis.parameters.APar; - - -public class ATitleMenuBar extends JMenuBar -{ - - public ATitleMenuBar() - { - // just to set the height of the title bar - - JLabel atlas = new JLabel(" Atlantis "); - atlas.setFont(new Font("Courier", Font.PLAIN, 25)); - add(atlas); - } - - @Override - public void paint(Graphics g) - { - AEventManager eventManager = AEventManager.instance(); - AEvent event = eventManager.getCurrentEvent(); - Font titleFont=new Font("Dialog", Font.BOLD, 15); - int availableSpace = (int) Math.floor(getWidth()-10); - FontMetrics fm = ACanvas.getCanvas().getFontMetrics(titleFont); - - AGraphics ag=AGraphics.makeAGraphics(g); - ag.setColor(AWindow.BORDER_BACKGROUND_COLOR); - ag.fillRect(0, 0, getWidth(), getHeight()); - ag.setColor(AWindow.BORDER_FOREGROUND_COLOR); - ag.updateColor(); - ag.setFont(titleFont); - availableSpace -= fm.stringWidth("ATLAS Atlantis"); - ag.drawString("ATLAS ", 5, getHeight()-10); - ag.drawString(" Atlantis", getWidth()-fm.stringWidth(" Atlantis")-5, getHeight()-10); - - String[] titleSections = new String[6]; - if(event != null) - { - titleSections[0] = !event.getDateTime().equals("n/a") ? event.getDateTime() : ""; - titleSections[1] = " source:" + event.getSourceName(); - int extension_dot = titleSections[1].toLowerCase().lastIndexOf("."); - if(extension_dot > 0) - titleSections[1] = titleSections[1].substring(0,extension_dot); - titleSections[2] = " run:" + event.getRunNumber(); - titleSections[3] = " ev:" + event.getEventNumber(); - titleSections[4] = " lumiBlock:" + event.getLumiBlock(); - titleSections[5] = " eventProperties: " + event.getEventProperties(); - } - else - { - titleSections[0]=""; - titleSections[1]=" event:n/a"; - titleSections[2]=" run:n/a"; - titleSections[3]=" ev:n/a"; - titleSections[4]=""; - titleSections[5]=""; - } - - - //for masterclass turn off some of the canvas title parts - APar parameterStore = APar.instance(); - if(parameterStore.get("Minerva","hiderun").getStatus()) - titleSections[2]=""; - if(parameterStore.get("Minerva","hideev").getStatus()) - titleSections[3]=""; - - - StringBuilder outputString = new StringBuilder(); - int titleSectionSize=0; - for(int i=0; i<6; i++) - { - if(titleSectionSize+fm.stringWidth(titleSections[i])<availableSpace) - { - if(!titleSections[i].endsWith("default")){ - titleSectionSize+=fm.stringWidth(titleSections[i]); - outputString.append(titleSections[i]); - } - } - } - ag.drawString(outputString.toString(), (getWidth()-titleSectionSize)/2, getHeight()-10); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AWindow.java b/graphics/AtlantisJava/src/atlantis/canvas/AWindow.java deleted file mode 100755 index 159623e227c7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AWindow.java +++ /dev/null @@ -1,1549 +0,0 @@ -package atlantis.canvas; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragSource; -import java.awt.dnd.DragSourceDragEvent; -import java.awt.dnd.DragSourceDropEvent; -import java.awt.dnd.DragSourceEvent; -import java.awt.dnd.DragSourceListener; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.awt.dnd.DropTargetListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.Point2D; -import java.awt.geom.Point2D.Double; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; - -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.Stack; -import java.util.Vector; - -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JSeparator; -import javax.swing.JToolTip; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.dnd.ACallBack; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.AObjectTransferable; -import atlantis.gui.AColorHelpDialog; -import atlantis.gui.AInteractionToolBar; -import atlantis.gui.APreferencesControl; -import atlantis.interactions.AInteraction; -import atlantis.interactions.AInteractionsManager; -import atlantis.interactions.ASelection; -import atlantis.interactions.ARectangleVPSelection; -import atlantis.interactions.ARectangleYXSelection; -import atlantis.interactions.AZMRInteraction; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionNPhysics; -import atlantis.projection.AProjectionTrackResidual; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.AMath; - -import atlantis.utils.ALogger; -import java.awt.BorderLayout; -import javax.swing.JComponent; - -/** - * The objects of this class are single windows managed by ACanvas - * This class manages the painting of each picture and is always - * called by the java awt event thread. Programatic requests for - * picture updates are handled by calls to repaintFromScratch() which - * adds requests to the awt event thread. - * It paints first into an off-screen buffer which is then copied - * onto the screen. - * It handles the linear transformation from user to display - * coordinates and vice-versa. Non-linear transformations are handled by - * by the projections. Windows have a scale (and scale border) which - * may be visible or not. Each window has an associated projection - * and an interactionManager which knows about the current interaction - * and the state of all other interactions for this window. - * - * @author taylorg - */ -public class AWindow extends JPanel implements DropTargetListener, - DragSourceListener, DragGestureListener, ACallBack -{ - - private static ALogger logger = ALogger.getLogger(AWindow.class); - private static AGlobals globals = AGlobals.instance(); - - //Whether horizontal or vertical scale is copied when window is dragged - private static enum dragActionType { COPY_VERTICAL_SCALE, COPY_HORIZONTAL_SCALE }; - - //these colors are used on the scale border and title bar - static final Color BORDER_FOREGROUND_COLOR = new Color(48,48,48); - static final Color BORDER_SELECTED_FOREGROUND_COLOR = new Color(48,48,48); - static final Color BORDER_SELECTED_FRAME_COLOR = new Color(99,130,191); - static final Color BORDER_SELECTED_FRAMELIGHT_COLOR = new Color(255,255,255); - // These ones must be public and cannot be final because AOpenGLControl messes with them. - public static Color BORDER_BACKGROUND_COLOR = new Color(224,224,224); - public static Color BORDER_SELECTED_BACKGROUND_COLOR = new Color(200,221,242); - private dragActionType dragAction; - private boolean canCopyScales = false; - private DragSource dragSource = null; - private Graphics2D backingGraphics = null; - private BufferedImage backingImage = null; - private Dimension backingDimension = new Dimension(); - - /** - * The border of the window holds a scale with units - **/ - private AScaleBorder scaleBorder; - - private boolean bufferValid = false; - private boolean borderValid = false; - private Insets insets = new Insets(0, 0, 0, 0); - private double m00, m01, m02, m10, m11, m12, n00, n01, n02, n10, n11, n12; - private AInteractionsManager interactionsManager; - private Hashtable<String, Double[]> corners; - private Point2D.Double[] userCorners; - private Point2D.Double[] defaultCorners; - private AProjection projection; - private String group; - private String defaultGroup; - private String defaultProjectionName; - private int index; - boolean finalized; - private Stack<Point2D.Double[]> cornersHistory = new Stack<Point2D.Double[]>(); - private AProjection projectionHistory = null; - private Stack<Integer> zoomSummed = new Stack<Integer>(); - private Stack<Integer> zoomLayers = new Stack<Integer>(); - private Stack<Integer> zoomCalo = new Stack<Integer>(); - private Stack<Integer> zoomCaloLAr = new Stack<Integer>(); - private Stack<Integer> modeHistory = new Stack<Integer>(); - private Stack<Integer> cutHistoryLAr = new Stack<Integer>(); - private Stack<Integer> cutHistoryHEC = new Stack<Integer>(); - private Stack<Integer> layoutHistory = new Stack<Integer>(); - private boolean locked; - private static JPopupMenu popupMenu; - private final static String LOCK = "Freeze"; - private final static String UNLOCK = "Unfreeze"; - private final static String HORIZONTAL_FLIP = "Horizontal Flip"; - private final static String VERTICAL_FLIP = "Vertical Flip"; - private final static String ROTATE_BY_90_CLOCKWISE = "Rotate by 90"; - private final static String ROTATE_BY_90_ANTICLOCKWISE = "Rotate by -90"; - private final static String TOGGLE_SCALE = "Toggle Scale"; - private final static String RESTORE_DEFAULTS = "Restore Initial Size"; - - private JComponent m_view = null; - - static - { - popupMenu = new JPopupMenu(); - ActionListener actionListener = new PopupMenuActionListener(); - popupMenu.add(HORIZONTAL_FLIP).addActionListener(actionListener); - popupMenu.add(VERTICAL_FLIP).addActionListener(actionListener); - popupMenu.add(new JSeparator()); - popupMenu.add(ROTATE_BY_90_CLOCKWISE).addActionListener(actionListener); - popupMenu.add(ROTATE_BY_90_ANTICLOCKWISE).addActionListener( - actionListener); - popupMenu.add(new JSeparator()); - popupMenu.add(TOGGLE_SCALE).addActionListener(actionListener); - popupMenu.add(RESTORE_DEFAULTS).addActionListener(actionListener); - popupMenu.add(LOCK).addActionListener(actionListener); - popupMenu.add(UNLOCK).addActionListener(actionListener); - } - - - private static class PopupMenuActionListener - implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - AWindow window = ACanvas.getCanvas().getCurrentWindow(); - if(action.equals(LOCK)) - { - window.setLocked(true); - } - else if(action.equals(UNLOCK)) - { - window.setLocked(false); - } - else if(action.equals(TOGGLE_SCALE)) - { - window.toggleScale(); - } - // temporary fix to avoid crashes - if(window.getProjection() instanceof AProjection2D) - { - if(action.equals(RESTORE_DEFAULTS)) - { - window.unzoomFull(); - } - else if(action.equals(HORIZONTAL_FLIP)) - { - AZMRInteraction.performFlip(AZMRInteraction. - getMiddleVerticalLine(window), - window); - } - else if(action.equals(VERTICAL_FLIP)) - { - AZMRInteraction.performFlip(AZMRInteraction. - getMiddleHorizontalLine(window), - window); - } - else if(action.equals(ROTATE_BY_90_CLOCKWISE)) - { - AZMRInteraction.performPlus90Rotation(window); - } - else if(action.equals(ROTATE_BY_90_ANTICLOCKWISE)) - { - AZMRInteraction.performMinus90Rotation(window); - } - } - } - } - - /** - * Construct AWindow using information in XML configuration file. - * - * @param node the XML configuration node for this window - * @param index identifier for the window - * @return the constructed window - */ - static AWindow createFromXMLConfigNode(Node node, int index) { - NamedNodeMap attributes = node.getAttributes(); - String name = attributes.getNamedItem("name").getNodeValue(); - String defaultProjectionName = attributes.getNamedItem("projection"). - getNodeValue(); - String defaultGroup = attributes.getNamedItem("group").getNodeValue(); - return new AWindow(name,defaultProjectionName,defaultGroup,index); - } - - /** - * Construct AWindow with given name, default projection and group name. - * Only non-private in order to allow test code to create an AWindow instance. - * - * @param name title of window - * @param defaultProjection name of default projection - * @param defaultGroup name of group - * @param index identifier for window - */ - AWindow(String name, String defaultProjection, String defaultGroup, int index) - { - super(new BorderLayout()); - setName(name); - this.defaultProjectionName = defaultProjection; - this.defaultGroup = defaultGroup; - setOpaque(false); - if (!globals.getUseOpenGL()) { - m_view = new AWindowSwingView(this); - } else { - m_view = new AWindowGLView(this); - } - this.index = index; - scaleBorder = new AScaleBorder(this); - scaleBorder.setLabelFont(new Font("Dialog", Font.PLAIN, 12)); - m_view.setBorder(scaleBorder); - add(m_view, BorderLayout.CENTER); - finalized = false; - - if (!AGlobals.isAtlantisHeadless()) { - dragSource = new DragSource(); - dragSource.createDefaultDragGestureRecognizer(this, - DnDConstants.ACTION_MOVE, this); - - this.setDropTarget(new DropTarget(this, this)); - } - } - - /** - * Perform the steps that have to follow the ACanvas initialization. - * Despite its name, this method is called from ACanvas.setCurrentLayout() - * so may be called multiple times on the same window. - */ - void finalizeConstruction() - { - setInteractionManager(new AInteractionsManager(this)); - corners = new Hashtable<String, Double[]>(); - String[] pName = AProjectionsManager.getKnownProjectionNames(); - Point2D.Double[] pCorners; - ALayout l = ACanvas.getCanvas().getCurrentLayout(); - Dimension size = l.getWindowConstraints(getName()).getSize(); - for(int i = 0; i < pName.length; i++) - { - AProjection proj = AProjectionsManager.getProjection(pName[i]); - if(proj instanceof AProjection2D) - { - pCorners = ((AProjection2D) proj).calculateNoZoomCorners(size); - corners.put(pName[i], pCorners); - } - } - AProjection defaultProjection = AProjectionsManager.getProjection( - defaultProjectionName); - setGroup(defaultGroup); - setProjection(defaultProjection); - - if (!AGlobals.isAtlantisHeadless()) { - interactionsManager.setContext(getInteractionToolBar().getSelectedGroup()); - } - - finalized = true; - } - - - void restoreDefaults() - { - if(finalized) - { - corners = new Hashtable<String, Double[]>(); - String[] pName = AProjectionsManager.getKnownProjectionNames(); - Point2D.Double[] pCorners; - ALayout l = ACanvas.getCanvas().getCurrentLayout(); - Rectangle r = l.getWindowConstraints(getName()); - Dimension size = new Dimension(1, 1); - if(r != null) - size = r.getSize(); - for(int i = 0; i < pName.length; i++) - { - AProjection proj = AProjectionsManager.getProjection(pName[i]); - if(proj instanceof AProjection2D) - { - if(pName[i].equals(defaultProjectionName) && defaultCorners != null) - pCorners = getDefaultCorners(); - else - pCorners = ((AProjection2D) proj).calculateNoZoomCorners(size); - corners.put(pName[i], pCorners); - } - } - AProjection defaultProjection = AProjectionsManager.getProjection( - defaultProjectionName); - setGroup(defaultGroup); - projection = null; - setProjection(defaultProjection); - getInteractionManager().forgetContext(); - AInteractionToolBar itb = getInteractionToolBar(); - if (itb != null) { - itb.setDefaultGroup(); - interactionsManager.setContext(itb.getSelectedGroup()); - } - setScaleStatus(true); - } - } - - - public boolean isCurrent() - { - return ACanvas.getCanvas().getCurrentWindowName().equals(getName()); - } - - - public static JPopupMenu getPopupMenu() - { - return popupMenu; - } - - - public int getIndex() - { - return index; - } - - - public String getGroupName() - { - return group; - } - - - public void setGroup(String group) - { - this.group = group; - this.fireGroupChange(); - } - - - public synchronized AProjection getProjection() - { - return projection; - } - - - public AInteractionToolBar getInteractionToolBar() - { - return AInteractionToolBar.getInteractionToolBar(getName(), - projection.getName()); - } - - - public synchronized void setProjection(AProjection newProjection) - { - if((projection == null) || (!newProjection.equals(projection)) - || (newProjection instanceof AProjectionTrackResidual) - || (newProjection instanceof AProjectionNPhysics)) - { - if(projection != null && projection instanceof AProjection2D) - corners.put(projection.getName(), userCorners); - this.projection = newProjection; - if(projection instanceof AProjection2D) - userCorners = (Point2D.Double[]) corners.get(projection.getName()); - //check to see if the scales need hiding or not - this.scaleBorder.hideScale(); - this.repaintFromScratch(); - this.fireProjectionChange(); - } - } - - - private Point2D.Double[] clonedCopy(Point2D.Double[] corners) - { - if(corners == null)return null; - Point2D.Double[] newCorners = new Point2D.Double[corners.length]; - for(int i = 0; i < corners.length; i++) - newCorners[i] = new Point2D.Double(corners[i].x, corners[i].y); - return newCorners; - } - - - public synchronized void setUserCorners(Point2D.Double[] corners) - { - if(projection != null) - { - Point2D.Double[] validCorners = null; - try - { - validCorners = ((AProjection2D) projection).validateCorners( - clonedCopy(corners)); - } - catch(ClassCastException e) - { - logger.error("Not a 2D projection..."); - validCorners = corners; - } - if(validCorners != null) - { - this.userCorners = validCorners; - if(ACanvas.getCanvas().customisedCorner) - { - this.defaultCorners = validCorners; - } - repaintFromScratch(); - } - } - } - - - public boolean getUnzoomPossible() - { - if(zoomSummed.size()>0 && ((Integer) zoomSummed.peek()).intValue()==cornersHistory.size()) - return false; - else if(zoomLayers.size()>0 && ((Integer) zoomLayers.peek()).intValue()==cornersHistory.size()) - return false; - else if(zoomCalo.size()>0 && ((Integer) zoomCalo.peek()).intValue()==cornersHistory.size()) - return false; - else if(zoomCaloLAr.size()>0 && ((Integer) zoomCaloLAr.peek()).intValue()==cornersHistory.size()) - return false; - else - return projection == projectionHistory && cornersHistory.size() > 0; - } - - public boolean getUnzoomFullPossible() - { - return projection == projectionHistory && cornersHistory.size() > 0; - } - - - public boolean getUnzoomAllPossible(String typeOfZoom) - { - if(cornersHistory.size()<=0) - return false; - else if(ARectangleVPSelection.ZOOM_LAR.equals(typeOfZoom) || - ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - int indexOfZoomCalo=-1; - if(zoomCalo.size()>0) - indexOfZoomCalo=((Integer) zoomCalo.peek()).intValue(); - int indexOfZoomCaloLAr=-1; - if(zoomCaloLAr.size()>0) - indexOfZoomCaloLAr=((Integer) zoomCaloLAr.peek()).intValue(); - //make sure summed/layers is last in list - if(ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom) && - indexOfZoomCalo > indexOfZoomCaloLAr) - { - return true; - } - else if(typeOfZoom.equals(ARectangleVPSelection.ZOOM_LAR) && - indexOfZoomCaloLAr > indexOfZoomCalo) - { - return true; - } - else - return false; - } - else - { - int indexOfZoomSummed=-1; - if(zoomSummed.size()>0) - indexOfZoomSummed=((Integer) zoomSummed.peek()).intValue(); - int indexOfZoomLayers=-1; - if(zoomLayers.size()>0) - indexOfZoomLayers=((Integer) zoomLayers.peek()).intValue(); - //make sure summed/layers is last in list - if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_SUMMED) && indexOfZoomSummed>indexOfZoomLayers) - { - return true; - } - else if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_LAYERS) && indexOfZoomLayers>indexOfZoomSummed) - { - return true; - } - else - return false; - } - } - - - public void unzoom(String typeOfZoom) - { - //do unzoom of which item is selected - int numberOfWindows=0,indexOfZoom; - if(typeOfZoom.equals(ARectangleVPSelection.ZOOM_LAR) || - typeOfZoom.equals(ARectangleYXSelection.ZOOM_SUMMED)) - { - numberOfWindows=4; - } - else if(ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom) || - typeOfZoom.equals(ARectangleYXSelection.ZOOM_LAYERS)) - { - numberOfWindows=8; - } - int numberOfUnlayouts=0; - for (int i = 0; i < numberOfWindows; i++) - { - String wName = Integer.toString(i+1); - AWindow w = ACanvas.getCanvas().getWindow(wName); - //find if can do unzoom and what index it is - indexOfZoom=findUnzoomIndex(typeOfZoom, w); - if(indexOfZoom>0) - { - //do all unzooms upto and including index of this zoom to unzoom - while(w.cornersHistory.size()>=indexOfZoom) - w.unzoom(); - //also need to reset parameters - setParameters(typeOfZoom, w, wName); - //find out how many unlayouts to do - int count=0; - while(w.layoutHistory.size()>0 && ((Integer)w.layoutHistory.peek()).intValue()>=indexOfZoom) - { - w.layoutHistory.pop(); - count++; - } - if(count>numberOfUnlayouts) - numberOfUnlayouts=count; - } - } - //do as many unlayouts as needed - for(int i=0; i<numberOfUnlayouts; i++) - ACanvas.getCanvas().unlayout(); - } - - - private int findUnzoomIndex(String typeOfZoom, AWindow w) - { - int indexOfZoom=0;//if returns 0 then no unzoom is to be performed - if(ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - if(w.zoomCalo.size()==0) - indexOfZoom=0; - else - { - indexOfZoom=((Integer) w.zoomCalo.pop()).intValue(); - //check if other zooms done on this window - while(w.zoomCaloLAr.size()>0 && ((Integer) w.zoomCaloLAr.peek()).intValue()>indexOfZoom) - { - w.zoomCaloLAr.pop(); - w.modeHistory.pop(); - } - } - } - else if(typeOfZoom.equals(ARectangleVPSelection.ZOOM_LAR)) - { - if(w.zoomCaloLAr.size()==0) - indexOfZoom=0; - else - { - indexOfZoom=((Integer) w.zoomCaloLAr.pop()).intValue(); - while(w.zoomCalo.size()>0 && ((Integer) w.zoomCalo.peek()).intValue()>indexOfZoom) - { - w.zoomCalo.pop(); - w.modeHistory.pop(); - } - } - } - if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_SUMMED)) - { - if(w.zoomSummed.size()==0) - indexOfZoom=0; - else - { - indexOfZoom=((Integer) w.zoomSummed.pop()).intValue(); - //check if other zooms done on this window - while(w.zoomLayers.size()>0 && ((Integer) w.zoomLayers.peek()).intValue()>indexOfZoom) - { - w.zoomLayers.pop(); - w.modeHistory.pop(); - w.cutHistoryHEC.pop(); - w.cutHistoryLAr.pop(); - } - } - } - else if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_LAYERS)) - { - if(w.zoomLayers.size()==0) - indexOfZoom=0; - else - { - indexOfZoom=((Integer) w.zoomLayers.pop()).intValue(); - while(w.zoomSummed.size()>0 && ((Integer) w.zoomSummed.peek()).intValue()>indexOfZoom) - { - w.zoomSummed.pop(); - w.modeHistory.pop(); - w.cutHistoryHEC.pop(); - w.cutHistoryLAr.pop(); - } - } - } - return indexOfZoom; - } - - - private void setParameters(String typeOfZoom, AWindow w, String wName) - { - APar parameterStore = APar.instance(); - parameterStore.selectWindowParameters(wName); - if(ARectangleVPSelection.ZOOM_LAR.equals(typeOfZoom) || - ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - parameterStore.get("VP", "Mode").setI( w.modeHistory.pop() ); - } - else - { - parameterStore.get("YX", "Mode").setI( w.modeHistory.pop() ); - parameterStore.get("CutsCalo","HEC").setI( w.cutHistoryHEC.pop() ); - parameterStore.get("CutsCalo","LAr").setI( w.cutHistoryLAr.pop() ); - } - parameterStore.restoreWindowParameters(); - } - - - public void saveParameters(String typeOfZoom) - { - APar parameterStore = APar.instance(); - //save window parameters of current windows - if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_SUMMED) || typeOfZoom.equals(ARectangleYXSelection.ZOOM_LAYERS)) - { - parameterStore.selectWindowParameters(this.getName()); - this.modeHistory.push(new Integer(parameterStore.get("YX", "Mode").getI())); - this.cutHistoryHEC.push(new Integer(parameterStore.get("CutsCalo","HEC").getI())); - this.cutHistoryLAr.push(new Integer(parameterStore.get("CutsCalo","LAr").getI())); - parameterStore.restoreWindowParameters(); - } - else if(ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom) || - ARectangleVPSelection.ZOOM_LAR.equals(typeOfZoom)) - { - parameterStore.selectWindowParameters(this.getName()); - this.modeHistory.push(new Integer(parameterStore.get("VP", "Mode").getI())); - parameterStore.restoreWindowParameters(); - } - } - - - public void unzoomFull() - { - //perform unzoom to initial state - setUserCorners(((AProjection2D) getProjection()).calculateNoZoomCorners(getSize())); - //clear all variables for this window - cornersHistory.clear(); - zoomSummed.clear(); - zoomLayers.clear(); - zoomCaloLAr.clear(); - zoomCalo.clear(); - layoutHistory.clear(); - modeHistory.clear(); - cutHistoryHEC.clear(); - cutHistoryLAr.clear(); - } - - - public void unzoom() - { - if(projection == projectionHistory && cornersHistory.size() > 0) - { - setUserCorners((Point2D.Double[]) (cornersHistory.pop())); - } - } - - - public void saveLayout() - { - if(userCorners != null) - { - ACanvas.getCanvas().saveLayout(); - } - } - - - public void saveCorners() - { - if(projection != projectionHistory) - { - cornersHistory.clear(); - String wName = this.getName(); - int temp; - if(wName.equals("1") || wName.equals("2") || wName.equals("3") || wName.equals("4") || - wName.equals("5") || wName.equals("6") || wName.equals("7") || wName.equals("8")) - { - zoomSummed.clear(); - zoomLayers.clear(); - zoomCaloLAr.clear(); - zoomCalo.clear(); - layoutHistory.clear(); - //will have already done saveParameters so only - //want the last saved parameters of mode and cuts - if(modeHistory.size()>0) - { - temp = ((Integer) modeHistory.pop()).intValue(); - modeHistory.clear(); - modeHistory.push(new Integer(temp)); - } - - if(cutHistoryHEC.size()>0) - { - temp = ((Integer) cutHistoryHEC.pop()).intValue(); - cutHistoryHEC.clear(); - cutHistoryHEC.push(new Integer(temp)); - } - - if(cutHistoryLAr.size()>0) - { - temp = ((Integer) cutHistoryLAr.pop()).intValue(); - cutHistoryLAr.clear(); - cutHistoryLAr.push(new Integer(temp)); - } - } - } - projectionHistory = projection; - if(userCorners != null) - { - cornersHistory.push(clonedCopy(userCorners)); - } - } - - - public void saveCorners(String typeOfZoom) - { - saveCorners(); - //save zoom just done - if(userCorners != null) - { - if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_SUMMED)) - { - zoomSummed.push(new Integer(cornersHistory.size())); - } - else if(typeOfZoom.equals(ARectangleYXSelection.ZOOM_LAYERS)) - { - zoomLayers.push(new Integer(cornersHistory.size())); - } - else if(ARectangleVPSelection.ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - zoomCalo.push(new Integer(cornersHistory.size())); - } - else if(ARectangleVPSelection.ZOOM_LAR.equals(typeOfZoom)) - { - zoomCaloLAr.push(new Integer(cornersHistory.size())); - } - layoutHistory.push(new Integer(cornersHistory.size())); - } - } - - - public void setUserCornersNoRepaint(Point2D.Double[] corners) - { - Point2D.Double[] validCorners = ((AProjection2D) projection). - validateCorners(clonedCopy(corners)); - if(validCorners != null) - { - this.userCorners = validCorners; - } - } - - - public void setUserCorners(double x0, double x1, double y0, double y1) - { - Point2D.Double[] corners = new Point2D.Double[3]; - corners[0] = new Point2D.Double(x0, y1); - corners[1] = new Point2D.Double(x1, y1); - corners[2] = new Point2D.Double(x1, y0); - if(projection instanceof AProjection2D) corners = ((AProjection2D) - projection).validateCorners(corners); - if(corners != null) - this.userCorners = corners; - } - - - public Point2D.Double[] getDefaultCorners() - { - return clonedCopy(defaultCorners); - } - - - public Point2D.Double[] getUserCorners() - { - return clonedCopy(userCorners); - } - - - public void setInteractionManager(AInteractionsManager interactionsManager) - { - this.interactionsManager = interactionsManager; - //Make the interactions Manager aware of canvas changes - ACanvas.getCanvas().addParentWindowFocusListener(interactionsManager); - } - - - public void setScaleStatus(boolean statusWanted) - { - if(getScaleStatus() != statusWanted) toggleScale(); - } - - - public boolean getScaleStatus() - { - return scaleBorder.getScaleStatus(); - } - - - private void toggleScale() - { - scaleBorder.toggleScale(); - repaintFromScratch(); - } - - - public AInteractionsManager getInteractionManager() - { - return interactionsManager; - } - - - public void paintComponent(Graphics g) { - // Don't draw anything for ourself - } - - void paintWindow(Graphics g, boolean doubleBuffer) - { - if(!ACanvas.getCanvas().isReallyOnScreen(this)) - return; - //Why is this checked in paintComponent, and not already in - //setProjection() ? FIXIT / CLEANUP S.B - if(projection instanceof AProjectionTrackResidual) - { - if (((AProjectionTrackResidual) projection).getResidual() != null) - userCorners = ((AProjectionTrackResidual)projection).calculateNoZoomCorners(); - else - { - AOutput.append("\nTrackResidual Projection is not available, using YX instead in window " - + this.getName() + ".\n", ALogInterface.WARNING); - projection = AProjectionsManager.getProjection("YX"); - userCorners = (Point2D.Double[]) corners.get(projection.getName()); - } - } - - //Make sure the offscreen buffer is there if we need one - Graphics paint = g; - if (doubleBuffer) { - createOffScreenBuffer(); - paint = backingGraphics; - } - - // Means either we're using g or backingGraphics was something valid - if (paint != null) - { - if(!bufferValid) - { - setLocked(false); - paintWindowFromScratch(paint); - LinkedList<AInteraction> interactions = interactionsManager.getInteractions(); - for (int i = 0; i < interactions.size(); i++) { - if (interactions.get(i) instanceof ASelection) { - ((ASelection) interactions.get(i)).invalidate(); - } - } - bufferValid = true; - - } - - if (!isLocked() && !borderValid) { - //m_view.getBorder().paintBorder(paint); - borderValid = true; - } - - } - - // If we painted into a context which wasn't the target graphics context - // then we need to paint our buffer to the screen - if (g != paint) { - imageComponent(g); - } - - LinkedList<AInteraction> interactions = interactionsManager.getInteractions(); - for(int i = 0; i < interactions.size(); i++) - ((AInteraction) interactions.get(i)).paint((Graphics2D) g); - } - - // I suppose this function is intended to be called before every printing, - // but it is actually only called for EPS printing!!! FIX / CLEANUP S.B. - public void printComponent(Graphics g) - { - setLocked(false); - if(!ACanvas.getCanvas().isReallyOnScreen(this)) - return; - ((AScaleBorder) getView().getBorder()).forceDraw(); - //Double border painting needed here for EPS - probably something wrong in - //projection drawing -> graphics context left unclean? FIXIT. S.B. - ((AScaleBorder) getView().getBorder()).printBorder(this,g,this.getX(),this.getY(),this.getWidth(),this.getHeight()); - paintWindowFromScratch(g); - ((AScaleBorder) getView().getBorder()).printBorder(this,g,this.getX(),this.getY(),this.getWidth(),this.getHeight()); - borderValid = true; - LinkedList<AInteraction> interactions = interactionsManager.getInteractions(); - for(int i = 0; i < interactions.size(); i++) - { - AInteraction inter = (AInteraction) interactions.get(i); - if(inter.isPrintable()) - inter.paint((Graphics2D) g); - } - } - - - public void printBorder(Graphics g){} - - - // must call paint border myself since the border is backed too - public void paintBorder(Graphics g) - {} - - - public void repaintFromScratch() - { - if(locked)return; - bufferValid = false; - borderValid = false; - - // Check whether to draw scales on repaint - scaleBorder.hideScale(); - - // For some reason need to repaint the view too when using heavyweight - // component inside... - Adam - repaint(); - m_view.repaint(); - - } - - - // Attention: for efficiency this routine overwrites and returns its input - public ACoord calculateUser(ACoord user) - { - double[] h; - double[] v; - double hTemp; - double vTemp; - if(validTransform()) - { - for(int j = 0; j < user.hv[0].length; ++j) - { - h = user.hv[0][j]; - v = user.hv[1][j]; - for(int i = 0; i < h.length; ++i) - { - hTemp = h[i]; - vTemp = v[i]; - h[i] = m00 * hTemp + m01 * vTemp + m02; - v[i] = m10 * hTemp + m11 * vTemp + m12; - } - } - } - else - { - for(int j = 0; j < user.hv[0].length; ++j) - { - h = user.hv[0][j]; - v = user.hv[1][j]; - for(int i = 0; i < h.length; ++i) - { - h[i] = 0.; - v[i] = 0.; - } - } - } - return user; - } - - - public Point2D.Double calculateUser(double x, double y) - { - double[][][] hv = new double[2][1][1]; - hv[0][0][0] = x; - hv[1][0][0] = y; - ACoord p = calculateUser(new ACoord(hv)); - return new Point2D.Double(p.hv[0][0][0], p.hv[1][0][0]); - } - - - public Point2D.Double calculateUser(Point2D.Double p) - { - return calculateUser(p.x, p.y); - } - - - public Point2D.Double calculateUser(Point p) - { - return calculateUser(p.x, p.y); - } - - - // Attention! For efficiency this routine overwrites and returns its input - public ACoord calculateDisplay(ACoord user) - { - if(user == null) - return null; - double[] h; - double[] v; - double hTemp; - double vTemp; - if(validTransform()) - { - for(int j = 0; j < user.hv[0].length; ++j) - { - h = user.hv[0][j]; - v = user.hv[1][j]; - for(int i = 0; i < h.length; ++i) - { - hTemp = h[i]; - vTemp = v[i]; - h[i] = n00 * hTemp + n01 * vTemp + n02; - v[i] = n10 * hTemp + n11 * vTemp + n12; - } - } - } - else - { - for(int j = 0; j < user.hv[0].length; ++j) - { - h = user.hv[0][j]; - v = user.hv[1][j]; - for(int i = 0; i < h.length; ++i) - { - h[i] = 0.; - v[i] = 0.; - } - } - } - return user; - } - - - public Point2D.Double calculateDisplay(double x, double y) - { - double[][][] hv = new double[2][1][1]; - hv[0][0][0] = x; - hv[1][0][0] = y; - ACoord p = calculateDisplay(new ACoord(hv)); - return new Point2D.Double(p.hv[0][0][0], p.hv[1][0][0]); - } - - - public Point2D.Double calculateDisplay(Point2D.Double p) - { - return calculateDisplay(p.x, p.y); - } - - /** - * Called when the window is selected - */ - void select() - { - scaleBorder.setSelected(); - //redraw border to indicate this window is selected - borderValid = false; - repaint(); - } - - /** - * Called when the window is deselected - */ - void deselect() - { - scaleBorder.setDeselected(); - //redraw border to indicate this window is deselected - borderValid = false; - repaint(); - } - - /** - * Draws the image from the backup buffer on screen - */ - private void imageComponent(Graphics g) - { - Graphics2D g2d = (Graphics2D) g; - if(g2d != null) - { - Rectangle clipRect = g2d.getClipBounds(); - // Repaint only what is necessary. Except when running on MacOSX Tiger. - // (see http://lists.apple.com/archives/Java-dev/2005/Jun/msg00611.html) - if(clipRect != null && !(System.getProperty("os.name").equals("Mac OS X") - && System.getProperty("os.version").startsWith("10.4."))) - { - int x = clipRect.x; - int y = clipRect.y; - int w = clipRect.width; - int h = clipRect.height; - BufferedImage subImage = backingImage.getSubimage(x, y, w, h); - g2d.drawImage(subImage, x, y, this); - } - else - { - g2d.drawImage(backingImage, 0, 0, this); - } - } - } - - - public Rectangle getCurrDisp() - { - int width = m_view.getWidth(); - int height = m_view.getHeight(); - insets = m_view.getInsets(insets); - int x = insets.left; - int y = insets.top; - int w = width - insets.left - insets.right; - int h = height - insets.top - insets.bottom; - return new Rectangle(x, y, w, h); - } - - - public void paintWindowFromScratch(Graphics g) - { - APar parameterStore = APar.instance(); - ACanvas.getCanvas().setPaintingWindow(this); - parameterStore.selectWindowParameters(getName()); - Rectangle currDisp = getCurrDisp(); - int x = (int) Math.rint(currDisp.getX()); - int y = (int) Math.rint(currDisp.getY()); - int width = (int) Math.rint(currDisp.getWidth()); - int height = (int) Math.rint(currDisp.getHeight()); - g.setClip(x, y, width, height); - Graphics2D g2 = (Graphics2D)g; - if(APreferencesControl.getAliasMenuItem()) - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - else - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - - projection.paint(this, g); - - g.setClip(0, 0, m_view.getWidth(), m_view.getHeight()); - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().setPaintingWindow(null); - - if(AColorHelpDialog.getInstance() != null && AColorHelpDialog.getInstance().isVisible()) - AColorHelpDialog.getInstance().update(); - } - - - private void createOffScreenBuffer() - { - int w = m_view.getWidth(); - int h = m_view.getHeight(); - Dimension dim = new Dimension(w, h); - // Check that the current size is positive. - if(w > 0 && h > 0) - { - if(!backingDimension.equals(dim)) - { - // Usinig ABufferedPixelGraphics is not a good idea in MacOSX Tiger. - // So instead we use createGraphics() to create a normal Graphics2D - // object to draw on. - if(System.getProperty("os.name").equals("Mac OS X") - && System.getProperty("os.version").startsWith("10.4.")) - { - backingImage = getGraphicsConfiguration().createCompatibleImage(w, h); - } else if(GraphicsEnvironment.getLocalGraphicsEnvironment(). - getDefaultScreenDevice().getDefaultConfiguration(). - getColorModel().getTransferType() - == DataBuffer.TYPE_USHORT) - { - backingImage = new BufferedImage(w, h, - BufferedImage.TYPE_USHORT_565_RGB); - } - else - { - if(System.getProperty("os.name").equals("Mac OS X")) - backingImage = new BufferedImage(w, h, - BufferedImage.TYPE_INT_ARGB_PRE); - else - backingImage = new BufferedImage(w, h, - BufferedImage.TYPE_INT_RGB); - } - backingGraphics = backingImage.createGraphics(); - backingDimension.setSize(dim); - bufferValid = false; - borderValid = false; - } - } - else - { - backingImage = null; - backingGraphics = null; - } - } - - - public Point2D.Double[] getDisplayCorners() - { - Point2D.Double[] corners = new Point2D.Double[3]; - insets = m_view.getInsets(insets); - int x = insets.left; - int y = insets.top; - int w = m_view.getWidth() - insets.left - insets.right; - int h = m_view.getHeight() - insets.top - insets.bottom; - Point2D.Double upperLeft = new Point2D.Double(x, y); - Point2D.Double lowerRight = new Point2D.Double(x + w, y + h); - Point2D.Double upperRight = new Point2D.Double(x + w, y); - corners[0] = upperLeft; - corners[1] = upperRight; - corners[2] = lowerRight; - return corners; - } - - - private boolean validTransform() - { - double x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3; - x1 = userCorners[0].x; - y1 = userCorners[0].y; - x2 = userCorners[1].x; - y2 = userCorners[1].y; - x3 = userCorners[2].x; - y3 = userCorners[2].y; - Point2D.Double[] displayCorners = getDisplayCorners(); - u1 = displayCorners[0].x; - v1 = displayCorners[0].y; - u2 = displayCorners[1].x; - v2 = displayCorners[1].y; - u3 = displayCorners[2].x; - v3 = displayCorners[2].y; - if(v1 * (u3 - u2) + v2 * (u1 - u3) + v3 * (u2 - u1) == 0.)return false; - if((u1 - u2) == 0.)return false; - m01 = (u1 * (x2 - x3) + u2 * (x3 - x1) + u3 * (x1 - x2)) / - (v1 * (u3 - u2) + v2 * (u1 - u3) + v3 * (u2 - u1)); - m00 = ((x1 - x2) - m01 * (v1 - v2)) / (u1 - u2); - m02 = x1 - m00 * u1 - m01 * v1; - m11 = (u1 * (y2 - y3) + u2 * (y3 - y1) + u3 * (y1 - y2)) / - (v1 * (u3 - u2) + v2 * (u1 - u3) + v3 * (u2 - u1)); - m10 = ((y1 - y2) - m11 * (v1 - v2)) / (u1 - u2); - m12 = y1 - m10 * u1 - m11 * v1; - if((x1 - x2) == 0.) - { - n01 = (u2 - u1) / (y2 - y1); - n11 = (v2 - v1) / (y2 - y1); - n00 = ((u3 - u2) - n01 * (y3 - y2)) / (x3 - x1); - n10 = ((v3 - v2) - n11 * (y3 - y2)) / (x3 - x1); - n02 = u1 - n00 * x1 - n01 * y1; - n12 = v1 - n10 * x1 - n11 * y1; - return true; - } - else - { - if(y1 * (x3 - x2) + y2 * (x1 - x3) + y3 * (x2 - x1) == 0.)return false; - n01 = (x1 * (u2 - u3) + x2 * (u3 - u1) + x3 * (u1 - u2)) / - (y1 * (x3 - x2) + y2 * (x1 - x3) + y3 * (x2 - x1)); - n00 = ((u1 - u2) - n01 * (y1 - y2)) / (x1 - x2); - n02 = u1 - n00 * x1 - n01 * y1; - n11 = (x1 * (v2 - v3) + x2 * (v3 - v1) + x3 * (v1 - v2)) / - (y1 * (x3 - x2) + y2 * (x1 - x3) + y3 * (x2 - x1)); - n10 = ((v1 - v2) - n11 * (y1 - y2)) / (x1 - x2); - n12 = v1 - n10 * x1 - n11 * y1; - return true; - } - } - - - public JToolTip createToolTip() - { - JToolTip tip = new JToolTip(); - tip.setFont(new Font(null, Font.PLAIN, 20)); - return tip; - } - - - // implementation of DropTargetListener - - // Called when a drag operation has encountered the DropTarget. - public void dragEnter(DropTargetDragEvent dtde) - { - dtde.acceptDrag(DnDConstants.ACTION_MOVE); - } - - - // The drag operation has departed the DropTarget without dropping. - public void dragExit(DropTargetEvent dte) - {} - - - // Called when a drag operation is ongoing on the DropTarget. - public void dragOver(DropTargetDragEvent dtde) - {} - - - // The drag operation has terminated with a drop on this DropTarget. - public void drop(DropTargetDropEvent dtde) - { - try - { - Transferable transferable = dtde.getTransferable(); - DataFlavor javaObjectDataFlavor = new DataFlavor(DataFlavor. - javaJVMLocalObjectMimeType); - if(transferable.isDataFlavorSupported(javaObjectDataFlavor)) - { - dtde.acceptDrop(DnDConstants.ACTION_MOVE); - Object object = transferable.getTransferData( - javaObjectDataFlavor); - if(object instanceof ACallBack) - ((ACallBack) object).callBack(this); - else - ACanvas.getCanvas().copyWindowSettings(((ADnDLabel) object).getText(), - getName()); - dtde.getDropTargetContext().dropComplete(true); - } - else - AOutput.append("Cannot accept drop\n", ALogInterface.BAD_COMMAND); - } - catch(Exception e) - { - e.printStackTrace(); - dtde.rejectDrop(); - } - } - - - // Called if the user has modified the current drop gesture. - public void dropActionChanged(DropTargetDragEvent dtde) - {} - - - private Vector<ChangeListener> projectionChangeListeners = new Vector<ChangeListener>(); - public void addProjectionChangeListener(ChangeListener listener) - { - projectionChangeListeners.addElement(listener); - listener.stateChanged(new ChangeEvent(this)); - } - - - private void fireProjectionChange() - { - ChangeEvent changeEvent = new ChangeEvent(this); - for(int i = 0; i < projectionChangeListeners.size(); i++) - { - ChangeListener changeListener = (ChangeListener) - projectionChangeListeners.elementAt( - i); - changeListener.stateChanged(changeEvent); - } - } - - - private Vector<ChangeListener> groupChangeListeners = new Vector<ChangeListener>(); - public void addGroupChangeListener(ChangeListener listener) - { - groupChangeListeners.addElement(listener); - listener.stateChanged(new ChangeEvent(this)); - } - - - private void fireGroupChange() - { - ChangeEvent changeEvent = new ChangeEvent(this); - for(int i = 0; i < groupChangeListeners.size(); i++) - { - ChangeListener changeListener = (ChangeListener) - groupChangeListeners.elementAt(i); - changeListener.stateChanged(changeEvent); - } - } - - - // implementation of DragSourceListener - - // This method is invoked to signify that the Drag and Drop operation is complete. - public void dragDropEnd(DragSourceDropEvent dsde) - {} - - - // Called as the hotspot enters a platform dependent drop site. - public void dragEnter(DragSourceDragEvent dsde) - { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_INVALID); - } - - - // Called as the hotspot exits a platform dependent drop site. - public void dragExit(DragSourceEvent dse) - { - dse.getDragSourceContext().setCursor(ADnDLabel.DROP_INVALID); - } - - - // Called as the hotspot moves over a platform dependent drop site. - public void dragOver(DragSourceDragEvent dsde) - { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_VALID); - } - - - // Called when the user has modified the drop gesture. - public void dropActionChanged(DragSourceDragEvent dsde) - {} - - - // implementation of DragGestureListener - - public void dragGestureRecognized(DragGestureEvent dge) - { - if(!canCopyScales)return; - Point p = dge.getDragOrigin(); - Insets i = m_view.getInsets(); - int w = m_view.getWidth(); - int h = m_view.getHeight(); - Rectangle vScale = new Rectangle(0, 0, i.left, h - i.bottom); - Rectangle hScale = new Rectangle(i.left, h - i.bottom, w - i.left, - i.bottom); - if(vScale.contains(p)) - dragAction = dragActionType.COPY_VERTICAL_SCALE; - else if(hScale.contains(p)) - dragAction = dragActionType.COPY_HORIZONTAL_SCALE; - else - return; - dragSource.startDrag(dge, ADnDLabel.DROP_INVALID, - new AObjectTransferable(this), this); - } - - - public void setScaleCopyStatus(boolean canCopyScales) - { - this.canCopyScales = canCopyScales; - } - - - public void callBack(Object to) - { - AWindow targetWindow; - if(to instanceof ADnDLabel) - targetWindow = ACanvas.getCanvas().getWindow(((ADnDLabel) to). - getText()); - else if(to instanceof AWindow) - targetWindow = (AWindow) to; - else - return; - if(dragAction == dragActionType.COPY_VERTICAL_SCALE) - { - String labelSource = ((AScaleBorder) getBorder()). - getVerticalAxisLabel(); - String labelTarget = ((AScaleBorder) (targetWindow.getBorder())). - getVerticalAxisLabel(); - if(labelSource.equals(labelTarget) && labelSource.equals(AMath.PHI)) - { - Point2D.Double[] sourceCorners = getUserCorners(); - Point2D.Double[] targetCorners = targetWindow.getUserCorners(); - for(int i = 0; i < sourceCorners.length; ++i) - targetCorners[i].setLocation(targetCorners[i].getX(), - sourceCorners[i].getY()); - targetWindow.setUserCorners(targetCorners); - AOutput.append("Copy " + AMath.PHI + " Scale from " + getName() + - " to " + targetWindow.getName() + "\n", - ALogInterface.NORMAL); - } - } - else if(dragAction == dragActionType.COPY_HORIZONTAL_SCALE) - { - String labelSource = ((AScaleBorder) getBorder()). - getHorizontalAxisLabel(); - String labelTarget = ((AScaleBorder) targetWindow.getBorder()). - getHorizontalAxisLabel(); - if(labelSource.equals(labelTarget) && labelSource.equals("Z")) - { - Point2D.Double[] sourceCorners = getUserCorners(); - Point2D.Double[] targetCorners = targetWindow.getUserCorners(); - for(int i = 0; i < sourceCorners.length; ++i) - targetCorners[i].setLocation(sourceCorners[i].getX(), - targetCorners[i].getY()); - targetWindow.setUserCorners(targetCorners); - AOutput.append("Copy Z Scale from " + getName() + " to " + - targetWindow.getName() + "\n", - ALogInterface.NORMAL); - } - } - } - - - private void setLocked(boolean locked) - { - if(locked == this.locked)return; - boolean wasLocked = this.locked; - this.locked = locked; - ACanvas.getCanvas().fireLockChange(); - if(wasLocked && !locked) - this.repaintFromScratch(); - ACanvas.getCanvas().fireLockChange(); - } - - - public boolean isLocked() - { - return locked; - } - - public JComponent getView() { - return m_view; - } - - public void invalidateQuietly() { - // When you get told to paint in OpenGL you better paint otherwise - // you're going to get your empty backbuffer painted to screen a lot - // of the time ... could fix this by managing our buffer swaps by hand - // see AWindowGLView.display() for more... - Adam - bufferValid = false; - borderValid = false; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AWindowGLView.java b/graphics/AtlantisJava/src/atlantis/canvas/AWindowGLView.java deleted file mode 100644 index bd94b9013755..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AWindowGLView.java +++ /dev/null @@ -1,337 +0,0 @@ -package atlantis.canvas; - -import atlantis.interactions.AInteractionsManager; -import atlantis.utils.ALogger; -import java.awt.BorderLayout; -import java.awt.BufferCapabilities; -import java.awt.Canvas; -import java.awt.Component; -import java.awt.Graphics; -import java.awt.GraphicsEnvironment; -import java.awt.event.MouseListener; -import java.lang.ref.WeakReference; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import javax.media.opengl.AWTGraphicsDevice; -import javax.media.opengl.DefaultGLCapabilitiesChooser; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCanvas; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLCapabilitiesChooser; -import javax.media.opengl.GLContext; -import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLJPanel; -import javax.media.opengl.glu.GLU; -import javax.swing.JPanel; -import javax.swing.border.Border; - -/** - * This class provides an OpenGL context. When the parent AWindow repaints - * this is propagated down to this view component, which then calls back to - * the parent AWindow requesting everything be copied in. - * - * @author Adam Davison - */ -public class AWindowGLView extends JPanel implements GLEventListener { - - private static ALogger logger = ALogger.getLogger(AWindowGLView.class); - - private GLCanvas m_panel; - //private JPanel m_children; - private long m_start = 0; - private int m_count = 0; - private AWindow m_parent; - private Graphics m_g = null; - - private static GLContext m_ocontext; - - // Keep track of all initialized OpenGL contexts without forcing them - // to stay in memory when we aren't using them any more... - // This is a debugging thing - private static ArrayList<WeakReference> m_all = new ArrayList<WeakReference>(); - - private static int m_maxFSAA = -1; - private static int m_FSAA = 0; - - public static int getCurrentFSAA() { - return m_FSAA; - } - - public static void setCurrentFSAA(int FSAA) { - logger.info("Changing anti-aliasing to " + FSAA + "x"); - m_FSAA = FSAA; - for (int i = 0; i < m_all.size(); i++) { - AWindowGLView v = (AWindowGLView)(m_all.get(i).get()); - if (v != null) { - v.restartDisplay(); - } - } - } - - public static int getMaxFSAA() { - return m_maxFSAA; - } - - public void restartDisplay() { - System.out.println("RESTART DISPLAY!"); - remove(m_panel); - m_panel = null; - startDisplay(); - validate(); - m_panel.setBounds(0, 0, getWidth(), getHeight()); - } - - private void startDisplay() { - GLCapabilities cap = new GLCapabilities(); - - if (m_FSAA > 0) { - cap.setSampleBuffers(true); - cap.setNumSamples(m_FSAA); - logger.info("Requesting " + m_FSAA + "x"); - } - - cap.setDoubleBuffered(true); - - if (m_ocontext != null) { - m_panel = new GLCanvas(cap, null, m_ocontext, null); - } else { - m_panel = new GLCanvas(cap); - } - - m_ocontext = m_panel.getContext(); - - m_panel.addGLEventListener(this); - - //m_FSAA = m_panel.getChosenGLCapabilities().getNumSamples(); - - //m_children = new JPanel(); - - add(m_panel, BorderLayout.CENTER); - - } - - public AWindowGLView(AWindow parent) { - m_parent = parent; - setLayout(null); - - startDisplay(); - //m_panel.add(m_but); - //add(m_but, BorderLayout.NORTH); - - - m_all.add(new WeakReference(this)); - - } - - private void checkListeners() { - AInteractionsManager lt = m_parent.getInteractionManager(); - MouseListener[] lr = m_panel.getMouseListeners(); - boolean found = false; - for (int i = 0; i < lr.length; i++) { - if (lr[i] == lt) { - found = true; - } - } - - if (!found) { - m_panel.addMouseListener(lt); - m_panel.addMouseMotionListener(lt); - } - } - - public void init(GLAutoDrawable drawable) { - - System.out.println("INIT CALLED!"); - System.out.println(getWidth() + ":" + getHeight()); - //(new Exception()).printStackTrace(); - - checkListeners(); - - //drawable.setGL(new TraceGL(drawable.getGL(), System.err)); - GL gl = drawable.getGL(); - logger.debug("INIT GL IS: " + gl.getClass().getName()); - - int[] buffer = new int[2]; - gl.glGetIntegerv(GL.GL_MAX_SAMPLES_EXT, buffer, 0); - m_maxFSAA = buffer[0]; - logger.debug("Graphics card supports max anti-alias of: " + buffer[0] + "x"); - - BufferCapabilities bc = m_panel.getGraphicsConfiguration().getBufferCapabilities(); - boolean frontacc = bc.getFrontBufferCapabilities().isAccelerated(); - boolean backacc = bc.getBackBufferCapabilities().isAccelerated(); - logger.info("OpenGL Acceleration Status: Front - " + frontacc + " and Back - " + backacc); - - // All polygons in Atlantis are uniformly coloured, this speeds things up in theory at least... - gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - gl.glShadeModel(GL.GL_FLAT); - - // Old style antialiasing like this is apparently not supported by - // modern graphics cards although we may want to enable it on older - // hardware where people do not have FSAA but still want AA - /*gl.glHint(gl.GL_POLYGON_SMOOTH_HINT, gl.GL_NICEST); - gl.glEnable(gl.GL_POLYGON_SMOOTH); - gl.glHint(gl.GL_LINE_SMOOTH_HINT, gl.GL_NICEST); - gl.glEnable(gl.GL_LINE_SMOOTH);*/ - - // We do our own Z-ordering - gl.glDisable(gl.GL_DEPTH_TEST); - - // Enable transparency, even if nothing in Atlantis is actually - // transparent yet... - gl.glEnable(gl.GL_BLEND); - gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA); - - } - - private static int countContexts() { - int count = 0; - for (int i = 0; i < m_all.size(); i++) { - if (m_all.get(i).get() != null) { - count++; - } - // Could throw away dead weak refs here... - } - return count; - } - - public void display(GLAutoDrawable d) { - - /*if (m_parent.isValid()) { - System.out.println("VALID PARENT - RETURNING"); - return; - }*/ - // Perhaps we could not do this and turn off buffer swaps? - // Currently we're probably doing some unnecessary repaints when - // you change window - m_parent.invalidateQuietly(); - - GL gl = d.getGL(); - //System.out.println("DISPLAY " + this); - //System.out.println("ACTIVE: " + countContexts()); - gl.glMatrixMode(GL.GL_MODELVIEW); - gl.glLoadIdentity(); - - // Can we avoid this? We probably fill with bg colour later anyway... - gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f); - gl.glClear(gl.GL_COLOR_BUFFER_BIT); - - if (m_parent != null) { - AGLGraphics glg = new AGLGraphics(d); - m_parent.paintWindow(glg, false); - super.paintBorder(glg); - /*for (int i = 0; i < m_panel.getComponentCount(); i++) { - m_panel.getComponent(i).paint(glg); - }*/ - } - - gl.glFlush(); - - m_count++; - long tnow = System.currentTimeMillis(); - if (tnow - 1000 > m_start) { - logger.info("OpenGL FPS: " + m_count); - m_count = 0; - m_start = tnow; - } - } - - /*@Override - public Graphics getGraphics() { - if (m_g == null) { - System.out.println("PAINT OUT OF VALID"); - return new ADummyGraphics2D(); - } else { - return m_g; - } - }*/ - public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { - //System.out.println("GLRESIZE: " + x + ":" + y + ":" + width + ":" + height); - GL gl = drawable.getGL(); - GLU glu = new GLU(); - - if (height <= 0) // avoid a divide by zero error! - { - height = 1; - } - final float h = (float) width / (float) height; - gl.glViewport(0, 0, width, height); - gl.glMatrixMode(GL.GL_PROJECTION); - gl.glLoadIdentity(); - gl.glOrtho(x, x + width, y + height, y, -100.0, 100.0); - //gl.glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0); - - gl.glMatrixMode(GL.GL_MODELVIEW); - gl.glLoadIdentity(); - - m_count = 0; - m_start = System.currentTimeMillis(); - } - - // Should implement this for multi-screen people some time... - public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void setBounds(int x, int y, int width, int height) { - //Border b = getBorder(); - //setBorder(null); - super.setBounds(x, y, width, height); - m_panel.setBounds(0, 0, getWidth(), getHeight()); - //setBorder(b); - //System.out.println("RESIZE " + x + ":" + y + ":" + width + ":" + height); - } - - // Need to paint our own border to make sure it gets drawn in GL - public void paintBorder(Graphics g) { - - } - - // Need to make sure our heavyweight child is invalidated - public void repaint() { - super.repaint(); - if (m_panel != null) { - m_panel.repaint(); - } - } - - public Component getRealPanel() { - return m_panel; - } -} - -class OurGLCapChooser implements GLCapabilitiesChooser { - - private int m_maxAA; - private boolean m_canAA; - - public OurGLCapChooser() { - } - - public int chooseCapabilities(GLCapabilities req, GLCapabilities[] all, int recommended) { - System.out.println("CALLED!"); - m_canAA = false; - m_maxAA = 0; - - for (int i = 0; i < all.length; i++) { - System.out.println(all[i]); - if (all[i].getSampleBuffers()) { - m_canAA = true; - if (all[i].getNumSamples() > m_maxAA) { - m_maxAA = all[i].getNumSamples(); - } - } - } - - return (new DefaultGLCapabilitiesChooser()).chooseCapabilities(req, all, recommended); - } - - public boolean getCanAA() { - return m_canAA; - } - - public int getMaxAA() { - return m_maxAA; - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/canvas/AWindowSwingView.java b/graphics/AtlantisJava/src/atlantis/canvas/AWindowSwingView.java deleted file mode 100644 index cc27fad13af3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/AWindowSwingView.java +++ /dev/null @@ -1,57 +0,0 @@ -package atlantis.canvas; - -import atlantis.globals.AGlobals; - -import java.awt.Graphics; -import javax.swing.JPanel; - -/** - * - * This class provides an Java2D/Swing context. When the parent AWindow repaints - * this is propagated down to this view component, which then calls back to - * the parent AWindow requesting everything be copied in. - * - * @author Adam Davison - */ -public class AWindowSwingView extends JPanel { - - private AWindow m_parent; - - public AWindowSwingView(AWindow parent) { - setLayout(null); - m_parent = parent; - } - - @Override - protected void paintComponent(Graphics g) { - //System.out.println(getX() + ":" + getY() + ":" + getWidth() + ":" + getHeight()); - g.setClip(0, 0, getWidth(), getHeight()); - //g.setColor(Color.RED); - //g.fillRect(10, 10, getWidth() - 10, getHeight() - 10); - if (AGlobals.isAtlantisHeadless()) { - // Don't need to paint to a backing buffer ever in headless - // since we're already painting offscreen - m_parent.paintWindow(g, false); - } else { - m_parent.paintWindow(g, true); - } - } - - @Override - protected void printComponent(Graphics g) { - //System.out.println(getX() + ":" + getY() + ":" + getWidth() + ":" + getHeight()); - g.setClip(0, 0, getWidth(), getHeight()); - //g.setColor(Color.RED); - //g.fillRect(10, 10, getWidth() - 10, getHeight() - 10); - m_parent.printComponent(g); - } - - @Override - public void setBounds(int x, int y, int width, int height) { - super.setBounds(x, y, width, height); - //System.out.println("RESIZE " + x + ":" + y + ":" + width + ":" + height); - } - - - -} diff --git a/graphics/AtlantisJava/src/atlantis/canvas/package.html b/graphics/AtlantisJava/src/atlantis/canvas/package.html deleted file mode 100644 index c09fd6d63f20..000000000000 --- a/graphics/AtlantisJava/src/atlantis/canvas/package.html +++ /dev/null @@ -1,23 +0,0 @@ -<html> -<head></head> -<body> -<p>Provides classes representing the Atlantis canvas and the windows - displayed within it.</p> -<p>The ACanvas is a JFrame containing a JlayeredPane of AWindows. Windows -are placed into the JLayeredPane depending on the current layout. The -canvas class contains a HashTable of all possible windows and a -HashTable of all available layouts. Windows needed by the current -layout are added to the JLayeredPane according to the size and the -order defined by the layout. An AWindow is a JPanel into which the -Atlantis graphics are drawn. Each window has an associated projection -and also an interaction manager. The interaction manager is a mouse -listener which deals with all mouse events on the window. The window -manages the drawing of the Atlantis picture and deals with the linear -transformations from user to display co-ordinates. Non-linear -transformations are dealt with by the projection. ALayout defines the -size and position (in the 3x3 grid layout scheme of the layered pane) -of each window, and also describes combinations of these windows -called pages. pages is an array of characters where each character -represents a window.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/config/AConfig.java b/graphics/AtlantisJava/src/atlantis/config/AConfig.java deleted file mode 100755 index f35dbb07ed52..000000000000 --- a/graphics/AtlantisJava/src/atlantis/config/AConfig.java +++ /dev/null @@ -1,432 +0,0 @@ -package atlantis.config; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Iterator; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import atlantis.Atlantis; -import atlantis.utils.xml.AXMLErrorHandler; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; - -/** - * AConfig acts as a container of the configuration file. - * The whole file can be accessed through a tree structure. - * - * @author ql - * - */ - -// by Zdenek, remark, 2008-08-14 -// since the attributes are stored in something like HashMap -// their order is not ensured?, e.g. having in WindowCorners source -// configuration (master copy according to which synchronization is done) -// <CORNERS windowName="W" x0="-1320.0" y0="1320.0" x1="1320.0" y1="1320.0" x2="1320.0" y2="-1320.0"/> -// line order this way, after updating it result in something like this -// <CORNERS x2="1320.0" windowName="W" y0="1320.0" x1="1320.0" y2="-1320.0" y1="1320.0" x0="-1320.0"/> -// the same data, but the order of attributes is not the same -public class AConfig -{ - private static ALogger logger = ALogger.getLogger(AConfig.class); - - // A map defining the key attribute for each modifiable element - static Hashtable keyMap; - - // Define modifiable attributes - public static String[] CANVAS_ATT = {"startupLayout", "aspectRatio"}; //<Canvas> - public static String[] WINDOW_ATT = {"projection", "group"}; //<UsedWindow> - public static String[] LAYOUT_ATT = {"startup", "startupWindow"}; //<Layout> - public static String[] PAR_ATT = {"va", "st", "dop", "scope", "ul"}; //<Others> - public static String[] GROUP_ATT = {"userLevel"}; //<Group> - - // Define used greek letters in configuration file - static String[] GREEK_LETTER = {"\u03B7", "\u03C1", "\u03A6", "\u0394", "\u03BB", "\u03C3"}; - static String[] GREEK_ENTITY = {"η", "ρ", "φ", "δ", "λ", "σ"}; - - // The name of the configuration file - private String filename; - - // If isCustomised is true, the configuration file contains two exclusive - // blocks, <ParameterDifferences> and <WindowCorners>. - private boolean isCustomised; - - // This field contains the whole DTD section of the configuration file. - private String dtdSection = null; - - // Root node of the configuration tree - private AConfigNode rootNode; - - // A list containing all element nodes in the file - private ArrayList nodeList; - - // A list containing all user exclusive element nodes in the file - // <ParameterDifferences> and <WindowCorners> - private ArrayList userExclusiveNodeList; - - public AConfig(String configFilename, boolean isCustomised) throws Exception - { - if(AConfig.keyMap == null) - AConfig.createKeyMap(); - this.filename = configFilename; - this.isCustomised = isCustomised; - parseXML(); - } - - /** - * @return Returns the dtdSection. - */ - public String getDtdSection() throws Exception - { - if(this.dtdSection == null) - createDTDSection(this.filename); - return this.dtdSection; - } - - public Iterator getIterator() - { - return nodeList.iterator(); - } - - void addNode(AConfigNode node) - { - nodeList.add(node); - } - - void addUserExclusiveNode(AConfigNode node) - { - userExclusiveNodeList.add(node); - } - - /** - * initialise <code>keyMap</code>. - */ - private static void createKeyMap() - { - keyMap = new Hashtable(); - keyMap.put("Canvas", "startupLayout"); - keyMap.put("UsedWindow", "name"); - keyMap.put("Layout", "name"); - keyMap.put("ENUM", "fn"); - keyMap.put("SENUM", "fn"); - keyMap.put("ICUT", "fn"); - keyMap.put("SICUT", "fn"); - keyMap.put("FCUT", "fn"); - keyMap.put("SFCUT", "fn"); - keyMap.put("INT", "fn"); - keyMap.put("SINT", "fn"); - keyMap.put("FLOAT", "fn"); - keyMap.put("SFLOAT", "fn"); - keyMap.put("LINT", "fn"); - keyMap.put("SLINT", "fn"); - keyMap.put("COLOR", "fn"); - keyMap.put("SCOLOR", "fn"); - keyMap.put("STATUS", "fn"); - } - - /** - * initialise <code>dtdSection</code> based on the dtd part from the - * configuration file. - */ - private void createDTDSection(String configFilename) throws Exception - { - String dtdStart = "<?xml version=\"1.0\"?>"; - String dtdEnd = "]>"; - String LINE_SEPAR = System.getProperty("line.separator"); - - this.dtdSection = ""; - try - { - - InputStream is = AUtilities.getFileAsStream(configFilename); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader br = new BufferedReader(isr); - - String currentLine; - boolean isInsideDTD = false; - while(true) - { - currentLine = br.readLine(); - if(currentLine == null) return; - if(dtdStart.equals(currentLine.trim())) - { - isInsideDTD = true; - this.dtdSection += currentLine + LINE_SEPAR; - } - else if(dtdEnd.equals(currentLine.trim())) - { - isInsideDTD = false; - this.dtdSection += currentLine + LINE_SEPAR; - } - else if(isInsideDTD) - { - this.dtdSection += currentLine + LINE_SEPAR; - } - } - } - catch(FileNotFoundException e) - { - String m = "File " + configFilename + " not found, fatal."; - throw new Exception(m); - } - catch(IOException e) - { - String m = "I/O exception while reading file " + configFilename; - throw new Exception(m); - } - } - - public void createConfigTree(Element rootElement) - { - this.nodeList = new ArrayList(); - if(this.isCustomised) - this.userExclusiveNodeList = new ArrayList(); - this.rootNode = new AConfigNode(null, rootElement, 0, this); - } - - public void parseXML() throws Exception - { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(true); - DocumentBuilder parser; - try - { - parser = factory.newDocumentBuilder(); - parser.setErrorHandler(new AXMLErrorHandler()); - - InputStream isConfig = AUtilities.getFileAsStream(this.filename); - Document xmlConfigDoc = parser.parse(isConfig); - createConfigTree(xmlConfigDoc.getDocumentElement()); - } - catch (Exception e) - { - throw e; - } - } - - // Find a node match the sampleNode in the configuration file - // Return the node if found, null otherwise - public AConfigNode find(AConfigNode sampleNode) - { - for(int i=0; i<nodeList.size(); ++i) - { - AConfigNode testNode = (AConfigNode) nodeList.get(i); - if("Canvas".equals(sampleNode.getNodeName()) - && (testNode.getFullNodeName().equals(sampleNode.getFullNodeName()))) - { - return testNode; - } - else if((testNode.getFullNodeName().equals(sampleNode.getFullNodeName())) - && (testNode.getKeyValue().equals(sampleNode.getKeyValue()))) - { - return testNode; - } - } - return null; - } - - // Find a node based on the node name, attribute name and value - // Return the node if found, null otherwise - public AConfigNode find(String name, String attName, String attValue) - { - for(int i=0; i<nodeList.size(); ++i) - { - AConfigNode testNode = (AConfigNode) nodeList.get(i); - if(name.equals(testNode.getNodeName()) - && attValue.equals(testNode.getAttValue(attName))) - return testNode; - } - return null; - } - - // Find a node based on the node name, attribute name and value, - // and its parent's node name, attribute name and value. - // Return the node if found, null otherwise - public AConfigNode find(String name, String attName, String attValue, - String parName, String parAttName, String parAttValue) - { - for(int i=0; i<nodeList.size(); ++i) - { - AConfigNode testNode = (AConfigNode) nodeList.get(i); - if(name.equals(testNode.getNodeName()) - && attValue.equals(testNode.getAttValue(attName))) - { - AConfigNode parNode = testNode.getParent(); - - if(parName.equals(parNode.getNodeName()) - && parAttValue.equals(parNode.getAttValue(parAttName))) - return testNode; - } - } - return null; - } - - // Find a parameter node based on the attribute name and value, - // and its group's name - // Return the node if found, null otherwise - // - // NB: This method is for finding a parameter node with uncertain - // parameter type, but with a certain parent node name - public AConfigNode findPar(String attName, String attValue, String parAttValue) - { - for(int i=0; i<nodeList.size(); ++i) - { - AConfigNode testNode = (AConfigNode) nodeList.get(i); - if(attValue.equals(testNode.getAttValue(attName))) - { - AConfigNode parNode = testNode.getParent(); - - // <StatusRoot> and <StatusGroup> are skipped when finding parent node - while("StatusRoot".equals(parNode.getNodeName()) - || "StatusGroup".equals(parNode.getNodeName())) - { - parNode = parNode.getParent(); - } - - if("Group".equals(parNode.getNodeName()) - && parAttValue.equals(parNode.getAttValue("name"))) - return testNode; - } - } - return null; - } - - /** - * validate the attribute value - */ - public boolean validate(AConfigNode node, String attName, String attValue) - { - if("Canvas".equals(node.getNodeName()) && "startupLayout".equals(attName)) - { - if(find("Layout", "name", attValue) == null) - return false; - } - else if("UsedWindow".equals(node.getNodeName()) && "projection".equals(attName)) - { - if(find("Group", "name", attValue, "SuperGroup", "name", "Projection") == null) - return false; - } - else if("UsedWindow".equals(node.getNodeName()) && "group".equals(attName)) - { - if(find("Group", "name", attValue) == null) - return false; - } - else if("Layout".equals(node.getNodeName())) - { - int numWindows = attValue.length(); - for(int i=0; i<numWindows; ++i) - { - String windowName = attValue.substring(i, i+1); - if(find("Window", "name", windowName, "Layout", "name", node.getKeyValue()) == null) - return false; - } - } - return true; - } - - public void validateUserExclusiveNode(AConfigNode node) - { - if("ParameterDifferences".equals(node.getNodeName())) - { - // check validity of each child of <ParameterDifferences> - Iterator it = node.getChildren().iterator(); - while(it.hasNext()) - { - // a <DIFFERENCE> node - AConfigNode childNode = (AConfigNode) it.next(); - String group = childNode.getAttValue("group"); - String window = childNode.getAttValue("windowName"); - String parameter = childNode.getAttValue("name"); - if(find("UsedWindow", "name", window) == null) - it.remove(); - else - { - if(find("Group", "name", group) == null) - it.remove(); - else - { - if(findPar("fn", parameter, group) == null) - it.remove(); - } - } - } - } - else if("WindowCorners".equals(node.getNodeName())) - { - // check validity of each child of <WindowCorners> - Iterator it = node.getChildren().iterator(); - while(it.hasNext()) - { - // a <CORNERS> node - AConfigNode childNode = (AConfigNode) it.next(); - String window = childNode.getAttValue("windowName"); - if(find("UsedWindow", "name", window) == null) - it.remove(); - } - } - } - - /** - * Replace the greek letters in the source string with UTF entities - * - * @param testStr a source string - * @return the resulting string - */ - static String replaceGreekLetter(String testStr) - { - for (int i=0; i<GREEK_LETTER.length; ++i) - { - if (testStr.indexOf(GREEK_LETTER[i]) >= 0) - testStr = testStr.replaceAll(GREEK_LETTER[i], GREEK_ENTITY[i]); - } - - return testStr; - } - - /** - * Converts to a string representing the xml data in this configuration - * file. - */ - public String convertToString() throws Exception - { - return getDtdSection() + "\n\n" + this.rootNode.toString(); - } - - /** - * Converts to a string representing the xml data in this configuration - * file plus the user exclusive section fom <code>userConfig</code>. - */ - public String convertToString(AConfig userConfig) throws Exception - { - if(!this.isCustomised && userConfig.isCustomised) - { - StringBuffer str = new StringBuffer("\n"); - for(int i=0; i<userConfig.userExclusiveNodeList.size(); ++i) - { - AConfigNode userExclusiveNode = (AConfigNode) userConfig.userExclusiveNodeList.get(i); - validateUserExclusiveNode(userExclusiveNode); - str.append(userExclusiveNode.toString()); - str.append("\n"); - } - return getDtdSection() + "\n\n" + this.rootNode.toString(str.toString()); - } - else - { - // only add user exclusive section to non-customized configuration - return toString(); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/config/AConfigNode.java b/graphics/AtlantisJava/src/atlantis/config/AConfigNode.java deleted file mode 100755 index 751ae9885056..000000000000 --- a/graphics/AtlantisJava/src/atlantis/config/AConfigNode.java +++ /dev/null @@ -1,263 +0,0 @@ -package atlantis.config; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.jar.Attributes; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -public class AConfigNode -{ - private String nodeName; - - // use fullNodeName combined with keyValue to uniquely identify a parameter - // in the configuration file - // NB: keyValue is not empty only if attributes is not empty - private String fullNodeName; - private String keyValue = null; - - // Layer 0 represents the root node of the xml file, - // and layer 1 reprensents the layer inside layer 0, - // and so on. - private int layer; - - private Attributes attributes = null; - private ArrayList children = null; - private AConfigNode parent = null; - - // if parent is null, elementNode is the root node - AConfigNode(AConfigNode parent, Node elementNode, int layer, AConfig configObject) - { - // add this node into the node list - configObject.addNode(this); - this.layer = layer; - - // set the full name - this.parent = parent; - String parentName = (this.parent != null) ? this.parent.getFullNodeName() + "-" : ""; - this.nodeName = elementNode.getNodeName(); - if("ParameterDifferences".equals(this.nodeName) - || "WindowCorners".equals(this.nodeName)) - configObject.addUserExclusiveNode(this); - this.fullNodeName = parentName + this.nodeName; - - // set the attributes map - if(elementNode.hasAttributes()) - { - NamedNodeMap attMap = elementNode.getAttributes(); - int numAttributes = attMap.getLength(); - this.attributes = new Attributes(numAttributes); - for(int i=0; i<numAttributes; ++i) - { - // each node returned from item(i) is an Attr - String name = attMap.item(i).getNodeName(); - String value = attMap.item(i).getNodeValue(); - // replace special math operator characters with entity references - if("=".equals(value)) - value = "&intEqual;"; - else if(">".equals(value)) - value = ">"; - else if("<".equals(value)) - value = "<"; - else if("<,>".equals(value)) - value = "ℜ"; - else if("<=".equals(value)) - value = "≤"; - else if(">=".equals(value)) - value = "≥"; - else if("=,!=,<,<=,>,>=".equals(value)) - value = "∫"; - - // replace greek letters with entity references - value = AConfig.replaceGreekLetter(value); - - this.attributes.putValue(name, value); - } - } - - // set the key value - String keyAttr = (String) AConfig.keyMap.get(this.nodeName); - if(keyAttr != null) - { - String groupName = this.parent.getAttValue("name"); - this.keyValue = ((groupName == null) ? "" : (groupName + "-")) + this.attributes.getValue(keyAttr); - } - - // set the children list - if(elementNode.hasChildNodes()) - { - NodeList childList = elementNode.getChildNodes(); - int numChildren = childList.getLength()/2; - this.children = new ArrayList(numChildren); - int idx = 0; - for(int i=0; i<childList.getLength(); ++i) - { - // each node returned from item(i) is an Attr - Node childNode = childList.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) - { - this.children.add(idx++, new AConfigNode(this, childNode, this.layer+1, configObject)); - } - } - } - } - - /** - * @return Returns the nodeName. - */ - public String getNodeName() - { - return this.nodeName; - } - - /** - * @return Returns the fullNodeName. - */ - public String getFullNodeName() - { - return this.fullNodeName; - } - - /** - * @return Returns the parent. - */ - public AConfigNode getParent() - { - return this.parent; - } - - /** - * @return Returns the children. - */ - public List getChildren() - { - return this.children; - } - - /** - * @return Returns the keyValue. - */ - public String getKeyValue() - { - return this.keyValue; - } - - /** - * @return Returns the string value of the specified attribute name, - * or null if not found. - */ - public String getAttValue(String name) - { - if(this.attributes != null) - return this.attributes.getValue(name); - else - return null; - } - - public String setAttValue(String name, String value) - { - return this.attributes.putValue(name, value); - } - - // the start line of this xml node - // e.g. <Nodename att1="value1" att2="value2"> - private String selfStartString() - { - StringBuffer str = new StringBuffer(); - for(int i=0; i<this.layer; ++i) - { - str.append("\t"); - } - str.append("<"); - str.append(this.nodeName); - if(this.attributes != null) - { - Set attSet = this.attributes.keySet(); - Iterator it = attSet.iterator(); - while(it.hasNext()) - { - String attName = it.next().toString(); - String attValue = this.attributes.getValue(attName); - str.append(" "); - str.append(attName); - str.append("=\""); - str.append(attValue); - str.append("\""); - } - } - if(this.children == null) - { - str.append("/>"); - } - return str.toString(); - } - - private String selfEndString() - { - StringBuffer str = new StringBuffer(); - if(this.children == null) - { - // if no children, use simplified format (<.../>) - // so selfStartString contains everything about this node - return ""; - } - else - { - for(int i=0; i<this.layer; ++i) - { - str.append("\t"); - } - str.append("</"); - str.append(this.nodeName); - str.append(">"); - } - return str.toString(); - } - - private String childrenString() - { - StringBuffer str = new StringBuffer(); - if(this.children == null) - { - return ""; - } - else - { - str.append(">\n"); - for(int i=0; i<this.children.size(); ++i) - { - AConfigNode child = (AConfigNode) this.children.get(i); - str.append(child.toString()); - str.append("\n"); - } - } - return str.toString(); - } - - /** - * Converts to a string representing the xml data containing this node and - * all its children. - */ - public String toString() - { - return selfStartString()+childrenString()+selfEndString(); - } - - // userExclusiveSection is noly under root node (layer 0) - public String toString(String userExclusiveSection) - { - if(this.layer == 0) - { - return selfStartString()+childrenString()+userExclusiveSection+selfEndString(); - } - else - { - return toString(); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/config/AConfigUpdater.java b/graphics/AtlantisJava/src/atlantis/config/AConfigUpdater.java deleted file mode 100644 index ee87efb78bcd..000000000000 --- a/graphics/AtlantisJava/src/atlantis/config/AConfigUpdater.java +++ /dev/null @@ -1,405 +0,0 @@ -package atlantis.config; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.io.InputStream; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import java.util.Iterator; - -import atlantis.utils.AUtilities; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; - - - -/** - * This class encapsulates a few static methods which ensure updating - * of the user's customised Atlantis configuration (or special Atlantis - * configurations) according to the base Atlantis configuration file - * configuration/config.xml - * - * Updating means synchronising special / customised configurations if - * XML elements were added/removed from the base configuration file while - * keeping unchanged specially defined user cuts, views, projections, etc. - * - * Methods in this class are also called by an external configuration - * synchronization tool, so methods should remain static, special treatment - * of logger, etc. - * - * @author - * Zdenek Maxa - initial update mechanism, creating this extra class, refactoring - * Qiang Lu - improved reliable updating mechanism as done in AConfig - * - */ -public final class AConfigUpdater -{ - // when AConfigUpdater is called from Atlantis code, logger would behave - // as configured there. If AConfigUpdater is called externally, logger - // should be initialised with default values from ALogger - private static ALogger logger = ALogger.getLogger(AConfigUpdater.class); - - - - - /** - * Methods creates checksum file (name in fileNameChk) of a given file - * (file name in fileName). - */ - public static void createChecksumFile(String fileName, String fileNameChk) - throws AAtlantisException - { - try - { - logger.debug("Creating checksum file " + fileNameChk + - " of a file " + fileName); - byte[] chk = calculateChecksum(fileName); - File fileChk = new File(fileNameChk); - OutputStream os = new FileOutputStream(fileChk); - os.write(chk); - os.close(); - } - catch(AAtlantisException ae) - { - String m = "Error while creating MD5 checksum file, reason: " + - ae.getMessage(); - throw new AAtlantisException(m); - } - catch(FileNotFoundException fnfe) - { - String m = "File not found exception: " + fnfe.getMessage(); - throw new AAtlantisException(m); - } - catch(IOException ioe) - { - String m = "I/O error while creating file " + fileNameChk; - throw new AAtlantisException(m); - } - - } // createChecksumFile() ----------------------------------------------- - - - - /** - * Calculates checksum of a file fileName. - */ - private static byte[] calculateChecksum(String fileName) - throws AAtlantisException - { - InputStream fis = null; - try - { - logger.debug("Calculating checksum of file: " + fileName); - fis = AUtilities.getFileAsStream(fileName); - } - catch(AAtlantisException ae) - { - throw ae; - } - - MessageDigest complete = null; - - try - { - byte[] buffer = new byte[1024]; - complete = MessageDigest.getInstance("MD5"); - int numRead; - do - { - numRead = fis.read(buffer); - if (numRead > 0) - { - complete.update(buffer, 0, numRead); - } - } while (numRead != -1); - - fis.close(); - } - catch(IOException ioe) - { - throw new AAtlantisException("Error while reading data from file " + - fileName); - } - catch(NoSuchAlgorithmException nsae) - { - throw new AAtlantisException(nsae.getMessage()); - } - - logger.debug("Checksum calculated."); - return complete.digest(); - - } // calculateChecksum() ------------------------------------------------ - - - - /** - * Method checks the checksum of input file fileName if its checksum matches - * checksum stored in the checksum file fileNameChk. - * Return true if matches, false otherwise. - */ - public static boolean compareChecksums(String fileName, String fileNameChk) - throws AAtlantisException - { - boolean result = false; - try - { - // checksum of the input file - byte[] inputFileChecksum = calculateChecksum(fileName); - // checksum to read stored checksum from file fileNameChk - // assume the lenght is the same as of the input data file - byte[] storedChecksum = new byte[inputFileChecksum.length]; - File fileChk = new File(fileNameChk); - InputStream is = new FileInputStream(fileChk); - is.read(storedChecksum); - - // compare both checksums - if(new String(storedChecksum).equals(new String(inputFileChecksum))) - { - result = true; - } - else - { - result = false; - } - - is.close(); - } - catch(Exception e) - { - String m = "Error while checking MD5 checksum file, reason: " + - e.getMessage(); - throw new AAtlantisException(m); - } - - return result; - - } // compareChecksums() ------------------------------------------------- - - - - /** - * @param distConfig - configuration instance from Atlantis distribution - * (master copy) - * @param userConfig - user's customised or special configuration which - * gets updated according to distribution configuration - */ - private static void updateConfiguration(AConfig distConfig, AConfig userConfig) - { - logger.debug("Updating customised configuration ..."); - Iterator distIt = distConfig.getIterator(); - while(distIt.hasNext()) - { - // For each key node (keyValue is not empty) inside distConfig, - // test if there is a same node in userConfig. - AConfigNode testDistNode = (AConfigNode) distIt.next(); - if(testDistNode.getKeyValue() != null) - { - AConfigNode matchUserNode = userConfig.find(testDistNode); - if(matchUserNode != null) - { - // update testDistNode based on matchUserNode - updateNode(distConfig, testDistNode, matchUserNode); - } - } - } - - logger.debug("Update finished."); - - } // updateConfiguration() ---------------------------------------------- - - - - /** - * Update a node from configuration. - */ - private static void updateNode(AConfig distConfig, - AConfigNode distNode, AConfigNode userNode) - { - String[] attStrArray = null; - if("Canvas".equals(distNode.getNodeName())) - { - attStrArray = AConfig.CANVAS_ATT; - } - else if("UsedWindow".equals(distNode.getNodeName())) - { - attStrArray = AConfig.WINDOW_ATT; - } - else if("Layout".equals(distNode.getNodeName())) - { - attStrArray = AConfig.LAYOUT_ATT; - } - else - { - //check the parent Group values - if(distNode.getParent().getNodeName().equals("Group")){ - attStrArray = AConfig.GROUP_ATT; - //update the value - for(int i = 0; i < attStrArray.length; ++i) - { - String att = attStrArray[i]; - String distValue = distNode.getParent().getAttValue(att); - String userValue = userNode.getParent().getAttValue(att); - - if(distValue != null && userValue != null && !distValue.equals(userValue)) - { - if(distConfig.validate(distNode.getParent(), att, userValue)) - { - distNode.getParent().setAttValue(att, userValue); - } - } - } - } - - //now update parameters inside the Group - attStrArray = AConfig.PAR_ATT; - } - - // update the value - for(int i = 0; i < attStrArray.length; ++i) - { - String att = attStrArray[i]; - String distValue = distNode.getAttValue(att); - String userValue = userNode.getAttValue(att); - if(distValue != null && userValue != null && !distValue.equals(userValue)) - { - if(distConfig.validate(distNode, att, userValue)) - { - distNode.setAttValue(att, userValue); - } - } - } - - } // updateNode() ------------------------------------------------------- - - - - private static void writeUpdatedConfigurationFile(AConfig distConfig, - AConfig userConfig, - String filename) - throws Exception - { - FileOutputStream fo = null; - fo = new FileOutputStream(filename); - String updatedConfiguration = distConfig.convertToString(userConfig); - fo.write(updatedConfiguration.getBytes()); - fo.close(); - - } // writeUpdatedConfigurationFile() ------------------------------------ - - - - /** - * Updates customised configuration file to be consistent with the - * distribution configuration file. - * @param fileNameDist - distribution configuration file path - * @param fileNameCustom - customised configuration file path - * @throws AAException - */ - public static void updateConfigurationFile(String fileNameDist, - String fileNameCustom) - throws AAtlantisException - { - - logger.info("Updating configuration - master " + - "configuration: " + fileNameDist); - logger.info("Updating configuration - customised (being updated) " + - "configuration: " + fileNameCustom); - - AConfig distConfig = null; - AConfig customConfig = null; - - // read master (distribution) and customised configurations - try - { - distConfig = new AConfig(fileNameDist, false); // false - is not customised - } - catch(Exception e) - { - // these however seem to be never thrown because of AXMLErrorHandler - // in AConfig - String m = "Could not read/parse distribution configuration " + - fileNameDist + " reason: " + e.getMessage(); - throw new AAtlantisException(m); - } - - try - { - customConfig = new AConfig(fileNameCustom, true); // true - is customised - } - catch(Exception e) - { - // these however seem to be never thrown because of AXMLErrorHandler - // in AConfig - String m = "Could not read/parse customised configuration " + - fileNameCustom + " reason: " + e.getMessage(); - throw new AAtlantisException(m); - } - - - // actual update - try - { - updateConfiguration(distConfig, customConfig); - } - catch(Throwable t) - { - String m = "Updating customised configuration failed, reason: " + - t.getMessage(); - logger.debug(m, t); - throw new AAtlantisException(m); - } - - - // write updated data, first create backup of the source file - - logger.info("Creating backup of the customised configuration file ..."); - // file name to backup (rename) the file to - String fileNameUserBackup = fileNameCustom + "-backup_on_" + - AUtilities.getDateTimeString(); - File fileCustom = new File(fileNameCustom); - File fileBackup = new File(fileNameUserBackup); - boolean renameResult = fileCustom.renameTo(fileBackup); - if(! renameResult) - { - String m = "Could not backup customised configuration " + - "file, updating configuration failed."; - - // if fileNameDist path starts with "//", then it is run from within - // JAR archive via webstart. update process can't be performed in this - // case - can't create a backup copy of the fileNameCustom (and can't - // create an updated file when all is packed in a single JAR file either) - if(fileNameDist.startsWith("//")) - { - m += " Running via webstart, update can't be perfomed in this mode."; - } - throw new AAtlantisException(m); - } - logger.info(fileNameCustom + " backup created: " + fileNameUserBackup); - - - try - { - writeUpdatedConfigurationFile(distConfig, customConfig, - fileNameCustom); - } - catch(Throwable t) - { - String m = "Saving updated customised configuration into file " + - "failed, reason: " + t.getMessage(); - logger.debug(m, t); - throw new AAtlantisException(m); - } - - - logger.info(fileNameCustom + " configuration was successfully updated."); - - } // updateConfigurationFile() ------------------------------------------ - - -} // class AConfigUpdater =================================================== \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/config/ADefaultValues.java b/graphics/AtlantisJava/src/atlantis/config/ADefaultValues.java deleted file mode 100755 index b2e764499cd2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/config/ADefaultValues.java +++ /dev/null @@ -1,206 +0,0 @@ -package atlantis.config; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Hashtable; -import java.util.Enumeration; -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -import atlantis.globals.AGlobals; -import atlantis.utils.ALogger; - -/** - * The class maintains a few values which are to be remembered - * from session to session. The class tries to read in values from runtime - * configuration file $HOME/.Atlantis-runtime_values.txt. The values are - * stored in a Hashtable and are used as default initialize values. This - * Hashtable is updated whenever user changes these values. Values are - * into file at the end of Atlantis session. - * - * TODO: - * last used geometry (will be simpler when TB mode (and Atlantis.mode in - * general is discontinued), geometry names will be considered - * after '_' up to the file extension (.xml) - * last event file - * - * @author Zdenek Maxa - */ -public class ADefaultValues -{ - // file where the cross-session runtime values are stored - public static final String CONFIGFILE = System.getProperty("user.home") + - System.getProperty("file.separator") + - ".Atlantis-runtime_values.txt"; - // main attribute which holds all data - private static Hashtable v = new Hashtable(); - - private static ALogger logger = ALogger.getLogger(ADefaultValues.class); - - private ADefaultValues() {} - - - - /** - * Variables controled by this class and their default values if the - * runtime config does not exist or if some values are missing in the file. - */ - private static void setDefaultValues() - { - String FILE_SEPAR = System.getProperty("file.separator"); - String homeDirectory = AGlobals.instance().getHomeDirectory(); - v.put("LastEventFilesSourceDir", homeDirectory + "events" + FILE_SEPAR); - v.put("LastEventFilesSaveDir", homeDirectory); - v.put("LastCanvasPlotSaveDir", homeDirectory); - v.put("JiveXMLServerName", ""); - v.put("JiveXMLServerPort", "48965"); - v.put("GeometryName", ""); - - } // setDefaultValues() ------------------------------------------------- - - - - private static Hashtable readRuntimeConfigFile() - { - Hashtable helpTable = null; - String line = null; - String[] l = null; - String patternLine = ".*=.*"; - Pattern pattern = Pattern.compile(patternLine); - - try - { - BufferedReader in = new BufferedReader(new FileReader(CONFIGFILE)); - helpTable = new Hashtable(); - logger.info("Atlantis runtime configuration file: " + CONFIGFILE); - - while((line = in.readLine()) != null) - { - Matcher matcher = pattern.matcher(line); - if(matcher.matches()) - { - l = line.split("="); - if(l != null && l.length == 2) - { - logger.debug("Configuration value: " + - l[0] + " : " + l[1] + " read in"); - - // remove quotes - l[1] = l[1].replaceAll("\"", ""); - helpTable.put(l[0].trim(), l[1].trim()); - } - else - { - logger.warn("Line: " + line + " from runtime " + - "configuration file: " + CONFIGFILE + - " does not match, line is ignored"); - } - } - } // while - - // file is successfully read in a helper Hash table - in.close(); - - return helpTable; - - } // try - catch(FileNotFoundException ex) - { - logger.warn("Runtime configuration file: " + CONFIGFILE + - " not found, using default runtime values"); - } - catch(IOException ex) - { - logger.error("I/O error while reading " + CONFIGFILE + - " file, using default runtime values"); - } - - return null; - - } // readRuntimeConfigFile() -------------------------------------------- - - - - public static void readRuntimeValues() - { - setDefaultValues(); - Hashtable help = readRuntimeConfigFile(); - if(help != null) - { - for(Enumeration e = v.keys() ; e.hasMoreElements() ;) - { - String s = (String) e.nextElement(); - if(help.containsKey(s)) - { - // keys match, update the value - v.remove(s); - v.put(s, help.get(s)); - } - } - } - - } // readRuntimeValues() ------------------------------------------------ - - - - public static void saveRuntimeValues() - { - try - { - // if exists, shall be overwritten - BufferedWriter out = new BufferedWriter(new FileWriter(CONFIGFILE)); - - for(Enumeration e = v.keys() ; e.hasMoreElements() ;) - { - String s = (String) e.nextElement(); - out.write(s + " = \"" + v.get(s) + "\"\n"); - } - out.close(); - } - catch(IOException ex) - { - logger.error("Can't open " + CONFIGFILE + " for writing, runtime " + - "configuration values not saved"); - } - - } // saveRuntimeValues() ------------------------------------------------ - - - - public static String get(String key) - { - if(v.containsKey(key)) - { - return(String) v.get(key); - } - else - { - logger.warn("Runtime configuration value: " + key + " does not exist", new Exception()); - return null; - } - - } // get() -------------------------------------------------------------- - - - - public static void set(String key, String value) - { - if(v.containsKey(key)) - { - v.remove(key); - v.put(key, value); - } - else - { - logger.warn("Runtime configuration value: " + key + " does not exist", new Exception()); - } - - } // set() -------------------------------------------------------------- - - - -} // class ADefaultValues =================================================== diff --git a/graphics/AtlantisJava/src/atlantis/config/package.html b/graphics/AtlantisJava/src/atlantis/config/package.html deleted file mode 100644 index 96bd70b4cacf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/config/package.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<p>Classes for handling the configuration file and its contents.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/data/A3DPointData.java b/graphics/AtlantisJava/src/atlantis/data/A3DPointData.java deleted file mode 100755 index b4354b3e564f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/A3DPointData.java +++ /dev/null @@ -1,254 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.*; -import atlantis.utils.*; - - -public abstract class A3DPointData extends AHitData { - - protected float[] rho; - protected float[] phi; - protected float[] z; - protected float[] x; - protected float[] y; - - - A3DPointData(AHashMap p, AEvent e) { - super(p,e); - if(p.get("x")!=null) { - x=p.getFloatArray("x"); - y=p.getFloatArray("y"); - z=p.getFloatArray("z"); - rho=new float[numData]; - phi=new float[numData]; - - // this is needed for the moment so that S3D sub and layer can be - // calculated from rph,phi,z rho phi from x y - for(int i=0; i<rho.length; ++i) { - double dx=x[i]; - double dy=y[i]; - - rho[i]=(float)(Math.sqrt(dx*dx+dy*dy)); - phi[i]=(float)(Math.atan2(dy, dx)); - if(phi[i]<0.) phi[i]+=AMath.TWO_PI; - } - } else { - rho=p.getFloatArray("rho"); - phi=p.getFloatArray("phi"); - z=p.getFloatArray("z"); - x=new float[numData]; - y=new float[numData]; - calculateXY(rho, phi, x, y); - } - } - - - public float[] getRho() - { - return rho; - } - - - public float[] getPhi() - { - return phi; - } - - - public float[] getX() - { - return x; - } - - - public float[] getY() - { - return y; - } - - - public float[] getZ() - { - return z; - } - - - protected void calculateRhoPhi() - { - calculateRhoPhi(x, y, rho, phi); - } - - protected ACoord getYXUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=x[list]; - v[i]=y[list]; - index[i]=list; - } - return new ACoord(h, v, index, this); - } - - protected ACoord getRZUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - if(phiMid>AMath.TWO_PI) phiMid-=AMath.TWO_PI; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=z[list]; - double phiDiff=Math.abs(phi[list]-phiMid); - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - { - v[i] = rho[list]; - } - else - { - v[i] = -rho[list]; - } - index[i]=list; - - } - return new ACoord(h, v, index, this); - } - - protected ACoord getXZUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - double phi0=Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0=Math.cos(phi0); - double sinPhi0=Math.sin(phi0); - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=z[list]; - v[i]=x[list]*cosPhi0+y[list]*sinPhi0; - index[i]=list; - } - return new ACoord(h, v, index, this); - } - - protected ACoord getYZUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - double phi0=Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0=Math.cos(phi0); - double sinPhi0=Math.sin(phi0); - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=z[list]; - v[i]=y[list]*cosPhi0-x[list]*sinPhi0; - index[i]=list; - } - return new ACoord(h, v, index, this); - } - - protected ACoord get3DUser() { - makeDrawList(); - double[][] hvo=AProjection3D.getRotated(numDraw, listdl, x, y, z); - double[] h=hvo[0]; - double[] v=hvo[1]; - int[] index=new int[numDraw]; - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - index[i]=list; - } - return new ACoord(h, v, index, this); - } - -// does not fit in normal scheme - public double[][] get3DPoints() { - makeDrawList(); - double[][] xyz =new double[numDraw][3]; - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - xyz[i][0]=x[list]; - xyz[i][1]=y[list]; - xyz[i][2]=z[list]; - } - return xyz; - } - -// does not fit in normal scheme - public int[] get3DPointsIndex() { - makeDrawList(); - int[] index=new int[numDraw]; - for(int i=0; i<numDraw; i++) - index[i]=listdl[i]; - return index; - } - - protected ACoord getFZUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=z[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FZ"); - } - - protected ACoord getFRUser() { - makeDrawList(); - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - h[i]=rho[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FR"); - } - - protected ACoord getVPUser() { - makeDrawList(); - // each point is drawn twice - int numTotal=2*numDraw; - double[] h=new double[numTotal]; - double[] v=new double[numTotal]; - int[] index=new int[numTotal]; - - double[] sign=new double[] {-1., 1.}; - int num=0; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - double eta=AParameterUtilities.eta(z[list], rho[list]); - double delEta=AProjectionVP.getDeltaEta(rho[list], z[list]); - for(int j=0; j<2; j++) { - h[num]=eta+sign[j]*delEta; - v[num]=AParameterUtilities.phi(x[list], y[list]); - index[num]=list; - num++; - } - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AAODData.java b/graphics/AtlantisJava/src/atlantis/data/AAODData.java deleted file mode 100644 index 8c412fd11398..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AAODData.java +++ /dev/null @@ -1,359 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.event.*; -import java.util.Vector; - -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -public abstract class AAODData extends AData -{ - protected float[] eta; - protected float[] phi; - protected float[] pT; - - AAODData(AHashMap p, AEvent e) - { - super(p,e); - eta = p.getFloatArray("eta"); - phi = p.getFloatArray("phi"); - pT = p.getFloatArray("pt"); - int[] pdgId = p.getUnsureIntArray("pdgId"); - if(pdgId != null) - { - for(int i=0; i<pT.length; i++) - pT[i] *= -AMath.getSign(pdgId[i]); - } - - if (p.get("clusterKey") != null) - { - int[] clusterLinkCount = p.getUnsureIntArray("clusterLinkCount"); - event.getAssociationManager().add(new AObjectsAssociation(getFullName(), "Cluster", - p.getStringArray("clusterKey"), p.getIntArray("clusterIndex"), clusterLinkCount, event)); - } - if (p.get("trackKey") != null) - { - int[] trackLinkCount = p.getUnsureIntArray("trackLinkCount"); - event.getAssociationManager().add(new AObjectsAssociation(getFullName(), "Track", - p.getStringArray("trackKey"), p.getIntArray("trackIndex"), trackLinkCount, event)); - } - } - - - public float getEta(int index) - { - return eta[index]; - } - - - public float getPhi(int index) - { - return phi[index]; - } - - - public float getPT(int index) - { - return pT[index]; - } - - - public float[] getEta() - { - return eta; - } - - - public float[] getPhi() - { - return phi; - } - - - public float[] getPT() - { - return pT; - } - - - protected int internalColor() - { - int colorFunction=parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction==0) - colorByConstant(); - else if(colorFunction==1) - colorByIndex(); - - return 1; - } - - public String getNameScreenName() - { - return getParameterGroup(); - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - protected void applyCuts() - { - cutIndex(); - cutPhi(phi); - cutEta(eta); - } - - // info on AOD data contained in V-Plot rubberband selection - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumP = 0.; - double sumPt = 0.; - - for (int i = 0; i < numDraw; ++i) - { - sumPt += Math.abs(pT[listdl[i]]); - sumP += Math.abs(pT[listdl[i]] / Math.cos(AMath.lambda(eta[listdl[i]]))); - } - - StringBuffer msg = new StringBuffer(""); - msg.append(numDraw); - msg.append(" "); - msg.append(getFullName()); - msg.append(" sum(PT) = "); - msg.append(String.format("%.1f", sumPt)); - msg.append(" sum(P) = "); - msg.append(String.format("%.1f",sumP)); - - return msg.toString(); - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP) - { - drawVP(window, ag, projection); - } - else - { - super.draw(window, ag, projection); - } - } - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - double dphi = Math.toRadians(0.5); - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - double cosPlus = Math.cos(phiPlus); - double sinPlus = Math.sin(phiPlus); - double cosMinus = Math.cos(phiMinus); - double sinMinus = Math.sin(phiMinus); - //same rhoMax/Minus values used in AJetData - double rhoMax = 1200; - double rhoMinus = 400; - //if no composite particles increase AOD size - Vector<String> keys = event.getCollections().get("CompositeParticle"); - if(keys == null || !parameterStore.get("Data", "CompositeParticle").getStatus()) - rhoMax=1200; - else if(PARAMETER_GROUP.equals("CompositeParticle")) - { - // display composite particle outside of normal AOD data - rhoMax=1200; - rhoMinus=800; - } - - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double rhoPlus = rhoMax; - double s = 10; - if(Math.abs(pT[list]) < maxEnergy) - rhoPlus = rhoMinus + (rhoMax - rhoMinus) * s *Math.abs(pT[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = rhoMinus * cosPlus; - hv[1][i][0] = rhoMinus * sinPlus; - // x1, y1 - hv[0][i][1] = rhoPlus * cosPlus; - hv[1][i][1] = rhoPlus * sinPlus; - // x2, y2 - hv[0][i][2] = rhoPlus * cosMinus; - hv[1][i][2] = rhoPlus * sinMinus; - // x3, y3 - hv[0][i][3] = rhoMinus * cosMinus; - hv[1][i][3] = rhoMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getFRUser() - { - ACoord coordFR = getYXUser().convertYXToFR().includePhiWrapAround("FR"); - return coordFR; - } - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - double dtheta = Math.toRadians(0.5); - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list]-phiMid); - double rSign; - if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) - rSign = -1; - else - rSign = 1; - - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta[list]))) * 2.0; - if ((eta[list] > 0.) && (rSign == -1)) - theta = 2 * Math.PI - theta; - else if ((eta[list] < 0.) && (rSign == -1)) - theta += Math.PI; - else if ((eta[list] < 0.) && (rSign == 1)) - theta = Math.PI - theta; - - double thetaPlus = theta + dtheta; - double thetaMinus = theta - dtheta; - double cosPlus = Math.cos(thetaPlus); - double sinPlus = Math.sin(thetaPlus); - double cosMinus = Math.cos(thetaMinus); - double sinMinus = Math.sin(thetaMinus); - - // decide the region based on the theta value - final byte TOP_BOTTOM = 0; - final byte LEFT_RIGHT = 1; - byte region = TOP_BOTTOM; - // hard-coded value is based on the values in Geometry - if(Math.abs(Math.tan(theta)) < 0.8) - region = LEFT_RIGHT; - - double radiusMinus = 0.; - switch(region) - { - case TOP_BOTTOM: - if(PARAMETER_GROUP.equals("CompositeParticle")) - radiusMinus = 750 / Math.abs(Math.sin(theta)); - else - radiusMinus = 550 / Math.abs(Math.sin(theta)); - break; - case LEFT_RIGHT: - if(PARAMETER_GROUP.equals("CompositeParticle")) - radiusMinus = 850 / Math.abs(Math.cos(theta)); - else - radiusMinus = 700 / Math.abs(Math.cos(theta)); - break; - } - //same rhoMax/Minus values used in AJetData - double radiusMax = radiusMinus + 500; - //if no composite particles increase AOD size - Vector keys = (Vector) event.getCollections().get("CompositeParticle"); - if(keys == null || !parameterStore.get("Data", "CompositeParticle").getStatus()) - radiusMax+=200; - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double radiusPlus = radiusMax; - double s = 10; - if(Math.abs(pT[list]) < maxEnergy) - radiusPlus = radiusMinus + (radiusMax - radiusMinus) * s * Math.abs(pT[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = radiusMinus * cosPlus; - hv[1][i][0] = radiusMinus * sinPlus; - // x1, y1 - hv[0][i][1] = radiusPlus * cosPlus; - hv[1][i][1] = radiusPlus * sinPlus; - // x2, y2 - hv[0][i][2] = radiusPlus * cosMinus; - hv[1][i][2] = radiusPlus * sinMinus; - // x3, y3 - hv[0][i][3] = radiusMinus * cosMinus; - hv[1][i][3] = radiusMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getVPUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - h[i]=eta[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - private void drawVP(AWindow window, AGraphics ag, AProjection2D projection) - { - ACoord centers = window.calculateDisplay(getUser(projection)); - int[] drawlist = centers.index; - double eLimit = 0.025; - int numPoints = 25; - if(PARAMETER_GROUP.equals("CompositeParticle")) - numPoints = 5; - double[][][] hv = new double[2][drawlist.length][numPoints]; //circle - // a cross at centre - double[][][] hv_cross1 = new double[2][drawlist.length][2]; - double[][][] hv_cross2 = new double[2][drawlist.length][2]; - int crossLength = 6; - - for(int i=0; i<drawlist.length; ++i) - { - int list = drawlist[i]; - double e; - e = Math.abs(pT[list]); - int d = (int)(Math.sqrt((e/eLimit)/Math.PI)); - if(d == 0) d = 1; - for(int j=0; j<numPoints; j++) - { - hv[0][i][j]=centers.hv[0][0][i]+d*Math.cos(Math.PI*2*j/(numPoints-1)); - hv[1][i][j]=centers.hv[1][0][i]+d*Math.sin(Math.PI*2*j/(numPoints-1)); - } - for(int j=0; j<2; j++) - { - hv_cross1[0][i][j]=centers.hv[0][0][i]+crossLength/2*Math.cos(Math.PI*(1+4*j)/4); - hv_cross1[1][i][j]=centers.hv[1][0][i]+crossLength/2*Math.sin(Math.PI*(1+4*j)/4); - hv_cross2[0][i][j]=centers.hv[0][0][i]+crossLength/2*Math.cos(Math.PI*(3+4*j)/4); - hv_cross2[1][i][j]=centers.hv[1][0][i]+crossLength/2*Math.sin(Math.PI*(3+4*j)/4); - } - } - ag.draw(new ACoord(hv, drawlist, this, ACoord.POLYLINES)); - ag.draw(new ACoord(hv_cross1, drawlist, this, ACoord.POLYLINES)); - ag.draw(new ACoord(hv_cross2, drawlist, this, ACoord.POLYLINES)); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ABJetData.java b/graphics/AtlantisJava/src/atlantis/data/ABJetData.java deleted file mode 100755 index 7c047a26efa9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ABJetData.java +++ /dev/null @@ -1,134 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.A3Vector; -import atlantis.utils.A4Vector; - -/** - * Reconstructed B-Jet - */ -public class ABJetData extends AAODData -{ - private float[] lhSig; - private float[] weight; - private String[] label; - private float[] mass; - //Variable to ensure backwards compatability - protected boolean has4Vect = false; - - ABJetData(AHashMap p, AEvent e) - { - super(p,e); - lhSig=p.getFloatArray("lhSig"); - weight=p.getFloatArray("weight"); - label=p.getUnsureStringArray("label"); - if (p.get("mass") != null) { - mass=p.getFloatArray("mass"); - has4Vect = true; - } - } - - public String getParameterGroup() - { - return "BJet"; - } - - public float getweight(int index) - { - return weight[index]; - } - - public float getlhSig(int index) - { - return lhSig[index]; - } - - public String getLabel(int index) - { - return label[index]; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - if(has4Vect){ - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM(pT[k],eta[k],phi[k],mass[k]); - sum.add(start); - } - }else{ - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A3Vector start = A3Vector.fromRhoPhiZ(0., 0., 0.); - double tL = AMath.tanLambda(eta[k]); - A3Vector stop = A3Vector.fromRhoPhiZ(1., phi[k], tL); - A3Vector v = (stop.subtract(start)).normalize(); - double p = pT[k] / Math.sqrt(1. - v.z * v.z); - sum.add(new A4Vector(v.scale(p), 0.)); - } - } - return sum; - } - - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsObjects", "BJetPt", " |ET|", pT); - cut("CutsObjects", "BJetlhSig", " |lhSig|", lhSig); - cut("CutsObjects", "BJetweight", " |weight|", weight); - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",phi[index])+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - if(label != null) - { - msg.append("\n label = "); - msg.append(label[index]); - } - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",phi[index])); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - msg.append("\n lhSig = "); - msg.append(lhSig[index]); - msg.append("\n weight = "); - msg.append(weight[index]); - - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ACSCDData.java b/graphics/AtlantisJava/src/atlantis/data/ACSCDData.java deleted file mode 100755 index d724dfe7fc75..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ACSCDData.java +++ /dev/null @@ -1,304 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; - -public class ACSCDData extends AMuonHitData -{ - private static final double CSC_TILT_ANGLE = Math.toRadians(-11.59); - - float[] charge; - float[] length; - int[] gasGap; - - private static ALogger logger = ALogger.getLogger(ACSCDData.class); - - public String getParameterGroup() - { - return "CSC"; - } - - public String getName() - { - return "CSCD"; - } - - public String getNameScreenName() - { - return "CSC Digits"; - } - - ACSCDData(AHashMap p, AEvent e) - { - super(p,e); - - if (p.get("length") != null) { - length=p.getFloatArray("length"); - } else { - // If no length is given, just use an arbitrary minimum length - length = new float[numData]; - for (int i=0; i<numData; i++) - length[i] = 10.f; - } - - charge=p.getFloatArray("charge"); - - gasGap = new int[numData]; - for (int i=0; i<numData; i++) { - try { - gasGap[i] = AIdHelper.cscWireLayer(id[i]); - } catch (AAtlantisException aex) { - gasGap[i] = 0; - } - } - } - - protected int getStation(int index) - { - return 0; - } - - protected int getSub(int index) - { - try { - if (AIdHelper.stationEta(id[index]) < 0) { - return 0; - } else { - return 1; - } - - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - } - - public int getSector(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(2) == 'L') { - return 2 * (AIdHelper.stationPhi(id[index]) - 1); - } else { - return 2 * (AIdHelper.stationPhi(id[index]) - 1) + 1; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding CSCD identifier", e); - } - - return 0; - } - - protected boolean getMeasuresPhi(int index) - { - try { - if (AIdHelper.cscMeasuresPhi(id[index]) == 1) { - return true; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding CSCD identifier", e); - } - - return false; - } - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsMuon", "Charge", " Charge", charge); - cutPhi(phi); - cutEta(rho, z); - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - protected ACoord getYXUser() - { - makeDrawList(); - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_MDT_INNER) - return ACoord.NO_DATA; - - AParameter cscGasGap = parameterStore.get("YX", "CSCGasGap"); - if (cscGasGap.getStatus()) - cutArray(gasGap, cscGasGap.getI(), "CSC Gas Gap"); - - double[][][] hv = new double[2][numDraw][2]; - int index[] = new int[numDraw]; - - try { - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - if (AIdHelper.cscMeasuresPhi(id[j]) == 1) { - double phi = Math.atan2(y[j], x[j]); - double rho = Math.sqrt(x[j]*x[j] + y[j]*y[j]); - double drho = length[j]/2.; - - hv[0][i][0] = (rho - Math.cos(CSC_TILT_ANGLE) * drho) * Math.cos(phi); - hv[1][i][0] = (rho - Math.cos(CSC_TILT_ANGLE) * drho) * Math.sin(phi); - hv[0][i][1] = (rho + Math.cos(CSC_TILT_ANGLE) * drho) * Math.cos(phi); - hv[1][i][1] = (rho + Math.cos(CSC_TILT_ANGLE) * drho) * Math.sin(phi); - } else { - double phi = Math.atan2(y[j], x[j]); - double rho = Math.sqrt(x[j]*x[j] + y[j]*y[j] + length[j]*length[j]/4.); - double dphi = Math.asin((length[j]/2.) / rho); - - hv[0][i][0] = rho * Math.cos(phi - dphi); - hv[1][i][0] = rho * Math.sin(phi - dphi); - hv[0][i][1] = rho * Math.cos(phi + dphi); - hv[1][i][1] = rho * Math.sin(phi + dphi); - } - } - - return new ACoord(hv, index, this); - } catch (AAtlantisException e) { - AOutput.append("Error decoding CSC identifier: " + e.getMessage(), ALogInterface.BAD_COMMAND); - return ACoord.NO_DATA; - } - } - - protected ACoord getFRUser() - { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - protected ACoord getXZRZUser(int sign[]) - { - double[][][] hv = new double[2][numDraw][]; - int index[] = new int[numDraw]; - - try { - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - double rho = Math.sqrt(x[j]*x[j] + y[j]*y[j]); - - if (AIdHelper.cscMeasuresPhi(id[j]) == 1) { - double drho = length[j]/2.; - if(z[j] < 0){ - hv[0][i] = new double[] {z[j] - sign[i]*Math.sin(CSC_TILT_ANGLE) * drho, - z[j] + sign[i]*Math.sin(CSC_TILT_ANGLE) * drho }; - - hv[1][i] = new double[] { sign[i] * (rho + sign[i]*Math.cos(CSC_TILT_ANGLE) * drho), - sign[i] * (rho - sign[i]*Math.cos(CSC_TILT_ANGLE) * drho) }; - - }else{ - hv[0][i] = new double[] {z[j] - Math.sin(CSC_TILT_ANGLE) * drho, - z[j] + Math.sin(CSC_TILT_ANGLE) * drho }; - - - hv[1][i] = new double[] { sign[i] * (rho - Math.cos(CSC_TILT_ANGLE) * drho), - sign[i] * (rho + Math.cos(CSC_TILT_ANGLE) * drho) }; - } - - - - } else { - hv[0][i] = new double[] { z[j] }; - hv[1][i] = new double[] { sign[i] * rho }; - } - - } - - return new ACoord(hv, index, this); - } - catch (AAtlantisException e) { - AOutput.append("Error decoding CSC identifier: " + e.getMessage(), ALogInterface.BAD_COMMAND); - return ACoord.NO_DATA; - } - - } - - - - - protected ACoord getXZUser() { - makeDrawList(); - cutMuonSector(sector); - - int[] sign = new int[numDraw]; - int sect = (int) Math.round(parameterStore.get("XZ", "Phi").getD() / 22.5); - - for(int i=0; i<numDraw; i++) { - if (sector[listdl[i]] == sect) - sign[i] = 1; - else - sign[i] = -1; - } - - return getXZRZUser(sign); - } - - protected ACoord getRZUser() { - makeDrawList(); - - int[] sign = new int[numDraw]; - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - sign[i] = AParameterUtilities.getRhoSign(x[j], y[j]); - } - - return getXZRZUser(sign); - } - - protected ACoord getFZUser() - { - double[][][] hv = new double[2][numDraw][]; - int index[] = new int[numDraw]; - - try { - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - double rho = Math.sqrt(x[j]*x[j] + y[j]*y[j]); - double phi = Math.toDegrees(Math.atan2(y[j], x[j])); - - if (AIdHelper.cscMeasuresPhi(id[j]) == 1) { - double drho = length[j]/2.; - - hv[0][i] = new double[] { z[j] - Math.sin(CSC_TILT_ANGLE) * drho, - z[j] + Math.sin(CSC_TILT_ANGLE) * drho }; - hv[1][i] = new double[] { phi, phi }; - } else { - double dphi = Math.toDegrees(Math.atan2(length[j]/2., rho)); - - hv[0][i] = new double[] { z[j], z[j] }; - hv[1][i] = new double[] { phi-dphi, phi+dphi }; - } - } - - return new ACoord(hv, index, this); - } catch (AAtlantisException e) { - AOutput.append("Error decoding CSCD identifier: " + e.getMessage(), ALogInterface.BAD_COMMAND); - return ACoord.NO_DATA; - } - } - - // only constant color possible for the strips - protected int internalColor() - { - int constantColor=parameterStore.get(PARAMETER_GROUP, "Strip").getI(); - for(int i=0; i<numData; i++) - color[i]=(byte)constantColor; - return 0; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ACSCData.java b/graphics/AtlantisJava/src/atlantis/data/ACSCData.java deleted file mode 100755 index 5149a5133bd3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ACSCData.java +++ /dev/null @@ -1,197 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; - -public class ACSCData extends AMuonHitData -{ - float[] sigma; - - private static ALogger logger = ALogger.getLogger(ACSCData.class); - - public String getParameterGroup() - { - return "CSC"; - } - - public String getName() - { - return "CSC"; - } - - public String getNameScreenName() - { - return "CSC"; - } - - ACSCData(AHashMap p, AEvent e) - { - super(p,e); - sigma=p.getFloatArray("sigma"); - } - - protected int getStation(int index) - { - return 0; - } - - protected int getSub(int index) - { - try { - if (AIdHelper.stationEta(id[index]) < 0) { - return 0; - } else { - return 1; - } - - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - } - - public int getSector(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(2) == 'L') { - return 2 * (AIdHelper.stationPhi(id[index]) - 1); - } else { - return 2 * (AIdHelper.stationPhi(id[index]) - 1) + 1; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding CSC identifier", e); - } - - return 0; - } - - protected boolean getMeasuresPhi(int index) - { - try { - if (AIdHelper.cscMeasuresPhi(id[index]) == 1) { - return true; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding CSC identifier", e); - } - - return false; - } - - protected void applyCuts() - { - super.applyCuts(); - cutPhi(phi); - cutEta(rho, z); - } - - protected ACoord getYXUser() - { - makeDrawList(); - int mode=parameterStore.get("YX", "Mode").getI(); - if(mode!=5) - numDraw=0; - - double[] h=new double[numDraw]; - double[] v=new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - h[i]=x[list]; - v[i]=y[list]; - index[i]=list; - } - return new ACoord(h, v, index, this); - } - - protected ACoord getXZRZUser(int[] sign) - { - int numPoints=2; - - double[][][] hv=new double[2][numDraw][numPoints]; - int[] index=new int[numDraw]; - - // space point resolution is 60um in rz and 5mm in rphi (due to no uniform b field) - // from muonTDR page 201 - // double dRho=0.254; - // double dZMax=1.25; - - double alpha=-11.59; - double sinAlphaCopy=Math.sin(Math.toRadians(alpha)); - double cosAlphaCopy=Math.cos(Math.toRadians(alpha)); - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - - double rMid=sign[i]*getSectorRho(sector[list], rho[list], phi[list]); - double zMid=z[list]; - // double dZ = 2. * dZMax * Math.min(charge[list] / (25. * 75000.), 0.9); - double dRho=sigma[list]; - - double sinAlpha=sinAlphaCopy; - double cosAlpha=cosAlphaCopy; - - if(zMid>0.) - cosAlpha*=-1.; - if(rMid<0.) - sinAlpha*=-1.; - - hv[0][i][0]=zMid-sinAlpha*dRho; - hv[0][i][1]=zMid+sinAlpha*dRho; - hv[1][i][0]=rMid+cosAlpha*dRho; - hv[1][i][1]=rMid-cosAlpha*dRho; - index[i]=list; - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - protected int getDrawOrFill() - { - return AGraphics.DRAW; - } - - protected ACoord getRZUser() - { - makeDrawList(); - int[] sign=new int[numDraw]; - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for(int i=0; i<numDraw; i++) - { - double phiDiff=Math.abs(phi[listdl[i]]-phiMid); - - sign[i]=-1; - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - sign[i]=1; - } - return getXZRZUser(sign); - } - - protected ACoord getXZUser() - { - makeDrawList(); - cutMuonSector(sector); - int[] sign=new int[numDraw]; - int sect=(int)Math.round(parameterStore.get("XZ", "Phi").getD() / 22.5); - - for(int i=0; i<numDraw; i++) - { - sign[i]=1; - if(sector[listdl[i]]!=sect) - sign[i]=-1; - } - return getXZRZUser(sign); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ACalorimeterData.java b/graphics/AtlantisJava/src/atlantis/data/ACalorimeterData.java deleted file mode 100644 index e82e3d4a07ef..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ACalorimeterData.java +++ /dev/null @@ -1,2662 +0,0 @@ -package atlantis.data; - -import atlantis.event.AEvent; -import java.awt.Color; -import java.util.Vector; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.ADrawCalorimeterSummedEndcaps; -import atlantis.canvas.ALegendWindow; -import atlantis.canvas.AWindow; -import atlantis.event.AData; -import atlantis.geometry.ABarrelCalorimeterDetector; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.geometry.AEndcapCalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.ADrawnGraphics2D; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.utils.APolygon; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; - -/** - * The superclass of all the ATLAS calorimeters. Contains also methods for - * drawing groups of calorimeters together. Calorimeters can not be drawn - * individually due to coupling of energy scale and the standard v-plot picture. - * Each calorimeter also provides histograms. - * - * @author Eric Jansen - */ -public abstract class ACalorimeterData extends AHitData implements AHistogramData -{ - private static ALogger logger = ALogger.getLogger(ACalorimeterData.class); - - // Constants as defined in the configuration file. - // Energy mode options. - public static final int ENERGY_MODE_SUM_LIN = 0; - public static final int ENERGY_MODE_MAX_LIN = 1; - public static final int ENERGY_MODE_SUM_LOG = 2; - public static final int ENERGY_MODE_MAX_LOG = 3; - public static final int ENERGY_MODE_SUM_SQRT = 4; - public static final int ENERGY_MODE_MAX_SQRT = 5; - - // Energy calibration options. - public static final int ENERGY_CALIB_UNKNOWN = -1; - public static final int ENERGY_CALIB_OVERALL = 0; - public static final int ENERGY_CALIB_BY_TYPE = 1; - public static final int ENERGY_CALIB_BY_CALO = 2; - - // Color functions. - public static final int COLOR_FUNC_CONSTANT = 0; - public static final int COLOR_FUNC_SUBDET = 1; - public static final int COLOR_FUNC_CLUSTER = 2; - public static final int COLOR_FUNC_SAMPLING = 3; - public static final int COLOR_FUNC_ENERGY = 4; - public static final int COLOR_FUNC_JET = 5; - public static final int COLOR_FUNC_TYPE = 6; - public static final int COLOR_FUNC_TIME = 7; - - private static final float SCALE_FACTOR_VPLOT = 20; - - public String CALORIMETER_NAME; - - // Properties needed for the histograms. - protected double innerR; - protected double outerR; - protected double innerZ; - protected double outerZ; - protected double outerEta; - - protected double phiGranularity = 0.0; - protected double etaGranularity = 0.0; - protected AParameter histoScale; - - // This constant contains the highest phi or eta index for this data type. - // Its value determines the amount of memory that is allocated for certain - // data structures. - protected short MAX_HIT_INDEX = 512; - protected static final double NON_SCALING_FACTOR = 0.85; - - protected float[] phi; - protected float[] eta; - protected float[] dphi; - protected float[] deta; - protected float[] energy; - protected float[] et; - protected float[] etSum; - - // Et is more useful than pure Energy, so use Et to replace Energy - // protected float[] energySum; - - protected byte[] side; - protected short[] etaIndex; - protected short[] phiIndex; - protected int[] sampling; - protected short[] detector; - - private int[][] cellTable; - - protected double minDensityECAL; - protected double maxDensityECAL; - protected double minDensityHCAL; - protected double maxDensityHCAL; - - // following attributes occur at majority of calorimeter subdetectors - // which inherit from here, but not at all of them (TILE is usually - // the exception), checks are always done, so it's save ; - // retrieving the data from XML is pre-checked so that not to spit out - // unnecessary complaints - protected int[] feedThrough = null; - protected int[] channel = null; - protected int[] slot = null; - protected int[] BadCell = null; - - - ACalorimeterData(AHashMap p, AEvent e) - { - super(p,e); - - CALORIMETER_NAME = getName(); - - energy = p.getFloatArray("energy"); - et = new float[numData]; - - phi = new float[numData]; - eta = new float[numData]; - deta = new float[numData]; - dphi = new float[numData]; - - // energySum = new float[numData]; - etSum = new float[numData]; - - side = new byte[numData]; - etaIndex = new short[numData]; - phiIndex = new short[numData]; - sampling = new int[numData]; - detector = new short[numData]; - - histoScale = parameterStore.get(CALORIMETER_NAME, "HistoScale"); - - // using AHashMap.getUnsureIntArray() does not complain if key is - // not found - these parameters may not be present in all calorimetry - // classes inherited from ACalorimeterData and using this call - // also covers backwards compatibility, and is safe - null is returned - // if key does not exist - feedThrough = p.getUnsureIntArray("feedThrough"); - channel = p.getUnsureIntArray("channel"); - slot = p.getUnsureIntArray("slot"); - BadCell = p.getUnsureIntArray("BadCell"); - - } - - /** - * Get the name used for associating this datatype/collection. For the - * calorimeter cells no storegate key is used. - * @return - */ - public String getFullName() { - return getName(); - } - - /** - * getADCCountsData() - * reads in adcCounts array from XML data. This method is currently used - * for LAr, FCAL, HEC and MBTS (TILE has two adcCounts arrays) - * @param p AHashMap - */ - protected int[][] getADCCountsData(AHashMap p) - { - int[][] adcCounts = null; - int[] adc = (p.get("adcCounts") != null) ? p.getIntArray("adcCounts") : null; - if(adc != null) - { - adcCounts = new int[numData][0]; - // multiple numbers are associated with each cell - int multiple = adc.length / numData; - int num = 0; - for(int i = 0; i < numData; i++) - { - adcCounts[i] = new int[multiple]; - for (int j = 0; j < multiple; j++) - { - adcCounts[i][j] = adc[num]; // fill in array for each cell - num++; - } - } - } // if(adc != null) - - return adcCounts; - - } // getADCCountsData() ------------------------------------------------- - - - - /** - * Class used to merge ACoord[] objects. - */ - public static class ACoordArray - { - private Vector<ACoord> v = new Vector<ACoord>(); - - public void add(ACoord[] c) - { - for (int i = 0; i < c.length; i++) - { - v.addElement(c[i]); - } - } - - public ACoord[] getArray() - { - ACoord[] c = new ACoord[v.size()]; - for (int i = 0; i < v.size(); i++) - { - c[i] = (ACoord) v.elementAt(i); - } - return c; - } - } - - - - /** - * Assigns the hits to a geometry object. - */ - public void makeHitToGeometryMapping() - { - int numNotFound = 0; - - // In detector[] we store the hit-to-geometry object mapping. - for (int i = 0; i < numData; i++) - { - detector[i] = (short) ACalorimeterDetector.getDetectorIndex(id[i]); - - if (detector[i] >= 0) - { - eta[i] = (float) ACalorimeterDetector.get(detector[i]).getEta(etaIndex[i], side[i]); - deta[i] = (float) ACalorimeterDetector.get(detector[i]).getDeltaEta(); - phi[i] = (float) ACalorimeterDetector.get(detector[i]).getPhi(phiIndex[i]); - dphi[i] = (float) ACalorimeterDetector.get(detector[i]).getDeltaPhi(); - } - else if (!CALORIMETER_NAME.equals("FCAL")) - { - eta[i] = 0.0f; - deta[i] = 0.0f; - phi[i] = 0.0f; - dphi[i] = 0.0f; - numNotFound++; - } - } - if (numNotFound > 0) - { - System.err.println(numNotFound + "/" + numData + " cells in " + - CALORIMETER_NAME + " not mapped to a geometry object. These will not be drawn."); - } - - // This depends on the number of geometry objects. - cellTable = new int[2 * ACalorimeterDetector.count()][2 * MAX_HIT_INDEX]; - } - - /** - * Returns the name of the calorimeter this data object belongs to. - * - * @return calorimeter name - */ - public String getCalorimeterName() - { - return CALORIMETER_NAME; - } - - - /** - * Method is called from APickInteraction and plots pulse shapes plots - * for a cell when picked. - * @param index int - */ - public void plotPulseShapes(int index, boolean withcurve) { - int[][] adc = getADCCounts(index); - if (adc == null) { - logger.warn("Pulse shape plot requested but no adc data available"); - return; - } - - if (!withcurve) { - APulseShapePlot.plotADCCounts(adc, getPulseTitleString(index), null); - } else { - double[][] ps = getPulseShape(index); - if (ps == null) { - logger.warn("No pulse shape information available, just plotting adc instead"); - APulseShapePlot.plotADCCounts(adc, getPulseTitleString(index), null); - } else { - APulseShapePlot.plotRealPulseShapes(adc, ps, - getPulseStep(index), getPulseSubtitle(index), getPulseTitleString(index)); - } - } - } - - /** - * - */ - protected int[][] getADCCounts(int index) { return null; } - - protected double[][] getPulseShape(int index) { return null; } - - protected double getPulseStep(int index) { return 1.0; } - - protected String[] getPulseSubtitle(int index) { return null; } - - /** - * Returns calorimeter type (ECAL or HCAL) of a certain hit. - * - * @param index int hit index - * @return String calorimeter type - */ - public abstract String getCalorimeterType(int index); - - /** - * Returns the ACalorimeterDetector of a certain hit. - * - * @param index int hit index - * @return ACalorimeterDetector - */ - public ACalorimeterDetector getDetector(int index) { - return ACalorimeterDetector.get(detector[index]); - } - - /** - * Recalculates eta from r and z in case the user wants to have their eta - * with respect to the primary vertex instead of 0. The calculation is a - * little different from the other calorimeter classes because this one - * contains both barrel and endcap data. - * - * @param index int index of hit in data - * @return double eta value - */ - public double getEta(int index) - { - double r, z; - - if (!parameterStore.get("VP", "EtaVertex").getStatus() || detector[index] < 0) - { - return this.eta[index]; - } - - if (ACalorimeterDetector.get(detector[index]) instanceof ABarrelCalorimeterDetector) - { - r = ACalorimeterDetector.get(detector[index]).getR(); - z = r * AMath.tanLambda(eta[index]); - } - else - { - z = ACalorimeterDetector.get(detector[index]).getZ(); - r = z / AMath.tanLambda(eta[index]); - } - - return AParameterUtilities.eta(z, r); - } - - /** - * Returns the calorimeter sampling (or layer) of a certain hit. - * - * @param index int hit index - * @return int sampling/layer - */ - public int getSampling(int index) - { - return sampling[index]; - } - - /** - * Returns the side of the calorimeter of a certain hit. - * - * @param index int hit index - * @return int side - */ - public int getSide(int index) - { - return side[index]; - } - - /** - * Returns the cell size in eta of a certain hit. - * - * @param index int hit index - * @return double cell size in eta - */ - public double getdEta(int index) - { - return deta[index]; - } - - /** - * Returns the cell size in phi of a certain hit. - * - * @param index int hit index - * @return double cell size in phi - */ - public double getdPhi(int index) - { - return dphi[index]; - } - - /** - * Returns the phi coordinate of a certain hit. - * - * @param index int hit index - * @return double phi coordinate. - */ - public double getPhi(int index) - { - return phi[index]; - } - - /** - * Returns the transverse energy of a hit. - * - * @param index int hit index - * @return float transverse energy - */ - public float getET(int index) - { - return et[index]; - } - - /** - * Returns the transverse energy of a list of hits. - * - * @param index int[] list of hit indices - * @return float[] list of transverse energies - */ - public float[] getET(int[] index) - { - float[] temp = new float[index.length]; - - for (int i = 0; i < index.length; i++) - { - temp[i] = et[index[i]]; - } - return temp; - } - - /** - * Returns the calorimeter sampling (or layer) of a list of hits. - * - * @param index int[] list of hit indices - * @return int[] list of samplings - */ - public int[] getSampling(int[] index) - { - int[] temp = new int[index.length]; - - for (int i = 0; i < index.length; i++) - { - temp[i] = sampling[index[i]]; - } - return temp; - } - - /** - * Returns the energy of a hit. - * - * @param index int hit index - * @return float energy - */ - public float getEnergy(int index) - { - return energy[index]; - } - - /** - * Returns the depositied energy of a list of hits. - * - * @param index int[] list of hit indices - * @return float[] list of energies - */ - public float[] getEnergy(int[] index) - { - float[] temp = new float[index.length]; - - for (int i = 0; i < index.length; i++) - { - temp[i] = energy[index[i]]; - } - return temp; - } - - public static double getNonScalingFactor() - { - return NON_SCALING_FACTOR; - } - - /** - * Returns the lowest density for the cell type of the specified hit. - * - * @param index int hit index - * @return double minimum density - */ - protected double getMinDensity(int index) - { - return getMinDensity(getCalorimeterType(index)); - } - - /** - * Returns the lowest densityfor the specified calorimeter type. - * - * @param type String either "ECAL", "HCAL" or "ALL" - * @return double minimum density - */ - protected double getMinDensity(String type) - { - if (type.equals("ECAL")) - { - return minDensityECAL; - } - else if (type.equals("HCAL")) - { - return minDensityHCAL; - } - else if (type.equals("ALL")) - { - // Return the lowest non-zero value. - if (minDensityECAL == 0.0 || minDensityHCAL == 0.0) - { - return Math.max(minDensityECAL, minDensityHCAL); - } - else - { - return Math.min(minDensityECAL, minDensityHCAL); - } - } - else - { - return 0.0; - } - } - - /** - * Returns the highest density for the cell type of the specified hit. - * - * @param index int hit index - * @return double maximum density - */ - protected double getMaxDensity(int index) - { - return getMaxDensity(getCalorimeterType(index)); - } - - /** - * Returns the highest densityfor the specified calorimeter type. - * - * @param type String either "ECAL", "HCAL" or "ALL" - * @return double maximum density - */ - protected double getMaxDensity(String type) - { - if (type.equals("ECAL")) - { - return maxDensityECAL; - } - else if (type.equals("HCAL")) - { - return maxDensityHCAL; - } - else if (type.equals("ALL")) - { - return Math.max(maxDensityECAL, maxDensityHCAL); - } - else - { - return 0.0; - } - } - - /** - * Sets the minimum density for the specified calorimeter type. - * - * @param type String either "ECAL", "HCAL" or "ALL" - * @param density double minimum density to set - */ - protected void setMinDensity(String type, double density) - { - if (type.equals("ECAL")) - { - minDensityECAL = density; - } - else if (type.equals("HCAL")) - { - minDensityHCAL = density; - } - else if (type.equals("ALL")) - { - minDensityECAL = density; - minDensityHCAL = density; - } - } - - /** - * Sets the maximum density for the specified calorimeter type. - * - * @param type String either "ECAL", "HCAL" or "ALL" - * @param density double maximum density to set - */ - protected void setMaxDensity(String type, double density) - { - if (type.equals("ECAL")) - { - maxDensityECAL = density; - } - else if (type.equals("HCAL")) - { - maxDensityHCAL = density; - } - else if (type.equals("ALL")) - { - maxDensityECAL = density; - maxDensityHCAL = density; - } - - parameterStore.get(CALORIMETER_NAME, "Area/Energy").setD(1. / Math.max(maxDensityECAL, maxDensityHCAL)); - } - - /** - * Returns the data that needs to be drawn in the specificied projection. - * - * @param projection AProjection projection - * @return ACoord data to be drawn - */ - protected ACoord getUserNoTransform(AProjection projection) - { - if (CALORIMETER_NAME.equals("FCAL") || CALORIMETER_NAME.equals("MBTS")) - { - // FCAL and MBTS data are not linked to the geometry objects, so use the old method. - return super.getUserNoTransform(projection); - } - else - { - // For all the other types we can simply get the geometry from the - // geometry objects. - makeDrawList(); - filterDrawList(projection); - double[][][] hv = new double[2][numDraw][0]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (detector[j] >= 0) - { - ACoord coord = ACalorimeterDetector.get(detector[j]).getCell(projection, etaIndex[j], phiIndex[j], side[j]); - if (coord.hv[0].length > 0) - { - hv[0][i] = coord.hv[0][0]; - hv[1][i] = coord.hv[1][0]; - } - } - else - { - // Alternative setups compatibility mode based on eta, deta, - // r or z, dr or dz, phi, dphi from event file could be - // implemented here. - } - index[i] = j; - } - - // Apply the wrap arounds for phi in certain projections. - if (projection instanceof AProjectionVP) - { - return new ACoord(hv, index, this).includePhiWrapAround("VP"); - } - else if (projection instanceof AProjectionFR) - { - return new ACoord(hv, index, this).includePhiWrapAround("FR"); - } - else if (projection instanceof AProjectionFZ) - { - return new ACoord(hv, index, this).includePhiWrapAround("FZ"); - } - else - { - return new ACoord(hv, index, this); - } - } - } - - /** - * Returns the data points for the "standard" mode v-plot. - * - * @return ACoord v-plot points - */ - public ACoord getVPPoints() - { - makeDrawList(); - double[][] hv = new double[2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - hv[0][i] = getEta(j); - hv[1][i] = Math.toDegrees(phi[j]); - index[i] = j; - } - return new ACoord(hv, index, this, ACoord.SYMBOLS).includePhiWrapAround("VP"); - } - - /** - * Cleans up the drawList. From all cells that are drawn at a certain place - * only the one that has the highest deposited transverse energy will remain. - * It also sums the transverse energy of the cells it removes. This is stored - * in etSum[] at the index of the "most energetic" cell. - * - * @param projection AProjection projection to be drawn - */ - protected void filterDrawList(AProjection projection) - { - // In the v-plot every cell is drawn, unless we're in one of the special - // modes. - if (projection instanceof AProjectionVP) - { - switch (parameterStore.get("VP", "Mode").getI()) - { - case AProjectionVP.MODE_STANDARD: - // Everything is drawn in the standard mode v-plot. - return; - case AProjectionVP.MODE_ECAL_LAYER_0: - case AProjectionVP.MODE_ECAL_LAYER_1: - case AProjectionVP.MODE_ECAL_LAYER_2: - case AProjectionVP.MODE_ECAL_LAYER_3: - if (!CALORIMETER_NAME.equals("LAr")) - { - // Don't draw HCAL in ECAL mode. - numDraw = 0; - } - return; - case AProjectionVP.MODE_HCAL_LAYER_0: - case AProjectionVP.MODE_HCAL_LAYER_1: - case AProjectionVP.MODE_HCAL_LAYER_2: - case AProjectionVP.MODE_HCAL_LAYER_3: - if (!CALORIMETER_NAME.equals("TILE") && !CALORIMETER_NAME.equals("HEC")) - { - // Don't draw ECAL in HCAL mode. - numDraw = 0; - } - return; - default: - numDraw = 0; - return; - } - } - - // The phi-z projection has special modes as well. - if (projection instanceof AProjectionFZ) - { - if (parameterStore.get(projection.getName(), "Mode").getI() != AProjectionYX.MODE_STANDARD) - { - numDraw = 0; - return; - } - } - // Also the y-x and phi-rho projections have special modes (they share the same mode list). - int mode = parameterStore.get("YX", "Mode").getI(); - if (projection instanceof AProjectionYX || projection instanceof AProjectionFR) - { - if (mode != AProjectionYX.MODE_STANDARD && - (mode < AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER || mode > AProjectionYX.MODE_HEC_SUMMED)) - { - numDraw = 0; - return; - } - else if (mode >= AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && mode <= AProjectionYX.MODE_HEC_SUMMED) - { - if ((mode >= AProjectionYX.MODE_HEC_1 && mode <= AProjectionYX.MODE_HEC_4 && !CALORIMETER_NAME.equals("HEC")) || - (mode < AProjectionYX.MODE_HEC_1 && !CALORIMETER_NAME.equals("LAr")) || - (mode == AProjectionYX.MODE_HEC_SUMMED && !CALORIMETER_NAME.equals("HEC")) || - (mode == AProjectionYX.MODE_LAR_ENDCAP_SUMMED && !CALORIMETER_NAME.equals("LAr"))) - { - numDraw = 0; - return; - } - } - else if(mode == AProjectionYX.MODE_MBTS && !CALORIMETER_NAME.equals("MBTS")) - { - numDraw = 0; - return; - } - } - - float[][] etTable = new float[2 * ACalorimeterDetector.count()][2 * MAX_HIT_INDEX]; - for (int i = 0; i < 2 * ACalorimeterDetector.count(); i++) - { - for (int j = 0; j < 2 * MAX_HIT_INDEX; j++) - { - cellTable[i][j] = -1; - etTable[i][j] = 0.0f; - } - } - - for (int i = 0; i < numDraw; i++) - { - int detIndex = getDetectorIndex(listdl[i]); - int hitIndex = getHitIndex(listdl[i], projection); - - if (detIndex >= 0 && hitIndex >= 0) - { - etTable[detIndex][hitIndex] += et[listdl[i]]; - if (cellTable[detIndex][hitIndex] < 0 || et[cellTable[detIndex][hitIndex]] < et[listdl[i]]) - cellTable[detIndex][hitIndex] = listdl[i]; - } - } - - numDraw = 0; - for (int i = 0; i < 2 * ACalorimeterDetector.count(); i++) - { - for (int j = 0; j < 2 * MAX_HIT_INDEX; j++) - { - if (cellTable[i][j] > 0) - { - listdl[numDraw] = cellTable[i][j]; - etSum[listdl[numDraw]] = etTable[i][j]; - numDraw++; - } - } - } - } - - /** - * This function maps a hit to an index. This index is such that two hits - * get the same index when they are in the same detector and on the same - * side. - * - * @param index int number of the hit in the current dataset - * @return int detector index - */ - protected int getDetectorIndex(int index) - { - if (detector[index] >= 0) - { - if (side[index] > 0) - { - return ACalorimeterDetector.count() + detector[index]; - } - else - { - return detector[index]; - } - } - return -1; - } - - /** - * This function maps a hit to an index. This index is such that two hits in - * the same detector will receive the same index if they will be drawn in - * the same place. - * - * @param index int number of the hit in the current dataset - * @param projection AProjection projection the hit index should be - * calculated for - * @return int hit index - */ - protected int getHitIndex(int index, AProjection projection) - { - if (detector[index] >= 0) - { - if (projection instanceof AProjectionYX) - { - return phiIndex[index]; - } - else if (projection instanceof AProjectionRZ) - { - if (ACalorimeterDetector.get(detector[index]).getRSign(phiIndex[index]) > 0) - { - return MAX_HIT_INDEX + etaIndex[index]; - } - else - { - return etaIndex[index]; - } - } - else if (projection instanceof AProjectionFR) - { - return phiIndex[index]; - } - else if (projection instanceof AProjectionFZ) - { - return phiIndex[index]; - } - } - return -1; - } - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - return ACoord.NO_HISTOGRAMS; - } - - /** - * Returns the histograms in the YX projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getYXHistograms() - { - AHistogram hist = new AHistogram(0., 2. * Math.PI, phiGranularity, histoScale.getD(), this); - int mode = parameterStore.get("YX", "Mode").getI(); - double newInnerR = innerR; - boolean hasAddedToHistogram = false; - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (detector[j] >= 0) - { - if ((mode == AProjectionYX.MODE_STANDARD && ACalorimeterDetector.get(detector[j]) instanceof ABarrelCalorimeterDetector) || - (mode != AProjectionYX.MODE_STANDARD && ACalorimeterDetector.get(detector[j]) instanceof AEndcapCalorimeterDetector)) - { - String name = ACalorimeterDetector.get(detector[j]).getName(); - if (mode == AProjectionYX.MODE_STANDARD || (mode == AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && (name.equals("LAr Endcap Presampler")||name.equals("LAr_EC_Presampler"))) || - (name.equals("LAr Outer Endcap") && getSampling(j) == mode - AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER) || - (name.equals("LAr Inner Endcap") && getSampling(j) == mode - AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER - 1) || - (name.equals("HEC") && getSampling(j) == mode - AProjectionYX.MODE_HEC_1) || - (mode == AProjectionYX.MODE_LAR_ENDCAP_SUMMED && name.indexOf("LAr") >= 0) || (mode == AProjectionYX.MODE_HEC_SUMMED && name.equals("HEC"))) - { - hasAddedToHistogram = true; - double phiMin = ACalorimeterDetector.get(detector[j]).getPhiMin(phiIndex[j]); - double phiMax = ACalorimeterDetector.get(detector[j]).getPhiMax(phiIndex[j]); - - if (phiMin < -1e-9 && phiMax > 1e-9) - { - hist.fill(phiMin + 2. * Math.PI, 2. * Math.PI, etSum[j] / 2.); - hist.fill(0., phiMax, etSum[j] / 2.); - } - else - { - hist.fill(phiMin, phiMax, etSum[j]); - } - if (mode != AProjectionYX.MODE_STANDARD) - { - if (name.equals("HEC")) - { - if (mode != AProjectionYX.MODE_HEC_SUMMED) - { - //can use the get RMin accurately for the HEC - newInnerR = ACalorimeterDetector.get(detector[j]).getRMin(); - } - else if (ACalorimeterDetector.get(detector[j]).getRMin() < newInnerR) - { - //only want to assign HEC ALL minimum if is smaller - newInnerR = ACalorimeterDetector.get(detector[j]).getRMin(); - } - } - else - { - //calculate RMin as not accurate in geometry file - double etaMax = ACalorimeterDetector.get(detector[j]).getEtaMax(); - double zMin = ACalorimeterDetector.get(detector[j]).getZMin(); - double temp = zMin / Math.sinh(etaMax); - //save calculated if smallest - if (temp < newInnerR) - newInnerR = temp; - } - } - } - } - } - } - if (hasAddedToHistogram) - return new ACoord[] { hist.getYXUser(newInnerR) }; - else - return ACoord.NO_HISTOGRAMS; - } - - /** - * Returns the histograms in the phi-rho projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getFRHistograms() - { - AHistogram hist = new AHistogram(0., 2. * Math.PI, phiGranularity, histoScale.getD(), this); - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (detector[j] >= 0) - { - if (ACalorimeterDetector.get(detector[j]) instanceof ABarrelCalorimeterDetector) - { - double phiMin = ACalorimeterDetector.get(detector[j]).getPhiMin(phiIndex[j]); - double phiMax = ACalorimeterDetector.get(detector[j]).getPhiMax(phiIndex[j]); - - if (phiMin < -1e-9 && phiMax > 1e-9) - { - hist.fill(phiMin + 2. * Math.PI, 2. * Math.PI, etSum[j] / 2.); - hist.fill(0., phiMax, etSum[j] / 2.); - } - else - { - hist.fill(phiMin, phiMax, etSum[j]); - } - } - } - } - return new ACoord[] { hist.getFRUser(innerR).includePhiWrapAround("FR") }; - } - - /** - * Returns the histograms in the RZ projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getRZHistograms() - { - AHistogram histUp = new AHistogram(-outerEta, outerEta, etaGranularity, histoScale.getD(), this); - AHistogram histDown = new AHistogram(-outerEta, outerEta, etaGranularity, histoScale.getD(), this); - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (detector[j] >= 0) - { - int sign = ACalorimeterDetector.get(detector[j]).getRSign(phiIndex[j]); - double etaMin = ACalorimeterDetector.get(detector[j]).getEtaMin(etaIndex[j], side[j]); - double etaMax = ACalorimeterDetector.get(detector[j]).getEtaMax(etaIndex[j], side[j]); - - if (sign > 0) - { - histUp.fill(etaMin, etaMax, etSum[j]); - } - else - { - histDown.fill(etaMin, etaMax, etSum[j]); - } - } - } - - ACoordArray c = new ACoordArray(); - c.add(histUp.getRZUser(outerZ, outerR, AHistogram.UP)); - c.add(histDown.getRZUser(outerZ, outerR, AHistogram.DOWN)); - return c.getArray(); - } - - /** - * Returns the histograms in the phi-z projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getFZHistograms() - { - AHistogram hist; - AHistogram histLeft = new AHistogram(0., 2. * Math.PI, phiGranularity, histoScale.getD(), this); - AHistogram histRight = new AHistogram(0., 2. * Math.PI, phiGranularity, histoScale.getD(), this); - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (detector[j] >= 0) - { - if (ACalorimeterDetector.get(detector[j]) instanceof AEndcapCalorimeterDetector) - { - double phiMin = ACalorimeterDetector.get(detector[j]).getPhiMin(phiIndex[j]); - double phiMax = ACalorimeterDetector.get(detector[j]).getPhiMax(phiIndex[j]); - - if (side[j] > 0) - { - hist = histRight; - } - else - { - hist = histLeft; - } - - if (phiMin < -1e-9 && phiMax > 1e-9) - { - hist.fill(phiMin + 2. * Math.PI, 2. * Math.PI, etSum[j] / 2.); - hist.fill(0., phiMax, etSum[j] / 2.); - } - else - { - hist.fill(phiMin, phiMax, etSum[j]); - } - } - } - } - - return new ACoord[] { histLeft.getFZUser(innerZ, AHistogram.LEFT).includePhiWrapAround("FZ"), - histRight.getFZUser(innerZ, AHistogram.RIGHT).includePhiWrapAround("FZ") }; - } - - /** - * Returns the histograms in the x'-z projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getXZHistograms() - { - return ACoord.NO_HISTOGRAMS; - } - - /** - * Returns the histograms in the y'-z projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getYZHistograms() - { - return ACoord.NO_HISTOGRAMS; - } - - /** - * Returns the histograms in the eta-phi projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getVPHistograms() - { - return ACoord.NO_HISTOGRAMS; - } - - /** - * Sets the type of the hits (associated, unassociated). - */ - protected void setType() - { - int[][] cluster = event.getAssociationManager().get(getName(), "Cluster"); - for (int i = 0; i < numData; i++) - { - if (cluster != null && cluster[i] != null) - { - type[i] = 1; - } - else - { - type[i] = 0; - } - } - } - - /** - * Determines if the cells need to be scaled by energy or not. This will be - * true for most cases, but not if the user has selected the color by energy - * color function. - * - * @return boolean true for energy scaling, false for constant cell size - */ - protected boolean energyScaling() - { - return parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI() != COLOR_FUNC_ENERGY; - } - - /** - * Determines the color for each hit according to the color function set by - * the user. - * - * @return int number of coloring options? - */ - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - switch (colorFunction) - { - case COLOR_FUNC_CONSTANT: - colorByConstant(); - break; - - case COLOR_FUNC_SUBDET: - colorBy(sub); - break; - - case COLOR_FUNC_CLUSTER: - colorBy(getClusters()); - break; - - case COLOR_FUNC_SAMPLING: - colorBy(sampling); - break; - - case COLOR_FUNC_ENERGY: - colorByEnergy(); - break; - - case COLOR_FUNC_JET: - if(parameterStore.get("Jet", "ColorFunction").getI()!=1) - { - parameterStore.get("Jet", "ColorFunction").setI(1); - String msg = "Coloring Calo by jet so "; - msg += "ATLAS->Jet->Color Function changed to color by index"; - AOutput.append("\n" + msg + "\n", ALogInterface.WARNING); - } - colorBy(getJets()); - break; - - case COLOR_FUNC_TYPE: - colorByType(); - break; - - case COLOR_FUNC_TIME: - colorByTime(); - break; - } - - return colorFunction + 8; - } - - /** - * Colors cells by energy. - */ - protected void colorByEnergy() - { - double min = 0.0, max = 0.0; - boolean first = true; - int numColors = 17; - float[] en = null; - - switch (parameterStore.get(CALORIMETER_NAME, "EnergyMode").getI()) - { - case ENERGY_MODE_SUM_LIN: - case ENERGY_MODE_SUM_LOG: - case ENERGY_MODE_SUM_SQRT: - en = etSum; - break; - - case ENERGY_MODE_MAX_LIN: - case ENERGY_MODE_MAX_LOG: - case ENERGY_MODE_MAX_SQRT: - en = et; - break; - } - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (first) - { - min = en[j]; - max = en[j]; - first = false; - } - - if (en[j] > max) - max = en[j]; - if (en[j] < min) - min = en[j]; - } - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - if (AColorMap.getColorMap() == AColorMap.COLOR_MAP_BW) - { - // Black and white colormap. - color[j] = AColorMap.BK; - } - else - { - int colorIndex = 0; - - // We have numColors colors available. - switch (parameterStore.get(CALORIMETER_NAME, "EnergyMode").getI()) - { - case ENERGY_MODE_MAX_LIN: - case ENERGY_MODE_SUM_LIN: - colorIndex = (int) (numColors * (en[j] - min) / (max - min)); - break; - case ENERGY_MODE_MAX_LOG: - case ENERGY_MODE_SUM_LOG: - colorIndex = (int) (numColors * (Math.log(en[j]) - Math.log(min)) / (Math.log(max) - Math.log(min))); - break; - case ENERGY_MODE_MAX_SQRT: - case ENERGY_MODE_SUM_SQRT: - colorIndex = (int) (numColors * Math.sqrt((en[j] - min) / (max - min))); - break; - } - - if (colorIndex >= numColors) - colorIndex = (byte) (numColors - 1); - - color[j] = (byte) colorIndex; - } - } - } - - /** - * Colors cells by type (ECAL/HCAL). - */ - protected void colorByType() - { - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - String cellType = getCalorimeterType(j); - //Use detector color but add on 12 to get different shade of same color - color[j] = (byte) (parameterStore.get("Det", cellType + "Fill").getI() + 12); - } - } - - //Gets the measured time for a calorimeter cell. - //It's 0 by default, but can and should be overriden by subclasses. - protected double getTime(int hit) - { - return 0.0; - } - - //Color cells by their measured time, on a blue-red scale. - //Unmeasured cells are grey. - protected void colorByTime() - { - double min = 0.0, max = 0.0; - boolean first = true; - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - double t=getTime(j); - if (t==0.0) continue;//ignore unmeasured hits - if (first) - { - min = t; max = t; - first = false; - } - - if (t > max) max = t; - if (t < min) min = t; - } - - int numColors = 127; - double scale = (max - min); - if (scale<5) scale=5;//smallest scale is 5 ns - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - double t = getTime(j); - - int colorIndex = (int) (numColors * (t-min) / scale); - if (colorIndex >= numColors) { - colorIndex = numColors;//red - } - if (colorIndex < 1) { - colorIndex = 1;//blue - } - - if (t==0.0) colorIndex=0;//gets grey color - color[j] = (byte) colorIndex; - - } - } - - /** - * Applies cuts to the data. - */ - protected void applyCuts() - { - cutIndex(); - cut("CutsCalo", "Layer", "Layer", sampling); - cut("CutsCalo", "CellQuality", "CellQuality", BadCell); - cutPhi(phi, dphi); - cutEtaDEta(eta, deta); - } - - /** - * Performs the local density calibration. This function determines the - * highest and lowest energy density values ans stores them. - * - * @param index int[] hits to be used in calibration - * @param area double[] cell areas - */ - public void calibrateLocalDensity(int[] index, double[] area) - { - float[] en = null; - double density; - boolean firstECAL = true; - boolean firstHCAL = true; - - AParameter par = parameterStore.get(CALORIMETER_NAME, "Area/Energy"); - if (par.getStatus() && par.getD() > 0) - { - minDensityECAL = 0.0; - minDensityHCAL = 0.0; - maxDensityECAL = 1. / par.getD(); - maxDensityHCAL = 1. / par.getD(); - } - else - { - // Otherwise we need to do calculate it ourselves. - switch (parameterStore.get(CALORIMETER_NAME, "EnergyMode").getI()) - { - case ENERGY_MODE_SUM_LIN: - case ENERGY_MODE_SUM_LOG: - case ENERGY_MODE_SUM_SQRT: - en = etSum; - break; - - case ENERGY_MODE_MAX_LIN: - case ENERGY_MODE_MAX_LOG: - case ENERGY_MODE_MAX_SQRT: - en = et; - break; - } - - // The default for an empty list of cells or only zero area cells is - // 0.0. - minDensityECAL = 0.0; - maxDensityECAL = 0.0; - minDensityHCAL = 0.0; - maxDensityHCAL = 0.0; - - // Calculate density and determine the highest and lowest values. - for (int i = 0; i < index.length; i++) - { - if (area[i] > 0) - { - density = (en[index[i]] / area[i]); - - if (density > 0) - { - if (getCalorimeterType(index[i]).equals("ECAL")) - { - if (firstECAL) - { - // First cell with a sensible density, take this - // as initial value. - minDensityECAL = density; - maxDensityECAL = density; - firstECAL = false; - } - - if (density < minDensityECAL) - minDensityECAL = density; - if (density > maxDensityECAL) - maxDensityECAL = density; - - } - else if (getCalorimeterType(index[i]).equals("HCAL")) - { - if (firstHCAL) - { - // First cell with a sensible density, take this - // as initial value. - minDensityHCAL = density; - maxDensityHCAL = density; - firstHCAL = false; - } - - if (density < minDensityHCAL) - minDensityHCAL = density; - if (density > maxDensityHCAL) - maxDensityHCAL = density; - } - } - } - } - } - } - - /** - * - */ - public double[] getScaleFactors(int[] dl, double[] area) { - double[] factors = new double[area.length]; - - float[] en = null; - int energyMode = parameterStore.get(CALORIMETER_NAME, "EnergyMode").getI(); - - switch (energyMode) - { - case ENERGY_MODE_SUM_LIN: - case ENERGY_MODE_SUM_LOG: - case ENERGY_MODE_SUM_SQRT: - en = etSum; - break; - - case ENERGY_MODE_MAX_LIN: - case ENERGY_MODE_MAX_LOG: - case ENERGY_MODE_MAX_SQRT: - en = et; - break; - } - - for (int i = 0; i < area.length; i++) - { - factors[i] = 1.0f; - - if (area[i] == 0) - continue; - - if (energyScaling()) - { - // The user has (implicitly) selected energy scaling. - double density = en[dl[i]] / area[i]; - double minDensity = getMinDensity(dl[i]); - double maxDensity = getMaxDensity(dl[i]); - - switch (energyMode) - { - case ENERGY_MODE_MAX_LIN: - case ENERGY_MODE_SUM_LIN: - factors[i] = Math.sqrt(density / maxDensity); - break; - - case ENERGY_MODE_MAX_LOG: - case ENERGY_MODE_SUM_LOG: - double magnitude = Math.floor(Math.log10(Math.sqrt(maxDensity / minDensity)) + 1.0); - factors[i] = (Math.log10(Math.sqrt(density / maxDensity)) + magnitude) / magnitude; - break; - - case ENERGY_MODE_MAX_SQRT: - case ENERGY_MODE_SUM_SQRT: - factors[i] = Math.sqrt(Math.sqrt(density / maxDensity)); - break; - - default: - factors[i] = NON_SCALING_FACTOR; - } - } - else - { - // No energy scaling, scale all cells by the same factor. - factors[i] = NON_SCALING_FACTOR; - } - - if (factors[i] > 1.0) { - factors[i] = 1.0; - } - } - - return factors; - } - - /** - * Scales a series of polygons according to the user settings. - * - * @param coord ACoord polygons to be scaled - * @param area double[] surface area of these polygons - * @return ACoord scaled polygons - */ - protected ACoord scalePolygons(ACoord coord, double[] area) - { - double[] factors = getScaleFactors(coord.index, area); - - for (int i = 0; i < area.length; i++) - { - if (area[i] == 0) - continue; - - APolygon.scale(coord.hv[0][i], coord.hv[1][i], factors[i]); - } - return coord; - } - - private String getCellString(int index, String idstr) { - StringBuffer msg = new StringBuffer(); - msg.append(CALORIMETER_NAME + " cell"); - msg.append(" (id: " + idstr + " index: " + index + ")"); - return msg.toString(); - } - - private String getHitString(int index) { - StringBuffer msg = new StringBuffer(); - - msg.append("\n E Max = "); - msg.append(String.format("%.2f",energy[index])); - msg.append(" GeV\n ET Max = "); - msg.append(String.format("%.2f",et[index])); - msg.append(" GeV\n ET Sum = "); - msg.append(String.format("%.2f",etSum[index])); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.4f",eta[index])); - msg.append(" "); - msg.append(AMath.PLUSMINUS); - msg.append(" "); - // deta is step (i.e. size of a cell), with +- we want to see half of it - msg.append(String.format("%.3f",deta[index] / 2.0)); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.1f",Math.toDegrees(phi[index]))); - msg.append(" " + AMath.PLUSMINUS + " "); - // dphi is step (i.e. size of a cell), with +- we want to see half of it - msg.append(String.format("%.1f",Math.toDegrees(dphi[index] / 2.0))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.1f",phi[index]) + " "); - msg.append(AMath.PLUSMINUS + " " + String.format("%.1f",dphi[index] / 2.0) + " rad)"); - - if(feedThrough != null && slot != null && channel != null) - { - String s = "\n feed through/slot/channel = " + - feedThrough[index] + "/" + slot[index] + "/" + - channel[index]; - msg.append(s); - } - if(BadCell != null){ - if(BadCell[index] == 0) - msg.append("\n Cell is good"); - if(BadCell[index] == 1) - msg.append("\n Cell is bad"); - if(BadCell[index] == -1) - msg.append("\n Cell is below 50 MeV"); - } - - return msg.toString(); - } - - /** - * Getting title string for pulse shape windows - * - * Relies on decodedId[1] being some useful high level string describing - * the calorimeter part. This isn't the case for ATILEData where this function - * is overridden to do something different. - * - * Maybe this is a slightly unreasonable plan... but then the first thing - * you decode out of the id should usually be the "biggest" sort of division... - * - Adam - */ - protected String getPulseTitleString(int index) { - - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - - String title = null; - - if (feedThrough == null || slot == null || channel == null) { - // Old style title - logger.warn("Calo FT/slot/channel info not available, using old style title"); - title = decodedId[1] + " cell: " + decodedId[0]; - } else { - // New title as requested by Andre N. Aug 09 - title = decodedId[1] + " cell: " + - this.feedThrough[index] + "/" + this.slot[index] + - "/" + this.channel[index]; - } - - return title; - } - - // Some calo stuff wants to decode the id it's own way... - public String getHitInfoNoDecode(int index) { - - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - return getCellString(index, decodedId[0]) + getHitString(index); - - } - - /** - * Returns information about a certain hit for display in the information - * box. - * - * @param index int hit index - * @return String hit information - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",et[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",et[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",et[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",et[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - StringBuffer msg = new StringBuffer(); - msg.append(getCellString(index, decodedId[0])); - // iterate over decodedId to get further details (if available), - // first item [0] was already printed out above, thus start from 1 - for(int i = 1; i < decodedId.length; i++) - { - msg.append("\n " + decodedId[i]); - } - - msg.append(getHitString(index)); - // by zdenek 2009-01-20 - // layer is already present as sampling in the decodedId - // sub[] should gradually be removed, don't print it for now - // (see mess in AHashMap - !name.equals("sub")) grrrr - /* - msg.append("\n "); - msg.append("layer = " + sampling[index]); - msg.append("\n "); - msg.append("subdetector = " + sub[index]); - */ - - return msg.toString(); - } - - /** - * Returns the total transverse energy for this data type. - * - * @return double total transverse energy - */ - public double getTotalTransverseEnergy() - { - double sumEt = 0.; - for (int i = 0; i < numData; i++) - { - sumEt += et[i]; - } - return sumEt; - } - - /** - * Returns information about the drawn hits, used for the v-plot. - * - * @return String information - */ - public String getVPHitInfo() - { - applyCuts(); - if (numDraw == 0) - return ""; - double sumE = 0.; - double sumEt = 0.; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - sumEt += et[j]; - sumE += energy[j]; - } - - String msg = numDraw + " " + getNameScreenName(); - msg += " sum(ET) = " + String.format("%.1f",sumEt) + " sum(E) = " + String.format("%.1f",sumE); - return msg; - } - - /** - * Returns the specified hits in the form of a four vector. Used by the list - * manager. - * - * @param num int number of hits - * @param list int[] indices of the hits - * @return A4Vector four vector - */ - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - - for (int i = 0; i < num; ++i) - { - int j = list[i]; - double lambda = AMath.lambda(eta[j]); - - double pt = energy[j] * Math.cos(lambda); - double pz = energy[j] * Math.sin(lambda); - - double px = pt * Math.cos(phi[j]); - double py = pt * Math.sin(phi[j]); - - sum.add(px, py, pz, 0.); - } - return sum; - } - - /** - * Calorimeter cells can be drawn either explicitly or implicitly. In most - * views cells that are located behind eachother are consolidated and only - * the most energetic one is drawn explicitly. The other cells are drawn - * implicitly, since their energy value is still added to the energy sum of - * the explicitly drawn cell. The list manager does not know about the - * implicitly drawn cells though, so this poses a problem when the user - * requests information about a certain area of the canvas. This is solved - * using this method. This function receives the list of explicitly drawn - * cells and then adds the ones that were implicitly drawn in this - * selection. - * - * @param drawn boolean[] initial drawn list containing only the explicitly - * drawn cells - * @return boolean[] drawn list containing the explicitly and the implicitly - * drawn cells. - */ - public boolean[] expandDrawn(boolean[] drawn) - { - makeDrawList(); - AProjection projection = ACanvas.getCanvas().getCurrentWindow().getProjection(); - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - - if (drawn[j]) - continue; - - int detIndex = getDetectorIndex(j); - int hitIndex = getHitIndex(j, projection); - - if (detIndex >= 0 && hitIndex >= 0) { - if (cellTable != null && detIndex < cellTable.length - && hitIndex < cellTable[detIndex].length) { - - int mappedTo = cellTable[detIndex][hitIndex]; - - if (mappedTo >= 0 && drawn[mappedTo] == true) { - drawn[j] = true; - } - } - } - } - - return drawn; - } - - /** - * Rebuilds the hit to geometry mapping for all calorimeters. Used when the - * user has loaded a different geometry file. - */ - public static void remakeHitToGeometryMapping() - { - //Get current event - AEvent event = eventManager.getCurrentEvent(); - if (event != null){ - ACalorimeterData[] calorimeters = new ACalorimeterData[event.getCalorimeters().size()]; - event.getCalorimeters().toArray(calorimeters); - for (int i = 0; i < calorimeters.length; i++) - { - calorimeters[i].makeHitToGeometryMapping(); - } - } - } - - /** - * Draws the calorimeters. This method is called from AProjection2D.paint(). - * - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - * @param event AEvent drawn event reference - */ - public static void drawCalorimeters(AWindow window, AGraphics ag, AProjection2D projection, AEvent event) - { - int mode = parameterStore.get(projection.getName(), "Mode").getI(); - - if(projection instanceof AProjectionYX || projection instanceof AProjectionFR) - { - //only grey out the GUI if relevant for the current window - boolean changeGUI = false; - if(window.equals(ACanvas.getCanvas().getCurrentWindow())) - changeGUI = true; - - //grey out draw FCAL option if not on right layer of HEC - AParameter drawFCAL = parameterStore.get("YX", "DrawFCAL"); - if(changeGUI) - { - if(!drawFCAL.isInitialized()) - drawFCAL.initialize(); - if(mode < AProjectionYX.MODE_HEC_2 || mode > AProjectionYX.MODE_HEC_4) - drawFCAL.getNameComponent().setEnabled(false); - else - drawFCAL.getNameComponent().setEnabled(true); - } - - - //grey out split ETA, LAr bin and HEC bin options if not on summed endcaps option - AParameter splitEta = parameterStore.get("YX", "SplitEta"); - AParameter LArBin = parameterStore.get("YX", "LArBin"); - AParameter HECBin = parameterStore.get("YX", "HECBin"); - if(changeGUI) - { - if(!HECBin.isInitialized()) - HECBin.initialize(); - if(!LArBin.isInitialized()) - LArBin.initialize(); - if(!splitEta.isInitialized()) - splitEta.initialize(); - } - //Summed Endcaps has a different draw method - if(mode == AProjectionYX.MODE_LAR_ENDCAP_SUMMED || mode == AProjectionYX.MODE_HEC_SUMMED) - { - if(changeGUI) - { - LArBin.getValueComponent().setEnabled(true); - HECBin.getValueComponent().setEnabled(true); - LArBin.getNameComponent().setEnabled(true); - HECBin.getNameComponent().setEnabled(true); - if(LArBin.getI()==3 || HECBin.getI()==3) - { - splitEta.getValueComponent().setEnabled(true); - splitEta.getNameComponent().setEnabled(true); - } - else - { - splitEta.getValueComponent().setEnabled(false); - splitEta.getNameComponent().setEnabled(false); - } - } - ACalorimeterData[] calorimeters = new ACalorimeterData[event.getCalorimeters().size()]; - event.getCalorimeters().toArray(calorimeters); - for (int i = 0; i < calorimeters.length; i++) - { - //check if in right calorimeter - if ((mode == AProjectionYX.MODE_LAR_ENDCAP_SUMMED && !calorimeters[i].getName().equals("LAr")) || - (mode == AProjectionYX.MODE_HEC_SUMMED && !calorimeters[i].getName().equals("HEC"))) - continue; - ADrawCalorimeterSummedEndcaps.drawCalorimeterSummedEndcaps(window, - ag, projection, calorimeters[i], calorimeters[i].etaIndex, - calorimeters[i].phiIndex, calorimeters[i].side); - } - return; - } - else - { - if(changeGUI) - { - LArBin.getValueComponent().setEnabled(false); - HECBin.getValueComponent().setEnabled(false); - splitEta.getValueComponent().setEnabled(false); - LArBin.getNameComponent().setEnabled(false); - HECBin.getNameComponent().setEnabled(false); - splitEta.getNameComponent().setEnabled(false); - } - if (ALegendWindow.exists()) - ALegendWindow.getInstance().nothingToDisplay(window); - } - } - else if (ALegendWindow.exists()) - ALegendWindow.getInstance().nothingToDisplay(window); - - if (projection instanceof AProjectionVP && mode == 0) - { - // The standard mode of the v-plot uses a different function. - drawCalorimetersVPlot(window, ag, projection, event); - return; - } - - ACalorimeterData[] calorimeters = new ACalorimeterData[event.getCalorimeters().size()]; - event.getCalorimeters().toArray(calorimeters); - ACoord[] data = new ACoord[calorimeters.length]; - double[][] area = new double[calorimeters.length][]; - - for (int i = 0; i < calorimeters.length; i++) - { - // Retrieve the cell coordinates. - data[i] = calorimeters[i].getUserNoTransform(projection); - - // Calculate the cell areas. - area[i] = new double[data[i].index.length]; - for (int j = 0; j < data[i].index.length; j++) - { - area[i][j] = APolygon.getArea(data[i].hv[0][j], data[i].hv[1][j]); - } - - // Let the calorimeter determine its minimum and maximum energy - // density. - calorimeters[i].calibrateLocalDensity(data[i].index, area[i]); - } - - if (window.getProjection() instanceof AProjectionVP) - { - // In case of the v-plot we force the overall energy density - // calibration. - calibrateDensity(calorimeters, ENERGY_CALIB_OVERALL); - } - else - { - // Calibrate the energy density according to the user settings. - calibrateDensity(calorimeters, ENERGY_CALIB_UNKNOWN); - } - - for (int i = 0; i < calorimeters.length; i++) - { - // Apply the non linear transforms and convert to screen - // coordinates. - data[i] = window.calculateDisplay(projection.nonLinearTransform(data[i])); - - // Draw the cell frames. - if (parameterStore.get(calorimeters[i].getName(), "Cells").getStatus()) - { - drawFrames(calorimeters[i], data[i], window, ag); - } - } - - for (int i = 0; i < calorimeters.length; i++) - { - // Draw the cell geometry. - if (parameterStore.get(calorimeters[i].getName(), "Cells").getStatus()) - { - drawGeometry(calorimeters[i], data[i], window, ag); - } - } - - String[] histograms = { "TILE", "HEC", "LAr", "FCAL", "MBTS" }; - for (int j = 0; j < histograms.length; j++) - { - for (int i = 0; i < calorimeters.length; i++) - { - if (calorimeters[i].getCalorimeterName().equals(histograms[j])) - { - // Draw the histograms. - drawHistogram(calorimeters[i], window, ag, projection); - } - } - } - for (int j = 0; j < histograms.length; j++) - { - for (int i = 0; i < calorimeters.length; i++) - { - if (calorimeters[i].getCalorimeterName().equals(histograms[j])) - { - // Draw the frames for the histograms. - frameHistogram(calorimeters[i], window, ag, projection); - } - } - } - - for (int i = 0; i < calorimeters.length; i++) - { - if (parameterStore.get(calorimeters[i].getName(), "Cells").getStatus()) - { - // Scale the cell polygons. - data[i] = calorimeters[i].scalePolygons(data[i], area[i]); - // And draw them. - drawHits(calorimeters[i], data[i], window, ag); - } - } - - } - - /** - * Draws the calorimeters in the standard mode v-plot. This method is called - * from drawCalorimeters and should not be used directly. - * - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - * @param event AEvent drawn event reference - */ - private static void drawCalorimetersVPlot(AWindow window, AGraphics ag, AProjection2D projection, AEvent event) - { - ACalorimeterData[] calorimeters = new ACalorimeterData[event.getCalorimeters().size()]; - event.getCalorimeters().toArray(calorimeters); - - float[][] energies = new float[calorimeters.length][]; - int[] sizes = new int[calorimeters.length]; - ACoord[] points = new ACoord[calorimeters.length]; - Color[] colorMap = AColorMap.getColors(); - //if color by energy use different colormap - for (int i = 0; i < calorimeters.length; i++) - { - if(calorimeters[i].CALORIMETER_NAME.equals("MBTS")) continue; - if (parameterStore.get(calorimeters[i].getParameterGroup(), "ColorFunction").getI() - == ACalorimeterData.COLOR_FUNC_ENERGY) { - switch (AColorMap.getColorMap()) { - case AColorMap.COLOR_MAP_DEFAULT1: - case AColorMap.COLOR_MAP_DEFAULT2: - case AColorMap.COLOR_MAP_M4M5: - case AColorMap.COLOR_MAP_GRAYDET: - case AColorMap.COLOR_MAP_ORIGINAL: - // Use colors. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_HITCOL); - break; - case AColorMap.COLOR_MAP_GRAY: - case AColorMap.COLOR_MAP_BW: - // Use grayscale. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_GRAY_HITCOL); - break; - } - } else if (parameterStore.get(calorimeters[i].getParameterGroup(), "ColorFunction").getI() == COLOR_FUNC_TIME) { - colorMap = AColorMap.getShades(128); - } - - points[i] = window.calculateDisplay(calorimeters[i].getVPPoints()); - energies[i] = calorimeters[i].getET(points[i].index); - sizes[i] = energies[i].length; - calorimeters[i].color(); - } - - for (int i = 0; i < calorimeters.length; i++) - { - for (int j = 0; j < sizes[i]; j++) - { - int size = (int) Math.sqrt(energies[i][j] * SCALE_FACTOR_VPLOT); - if (size == 0) - size++; - - int cellColor = calorimeters[i].color[points[i].index[j]]; - ag.setColor(colorMap[cellColor]); - ag.drawPoint(calorimeters[i], points[i].index[j], points[i].hv[0][0][j], - points[i].hv[1][0][j], size, size); - } - } - - } - - /** - * Calibrating involves finding the minimum and maximum energy density - * values. This function takes the local (per calorimeter) values and - * calculates the overall values (if needed). - * - * @param calorimeters ACalorimeterData[] calorimeter data objects - * @param mode int calibration mode, use APar.EN_CALIB_UNKNOWN to retrieve - * the user setting - */ - protected static void calibrateDensity(ACalorimeterData[] calorimeters, int mode) - { - if (mode == ENERGY_CALIB_UNKNOWN) - { - mode = parameterStore.get("LAr", "EnergyCalibration").getI(); - } - - // This array contains the calorimeter "types" to combine in the - // calibration. - String types[]; - switch (mode) - { - case ENERGY_CALIB_OVERALL: - types = new String[] { "ALL" }; - break; - - case ENERGY_CALIB_BY_TYPE: - types = new String[] { "ECAL", "HCAL" }; - break; - - case ENERGY_CALIB_BY_CALO: - default: - // Nothing to be done here. - types = new String[0]; - break; - } - - for (int i = 0; i < types.length; i++) - { - boolean first = true; - double min = 0.0; - double max = 0.0; - for (int j = 0; j < calorimeters.length; j++) - { - if (calorimeters[j].getMaxDensity(types[i]) > 0) - { - if (first) - { - min = calorimeters[j].getMinDensity(types[i]); - max = calorimeters[j].getMaxDensity(types[i]); - first = false; - } - - if (calorimeters[j].getMinDensity(types[i]) < min) - { - min = calorimeters[j].getMinDensity(types[i]); - } - if (calorimeters[j].getMaxDensity(types[i]) > max) - { - max = calorimeters[j].getMaxDensity(types[i]); - } - } - } - for (int j = 0; j < calorimeters.length; j++) - { - calorimeters[j].setMinDensity(types[i], min); - calorimeters[j].setMaxDensity(types[i], max); - } - } - } - - /** - * Draws the frame for the cell geometry of a calorimeter. All frames are - * drawn before drawing the cells themselves. This way a frame can never be - * put on top of a cell from another calorimeter. - * - * @param calorimeter ACalorimeterData data collection to which this - * function applies - * @param display ACoord cell coordinates to be drawn - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - */ - protected static void drawFrames(ACalorimeterData calorimeter, ACoord display, AWindow window, AGraphics ag) - { - - String name = calorimeter.getCalorimeterName(); - Color[] colorMap = AColorMap.getColors(); - int[] index = display.index; - int[] type = calorimeter.getType(index); - - boolean drawCellGeometry = parameterStore.get(name, "CellGeometry").getStatus(); - boolean drawFrame = parameterStore.get(name, "Frame").getStatus(); - int frameColor = parameterStore.get(name, "Frame").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - drawFrame=true; - else - drawFrame=false; - - // For the v-plot we override these settings. - if (window.getProjection() instanceof AProjectionVP) - { - drawCellGeometry = parameterStore.get("VP", "VPlotIsland").getStatus(); - drawFrame = true; - frameColor = AColorMap.WH; - } - - // Draw frames for the filled cells. - if (drawFrame && drawCellGeometry) - { - for (int i = 0; i < index.length; i++) - { - ag.updateDrawParameters(calorimeter.getDrawParameters(0, type[i])); - ag.setColor(colorMap[frameColor]); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - - /** - * Draws the frame for the cell geometry and outline of a calorimeter. All - * frames are drawn before drawing the cells themselves. This way a frame - * can never be put on top of a cell from another calorimeter. - * - * @param calorimeter ACalorimeterData data collection to which this - * function applies - * @param display ACoord cell coordinates to be drawn - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - */ - protected static void drawGeometry(ACalorimeterData calorimeter, ACoord display, AWindow window, AGraphics ag) - { - String name = calorimeter.getCalorimeterName(); - Color[] colorMap = AColorMap.getColors(); - int[] index = display.index; - int[] type = calorimeter.getType(index); - - boolean drawCellGeometry = parameterStore.get(name, "CellGeometry").getStatus(); - boolean drawCellOutline = parameterStore.get(name, "CellOutline").getStatus(); - boolean cutByLayer = false; - int cellGeometryColor = parameterStore.get(name, "CellGeometry").getI(); - int cellOutlineColor = parameterStore.get(name, "CellOutline").getI(); - int cutLayer = 0; - - // For the v-plot we override some of these settings. - if (window.getProjection() instanceof AProjectionVP) - { - drawCellGeometry = parameterStore.get("VP", "VPlotIsland").getStatus(); - cellGeometryColor = parameterStore.get("VP", "VPlotIsland").getI(); - - int mode = parameterStore.get("VP", "Mode").getI(); - - if (mode >= AProjectionVP.MODE_HCAL_LAYER_0) - { - cutByLayer = true; - cutLayer = mode - AProjectionVP.MODE_HCAL_LAYER_0; - } - else if (mode >= AProjectionVP.MODE_ECAL_LAYER_0) - { - cutByLayer = true; - cutLayer = mode - AProjectionVP.MODE_ECAL_LAYER_0; - } - } - - // Draw filled cells. - if (drawCellGeometry) - { - for (int i = 0; i < index.length; i++) - { - ag.updateDrawParameters(calorimeter.getDrawParameters(1, type[i])); - ag.setColor(colorMap[cellGeometryColor]); - ag.fillPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - - // Draw cell outlines. - if (drawCellOutline) - { - ag.updateDrawParameters(new ADrawParameters(true, cellOutlineColor, 0, 1, 0, 0, false, 1, 0)); - for (int i = 0; i < index.length; ++i) - { - if (!cutByLayer || calorimeter.getSampling(index[i]) == cutLayer) - { - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - } - - /** - * Draws the calorimeter hits. - * - * @param calorimeter ACalorimeterData calorimeter object the hits belong to - * @param display ACoord cell coordinates to be drawn - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - */ - protected static void drawHits(ACalorimeterData calorimeter, ACoord display, AWindow window, AGraphics ag) - { - String name = calorimeter.getCalorimeterName(); - int[] index = display.index; - int[] color = calorimeter.getColor(index); - int[] type = calorimeter.getType(index); - int[] sampling = calorimeter.getSampling(index); - - // This cut is performed just before drawing the hits, the geometry has - // been drawn already. - // This results in the irregular v-plot islands that help the user - // locate a certain position in different views. - boolean cutByLayer = false; - int cutLayer = 0; - - if (window.getProjection() instanceof AProjectionVP) - { - int mode = parameterStore.get("VP", "Mode").getI(); - - if (mode >= AProjectionVP.MODE_HCAL_LAYER_0) - { - cutByLayer = true; - cutLayer = mode - AProjectionVP.MODE_HCAL_LAYER_0; - } - else if (mode >= AProjectionVP.MODE_ECAL_LAYER_0) - { - cutByLayer = true; - cutLayer = mode - AProjectionVP.MODE_ECAL_LAYER_0; - } - } - - AParameter cellGeometry = parameterStore.get(name, "CellGeometry"); - AParameter colorFunction = parameterStore.get(name, "ColorFunction"); - boolean drawFrame = parameterStore.get(name, "Frame").getStatus(); - int frameColor = parameterStore.get(name, "Frame").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - drawFrame=true; - else - drawFrame=false; - - Color[] colorMap = AColorMap.getColors(); - if (colorFunction.getI() == COLOR_FUNC_ENERGY) - { - switch (AColorMap.getColorMap()) - { - case AColorMap.COLOR_MAP_DEFAULT1: - case AColorMap.COLOR_MAP_DEFAULT2: - case AColorMap.COLOR_MAP_M4M5: - case AColorMap.COLOR_MAP_GRAYDET: - case AColorMap.COLOR_MAP_ORIGINAL: - // Use colors. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_HITCOL); - break; - case AColorMap.COLOR_MAP_GRAY: - case AColorMap.COLOR_MAP_BW: - // Use grayscale. - colorMap = AColorMap.getColors(AColorMap.COLOR_MAP_GRAY_HITCOL); - break; - } - } - else if (colorFunction.getI() == COLOR_FUNC_TIME) - { - colorMap = AColorMap.getShades(128); - } - - if (drawFrame && !cellGeometry.getStatus()) - { - for (int i = 0; i < index.length; i++) - { - if (!cutByLayer || sampling[i] == cutLayer) - { - ag.updateDrawParameters(calorimeter.getDrawParameters(0, type[i])); - ag.setColor(colorMap[frameColor]); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - - for (int i = 0; i < index.length; i++) - { - if (!cutByLayer || sampling[i] == cutLayer) - { - ag.updateDrawParameters(calorimeter.getDrawParameters(1, type[i])); - ag.setColor(colorMap[color[i]]); - ag.fillPolygon(calorimeter, index[i], display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - - /** - * Draws the calorimeter histograms. - * - * @param calorimeter ACalorimeterData calorimeter object the histograms - * belong to - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - protected static void drawHistogram(ACalorimeterData calorimeter, AWindow window, AGraphics ag, AProjection2D projection) - { - String name = calorimeter.getCalorimeterName(); - if (!parameterStore.get(name, "Histogram").getStatus()) - return; - - ACoord[] histograms = calorimeter.getUserHistograms(projection); - for (int i = 0; i < histograms.length; i++) - { - ACoord display = window.calculateDisplay(histograms[i]); - AHistogram hist = (AHistogram) histograms[i].source; - hist.completeTowers(display); - - // for rubberband "new list" or "summarize" feature - if (ag.getGraphics2D() instanceof ADrawnGraphics2D) - ((ADrawnGraphics2D) ag.getGraphics2D()).addHistogramData(hist); - - boolean onTop; - if (parameterStore.getUnknown(name, "OnTopHistoFrame") != null) - { - onTop = parameterStore.get(name, "OnTopHistoFrame").getStatus(); - } - else - { - onTop = false; - } - - // Draw frame for the histogram. - if (parameterStore.get(name, "HistoFrame").getStatus() && !onTop) - { - int frameColor = parameterStore.get(name, "HistoFrame").getI(); - - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 0, 0, 1, 0)); - for (int j = 0; j < display.hv[0].length; j++) - { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - - // Draw histogram towers. - int fillColor = parameterStore.get(name, "Histogram").getI(); - ag.updateDrawParameters(new ADrawParameters(true, fillColor, 0, 1, 0, 0)); - for (int j = 0; j < display.hv[0].length; j++) - { - ag.fillPolygon(hist, display.index[j], display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - - /** - * Draws the calorimeter histogram frames. - * - * @param calorimeter ACalorimeterData calorimeter object the histograms - * belong to - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - protected static void frameHistogram(ACalorimeterData calorimeter, AWindow window, AGraphics ag, AProjection2D projection) - { - String name = calorimeter.getCalorimeterName(); - if (!parameterStore.get(name, "Histogram").getStatus()) - return; - - ACoord[] histograms = calorimeter.getUserHistograms(projection); - for (int i = 0; i < histograms.length; i++) - { - ACoord display = window.calculateDisplay(histograms[i]); - AHistogram hist = (AHistogram) display.source; - - hist.completeTowers(display); - - boolean onTop = false; - if (parameterStore.getUnknown(name, "OnTopHistoFrame") != null) - { - onTop = parameterStore.get(name, "OnTopHistoFrame").getStatus(); - } - - // Draw frame for the histogram. - if (parameterStore.get(name, "HistoFrame").getStatus() && onTop) - { - int frameColor = parameterStore.get(name, "HistoFrame").getI(); - - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 0, 1, 0, 0)); - for (int j = 0; j < display.hv[0].length; j++) - { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - - public static void drawEndcapHistogram(ACalorimeterData calorimeter, AWindow window, AGraphics ag, AProjection2D projection) - { - //filter the draw list for the histograms - calorimeter.filterDrawList(projection); - //Draw the histograms. - drawHistogram(calorimeter, window, ag, projection); - // Draw the frames for the histograms. - frameHistogram(calorimeter, window, ag, projection); - } - - - - /** - * getLookupTableArray() parses String[][] s with comma separated values - * (CSV) and converts each number to float lookup table value which is used - * for calorimeter real pulse shapes plots - * @param s String[][] - * @param numLookupTableValues int - * @return float[] - * @throws AAtlantisException - */ - protected static float[] getLookupTableArray(String[][] s, int numLookupTableValues) - throws AAtlantisException - { - float[] r = new float[numLookupTableValues]; - int i = 0; - for(int k = 0; k < s.length; k++) - { - for(int l = 0; l < s[k].length; l++) - { - if("".equals(s[k][l])) - { - // command and new line results into empty value - ignore - continue; - } - try - { - // there shouldn't be more than NUMBER_OF_LOOKUP_VALUES - // i.e. numLookupTableValues - if(i >= numLookupTableValues) - { - String m = "more lookup values than NUMBER_OF_LOOKUP_VALUES: " + - i + " >= " + numLookupTableValues; - throw new AAtlantisException(m); - } - r[i] = Float.valueOf(s[k][l]).floatValue(); - i++; - } - catch(NumberFormatException ex) - { - throw new AAtlantisException("number format exception: " + s[k][l]); - } - } - } - - // now the i counter shall be equal to numLookupTableValues - if(i != numLookupTableValues) - { - throw new AAtlantisException("incorrect number to items (" + i + ") " + - "in the lookup table, should be " + numLookupTableValues); - } - - // all right, return the result float array - return r; - - } // getLookupTableArray() ---------------------------------------------- - - - - /** - * Calculate real pulse shapes values based on the values in the - * lookup tables (parameters amplitude and time, etc) - - * @param xTime double - * @param cellTime double - * @param cellPedestal double - * @param energy double - * @param amplitude float[] lookup table - * @param time float[] lookup table - * @param numerOfLookupValues int - * @return double - * @throws AAtlantisException - */ - protected double getPhysicsPulseShape(double localTime, - double cellPedestal, double energy, - float[] amplitude, float[] time, - int numerOfLookupValues) - throws AAtlantisException - { - double tdiv = 0.0; - int lookup = 0; - double xpulse = 0.0; - - tdiv = time[1] - time[0]; - lookup = (int) ((localTime - time[0]) / tdiv); - - if(lookup < 0) - { - lookup = 0; - } - if(lookup >= numerOfLookupValues - 1) - { - lookup = numerOfLookupValues - 2; // -1 was off by 1 - } - - try - { - if(lookup == 0 || lookup == numerOfLookupValues - 2) - { - xpulse = amplitude[lookup]; - } - else - { - xpulse = amplitude[lookup] + ((amplitude[lookup + 1] - - amplitude[lookup]) / tdiv) * (localTime - time[lookup]); - } - } - catch(ArrayIndexOutOfBoundsException ex) - { - String m = CALORIMETER_NAME + " getPhysicsPulseShape():\n" + - " lookup index out of bound: lookup = " + lookup; - throw new AAtlantisException(m); - } - - return (xpulse * energy) + cellPedestal; - - } // getPhysicsPulseShape() --------------------------------------------- - - - - /** - * - * Events from DPD don't contain all necessary data - * if all adc counts are 0, then print info message and - * no pulse shape plot window as it may lead to confusion. - * This method is aimed to check availability of adc counts digits. - * - * @param adcCountsLocal - * @return true if any ADC counts are non-zero - */ - protected static boolean checkADCCountsAvailability(int[][] adcCountsLocal) - { - boolean adcCountsAvailable = false; - - for(int x = 0; x < adcCountsLocal.length; x++) - { - for(int y = 0; y < adcCountsLocal[0].length; y++) - { - if(adcCountsLocal[x][y] != 0) - { - adcCountsAvailable = true; - break; - } - } - if(adcCountsAvailable) - { - break; - } - } - - return adcCountsAvailable; - - } // checkADCCountsAvailability() --------------------------------------- - - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ACalorimeterRPSPLT.java b/graphics/AtlantisJava/src/atlantis/data/ACalorimeterRPSPLT.java deleted file mode 100644 index 9f8890bec80c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ACalorimeterRPSPLT.java +++ /dev/null @@ -1,260 +0,0 @@ -package atlantis.data; - -import java.util.HashMap; - -import atlantis.utils.ALogger; -import atlantis.utils.AAtlantisException; - -/** - * - * Calorimeter Real Pulse Shape Plot Lookup - * Tables. The class accommodates lookup tables (arrays) for the Tile and LAr, - * FCAL and HEC calorimeters. If the real pulse shape plots data are found in - * the event files, the corresponding arrays within this class are initialised - * from A[TILE|LAr|FCAL|HEC]Data class(es). The arrays are initialised from - * CSV (comma separated values files) just once per Atlantis session. - * - * @author Zdenek Maxa - */ -public final class ACalorimeterRPSPLT -{ - private static ALogger logger = ALogger.getLogger(ACalorimeterRPSPLT.class); - - // TILE calorimeter, lookup table time values - protected static float[] TILE_TIME = null; - // TILE calorimeter, lookup table amplitude values - protected static float[] TILE_AMPLITUDE = null; - - - // FCAL calorimeter, lookup table time values - protected static float[] FCAL_TIME = null; - // FCAL calorimeter, lookup table layer 0, amplitude values - protected static float[] FCAL_LAYER0_AMPLITUDE = null; - // FCAL calorimeter, lookup table layer 1, amplitude values - protected static float[] FCAL_LAYER1_AMPLITUDE = null; - // FCAL calorimeter, lookup table layer 2, amplitude values - protected static float[] FCAL_LAYER2_AMPLITUDE = null; - - - // HEC calorimeter, lookup table time values - protected static float[] HEC_TIME = null; - // HEC calorimeter, lookup table amplitude values - protected static float[] HEC_AMPLITUDE = null; - - - - - // LAr calorimeter, lookup tables - // for time (the same array for both - // barrel/endcap, all layer and regions and eta ranges - // currently (2009-02-11) there are 58 various arrays for LAr, it - // is not sustainable to have all these in separate arrays - for LAr - // there will be defined a container - keys are lookup tables names - // as defined in the lookup table file and values are float[] arrays - private static HashMap<String, float[]> larTables = null; - - // set the LAr table keys in a static block - // explanation of the LAr lookup tables names (the names are identical - // to comma separated values array names as in the look up table file): - // LAR_TIME - time constants - used for barrel/endcap, all layers, - // all regions, all eta ranges - // LAR_BARREL_L1_R0_AMPLITUDE - barrel, layer 1, region 0, etc, etc - // LAR_ENDCAP_L0_R0_ETA0_AMPLITUDE - endcap, layer 0, region 0, eta - // range 0 - very many of these - // bother to define the array names here to be really safe ... otherwise - // could just rely on the CSV file ... - static - { - larTables = new HashMap<String, float[]>(70); // not more arrays than 70 - - larTables.put("LAR_TIME", null); - larTables.put("LAR_BARREL_LAYER1_REGION0_AMPLITUDE", null); - larTables.put("LAR_BARREL_LAYER1_REGION1_AMPLITUDE", null); - larTables.put("LAR_BARREL_LAYER2_REGION0_AMPLITUDE", null); - larTables.put("LAR_BARREL_LAYER2_REGION1_AMPLITUDE", null); - larTables.put("LAR_BARREL_LAYER3_REGION0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER0_REGION0_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA4_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA5_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA6_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION0_ETA7_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION1_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION2_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION2_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION2_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION2_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION3_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION3_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION3_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION4_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION4_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION4_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION4_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION4_ETA4_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER1_REGION5_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA4_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA5_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA6_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION0_ETA7_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA4_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA5_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA6_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA7_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA8_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA9_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER2_REGION1_ETA10_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA0_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA1_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA2_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA3_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA4_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA5_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA6_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA7_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA8_AMPLITUDE", null); - larTables.put("LAR_ENDCAP_LAYER3_REGION0_ETA9_AMPLITUDE", null); - } - - - - - public static boolean areFCALLookupTablesInitialized() - { - if(FCAL_LAYER0_AMPLITUDE != null && - FCAL_LAYER1_AMPLITUDE != null && - FCAL_LAYER2_AMPLITUDE != null && - FCAL_TIME != null) - { - return true; - } - else - { - return false; - } - - } // areFCALLookupTablesInitialized() ----------------------------------- - - - - public static boolean areHECLookupTablesInitialized() - { - if(HEC_TIME != null && HEC_AMPLITUDE != null) - { - return true; - } - else - { - return false; - } - - } // areHECLookupTablesInitialized() ------------------------------------ - - - - public static boolean areTileLookupTablesInitialized() - { - if(TILE_TIME != null && TILE_AMPLITUDE != null) - { - return true; - } - else - { - return false; - } - - } // areTileLookupTablesInitialized() ----------------------------------- - - - - /** - * Method is called at LAr constructor, i.e. at the beginning of each - * event to check if all lookup tables for LAr are properly initialised. - * The check is performed only when other necessary LAr are is available - * in a given event file. - * @return true if all float arrays were properly initialised - */ - public static boolean areLarLookupTablesInitialized() - { - // iterate over all keys in the container and check if all - // float arrays were properly initialised - for(String key : larTables.keySet()) - { - if(larTables.get(key) == null) - { - logger.error("LAr real pulse shapes plots lookup table " + - "\"" + key + "\" was not initialised."); - return false; - } - } - - return true; - - } // areLarLookupTablesInitialized() ------------------------------------ - - - - public static void setLarTable(String key, float[] array) throws AAtlantisException - { - logger.debug("Setting LAr pulse shapes lookup table \"" + key + "\""); - - if(larTables.containsKey(key)) - { - // it certainly already should contain the key (defined above) - if(larTables.get(key) != null) - { - throw new AAtlantisException("LAr pulse shapes lookup table \"" + - key + "\" has already been defined."); - } - else - { - larTables.put(key, array); - } - } - else - { - throw new AAtlantisException("LAr pulse shapes lookup table - " + - "entry \"" + key + "\" has not been created."); - } - - } // setLarTable() ------------------------------------------------------ - - - - public static float[] getLarTable(String key) throws AAtlantisException - { - logger.debug("Getting LAr pulse shapes lookup table \"" + key + "\""); - if(larTables.containsKey(key)) - { - float[] r = larTables.get(key); - if(r == null) - { - throw new AAtlantisException("LAr pulse shape lookup table " + - "key \"" + key + "\" is null."); - } - else - { - return r; - } - } - else - { - throw new AAtlantisException("LAr pulse shape lookup table " + - "entry \"" + key + "\" has not been created."); - } - - } // getLarTable() ------------------------------------------------------ - - -} // class ACalorimeterRPSPLT =============================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/AClusterData.java b/graphics/AtlantisJava/src/atlantis/data/AClusterData.java deleted file mode 100644 index 9428320eec97..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AClusterData.java +++ /dev/null @@ -1,385 +0,0 @@ -package atlantis.data; - -import atlantis.canvas.AWindow; -import atlantis.event.AAssociation; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.A3Vector; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Calo Clusters for the moment made from LAr cells - * - * Also contain AOD Calo Clusters from 24/10/2006 - */ -public class AClusterData extends AData -{ - protected float[] eT; - protected float[] eta; - protected float[] phi; - - public String getParameterGroup() - { - return "Cluster"; - } - - @Override - public String getName() - { - return "Cluster"; - } - - public String getNameScreenName() - { - return "Cluster"; - } - - public float getET(int index) - { - return eT[index]; - } - - public float getEta(int index) - { - return eta[index]; - } - - public float getPhi(int index) - { - return phi[index]; - } - - AClusterData(AHashMap p, AEvent e) - { - super(p,e); - - eta = p.getFloatArray("eta"); - phi = p.getFloatArray("phi"); - if (p.get("et") != null) - eT = p.getFloatArray("et"); - else - { - float[] energy = p.getFloatArray("energy"); - eT = new float[numData]; - for (int i = 0; i < numData; ++i) - eT[i] = (float) Math.abs(energy[i] * Math.cos(AMath.lambda(eta[i]))); - } - - String assocKey = getName() + getStoreGateKey(); - if (p.get("numCells") != null) - { - event.getAssociationManager().add(new AAssociation(assocKey, "LAr", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - event.getAssociationManager().add(new AAssociation(assocKey, "TILE", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - } - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - protected void applyCuts() - { - cutIndex(); - cut("CutsCalo", "ClusterET", " |ET|", eT); - cutPhi(phi); - cutEta(eta); - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - switch (colorFunction) - { - case 0: // by constant - colorByConstant(); - break; - case 1: // by index - colorByIndex(); - break; - case 2: // by objects - colorByObjects(); - break; - } - return 3; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",eT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",eT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",eT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",eT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n ET = "); - msg.append(String.format("%.3f",eT[index])); - msg.append(" GeV\n E = "); - msg.append(String.format("%.3f",Math.abs(eT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index])) + AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - return msg.toString(); - } - - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumE = 0.; - double sumET = 0.; - - for (int i = 0; i < numDraw; ++i) - { - sumET += Math.abs(eT[listdl[i]]); - sumE += Math.abs(eT[listdl[i]] / Math.cos(AMath.lambda(eta[listdl[i]]))); - } - - StringBuffer msg = new StringBuffer(""); - msg.append(numDraw); - msg.append(" "); - msg.append(getStoreGateKey() != null ? getStoreGateKey() : getNameScreenName()); - msg.append(" sum(ET) = "); - msg.append(String.format("%.1f",sumET)); - msg.append(" sum(E) = "); - msg.append(String.format("%.1f",sumE)); - - return msg.toString(); - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A3Vector start = A3Vector.fromRhoPhiZ(0., 0., 0.); - double tL = AMath.tanLambda(eta[k]); - A3Vector stop = A3Vector.fromRhoPhiZ(1., phi[k], tL); - A3Vector v = (stop.subtract(start)).normalize(); - double p = eT[k] / Math.sqrt(1. - v.z * v.z); - sum.add(new A4Vector(v.scale(p), 0.)); - } - - return sum; - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP) - { - drawVP(window, ag, projection); - } - else - { - super.draw(window, ag, projection); - } - } - - private void drawVP(AWindow window, AGraphics ag, AProjection2D projection) - { - ACoord centers=window.calculateDisplay(getUser(projection)); - int[] drawlist=centers.index; - double eLimit=0.025; - int numPoints=25; - double[][][] hv=new double[2][drawlist.length][numPoints]; //circle - - for(int i=0; i<drawlist.length; ++i) - { - int list=drawlist[i]; - double e; - e = Math.abs(eT[list]); - int d=(int)(Math.sqrt((e/eLimit)/Math.PI)); - if(d==0) d=1; - for(int j=0; j<numPoints; j++) - { - hv[0][i][j]=centers.hv[0][0][i]+d*Math.cos(Math.PI*2*j/(numPoints-1)); - hv[1][i][j]=centers.hv[1][0][i]+d*Math.sin(Math.PI*2*j/(numPoints-1)); - } - } - ag.draw(new ACoord(hv, drawlist, this, ACoord.POLYLINES)); - } - - protected ACoord getVPUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - h[i]=eta[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - double dphi = Math.toRadians(0.5); - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - double cosPlus = Math.cos(phiPlus); - double sinPlus = Math.sin(phiPlus); - double cosMinus = Math.cos(phiMinus); - double sinMinus = Math.sin(phiMinus); - - // Rho range of LAr Detector (EM) is about between [148.175, 198.47] - // Rho range of TILE Detector (Had) is about between [229, 386] - double rhoMax = 380; - double rhoMinus = 155; - - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double rhoPlus = rhoMax; - if(Math.abs(eT[list]) < maxEnergy) - rhoPlus = rhoMinus + (rhoMax - rhoMinus) * Math.abs(eT[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = rhoMinus * cosPlus; - hv[1][i][0] = rhoMinus * sinPlus; - // x1, y1 - hv[0][i][1] = rhoPlus * cosPlus; - hv[1][i][1] = rhoPlus * sinPlus; - // x2, y2 - hv[0][i][2] = rhoPlus * cosMinus; - hv[1][i][2] = rhoPlus * sinMinus; - // x3, y3 - hv[0][i][3] = rhoMinus * cosMinus; - hv[1][i][3] = rhoMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getFRUser() - { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - double dtheta = Math.toRadians(0.5); - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list]-phiMid); - double rSign; - if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) - rSign = -1; - else - rSign = 1; - - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta[list]))) * 2.0; - if ((eta[list] > 0.) && (rSign == -1)) - theta = 2 * Math.PI - theta; - else if ((eta[list] < 0.) && (rSign == -1)) - theta += Math.PI; - else if ((eta[list] < 0.) && (rSign == 1)) - theta = Math.PI - theta; - - double thetaPlus = theta + dtheta; - double thetaMinus = theta - dtheta; - double cosPlus = Math.cos(thetaPlus); - double sinPlus = Math.sin(thetaPlus); - double cosMinus = Math.cos(thetaMinus); - double sinMinus = Math.sin(thetaMinus); - - // decide the region based on the theta value - final byte LAR = 0; - final byte LAR_ENDCAP = 1; - final byte FCAL_EM = 2; - byte region = LAR; - // hard-coded value is based on the values in AGeometry.xml - if(Math.abs(Math.tan(theta)) >= 0.0778 && Math.abs(Math.tan(theta)) < 0.4828) - region = LAR_ENDCAP; - else if(Math.abs(Math.tan(theta)) < 0.0778) - region = FCAL_EM; - - double radiusMinus = 0.; - switch(region) - { - // use fixed rho/z to determine the lower radius value - case LAR: - radiusMinus = 155 / Math.abs(Math.sin(theta)); - break; - case LAR_ENDCAP: - radiusMinus = 380 / Math.abs(Math.cos(theta)); - break; - case FCAL_EM: - radiusMinus = 470 / Math.abs(Math.cos(theta)); - break; - } - double radiusMax = radiusMinus + 200; - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double radiusPlus = radiusMax; - if(Math.abs(eT[list]) < maxEnergy) - radiusPlus = radiusMinus + (radiusMax - radiusMinus) * Math.abs(eT[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = radiusMinus * cosPlus; - hv[1][i][0] = radiusMinus * sinPlus; - // x1, y1 - hv[0][i][1] = radiusPlus * cosPlus; - hv[1][i][1] = radiusPlus * sinPlus; - // x2, y2 - hv[0][i][2] = radiusPlus * cosMinus; - hv[1][i][2] = radiusPlus * sinMinus; - // x3, y3 - hv[0][i][3] = radiusMinus * cosMinus; - hv[1][i][3] = radiusMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ACompositeParticleData.java b/graphics/AtlantisJava/src/atlantis/data/ACompositeParticleData.java deleted file mode 100755 index 5537e5b0331f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ACompositeParticleData.java +++ /dev/null @@ -1,114 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Reconstructed CompositeParticle - */ -public class ACompositeParticleData extends AAODData -{ - private int[] pdgId; - private float[] charge; - private String[] label; - private String[] typeEV; - - ACompositeParticleData(AHashMap p, AEvent e) - { - super(p,e); - pdgId = p.getUnsureIntArray("pdgId"); - charge=p.getUnsureFloatArray("charge"); - label=p.getStringArray("label"); - typeEV=p.getStringArray("typeEV"); - } - - public String getParameterGroup() - { - return "CompositeParticle"; - } - - @Override - public String getName() - { - return "CompositeParticle"; - } - - public int getPdgId(int index) - { - return pdgId[index]; - } - - public float getCharge(int index) - { - return charge[index]; - } - - public String getLabel(int index) - { - return label[index]; - } - - public String getTypeEV(int index) - { - return typeEV[index]; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" = "); - msg.append(id[index]); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - if (charge != null) - { - msg.append("\n Charge = "); - msg.append(charge[index]); - } - if(pdgId != null) - { - if(pdgId[index]!=0) - msg.append("\n Type = " + APDGTable.getName(pdgId[index]) + " (type code " + pdgId[index] + ")" ); - else - msg.append("\n Type = unknown (type code " + pdgId[index] + ")" ); - } - msg.append("\n TypeEV = " + typeEV[index]); - if (label != null) - msg.append("\n Label = " + label[index]); - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ADHelix.java b/graphics/AtlantisJava/src/atlantis/data/ADHelix.java deleted file mode 100755 index 6e1228528da9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ADHelix.java +++ /dev/null @@ -1,539 +0,0 @@ -package atlantis.data; - -import java.awt.geom.Point2D; -import java.util.Vector; -import java.awt.Rectangle; - -import atlantis.canvas.AWindow; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.graphics.ACoord; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjection3D; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -/** - * Helix in a format suitable for drawing given as a circle with - * centre point and radius etc. - * - * phi is the angle seen from the primary vertex - * a = alpha = the angle as seen for the center of the circle - * - */ -public class ADHelix -{ - private final static ALogger logger = ALogger.getLogger(ADHelix.class); - - // parameters used internally - private static final APar parameterStore = APar.instance(); - private static final AParameter rToPar = parameterStore.get("RTr", "RadiusTr"); - private static final AParameter lToPar = parameterStore.get("RTr", "LineTr"); - private static final AParameter zToPar = parameterStore.get("RTr", "ZTr"); - private static final int callDepthCut = parameterStore.get("RTr", "CallDepth").getI();; - - /** The associated helix object. */ - public final AHelix helix; - - // description of helix - private final double rC, xC, yC, ch, a0, x0, y0, z0, bz, cosA0, sinA0; - // position along helix - private final double aStart, aEnd; - - /** Attempt to encapsulate the "current position" variables. */ - private static class HelixPoint { - double x, y, z, rho, phi; - } - - private double startPhi; // the phi value of starting point of "v" - // TODO: Would prefer this not to be part of the state of the helix object. - private boolean startMark; // true when calculating start point, false otherwise - - ADHelix(AOldHelix h) { - this(new AHelix(h)); - } - - ADHelix(AHelix h) - { - helix = h; - double[] perigee = h.getPar(); // d0, z0, phi0, cotanTheta, q/pT - - AParameter curvatureParameter = parameterStore.get("Event", "Curvature"); - if (curvatureParameter != null) { - rC = curvatureParameter.getD() / Math.abs(perigee[4]); - } else { - rC = (100/0.6) / Math.abs(perigee[4]); - } - ch = AMath.getSign(perigee[4]); - a0 = Math.toDegrees(perigee[2]) + ch * 90.; - double a0Rad = Math.toRadians(a0); - cosA0 = Math.cos(a0Rad); - sinA0 = Math.sin(a0Rad); - z0 = perigee[1]; - double d0 = perigee[0]; - double signD0 = ch; - d0 *= signD0; - x0 = d0 * cosA0; - y0 = d0 * sinA0; - double SD0 = 1.; - double SRC = 1.; - double r0 = SD0 * d0 - SRC * rC; - xC = r0 * cosA0; - yC = r0 * sinA0; - bz = rC * Math.toRadians(perigee[3]); - double rTo = rToPar.getD(); - //Check if track is limited by end vertex - if ( helix.getRhoEndVertex() > 0. ) - rTo = Math.min(rTo,helix.getRhoEndVertex()); - double zTo = zToPar.getD(); - /*******************************************************************************/ - //Adrian Vatchinsky, Andy Haas (NYU) - //Import the coordinates of the primary vertex in order to calculate new starting angle - AEventManager eventManager = AEventManager.instance(); - AEvent currentEvent = eventManager.getCurrentEvent(); - if (helix.getRho(helix.getAlphaMin())!=0 || currentEvent==null) { // FIXME: doubles compared for equality - aStart = helix.getAlphaMin(); // old, DCA to 0,0 - } else { // new, DCA to PV - double[] primaryVertex = currentEvent.getPrimaryVertex(); - double xV = primaryVertex[0]; double yV = primaryVertex[1]; - aStart = helix.getAlphaMin() + ch*Math.toDegrees(Math.atan2(yC,xC)-Math.atan2(yC-yV,xC-xV)); - } - /*******************************************************************************/ - HelixPoint point = pointAt(aStart); - // don't draw tracks starting outside the tracking region - if(Math.abs(point.rho) > rTo || Math.abs(point.z) > zTo) - { - this.aEnd = aStart; - return; - } - //Calculate max phi angle -> no track can have more than 180 deg - double aEndMax = Math.min(aStart + 180., 180.); - //Also the track should not stick out of the rTo zylinder - double aEndR = intersectWithRadialCylinder(rTo, aStart, aEndMax); - // nor should it go beyond the max. z-extension - double aEndZ = intersectWithZPlanes(zTo, aStart, aEndMax); // or beyond the end-vertex radius, if given - double aEndTmp = Math.min(aEndMax, aEndR); - if(aEndZ > aStart) aEndTmp = Math.min(aEndTmp, aEndZ); - this.aEnd = Math.min(aEndTmp, aEndMax); - } - - - // calculate phi on track at intersection - // Cylinder is infinite in Z direction - public double intersectWithRadialCylinder(double rCyl, double aStart, - double aEnd) - { - if(rC <= 0.) return aStart; - double r0 = Math.sqrt(xC * xC + yC * yC); - double bb = (rCyl * rCyl - rC * rC - r0 * r0) / (2. * rC * r0); - double rhoStart = getRho(aStart); - double rhoEnd = getRho(aEnd); - if(rCyl >= rhoStart && rCyl >= rhoEnd) return aEnd; - if(rCyl <= rhoStart && rCyl <= rhoEnd) return aStart; - if(Math.abs(bb) > 1.) - { - // needs to be understood better (Hans) - // event file: acr_muontrack_problem_event.xml - logger.warn("Bug in ADHelix " + rCyl + " " + rhoStart + " " + rhoEnd); - return aEnd; - } - double cc = Math.toDegrees(Math.acos(bb)); - if(Math.abs(cc) > 360) - throw new Error("error in cc in dhelix"); - double gA = Math.toDegrees(Math.atan2(yC, xC)); - double a1 = ch * (a0 - gA + cc); - double a2 = ch * (a0 - gA - cc); - if(a1 < 0.) a1 += 360.; - if(a2 < 0.) a2 += 360.; - if(a1 >= 360.) a1 -= 360.; - if(a2 >= 360.) a2 -= 360.; - return Math.min(a1, a2); - } - - - // calculate phi on track at intersection - public double intersectWithZPlanes(double zCyl, double aStart, double aEnd) - { - double zMin = 20.; - double aZ = aEnd; - if(zCyl >= zMin && bz != 0.) - { - double aZPlus = (zCyl - z0) / bz; - double aZMinus = ( -zCyl - z0) / bz; - if(aZPlus < aZ && aZPlus > aStart) aZ = aZPlus; - if(aZMinus < aZ && aZMinus > aStart) aZ = aZMinus; - } - return aZ; - } - - - // calculate phi on track at intersection - // cylinder finite in Z - public double intersectWithCylinder(boolean useR, double rCyl, boolean useZ, - double zCyl) - { - double aStart = 0.; - double aEndMax = 180.; - double zMin = 20.; - double aEndR = 0.; - if(useR) - aEndR = intersectWithRadialCylinder(rCyl, aStart, aEndMax); - double aEndZ = 0.; - if(useZ && zCyl >= zMin && bz != 0.) - { - aEndZ = intersectWithZPlanes(zCyl, aStart, aEndMax); - return Math.min(aEndR, aEndZ); - } - else - return aEndR; - } - - - // a... angle in deg starting with 0 meaning point of closest approach - private HelixPoint pointAt(double a) - { - HelixPoint point = new HelixPoint(); - double aRad = Math.toRadians(a0 - ch * a); - point.x = x0 + rC * (Math.cos(aRad) - cosA0); - point.y = y0 + rC * (Math.sin(aRad) - sinA0); - point.z = z0 + bz * a; - double[] primaryVtx = AParameterUtilities.getPrimaryVertex(); - double dx = point.x - primaryVtx[0]; - double dy = point.y - primaryVtx[1]; - point.rho = Math.sqrt(dx * dx + dy * dy); - double phi0 = Math.toDegrees(Math.atan2(dy, dx)); - double phiMid2 = parameterStore.get("RZ", "Phi").getD(); - point.phi = AMath.nearestPhiDegrees(phi0,phiMid2); - return point; - } - - - // s1 and s2 are the extreme values of phi - // used to avoid tracks being drawn with phi discontinuity - // in phi projections - // = FiMid in atlantis fortran ask Hans Drevermann - public double setPhiStart(double s1, double s2) - { - double phi1 = getPhi(s1); - double phi2 = getPhi(s2); - double phiM = getPhi((s1 + s2) / 2); - // doesn't work for all tracks but for most - if(Math.abs(phi1 - phi2) > 180. || Math.abs(phi1 - phiM) > 180. || - Math.abs(phi2 - phiM) > 180.) - { - if(phi1 - phiM > 180.) phi1 -= 360.; - if(phi2 - phiM > 180.) phi2 -= 360.; - if(phi1 - phiM < -180.) phi1 += 360.; - if(phi2 - phiM < -180.) phi2 += 360.; - - // must be something wrong here, phiM is the same using the - // following code, then why use if ... else ... - if(phi1 < phiM && phiM < phi2) - phiM = (phi1 + phi2) / 2.; - else if(phi1 > phiM && phiM > phi2) - phiM = (phi1 + phi2) / 2.; - else - { - phiM = (phi1 + phi2) / 2.; - } - } - if(phiM > 360.) - phiM -= 360.; - if(phiM < 0.) - phiM += 360.; - return phiM; - } - - - public double getAStart() - { - return aStart; - } - - - public double getAEnd() - { - return aEnd; - } - - - public ACoord getYXPoint(double a) - { - HelixPoint point = pointAt(a); - return new ACoord(point.x, point.y, -1); - } - - - public ACoord getRZPoint(double a) - { - HelixPoint point = pointAt(a); - double phiMid2 = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(Math.toRadians(point.phi) - phiMid2); - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - return new ACoord(point.z, point.rho, -1); - else - return new ACoord(point.z, -point.rho, -1); - } - - - public ACoord get3DPoint(double a) - { - HelixPoint point = pointAt(a); - double[] point3D = {point.x,point.y,point.z}; - point3D = AProjection3D.getRotated(point3D); - return new ACoord(point3D[0], point3D[1], -1); - } - - - public double[] get3DPointAsArray(double a) - { - HelixPoint point = pointAt(a); - double[] point3D = new double[] {point.x, point.y, point.z }; - point3D = AProjection3D.getRotated(point3D); - return point3D; - } - - - public ACoord getXZPoint(double a) - { - HelixPoint point = pointAt(a); - double phiC = AProjectionXZ.getPhi(); - return new ACoord(point.z, point.rho * Math.cos(Math.toRadians(point.phi - phiC)), -1); - } - - - public ACoord getYZPoint(double a) - { - HelixPoint point = pointAt(a); - double phiC = AProjectionXZ.getPhi(); - return new ACoord(point.z, point.rho * Math.sin(Math.toRadians(point.phi - phiC)), -1); - } - - - public ACoord getFZPoint(double a) - { - HelixPoint point = pointAt(a); - double temp = Math.toDegrees(AParameterUtilities.getPhiStereo(point.rho, Math.toRadians(point.phi), point.z)); - return new ACoord(point.z, temp, -1); - } - - - public ACoord getFRPoint(double a) - { - HelixPoint point = pointAt(a); - double temp = Math.toDegrees(AParameterUtilities.getPhiStereo(point.rho, Math.toRadians(point.phi), point.z)); - return new ACoord(point.rho, temp, -1); - } - - - public ACoord getVPPoint(double a, int sign) - { - HelixPoint point = pointAt(a); - if(startMark) // start point - { - startPhi = point.phi; // phi is between 0 and 360 - } - else - { - point.phi = AMath.nearestPhiDegrees(point.phi, startPhi); - } - return new ACoord(AParameterUtilities.eta(point.z, point.rho) + - sign * AProjectionVP.getDeltaEta(point.rho, point.z), point.phi, -1); - } - - - public ACoord getLEGOPoint(double a) - { - //added by Mark Stockton - HelixPoint point = pointAt(a); - double temp = Math.toDegrees(AParameterUtilities.getPhiStereo(point.rho, Math.toRadians(point.phi), point.z)); - return new ACoord(AParameterUtilities.eta(point.z, point.rho), temp, -1); - } - - - public double getPhi(double a) - { - HelixPoint point = pointAt(a); - return point.phi; - } - - - public double getEta(double a) - { - HelixPoint point = pointAt(a); - return AParameterUtilities.eta(point.z, point.rho); - } - - - private double getRho(double a) - { - HelixPoint point = pointAt(a); - return point.rho; - } - - - /** Draw helix in display space in an iterative manner. */ - public ACoord drawHelix(AWindow window, AProjection2D projection, double s1, double s2) - { - Vector<Point2D.Double> pointsOnHelix = new Vector<Point2D.Double>(100); - double dPrevious = 999.; - int callDepth = 0; - // get the point at the beginning and end of the helix, defined by the phi-values (s1,s2) - startMark = true; - ACoord d1 = window.calculateDisplay(projection.getUserPoint(this, s1)); - double h1 = d1.hv[0][0][0]; - double v1 = d1.hv[1][0][0]; - startMark = false; - ACoord d2 = window.calculateDisplay(projection.getUserPoint(this, s2)); - double h2 = d2.hv[0][0][0]; - double v2 = d2.hv[1][0][0]; - pointsOnHelix.add(new Point2D.Double(h1, v1)); - // We are simply adding points here, in the end the helix is drawn as a polyline - drawHelix(pointsOnHelix, window, projection, s1, h1, v1, s2, h2, v2, - dPrevious, callDepth); - int numPoints; - if(projection instanceof AProjectionVP) - { - numPoints = pointsOnHelix.size(); - } - else - { - numPoints = pointsOnHelix.size() + 1; // add 1 to add a point for the line - } - double[][][] hv = new double[2][1][numPoints]; - int[] index = new int[1]; - Point2D.Double p; - if(projection instanceof AProjectionVP) - { - for(int k = 0; k < numPoints; ++k) - { - p = (Point2D.Double) pointsOnHelix.elementAt(k); - hv[0][0][k] = p.getX(); - hv[1][0][k] = p.getY(); - } - } - else - { - for(int k = 0; k < numPoints - 1; ++k) - { - p = (Point2D.Double) pointsOnHelix.elementAt(k); - hv[0][0][k] = p.getX(); - hv[1][0][k] = p.getY(); - } // first attempt for line... - if(numPoints > 2) - { - double dx = hv[0][0][numPoints - 2] - hv[0][0][numPoints - 3]; - double dy = hv[1][0][numPoints - 2] - hv[1][0][numPoints - 3]; - double x0 = hv[0][0][numPoints - 2] - hv[0][0][0]; - double y0 = hv[1][0][numPoints - 2] - hv[1][0][0]; - - // InDet -> Track -> Rho Track linearly is 0 by default - // and the value is meant beyond Rho Track as Helix parameter, - // hence rToPar + lToPar is used instead of former lToPar only - double dtopar = ( (rToPar.getD() + lToPar.getD()) / rToPar.getD()) * - Math.sqrt(x0 * x0 + y0 * y0); - double cophi = dx / Math.sqrt(dx * dx + dy * dy); - double siphi = dy / Math.sqrt(dx * dx + dy * dy); - double addl = Math.sqrt((y0 * siphi + x0 * cophi) * - (y0 * siphi + x0 * cophi) - - x0 * x0 - y0 * y0 + dtopar * dtopar); - double addlen = Math.min(Math.abs( -(y0 * siphi + x0 * cophi) + - addl), - Math.abs( -(y0 * siphi + x0 * cophi) - - addl)); - hv[0][0][numPoints - 1] = x0 + addlen * cophi + hv[0][0][0]; - hv[1][0][numPoints - 1] = y0 + addlen * siphi + hv[1][0][0]; - } - } - return new ACoord(hv, index); - } - - - /** Called recursively. */ - private void drawHelix(Vector<Point2D.Double> pointsOnHelix, AWindow window, AProjection2D projection, - double s1, double h1, double v1, double s2, double h2, double v2, - double dPrevious, int callDepth) - { - double D_MAX = 1.; - double h21 = h2 - h1; - double v21 = v2 - v1; - // nothing left to draw - if(h21 == 0. && v21 == 0.) - return; - // calculate midpoint - double sM = 0.5 * (s1 + s2); - ACoord dispM = window.calculateDisplay(projection.getUserPoint(this, sM)); - double hM = dispM.hv[0][0][0]; - double vM = dispM.hv[1][0][0]; - - // For speed reasons we make sure we aren't doing a lot of subdivison - // on helix segments outside the view area - boolean isinview = true; - - if (callDepth > 2) { - // Check if bounding box of segment is on the screen anywhere - // Don't try this until we've divided a few times just in case we - // have a really curly helix to deal with - Rectangle wdim = window.getCurrDisp(); - - int left = (int)h1; - int top = (int)v1; - int width = (int)(h2 - h1); - int height = (int)(v2 - v1); - - // Make sure the box isn't upside down or zero in size as this - // seemed to be causing a few problems - if (width < 0) { left += width; width = -width; } - if (height < 0) { top += height; height = -height; } - if (width == 0) { width = 1; } - if (height == 0) { height = 1; } - - Rectangle bound = new Rectangle(left, top, width, height); - - if (!wdim.intersects(bound)) { - // Prevent any further sub-division - isinview = false; - } - } - - // calculate distance of midpoint from straight line approximation - double hM1 = hM - h1; - double vM1 = vM - v1; - double temp = (v21 * hM1 - h21 * vM1); - double dM = temp * temp / (v21 * v21 + h21 * h21); - // this iteration and previous one within tolerance - if(dPrevious < D_MAX && dM < D_MAX) - { - pointsOnHelix.add(new Point2D.Double(h2, v2)); - } - else - { - if(callDepth < callDepthCut && isinview) - { - // split track in two and iterate - drawHelix(pointsOnHelix, window, projection, s1, h1, v1, sM, hM, - vM, dM, callDepth + 1); - drawHelix(pointsOnHelix, window, projection, sM, hM, vM, s2, h2, - v2, dM, callDepth + 1); - } - else - { - pointsOnHelix.add(new Point2D.Double(hM, vM)); - pointsOnHelix.add(new Point2D.Double(h2, v2)); - } - } - } - - public double getxC() { - return xC; - } - - public double getyC() { - return yC; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AETMisData.java b/graphics/AtlantisJava/src/atlantis/data/AETMisData.java deleted file mode 100644 index 2bba9e11185b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AETMisData.java +++ /dev/null @@ -1,562 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.canvas.AWindow; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -import java.awt.Stroke; -import java.awt.BasicStroke; -import java.awt.geom.Point2D; - -/** - * AETMisData - Missing ET class implementation. Although it is always - * supposed that there will be only 1 item of the datatype, it's now done - * generically as a normal datatype (assuming there is numData items, this - * numData shall always be 1 for ETMis) - */ -public class AETMisData extends AData { - // data read in from the event file - - protected float[] et; - protected float[] etx; - protected float[] ety; - // calculated data - protected float[] sumet; - protected float[] phi; // in radians - protected final int YX_NUMPOINTS = 200; - - AETMisData(AHashMap p, AEvent e) throws AAtlantisException { - super(p, e); - - sumet = p.getFloatArray("et"); - etx = p.getFloatArray("etx"); - ety = p.getFloatArray("ety"); - - et = new float[numData]; - phi = new float[numData]; - for (int i = 0; i < numData; i++) { - et[i] = (float) Math.sqrt(etx[i] * etx[i] + ety[i] * ety[i]); - - phi[i] = (float) Math.atan2(ety[i], etx[i]); - if (phi[i] < 0.0) { - phi[i] += AMath.TWO_PI; - } - } - - } // AETMisData() ------------------------------------------------------- - - /** - * Assuming there is only one item in the ETMis datatype which shall - * always be, but the rest of the class is more generic (the 0 index) - * @return float - */ - public float getET() { - return et[0]; - - } // getET() ------------------------------------------------------------ - - /** - * Assuming there is only one item in the ETMis datatype which shall - * always be, but the rest of the class is more generic (the 0 index) - * @return float - */ - public float getETx() { - return etx[0]; - - } // getETx() ----------------------------------------------------------- - - /** - * Assuming there is only one item in the ETMis datatype which shall - * always be, but the rest of the class is more generic (the 0 index) - * @return float - */ - public float getETy() { - return ety[0]; - - } // getETy() ----------------------------------------------------------- - - /** - * Assuming there is only one item in the ETMis datatype which shall - * always be, but the rest of the class is more generic (the 0 index) - * @return float - */ - public float getPhi() { - return phi[0]; - - } // getPhi() ----------------------------------------------------------- - - /** - * Returns info string for picking. - * @param index - * @return info string - */ - public String getHitInfo(int index) { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if (simpleOutput > 0) { - String output = getNameScreenName() + " index: " + index; - if (simpleOutput == 1 || simpleOutput == 3) { - output += "\n ET=" + String.format("%.3f", et[index]) + " GeV\n " - + AMath.PHI + " = " + String.format("%.3f", Math.toDegrees(phi[index])) + AMath.DEGREES; - } - if (simpleOutput == 2 || simpleOutput == 3) { - output += "\n Ex=" + String.format("%.3f", et[index] * Math.cos(phi[index])) + " GeV " - + "\n Ey=" + String.format("%.3f", et[index] * Math.sin(phi[index])) + " GeV "; - } - return output; - } - - String msg; - - msg = getNameScreenName() + "\n"; - msg += " storegate key: "; - msg += (storeGateKey == null ? "n/a" : storeGateKey) + "\n"; - msg += " Sum-ET = " + String.format("%.3f", sumet[index]) + " GeV" + "\n" - + " ET-Mis = " + String.format("%.3f", et[index]) + " GeV" + "\n" - + " ETx-Mis = " + String.format("%.3f", etx[index]) + " GeV" + "\n" - + " ETy-Mis = " + String.format("%.3f", ety[index]) + " GeV" + "\n" - + " " + AMath.PHI + " = " - + String.format("%.3f", Math.toDegrees(phi[index])) - + AMath.DEGREES + " (" + String.format("%.3f", phi[index]) + " rad)"; - - return msg; - - } // getHitInfo() ------------------------------------------------------- - - /** - * Info on ETMis contained in v-plot rubberband selection - * @return String - */ - public String getVPHitInfo() { - makeDrawList(); - if (numDraw == 0) { - return ""; - } - - double sumEt = 0.0; - for (int i = 0; i < numDraw; i++) { - sumEt += Math.abs(et[i]); - } - - String key = getStoreGateKey(); - String msg = numDraw + " " + (key != null ? "" + key : getNameScreenName()); - msg += " ET = " + String.format("%.1f", sumEt); - return msg; - - } // getVPHitInfo() ----------------------------------------------------- - - /** - * getParameterGroup() - * @return parameter group - */ - public String getParameterGroup() { - return "ETMis"; - - } // getParameterGroup() ------------------------------------------------ - - public String getName() { - return "ETMis"; - - } // getName() ---------------------------------------------------------- - - public String getNameScreenName() { - return "ETMis"; - - } // getNameScreenName() ------------------------------------------------ - - /** - * internalColor() - * Implement this atlantis.event.AData method - * Coloring of the graphical object on the canvas - * @return number of color types - */ - protected int internalColor() { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if (colorFunction == 0) { - colorByConstant(); - } else if (colorFunction == 1) { - colorByIndex(); - } else if (colorFunction == 2) { - colorByCollection(); - } - - return 3; - - } // internalColor() ---------------------------------------------------- - - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - //option to scale line width by energy - Stroke origStroke = ag.getGraphics2D().getStroke(); - if(parameterStore.getUnknown("ETMis", "LineWidth").getI()==0){ - float factor=0.f; - if(et[0]<5){ - factor=1.0f; - }else if(et[0]<10.){ - factor=1.5f; - }else if(et[0]<15.){ - factor=2.0f; - }else if(et[0]<20.){ - factor=2.5f; - }else if(et[0]<25.){ - factor=3.0f; - }else if(et[0]<30.){ - factor=3.5f; - }else if(et[0]<35.){ - factor=4.0f; - }else if(et[0]<40.){ - factor=4.5f; - }else{ - factor=5.0f; - } - ag.getGraphics2D().setStroke(new BasicStroke(factor)); - } - - if(projection instanceof AProjectionYX) - { - // check config whether to draw as arrow or dashed line.. - if(parameterStore.get("ETMis", "Drawas").getI() == 0) // Arrow = 0, Dashed = 1 - { - drawArrow(window, ag, projection); - } - else - { - drawDashed(window, ag, projection); - } - } - else if(projection instanceof AProjectionVP) - { - // Draw ETMis in VPlot... - ACoord centers = window.calculateDisplay(getUser(projection)); - int[] drawlist = centers.index; - double eLimit = 0.05; - final int numPoints = 25; - // hv will contain all the coordinates - // [2] - x and y value - // [drawlist.length] - should be "3" for ET Miss object by default - // after the PhiWrap - // [numPoints] - number of points required for drawing Et missing - // object in V-Plot - double[][][] hv = new double[2][drawlist.length][numPoints]; - - for(int i = 0; i < drawlist.length; ++i) - { - int list = drawlist[i]; - - int d = (int) (Math.sqrt((this.et[list] / eLimit) / Math.PI)); - if(d == 0) - { - d = 1; - } - - for(int j = 0; j < numPoints; j++) - { - hv[0][i][j] = centers.hv[0][list][i] + - d * Math.cos(Math.PI * 2 * j / (numPoints - 1)); - hv[1][i][j] = centers.hv[1][list][i] + - d * Math.sin(Math.PI * 2 * j / (numPoints - 1)); - } - } - ag.draw(new ACoord(hv, drawlist, this, ACoord.DOTTED_POLYGONS)); - } - else - { - super.draw(window, ag, projection); - } - //reset stroke if have changed to scale with energy - if(parameterStore.getUnknown("ETMis", "LineWidth").getI()==0) - ag.getGraphics2D().setStroke(origStroke); - } - - /** - * drawArrow() - * Method performs the drawing of the object on the canvas as arrow. - * @param window - * @param ag - * @param projection - */ - public void drawArrow(AWindow window, AGraphics ag, AProjection2D projection) - { - ACoord centers = window.calculateDisplay(getUser(projection)); - - int[] drawlist = centers.index; // draw everything in array - - // scale the arrowhead with zoom... - double zoomScaling=0; - Point2D.Double[] corners = window.getUserCorners(); - double widthx=corners[1].x-corners[0].x; - double widthy=corners[0].y-corners[2].y; - //average width of window - double width=Math.sqrt(widthx*widthx+widthy*widthy); - //calculate scaling (100 is arbitrary constant) - zoomScaling=100/width; - double arrowheadScale = 10+10*zoomScaling*Math.log(et[0]+1); - - // phiPrime represents the angle of the missingET arrow - double phiPrime = -1*Math.atan2(ety[0],etx[0]); - - // arrowMain contains the start point and end point of the arrow - double[][][]arrowMain = new double[2][drawlist.length][2]; - - // scale arrow length with etmiss - double arrowScale = et[0]*et[0]/250.0; //arbitrary scaling factor - double arrowCenter = 2.02; // this sets the starting point of the arrow. 2.02 ~ edge of ID - if (arrowScale > 8) { - arrowScale = 8; - } - for (int i = 0; i < drawlist.length; i++) { - for (int j = 0; j < 2; j++) { - arrowMain[0][i][j] = centers.hv[0][i][0] + (arrowCenter + arrowScale * j)*(centers.hv[0][i][1]-centers.hv[0][i][0]); - arrowMain[1][i][j] = centers.hv[1][i][0] + (arrowCenter + arrowScale * j)*(centers.hv[1][i][1]-centers.hv[1][i][0]); - } - } - double[][][]arrowHead1 = new double[2][drawlist.length][2]; - double[][][]arrowHead2 = new double[2][drawlist.length][2]; - for(int i = 0; i < drawlist.length; i++) - { - for(int j=0;j<2;j++) - { - // set the points for the two parts of the arrow head - // 2.591 and 3.691 are the factors to add to the arrow's angle for the correct arrowhead orientation... - arrowHead1[0][i][j] = arrowMain[0][0][1] + j*(arrowheadScale*Math.cos(2.591+phiPrime)); - arrowHead1[1][i][j] = arrowMain[1][0][1] + j*(arrowheadScale*Math.sin(2.591+phiPrime)); - arrowHead2[0][i][j] = arrowMain[0][0][1] + j*(arrowheadScale*Math.cos(3.691+phiPrime)); - arrowHead2[1][i][j] = arrowMain[1][0][1] + j*(arrowheadScale*Math.sin(3.691+phiPrime)); - } - } - // draw arrow, 3 parts, main arrow body and two lines for arrowhead - ag.draw(new ACoord(arrowMain, drawlist, this, ACoord.DOTTED_POLYGONS)); - ag.draw(new ACoord(arrowHead1, drawlist, this, ACoord.DOTTED_POLYGONS)); - ag.draw(new ACoord(arrowHead2, drawlist, this, ACoord.DOTTED_POLYGONS)); - - } // drawArrow() ------------------------------------------------------------- - - /** - * drawDashed() - * Method performs the drawing of the object on the canvas as a dashed line. - * @param window - * @param ag - * @param projection - */ - public void drawDashed(AWindow window, AGraphics ag, AProjection2D projection) - { - //Stop Etmiss being scaled by Fisheye - boolean origStatus = parameterStore.get(projection.getName(), "FishEye").getStatus(); - parameterStore.get(projection.getName(), "FishEye").setStatus(false); - ACoord centers = window.calculateDisplay(getUser(projection)); - if(origStatus) parameterStore.get(projection.getName(), "FishEye").setStatus(origStatus); - - int[] drawlist = centers.index; // draw everything in array - // hv will contain all the the coordinates - // [2] - x and y value - // [numData] - should be "1" for ETMis datatype - // [YX_NUMPOINTS] - number of points required for ET Miss object - - // length of drawlist should always be 1 -> only 1 iteration - double[][][] hv = new double[2][drawlist.length][YX_NUMPOINTS]; - for(int i = 0; i < drawlist.length; i++) - { - for(int j = 0; j < YX_NUMPOINTS; j++) - { - hv[0][i][j] = centers.hv[0][i][j]; // x - hv[1][i][j] = centers.hv[1][i][j]; // y - } - } - ag.draw(new ACoord(hv, drawlist, this, ACoord.DOTTED_POLYGONS)); - - } // drawDashed() ------------------------------------------------------------- - /** - * getYXUser() - * calculates coordinates for the Et missing graphical object which - * consists of one arrowed line, i.e. one line and two smaller lines - * forming the arrow, all together NUM_POINTS points - * @return coordinates - */ - protected ACoord getYXUser() - { - if (etx[0] == 0.f && ety[0] == 0.f) return ACoord.NO_DATA; - - makeDrawList(); // applycuts will be called here - - // Et missing graphical object consists of one dashed line from center - // to the border of canvas, or an arrow. - - // hv will contain all the coordinates - // [2] - x and y value - // [numData] - should be "1" for ETMis datatype - // YX_NUMPOINTS - number of points required for ET Miss object - double[][][] hv = new double[2][numDraw][YX_NUMPOINTS]; - int[] index = new int[numDraw]; - // i counter, here should have just one item in the coordinate array - // (index.length = 1), numDraw should be 1 - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - // main line (dashed) - // to be properly done: geting border values over canvas/window - double inc = 10000 / YX_NUMPOINTS; - double x = Math.cos(phi[list]); - double y = Math.sin(phi[list]); - for(int ii = 0; ii < YX_NUMPOINTS; ii++) - { - hv[0][i][ii] = x * (inc * ii); - hv[1][i][ii] = y * (inc * ii); - } - - index[i] = list; - } - return new ACoord(hv, index, this); - - } // getYXUser() -------------------------------------------------------- - - @Override - protected ACoord getRZUser() { - if (etx[0] == 0.f && ety[0] == 0.f) return ACoord.NO_DATA; - - double s = 1+Math.sqrt(et[0]);//4*parameterStore.get("ETMis", "Scale").getD(); - if (0 == s || parameterStore.get("ETMis", "Drawas").getI() == 1) { - return ACoord.NO_DATA; - } - makeDrawList(); // applycuts will be called here - double[][][] hv = new double[2][numDraw][YX_NUMPOINTS + 4]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) { - int list = listdl[i]; - double rhoMinus = 500; - double rhoMax = 1500; - double inc = 1. / YX_NUMPOINTS; - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double rhoPlus = rhoMax; - if (Math.abs(et[list]) < maxEnergy) { - rhoPlus = (rhoMax - rhoMinus) * s * Math.abs(et[list]) / maxEnergy; - } - - double updown = 0; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - if (phiMid > AMath.TWO_PI) { - phiMid -= AMath.TWO_PI; - } - double phiDiff = Math.abs(phi[list] - phiMid); - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) { - updown = 1; - } else { - updown = -1; - } - - //double y = rhoPlus*Math.cos(phiDiff);//to change with cos of phiDiff - double y = rhoPlus * updown;//to change just by up or down - for (int ii = 0; ii <= YX_NUMPOINTS; ii++) { - hv[0][i][ii] = 0; - hv[1][i][ii] = rhoMinus * updown + y * (inc * ii); - } - hv[0][i][YX_NUMPOINTS + 1] = rhoMinus * .1; - hv[1][i][YX_NUMPOINTS + 1] = rhoMinus * updown + 0.8 * y; - hv[0][i][YX_NUMPOINTS + 2] = -rhoMinus * .1; - hv[1][i][YX_NUMPOINTS + 2] = rhoMinus * updown + 0.8 * y; - hv[0][i][YX_NUMPOINTS + 3] = 0; - hv[1][i][YX_NUMPOINTS + 3] = rhoMinus * updown + y; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - - } // getRZUser() -------------------------------------------------------- - - /** - * calculate coordinates for the Et missing graphical object - * in V-Plot (eta-phi projection) - * @return coordinates - */ - protected ACoord getVPUser() - { - if (etx[0] == 0.f && ety[0] == 0.f) return ACoord.NO_DATA; - - makeDrawList(); // applycuts will be called here - - // numDraw for ET Miss object should be 1 - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[0] = 0.0; // h[0] is the eta value, ETMis always drawn in the - // centre of VPlot - at eta 0 - v[0] = Math.toDegrees(phi[list]); // v[0] is the phi value - index[i] = list; - } - - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - - } // getVPUser() -------------------------------------------------------- - - /** - * this method is defined as an abstract method in AData, so must be - * implemented in this child class - */ - protected void applyCuts() { - - // no need to cut index (always 0), and transverse momentum for ET Miss - // assuming only 1 item in the ETMis datatype, thus index 0 - cutPhi(phi[0]); - - // eta value for ET Miss is 0 - cutEta(0.0f); - - // cut on ETMiss (default cut of 15 GeV) - cut("CutsObjects", "ETMis", " |ETMis|", et); - - } // applyCuts() -------------------------------------------------------- - - /** - * phi cut implementation for ETMis object - * @param phi float - */ - protected void cutPhi(float phi) { - AParameter par = parameterStore.get("CutsATLAS", "CutPhi"); - boolean usePhiCut = par.getStatus(); - if (usePhiCut) { - double phiCut = Math.toRadians(Math.abs(par.getD())); - double phiMid = Math.toRadians( - AMath.nearestPhiDegrees(parameterStore.get("CutsATLAS", "PhiMiddle").getD())); - double phiDiff = Math.abs(AMath.nearestPhiRadians(phi, phiMid) - - phiMid); - - if (phiDiff - phiCut > 1.0e-6) { - numDraw = 0; - } - } - - } // cutPhi() ----------------------------------------------------------- - - /** - * eta cut implementation for ETMis object - * @param eta float - */ - protected void cutEta(float eta) { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - boolean useEtaCut = par.getStatus(); - if (useEtaCut) { - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaDiff = Math.abs(eta - etaMid); - if (etaDiff - etaCut > 1.0e-6) { - numDraw = 0; - } - } - - } // cutEta() ----------------------------------------------------------- -} // class AETMisData ======================================================= - diff --git a/graphics/AtlantisJava/src/atlantis/data/AElectronData.java b/graphics/AtlantisJava/src/atlantis/data/AElectronData.java deleted file mode 100755 index 29967a8fc341..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AElectronData.java +++ /dev/null @@ -1,180 +0,0 @@ -package atlantis.data; - -import java.util.Vector; -import atlantis.utils.A4Vector; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Reconstructed Electron - */ -public class AElectronData extends AHelixAODData -{ - private enum isEMe { TightPP, Tight, Medium, Loose, none } - - private int[] isEM; - private Vector<Enum> isEMEnum = new Vector<Enum>(); - private String[] label; - private float[] eOverp; - private int[] hasTrack; - - AElectronData(AHashMap p, AEvent e) - { - super(p,e); - isEM=p.getUnsureIntArray("isEM"); - String[] isEMString=p.getUnsureStringArray("isEMString"); - eOverp = p.getUnsureFloatArray("eOverp"); - hasTrack=p.getUnsureIntArray("hasTrack"); - label=p.getUnsureStringArray("label"); - - if(isEMString!=null) - { - for(String s : isEMString) - { - try { - isEMEnum.add(isEMe.valueOf(s)); - } - catch(IllegalArgumentException q) { - isEMEnum.add(isEMe.none); - } - } - } - else - { - for(int i=0;i<numData;i++) - { - isEMEnum.add(isEMe.none); - } - } - } - - public String getParameterGroup() - { - return "Electron"; - } - - public float geteOverp(int index) - { - return eOverp[index]; - } - - public String getisEMEnum(int index) - { - return isEMEnum.get(index).toString(); - } - - public int getisEM(int index) - { - return isEM[index]; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM((double)pT[k],(double)eta[k],(double)phi[k],0.00051); - sum.add(start); - } - - return sum; - } - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsObjects", "ElectronPt", " |ET|", pT); - - // because of the retriever bug, currently 2048 means 0 for isEM - // remove this for block when the bug is fixed - if(isEM != null) - { - for(int i=0; i<isEM.length; i++) - { - if(isEM[i]==2048) - isEM[i] = 0; - } - } - - cut("CutsObjects", "ElectronisEM", " isEM", isEM); - - if (parameterStore.get("CutsObjects", "ElectronisEMString").getStatus()) - { - int cutSub = parameterStore.get("CutsObjects", "ElectronisEMString").getI(); - - cutArrayEnum(isEMEnum, cutSub, "Electron isEMString"); - } - - cut("CutsObjects", "ElectroneOverp", " |eOverp|", eOverp); - if (parameterStore.get("CutsObjects", "ElectronhasTrack").getStatus() && hasTrack!=null) - cutArray(hasTrack, 1, "hasTrack"); - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - - if (isEM != null) - { - msg.append("\n isEM = "); - msg.append(isEM[index]); - } - if (label != null) - { - msg.append("\n label = "); - msg.append(label[index]); - } - if (eOverp != null) - { - msg.append("\n eOverp = "); - msg.append(eOverp[index]); - } - if (hasTrack != null) - { - msg.append("\n hasTrack = "); - msg.append(hasTrack[index]); - } - - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AEmTauROIData.java b/graphics/AtlantisJava/src/atlantis/data/AEmTauROIData.java deleted file mode 100755 index a2c8dc64699b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AEmTauROIData.java +++ /dev/null @@ -1,34 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.utils.AHashMap; - -/** - * - * Em Tau Region Of Interest - * - * @author Zdenek Maxa, Qiang Lu - */ -public class AEmTauROIData extends AROIData -{ - AEmTauROIData(AHashMap p, AEvent e) - { - super(p,e); - } // AEmTauROIData() ---------------------------------------------------- - - public String getParameterGroup() - { - return "EmTauROI"; - } - - public String getName() - { - return "EmTauROI"; - } - - public String getNameScreenName() - { - return "EmTauROI"; - } - -} // class AEmTauROIData ==================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/AEventFromXML.java b/graphics/AtlantisJava/src/atlantis/data/AEventFromXML.java deleted file mode 100755 index b89196931d3d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AEventFromXML.java +++ /dev/null @@ -1,786 +0,0 @@ -package atlantis.data; - -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import javax.xml.parsers.SAXParserFactory; - -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; - -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import atlantis.utils.xml.AArrayParser; -import atlantis.utils.xml.AFloatArrayParser; -import atlantis.utils.xml.AIntArrayParser; -import atlantis.utils.xml.AStringArrayParser; -import atlantis.utils.xml.AXMLErrorHandler; -import atlantis.utils.xml.AXMLErrorHandler.ErrorState; -import java.util.Iterator; -import javax.xml.parsers.ParserConfigurationException; -import org.xml.sax.SAXNotRecognizedException; - - -/** - * The reader which is used to read XML Event Files. The reader function creates - * and returns an AEvent class. Event comes with tags which are arrays of - * numbers. These arrays are treated by xml as character strings. The conversion - * of the character strings to arrays of number is done here. - */ -public class AEventFromXML extends DefaultHandler { - - //the logger - private final static ALogger logger = ALogger.getLogger(AEventFromXML.class); - - // Create an instance of this object - this makes sure the constructor is called. - // FIXME: should not use constructor to initialize static state. - private static final AEventFromXML instance = new AEventFromXML(); - - //We also have our private error handler - private static final AXMLErrorHandler xmlErrorHandler = new AXMLErrorHandler(); - - //Parsing states at different XML levels - private enum ParseState { - WAITING_EVENT, - WAITING_DATA, - WAITING_ARRAY - } - private static ParseState parseState; - - //The XMLReader object - private static XMLReader xmlReader; - //The event that is being build - private static AEvent event = null; - //the source name - private static String sourceName = null; - - //non-static parsing data members - private AHashMap parameters = null; - private String currentDataName = null; - private String currentArrayName = null; - private String currentFullName = null; - private int arrayLength = 0; - private int currentArraySize = 0; - private String storeGateKey = null; - private AArrayParser arrayParser = null; - - private static boolean HLTIgnoredWarning = false; - - - /** - * Constructor - * Creates an instance of AEventFromXML. It just sets up the XML reading - * stuff but does not do any parsing of any XML file. - */ - private AEventFromXML() { - - try { - //setup all the xml reader stuff - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(true); - factory.setNamespaceAware(true); - xmlReader = factory.newSAXParser().getXMLReader(); - xmlReader.setErrorHandler(xmlErrorHandler); - xmlReader.setEntityResolver(this); - xmlReader.setContentHandler(this); - } catch (ParserConfigurationException pce){ - logger.error("Unable to initialize XML reader!", pce); - } catch (SAXException sxe){ - logger.error("Unable to initialize XML reader!", sxe); - } - } // AEventFromXML() ---------------------------------------------------- - - - /** - * Checks if there was an error. - * @return true or false - */ - private boolean hasError() { - return (xmlErrorHandler.getErrorState() != ErrorState.NO_ERROR); - } - - - /** - * Reads an XML event data (from files, from string converted to stream) and - * returns the coresponding AEvent object. - * - * @param eventInputStream the XML data input stream. - * @param sourceName the name of the event source that provided this data - * @return an AEvent object containing all the data found in the file. - * @throws ReadEventException - */ - public static AEvent read(InputStream eventInputStream, String sourceName) throws ReadEventException { - - //be verbose - logger.info("Parsing event from " + sourceName); - - //set the initial error state - xmlErrorHandler.setError(ErrorState.NO_ERROR,null); - - //store the source Name - AEventFromXML.sourceName = sourceName; - - //Try to parse input stream - try { - xmlReader.parse(new InputSource(eventInputStream)); - } catch (Exception e) { - //In case of an error repackage as ReadEventException - logger.error("Parsing exception " + e.getMessage(),e); - throw new ReadEventException("XML parsing exception", e); - } - - //Finally construct the full event (including associations, etc.) - //Check for runtime exceptions here in case we fail to finalize the event - try { - event.finalizeEvent(); - } catch (RuntimeException rte) { - //rethrow as can not read event exception - throw new ReadEventException("Inconsistent event data",rte); - } - - return event; - } - - /** - * DefaultHandler Implementation (have a look at - * org.xml.sax.helpers.DefaultHandler for more info) - */ - @Override - public void startDocument() { - - //if we are already in error state return immediately - if (hasError()) return; - - //Clean up all local variables - event = null; - parameters = null; - currentDataName = null; - currentArrayName = null; - currentFullName = null; - arrayLength = 0; - currentArraySize = 0; - storeGateKey = null; - arrayParser = null; - - //Set parse state to new event - parseState = ParseState.WAITING_EVENT; - - //be verbose - logger.debug("Start parsing document"); - - } // startDocument() ---------------------------------------------------- - - @Override - public void endDocument() { - - //if we are already in error state return immediatly - if (hasError()) return; - - //be verbose - logger.debug("Finished parsing document w/o error"); - - } - - /** - * Implementation of DefaultHandler: start a new xml element - * @param namespaceURI the namespace - * @param localName the local name - * @param qName the qualified name - * @param atts the default or specified attributes - */ - @Override - public void startElement(String namespaceURI, String localName, - String qName, Attributes atts) throws SAXException { - - //stop here if errors have occured before - if (hasError()) return; - - try { - //Now act depending on parse state - switch (parseState) { - - //Waiting for an event to begin - case WAITING_EVENT: - //Try to read in event data - if (localName.equals("Event")) { - - //Create a new event - event = new AEvent(atts.getValue("eventNumber"), - atts.getValue("runNumber"), - atts.getValue("dateTime"), - sourceName, - atts.getValue("lumiBlock"), - atts.getValue("eventProperty")); - - - //create a new data hashmap - parameters = new AHashMap(15); - - //Advance to next parsing state - parseState = ParseState.WAITING_DATA; - - } else { - //The Event tag does not seem to be the first tag in this event - logger.warn("Encountered tag "+localName+ " while waiting for <event/>!"); - } - //Done waiting for event - break; - - //Waiting for a data tag - case WAITING_DATA: - - //Store the current object name - currentDataName = localName; - //Get number of entries expected here - arrayLength = Integer.parseInt(atts.getValue("count")); - - // if storegate key doesn't exists as an attribute - // at datatype, an empty string "" is retrieved (not null) - storeGateKey = atts.getValue("storeGateKey"); - //Construct full name from datatype name and storeGateKey - currentFullName = currentDataName + "-" + storeGateKey; - - // ignore data with storeGateKey containing "HLTAutoKey" - // Its important that parseState is not set before, - // so we arrive waiting for a new data tag when this error is cleared - if (!AGlobals.instance().showHLTAutoKeys() && storeGateKey.indexOf("HLTAutoKey") >= 0) { - //Set appropiate error state and continue - xmlErrorHandler.setError(ErrorState.IGNORED_DATA, new Exception("Ignored HLTAutoKey data "+currentFullName)); - return; - } - - parameters.clear(); - // add numData - number of data within the subtags, - // extracted from count attribute - parameters.put("numData", new Integer(arrayLength)); - parameters.put("storeGateKey", storeGateKey); - parseState = ParseState.WAITING_ARRAY; - break; - - //Waiting for an data value array - case WAITING_ARRAY: - - //store name of the array we are looking at - currentArrayName = localName; - - if ((atts.getValue("type") == null) || - (atts.getValue("multiple") == null)) - throw new SAXNotRecognizedException("No array type or multiplicity available for "+localName); - - String type = atts.getValue("type"); - - //get multiplicity if needed - float multiple = Float.parseFloat(atts.getValue("multiple")); - currentArraySize = Math.round(arrayLength * multiple); - - - //Instanciate a new array parser - if (type.equals("FLOAT")) { - arrayParser = new AFloatArrayParser(currentArraySize); - } else if (type.equals("INT")) { - arrayParser = new AIntArrayParser(currentArraySize); - } else if (type.equals("STRING")) { - arrayParser = new AStringArrayParser(currentArraySize); - } else { - throw new SAXNotRecognizedException("Invalid array type: " + type); - } - - break; - - } // switch - } catch (SAXNotRecognizedException sre){ - //Catch unknown array tags - xmlErrorHandler.setError(ErrorState.INVALID_DATA,sre); - logger.debug("Encountered invalid subtag "+localName, sre); - } catch (Exception e) { - //Catch any other error here: - String msg = "Error reading file at " + currentFullName + ":" + currentArrayName; - xmlErrorHandler.setError(ErrorState.FATAL_ERROR,e); - logger.debug(msg, e); - //Rethrow readevent exception with proper cause - throw new SAXException(msg, e); - } - - } - - /** - * Called at the end of each tag - this is where we actually construct the data - * @param namespaceURI - the current namespace - * @param localName - the local element name - * @param qName - the qualified element name - */ - @Override - public void endElement(String namespaceURI, String localName, String qName) throws SAXException { - - /** - * Check if an error had occured reading this element - */ - if (hasError()) { - - String msg = null; - - switch (xmlErrorHandler.getErrorState()) { - - case UNKNOWN_TAG: - //Ignore unknown tags, but show an error - - if (parseState == ParseState.WAITING_DATA) - msg = "Unknown or obsolete data type <" + currentDataName + "> found"; - else if (parseState == ParseState.WAITING_ARRAY) - //rely on exception error message for this one - msg = xmlErrorHandler.getErrorCause().getMessage(); - else - //unknown tag at event level - msg = "Unknown tag <" + currentDataName + "> while waiting for event."; - - //Clear the error state and continue - xmlErrorHandler.setError(ErrorState.NO_ERROR, null); - break; - - case INVALID_DATA: - msg = "Invalid data encountered reading "+currentDataName; - //Clear the error state and continue - xmlErrorHandler.setError(ErrorState.NO_ERROR, null); - break; - - case IGNORED_DATA: - - //Only show warning message in the LogPane once - if (!HLTIgnoredWarning) { - AOutput.append("\"HLTAutoKey\" data is hidden, option '-a' to see them.", - ALogInterface.WARNING); - //tell about each one also in the log - logger.warn(xmlErrorHandler.getErrorCause().getMessage()); - HLTIgnoredWarning = true; - } - - //Clear the error only when we reach the end of the data tag - if (localName.equals(currentDataName)) - xmlErrorHandler.setError(ErrorState.NO_ERROR, null); - - break; - } - - //If there was a message, show it - if (msg != null){ - // Now show this error in the log pane and console output - logger.warn(msg,xmlErrorHandler.getErrorCause()); - } - //Return to parsing (if error cleared) or stop - return; - } - - /** - * No error so far - check what we have been parsing - */ - switch (parseState) { - - case WAITING_ARRAY: - - /** - * End of data array - add to parameter list - */ - if (localName.equals(currentArrayName)) { - - //Check for proper Array size - if (arrayParser.getCount() != currentArraySize) { - - xmlErrorHandler.setError(ErrorState.INVALID_DATA, new Exception("Invalid array size")); - - String msg = "The number of data in <" + currentFullName + ">-<" + currentArrayName + "> is different than declared"; - logger.error(msg); - AOutput.append("\n"+msg+"\n", ALogInterface.WARNING); - return; - } - //Otherwise add to parameter list - parameters.put(currentArrayName, arrayParser.getArray()); - - //done with that, return - return; - } - - /** - * End of data tag - construct object - */ - if (localName.equals(currentDataName)) { - try { - // Calo and muon datatypes sometimes provide a - // storeGateKey, thus are (incorrectly !) - // regarded as multiple collection datatypes - // -> remove this storeGateKey - if ("TILE".equals(currentDataName) || - "LAr".equals(currentDataName) || - "HEC".equals(currentDataName) || - "FCAL".equals(currentDataName) || - "MBTS".equals(currentDataName) || - "MDT".equals(currentDataName) || - "CSC".equals(currentDataName) || - "RPC".equals(currentDataName) || - "TGC".equals(currentDataName)) { - parameters.put("storeGateKey", null); - } - - // RDOs originally implemented as multiple collections, - // then changed to non-mul-col. this is for backwards - // compatibility with events where storeGateKey is - // provided for PixelRDO and SCTRDO - if ("PixelRDO".equals(currentDataName) || - "SCTRDO".equals(currentDataName)) { - parameters.put("storeGateKey", null); - } - - checkPhiRange(parameters, currentFullName); - - if (currentDataName.equals("STr")) { - event.add(new ASVxData(ASVxData.createSVx(parameters), event)); - event.add(new ASTrData(ASTrData.createSTr(parameters), event)); - event.add(new ASNPData(ASNPData.createSNP(parameters), event)); - } // STC - silicon cluster datatype - else if (currentDataName.equals("STC")) { - event.add(new ASiClusterData(parameters, event)); - } // SCTRDO - silicon cluster raw data object - // discrepancy in naming STC x SCT ... - else if (currentDataName.equals("SCTRDO")) { - event.add(new ASiClusterRDOData(parameters, event)); - } // PixCluster - pixel cluster datatype - else if (currentDataName.equals("PixCluster")) { - event.add(new APixelClusterData(parameters, event)); - } - // ETMis backwards compatibility (after ETMis collections) - // datatypes ETMis, CaloETMis, MuonETMis - storeGateKey - // attribute is added here - else if (currentDataName.equals("ETMis") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "ETMis"); - event.add(new AETMisData(parameters, event)); - } else if (currentDataName.equals("CaloETMis")) { - parameters.put("storeGateKey", "CaloETMis"); - event.add(new AETMisData(parameters, event)); - } else if (currentDataName.equals("MuonETMis")) { - parameters.put("storeGateKey", "MuonETMis"); - event.add(new AETMisData(parameters, event)); - } // Track collections, backwards compatibility for - // IDScan, iPat, xKal datatypes - storeGateKey attribute - // is added here - else if (currentDataName.equals("Track")) { - - String key = (String) parameters.get("storeGateKey"); - if (key != null) { - if (key.toLowerCase().indexOf("mboy") >= 0 || key.toLowerCase().indexOf("mugirl") >=0 || key.toLowerCase().indexOf("moore") >= 0 || key.toLowerCase().indexOf("momu") >= 0 || key.toLowerCase().indexOf("muon") >= 0 || key.toLowerCase().indexOf("staco") >= 0 || key.toLowerCase().indexOf("muid") >= 0 || key.toLowerCase().indexOf("mutag") >= 0 ) { - event.add(new AMuonTrackData(parameters, event)); - } else { - event.add(new AInDetTrackData(parameters, event)); - } - } else { - int[] trackAuthor = parameters.getUnsureIntArray("trackAuthor"); - if (trackAuthor != null && trackAuthor.length > 0) { - if ((trackAuthor[0] >= 7 && trackAuthor[0] <= 9) || (trackAuthor[0] >= 13 && trackAuthor[0] <= 17)) { - event.add(new AMuonTrackData(parameters, event)); - } else { - event.add(new AInDetTrackData(parameters, event)); - } - } else { - event.add(new AInDetTrackData(parameters, event)); - } - } - } else if (currentDataName.equals("IDScan")) { - parameters.put("storeGateKey", "TrigInDetTrack"); - event.add(new AInDetTrackData(parameters, event)); - } else if (currentDataName.equals("iPat")) { - parameters.put("storeGateKey", "iPatTrack"); - event.add(new AInDetTrackData(parameters, event)); - } else if (currentDataName.equals("xKal")) { - parameters.put("storeGateKey", "xKalTrack"); - event.add(new AInDetTrackData(parameters, event)); - } else if (currentDataName.equals("RTr")) // old tag - { - parameters.put("storeGateKey", "RTrTrack"); - event.add(new AInDetTrackData(parameters, event)); - } else if (currentDataName.equals("RMTr")) // old tag - { - parameters.put("storeGateKey", "RMTrTrack"); - event.add(new AMuonTrackData(parameters, event)); - } // ParticleJet backwards compatibility - else if (currentDataName.equals("ParticleJet") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "ParticleJet cone4"); - // treat PatricleJet as Jet (JetRecJet) - event.add(new AJetData(parameters, event)); - } else if (currentDataName.equals("Jet") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "JetRecJet"); - event.add(new AJetData(parameters, event)); - } // MSeg backwards compatibility - else if (currentDataName.equals("MSeg")) { - parameters.put("storeGateKey", "MooreSegment"); - - // Instead of cotan(theta) we store theta itself. - float[] cotTheta = parameters.getFloatArray("cotTheta"); - float[] theta = new float[cotTheta.length]; - for (int i = 0; i < cotTheta.length; i++) { - theta[i] = (float) Math.atan(1. / cotTheta[i]); - } - parameters.put("theta", theta); - - // And phi0 is now called phi - parameters.put("phi", parameters.getFloatArray("phi0")); - - event.add(new AMuonSegmentData(parameters, event)); - } // Segment backwards compatibility - else if (currentDataName.equals("Segment")) { - String key = (String) parameters.get("storeGateKey"); - if (key != null) { - if (key.toLowerCase().indexOf("mboy") >= 0 || key.toLowerCase().indexOf("moore") >= 0 || key.toLowerCase().indexOf("momu") >= 0 || key.toLowerCase().indexOf("mdt") >= 0 || key.toLowerCase().indexOf("muon") >= 0) { - event.add(new AMuonSegmentData(parameters, event)); - } else { - event.add(new AInDetSegmentData(parameters, event)); - } - } - } // Cluster backwards compatibility - // datatypes Cluster - storeGateKey attribute is added - else if (currentDataName.equals("Cluster") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "DefaultCluster"); - event.add(new AClusterData(parameters, event)); - } //Electron backwards compatibility - else if (currentDataName.equals("Electron") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "ElectronCollection"); - event.add(new AElectronData(parameters, event)); - } //Muon backwards compatibility - else if (currentDataName.equals("Muon") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "MuonCollection"); - event.add(new AMuonData(parameters, event)); - } //Photon backwards compatibility - else if (currentDataName.equals("Photon") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "PhotonCollection"); - event.add(new APhotonData(parameters, event)); - } //BJet backwards compatibility - else if (currentDataName.equals("BJet") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "BJetCollection"); - event.add(new ABJetData(parameters, event)); - } //TauJet backwards compatibility - else if (currentDataName.equals("TauJet") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "TauJetCollection"); - event.add(new ATauJetData(parameters, event)); - } //CompositeParticle backwards compatibility - else if (currentDataName.equals("CompositeParticle") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "CompositeParticleCollection"); - event.add(new ACompositeParticleData(parameters, event)); - } //LVL1Result backwards compatibility - else if (currentDataName.equals("LVL1Result") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "LVL1Result"); - event.add(new ALVL1ResultData(parameters, event)); - } //LVL1TriggerTower backwards compatibility - else if (currentDataName.equals("LVL1TriggerTower") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "LVL1TriggerTower"); - event.add(new ALVL1TriggerTowerData(parameters, event)); - } //LVL1JetElement backwards compatibility - else if (currentDataName.equals("LVL1JetElement") && - "".equals(storeGateKey)) { - parameters.put("storeGateKey", "LVL1JetElement"); - event.add(new ALVL1JetElementData(parameters, event)); - } else { - //try to autoconstruct the corresponding data type - //First of all get all constructors for this class name - Constructor[] cons = Class.forName("atlantis.data.A" + currentDataName + "Data").getDeclaredConstructors(); - //Flag if we found on - boolean foundConstructor = false; - //Now loop over constructors and pick the one that fits - for (Constructor constructor : cons) { - //Check for parameters - Class[] params = constructor.getParameterTypes(); - if (params.length != 2) { - continue; - //Check both types - } - if (!params[0].getName().endsWith("AHashMap")) { - continue; - } - if (!params[1].getName().endsWith("AEvent")) { - continue; - //seems we found the proper constructor - go and build the class - } - foundConstructor = true; - event.add((AData) constructor.newInstance(new Object[]{parameters, event})); - //also end the loop here - break; - } - if (!foundConstructor) { - throw new ClassNotFoundException("Found no valid constructor for data type " + currentDataName); - } - } // End of autoconstructor - - - //Collect all possible errors here - } catch (Throwable t) { - //Will hold the error message - String msg = null; - - //Could not find a class for this data type - if (t instanceof ClassNotFoundException) { - msg = "Class handling the type " + currentDataName + " not found"; - xmlErrorHandler.setError(ErrorState.INVALID_DATA, t); - //Ran out ouf memory - } else if (t instanceof OutOfMemoryError) { - msg = "Atlantis ran out of memory while\n" + "reading in event data"; - xmlErrorHandler.setError(ErrorState.FATAL_ERROR, t); - //Some weird Atlantis exception - check its error state - } else if (t instanceof AAtlantisException) { - msg = t.getMessage(); - //check Atlantis exception level - if (((AAtlantisException)t).isFatal()) - xmlErrorHandler.setError(ErrorState.FATAL_ERROR, t); - else - xmlErrorHandler.setError(ErrorState.OTHER_ERROR, t); - } else if (t instanceof InvocationTargetException) { - msg = "Error when constructing " + currentFullName; - xmlErrorHandler.setError(ErrorState.OTHER_ERROR, t); - } else { - msg = "Caught exception "+t.toString()+ " while constructing "+currentFullName; - xmlErrorHandler.setError(ErrorState.OTHER_ERROR, t); - } - - AOutput.append("\n" + msg + "\n", ALogInterface.WARNING); - logger.error(msg, t); - } - - /** - * Now handle potential errors - */ - //if we can proceed processing, throw an error - if (xmlErrorHandler.getErrorState() == ErrorState.FATAL_ERROR) - throw new SAXException("Error parsing event at tag <"+currentDataName+">", - (Exception)xmlErrorHandler.getErrorCause()); - - //Otherwise clear error state and continue - xmlErrorHandler.setError(ErrorState.NO_ERROR, null); - parseState = ParseState.WAITING_DATA; - return; - } - - } - } - - /** - * xml calls this routine whenever it finds CONTENT of type character array - * (CDATA) this routine fills an array stored in the arrayParser * - * - * @param ch char[] - * @param start int - * @param length int - */ - @Override - public void characters(char[] ch, int start, int length) { - - //return immediately if we had an error before - if (hasError()) return; - - //Make sure an arrayParser has been set before - if (arrayParser == null){ - xmlErrorHandler.setError(ErrorState.FATAL_ERROR,new NullPointerException("ArrayParser object not defined")); - logger.error("arrayParser is NULL in SAX DefaultHandler:characters"); - return; - } - - //try to parse the value array - try { - arrayParser.parse(ch, start, length); - } catch (NumberFormatException nfe) { - xmlErrorHandler.setError(ErrorState.INVALID_DATA,nfe); - String msg = "Data in <" + currentFullName + ">-<" + currentArrayName + - "> contains invalid character \'" + nfe.getMessage() + "\'"; - logger.error(msg); - - } catch (IndexOutOfBoundsException oob) { - xmlErrorHandler.setError(ErrorState.INVALID_DATA,oob); - String msg = "The number of data in <" + currentFullName + ">-<" - + currentArrayName + "> is more than declared"; - logger.error(msg); - } - - } // characters() -------------------------------------------------------- - - /** - * Returns an entity resolver - should be event.dtd in case we read an event file - * otherwise return null to use the default - * @param publicId - * @param systemId - * @return an input source for the entity resolver - */ - @Override - public InputSource resolveEntity(String publicId, String systemId) { - InputSource inputSource = null; - String FILE_SEPAR = System.getProperty("file.separator"); - - if (systemId.endsWith("event.dtd")) { - String dtdFile = AGlobals.instance().getHomeDirectory() + "events" + FILE_SEPAR + "event.dtd"; - try { - InputStream is = AUtilities.getFileAsStream(dtdFile); - inputSource = new InputSource(is); - } catch (AAtlantisException ae) { - logger.error("reading " + dtdFile + " error: " + ae.getMessage(), ae); - } - } - - return inputSource; - - } // resolveEntity() ---------------------------------------------------- - - /** - * Corrects the Phi values to be in the range (0:2pi). - * NOTE: This can still be done much nicer - but have you seen what it looked like before?! - * @param p The AHashMap containing the float arrays to be checked. - */ - private static void checkPhiRange(AHashMap p, String fullDataName) { - - //Loop over all keys in the Hashmap - Iterator keyIter = p.keySet().iterator(); - while (keyIter.hasNext()) { - //Check if this is a phi collection - String keyName = (String) keyIter.next(); - //Only run on phi value arrays - if (!keyName.startsWith("phi")) { - continue; - //Now get the actual array of values - } - float[] phi = null; - try { - phi = (float[]) p.get(keyName); - } catch (ClassCastException cce) { - //ignore any non-floar arrays that start with "phi" - continue; - } - //Check that we didn't get an empty entry - if (phi == null) { - continue; //Now loop over all entries and correct them - } - for (int i = 0; i < phi.length; i++) { - //Bring it down to the modulus of 2*Pi - phi[i] = phi[i] % (float)AMath.TWO_PI; - //Smaller zero is still possible - if (phi[i] < 0.) phi[i] += AMath.TWO_PI; - } - } - } // checkPhiRange() ----------------------------------------------------- -} // class AEventFromXML ==================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/AFCALData.java b/graphics/AtlantisJava/src/atlantis/data/AFCALData.java deleted file mode 100755 index 9e8d233d12e2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AFCALData.java +++ /dev/null @@ -1,1228 +0,0 @@ -package atlantis.data; - -import atlantis.canvas.ACanvas; -import atlantis.event.AEvent; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.utils.AUtilities; -import atlantis.utils.ALogger; -import java.io.IOException; -import com.Ostermiller.util.CSVParser; -import java.io.StringReader; -import java.io.InputStream; -import java.io.FileNotFoundException; - -/** - * The Forward calorimeter implementation. - * - * @author Eric Jansen - */ -public class AFCALData extends ACalorimeterData -{ - private static ALogger logger = ALogger.getLogger(AFCALData.class); - - protected float[] x; - protected float[] y; - protected float[] z; - protected float[] r; - protected float[] dx; - protected float[] dy; - protected float[] dz; - protected float[] dr; - - private int[][] cellTable; - - // data for real pulse shapes plots - private int numSamplings = 0; - private int[][] adcCounts = null; - private float[] cellTime = null; - private int[] cellGain = null; - private float[] cellPedestal = null; - private float[] adc2Mev = null; - private static boolean pulseShapesDataAvailable = false; - private static final String LOOKUP_TABLE_FILE = - AGlobals.instance().getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - "rpsplt_fcal.csv"; - // number of lookup table values for real pulse shapes plots calculation - private static final short NUMBER_OF_LOOKUP_VALUES = 600; - - - - AFCALData(AHashMap p, AEvent e) - { - super(p,e); - - x = p.getFloatArray("x"); - dx = p.getFloatArray("dx"); - y = p.getFloatArray("y"); - dy = p.getFloatArray("dy"); - - r = new float[numData]; - dr = new float[numData]; - - cellTable = new int[MAX_HIT_INDEX][MAX_HIT_INDEX]; - - for (int i = 0; i < numData; i++) - { - try - { - side[i] = (byte) AIdHelper.larBarrelEndcap(id[i]); - etaIndex[i] = (short) AIdHelper.larEta(id[i]); - phiIndex[i] = (short) AIdHelper.larPhi(id[i]); - sampling[i] = 0; //AIdHelper.larSampling(id[i]); - } - catch (AAtlantisException ex) - { - logger.error("Problem decoding ID " + id[i] + " in " + - CALORIMETER_NAME + ": " + ex.getMessage()); - side[i] = 0; - etaIndex[i] = -1; - phiIndex[i] = -1; - sampling[i] = -1; - } - } - - // Events produced by older JiveXML versions don't have z and dz yet. - // Use the old hardcoded values in that case for backwards - // compatibility. - if (p.get("z") == null || p.get("dz") == null) - { - z = new float[numData]; - dz = new float[numData]; - for (int i = 0; i < numData; i++) - { - switch (sampling[i]) - { - case 0: - z[i] = (side[i] / Math.abs(side[i])) * 489.4f; - dz[i] = 45.2f; - break; - case 1: - z[i] = (side[i] / Math.abs(side[i])) * 534.8f; - dz[i] = 45.0f; - break; - case 2: - z[i] = (side[i] / Math.abs(side[i])) * 582.2f; - dz[i] = 45.0f; - break; - } - } - } - else - { - z = p.getFloatArray("z"); - dz = p.getFloatArray("dz"); - } - - float drMin = 0.0f, zMin = 0.0f, zMax = 0.0f, rMin = 0.0f, rMax = 0.0f; - for (int i = 0; i < numData; i++) - { - - if (side[i] < 0) - { - sub[i] = 0; - } - else - { - sub[i] = 1; - } - - float etaMin = (float) AMath.etaAbs(z[i], Math.sqrt(Math.pow(Math.abs(x[i]) - dx[i], 2) + - Math.pow(Math.abs(y[i]) - dy[i], 2))); - float etaMax = (float) AMath.etaAbs(z[i], Math.sqrt(Math.pow(Math.abs(x[i]) + dx[i], 2) + - Math.pow(Math.abs(y[i]) + dy[i], 2))); - eta[i] = (etaMin + etaMax) / 2.f; - //TODO check calculation original: deta[i] = etaMax - etaMin; - deta[i] = Math.abs(etaMax - etaMin); - phi[i] = (float) Math.atan2(y[i], x[i]); - dphi[i] = (float) Math.abs(Math.atan2(y[i] + dy[i], x[i] - dx[i]) - - Math.atan2(y[i] - dy[i], x[i] + dx[i])); - if (phi[i] < 0) - { - phi[i] += 2. * Math.PI; - } - - r[i] = (float) Math.sqrt(x[i] * x[i] + y[i] * y[i]); - dr[i] = (float) Math.sqrt(dx[i] * dx[i] + dy[i] * dy[i]); - - // Collect some constants needed for binning the histograms. - if (rMin == 0.0 || Math.abs(r[i]) - dr[i] / 2. < rMin) - { - rMin = Math.abs(r[i]) - dr[i] / 2.f; - } - if (rMax == 0.0 || Math.abs(r[i]) + dr[i] / 2. > rMax) - { - rMax = Math.abs(r[i]) + dr[i] / 2.f; - } - if (zMax == 0.0 || Math.abs(z[i]) + dz[i] / 2. > zMax) - { - zMax = Math.abs(z[i]) + dz[i] / 2.f; - } - if (zMin == 0.0 || Math.abs(z[i]) - dz[i] / 2. < zMin) - { - zMin = Math.abs(z[i]) - dz[i] / 2.f; - } - if (drMin == 0.0 || dr[i] < drMin) - { - drMin = dr[i]; - } - } - - etaGranularity = AParameterUtilities.eta(zMin, rMax - drMin) - AParameterUtilities.eta(zMin, rMax); - outerEta = AParameterUtilities.eta(zMax, rMin); - - // Collect some constants needed for drawing the histograms. - for (int i = 0; i < ACalorimeterDetector.count(); i++) - { - if (outerR == 0.0 || ACalorimeterDetector.get(i).getRMax() > outerR) - { - outerR = ACalorimeterDetector.get(i).getRMax(); - } - if (outerZ == 0.0 || ACalorimeterDetector.get(i).getZMax() > outerZ) - { - outerZ = ACalorimeterDetector.get(i).getZMax(); - } - } - - for (int i = 0; i < et.length; ++i) - { - et[i] = Math.abs(energy[i] / (float) Math.cosh(eta[i])); - } - - // read in FCAL data from real pulse shapes plots - readPulseShapePlotData(p); - - } - - - - /** - * readLookupTableFile() reads in comma separated values (CSV) file - * with FCAL real pulse shapes plots time and amplitude lookup values - * @param fileName String - * @throws AAtlantisException - */ - private void readLookupTableFile() throws AAtlantisException - { - try - { - InputStream is = AUtilities.getFileAsStream(LOOKUP_TABLE_FILE); - CSVParser parser = new CSVParser(is); - parser.setCommentStart("#"); - String arrayName = null; - - while((arrayName = parser.nextValue()) != null) - { - String valueArray = parser.nextValue(); // shall now contain all values - CSVParser parserArray = new CSVParser(new StringReader(valueArray)); - String[][] s = parserArray.getAllValues(); - - if("FCAL_LAYER0_AMPLITUDE".equals(arrayName)) - { - ACalorimeterRPSPLT.FCAL_LAYER0_AMPLITUDE = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - else if("FCAL_LAYER1_AMPLITUDE".equals(arrayName)) - { - ACalorimeterRPSPLT.FCAL_LAYER1_AMPLITUDE = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - else if("FCAL_LAYER2_AMPLITUDE".equals(arrayName)) - { - ACalorimeterRPSPLT.FCAL_LAYER2_AMPLITUDE = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - else if("FCAL_TIME".equals(arrayName)) - { - ACalorimeterRPSPLT.FCAL_TIME = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - } // while - } - catch(FileNotFoundException e) - { - throw new AAtlantisException("could not find file: " + - LOOKUP_TABLE_FILE); - } - catch(IOException e) - { - throw new AAtlantisException("exception while reading file: " + - LOOKUP_TABLE_FILE); - } - catch(AAtlantisException e) - { - throw e; - } - - } // readLookupTableFile() ---------------------------------------------- - - - - private void readPulseShapePlotData(AHashMap p) - { - // read ADCCounts and cell data for real pulse shapes plots - adcCounts = super.getADCCountsData(p); - - // read LAr digits (cell data) for real pulse shapes plots - cellTime = (p.get("cellTime") != null) ? p.getFloatArray("cellTime") : null; - cellGain = (p.get("cellGain") != null) ? p.getIntArray("cellGain") : null; - cellPedestal = (p.get("cellPedestal") != null) ? p.getFloatArray("cellPedestal") : null; - adc2Mev = (p.get("adc2Mev") != null) ? p.getFloatArray("adc2Mev") : null; - - pulseShapesDataAvailable = false; - if(adcCounts != null && cellTime != null && cellGain != null && - cellPedestal != null && adc2Mev != null) - { - pulseShapesDataAvailable = true; - numSamplings = adcCounts[0].length; - - logger.debug(CALORIMETER_NAME + - ": data for real pulse shape plots available"); - - - if(ACalorimeterRPSPLT.areFCALLookupTablesInitialized()) - { - logger.debug(CALORIMETER_NAME + - ": lookup tables have already been read in"); - } - else - { - logger.debug(CALORIMETER_NAME + - ": lookup table values have not been read in yet\n" + - " trying to read file: " + LOOKUP_TABLE_FILE); - try - { - readLookupTableFile(); - - logger.debug(CALORIMETER_NAME + - ": values from " + LOOKUP_TABLE_FILE + - " successfully read in"); - - } - catch(AAtlantisException ex) - { - logger.debug(CALORIMETER_NAME + - ": reading " + LOOKUP_TABLE_FILE + - " failed, real pulse shapes plots will not " + - "be available, reason: " + ex.getMessage(), ex); - pulseShapesDataAvailable = false; - } - } - } - - } // readPulseShapePlotData() ------------------------------------------- - - - - - /** - * Returns the name of the parameter group. - * - * @return String parameter group - */ - public String getParameterGroup() - { - return "FCAL"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getName() - { - return "FCAL"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getNameScreenName() - { - return "FCAL"; - } - - /** - * Returns the type of calorimeter (ECAL/HCAL) for a hit. - * - * @param index int hit index - * @return String calorimeter type - */ - public String getCalorimeterType(int index) - { - if (sampling[index] == 0) - { - return "ECAL"; - } - else - { - return "HCAL"; - } - } - - /** - * Calorimeter cells can be drawn either explicitly or implicitly. In most - * views cells that are located behind eachother are consolidated and only - * the most energetic one is drawn explicitly. The other cells are drawn - * implicitly, since their energy value is still added to the energy sum of - * the explicitly drawn cell. The list manager does not know about the - * implicitly drawn cells though, so this poses a problem when the user - * requests information about a certain area of the canvas. This is solved - * using this method. This function receives the list of explicitly drawn - * cells and then adds the ones that were implicitly drawn in this - * selection. - * - * @param drawn boolean[] initial drawn list containing only the explicitly - * drawn cells - * @return boolean[] drawn list containing the explicitly and the implicitly - * drawn cells. - */ - public boolean[] expandDrawn(boolean[] drawn) - { - AProjection projection = ACanvas.getCanvas().getCurrentWindow().getProjection(); - - if (projection instanceof AProjectionYX) - { - return expandDrawnYX(drawn); - } - else if (projection instanceof AProjectionRZ) - { - return expandDrawnRZ(drawn); - } - else - { - return drawn; - } - } - - /** - * Filters the drawList for the y-x projection. Hits from both endcaps are - * combined. - */ - protected void filterDrawListYX() - { - float etTable[][] = new float[MAX_HIT_INDEX][MAX_HIT_INDEX]; - for (int i = 0; i < MAX_HIT_INDEX; i++) - { - for (int j = 0; j < MAX_HIT_INDEX; j++) - { - cellTable[i][j] = -1; - etTable[i][j] = 0.0f; - } - } - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - int eta = etaIndex[j]; - int phi = phiIndex[j]; - etTable[eta][phi] += et[j]; - if (cellTable[eta][phi] < 0 || et[cellTable[eta][phi]] < et[j]) - cellTable[eta][phi] = j; - } - - numDraw = 0; - for (int i = 0; i < MAX_HIT_INDEX; i++) - { - for (int j = 0; j < MAX_HIT_INDEX; j++) - { - if (cellTable[i][j] > 0) - { - listdl[numDraw] = cellTable[i][j]; - etSum[listdl[numDraw]] = etTable[i][j]; - numDraw++; - } - } - } - } - - /** - * See expandDrawn. - * - * @param drawn boolean[] initial drawn list containing only the explicitly - * drawn cells - * @return boolean[] drawn list containing the explicitly and the implicitly - * drawn cells. - */ - private boolean[] expandDrawnYX(boolean[] drawn) - { - makeDrawList(); - - int mode = parameterStore.get("YX", "Mode").getI(); - if (parameterStore.get("YX", "DrawFCAL").getStatus() && mode >= AProjectionYX.MODE_HEC_2 && - mode <= AProjectionYX.MODE_HEC_4) - { - cutArray(sampling, mode - AProjectionYX.MODE_HEC_2, "Layer"); - } - else if (mode >= AProjectionYX.MODE_FCAL_EM || mode <= AProjectionYX.MODE_FCAL_HAD_2) - { - cutArray(sampling, mode - AProjectionYX.MODE_FCAL_EM, "Layer"); - } - else - { - return drawn; - } - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - - if (drawn[j]) - continue; - - int eta = etaIndex[j]; - int phi = phiIndex[j]; - - if (eta >= 0 && phi >= 0) - { - int mappedTo = cellTable[eta][phi]; - - if (mappedTo >= 0 && drawn[mappedTo] == true) - { - drawn[j] = true; - } - } - } - - return drawn; - } - - /** - * The rho-z projection is a bit difficult for FCAL. Because of the y-x - * geometry of the cells there isn't really a nice way to project them in - * rho-z. This prodedure takes the most energetic cell and the consolidates - * it with all cells that overlap it. This is repeated until all cells are - * assigned to such a most energetic cell. We are then left with a series of - * "important" cells that do not overlap in rho-z. These can be drawn - * nicely. - */ - protected void filterDrawListRZ() - { - boolean available[] = new boolean[numDraw]; - int numCells = numDraw; - int newNumDraw = 0; - - // Initialize the variables. - for (int i = 0; i < numDraw; i++) - { - available[i] = true; - } - for (int i = 0; i < numData; i++) - { - etSum[i] = 0.0f; - } - - while (numCells > 0) - { - - // Loop through all available cells and find the highest energy. - int max = -1; - for (int i = 0; i < numDraw; i++) - { - if (available[i]) - { - if (max < 0 || et[listdl[i]] > et[listdl[max]]) - max = i; - } - } - - // This is a cell we want to draw, store it and remove it from the - // available cells list. - available[max] = false; - numCells--; - listdl[newNumDraw++] = listdl[max]; - - // Now find all available cells that overlap this one. This loop - // will be processed - // quite a lot, so it is very important to do the "easy" rejects - // first. - for (int i = 0; i < numDraw; i++) - { - if (available[i]) - { - int j = listdl[i]; - - double zDist = Math.abs(z[j] - z[listdl[max]]); - if (zDist >= (dz[j] + dz[listdl[max]]) / 2.) - continue; - - double rDist = Math.abs(r[j] - r[listdl[max]]); - if (rDist >= (dr[j] + dr[listdl[max]]) / 2.) - continue; - - if (AParameterUtilities.getRhoSign(x[j], y[j]) != AParameterUtilities.getRhoSign(x[listdl[max]], y[listdl[max]])) - continue; - - available[i] = false; - etSum[listdl[max]] += et[j]; - numCells--; - } - } - } - - numDraw = newNumDraw; - } - - /** - * See expandDrawn. - * - * @param drawn boolean[] initial drawn list containing only the explicitly - * drawn cells - * @return boolean[] drawn list containing the explicitly and the implicitly - * drawn cells. - */ - private boolean[] expandDrawnRZ(boolean[] drawn) - { - makeDrawList(); - - boolean available[] = new boolean[numDraw]; - int numCells = numDraw; - - // Initialize the variables. - for (int i = 0; i < numDraw; i++) - { - available[i] = true; - } - - while (numCells > 0) - { - - // Loop through all available cells and find the highest energy. - int max = -1; - for (int i = 0; i < numDraw; i++) - { - if (available[i]) - { - if (max < 0 || et[listdl[i]] > et[listdl[max]]) - max = i; - } - } - - // This is a cell we want to draw, store it and remove it from the - // available cells list. - available[max] = false; - numCells--; - - // Now find all available cells that overlap this one. This loop - // will be processed - // quite a lot, so it is very important to do the "easy" rejects - // first. - for (int i = 0; i < numDraw; i++) - { - if (available[i]) - { - int j = listdl[i]; - - double zDist = Math.abs(z[j] - z[listdl[max]]); - if (zDist >= (dz[j] + dz[listdl[max]]) / 2.) - continue; - - double rDist = Math.abs(r[j] - r[listdl[max]]); - if (rDist >= (dr[j] + dr[listdl[max]]) / 2.) - continue; - - if (AParameterUtilities.getRhoSign(x[j], y[j]) != AParameterUtilities.getRhoSign(x[listdl[max]], y[listdl[max]])) - continue; - - available[i] = false; - if (drawn[listdl[max]]) - drawn[j] = true; - numCells--; - } - } - } - - return drawn; - } - - /** - * Draws the FCAL data in the y-x projection. - * - * @return ACoord cell geometry polygons - */ - protected ACoord getYXUser() - { - makeDrawList(); - - int mode = parameterStore.get("YX", "Mode").getI(); - if (parameterStore.get("YX", "DrawFCAL").getStatus() && mode >= AProjectionYX.MODE_HEC_2 && - mode <= AProjectionYX.MODE_HEC_4) - { - cutArray(sampling, mode - AProjectionYX.MODE_HEC_2, "Layer"); - } - else if (mode >= AProjectionYX.MODE_FCAL_EM || mode <= AProjectionYX.MODE_FCAL_HAD_2) - { - cutArray(sampling, mode - AProjectionYX.MODE_FCAL_EM, "Layer"); - } - else - { - return ACoord.NO_DATA; - } - - filterDrawListYX(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - double xMin = x[j] - dx[j] / 2.; - double xMax = x[j] + dx[j] / 2.; - double yMin = y[j] - dy[j] / 2.; - double yMax = y[j] + dy[j] / 2.; - - hv[0][i] = new double[] { xMax, xMin, xMin, xMax }; - hv[1][i] = new double[] { yMax, yMax, yMin, yMin }; - - index[i] = j; - } - - return new ACoord(hv, index, this); - } - - /** - * Draws the FCAL data in the rho-z projection. See the description of - * filterDrawListRZ() for an explanation of the drawing method. - * - * @return ACoord cell geometry polygons - */ - protected ACoord getRZUser() - { - makeDrawList(); - filterDrawListRZ(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - - double zMin = z[j] - dz[j] / 2.; - double zMax = z[j] + dz[j] / 2.; - double rMin = Math.sqrt(Math.pow(Math.abs(x[j]) - Math.abs(dx[j] / 2.), 2) + Math.pow(Math.abs(y[j]) - Math.abs(dy[j] / 2.), 2)); - double rMax = Math.sqrt(Math.pow(Math.abs(x[j]) + Math.abs(dx[j] / 2.), 2) + Math.pow(Math.abs(y[j]) + Math.abs(dy[j] / 2.), 2)); - - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[j] - phiMid); - if (phiDiff > Math.PI / 2. && phiDiff <= 3 * Math.PI / 2.) - { - rMin *= -1; - rMax *= -1; - } - - hv[0][i] = new double[] { zMax, zMin, zMin, zMax }; - hv[1][i] = new double[] { rMax, rMax, rMin, rMin }; - - index[i] = j; - } - - return new ACoord(hv, index, this); - } - - /** - * Applies cuts to the data. - */ - protected void applyCuts() - { - super.applyCuts(); - cut("CutsCalo", "FCALET", "FCALET", et); - cut("CutsCalo", "FCALEnergy", "FCALEnergy", energy); - - int cutSub = parameterStore.get("CutsCalo", "FCAL").getI(); - if(cutSub != -1) - { - cutArray(sub, cutSub, "Endcap"); - } - } - - /** - * Returns the data in the phi-rho projection. - * - * @return ACoord polygons representing calorimeter cells - */ - public ACoord getFRUser() - { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - /** - * Returns the data in the phi-eta projection. - * - * @return ACoord polygons representing calorimeter cells - */ - protected ACoord getVPUser() - { - makeDrawList(); - - switch (parameterStore.get("VP", "Mode").getI()) - { - case AProjectionVP.MODE_ECAL_LAYER_0: - case AProjectionVP.MODE_ECAL_LAYER_1: - case AProjectionVP.MODE_ECAL_LAYER_2: - case AProjectionVP.MODE_ECAL_LAYER_3: - cutArray(sampling, 0, "EM"); - break; - case AProjectionVP.MODE_HCAL_LAYER_0: - case AProjectionVP.MODE_HCAL_LAYER_1: - case AProjectionVP.MODE_HCAL_LAYER_2: - case AProjectionVP.MODE_HCAL_LAYER_3: - cutArrayOR(sampling, 1, 2, "Hadronic"); - break; - default: - return ACoord.NO_DATA; - } - - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - etSum[j] = et[j]; - - double eta0 = AMath.etaAbs(z[j], (float) Math.sqrt(Math.pow(x[j] + dx[j] / 2., 2) + Math.pow(y[j] + dy[j] / 2., 2))); - double eta1 = AMath.etaAbs(z[j], (float) Math.sqrt(Math.pow(x[j] - dx[j] / 2., 2) + Math.pow(y[j] + dy[j] / 2., 2))); - double eta2 = AMath.etaAbs(z[j], (float) Math.sqrt(Math.pow(x[j] - dx[j] / 2., 2) + Math.pow(y[j] - dy[j] / 2., 2))); - double eta3 = AMath.etaAbs(z[j], (float) Math.sqrt(Math.pow(x[j] + dx[j] / 2., 2) + Math.pow(y[j] - dy[j] / 2., 2))); - - // Calculate phi between 0 and 360. - double phi0 = Math.toDegrees(Math.atan2(y[j] + dy[j] / 2., x[j] + dx[j] / 2.) + 360.) % 360.; - double phi1 = Math.toDegrees(Math.atan2(y[j] + dy[j] / 2., x[j] - dx[j] / 2.) + 360.) % 360.; - double phi2 = Math.toDegrees(Math.atan2(y[j] - dy[j] / 2., x[j] - dx[j] / 2.) + 360.) % 360.; - double phi3 = Math.toDegrees(Math.atan2(y[j] - dy[j] / 2., x[j] + dx[j] / 2.) + 360.) % 360.; - - // Some code to prevent problems with cells going across the 0/360 - // border. - if (phi1 - phi0 > 180.) - phi1 -= 360.; - else if (phi0 - phi1 > 180.) - phi1 += 360; - if (phi2 - phi1 > 180.) - phi2 -= 360.; - else if (phi1 - phi2 > 180.) - phi2 += 360; - if (phi3 - phi2 > 180.) - phi3 -= 360.; - else if (phi2 - phi3 > 180.) - phi3 += 360; - - hv[0][i] = new double[] { eta0, eta1, eta2, eta3 }; - hv[1][i] = new double[] { phi0, phi1, phi2, phi3 }; - - index[i] = j; - } - - return new ACoord(hv, index, this).includePhiWrapAround("VP"); - } - - /** - * Returns the histograms in the RZ projection. - * - * @return ACoord[] histograms - */ - public ACoord[] getRZHistograms() - { - AHistogram histUp = new AHistogram(-outerEta, outerEta, etaGranularity, histoScale.getD(), this); - AHistogram histDown = new AHistogram(-outerEta, outerEta, etaGranularity, histoScale.getD(), this); - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - int sign = AParameterUtilities.getRhoSign(x[j], y[j]); - double etaMin; - double etaMax; - - if (side[j] < 0) - { - etaMin = AParameterUtilities.eta(z[j] + dz[j] / 2.f, r[j] - dr[j] / 2.f); - etaMax = AParameterUtilities.eta(z[j] - dz[j] / 2.f, r[j] + dr[j] / 2.f); - } - else - { - etaMin = AParameterUtilities.eta(z[j] - dz[j] / 2.f, r[j] + dr[j] / 2.f); - etaMax = AParameterUtilities.eta(z[j] + dz[j] / 2.f, r[j] - dr[j] / 2.f); - } - - if (sign > 0) - { - histUp.fill(etaMin, etaMax, etSum[j]); - } - else - { - histDown.fill(etaMin, etaMax, etSum[j]); - } - } - - ACoordArray c = new ACoordArray(); - c.add(histUp.getRZUser(outerZ, outerR, AHistogram.UP)); - c.add(histDown.getRZUser(outerZ, outerR, AHistogram.DOWN)); - return c.getArray(); - } - - - -// /** -// * Determines adc2Mev factor value for a cell. The number either comes -// * with the event file (adc2Mev subtag), but sometimes is not available -// * in Athena (in the database) which is indicated by -1 in the event file -// * for a particular cell. In this case, use predefined constant in this -// * method. -// * -// * zdenek (2008-09-15): -// * These predefined values (which are used if adc2Mev factor is -1) should -// * no longer be used. if the factor is not present, do not plot the pulse -// * shape, just the ADC counts as these values are non-sense. The method -// * and references to it should be removed after some time (if calo people -// * don't change their mind to pre-define some other values and use those) -// * -// * @param index int -// * @return String -// */ - /* - private float getADC2MevFactorPredefined(int index) - { - int layer = sampling[index]; - float r = Float.NaN; - switch(layer) - { - case 0: r = 87.0f; - break; - case 1: r = 117.0f; - break; - case 2: r = 193.0f; - break; - } - - return r; - - } // getADC2MevFactorPredefined() --------------------------------------- - */ - - - /** - * Returns info about a selected hit (for picking) - * - * @param index int hit index - * @return String info - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",et[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",et[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",et[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",et[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String t = ""; - String cellInfo = ""; - - t = super.getHitInfo(index); - cellInfo += "\n x = " + x[index] + " cm"; - cellInfo += "\n y = " + y[index] + " cm"; - - cellInfo += "\n cell time = "; - cellInfo += (cellTime != null) ? Float.toString(cellTime[index]) + - " ns" : "n/a"; - cellInfo += "\n cell gain = "; - cellInfo += (cellGain != null) ? Integer.toString(cellGain[index]) : "n/a"; - cellInfo += "\n cell pedestal = "; - cellInfo += (cellPedestal != null) ? Float.toString(cellPedestal[index]) + - " ADC counts" : "n/a"; - - cellInfo += "\n ADC 2 MeV = "; - if(adc2Mev == null) - { - cellInfo += "n/a"; - } - else - { - // subtag adc2Mev was available in the event file - if(adc2Mev[index] != -1) - { - // other than -1: the factor was available in - // Athena (database) for this particular cell - cellInfo += Float.toString(adc2Mev[index]) + " (from database)"; - } - else - { - // -1 -> the factor wasn't available in Athena (database), - // use hardcoded constant for this particular cell - cellInfo += "-1 (n/a in database)"; - // see comment at the getADC2MevFactorPredefined() method - // (was printing the predefined value) using predefined " + - // Float.toString(getADC2MevFactorPredefined(index)); - } - } - - cellInfo += pulseShapesDataAvailable ? "" : - "\n data for real pulse shapes plot n/a"; - - return t + cellInfo; - - } // getHitInfo() ------------------------------------------------------- - - @Override //ACalorimeterData - //Gives the hit time for this cell - protected double getTime(int hit) - { - if (cellTime == null) return 0.0; - else return cellTime[hit]; - } - - /** - * Recalculates eta from r and z in case the user wants to have their eta - * with respect to the primary vertex instead of 0. The calculation is a - * little different from the other calorimeter classes because this one - * contains both barrel and endcap data. - * - * @param index int index of hit in data - * @return double eta value - */ - public double getEta(int index) - { - if (!parameterStore.get("VP", "EtaVertex").getStatus()) - { - return this.eta[index]; - } - - return AParameterUtilities.eta(z[index], Math.sqrt(x[index] * x[index] + y[index] * y[index])); - } - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - ACoord[] data = ACoord.NO_HISTOGRAMS; - if (projection instanceof AProjectionRZ) - data = getRZHistograms(); - return projection.nonLinearTransform(data); - } - - - -// /** -// * Call util class which plots cell pulse shapes provided that -// * all real pulse shapes data is available -// * Functions calculates values of real pulse shape calculated in the method -// * getPhysicsPulseShape(). -// * This method is called from pick interaction. -// * -// * @param index int -// */ - /*public void plotPulseShapes(int index) - { - - if(pulseShapesDataAvailable) - { - String title = getPulseTitleString(index); - - int[][] adcCountsLocal = new int[][] { adcCounts[index] }; - - if(super.checkADCCountsAvailability(adcCountsLocal)) - { - // adc counts are available - logger.debug(CALORIMETER_NAME + " adc counts (digits) are " + - "available for pulse shapes plots for this cell."); - } - else - { - AOutput.append("\nADC counts are not available for this cell, " + - "can't plot pulse shapes.", ALogPane.WARNING); - return; - } - - - float[] time = ACalorimeterRPSPLT.FCAL_TIME; // lookup tables - float[] amplitude = null; // lookup tables - switch(sampling[index]) - { - // use correct amplitude lookup table for this layer (sampling) - case 0: amplitude = ACalorimeterRPSPLT.FCAL_LAYER0_AMPLITUDE; - break; - case 1: amplitude = ACalorimeterRPSPLT.FCAL_LAYER1_AMPLITUDE; - break; - case 2: amplitude = ACalorimeterRPSPLT.FCAL_LAYER2_AMPLITUDE; - break; - default: AOutput.append("\nADC counts plot only, pulse shape " + - "plot not implemented for " + - CALORIMETER_NAME + " layer " + - sampling[index] + "\n", ALogPane.WARNING); - APulseShapePlot.plotADCCounts(adcCountsLocal, title, null); - return; - } - - // step - starting from 1, need to get step numbers within - // number of ADC samples (adcCounts[0].length) - double step = (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try - { - if(factor != -1) - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - realPulse[0][i] = super.getPhysicsPulseShape(d, cellTime[index], - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogPane.WARNING); - return; - } - - if(factor != -1) - { - logger.debug("adc2Mev factor available, plotting full plot."); - APulseShapePlot.plotRealPulseShapes(adcCountsLocal, realPulse, - step, null, title); - } - else - { - logger.debug("adc2Mev factor not available, plotting just adc counts."); - APulseShapePlot.plotADCCounts(adcCountsLocal, title, null); - } - - } // if(pulseShapesDataAvailable) - else - { - return; - } - - }*/ // plotPulseShapes() -------------------------------------------------- - - @Override - protected int[][] getADCCounts(int index) { - - if (pulseShapesDataAvailable) { - return new int[][]{adcCounts[index]}; - } else { - return null; - } - } - - /** - * Calculate local time for pulse shape plots - */ - protected double getLocalTime(double xTime, double cellTime, int numSamplings) { - int nominalPeakSample = (int)(numSamplings / 2.); - return ((xTime - nominalPeakSample + 3) * 25.0) - cellTime; - } - - @Override - protected double[][] getPulseShape(int index) { - - float[] time = ACalorimeterRPSPLT.FCAL_TIME; // lookup tables - float[] amplitude = null; // lookup tables - switch(sampling[index]) - { - // use correct amplitude lookup table for this layer (sampling) - case 0: amplitude = ACalorimeterRPSPLT.FCAL_LAYER0_AMPLITUDE; - break; - case 1: amplitude = ACalorimeterRPSPLT.FCAL_LAYER1_AMPLITUDE; - break; - case 2: amplitude = ACalorimeterRPSPLT.FCAL_LAYER2_AMPLITUDE; - break; - default: AOutput.append("\nADC counts plot only, pulse shape " + - "plot not implemented for " + - CALORIMETER_NAME + " layer " + - sampling[index] + "\n", ALogInterface.WARNING); - return null; - } - - // step - starting from 1, need to get step numbers within - // number of ADC samples (adcCounts[0].length) - double step = getPulseStep(index); - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try - { - if(factor != -1) - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - double localTime = getLocalTime(d, cellTime[index], this.numSamplings); - realPulse[0][i] = super.getPhysicsPulseShape(localTime, - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - return null; - } - - if(factor != -1) - { - logger.debug("adc2Mev factor available, plotting full plot."); - return realPulse; - } - else - { - logger.debug("adc2Mev factor not available, plotting just adc counts."); - return null; - } - - } - - @Override - protected double getPulseStep(int index) { - return (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AG4StepData.java b/graphics/AtlantisJava/src/atlantis/data/AG4StepData.java deleted file mode 100755 index 7f962718d03b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AG4StepData.java +++ /dev/null @@ -1,559 +0,0 @@ -package atlantis.data; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.InputStreamReader; -import java.util.Enumeration; -import java.util.Scanner; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import atlantis.parameters.AParameterUtilities; -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.utils.AAtlantisException; -import atlantis.event.ABufferedEventSource; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.utils.AHashMap; - -/** - * This class holds the data from GEANT4 (G4) steps which - * represent the path of simulated particles. The steps - * are read in from a (zipped) text file via the File menu - * or by pressing "/". - * The file (named "G4Atlantis_run_event.txt(.zip)") can be - * made by running AtlasG4 with a special plugin: - * AtlasG4_trf.py postInitInclude="G4UserActions/G4AtlantisDumper_options.py" - * - * @author Andy Haas (ahaas) - */ -public class AG4StepData extends AData { - - protected int[] nsteps; - protected int[] gid; - protected int[] pid; - protected int[] fs; - protected int[] ls; - protected int[] stepn; - protected String[] pn; - protected int[] nsec; - protected float[] tedep; - protected float[] tnedep; - protected float[] length; - protected int[] pdg; - protected float[] mass; - protected float[] charge; - protected float[] x1; - protected float[] y1; - protected float[] z1; - protected float[] t1; - protected float[] x2; - protected float[] y2; - protected float[] z2; - protected float[] t2; - protected float[] px1; - protected float[] py1; - protected float[] pz1; - protected float[] ke1; - protected float[] px2; - protected float[] py2; - protected float[] pz2; - protected float[] ke2; - - protected float[] eta1; - protected float[] p1; - - public AG4StepData(AHashMap p, AEvent e) { - super(p, e); - - nsteps = p.getIntArray("nsteps"); - gid = p.getIntArray("id"); - pid = p.getIntArray("pid"); - fs = p.getIntArray("fs"); - ls = p.getIntArray("ls"); - stepn = p.getIntArray("stepn"); - pn = p.getStringArray("pn"); - nsec= p.getIntArray("nsec"); - tedep = p.getFloatArray("tedep"); - tnedep = p.getFloatArray("tnedep"); - length = p.getFloatArray("length"); - pdg = p.getIntArray("pdg"); - mass = p.getFloatArray("mass"); - charge = p.getFloatArray("charge"); - x1 = p.getFloatArray("x1"); - y1 = p.getFloatArray("y1"); - z1 = p.getFloatArray("z1"); - t1 = p.getFloatArray("t1"); - x2 = p.getFloatArray("x2"); - y2 = p.getFloatArray("y2"); - z2 = p.getFloatArray("z2"); - t2 = p.getFloatArray("t2"); - px1 = p.getFloatArray("px1"); - py1 = p.getFloatArray("py1"); - pz1 = p.getFloatArray("pz1"); - ke1 = p.getFloatArray("ke1"); - px2 = p.getFloatArray("px2"); - py2 = p.getFloatArray("py2"); - pz2 = p.getFloatArray("pz2"); - ke2 = p.getFloatArray("ke2"); - - eta1 = new float[numData]; - p1 = new float[numData]; - for (int i=0; i<numData; ++i) { - eta1[i]=(float)(-1.0*Math.log(Math.tan( - Math.acos( z1[i]/Math.sqrt(x1[i]*x1[i]+y1[i]*y1[i]+z1[i]*z1[i]) )/2.0 - ))); - p1[i]=(float)Math.sqrt(px1[i]*px1[i]+py1[i]*py1[i]+pz1[i]*pz1[i]); - } - } - - /** - * The color of the step displayed... mostly determined - * by the particle type (pdgid) for now. - */ - @Override - protected void colorByIndex() { - int numColors = parameterStore.get("HitColors", "Number").getI(); - if (numColors<6) return;//not enough colors! - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) { - - if (charge[i]==0) color[i] = (byte)col[0];//neutral - else color[i] = (byte)col[1];//charged - - if (pdg[i]==22) color[i] = (byte)col[2];//photons - if (Math.abs(pdg[i])==11) color[i] = (byte)col[3];//electrons - if (Math.abs(pdg[i])==13) color[i] = (byte)col[4];//muons - if (Math.abs(pdg[i])>=1000000000) color[i] = (byte)col[5];//nuclei - } - } - - /** - * Can choose to color by constant color, or using the - * function above (by type / index). - */ - protected int internalColor() { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - switch (colorFunction) { - case 0: - colorByConstant(); - break; - case 1: - colorByIndex(); - break; - } - return 1; - } - - /** - * Cuts on the particle type, energy, etc. - * Adjusted via the gui, and in the config-G4.xml file. - */ - protected void applyCuts() { - cutIndex(); - - cut("CutsObjects", "G4StepKE1", " ke1", ke1);//starting kinetic energy (MeV) - cut("CutsObjects", "G4StepP1", " p1", p1);//starting momentum (MeV) - - cut("CutsObjects", "G4StepPhotons", " |pdg|", pdg);//22 - cut("CutsObjects", "G4StepElectrons", " |pdg|", pdg);//11 - cut("CutsObjects", "G4StepMuons", " |pdg|", pdg);//13 - cut("CutsObjects", "G4StepPions", " |pdg|", pdg);//211 - cut("CutsObjects", "G4StepProtons", " |pdg|", pdg);//2212 - cut("CutsObjects", "G4StepNeutrons", " |pdg|", pdg);//2112 - - // Nuclear codes are given as 10-digit numbers +-10LZZZAAAI. - // For a nucleus consisting of np protons and nn neutrons - // A = np + nn +nlambda and Z = np and L = nlambda - // I gives the isomer level, with I = 0 corresponding to the ground state and I >0 to excitations - cut("CutsObjects", "G4StepNuclei", " |pdg|", pdg);//1000000000 - - } - - /** - * Prints out stuff when you select a step using the hand. - */ - public String getHitInfo(int index) { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if (simpleOutput > 0) { - return getNameScreenName() + " index: " + index + "\n"; - } - - String name = "none"; - try { - name = APDGTable.getName(pdg[index]); - - } catch(APDGTable.ParticleNotFoundError e) { - name = "unknown"; - } - - return getName() + " (index: " + index + ") : " - + " storegate key = " + storeGateKey + "\n" - + " total step # = " + nsteps[index] + " \n" - + " geant/parent id = " + gid[index]+"/"+ pid[index] + " \n" - + " first/last step? " + fs[index] +"/"+ ls[index] + " / step#="+stepn[index]+"\n" - + " process = " + pn[index] + " / # secondaries = " + nsec[index] + " \n" - + " energy/NI deposited = " + tedep[index]+" / "+tnedep[index]+" MeV\n" - + " length = " + length[index] + " cm / " +"eta1 = "+eta1[index]+"\n" - + " pdg = " + pdg[index] + " ("+name+")\n" - + " mass / charge = " + mass[index]+" MeV"+" / "+charge[index]+"\n" - + " x1 y1 z1 = " + String.format("%.3f", x1[index])+" "+String.format("%.3f", y1[index])+" "+String.format("%.3f", z1[index])+" cm\n" - + " t1 = " + String.format("%.3f", t1[index]) + " ns\n" - + " x2 y2 z2 = " + String.format("%.3f", x2[index])+" "+String.format("%.3f", y2[index])+" "+String.format("%.3f", z2[index])+" cm\n" - + " t2 = " + String.format("%.3f", t2[index]) + " ns\n" - + " px1 py1 pz1 = " + String.format("%.3f", px1[index])+" "+String.format("%.3f", py1[index])+" "+String.format("%.3f", pz1[index])+" MeV\n" - + " ke1 = " + String.format("%.3f", ke1[index]) + " MeV\n" - + " px2 py2 pz2 = " + String.format("%.3f", px2[index])+" "+String.format("%.3f", py2[index])+" "+String.format("%.3f", pz2[index])+" MeV\n" - + " ke2 = " + String.format("%.3f", ke2[index]) + " MeV\n" - + " p1 = " + String.format("%.3f", p1[index]) + " MeV\n" - ; - } - - /** - * Make some cuts for drawing in the YX view. - */ - @Override - protected ACoord getYXUser() { - //System.out.print("numData="+numData+", numDraw="+numDraw); - makeDrawList(); - //System.out.print(" "+numDraw); - - //cut on |eta1| - int num = 0; - double AbsEtaXYcut = parameterStore.get(PARAMETER_GROUP, "AbsEtaXYcut").getD(); - if (AbsEtaXYcut >= 0.0) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(eta1[listdl[i]]) < AbsEtaXYcut) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - //System.out.print(" "+numDraw); - - //cut on |z1| - num = 0; - double AbszXYcut = parameterStore.get(PARAMETER_GROUP, "AbszXYcut").getD(); - if (AbszXYcut >= 0.0) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(z1[listdl[i]]) < AbszXYcut) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - //System.out.println(" "+numDraw); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - //double length = parameterStore.get(PARAMETER_GROUP, "SegmentLength").getD(); - for (int i = 0; i < numDraw; i++) { - int j = listdl[i]; - hv[0][i] = new double[]{x1[j], x2[j]}; - hv[1][i] = new double[]{y1[j], y2[j]}; - index[i] = j; - } - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - } - - /** - * Make some cuts for drawing in the FR view. - */ - @Override - protected ACoord getFRUser() { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - /** - * Make some cuts for drawing in the RZ view. - */ - @Override - protected ACoord getRZUser() { - makeDrawList(); - - //cut on |eta1| - int num = 0; - double AbsEtaRZcut = parameterStore.get(PARAMETER_GROUP, "AbsEtaRZcut").getD(); - if (AbsEtaRZcut >= 0.0) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(eta1[listdl[i]]) < AbsEtaRZcut) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - //cut on |z1| - num = 0; - double AbszRZcut = parameterStore.get(PARAMETER_GROUP, "AbszRZcut").getD(); - if (AbszRZcut >= 0.0) { - for (int i = 0; i < numDraw; i++) { - if ( - Math.abs(z1[listdl[i]]) < AbszRZcut && - Math.sqrt(x1[listdl[i]]*x1[listdl[i]]+y1[listdl[i]]*y1[listdl[i]]) < 1200 - ) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - //double length = parameterStore.get(PARAMETER_GROUP, "SegmentLength").getD(); - for (int i = 0; i < numDraw; i++) { - int j = listdl[i]; - double s = AParameterUtilities.getRhoSign(x1[j], y1[j]);//use same for both points to avoid ugliness - double r1 = s * Math.sqrt(x1[j] * x1[j] + y1[j] * y1[j]); - double r2 = s * Math.sqrt(x2[j] * x2[j] + y2[j] * y2[j]); - hv[0][i] = new double[]{z1[j], z2[j]}; - hv[1][i] = new double[]{r1, r2}; - index[i] = j; - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - @Override - public String getName() { - return "G4Step"; - } - - @Override - public String getNameScreenName() { - return "G4Step"; - } - - @Override - public String getParameterGroup() { - return "G4Step"; - } - - /** - * Read in the corresponding G4Atlantis_run_event.txt(.zip) file. - * It needs to be in the same directory as the JiveXML_run_event.xml file - * that is currently being viewed. - */ - public static void ReadG4Steps(){ - AEvent ev = eventManager.getCurrentEvent(); - String source = eventManager.getEventSource().getSourceName(); - System.out.println("Source="+source); - String filename = source; - if (source.contains("\\")) filename+="\\G4Atlantis_"+ev.getRunNumber()+"_"+ev.getEventNumber()+".txt"; - else filename += "/G4Atlantis_" + ev.getRunNumber() + "_" + ev.getEventNumber() + ".txt"; - System.out.println("Reading G4 file: " + filename); - Scanner inFile = null; - int maxnstepsinthisevent = 4000000;//max allowed - int nstepsinfile = maxnstepsinthisevent;//will be set to actual number of steps in file, if lower than maximum - try { - inFile = new Scanner(new FileReader(filename)); - - //try to get the number of steps that are in the file - try { - FileInputStream in = new FileInputStream(filename); - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - String strLine = null, tmp; - while ((tmp = br.readLine()) != null) { strLine = tmp; } - String lastLine = strLine; - System.out.println(lastLine); - in.close(); - - Scanner lastlinescanner = new Scanner(lastLine); - String llach = lastlinescanner.next(); - String _llach = "ACH_G4Step"; - if (!llach.equals(_llach)) { - System.out.println("??ach in lastline = " + llach); - } - nstepsinfile = lastlinescanner.nextInt()+1; - - } catch (IOException ex) { - Logger.getLogger(AG4StepData.class.getName()).log(Level.SEVERE, null, ex); - } - - } catch (FileNotFoundException ex) { - //Logger.getLogger(AEventQueue.class.getName()).log(Level.SEVERE, null, ex); - System.out.println("Could not open "+filename); - } - - if (inFile == null) { - ZipFile zipfile = null; - try { - System.out.println("Reading G4 file: " + filename+".zip"); - zipfile = new ZipFile(filename + ".zip"); - } catch (IOException ex) { - //Logger.getLogger(AEventQueue.class.getName()).log(Level.SEVERE, null, ex); - System.out.println("Could not open "+filename+".zip either"); - } - if (zipfile != null) { - BufferedInputStream is = null; - ZipEntry entry; - Enumeration e = zipfile.entries(); - while (e.hasMoreElements()) { - entry = (ZipEntry) e.nextElement(); - System.out.println("Extracting: " + entry); - try { - is = new BufferedInputStream(zipfile.getInputStream(entry)); - BufferedReader br = new BufferedReader(new InputStreamReader(is)); - String strLine = null, tmp; - while ((tmp = br.readLine()) != null) { - strLine = tmp; - } - String lastLine = strLine; - System.out.println(lastLine); - - Scanner lastlinescanner = new Scanner(lastLine); - String llach = lastlinescanner.next(); - String _llach = "ACH_G4Step"; - if (!llach.equals(_llach)) { - System.out.println("??ach in lastline = " + llach); - } - nstepsinfile = lastlinescanner.nextInt() + 1; - - is = new BufferedInputStream(zipfile.getInputStream(entry)); - inFile = new Scanner(is); - } catch (IOException ex) { - Logger.getLogger(AG4StepData.class.getName()).log(Level.SEVERE, null, ex); - } - - } - } - } - - if (inFile != null) { - - System.out.print("nsteps in file should be "+nstepsinfile+"... "); - if (nstepsinfile>maxnstepsinthisevent) nstepsinfile=maxnstepsinthisevent; - System.out.println(" and will read "+nstepsinfile+" steps."); - - try { - AHashMap para = new AHashMap(100); - float[] x1 = new float[nstepsinfile]; - float[] y1 = new float[nstepsinfile]; - float[] z1 = new float[nstepsinfile]; - float[] t1 = new float[nstepsinfile]; - float[] x2 = new float[nstepsinfile]; - float[] y2 = new float[nstepsinfile]; - float[] z2 = new float[nstepsinfile]; - float[] t2 = new float[nstepsinfile]; - float[] px1 = new float[nstepsinfile]; - float[] py1 = new float[nstepsinfile]; - float[] pz1 = new float[nstepsinfile]; - float[] ke1 = new float[nstepsinfile]; - float[] px2 = new float[nstepsinfile]; - float[] py2 = new float[nstepsinfile]; - float[] pz2 = new float[nstepsinfile]; - float[] ke2 = new float[nstepsinfile]; - int[] nsteps = new int[nstepsinfile]; - int[] id = new int[nstepsinfile]; - int[] pid = new int[nstepsinfile]; - int[] fs = new int[nstepsinfile]; - int[] ls = new int[nstepsinfile]; - int[] stepn = new int[nstepsinfile]; - String[] pn = new String[nstepsinfile]; - int[] nsec = new int[nstepsinfile]; - float[] tedep = new float[nstepsinfile]; - float[] tnedep = new float[nstepsinfile]; - float[] length = new float[nstepsinfile]; - int[] pdg = new int[nstepsinfile]; - float[] mass = new float[nstepsinfile]; - float[] charge = new float[nstepsinfile]; - - int n = 0; - String _ach = "ACH_G4Step"; - while (inFile.hasNext() && n<nstepsinfile){ - String ach = inFile.next(); - if (!ach.equals(_ach)) { - System.out.println("??ach = " + ach); - } - nsteps[n] = inFile.nextInt(); - id[n] = inFile.nextInt(); - pid[n] = inFile.nextInt(); - fs[n] = inFile.nextInt(); - ls[n] = inFile.nextInt(); - stepn[n] = inFile.nextInt(); - pn[n] = inFile.next(); - nsec[n] = inFile.nextInt(); - tedep[n] = inFile.nextFloat(); - tnedep[n] = inFile.nextFloat(); - length[n] = inFile.nextFloat()/10.0f; - pdg[n] = inFile.nextInt(); - //System.out.println("pdg="+pdg); - mass[n] = inFile.nextFloat(); - charge[n] = inFile.nextFloat(); - x1[n] = inFile.nextFloat()/10.0f; - y1[n] = inFile.nextFloat()/10.0f; - z1[n] = inFile.nextFloat()/10.0f; - t1[n] = inFile.nextFloat(); - px1[n] = inFile.nextFloat(); - py1[n] = inFile.nextFloat(); - pz1[n] = inFile.nextFloat(); - ke1[n] = inFile.nextFloat(); - x2[n] = inFile.nextFloat()/10.0f; - y2[n] = inFile.nextFloat()/10.0f; - z2[n] = inFile.nextFloat()/10.0f; - t2[n] = inFile.nextFloat(); - px2[n] = inFile.nextFloat(); - py2[n] = inFile.nextFloat(); - pz2[n] = inFile.nextFloat(); - ke2[n] = inFile.nextFloat(); - ++n; - if (n%100000==0) System.out.println("Read "+n+" steps"); - } - System.out.println("Read "+n+" steps"); - inFile.close(); - System.out.println("Closed file."); - - para.put("nsteps",nsteps); - para.put("id",id); - para.put("pid",pid); - para.put("fs",fs); - para.put("ls",ls); - para.put("stepn",stepn); - para.put("pn",pn); - para.put("nsec",nsec); - para.put("tedep",tedep); - para.put("tnedep",tnedep); - para.put("length",length); - para.put("pdg",pdg); - para.put("mass",mass); - para.put("charge",charge); - para.put("x1", x1); - para.put("y1", y1); - para.put("z1", z1); - para.put("t1", t1); - para.put("x2", x2); - para.put("y2", y2); - para.put("z2", z2); - para.put("t2", t2); - para.put("px1", px1); - para.put("py1", py1); - para.put("pz1", pz1); - para.put("ke1", ke1); - para.put("px2", px2); - para.put("py2", py2); - para.put("pz2", pz2); - para.put("ke2", ke2); - para.put("numData", n); - //para.put("storeGateKey", "G4"); - - ABufferedEventSource.maxNumberOfEvents=1;//otherwise we run out of heap - AG4StepData g4d = new AG4StepData(para, ev); - ev.add(g4d); - } catch (AAtlantisException ex) { - Logger.getLogger(AG4StepData.class.getName()).log(Level.SEVERE, null, ex); - } - catch (OutOfMemoryError oom) { - Logger.getLogger(AG4StepData.class.getName()).log(Level.SEVERE,"Ran out of memory while trying to read G4Step data"); - } - ACanvas.getCanvas().repaintAllFromScratch(); - }//inFile!=null - - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHECData.java b/graphics/AtlantisJava/src/atlantis/data/AHECData.java deleted file mode 100755 index 2b1efe56a625..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHECData.java +++ /dev/null @@ -1,574 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.utils.AUtilities; -import atlantis.utils.ALogger; -import java.io.IOException; -import com.Ostermiller.util.CSVParser; - -import java.io.InputStream; -import java.io.StringReader; -import java.io.FileNotFoundException; - - -/** - * The Hadronic End Cap calorimeter. - * - * @author Eric Jansen - */ -public class AHECData extends ACalorimeterData -{ - private static ALogger logger = ALogger.getLogger(AHECData.class); - - // data for real pulse shapes plots - private int numSamplings = 0; - private int[][] adcCounts = null; - private float[] cellTime = null; - private int[] cellGain = null; - private float[] cellPedestal = null; - private float[] adc2Mev = null; - private static boolean pulseShapesDataAvailable = false; - private static final String LOOKUP_TABLE_FILE = - AGlobals.instance().getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - "rpsplt_hec.csv"; - // number of lookup table values for real pulse shapes plots calculation - private static final short NUMBER_OF_LOOKUP_VALUES = 800; - - - - AHECData(AHashMap p, AEvent e) - { - super(p,e); - - for (int i = 0; i < numData; i++) - { - try - { - side[i] = (byte) AIdHelper.larBarrelEndcap(id[i]); - etaIndex[i] = (short) AIdHelper.larEta(id[i]); - phiIndex[i] = (short) AIdHelper.larPhi(id[i]); - sampling[i] = AIdHelper.larSampling(id[i]); - } - catch (AAtlantisException ex) - { - logger.error("Problem decoding ID " + id[i] + " in " + CALORIMETER_NAME + ": " + ex.getMessage()); - side[i] = 0; - etaIndex[i] = -1; - phiIndex[i] = -1; - sampling[i] = -1; - } - } - - makeHitToGeometryMapping(); - for (int i = 0; i < et.length; ++i) - { - et[i] = Math.abs(energy[i] / (float) Math.cosh(eta[i])); - } - - // Collect some constants we need for the histograms. - for (int i = 0; i < ACalorimeterDetector.count(); i++) - { - - if (ACalorimeterDetector.get(i).getName().indexOf(CALORIMETER_NAME) >= 0) - { - if (innerR == 0.0 || ACalorimeterDetector.get(i).getRMin() < innerR) - { - innerR = ACalorimeterDetector.get(i).getRMin(); - } - if (innerZ == 0.0 || ACalorimeterDetector.get(i).getZMin() < innerZ) - { - innerZ = ACalorimeterDetector.get(i).getZMin(); - } - if (phiGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaPhi() < phiGranularity) - { - phiGranularity = ACalorimeterDetector.get(i).getDeltaPhi(); - } - if (etaGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaEta() < etaGranularity) - { - etaGranularity = ACalorimeterDetector.get(i).getDeltaEta(); - } - if (outerEta == 0.0 || ACalorimeterDetector.get(i).getEtaMax() > outerEta) - { - outerEta = ACalorimeterDetector.get(i).getEtaMax(); - } - } - - if (outerR == 0.0 || ACalorimeterDetector.get(i).getRMax() > outerR) - { - outerR = ACalorimeterDetector.get(i).getRMax(); - } - if (outerZ == 0.0 || ACalorimeterDetector.get(i).getZMax() > outerZ) - { - outerZ = ACalorimeterDetector.get(i).getZMax(); - } - } - - // Add a little bit of extra margin to prevent binning errors due to - // rounding of numbers. - outerEta += etaGranularity; - - // read in HEC data from real pulse shapes plots - readPulseShapePlotData(p); - - } - - - - private void readPulseShapePlotData(AHashMap p) - { - // read ADCCounts and cell data for real pulse shapes plots - adcCounts = super.getADCCountsData(p); - - // read LAr digits (cell data) for real pulse shapes plots - cellTime = (p.get("cellTime") != null) ? p.getFloatArray("cellTime") : null; - cellGain = (p.get("cellGain") != null) ? p.getIntArray("cellGain") : null; - cellPedestal = (p.get("cellPedestal") != null) ? p.getFloatArray("cellPedestal") : null; - adc2Mev = (p.get("adc2Mev") != null) ? p.getFloatArray("adc2Mev") : null; - - pulseShapesDataAvailable = false; - if(adcCounts != null && cellTime != null && cellGain != null && - cellPedestal != null && adc2Mev != null) - { - pulseShapesDataAvailable = true; - numSamplings = adcCounts[0].length; - - logger.debug(CALORIMETER_NAME + - ": data for real pulse shape plots available"); - - if(ACalorimeterRPSPLT.areHECLookupTablesInitialized()) - { - logger.debug(CALORIMETER_NAME + - ": lookup tables have already been read in"); - } - else - { - logger.debug(CALORIMETER_NAME + - ": lookup table values have not been read in yet\n" + - " trying to read file: " + LOOKUP_TABLE_FILE); - - try - { - readLookupTableFile(); - logger.debug(CALORIMETER_NAME + - ": values from " + LOOKUP_TABLE_FILE + - " successfully read in"); - } - catch(AAtlantisException ex) - { - logger.debug(CALORIMETER_NAME + - ": reading " + LOOKUP_TABLE_FILE + - " failed, real pulse shapes plots will not " + - "be available, reason: " + ex.getMessage(), ex); - pulseShapesDataAvailable = false; - } - } - } - - } // readPulseShapePlotData() ------------------------------------------- - - - - /** - * Returns info about a selected hit (for picking) - * - * @param index int hit index - * @return String info - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",et[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",et[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",et[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",et[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String t = ""; - String cellInfo = ""; - - t = super.getHitInfo(index); - - cellInfo += "\n cell time = "; - cellInfo += (cellTime != null) ? Float.toString(cellTime[index]) + - " ns" : "n/a"; - cellInfo += "\n cell gain = "; - cellInfo += (cellGain != null) ? Integer.toString(cellGain[index]) : "n/a"; - cellInfo += "\n cell pedestal = "; - cellInfo += (cellPedestal != null) ? Float.toString(cellPedestal[index]) + - " ADC counts" : "n/a"; - - cellInfo += "\n ADC 2 MeV = "; - if(adc2Mev == null) - { - cellInfo += "n/a"; - } - else - { - // subtag adc2Mev was available in the event file - if(adc2Mev[index] != -1) - { - // other than -1: the factor was available in - // Athena (database) for this particular cell - cellInfo += Float.toString(adc2Mev[index]) + " (from database)"; - } - else - { - // -1 -> the factor wasn't available in Athena (database), - // use hardcoded constant for this particular cell - cellInfo += "-1 (n/a in database)"; - // see comment at the getADC2MevFactorPredefined() method - //, using predefined " + - // Float.toString(getADC2MevFactorPredefined()); - } - } - - cellInfo += pulseShapesDataAvailable ? "" : - "\n data for real pulse shapes plot n/a"; - - return t + cellInfo; - - } // getHitInfo() ------------------------------------------------------- - - @Override //ACalorimeterData - //Gives the hit time for this cell - protected double getTime(int hit) - { - if (cellTime == null) return 0.0; - else return cellTime[hit]; - } - -// /** -// * Determines adc2Mev factor value for a cell. The number either comes -// * with the event file (adc2Mev subtag), but sometimes is not available -// * in Athena (in the database) which is indicated by -1 in the event file -// * for a particular cell. In this case, use predefined constant in this -// * method. -// * -// * zdenek (2008-09-15): -// * These predefined values (which are used if adc2Mev factor is -1) should -// * no longer be used. if the factor is not present, do not plot the pulse -// * shape, just the ADC counts as these values are non-sense. The method -// * and references to it should be removed after some time (if calo people -// * don't change their mind to pre-define some other values and use those) -// -// * @param index int -// * @return String -// */ - /* - private float getADC2MevFactorPredefined() - { - - float r = 13.9f; - return r; - - } // getADC2MevFactorPredefined() --------------------------------------- - */ - - - - /** - * readLookupTableFile() reads in comma separated values (CSV) file - * with HEC real pulse shapes plots time and amplitude lookup values - * @param fileName String - * @throws AAtlantisException - */ - private void readLookupTableFile() throws AAtlantisException - { - try - { - InputStream is = AUtilities.getFileAsStream(LOOKUP_TABLE_FILE); - CSVParser parser = new CSVParser(is); - parser.setCommentStart("#"); - String arrayName = null; - - while((arrayName = parser.nextValue()) != null) - { - String valueArray = parser.nextValue(); // shall now contain all values - CSVParser parserArray = new CSVParser(new StringReader(valueArray)); - String[][] s = parserArray.getAllValues(); - if("HEC_AMPLITUDE".equals(arrayName)) - { - ACalorimeterRPSPLT.HEC_AMPLITUDE = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - else if("HEC_TIME".equals(arrayName)) - { - ACalorimeterRPSPLT.HEC_TIME = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(FileNotFoundException e) - { - throw new AAtlantisException("could not find file: " + - LOOKUP_TABLE_FILE); - } - catch(IOException e) - { - throw new AAtlantisException("exception while reading file: " + - LOOKUP_TABLE_FILE); - } - catch(AAtlantisException e) - { - throw e; - } - - } // readLookupTableFile() ---------------------------------------------- - - - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsCalo", "HECET", "HECET", et); - cut("CutsCalo", "HECEnergy", "HECEnergy", energy); - - int cutSub = parameterStore.get("CutsCalo", "HEC").getI(); - if(cutSub != -1) - { - cutArray(side, cutSub, "Endcap"); - } - - } - - /** - * Returns the name of the parameter group. - * - * @return String parameter group - */ - public String getParameterGroup() - { - return "HEC"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getName() - { - return "HEC"; - } - - /** - * Returns the displayed name of datatype - * - * @return String screen name - */ - public String getNameScreenName() - { - return "HEC"; - } - - /** - * Returns the type of calorimeter (ECAL/HCAL) for a hit. - * - * @param index int hit index - * @return String calorimeter type - */ - public String getCalorimeterType(int index) - { - return "HCAL"; - } - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - ACoord[] data = ACoord.NO_HISTOGRAMS; - int mode = parameterStore.get("YX", "Mode").getI(); - if (projection instanceof AProjectionRZ) - data = getRZHistograms(); - else if (projection instanceof AProjectionFZ) - data = getFZHistograms(); - else if ((projection instanceof AProjectionYX) && (mode == AProjectionYX.MODE_HEC_1 || - mode == AProjectionYX.MODE_HEC_2 || mode == AProjectionYX.MODE_HEC_3 || - mode == AProjectionYX.MODE_HEC_4 || mode == AProjectionYX.MODE_HEC_SUMMED)) - data = getYXHistograms(); - return projection.nonLinearTransform(data); - } - - - -// /** -// * Call util class which plots cell pulse shapes provided that -// * all real pulse shapes data is available -// * Functions calculates values of real pulse shape calculated in the method -// * getPhysicsPulseShape(). -// * This method is called from pick interaction. -// * -// * @param index int -// */ - /*public void plotPulseShapes(int index) - { - - if(pulseShapesDataAvailable) - { - String title = getPulseTitleString(index); - - int[][] adcCountsLocal = new int[][] { adcCounts[index] }; - - if(super.checkADCCountsAvailability(adcCountsLocal)) - { - // adc counts are available - logger.debug(CALORIMETER_NAME + " adc counts (digits) are " + - "available for pulse shapes plots for this cell."); - } - else - { - AOutput.append("\nADC counts are not available for this cell, " + - "can't plot pulse shapes.", ALogPane.WARNING); - return; - } - - - float[] time = ACalorimeterRPSPLT.HEC_TIME; // lookup tables - float[] amplitude = ACalorimeterRPSPLT.HEC_AMPLITUDE; // lookup tables - - // step - starting from 1, need to get step numbers within - // number of ADC samples (adcCounts[0].length) - double step = (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try - { - if(factor != -1) - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - realPulse[0][i] = super.getPhysicsPulseShape(d, cellTime[index], - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogPane.WARNING); - return; - } - - if(factor != -1) - { - logger.debug("adc2Mev factor available, plotting full plot."); - APulseShapePlot.plotRealPulseShapes(adcCountsLocal, realPulse, - step, null, title); - } - else - { - logger.debug("adc2Mev factor not available, plotting just adc counts."); - APulseShapePlot.plotADCCounts(adcCountsLocal, title, null); - } - - } // if(pulseShapesDataAvailable) - else - { - return; - } - - }*/ // plotPulseShapes() -------------------------------------------------- - - @Override - protected int[][] getADCCounts(int index) { - - if (pulseShapesDataAvailable) { - return new int[][]{adcCounts[index]}; - } else { - return null; - } - } - - /** - * Calculate local time for pulse shape plots - */ - protected double getLocalTime(double xTime, double cellTime, int numSamplings) { - int nominalPeakSample = (int)(numSamplings / 2.); - return ((xTime - nominalPeakSample + 3) * 25.0) - cellTime; - } - - @Override - protected double[][] getPulseShape(int index) { - - float[] time = ACalorimeterRPSPLT.HEC_TIME; // lookup tables - float[] amplitude = ACalorimeterRPSPLT.HEC_AMPLITUDE; // lookup tables - - // step - starting from 1, need to get step numbers within - // number of ADC samples (adcCounts[0].length) - double step = getPulseStep(index); - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try { - if (factor != -1) { - for (int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) { - d += step; - double localTime = getLocalTime(d, cellTime[index], this.numSamplings); - realPulse[0][i] = super.getPhysicsPulseShape(localTime, - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } catch (AAtlantisException aaex) { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - return null; - } - - if (factor != -1) { - logger.debug("adc2Mev factor available, plotting full plot."); - return realPulse; - } else { - logger.debug("adc2Mev factor not available, plotting just adc counts."); - return null; - } - } - - @Override - protected double getPulseStep(int index) { - return (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHelix.java b/graphics/AtlantisJava/src/atlantis/data/AHelix.java deleted file mode 100644 index 98e397b2275e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHelix.java +++ /dev/null @@ -1,854 +0,0 @@ -package atlantis.data; - -import atlantis.globals.AGlobals; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionVP; -import atlantis.utils.A3Vector; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -/** - * Base class for tracks with perigee parameters. Includes code for drawing - * helices as a function of the helix angle alpha. - * - * @author Eric Jansen - */ -public class AHelix { - - private final static ALogger logger = ALogger.getLogger(AHelix.class); - - // Constants - public static final double MIN_RADIUS_PHI = 2.; - public static final double TRACKER_RADIUS = 108.; - public static final double TRACKER_LENGTH = 270.; - public static final double SOLENOID_RADIUS = 125.; - public static final double SOLENOID_LENGTH = 280.; - protected static final int NUM_HELIX_POINTS = 30; - - // Parameters from the config/GUI we need - private static double curvature = -1; - - // Vertex w.r.t. which we define the perigee parameters - private float xVtx, yVtx, zVtx; - - // Perigee parameters for the track - private float d0, phi0, z0, cotanTheta, pt; - - // Additional space points outside the solenoid (muon tracks) - private float extraX[] = null; - private float extraY[] = null; - private float extraZ[] = null; - - // Covariance matrix - private double[][] cov = null; - - // Center point, radius and correction factors for the helix - private double xC, yC, R, dr1, dr2, dz1; - - // Sign of alpha, determines direction of curvature of the helix - private float S; - - // Alpha value where the helix crosses MIN_RADIUS_PHI. This is the starting - // value for all the phi-based projections, since phi is undefined at rho=0. - private double alphaMin = 0.; - - // Alpha value at which the helix meets its last space point or where it - // exits the tracker if no space points were defined. - private double alphaMax = Math.PI; - - // Alpha value at which the helix leaves the solenoidal field. When helices - // are drawn beyond this value, for example when extrapolating to the - // calorimeters, they switch from a helix to a straight line here. - private double alphaSolenoid = Math.PI; - - private static final APar parameterStore = APar.instance(); - - AHelix(AOldHelix helix) { - this((float)helix.d0, (float)helix.z0, (float)helix.phi0, (float)helix.tL, (float)helix.pT); - } - - AHelix(float rhoVertex, float phiVertex, float zVertex, - float pTTrack, float phiTrack, float etaTrack, int charge, float rhoEndVertex) { - - this(rhoVertex, phiVertex, zVertex, pTTrack, phiTrack, etaTrack, charge); - this.alphaMax = getAlphaExtrapolated(rhoEndVertex, TRACKER_LENGTH); - } - - AHelix(float rhoVertex, float phiVertex, float zVertex, - float pTTrack, float phiTrack, float eta, int charge) { - - this(0.f, 0.f, phiTrack, (float)AMath.tanLambda(eta), charge*Math.abs(pTTrack), - (float)(rhoVertex*Math.cos(phiVertex)), (float)(rhoVertex*Math.sin(phiVertex)), zVertex); - } - - AHelix(float d0, float z0, float phi0, float tL, float pT, float[][] cov) { - this(d0, z0, phi0, tL, pT); - this.setCovariance(cov); - } - - AHelix(float d0, float z0, float phi0, float cotanTheta, float pt) { - this(d0, z0, phi0, cotanTheta, pt, 0.f, 0.f, 0.f); - } - - /** - * Construct a new track from its perigee parameters. - * @param d0 transverse impact parameter - * @param z0 longitudinal impact parameter - * @param phi0 phi of the point of closest approach in degrees - * @param cotanTheta cotan(theta), angle of the track in the RZ-plane - * @param pt signed transverse momentum, sign encodes charge - * @param xVtx vertex x-coordinate - * @param yVtx vertex y-coordinate - * @param zVtx vertex z-coordinate - */ - AHelix(float d0, float z0, float phi0, float cotanTheta, float pt, - float xVtx, float yVtx, float zVtx) { - - this.xVtx = xVtx; - this.yVtx = yVtx; - this.zVtx = zVtx; - this.d0 = d0; - this.z0 = z0; - this.phi0 = (float)Math.toRadians(phi0); - this.cotanTheta = cotanTheta; // cotan(theta) = tan(lambda) - this.pt = Math.abs(pt); - this.S = -Math.signum(pt); - this.dr1 = 0; - this.dr2 = 0; - this.dz1 = 0; - - // Curvature/pT relation, magnetic field strength. - if (AHelix.curvature <= 0) { - AParameter curvatureParameter = parameterStore.get("Event", "Curvature"); - if (curvatureParameter != null) { - AHelix.curvature = curvatureParameter.getD(); - } else { - AHelix.curvature = 100/0.6; - logger.error("Curvature parameter not found," - + " defaulting to " + AHelix.curvature); - } - } - - // Radius and center point of the helix. The radius is limited to 1e6, - // which on the scale of our tracker corresponds to a straight line. - // This allows cosmics without B-field to be drawn with the same code. - this.R = Math.min(AHelix.curvature * this.pt, 1e6); - this.xC = xVtx - (this.S*this.R + this.d0) * Math.sin(this.phi0); - this.yC = yVtx + (this.S*this.R + this.d0) * Math.cos(this.phi0); - - // The alpha value from which the helix start. - this.alphaMin = 0.; - - // Calculate when this helix leaves the tracker. This is either (1) - // through the barrel or (2) through the endcap. The endcap expression - // is just the function getZ(alpha) reversed. Take the minumum of the - // two, so whatever happens first. - this.alphaMax = getAlphaCylinder(TRACKER_RADIUS, TRACKER_LENGTH); - - // Same as above, but now for the solenoid. - this.alphaSolenoid = getAlphaCylinder(SOLENOID_RADIUS, SOLENOID_LENGTH); - } - - /** - * Fit the radius of the helix to the given points. The radius is described - * by R + dr1 * alpha + dr2 * alpha^2. - * @param x array of x coordinates of points on the helix - * @param y array of y coordinates of points on the helix - * @param z array of z coordinates of points on the helix - */ - public double setPoints(float[] x, float[] y, float[] z, int numPoints) { - - this.dr1 = 0.; - this.dr2 = 0.; - this.dz1 = 0.; - - // Points outside the solenoid are taken as is and added to the end of the track - while (numPoints > 0 && (z[numPoints-1] > SOLENOID_LENGTH - || Math.hypot(x[numPoints-1], y[numPoints-1]) > SOLENOID_RADIUS)) { - - numPoints--; - } - - if (x.length > numPoints) { - extraX = new float[x.length - numPoints]; - extraY = new float[y.length - numPoints]; - extraZ = new float[z.length - numPoints]; - - for(int i=0; i<x.length - numPoints; i++) { - extraX[i] = x[numPoints+i]; - extraY[i] = y[numPoints+i]; - extraZ[i] = z[numPoints+i]; - } - } - - if (numPoints == 1) { - - // Just one point, only do a linear in/decrease of R and Z - double alpha = getAlpha(x[0], y[0]); - this.dr1 = (getRadius(x[0], y[0]) - this.R) / alpha; - this.dz1 = (z[0] - getZ(alpha)) / alpha; - - // Draw helix until this point - this.alphaMax = alpha; - - } else { - - // Several points, perform a least-squares fit using the functions - // R = R + dr1 * alpha + dr2 * alpha^2 and Z = Z + dz1 * alpha. - double a2 = 0., a3 = 0., a4 = 0.; - double dRa = 0., dRa2 = 0., dZa = 0.; - for (int i=0; i<numPoints; i++) { - double alpha = getAlpha(x[i], y[i]); - double rho = getRadius(x[i], y[i]); - - //a1 += alpha; - a2 += Math.pow(alpha, 2.); - a3 += Math.pow(alpha, 3.); - a4 += Math.pow(alpha, 4.); - dRa += (rho - this.R) * alpha; - dRa2 += (rho - this.R) * alpha * alpha; - - dZa += (z[i] - getZ(alpha)) * alpha; - - if (i == 0 || alpha > this.alphaMax) { - this.alphaMax = alpha; - } - } - - // Quadratic - this.dr1 = (dRa / a3 - dRa2 / a4) / (a2 / a3 - a3 / a4); - this.dr2 = (dRa / a2 - dRa2 / a3) / (a3 / a2 - a4 / a3); - - // Linear - this.dz1 = dZa / a2; - - } - - // Return relative correction; distance from the original position at - // the end point, divided by the length of the curve. - double change = Math.hypot(this.dr1 + this.alphaMax*this.dr2, this.dz1) / this.R; - logger.debug("Fitting changed R(maxAlpha) by " + change); - return change; - } - - /** - * Sets the covariance matrix of the track. - * @param cov new covariance matrix - */ - public final void setCovariance(float[][] cov) { - - // Covariance needs to be double[][] for the fitting classes - this.cov = new double[cov.length][cov[0].length]; - - for (int i=0; i<cov.length; i++) { - for (int j=0; j<cov[i].length; j++) { - this.cov[i][j] = cov[i][j]; - } - } - } - - /** - * Sets the covariance matrix of the track. - * @param cov new covariance matrix - */ - public final void setCovariance(double[][] cov) { - this.cov = cov; - } - - /** - * Returns the starting alpha value for the phi-based projections. - * @return alpha value - */ - public double getAlphaMin() { - return alphaMin; - } - - /** - * Returns the alpha value at the end of the helix - * @return alpha value - */ - public double getAlphaMax() { - return alphaMax; - } - - /** - * Returns the alpha value at which the track exits the solenoidal field - * @return alpha value - */ - public double getAlphaSolenoid() { - return alphaSolenoid; - } - - /** - * Calculates the alpha coordinate for a specific point. Alpha is the angle - * from the center point of the helix to the point. For the helix The angle - * should be positive and alpha=0 is the perigee. Returns negative values - * for points before the perigee point. - * @param x x coordinate of a point - * @param y y coordinate of a point - * @return alpha - */ - public double getAlpha(double x, double y) { - // Get the alpha parameter for this point, in the range 0-2*pi - double alpha = AMath.nearestPhiRadians(this.S * (Math.atan2((y - this.yC), (x - this.xC)) - this.phi0) + Math.PI/2.); - - // When dealing with a real space point, alpha can of course be slightly negative - if (alpha > 3./2. * Math.PI) alpha -= 2.*Math.PI; - - return alpha; - } - - /** - * Calculates the alpha coordinate where the helix has the given distance - * from the origin. Alpha is the angle from the center point of the helix to - * the point. The angle is always positive and alpha=0 is the perigee. - * @param rho radius with respect to the origin - * @return alpha - */ - public final double getAlphaCylinder(double rho, double z) { - - double alphaZ, alphaRho; - if (this.cotanTheta == 0) { - alphaZ = Math.PI; - } else { - alphaZ = zVtx + (Math.signum(this.cotanTheta)*z - this.z0) / (this.cotanTheta * this.R + this.dz1); - } - - // We take a circle centered around (0,0) with the requested radius - // (rho) and intersect it with the helix (circle around (xC,yC) with - // radius R. The distance between the centers of the two circles is D. - double D = Math.hypot(this.xC, this.yC); - - // By equating the intersection points in both circles we obtain the - // position of the intersection points as a distance d from (xC,yC) - // along the line from center to center. - double d = (this.R * this.R - rho * rho + D * D) / (2 * D); - - if (d >= this.R) { - // Helix is fully outside the requested radius, return 0. - alphaRho = 0; - } else if (d <= -this.R) { - // Helix is fully inside the requested radius, return pi. - alphaRho = Math.PI; - } else { - // Helix needs to be stopped when it reaches requested radius. - // Now the angle alpha is just the angle between the center-center - // line and the line from (xC,yC) to the intersection point. The - // helix is such that alpha is always taken positive, so it doesn't - // matter which of the two intersection points we take. The cosine - // of alpha is then simply the division of d by the radius of the - // circle R. This method should never return an alpha outside the - // solenoid, for the extrapolation there is getAlphaExtrapolated(). - alphaRho = Math.min(Math.acos(d / this.R), alphaSolenoid); - } - - return Math.min(alphaRho, alphaZ); - } - - /** - * Calculates the pseudo alpha coordinate and if necessary extrapolates - * beyond the curved part up to the given radius. Inside the solenoid this - * method falls back to getAlphaCylinder, so it can be used for any radius. - * The pseudo alpha coordinate is such that the distance along the curve is - * R*alpha also for the straight part. This parameterization allow the - * description of z to remain the same for any alpha. - * @param rho radius to extrapolate to - * @param z distance along the beam axis to extrapolate to - * @return alpha - */ - public final double getAlphaExtrapolated(double rho, double z) { - - // Check if the track actually makes it to the solenoid. - if (this.alphaSolenoid >= Math.PI) { - // If not, return the max alpha inside the tracker instead. - return getAlphaCylinder(rho, z); - } - - // Calculate the coordinates (xL,yL) of the last point inside the solenoid. - double xL = getX(this.alphaSolenoid); - double yL = getY(this.alphaSolenoid); - - // Check if we are actually outside the solenoid at this rho value - if (rho < Math.hypot(xL, yL)) { - // If not, return the normal alpha instead. For tracks that exit the - // solenoid through the endcap this is also fine, z(alpha) is the - // same inside and outside the field. So the max value returned is - // valid either way. - return getAlphaCylinder(rho, z); - } - - double alphaZ, alphaRho; - if (this.cotanTheta == 0) { - alphaZ = Math.PI; - } else { - alphaZ = zVtx + (Math.signum(this.cotanTheta)*z - this.z0) / (this.cotanTheta * this.R + this.dz1); - } - - // Calculate the direction of the track at the last point inside the solenoid, - // this is the direction in which it will be extrapolated through the calorimeters. - double dx = Math.cos(this.phi0 + this.S * this.alphaSolenoid); - double dy = Math.sin(this.phi0 + this.S * this.alphaSolenoid); - - // Now we have for a point on the extrapolated track - // x(alpha) = xL + dx * (alpha-this.alphaCurve) - // y(alpha) = yL + dy * (alpha-this.alphaCurve) - // Setting x^2+y^2 = rho^2 and solving for alpha then gives: - double D = rho*rho - (xL*dy - yL*dx)*(xL*dy - yL*dx); - if (D > 0) { - alphaRho = this.alphaSolenoid - (xL*dx + yL*dy)/this.R + Math.sqrt(D)/this.R; - } else { - return Math.PI; - } - - return Math.min(alphaRho, alphaZ); - } - - /** - * Calculate the distance between a point and the center of the helix. - * @param x x coordinate of the point - * @param y y coordinate of the point - * @return distance between (x,y) and the center of the helix - */ - private double getRadius(double x, double y) { - return Math.hypot(x - xC, y - yC); - } - - /** - * Returns the x coordinate for a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @return x coordinate - */ - public double getX(double alpha) { - // Correct the radius using the values obtained from the fit and calculate x - double localR = R + dr1 * alpha + dr2 * alpha * alpha; - if (alpha <= alphaSolenoid) { - return xC - S * localR * Math.cos(phi0 + S * alpha + Math.PI/2.); - } else { - double xL = xC - S * localR * Math.cos(phi0 + S * alphaSolenoid + Math.PI/2.); - return xL + R*Math.cos(phi0 + this.S * alphaSolenoid) * (alpha-alphaSolenoid); - } - } - - /** - * Returns the y coordinate for a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @return y coordinate - */ - public double getY(double alpha) { - // Correct the radius using the values obtained from the fit and calculate y - double localR = R + dr1 * alpha + dr2 * alpha * alpha; - if (alpha <= alphaSolenoid) { - return yC - S * localR * Math.sin(phi0 + S * alpha + Math.PI/2.); - } else { - double yL = yC - this.S * localR * Math.sin(phi0 + this.S * alphaSolenoid + Math.PI/2.); - return yL + R*Math.sin(phi0 + S * alphaSolenoid) * (alpha-alphaSolenoid); - } - } - - /** - * Returns the rho coordinate for a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @return rho coordinate - */ - public double getRho(double alpha) { - return Math.hypot(getX(alpha), getY(alpha)); - } - - public double getRhoVtx() { - return Math.hypot(xVtx, yVtx); - } - - /** - * Returns the z coordinate for a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @return z coordinate - */ - public double getZ(double alpha) { - // For z we don't use the corrected R, since it was calculated against - // the uncorrected one. - return z0 + cotanTheta * R * alpha + dz1 * alpha; - } - - public double getZVtx() { - return zVtx; - } - - /** - * Returns the phi coordinate of a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @param useVertex calculate phi w.r.t. the primary vertex - * @return phi coordinate - */ - public double getPhi(double alpha, boolean useVertex) { - if (useVertex) { - return AParameterUtilities.phi(getX(alpha), getY(alpha)); - } else { - return Math.toDegrees(Math.atan2(getY(alpha), getX(alpha))); - } - } - - /** - * Return eta coordinate for a point on the helix parameterized by alpha. - * @param alpha helix angular parameter - * @param vsign side (-1/+1) of the split track in the v-plot, 0 for true eta - * @return eta coordinate - */ - public double getEta(double alpha, int vsign) { - double rho = getRho(alpha); - double z = getZ(alpha); - double deta = Math.abs(AProjectionVP.getDeltaEta(rho, z)); - - return AParameterUtilities.eta(z, rho) + vsign*deta; - } - - /** - * Returns an array representing the x coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @return x coordinates - */ - public double[] getX(double alpha1, double alpha2) { - int numPoints = NUM_HELIX_POINTS; - if (alpha2 >= alphaMax && extraX != null) { - numPoints += extraX.length; - } - double[] x = new double[numPoints]; - - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - for (int i=0; i<NUM_HELIX_POINTS; i++) { - x[i] = getX(alpha1 + i*dalpha); - } - - for (int i=0; i<numPoints-NUM_HELIX_POINTS; i++) { - x[NUM_HELIX_POINTS+i] = extraX[i]; - } - - return x; - } - - /** - * Returns an array representing the y coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @return y coordinates - */ - public double[] getY(double alpha1, double alpha2) { - int numPoints = NUM_HELIX_POINTS; - if (alpha2 >= alphaMax && extraY != null) { - numPoints += extraY.length; - } - double[] y = new double[numPoints]; - - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - for (int i=0; i<NUM_HELIX_POINTS; i++) { - y[i] = getY(alpha1 + i*dalpha); - } - - for (int i=0; i<numPoints-NUM_HELIX_POINTS; i++) { - y[NUM_HELIX_POINTS+i] = extraY[i]; - } - - return y; - } - - /** - * Returns an array representing the z coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @return z coordinates - */ - public double[] getZ(double alpha1, double alpha2) { - int numPoints = NUM_HELIX_POINTS; - if (alpha2 >= alphaMax && extraZ != null) { - numPoints += extraZ.length; - } - double[] z = new double[numPoints]; - - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - for (int i=0; i<NUM_HELIX_POINTS; i++) { - z[i] = getZ(alpha1 + i*dalpha); - } - - for (int i=0; i<numPoints-NUM_HELIX_POINTS; i++) { - z[NUM_HELIX_POINTS+i] = extraZ[i]; - } - return z; - } - - /** - * Returns an array representing the rho coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @param signed return signed rho values for use in RZ - * @return rho coordinates - */ - public double[] getRho(double alpha1, double alpha2, boolean signed) { - int numPoints = NUM_HELIX_POINTS; - if (alpha2 >= alphaMax && extraX != null && extraY != null) { - numPoints += extraX.length; - } - double[] rho = new double[numPoints]; - - double sign = 1.; - if (signed) { - AParameter phiPar = parameterStore.get("RZ", "Phi"); - if (phiPar != null) { - double phi = getPhi((alpha1+alpha2)/2, false); - double diff = Math.toRadians(Math.abs(phi - phiPar.getD())); - if (diff > Math.PI / 2. && diff <= 3 * Math.PI / 2.) { - sign = -1.; - } - } else { - logger.error("Could not read RZ cutting plane parameter"); - } - } - - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - for (int i=0; i<NUM_HELIX_POINTS; i++) { - rho[i] = sign * getRho(alpha1 + i*dalpha); - } - - for (int i=0; i<numPoints-NUM_HELIX_POINTS; i++) { - rho[NUM_HELIX_POINTS+i] = sign * Math.hypot(extraX[i], extraY[i]); - } - - return rho; - } - - /** - * Returns an array representing the phi coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @param vplot return all points twice for use in the v-plot - * @return phi coordinates - */ - public double[] getPhi(double alpha1, double alpha2, boolean vplot) { - int numPoints = NUM_HELIX_POINTS; - if (vplot) { - numPoints += NUM_HELIX_POINTS-1; - } else if (alpha2 >= alphaMax && extraX != null && extraY != null) { - numPoints += extraX.length; - } - double[] phi = new double[numPoints]; - - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - for (int i=0; i<NUM_HELIX_POINTS; i++) { - phi[i] = getPhi(alpha1 + i*dalpha, true); - if (vplot) phi[numPoints-i-1] = phi[i]; - } - - if (!vplot) { - for (int i=0; i<numPoints-NUM_HELIX_POINTS; i++) { - phi[NUM_HELIX_POINTS+i] = AParameterUtilities.phi(extraX[i], extraY[i]); - } - } - - // Minimise distance from one point to the next to avoid phi wrapping - // around: use {25, 10, -5} and not {25, 10, 355}. - for (int i=1; i<phi.length; i++) { - phi[i] = AMath.nearestPhiDegrees(phi[i], phi[i-1]); - } - - return phi; - } - - /** - * Returns an array representing the eta coordinates of the helix between - * alpha1 and alpha2. - * @param alpha1 start alpha - * @param alpha2 end alpha - * @return eta coordinates - */ - public double[] getEta(double alpha1, double alpha2) { - double[] eta = new double[2*NUM_HELIX_POINTS - 1]; - double dalpha = (alpha2 - alpha1) / (NUM_HELIX_POINTS-1); - - for (int i=0; i<NUM_HELIX_POINTS; i++) { - double alpha = alpha1 + i*dalpha; - eta[i] = getEta(alpha, -1); - eta[2*NUM_HELIX_POINTS-2-i] = getEta(alpha, +1); - } - - return eta; - } - - /** - * Track momentum at perigee, x component - * @return px - */ - public double pX() { - return this.pt * Math.cos(this.phi0); - } - - /** - * Track momentum at perigee, y component - * @return py - */ - public double pY() { - return this.pt * Math.sin(this.phi0); - } - - /** - * Track momentum at perigee, z component - * @return pz - */ - public double pZ() { - return this.pt * this.cotanTheta; - } - - /** - * Signed transverse momentum at perigee - * @return pt - */ - public double pT() { - return -this.S * this.pt; - } - - public A3Vector p() { - return new A3Vector(pX(), pY(), pZ()); - } - - /** - * Pseudorapidity of track from perigee - * @return eta - */ - public double eta() { - return -Math.log(Math.hypot(cotanTheta, 1.) - cotanTheta); - } - - /** - * Phi of perigee - * @return phi0 - */ - public double phi0() { - return (float)Math.toDegrees(phi0); - } - - /** - * Returns the parameters of this helix in the "old" format. This is still - * used by the AFit class to fit secondary vertices in Atlantis. - * @return helix parameters - */ - public double[] getPar() { // Used by unit tests and AVertexFit - return new double[] { - d0, - z0, - phi0 < 0 ? phi0 + 2*Math.PI : phi0, - cotanTheta, - -S/pt - }; - } - - /** - * Returns the covariance matrix of this helix as a an array of double. - * @return covariance matrix - */ - public double[][] getCovariance() { - return cov; - } - - public double getRhoEndVertex() { - return getRho(alphaMax); - } - - public void setPhiStartByXYPoint(double Vx, double Vy) { - alphaMin = this.getAlpha(Vx, Vy); - } - - public float d0() { - return d0; - } - - public float z0() { - return z0; - } - - public float cotanTheta() { - return cotanTheta; - } - - public double getXc() { - return xC; - } - - public double getYc() { - return yC; - } - - /** - * Helper method for toString, formats a single line of information. - * @param name variable name - * @param value variable value - * @param uncertainty variable uncertainty - * @param units variable units - * @return formatted string - */ - private String formatInfo(String name, double value, double uncertainty, String units) { - return formatInfo(name, String.format("%.3f", value), - uncertainty > 0 ? String.format("%.3f", uncertainty) : null, units); - } - - /** - * Helper method for toString, formats a single line of information. - * @param name variable name - * @param value variable value - * @param uncertainty variable uncertainty - * @param units variable units - * @return formatted string - */ - private String formatInfo(String name, String value, String uncertainty, String units) { - String output = "\n "; - output += name + " = " + value; - if (uncertainty != null) - output += " " + AMath.PLUSMINUS + " " + uncertainty; - if (units != null) - output += " " + units; - - return output; - } - - @Override - public String toString() { - String output = ""; - - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if (simpleOutput > 0) { - if (simpleOutput == 1 || simpleOutput == 3) { - output += formatInfo("PT", pt, 0., "GeV"); - output += formatInfo(AMath.ETA, eta(), 0., null); - output += formatInfo(AMath.PHI, phi0(), 0., AMath.DEGREES); - } - if (simpleOutput == 2 || simpleOutput == 3) { - output += formatInfo("Px", pt*Math.cos(phi0), 0., "GeV"); - output += formatInfo("Py", pt*Math.sin(phi0), 0., "GeV"); - output += formatInfo("Pz", pt*Math.sinh(eta()), 0., "GeV"); - output += formatInfo("Charge", S < 0 ? "+1" : "-1", null, null); - } - - return output; - - } else { - - output += formatInfo("d0", d0, cov != null ? Math.sqrt(cov[0][0]) : 0., "cm"); - output += formatInfo("z0", z0, cov != null ? Math.sqrt(cov[1][1]) : 0., "cm"); - - double pv[] = AParameterUtilities.getPrimaryVertex(); - output += formatInfo("|z0-zVtx|", Math.abs(z0-pv[2]), 0., "cm"); - output += formatInfo("phi0", phi0(), cov != null ? Math.toDegrees(Math.sqrt(cov[2][2])) : 0., AMath.DEGREES); - output += formatInfo(" ", phi0, cov != null ? Math.sqrt(cov[2][2]) : 0., "rad"); - output += formatInfo("cotan(theta)", cotanTheta, cov != null ? Math.sqrt(cov[3][3]) : 0., null); - output += formatInfo(AMath.ETA, eta(), cov != null ? Math.sqrt(cov[3][3] / (cotanTheta * cotanTheta + 1.0)) : 0., null); - output += formatInfo("pT", pT(), 0., "GeV"); - output += formatInfo("p", AMath.getPFromPttL(pt, cotanTheta), 0., "GeV"); - - return output; - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHelixAODData.java b/graphics/AtlantisJava/src/atlantis/data/AHelixAODData.java deleted file mode 100755 index 0c3934033e96..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHelixAODData.java +++ /dev/null @@ -1,178 +0,0 @@ -package atlantis.data; - -import atlantis.canvas.AWindow; -import atlantis.event.AEvent; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -public abstract class AHelixAODData extends AAODData -{ - protected AHelix[] h = null; - - AHelixAODData(AHashMap p, AEvent e) - { - super(p,e); - h = new AHelix[numData]; - float[] d0 = new float[numData]; - float[] z0 = new float[numData]; - float[] tl = new float[numData]; - for (int i = 0; i < numData; i++) - { - d0[i] = 0.0f; - z0[i] = 0.0f; - tl[i] = (float) AMath.tanLambda((double)eta[i]); - h[i] = new AHelix(d0[i], z0[i], (float) Math.toDegrees(phi[i]), tl[i], pT[i]); - } - } - - private void drawHelix(AWindow window, AGraphics ag, AProjection2D projection) - { - int drawnAs = parameterStore.get("InDetTrack", "DrawnAs").getI(); - if (drawnAs == ATrackData.DRAW_NEWHELIX) { - - boolean showS3D = parameterStore.get("Data", "S3D").getStatus(); - AParameter shortV = parameterStore.get("VP", "ShortV"); - - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - double alphaMin = h[j].getAlphaExtrapolated(projection.getMinRho(), AHelix.TRACKER_LENGTH); - double alphaMax = h[j].getAlphaExtrapolated(AProjectionVP.getRhoVPlot(), AHelix.TRACKER_LENGTH); - if (shortV.getStatus() && !showS3D) { - alphaMin = alphaMax - shortV.getD() * (alphaMax - alphaMin); - } - - hv[0][i] = h[j].getEta(alphaMin, alphaMax); - hv[1][i] = h[j].getPhi(alphaMin, alphaMax, true); - } - - ag.draw(window.calculateDisplay(new ACoord(hv, index, this, ACoord.POLYLINES))); - - } else { - // borrow the implementation in for tracks - // phi wrap around is done in user coordinates, so we convert to user coordinates, - // do the phi wrap around and convert back to display coordinates - ag.draw(window.calculateDisplay(window.calculateUser( - getVPDisplayHelices(window, projection)).includePhiWrapAround(projection.getName()) - )); - } - } - - // give back Drawable helices - private ADHelix[] getHelices() - { - makeDrawList(); - ADHelix[] tempList = new ADHelix[numDraw]; - - for (int i = 0; i < numDraw; i++) - if (h != null && h[listdl[i]] != null) - { - tempList[i] = new ADHelix(h[listdl[i]]); - if (tempList[i].getAStart() == tempList[i].getAEnd()) - { - tempList[i] = null; - } - } - else - tempList[i] = null; - return tempList; - } - - private ACoord getVPDisplayHelices(AWindow window, AProjection2D projection) - { - boolean drawApex = parameterStore.get("VP", "DrawApex").getStatus(); - ADHelix[] dhelix = getHelices(); - int size = 2 * dhelix.length; - if (drawApex) - size = 3 * dhelix.length; - double[][][] hv = new double[2][size][0]; - int[] index = new int[size]; - int[] indexIn = getDrawList(); - int num = 0; - - for (int j = 0; j < dhelix.length; ++j) - if (dhelix[j] != null) - { - double s1 = dhelix[j].getAStart(); - double s2 = 179.; - - s1 = dhelix[j].intersectWithRadialCylinder(projection.getMinRho(), s1, s2); - double sEnd = dhelix[j].intersectWithCylinder(true, AProjectionVP.getRhoVPlot(), true, AProjectionVP.getZVPlot()); - - s2 = Math.max(Math.min(s2, sEnd), s1); - // if the whole helix is to be drawn (which are unusual - // helices, shorten it a little to avoid wraparound problems - if (s1 == 0. && s2 == 180.) - s2 = 179.; - if (parameterStore.get("VP", "ShortV").getStatus() && !parameterStore.get("Data", "S3D").getStatus()) - s1 = s2 - parameterStore.get("VP", "ShortV").getD() * (s2 - s1); - if (s2 > s1) - { - int signMin = -1; - int signMax = 1; - double h = 0; - double v = 0; - for (int sign = signMin; sign <= signMax; sign += 2) - { - // ugly must change structure at some point - AProjectionVP.sign = sign; - ACoord pointsOnHelix = dhelix[j].drawHelix(window, projection, s1, s2); - hv[0][num] = pointsOnHelix.hv[0][0]; - hv[1][num] = pointsOnHelix.hv[1][0]; - index[num] = indexIn[j]; - h = hv[0][num][hv[0][num].length - 1]; - v = hv[1][num][hv[0][num].length - 1]; - num++; - } - if (drawApex) - { - int a = 3; - int b = 7; - hv[0][num] = new double[] { h - a, h + a, h, h, h - a, h + a }; - hv[1][num] = new double[] { v - b, v - b, v - b, v + b, v + b, v + b }; - index[num] = indexIn[j]; - num++; - } - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP) - { - // since no d0 and z0 data is provided for AOD Electron and Muon - // from event file, they are set to 0 manually, which is not - // compatible with the primary vertex calculated in Atlantis, and - // it will cause a wide and bizarre shape of 'v' drawn in V-Plot. - // So the temparary solution is to set primary vertex to (0,0,0) - // before drawing AOD Electron and Muon in V-Plot, and then restore - // their values after. - double[] primaryVtx=event.getPrimaryVertex(); - parameterStore.get("Event", "XVtx").setD(0.0); - parameterStore.get("Event", "YVtx").setD(0.0); - parameterStore.get("Event", "ZVtx").setD(0.0); - // super.draw(window, ag, projection); - drawHelix(window, ag, projection); - parameterStore.get("Event", "XVtx").setD(primaryVtx[0]); - parameterStore.get("Event", "YVtx").setD(primaryVtx[1]); - parameterStore.get("Event", "ZVtx").setD(primaryVtx[2]); - } - else - { - super.draw(window, ag, projection); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHistogram.java b/graphics/AtlantisJava/src/atlantis/data/AHistogram.java deleted file mode 100755 index 082b97de978d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHistogram.java +++ /dev/null @@ -1,422 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.graphics.ACoord; -import atlantis.utils.AHashMap; -import atlantis.utils.ALogger; -import atlantis.utils.AVector; - -/** - * Used to create, fill, and draw the calorimeter histograms. - */ -public class AHistogram extends AData -{ - private static ALogger logger = ALogger.getLogger(AHistogram.class); - - public static final int UP = 0; - public static final int DOWN = 1; - - public static final int HORIZONTAL = 0; - public static final int VERTICAL = 1; - - public final static int RIGHT = 0; - public final static int LEFT = 1; - - private float leftLimit; - private float rightLimit; - private float gran; - private float granSafety; - private float[] towers; - - private double eta0, z, r; - private double factor; - private AData detector; - - - AHistogram(double leftLimit, double rightLimit, double gran, double factor, AData detector) - { - super(new AHashMap(1).put("numData", 0),detector.getEvent()); - - this.leftLimit = (float) leftLimit; - this.rightLimit = (float) rightLimit; - this.gran = (float) gran; - this.factor = factor; - this.detector = detector; - granSafety = (float) (this.gran * 0.1); - towers = new float[(int) Math.abs(Math.round((rightLimit - leftLimit) / gran))]; - numData = towers.length; - } - - public float getGranularity() - { - return gran; - } - - public int getTowersCount() - { - return towers.length; - } - - public float[] getTowers() - { - return towers; - } - - public void fill(double v1, double v2, double q) - { - int t1 = (int) ((v1 + granSafety - leftLimit) / gran); - int t2 = (int) ((v2 - granSafety - leftLimit) / gran); - int i = -999; - - if (Math.min(t1, t2) < 0 || Math.max(t1, t2) >= towers.length) - { - logger.error("Histogram binning problem " + t1 + " " + t2 + " " + towers.length + " " + v1 + " " + v2); - return; - } - - if (t1 == t2) - towers[t1] += q; - else - for (i = t1; i <= t2; i++) - towers[i] += q / (t2 - t1 + 1); - } - - public void setGranularity(double newGran) - { - AHistogram newHist = new AHistogram(leftLimit, rightLimit, newGran, factor, detector); - - for (int i = 0; i < towers.length; i++) - newHist.fill(leftLimit + i * gran, leftLimit + (i + 1) * gran, towers[i]); - gran = (float) newGran; - towers = newHist.towers; - } - - public void add(AHistogram h) - { - float min = Math.min(leftLimit, h.leftLimit); - float max = Math.max(rightLimit, h.rightLimit); - - AHistogram sum = new AHistogram(min, max, gran, factor, detector); - - // first I add this histogram - for (int i = 0; i < towers.length; i++) - sum.fill(leftLimit + i * gran, leftLimit + (i + 1) * gran, towers[i]); - - // and the "h" histogram - for (int i = 0; i < h.towers.length; i++) - sum.fill(h.leftLimit + i * h.gran, h.leftLimit + (i + 1) * h.gran, h.towers[i]); - - // copy the sum histogram parameters into old ones - towers = sum.towers; - leftLimit = min; - rightLimit = max; - } - - public AHistogram getRegion(double v1, double v2) - { - AHistogram hRegion = new AHistogram(v1, v2, gran, factor, detector); - - int n1 = (int) Math.round((v1 - leftLimit) / gran); - int n2 = (int) Math.round((v2 - leftLimit) / gran); - - for (int i = n1; i < n2; i++) - hRegion.fill(v1 + (i - n1) * gran, v1 + (i - n1 + 1) * gran, towers[i]); - - return hRegion; - } - - private int getCode() - { - int c1, c2; - - if (leftLimit < -eta0) - c1 = 1; - else if (leftLimit > +eta0) - c1 = 3; - else - c1 = 2; - - if (rightLimit < -eta0) - c2 = 1; - else if (rightLimit > +eta0) - c2 = 3; - else - c2 = 2; - - return c1 * c2; - } - - public ACoord[] getRZUser(double z1, double r1, int upORdown) - { - this.z = z1; - this.r = r1; - double expEta0, k = z / r; - int N; - - eta0 = Math.abs(Math.log(k + Math.sqrt(k * k + 1))); - - switch (getCode()) - { - case 1: - return new ACoord[] { getRZVerticalUser(z, upORdown) }; - - case 4: - return new ACoord[] { getRZHorizontalUser(r, upORdown) }; - - case 9: - return new ACoord[] { getRZVerticalUser(z, upORdown) }; - - case 2: - N = (int) Math.abs(Math.round((eta0 - leftLimit) / gran)); - eta0 = leftLimit + N * gran; - expEta0 = Math.exp(eta0); - this.r = 2 * this.z / (expEta0 - 1 / expEta0); - - return new ACoord[] { getRegion(leftLimit, -eta0).getRZVerticalUser(z, upORdown), getRegion(-eta0, rightLimit).getRZHorizontalUser(r, upORdown) }; - - case 6: - N = (int) Math.abs(Math.round((eta0 - leftLimit) / gran)); - eta0 = leftLimit + N * gran; - expEta0 = Math.exp(eta0); - this.r = 2 * this.z / (expEta0 - 1 / expEta0); - - return new ACoord[] { getRegion(leftLimit, +eta0).getRZHorizontalUser(r, upORdown), getRegion(+eta0, rightLimit).getRZVerticalUser(z, upORdown) }; - - case 3: - // FIXME -- round() replaced by floor() here to make sure - // histograms do not end up inside the calorimeter outline. - // They should be right at the edge regardless of the binning - // though. This should be changed. -- EJ - N = (int) Math.abs(Math.floor((eta0 - leftLimit) / gran)); - eta0 = leftLimit + N * gran; - expEta0 = Math.exp(eta0); - this.r = 2 * this.z / (expEta0 - 1 / expEta0); - - return new ACoord[] { getRegion(leftLimit, -eta0).getRZVerticalUser(z, upORdown), getRegion(-eta0, +eta0).getRZHorizontalUser(r, upORdown), getRegion(+eta0, rightLimit).getRZVerticalUser(z, upORdown) }; - - default: - return null; - } - } - - public ACoord getRZHorizontalUser(double r, int place) - { - double[][][] hv = new double[2][towers.length][4]; - int[] index = new int[towers.length]; - double eta, exp1, exp2, zSign, rSign; - - for (int i = 0; i < towers.length; i++) - { - exp1 = Math.exp(leftLimit + i * gran); - exp2 = Math.exp(leftLimit + (i + 1) * gran); - rSign = (int) Math.pow(-1, place); - - eta = leftLimit + (i + 0.5) * gran; - if (eta != 0) - zSign = eta / Math.abs(eta); - else - zSign = 1; - - hv[0][i][0] = zSign * Math.abs(r * (exp1 - 1 / exp1) / 2); - hv[1][i][0] = rSign * r; - - hv[0][i][1] = zSign * Math.abs(r * (exp2 - 1 / exp2) / 2); - hv[1][i][1] = rSign * r; - - hv[0][i][2] = 0; - hv[1][i][2] = 0; - - index[i] = i; - } - - ACoord c = new ACoord(hv, index); - - c.source = this; - return c; - } - - public ACoord getRZVerticalUser(double z, int place) - { - double[][][] hv = new double[2][towers.length][4]; - int[] index = new int[towers.length]; - double exp1, exp2, zSign, rSign; - - for (int i = 0; i < towers.length; i++) - { - exp1 = Math.exp(leftLimit + i * gran); - exp2 = Math.exp(leftLimit + (i + 1) * gran); - rSign = (int) Math.pow(-1, place); - - if ((leftLimit > 0) && (rightLimit > 0)) - zSign = +1; - else - zSign = -1; - - hv[0][i][0] = zSign * z; - hv[1][i][0] = rSign * Math.abs(2 * z / (exp2 - 1 / exp2)); - - hv[0][i][1] = zSign * z; - hv[1][i][1] = rSign * Math.abs(2 * z / (exp1 - 1 / exp1)); - - hv[0][i][2] = 0; - hv[1][i][2] = 0; - - index[i] = i; - } - - ACoord c = new ACoord(hv, index); - - c.source = this; - return c; - } - - protected ACoord getYXUser(double r) - { - int n = towers.length; - double[][][] hv = new double[2][n][4]; - int[] index = new int[n]; - - for (int i = 0; i < n; i++) - { - double phi1 = leftLimit + i * gran; - double phi2 = leftLimit + (i + 1) * gran; - - // first point - hv[0][i][0] = r * Math.cos(phi1); - hv[1][i][0] = r * Math.sin(phi1); - - // second point - hv[1][i][1] = r * Math.sin(phi2); - hv[0][i][1] = r * Math.cos(phi2); - - // third point (the center) - hv[0][i][2] = 0; - hv[1][i][2] = 0; - - index[i] = i; - } - - ACoord c = new ACoord(hv, index); - - c.source = this; - return c; - } - - public ACoord completeTowers(ACoord c) - { - AVector u = new AVector(0, 0); - - for (int i = 0; i < c.hv[0].length; i++) - { - double x0 = (c.hv[0][i][0] + c.hv[0][i][1]) / 2; - double y0 = (c.hv[1][i][0] + c.hv[1][i][1]) / 2; - double f = factor * towers[c.index[i]]; - - u.set(x0 - c.hv[0][i][2], y0 - c.hv[1][i][2]).makeUnitary().scale(f); - - c.hv[0][i][2] = c.hv[0][i][1] + u.dx; - c.hv[1][i][2] = c.hv[1][i][1] + u.dy; - - c.hv[0][i][3] = c.hv[0][i][0] + u.dx; - c.hv[1][i][3] = c.hv[1][i][0] + u.dy; - } - - return c; - } - - protected ACoord getFRUser(double r) - { - int n = towers.length; - double[][][] hv = new double[2][n][4]; - int[] index = new int[n]; - - for (int i = 0; i < n; i++) - { - hv[0][i][0] = r; - hv[1][i][0] = Math.toDegrees(leftLimit + i * gran); - - hv[0][i][1] = r; - hv[1][i][1] = Math.toDegrees(leftLimit + (i + 1) * gran); - - hv[0][i][2] = 0; - hv[1][i][2] = Math.toDegrees(leftLimit + (i + 0.5) * gran); - - index[i] = i; - } - - ACoord c = new ACoord(hv, index); - - c.source = this; - return c; - } - - protected ACoord getFZUser(double z, int alignment) - { - int n = towers.length; - double[][][] hv = new double[2][n][4]; - int[] index = new int[n]; - - double zSign = Math.pow(-1, alignment); - - for (int i = 0; i < n; i++) - { - hv[0][i][0] = zSign * z; - hv[1][i][0] = Math.toDegrees(leftLimit + i * gran); - - hv[0][i][1] = zSign * z; - hv[1][i][1] = Math.toDegrees(leftLimit + (i + 1) * gran); - - hv[0][i][2] = 0; - hv[1][i][2] = Math.toDegrees(leftLimit + (i + 0.5) * gran); - - index[i] = i; - } - - ACoord c = new ACoord(hv, index); - - c.source = this; - return c; - } - - // implementation of AData - public String getParameterGroup() - { - return null; - } - - public String getName() - { - return null; - } - - public String getNameScreenName() - { - return detector.getParameterGroup() + " Histogram Tower"; - } - - protected int internalColor() - { - return 0; - } - - protected void applyCuts() - {} - - public String getHitInfo(int index) - { - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (index: " + index + ")"); - msg.append("\n ET = "); - msg.append(String.format("%.2f",towers[index])); - msg.append(" GeV"); - - return msg.toString(); - } - - public int getIdFromIndex(int index) - { - // Histograms have only an internal ID, override this method here to avoid problems - return index; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHistogramData.java b/graphics/AtlantisJava/src/atlantis/data/AHistogramData.java deleted file mode 100644 index c216d4582667..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHistogramData.java +++ /dev/null @@ -1,15 +0,0 @@ -package atlantis.data; - - -import atlantis.graphics.ACoord; - - -public interface AHistogramData { - ACoord[] getYXHistograms(); - ACoord[] getRZHistograms(); - ACoord[] getFRHistograms(); - ACoord[] getFZHistograms(); - ACoord[] getXZHistograms(); - ACoord[] getYZHistograms(); - ACoord[] getVPHistograms(); -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AHitData.java b/graphics/AtlantisJava/src/atlantis/data/AHitData.java deleted file mode 100644 index b27c824660af..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AHitData.java +++ /dev/null @@ -1,487 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.colormap.AColorMap; -import atlantis.list.AListManager; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.utils.AHashMap; -import java.util.Vector; -import atlantis.utils.ALogger; - -public abstract class AHitData extends AData -{ - private static ALogger logger = ALogger.getLogger(AHitData.class); - - protected byte[] type; - // sub should be removed at some point - protected int[] sub; - // linked list - protected int[] ll; - protected int[] llStart; - protected int[] llNum; - - // for "new Truth" (2006-08-08) implementation of barcode management - // (association to truth tracks) - protected int[] barcode = null; // old style barcode - protected int[] barcodes = null; // new style barcodes - protected int[] numBarcodes = null; // new style numBarcodes - - @Override - public final int getNumTypes(){ - return 2; - } - - private static final int NOISE = 0; - private static final int GOOD = 1; - - - - AHitData(AHashMap p, AEvent e) - { - super(p,e); - - sub = p.getUnknownIntArray("sub"); - type = new byte[numData]; - ll = new int[numData]; - llStart = new int[getNumTypes()]; - llNum = new int[getNumTypes()]; - - AAssociation assoc = null; - if (p.get("barcode") != null) - { - // old style truth (1-to-1 barcode association) - barcode = p.getUnknownIntArray("barcode"); - - assoc = new AAssociation(getFullName(), "STr", null, barcode, event); - event.getAssociationManager().add(assoc); - } - else if(p.get("barcodes") != null && p.get("numBarcodes") != null) - { - // new style truth (1-to-n barcodes, numBarcodes association) - barcodes = p.getUnknownIntArray("barcodes"); - numBarcodes = p.getUnknownIntArray("numBarcodes"); - - // getFullName() should return hit datatype name + storegate key - assoc = new AAssociation(getFullName(), "STr", numBarcodes, barcodes,event); - event.getAssociationManager().add(assoc); - } - - } // AHitData() --------------------------------------------------------- - - - - public String getHitInfo(int index) - { - StringBuilder r = new StringBuilder(); - if(this.barcode != null) - { - // old style truth association - 1 barcode associated with a hit - r.append("\n barcode = " + barcode[index]); - } - else if(this.barcodes != null && this.numBarcodes != null) - { - // new style truth association - N barcodes associated with a hit - - int[][] barcodes = event.getAssociationManager().get(getFullName(), "STr"); - if(barcodes[index] != null) - { - r.append("\n barcode(s) = "); - for(int i = 0; i < barcodes[index].length; i++) - { - r.append(barcodes[index][i] + " "); - } - } - else - { - r.append("\n no STr associated"); - } - } - - return r.toString(); - - } // getHitInfo() ------------------------------------------------------- - - - - /** - * Calculates actual association via - SiCluster for the datatype - * (SpacePoint (S3D) and TrigSpacePoint) to InDetTrack* (inner detector - * reconstructed track collection) - * @param to String - * @param via String - * @return int[][] - */ - private int[][] calculateAssociation(String to, String via) - { - String infoMsg = " association from: " + this.getName() + " to: " + - to + " via: " + via; - - logger.debug("AData.calculateAssociation()\n" + infoMsg); - - int[][] clusters = event.getAssociationManager().get(getFullName(), via); - int[][] recon = event.getAssociationManager().get(via, to); - AData source = event.get(via); - if(clusters == null || recon == null || source == null) - { - return null; - } - - int[][] ass = new int[numData][]; - - // iterate over all data items of this datatype - for(int i = 0; i < numData; ++i) - { - if(clusters[i] != null && clusters[i].length == 2) - { - // this is a SCT hit which has two clusters - int index1 = source.getIndexFromId(clusters[i][0]); - int index2 = source.getIndexFromId(clusters[i][1]); - if(index1 != -1 && index2 != -1 && - recon[index1] != null && recon[index2] != null) - { - int[] temp = new int[recon[index1].length]; - int matches = 0; - for(int k = 0; k < recon[index1].length; ++k) - { - for(int j = 0; j < recon[index2].length; ++j) - { - if(recon[index1][k] == recon[index2][j]) - { - // IndexOutOfBound protection - if(matches < recon[index1].length) - { - temp[matches] = recon[index1][k]; - matches++; - } - else - { - logger.warn("Association problem:\n" + infoMsg); - } - } - } - } - if(matches == 0) - { - ass[i] = null; - } - else if(matches == temp.length) - { - ass[i] = temp; - } - else - { - int[] dest = new int[matches]; - System.arraycopy(temp, 0, dest, 0, matches); - ass[i] = dest; - } - } - } - else if(clusters[i] != null && clusters[i].length == 1) - { - // this is pixel hit which has one cluster only (second number was - // -1 and was ignored in the datatypes (S3D, TrigS3D) constuctor - - // although this method calculates association via SiCluster - // there are no SiClusters for Pixel and this is a Pixel hit - // -> need to calculate the SpacePoint - Track association directly - // based on Track:hits (which has got id of non-existing SiCluster - // hits) and SpacePoint:cluster which also has Pixel cluster - // references (more see email on 2007-09-20 association problems ...) - // can't use above block as source (SiCluster) doesn't exists, there - // are no SiCluster in Pixel, thus source.getIndexFromId(clusters[i][0]) - // can't work ... - - // AAssociationManager.get(via, to); would return recalculated - // inverted association containing indices. - - // this returns the direct array saved in InDetTrackData() constructor - // AAssociationManager.add(new AAssociation(assocKey, "SiCluster", numHits, hits)); - int[][] directRecon = event.getAssociationManager().getAssociation(to, via).getData(); - - for(int x = 0; x < directRecon.length; x++) - { - if(directRecon[x] != null) - { - for(int y = 0; y < directRecon[x].length; y++) - { - // if the SpacePoint cluster ID is the same as id in - // Track:hits, then it's an associated hit - if(clusters[i][0] == directRecon[x][y]) - { - if(ass[i] == null) - { - // current association, x is associated track index - ass[i] = new int[] { x }; - } - else - { - // some tracks before were already associated - // copy the array and add current track index - int[] temp = new int[ass[i].length + 1]; - System.arraycopy(ass[i], 0, temp, 0, ass[i].length); - temp[ass[i].length] = x; // current association - ass[i] = new int[temp.length]; - System.arraycopy(temp, 0, ass[i], 0, temp.length); - } - - } - } // for(int y = 0; y < directRecon[x].length; y++) - } - } // loop over x (x is all track indices) - } // else - pixel cluster found - - } // for(int i = 0; i < numData; ++i) - loop over all current datatype items - - return ass; - - } // calculateAssociation() --------------------------------------------- - - - - /* - * This method uses clusters array (association with SiCluster) which - * is accessed in calculateAssociation() and creates - * TrigS3D - Track association and S3D - Track association (via SiCluster) - */ - protected void calculateAssociationViaClusters() - { - Vector<String> keys = event.getCollections().get("InDetTrack"); - int[][] recon = null; - int[][] recon2 = null; - AAssociation assoc = null; - String[] trackCollec = null; - - if(keys != null) - { - trackCollec = (String[]) keys.toArray(new String[keys.size()]); - for(int j = 0; j < trackCollec.length; j++) - { - String trackCollecFull = "InDetTrack" + trackCollec[j]; - recon = event.getAssociationManager().get(getFullName(), trackCollecFull); - recon2 = calculateAssociation(trackCollecFull, "SiCluster"); - if(recon != null && recon2 != null) - { - for(int i = 0; i< numData; i++) - { - if(recon2[i] != null) - { - // using array reference here - association array is corrected - recon[i] = recon2[i]; - } - } - assoc = event.getAssociationManager().getAssociation(getName(), trackCollecFull); - event.getAssociationManager().add(assoc.invert()); - } - } - } - - } // calculateAssociationViaClusters() --------------------------------- - - - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if (colorFunction == 0) - { - colorByConstant(); - } - else if (colorFunction == 1) - { - colorBy("STr"); - } - else if (colorFunction == 2) - { - colorBy(getReconstructedTracks()); - } - else if (colorFunction == 3) - { - colorBy(sub); - } - - return 3; - - } // internalColor() ---------------------------------------------------- - - - - protected String getSegments() - { - AEnumeratorParameter key = (AEnumeratorParameter) parameterStore.get("InDetSegment", "InDetSegmentCollections"); - - return "InDetSegment" + key.getCurrentText(); - } - - - - public void constructDefaultDrawlist() - { - // make seperate lists of noise and good hits - makeNoiseList(0, 0); - - if (!parameterStore.get("CutsATLAS", "ByList").getStatus()) - { - // put noise and/or good hits in drawlist according to HitType - // parameter - // if both are drawn noise is drawn first - makeDrawList(parameterStore.get("CutsInDet", "HitType").getI()); - - // if some hits are on a list they must be drawn last - int[][] temp = AListManager.getInstance().getColorMapping(this); - int[] index = temp[0]; - int[] ctemp = temp[1]; - if (index.length > 0) - { - int[] c = new int[numData]; - final int NONE = -999; - // color is not used at this time - for (int i = 0; i < c.length; ++i) - c[i] = NONE; - - for (int i = 0; i < index.length; ++i) - c[index[i]] = ctemp[i]; - - int[] newListdl = new int[numData]; - int num = 0; - for (int t = 0; t < getNumTypes(); t++) - { - for (int i = 0; i < numDraw; ++i) - if (t == type[listdl[i]] && c[listdl[i]] == NONE) - newListdl[num++] = listdl[i]; - for (int i = 0; i < numDraw; ++i) - if (t == type[listdl[i]] && c[listdl[i]] != NONE && c[listdl[i]] != AColorMap.INVISIBLE) - newListdl[num++] = listdl[i]; - } - listdl = newListdl; - numDraw = num; - } - } - else - { - boolean[] selected = AListManager.getInstance().getSelection(this); - numDraw = 0; - for (int t = 0; t < getNumTypes(); t++) - for (int i = 0; i < numData; ++i) - if (t == type[i] && selected[i]) - listdl[numDraw++] = i; - } - } - - - /** - * define noise and good hits type = 0 means noise - * noise hits - hits associated neither with Track not STr - * good hits - hits associated either with Track or with STr - */ - protected void setType() - { - int[][] assocSTr = event.getAssociationManager().get(getFullName(), "STr"); - int[][] assocRTr = event.getAssociationManager().get(getName(), getReconstructedTracks()); - - for (int i = 0; i < numData; i++) - { - if((assocSTr != null && assocSTr[i] != null) || - (assocRTr != null && assocRTr[i] != null)) - { - type[i] = 1; - } - else - { - type[i] = 0; - } - } - - } // setType() ---------------------------------------------------------- - - - - protected void makeNoiseList(int a, int b) - { - setType(); - - for (int i = 0; i < getNumTypes(); i++) - { - llStart[i] = -1; - llNum[i] = 0; - } - - for (int i = numData - 1; i >= 0; i--) - { - ll[i] = llStart[type[i]]; - llStart[type[i]] = i; - llNum[type[i]]++; - } - } - - private void makeDrawList(int hitType) - { - int start, end; - - numDraw = 0; - if (hitType == 0) - { - start = end = NOISE; - } - else if (hitType == 1) - { - start = end = GOOD; - } - else - { - start = NOISE; - end = GOOD; - } - - for (int i = start; i <= end; i++) - { - int n = llStart[i]; - - for (int j = 0; j < llNum[i]; j++) - { - listdl[numDraw++] = n; - n = ll[n]; - } - } - } - - - - public int[] getType(int[] dl) - { - int[] temp = new int[dl.length]; - - for (int i = 0; i < temp.length; i++) - temp[i] = type[dl[i]]; - return temp; - } - - - - /** - * cut hits if connected/unconnected to simulated tracks - */ - protected void cutSimulatedTracks() - { - int cutOption = parameterStore.get("CutsInDet", "HitsBySTr").getI(); - cutByAssociationTo("STr", getFullName(), cutOption); - } - - /** - * cut hits if connected/unconnected to reconstructed tracks - */ - protected void cutReconstructedTracks() - { - int cutOption = parameterStore.get("CutsInDet", "HitsByRTr").getI(); - cutByAssociationTo(getReconstructedTracks(), getName(), cutOption); - } - - /** - * cut hits if connected/unconnected to reconstructed segments - */ - protected void cutSegments() - { - int cutOption = parameterStore.get("CutsInDet", "HitsBySegment").getI(); - cutByAssociationTo(getSegments(), getName(), cutOption); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AInDetSegmentData.java b/graphics/AtlantisJava/src/atlantis/data/AInDetSegmentData.java deleted file mode 100755 index e7d97508d648..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AInDetSegmentData.java +++ /dev/null @@ -1,30 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.utils.AHashMap; - -/** - * - * @author Eric Jansen - */ -public class AInDetSegmentData extends ASegmentData { - - /** Creates a new instance of AInDetSegmentData */ - AInDetSegmentData(AHashMap p, AEvent e) { - super(p,e); - - event.getAssociationManager().add(new AAssociation(getFullName(), "TRT", numHits, hits,event)); - } - - public String getParameterGroup() { - return "InDetSegment"; - } - - public String getName() { - return "InDetSegment"; - } - - public String getNameScreenName() { - return "InDetSegment"; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AInDetTrackData.java b/graphics/AtlantisJava/src/atlantis/data/AInDetTrackData.java deleted file mode 100644 index 05e5bda343d2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AInDetTrackData.java +++ /dev/null @@ -1,164 +0,0 @@ -package atlantis.data; - -import atlantis.event.AAssociation; -import atlantis.event.AEvent; -import atlantis.event.AData; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; - -/** - * - * @author Eric Jansen - */ - -public class AInDetTrackData extends ATrackData { - - private int[] author = null; - - protected int numBLayerHits[] = null; - protected int numPixelHits[] = null; - protected int numSCTHits[] = null; - protected int numTRTHits[] = null; - - private static ALogger logger = ALogger.getLogger(ATrackData.class); - - /** Creates a new instance of AInDetTrackData */ - AInDetTrackData(AHashMap p, AEvent e) throws AAtlantisException { - super(p,e); - - author = p.getUnsureIntArray("trackAuthor"); //Change added 17/02/2010 - - numBLayerHits = p.getUnsureIntArray("nBLayerHits"); - numPixelHits = p.getUnsureIntArray("nPixHits"); - numSCTHits = p.getUnsureIntArray("nSCTHits"); - numTRTHits = p.getUnsureIntArray("nTRTHits"); - - String assocKey = getFullName(); - if (p.get("numHits") != null) { - int[] numHits = p.getIntArray("numHits"); - int[] hits = p.getIntArray("hits"); - - // This was added into TrkJiveXML-00-01-24, July 2010. For backwards - // compatibilty, we can also fill these arrays from the association - if (numPixelHits == null && numSCTHits == null && numTRTHits == null) { - numPixelHits = new int[numData]; - numSCTHits = new int[numData]; - numTRTHits = new int[numData]; - for (int i=0, num=0; i<numData; i++) { - numPixelHits[i] = numSCTHits[i] = numTRTHits[i] = 0; - - for (int j=0; j<numHits[i]; j++, num++) { - try { - // Negative identifiers are pixels, the rest we can decode using AIdHelper - if (numHits[i] > 0 && (hits[num] < 0 || AIdHelper.subDetector(hits[num]) == 2)) { - switch(hits[num] < 0 ? 1 : AIdHelper.indetPart(hits[num])) { - case 1: - numPixelHits[i]++; - break; - case 2: - numSCTHits[i]++; - break; - case 3: - numTRTHits[i]++; - break; - } - } - } catch (AAtlantisException ex) { - logger.warn("Problem decoding hit identifier: " + ex.getMessage()); - } - } - } - } - - int[] driftSign = null; - int[] isOutlier = null; - if (p.get("driftSign") != null && p.get("isOutlier") != null) { - driftSign = p.getIntArray("driftSign"); - isOutlier = p.getIntArray("isOutlier"); - } - - event.getAssociationManager().add(new AAssociation(assocKey, "TRT", numHits, hits,event)); - if (driftSign != null) { - event.getAssociationManager().add(new AAssociation(assocKey + "Drift", "TRT", numHits, driftSign,event)); - } - if (isOutlier != null) { - event.getAssociationManager().add(new AAssociation(assocKey + "Outlier", "TRT", numHits, isOutlier,event)); - } - event.getAssociationManager().add(new AAssociation(assocKey, "SiCluster", numHits, hits,event)); - event.getAssociationManager().add(new AAssociation(assocKey, "PixelCluster", numHits, hits,event)); - - - // although these two following associations directly doesn't exist - // in the event file (e.g. Track:numHits,hits - S3D:id) because it - // is calculated over SiCluster, the association has to be - // established here and corrected later on in - // AS3D.finalizeConstruction() -> AHitData.calculateAssociationViaClusters() - event.getAssociationManager().add(new AAssociation(assocKey, "S3D", numHits, hits,event)); - event.getAssociationManager().add(new AAssociation(assocKey, "TrigS3D", numHits, hits,event)); - } - } - - public String getParameterGroup() { - return "InDetTrack"; - } - - public String getName() { - return "InDetTrack"; - } - - public String getNameScreenName() { - return "InDetTrack"; - } - - public String getHitInfo(int index) { - String msg = super.getHitInfo(index); - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) - return getNameScreenName()+" index: " + index + ((h!=null)?h[index].toString():""); // output for Minerva - if (numBLayerHits != null) { - msg += "\n numBLayerHits = " + numBLayerHits[index]; - } - if (numPixelHits != null) { - msg += "\n numPixelHits = " + numPixelHits[index]; - } - if (numSCTHits != null) { - msg += "\n numSCTHits = " + numSCTHits[index]; - } - if (numTRTHits != null) { - msg += "\n numTRTHits = " + numTRTHits[index]; - } - return msg; - } - - protected void applyCuts() { - cut("CutsInDet", "RTrIndex", " RTr id", id); - cut("CutsInDet", "trackAuthor", " Author", author); - - if (numBLayerHits != null) { - cut("CutsInDet", "NumBLayer", "Num BLayer", numBLayerHits); - } - if (numPixelHits != null) { - cut("CutsInDet", "NumPixel", "Num Pixel", numPixelHits); - } - if (numSCTHits != null) { - cut("CutsInDet", "NumSCT", "Num SCT", numSCTHits); - } - if (numTRTHits != null) { - cut("CutsInDet", "NumTRT", "Num TRT", numTRTHits); - } - - super.applyCuts(); - - if (polylinedTrack && parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_HELIX) { - // if reconstructed tracks are drawn as helices, check for tracks - // with rhoVertex beyond the diameter of InDet and don't draw those - // super.rhoVertex array was calculated only if Track provided - // polyline data, otherwise rhoVertex is null and this method would - // cause NullPointerException - super.cutRhoVertexAfterInDetRadius(); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AJetData.java b/graphics/AtlantisJava/src/atlantis/data/AJetData.java deleted file mode 100644 index d2e1743a92b3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AJetData.java +++ /dev/null @@ -1,782 +0,0 @@ -package atlantis.data; - -import java.util.ArrayList; -import java.util.List; - -import atlantis.event.AAssociation; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.event.AObjectsAssociation; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import atlantis.utils.A3Vector; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.canvas.AWindow; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.graphics.AGraphics; - -/** - * Jet class - class handling multiple Jet datatypes - * (multiple collections) from various Jet alrogithms - * (JetRecJet, ParticleJet, etc) - */ -public class AJetData extends AData -{ - protected float[] eT; - protected float[] eta; - protected float[] phi; - protected float[] mass; - protected float[] pT; - protected float[] px; - protected float[] py; - protected float[] pz; - //Transition variable to ensure backwards compatability - protected boolean has4Vect = false; - //variables for jet quality information - protected float[] quality = null; - protected float[] qualityLAr = null; - protected float[] qualityTile = null; - protected float[] time = null; - protected float[] timeClusters = null; - protected int[] n90cells = null; - protected int[] n90const = null; - protected float[] hecf = null; - protected float[] emfrac = null; - protected float[] tileGap3f = null; - protected float[] fcorCell = null; - protected float[] fcorDotx = null; - protected float[] fcorJet = null; - protected float[] fcorJetForCell = null; - protected int[] nbadcells = null; - protected float[] fracSamplingMax = null; - protected float[] sMax = null; - protected float[] OutOfTimeEfrac = null; - protected float[] isGood = null; - protected float[] isBad = null; - protected float[] isUgly = null; - protected String[] bTagName = null; //new bTagname variable - protected float[] bTagValue = null; //new bTagValue variable - protected float[] weight = null; - protected float[] jvf = null; - //Transition variable to ensure backwards compatability - protected boolean hasJvf = true; - - String[] caloSample = { "EMB0", "EMB1", "EMB2", "EMB3", "EME0", "EME1", "EME2", "EME3", "HEC0", "HEC1", "HEC2", "HEC3", "TileBar0", "TileBar1", "TileBar2", "TileGap1", "TileGap2", "TileGap3", "TileExt0", "TileExt1", "TileExt2", "FCAL0", "FCAL1", "FCAL2", "Unknown" }; - - - AJetData(AHashMap p, AEvent e) - { - super(p,e); - if (p.get("et") != null) - { - eT = p.getFloatArray("et"); - } - else - { - eT = p.getFloatArray("pt"); - } - - - if(p.get("mass") != null) - { - mass = p.getFloatArray("mass"); - px = p.getFloatArray("px"); - py = p.getFloatArray("py"); - pz = p.getFloatArray("pz"); - has4Vect = true; - } - eta = p.getFloatArray("eta"); - phi = p.getFloatArray("phi"); - - if(p.get("emfrac") != null) - { - emfrac = p.getFloatArray("emfrac"); - } - - float forwardJVF = 10.0f; - float initJVF = 1.0f; - if(p.get("jvf") != null) - { - jvf = p.getFloatArray("jvf"); - for(int i=0; i<(jvf.length); i++) - { - if( jvf[i] == -1.0 ) - jvf[i] = forwardJVF; // forward-jets have jvf=-1 - } - } - else // dummy values for older xml-files - { - hasJvf = false; - jvf = new float[eta.length]; // for array size - for(int i=0; i<(jvf.length); i++) - { - jvf[i] = initJVF; // need to assign dummy value to allow cut - } - } - - //Getting BTagNames and BTagValues from xml - if(p.get("bTagValue") != null) - { - bTagValue = p.getFloatArray("bTagValue"); - bTagName = p.getUnsureStringArray("bTagName"); - weight = new float[eta.length]; - for(int i=0; i<(eta.length); i++) - weight[i] = bTagValue[i*(bTagValue.length/eta.length) + 0]; - // 0 is the first instance of JetFitterNNComb - // we take this as default for now... - } - - if(has4Vect) - { - float[] pTtemp = new float[mass.length]; - for(int i = 0; i < mass.length; i++){ - pTtemp[i] = (float) (new A4Vector(px[i],py[i],pz[i],mass[i]) ).getPt(); - } - pT = pTtemp; - } - - if(p.get("quality") != null) - quality = p.getFloatArray("quality"); - if(p.get("qualityLAr") != null){ - qualityLAr = p.getFloatArray("qualityLAr"); - qualityTile = p.getFloatArray("qualityTile"); - time = p.getFloatArray("time"); - timeClusters = p.getFloatArray("timeClusters"); - n90cells = p.getIntArray("n90cells"); - n90const = p.getIntArray("n90const"); - hecf = p.getFloatArray("hecf"); - tileGap3f = p.getFloatArray("tileGap3f"); - fcorCell = p.getFloatArray("fcorCell"); - fcorDotx = p.getFloatArray("fcorDotx"); - fcorJet = p.getFloatArray("fcorJet"); - fcorJetForCell = p.getFloatArray("fcorJetForCell"); - nbadcells = p.getIntArray("nbadcells"); - fracSamplingMax = p.getFloatArray("fracSamplingMax"); - sMax = p.getFloatArray("sMax"); - OutOfTimeEfrac = p.getFloatArray("OutOfTimeEfrac"); - isGood = p.getFloatArray("isGood"); - isBad = p.getFloatArray("isBad"); - isUgly = p.getFloatArray("isUgly"); - } - - String assocKey = getFullName(); - // create Jet - Calo associations if cells information is available - if(p.get("numCells") != null) - { - event.getAssociationManager().add(new AAssociation(assocKey, "LAr", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - event.getAssociationManager().add(new AAssociation(assocKey, "TILE", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - event.getAssociationManager().add(new AAssociation(assocKey, "HEC", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - event.getAssociationManager().add(new AAssociation(assocKey, "FCAL", p.getIntArray("numCells"), p.getIntArray("cells"),event)); - } - - if (p.get("clusterKey") != null) - { - int[] clusterLinkCount = p.getUnsureIntArray("clusterLinkCount"); - event.getAssociationManager().add(new AObjectsAssociation(assocKey, "Cluster", - p.getStringArray("clusterKey"), p.getIntArray("clusterIndex"), clusterLinkCount, event)); - } - if (p.get("trackKey") != null) - { - int[] trackLinkCount = p.getUnsureIntArray("trackLinkCount"); - event.getAssociationManager().add(new AObjectsAssociation(assocKey, "Track", - p.getStringArray("trackKey"), p.getIntArray("trackIndex"), trackLinkCount, event)); - } - } - - - public String getParameterGroup() - { - return "Jet"; - } - - - public String getName() - { - return "Jet"; - } - - - public String getNameScreenName() - { - return "Jet"; - } - - - public float getET(int index) - { - return eT[index]; - } - - - public float getEta(int index) - { - return eta[index]; - } - - - public float getPhi(int index) - { - return phi[index]; - } - - - public float[] getET() - { - return eT; - } - - - public float[] getEta() - { - return eta; - } - - - public float[] getPhi() - { - return phi; - } - - public float[] getPt() - { - if(has4Vect){ - return pT; - }else{ - return eT; - } - } - - @SuppressWarnings("unused") - // TODO: these cuts are from Nikolina - // using the wrong indices? - private float[] getfCorJetLevel() - { - // Tom - problem here with inconsistent indices? - // this code is not used yet, but the Jet people want it eventually - // i is the total data index, but we need to get that from the draw list, listdl[i]. - float[] temp = new float[numDraw]; - for (int i = 0; i < numDraw; i++) - temp[i] = (float) (fcorCell[i] - fcorJet[i]); - return temp; - } - - @SuppressWarnings("unused") - // TODO: these cuts are from Nikolina - // using the wrong indices? - private float[] getHECfQ() - { - float[] temp = new float[numDraw]; - for (int i = 0; i < numDraw; i++) - temp[i] = (float) (Math.abs(hecf[i]) + Math.abs(quality[i])); - return temp; - } - - /* - * Return an ordered list of the btaggers available in the event. - * If using an older XML file without btaggers available, an empty list is returned. - * Ordering is important to be consistent with the BTag Weights, which are ordered the same. - */ - public List<String> getBTaggers() { - - List<String> taggers = new ArrayList<String>(); - - if(bTagName == null) - return taggers; - - for(String tagger : bTagName) { - if(!taggers.contains(tagger)) { - taggers.add(tagger); - } - } - - return taggers; - } - - protected void applyCuts() - { - cutIndex(); - cut("CutsObjects", "JetET", " |ET|", eT); - cutPhi(phi); - cutEta(eta); - cut("CutsObjects", "JetEMfraction", " |EM fraction|", emfrac); - cut("CutsObjects", "JetVxFraction", " |Vx Fraction|", jvf); - - /* Placeholder for jet quality cuts (added by Nikolina Ilic) - cut("CutsObjects", "JetTime", " |dt(jet,coll)|", time); - cut("CutsObjects", "JetTileGap3F", " TileGap3F", tileGap3f); - cut("CutsObjects", "JetfCORRcell", " Already corrected cell level correction", fcorCell); - cut("CutsObjects", "JetfCORRjetLevel", " Correction by jet level estimation", getfCorJetLevel()); - cut("CutsObjects", "JetHECfQ", " HECf-Quality", getHECfQ()); - cut("CutsObjects", "JetOOTEf", " Out-Of-Time Energy frac", OutOfTimeEfrac); - */ - } - - public void colorbyBJets() { - //Initialy color all jets with constant color - for (int i = 0; i < numData; i++) { - int constantColor2 = parameterStore.get("Jet", "Constant").getI(); - color[i] = (byte) constantColor2; - } - - //Read necessary information to colour Jets - int bTagValue_user = parameterStore.get("CutsObjects", "JetBTagger").getI(); //getting user B-tagger preference - int constantColor = parameterStore.get("BJet", "Constant").getI(); - int constantColor2 = parameterStore.get("Jet", "Constant").getI(); - - //if b-tagging information is contained in xml file - if(bTagValue != null) { - int mod = bTagValue.length / eta.length; //Number of Btaggers - eta.length is the number of Jets - double s = parameterStore.get("CutsObjects", "JetBTagweight").getD(); - for (int i = 0; i < eta.length; i++) { - color[i] = (byte) constantColor2; - if(bTagValue[bTagValue_user + i*mod]>s){ - color[i] = (byte) constantColor; - } - } - } - } - - - - - protected int internalColor() - { - int colorFunction = APar.instance().get(PARAMETER_GROUP, "ColorFunction").getI(); - - if (colorFunction == 0) - { - colorByConstant(); - } - else if(colorFunction == 1) - { - colorByIndex(); - } - else if(colorFunction == 2) - { - colorByCollection(); - } - else if (colorFunction == 3) - { - colorbyBJets(); - } - return 3; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",eT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",eT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",eT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",eT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String msg; - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - String printPt = ""; - if(has4Vect){ - printPt = "\n PT = " + String.format("%.3f",pT[index]) + " GeV"; - } - msg = getNameScreenName() + " (id: " + id[index] + " index: " + index + ")\n" + - " storegate key: " + sgKey + printPt + "\n ET = " + - String.format("%.3f",eT[index]) + " GeV" + "\n E = " + - String.format("%.3f",Math.abs(eT[index] / Math.cos(AMath.lambda(eta[index])))) + - " GeV" + "\n " + AMath.ETA + " = " + String.format("%.3f",eta[index]) + "\n " + - AMath.PHI + " = " + String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)"; - - if(isGood != null) msg += "\n Selection: isGood =" + isGood[index] + "(isBad = " + isBad[index] + ", isUgly = " + isUgly[index] + ")"; - if(hecf != null) msg += "\n hecf = " + String.format("%.2f",hecf[index])+ ", n90cells = " + n90cells[index] + " (n90const = " + n90const[index] + ")"; - if (emfrac != null) msg += "\n emfrac = " + String.format("%.2f",emfrac[index]); - if (quality != null) msg += "\n quality = " + String.format("%.2f",quality[index]); - if (qualityLAr != null) msg += "(qLAr = " + String.format("%.2f",qualityLAr[index]) + ")"; - - if (hasJvf) - { - msg += "\n jvf = " + String.format("%.2f",jvf[index]); - } - else - { - msg += "\n jvf n/a "; - } - if (weight != null) msg += " b-weight = " + String.format("%.2f",weight[index]); - // Displaying bTagValues and bTagnames to the outputscreen - if(bTagValue != null) - { - //calculating "multiple" number - int Div = (bTagValue.length)/(eta.length); - msg += "\n b-Taggers: "; - for (int s=0;s<Div;s++) - { - msg += bTagName[index*Div + s] + "=" + String.format("%.2f",bTagValue[index*Div + s]) + ", "; - } - } - if (time != null) msg += "\n time = " + String.format("%.2f",time[index]) + " ns (clus time = " + String.format("%.2f",timeClusters[index]) + " ns)"; - if (OutOfTimeEfrac != null) msg += "\n Out-Of-Time Energy fraction = " + String.format("%.2f", OutOfTimeEfrac[index]); - if (fracSamplingMax != null) msg += "\n fracSamplingMax = " + String.format("%.2f",fracSamplingMax[index]) + " (sMax = " + caloSample[(int) sMax[index]] + ")"; - if (tileGap3f != null) msg += "\n tileGap3f = " + String.format("%.2f",tileGap3f[index]) + ", fcorCell=" + String.format("%.2f",fcorCell[index]) + ", fcorJet=" + String.format("%.2f",fcorJet[index]); - if (fcorDotx != null) msg += "\n fcorDotx=" + String.format("%.2f",fcorDotx[index]) + " (not implemented yet)"; - - return msg; - } - - // info on Jet collections contained in v-plot rubberband selection - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumE = 0.; - double sumEt = 0.; - - for (int i = 0; i < numDraw; ++i) - { - sumEt += Math.abs(eT[listdl[i]]); - sumE += Math.abs(eT[listdl[i]] / Math.cos(AMath.lambda(eta[listdl[i]]))); - } - - String key = getFullName(); - String msg = numDraw + " " + (key != null ? "" + key : getNameScreenName()); - msg += " sum(ET) = " + String.format("%.1f",sumEt) + " sum(E) = " + String.format("%.1f",sumE); - - return msg; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - if(has4Vect){ - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM(pT[k],eta[k],phi[k],mass[k]); - sum.add(start); - } - }else{ - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A3Vector start = A3Vector.fromRhoPhiZ(0., 0., 0.); - double tL = AMath.tanLambda(eta[k]); - A3Vector stop = A3Vector.fromRhoPhiZ(1., phi[k], tL); - A3Vector v = (stop.subtract(start)).normalize(); - double p = eT[k] / Math.sqrt(1. - v.z * v.z); - sum.add(new A4Vector(v.scale(p), 0.)); - } - } - return sum; - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if (projection instanceof AProjectionVP) - { - ACoord centers = window.calculateDisplay(getUser(projection)); - int[] drawlist = centers.index; - double eLimit = 0.05; - int numPoints = 25; - double[][][] hv = new double[2][drawlist.length][numPoints]; - - for (int i = 0; i < drawlist.length; ++i) - { - int list = drawlist[i]; - int jetMode = parameterStore.get("VP", "Jet").getI(); - double e; - if (jetMode == 0) - // showing jet in ET - e = Math.abs(eT[list]); - else - // showing jet in E - e = Math.abs(eT[list] / Math.cos(AMath.lambda(eta[list]))); - int d = (int) (Math.sqrt((e / eLimit) / Math.PI)); - if (d == 0) - d = 1; - for (int j = 0; j < numPoints; j++) - { - hv[0][i][j] = centers.hv[0][0][i] + d * Math.cos(Math.PI * 2 * j / (numPoints - 1)); - hv[1][i][j] = centers.hv[1][0][i] + d * Math.sin(Math.PI * 2 * j / (numPoints - 1)); - } - } - ag.draw(new ACoord(hv, drawlist, this, ACoord.POLYLINES)); - } - else - { - super.draw(window, ag, projection); - } - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - protected ACoord getVPUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = eta[list]; - v[i] = Math.toDegrees(phi[list]); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - @Override - protected ACoord getYXUser() - { - int coneSmooth = 20; - makeDrawList(); - double[][][] hv = new double[2][numDraw][(2*coneSmooth)]; - int[] index = new int[numDraw]; - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - - double dphi = 0.4; - - if(sgKey.contains("Kt6")) - dphi = 0.6; - if(sgKey.contains("Kt1")) - dphi = 1.0; - - double rhoMinus = parameterStore.get("Jet","Innerdrawradius").getD(); - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double s = parameterStore.get("Jet", "Scale").getD(); - double rhoMax = s*1000; - if (0==s) return ACoord.NO_POLYLINES; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - - //if no composite particles increase jet size - //Vector keys = (Vector) event.getCollections().get("CompositeParticle"); - //if (keys == null || !parameterStore.get("Data", "CompositeParticle").getStatus()) rhoMax=1000;//1800; - - double rhoPlus = rhoMax; - if(Math.abs(eT[list]) < maxEnergy) { - if(parameterStore.get("Jet", "ScaleType").getI() == 1) //sq root - rhoPlus = rhoMinus + rhoMax * (Math.sqrt (Math.abs(eT[list])/maxEnergy)); - if(parameterStore.get("Jet", "ScaleType").getI() == 0) // linear - rhoPlus = rhoMinus + rhoMax * (Math.abs(eT[list])/maxEnergy); - } - - double vx = parameterStore.get("Event", "XVtx").getD(); - double vy = parameterStore.get("Event", "YVtx").getD(); - - double h_shift = vx; - double v_shift = vy; - - // the loop interpolates between the inner and outer edge of the jet to draw the arc - - // draw the outer arc - for(int j=0; j<coneSmooth; j++){ - float f = ((float)j)/(coneSmooth-1); - hv[0][i][j] = h_shift + (rhoPlus) * Math.cos(((1-f)*phiPlus + (f)*phiMinus)); - hv[1][i][j] = v_shift + (rhoPlus) * Math.sin(((1-f)*phiPlus + (f)*phiMinus)); - } - - // draw the inner arc - for(int j=coneSmooth; j<(2*coneSmooth); j++){ - float f = ((float)j-coneSmooth)/(coneSmooth-1); - hv[0][i][j] = h_shift + (rhoMinus) * Math.cos(((1-f)*phiMinus + (f)*phiPlus)); - hv[1][i][j] = v_shift + (rhoMinus) * Math.sin(((1-f)*phiMinus + (f)*phiPlus)); - } - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.TRANSPARENT_POLYGONS); - } - - protected ACoord getFRUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - - double dphi = 0.4; - - if(sgKey.contains("Kt6")) - dphi = 0.6; - if(sgKey.contains("Kt1")) - dphi = 1.0; - - double s = parameterStore.get("Jet", "Scale").getD(); - double rhoMax = s*1500; - double rhoMinus = parameterStore.get("Jet","Innerdrawradius").getD(); - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - if (0==s) return ACoord.NO_POLYLINES; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - - //if no composite particles increase jet size - //Vector keys = (Vector) event.getCollections().get("CompositeParticle"); - //if (keys == null || !parameterStore.get("Data", "CompositeParticle").getStatus()) rhoMax=1000;//1800; - - double rhoPlus = rhoMinus + rhoMax; - if(Math.abs(eT[list]) < maxEnergy) { - if(parameterStore.get("Jet", "ScaleType").getI() == 1) //sq root - rhoPlus = rhoMinus + rhoMax * (Math.sqrt (Math.abs(eT[list])/maxEnergy)); - if(parameterStore.get("Jet", "ScaleType").getI() == 0) // linear - rhoPlus = rhoMinus + rhoMax * (Math.abs(eT[list])/maxEnergy); - } - - hv[0][i][0] = rhoMinus; - hv[1][i][0] = Math.toDegrees(phiMinus); - - hv[0][i][1] = rhoMinus; - hv[1][i][1] = Math.toDegrees(phiPlus); - - hv[0][i][2] = rhoPlus; - hv[1][i][2] = Math.toDegrees(phiPlus); - - hv[0][i][3] = rhoPlus; - hv[1][i][3] = Math.toDegrees(phiMinus); - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.TRANSPARENT_POLYGONS).includePhiWrapAround("FR"); - } - - protected double Theta (double eta, int rSign) - { - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta))) * 2.0; - if ((eta > 0.) && (rSign == -1)) - theta = 2 * Math.PI - theta; - else if ((eta < 0.) && (rSign == -1)) - theta += Math.PI; - else if ((eta < 0.) && (rSign == 1)) - theta = Math.PI - theta; - - return theta; - } - - protected ACoord getRZUser() - { - int coneSmooth = 20; - double s = parameterStore.get("Jet", "Scale").getD(); - if (0==s) return ACoord.NO_POLYLINES; - makeDrawList(); - double[][][] hv = new double[2][numDraw][(2*coneSmooth)]; - int[] index = new int[numDraw]; - - double innerRadius = parameterStore.get("Jet","Innerdrawradius").getD(); - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - - double deta = 0.4; - - if(sgKey.contains("Kt6")) - deta = 0.6; - if(sgKey.contains("Kt1")) - deta = 1.0; - - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list]-phiMid); - int rSign; - if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) - rSign = -1; - else - rSign = 1; - - double theta = Theta(eta[list],rSign); - double thetaPlus = Theta(eta[list] + deta, rSign); - double thetaMinus = Theta(eta[list] - deta, rSign); - - // decide the region based on the theta value - final byte TOP_BOTTOM = 0; - final byte LEFT_RIGHT = 1; - byte region = TOP_BOTTOM; - // hard-coded value is based on the values in Geometry - if(Math.abs(Math.tan(theta)) < 0.8) - region = LEFT_RIGHT; - - double radiusMinus = 0.; - - switch(region) - { - case TOP_BOTTOM: - radiusMinus = innerRadius / Math.abs(Math.sin(theta)); - break; - case LEFT_RIGHT: - radiusMinus = innerRadius / Math.abs(Math.cos(theta)); - break; - } - //compare to AAODData for rhoMax/Minus values - double radiusMax = s*2500.; - - //if no composite particles increase jet size - //Vector keys = (Vector) event.getCollections().get("CompositeParticle"); - //if (keys == null || !parameterStore.get("Data", "CompositeParticle").getStatus()) radiusMax+=200; - - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double radiusPlus = radiusMinus + radiusMax; - if(Math.abs(eT[list] / Math.cos(AMath.lambda(eta[list]))) < maxEnergy) - { - if(parameterStore.get("Jet", "ScaleType").getI() == 1) //sq root - radiusPlus = radiusMinus + radiusMax * (Math.sqrt (Math.abs(eT[list] / Math.cos(AMath.lambda(eta[list])))/maxEnergy)); - if(parameterStore.get("Jet", "ScaleType").getI() == 0) // linear - radiusPlus = radiusMinus + radiusMax *((Math.abs(eT[list] / Math.cos(AMath.lambda(eta[list]))))/maxEnergy); - } - - double vx = parameterStore.get("Event", "XVtx").getD(); - double vy = parameterStore.get("Event", "YVtx").getD(); - double vz = parameterStore.get("Event", "ZVtx").getD(); - - double h_shift = vz; - double v_shift = Math.sqrt(vx*vx + vy*vy); - - // the loop interpolates between the inner and outer edge of the jet to draw the arc - // draw the outer arc - for(int j=0; j<coneSmooth; j++){ - float f = ((float)j)/(coneSmooth-1); - hv[0][i][j] = h_shift + (radiusPlus) * Math.cos(((1-f)*thetaPlus + (f)*thetaMinus)); - hv[1][i][j] = v_shift + (radiusPlus) * Math.sin(((1-f)*thetaPlus + (f)*thetaMinus)); - } - - // draw the inner arc - for(int j=coneSmooth; j<(2*coneSmooth); j++){ - float f = ((float)j-coneSmooth)/(coneSmooth-1); - hv[0][i][j] = h_shift + (radiusMinus) * Math.cos(((1-f)*thetaMinus + (f)*thetaPlus)); - hv[1][i][j] = v_shift + (radiusMinus) * Math.sin(((1-f)*thetaMinus + (f)*thetaPlus)); - } - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.TRANSPARENT_POLYGONS); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AJetROIData.java b/graphics/AtlantisJava/src/atlantis/data/AJetROIData.java deleted file mode 100755 index c47c2ce92990..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AJetROIData.java +++ /dev/null @@ -1,38 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.utils.AHashMap; - -/** - * - * Jet Region Of Interest - * - * @author Zdenek Maxa, Qiang Lu - */ -public class AJetROIData extends AROIData -{ - - AJetROIData(AHashMap p, AEvent e) - { - super(p,e); - } // AJetROIData() ------------------------------------------------------ - - - public String getParameterGroup() - { - return "JetROI"; - } // getParameterGroup() ------------------------------------------------ - - - public String getName() - { - return "JetROI"; - } // getName() ---------------------------------------------------------- - - - public String getNameScreenName() - { - return "JetROI"; - } // getNameScreenName() ------------------------------------------------ - -} // class AJetROIData ====================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/ALArData.java b/graphics/AtlantisJava/src/atlantis/data/ALArData.java deleted file mode 100644 index 7b0efc9cd77c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ALArData.java +++ /dev/null @@ -1,1032 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import com.Ostermiller.util.CSVParser; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.io.FileNotFoundException; - -import atlantis.geometry.ABarrelCalorimeterDetector; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.utils.AUtilities; -import atlantis.parameters.AParameter; -import atlantis.utils.ALogger; - - -/** - * The Liquid Argon ElectroMagnetic Calorimeter - * - * @author Eric Jansen - */ -public class ALArData extends ACalorimeterData -{ - private static ALogger logger = ALogger.getLogger(ALArData.class); - - // data for real pulse shapes plots - private int numSamplings = 0; - private int[][] adcCounts = null; - private float[] cellTime = null; - private int[] cellGain = null; - private float[] cellPedestal = null; - private float[] adc2Mev = null; - private static boolean pulseShapesDataAvailable = false; - private static final String LOOKUP_TABLE_FILE = - AGlobals.instance().getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - "rpsplt_lar.csv"; - // number of lookup table values for real pulse shapes plots calculation - private static final short NUMBER_OF_LOOKUP_VALUES = 799; - - - - ALArData(AHashMap p, AEvent e) - { - super(p,e); - - for (int i = 0; i < numData; i++) - { - try - { - side[i] = (byte) AIdHelper.larBarrelEndcap(id[i]); - etaIndex[i] = (short) AIdHelper.larEta(id[i]); - phiIndex[i] = (short) AIdHelper.larPhi(id[i]); - sampling[i] = AIdHelper.larSampling(id[i]); - } - catch (AAtlantisException aex) - { - logger.warn("Problem decoding ID " + id[i] + " in " + - CALORIMETER_NAME + ": " + aex.getMessage(), aex); - side[i] = 0; - etaIndex[i] = -1; - phiIndex[i] = -1; - sampling[i] = -1; - } - } - - makeHitToGeometryMapping(); - for (int i = 0; i < et.length; ++i) - { - et[i] = Math.abs(energy[i] / (float) Math.cosh(eta[i])); - } - - // Collect some constants we need for the histograms. - for (int i = 0; i < ACalorimeterDetector.count(); i++) - { - - if (ACalorimeterDetector.get(i).getName().indexOf(CALORIMETER_NAME) >= 0) - { - if (ACalorimeterDetector.get(i) instanceof ABarrelCalorimeterDetector) - { - if (innerR == 0.0 || ACalorimeterDetector.get(i).getRMin() < innerR) - { - innerR = ACalorimeterDetector.get(i).getRMin(); - } - } - else - { - if (innerZ == 0.0 || ACalorimeterDetector.get(i).getZMin() < innerZ) - { - innerZ = ACalorimeterDetector.get(i).getZMin(); - } - } - if (outerR == 0.0 || ACalorimeterDetector.get(i).getRMax() > outerR) - { - outerR = ACalorimeterDetector.get(i).getRMax(); - } - if (outerZ == 0.0 || ACalorimeterDetector.get(i).getZMax() > outerZ) - { - outerZ = ACalorimeterDetector.get(i).getZMax(); - } - if (outerEta == 0.0 || ACalorimeterDetector.get(i).getEtaMax() > outerEta) - { - outerEta = ACalorimeterDetector.get(i).getEtaMax(); - } - if (phiGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaPhi() < phiGranularity) - { - phiGranularity = ACalorimeterDetector.get(i).getDeltaPhi(); - } - if (etaGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaEta() < etaGranularity) - { - etaGranularity = ACalorimeterDetector.get(i).getDeltaEta(); - } - } - } - - // Add a little bit of extra margin to prevent binning errors due to - // rounding of numbers. - outerEta += etaGranularity; - - readPulseShapePlotData(p); - - } // ALArData() --------------------------------------------------------- - - - - private void readPulseShapePlotData(AHashMap p) - { - // read ADCCounts and cell data for real pulse shapes plots - adcCounts = super.getADCCountsData(p); - - // read LAr digits (cell data) for real pulse shapes plots - cellTime = (p.get("cellTime") != null) ? p.getFloatArray("cellTime") : null; - cellGain = (p.get("cellGain") != null) ? p.getIntArray("cellGain") : null; - cellPedestal = (p.get("cellPedestal") != null) ? p.getFloatArray("cellPedestal") : null; - adc2Mev = (p.get("adc2Mev") != null) ? p.getFloatArray("adc2Mev") : null; - - pulseShapesDataAvailable = false; - if(adcCounts != null && cellTime != null && cellGain != null && - cellPedestal != null && adc2Mev != null) - { - pulseShapesDataAvailable = true; - numSamplings = adcCounts[0].length; - - logger.debug(CALORIMETER_NAME + - ": data for real pulse shape plots available"); - - if(ACalorimeterRPSPLT.areLarLookupTablesInitialized()) - { - logger.debug(CALORIMETER_NAME + - ": lookup tables have already been read in"); - } - else - { - logger.debug(CALORIMETER_NAME + - ": lookup table values have not been read in yet\n" + - " trying to read file: " + LOOKUP_TABLE_FILE); - - try - { - readLookupTableFile(); - - logger.debug(CALORIMETER_NAME + - ": values from " + LOOKUP_TABLE_FILE + - " successfully read in"); - } - catch(AAtlantisException ex) - { - logger.error(CALORIMETER_NAME + - ": reading " + LOOKUP_TABLE_FILE + - " failed, real pulse shapes plots will not " + - "be available, reason: " + ex.getMessage(), ex); - pulseShapesDataAvailable = false; - } - } - } - - } // readPulseShapePlotData() ------------------------------------------- - - - - /** - * readLookupTableFile() reads in comma separated values (CSV) file - * with LAr real pulse shapes plots time and amplitude lookup values - * @param fileName String - * @throws AAtlantisException - */ - private void readLookupTableFile() throws AAtlantisException - { - try - { - InputStream is = AUtilities.getFileAsStream(LOOKUP_TABLE_FILE); - CSVParser parser = new CSVParser(is); - parser.setCommentStart("#"); - String arrayName = null; - - while((arrayName = parser.nextValue()) != null) - { - String valueArray = parser.nextValue(); // shall now contain all values - CSVParser parserArray = new CSVParser(new StringReader(valueArray)); - String[][] s = parserArray.getAllValues(); - - float[] array = getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - ACalorimeterRPSPLT.setLarTable(arrayName, array); - } // while - } - catch(FileNotFoundException e) - { - throw new AAtlantisException("could not find file: " + - LOOKUP_TABLE_FILE); - } - catch(IOException e) - { - throw new AAtlantisException("exception while reading file: " + - LOOKUP_TABLE_FILE); - } - catch(AAtlantisException e) - { - throw e; - } - - } // readLookupTableFile() ---------------------------------------------- - - - - /** - * - * @param index int - * @param lookupTablesInfo String - * Debug info method in order to make sure that correct lookup table - * is used given barrel/endcap, sampling and region of LAr. - */ - private void pulseShapePlotsDebugInfo(int index, String lookupTableName) - { - String msg = null; - try { - msg = "\n barrel/endcap value: " + - AIdHelper.larBarrelEndcap(id[index]); - msg += " is "; - msg += AIdHelper.larIsBarrel(id[index]) ? "barrel" : "endcap"; - msg += "\n sampling/layer: " + sampling[index]; - msg += "\n region: " + AIdHelper.larRegion(id[index]); - msg += "\n lookup table used: " + lookupTableName; - logger.debug(msg + "\n"); - } catch (AAtlantisException aaex) { - logger.debug("\n exception: " + aaex.getMessage(), aaex); - } - } // pulseShapePlotsDebugInfo() ----------------------------------------- - - - - /** - * This method is used when calculating real pulse shapes plots. - * It is called from getLookupTableForPulseShapesPlots() - * It calculates index of the 0.1 eta bin the argument eta - * (eta of a cell) falls into. Thus it determines which eta - * range a cell belongs to (eta ranges are last level of cells - * division from barrel/endcap, layer, region. - * startIndex argument tells which eta range we start counting from - * (given the eta ranges division it may not necessarily be from 0). - * If eta doesn't fall into a specified interval, empty String - * is returned - then missing ETAx suffix will cause retrieving - * of the float[] will fail. - * - * @param etaFrom - * @param etaTo - * @return - */ - private static String getEtaBinIndex(float etaFrom, float etaTo, - float cellEta, int startIndex) - { - float step = 0.1f; // step, size of the eta bins - float absEta = Math.abs(cellEta); - int index = startIndex; - - for(float f = etaFrom; f < etaTo; f += step, index++) - { - if(absEta > f && absEta < f + step) - { - logger.debug("eta range calculation: cell eta = " + cellEta + " " + - "etaFrom = " + etaFrom + " etaTo = " + etaTo); - logger.debug("eta range index result: " + index + - " (index offset was: " + startIndex + ")"); - return "ETA" + index + "_" ; - } - } - - // calculating bin failed, retrieving the array will fail later - return ""; - - } // calculateEtaBinIndex() --------------------------------------------- - - - - /** - * Method returns correct float[] array for amplitude lookup table - * depending whether a cell (determined by index, resp. id[index]) is in - * barrel, endcap, which layer and which region or which eta range. - * This method accesses ACalorimeterRPSPLT - * Methods contains constant value defining parts of LAr detector - * (as used in AIdHelper) and also eta range constants provided by - * the LAr community. - * - * @param index int - * @return float[] - */ - private float[] getLookupTableForPulseShapesPlots(int index) throws AAtlantisException - { - float[] amplitude = null; // lookup table amplitude values - - // helper variable - absolute value of eta - for checking of the eta range - float absEta = Math.abs(eta[index]); - - // the key for ACalorimeterRPSPLT.getLarTable(key) will gradually be - // constructed depending on barrel/endcap, layer, region and eta range - String lookupTableKey = "LAR_"; // start of the name all LAR_ tables - - - if(AIdHelper.larIsBarrel(id[index])) - { - // it is barrel - lookupTableKey += "BARREL_"; - switch(sampling[index]) - { - case 0: // layer 0 - // plot ADC counts only for this layer - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - String title = "LAr cell: " + decodedId[0]; - int[][] data = { adcCounts[index] }; - APulseShapePlot.plotADCCounts(data, title, null); - throw new AAtlantisException("ADC counts plot only, pulse shape plot not " + - "implemented for LAr barrel, layer 0"); - case 1: - lookupTableKey += "LAYER1_"; // layer 1 - switch(AIdHelper.larRegion(id[index])) - { - case 0: - lookupTableKey += "REGION0_"; - break; - case 1: - lookupTableKey += "REGION1_"; - break; - default: - AOutput.append("\npulse shape plots - LAr barrel, " + - "layer 1, region > 1. Using layer 1, " + - "region 1 lookup table\n", ALogInterface.WARNING); - lookupTableKey += "REGION1_"; - } - break; - case 2: // layer 2 - lookupTableKey += "LAYER2_"; // layer 2 - switch(AIdHelper.larRegion(id[index])) - { - case 0: - lookupTableKey += "REGION0_"; - break; - case 1: - lookupTableKey += "REGION1_"; - break; - default: - AOutput.append("\npulse shape plots - LAr barrel, " + - "layer 2, region > 1. Using layer 2, " + - "region 1 lookup table\n", ALogInterface.WARNING); - lookupTableKey += "REGION1_"; - } - break; - case 3: // layer 3 - lookupTableKey += "LAYER3_REGION0_"; - break; - } - } // if(AIdHelper.larIsBarrel(id[index])) - else - { - // we are in the endcap - lookupTableKey += "ENDCAP_"; - switch(sampling[index]) - { - case 0: // layer 0 - // only one region and one eta range on this layer - lookupTableKey += "LAYER0_REGION0_ETA0_"; - break; - case 1: // layer 1 - lookupTableKey += "LAYER1_"; - switch(AIdHelper.larRegion(id[index])) - { - case 0: - lookupTableKey += "REGION0_"; - if(absEta > 1.375f && absEta < 1.425f) - { - lookupTableKey += "ETA0_"; // first eta range - } - else - { - // eta ranges with step 0.1 provided by Andre - // start index counting from 1, 0 range is used above - lookupTableKey += getEtaBinIndex(2.5f, 3.2f, eta[index], 1); - } - break; - case 1: - lookupTableKey += "REGION1_ETA0_"; // no eta subdivision - break; - case 2: - lookupTableKey += "REGION2_"; - // starting from first range, startIndex 0 - lookupTableKey += getEtaBinIndex(1.5f, 1.8f, eta[index], 0); - break; - case 3: - lookupTableKey += "REGION3_"; - lookupTableKey += getEtaBinIndex(1.8f, 2.0f, eta[index], 0); - break; - case 4: - lookupTableKey += "REGION4_"; - lookupTableKey += getEtaBinIndex(2.0f, 2.4f, eta[index], 0); - break; - case 5: - lookupTableKey += "REGION5_"; - if(absEta > 2.4f && absEta < 2.5f) - { - lookupTableKey += "ETA0_"; - } - break; - default: - AOutput.append("\npulse shape plots - LAr endcap, " + - "layer 1, region > 5. Using layer 1, " + - "region 5, eta range 0 lookup table\n", - ALogInterface.WARNING); - lookupTableKey += "REGION5_ETA0_"; - } - break; - case 2: // layer 2 - lookupTableKey += "LAYER2_"; - switch(AIdHelper.larRegion(id[index])) - { - case 0: - lookupTableKey += "REGION0_"; - if(absEta > 1.375f && absEta < 1.425f) - { - lookupTableKey += "ETA0_"; // first eta range - } - else - { - // eta ranges with step 0.1 provided by Andre - // start index counting from 1, 0 range is used above - lookupTableKey += getEtaBinIndex(2.5f, 3.2f, eta[index], 1); - } - break; - case 1: - lookupTableKey += "REGION1_"; - lookupTableKey += getEtaBinIndex(1.425f, 2.5f, eta[index], 0); - break; - } - break; - case 3: // layer 3 - lookupTableKey += "LAYER3_"; - lookupTableKey += "REGION0_"; - lookupTableKey += getEtaBinIndex(1.5f, 2.5f, eta[index], 0); - break; - } - } // else (endcap) - - lookupTableKey += "AMPLITUDE"; - pulseShapePlotsDebugInfo(index, lookupTableKey); - amplitude = ACalorimeterRPSPLT.getLarTable(lookupTableKey); - - return amplitude; - - } // getLookupTableForPulseShapesPlots() ------------------------------- - - - - /** - * This method plots only the ADC counts and no pulse shape plot for a - * given cell. This is useful when the pulse shape plot is not correct - * but ADC count plot is still needed. The method is called from pick - * interaction with D (digits only), see APickInteraction.pressed() - * It is supposedly a temporary solution until LAr real pulse shapes - * lookup tables are corrected / finalized and propagated to Atlantis. - * @param index - */ - public void plotADCCounts(int index) - { - if(pulseShapesDataAvailable) - { - String title = getPulseTitleString(index); - - int[][] adcCountsLocal = new int[][] { adcCounts[index] }; - - logger.debug("Plotting only ADC counts plot ... "); - APulseShapePlot.plotADCCounts(adcCountsLocal, title, null); - - } // if(pulseShapesDataAvailable) - else - { - return; - } - - } // plotADCCounts() ---------------------------------------------------- - - - -// /** -// * Call util class which plots cell pulse shapes provided that -// * all real pulse shapes data is available -// * Functions calculates values of real pulse shape calculated in the method -// * getPhysicsPulseShape(). -// * This method is called from pick interaction. -// * -// * @param index int -// */ - /*public void plotPulseShapes(int index) - { - if(pulseShapesDataAvailable) - { - String title = getPulseTitleString(index); - - int[][] adcCountsLocal = new int[][] { adcCounts[index] }; - - - if(super.checkADCCountsAvailability(adcCountsLocal)) - { - // adc counts are available - logger.debug(CALORIMETER_NAME + " adc counts (digits) are " + - "available for pulse shapes plots for this cell."); - } - else - { - String m = "ADC counts are not available for this cell, " + - "can't plot pulse shapes."; - AOutput.append("\n" + m, ALogPane.WARNING); - logger.warn(m); - return; - } - - - float[] amplitude = null; // amplitude lookup table - float[] time = null; // time lookup table - try - { - time = ACalorimeterRPSPLT.getLarTable("LAR_TIME"); - amplitude = getLookupTableForPulseShapesPlots(index); - } - catch(AAtlantisException ex) - { - AOutput.append("\n" + ex.getMessage(), ALogPane.WARNING); - logger.error(ex.getMessage()); - return; - } - - // 1 .. 32 range (32 values of ADC counts, i.e. 32 samples), need to - // get NUMBER_OF_LOOKUP_VALUES (769) within this range (starts from 1!). - // Real data will have (probably) only 5 samples per cell - double step = (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try - { - if(factor != -1) - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - realPulse[0][i] = super.getPhysicsPulseShape(d, cellTime[index], - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogPane.WARNING); - logger.error(aaex.getMessage()); - return; - } - - if(factor != -1) - { - logger.debug("adc2Mev factor available, plotting full plot."); - APulseShapePlot.plotRealPulseShapes(adcCountsLocal, realPulse, - step, null, title); - } - else - { - logger.debug("adc2Mev factor not available, plotting just adc counts."); - APulseShapePlot.plotADCCounts(adcCountsLocal, title, null); - } - - } // if(pulseShapesDataAvailable) - else - { - return; - } - - } */// plotPulseShapes() -------------------------------------------------- - - @Override - protected int[][] getADCCounts(int index) { - if (pulseShapesDataAvailable) { - for (int adc : adcCounts[index]) { - // Only return something if it is non-zero - if (adc != 0) return new int[][] { adcCounts[index] }; - } - } - return null; - } - - /** - * Calculate local time for pulse shape plots - */ - protected double getLocalTime(double xTime, double cellTime, int numSamplings) { - int nominalPeakSample = (int)(numSamplings / 2.); - return ((xTime - nominalPeakSample + 3) * 25.0) - cellTime; - } - - @Override - protected double[][] getPulseShape(int index) { - - float[] amplitude = null; // amplitude lookup table - float[] time = null; // time lookup table - try - { - time = ACalorimeterRPSPLT.getLarTable("LAR_TIME"); - amplitude = getLookupTableForPulseShapesPlots(index); - } - catch(AAtlantisException ex) - { - AOutput.append("\n" + ex.getMessage(), ALogInterface.WARNING); - logger.error(ex.getMessage()); - return null; - } - - // 1 .. 32 range (32 values of ADC counts, i.e. 32 samples), need to - // get NUMBER_OF_LOOKUP_VALUES (769) within this range (starts from 1!). - // Real data will have (probably) only 5 samples per cell - double step = getPulseStep(index); - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - // if adc2Mev != -1 -> use value from event file, otherwise predefined value - // see comment at the getADC2MevFactorPredefined() method - // factor variable is used as a flag whether or not to plot pulse shape, - // if is -1 (adc2Mev not available), then want to see only the adc counts - // and don't calculate the pulse shapes - // getADC2MevFactorPredefined(index) is no longer in use, see comment at it - float factor = adc2Mev[index]; - - double energyLocal = energy[index] * 1000.0 / factor; - try - { - if(factor != -1) - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - double localTime = getLocalTime(d, cellTime[index], this.numSamplings); - realPulse[0][i] = super.getPhysicsPulseShape(localTime, - cellPedestal[index], energyLocal, - amplitude, time, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - logger.error(aaex.getMessage()); - return null; - } - - if(factor != -1) - { - logger.debug("adc2Mev factor available, plotting full plot."); - return realPulse; - } - else - { - return null; - } - } - - @Override - protected double getPulseStep(int index) { - return (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - } - -// /** -// * Determines adc2Mev factor value for a cell. The number either comes -// * with the event file (adc2Mev subtag), but sometimes is not available -// * in Athena (in the database) which is indicated by -1 in the event file -// * for a particular cell. In this case, use predefined constant in this -// * method. -// * -// * zdenek (2008-09-15): -// * These predefined values (which are used if adc2Mev factor is -1) should -// * no longer be used. if the factor is not present, do not plot the pulse -// * shape, just the ADC counts as these values are non-sense. The method -// * and references to it should be removed after some time (if calo people -// * don't change their mind to pre-define some other values and use those) -// -// * @param index int -// * @return String -// */ - /* - private float getADC2MevFactorPredefined(int index) - { - boolean barrel = false; - int layer = sampling[index]; - - try - { - barrel = AIdHelper.larIsBarrel(id[index]); - } - catch (AAtlantisException e) - { - AOutput.append("Problem decoding ID " + id[index] + - " in " + CALORIMETER_NAME + ": " + e.getMessage(), - ALogPane.WARNING); - return Float.NEGATIVE_INFINITY; - } - - float r = Float.NEGATIVE_INFINITY; - if(barrel) - { - switch(layer) - { - case 0: r = 7.0f; - break; - case 1: r = 2.5f; - break; - case 2: r = Math.abs(this.eta[index]) < 0.8 ? 10.0f : 18.0f; - break; - case 3: r = 9.0f; - break; - } - } - else - { - r = 16.0f; - } - - return r; - - } // getADC2MevFactor() ------------------------------------------------- - */ - - - /** - * Returns calo hit info - * - * @param index int - * @return String - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",et[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",et[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",et[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",et[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String t = ""; - String cellInfo = ""; - - // if decoded ID is required and implemented for LAr ... - // String decodedId = AIdHelper.getDecodedTileIndentifier(id[index]); - // t = decodedId + " " + super.getHitInfo(index); - t = super.getHitInfo(index); - - cellInfo += "\n cell time = "; - cellInfo += (cellTime != null) ? Float.toString(cellTime[index]) + - " ns" : "n/a"; - cellInfo += "\n cell gain = "; - cellInfo += (cellGain != null) ? Integer.toString(cellGain[index]) : "n/a"; - cellInfo += "\n cell pedestal = "; - cellInfo += (cellPedestal != null) ? Float.toString(cellPedestal[index]) + - " ADC counts" : "n/a"; - - cellInfo += "\n ADC 2 MeV = "; - if(adc2Mev == null) - { - cellInfo += "n/a"; - } - else - { - // subtag adc2Mev was available in the event file - if(adc2Mev[index] != -1) - { - // other than -1: the factor was available in - // Athena (database) for this particular cell - cellInfo += Float.toString(adc2Mev[index]) + " (from database)"; - } - else - { - // -1 -> the factor wasn't available in Athena (database), - // use hardcoded constant for this particular cell - cellInfo += "-1 (n/a in database)"; - // see comment at getADC2MevFactorPredefined() method - // using predefined " + - // Float.toString(getADC2MevFactorPredefined(index)); - } - } - - cellInfo += pulseShapesDataAvailable ? "" : - "\n data for real pulse shapes plot n/a"; - - return t + cellInfo; - - } // getHitInfo() ------------------------------------------------------- - - @Override //ACalorimeterData - //Gives the hit time for this cell - protected double getTime(int hit) - { - if (cellTime == null) return 0.0; - else return cellTime[hit]; - } - - private void cutEnergyByLayer(String groupName, String parameterName, - String text, float[] array, int[] sampling, int currSampling) - { - AParameter par = parameterStore.get(groupName, parameterName); - - if(par.getStatus() && array != null) - { - double value = par.getD(); - String operator = par.getOperator(); - int num = 0; - - // this special cut shall have isMod="YES" attribute set, so - // par.isModulus() is true, thus only Math.abs() values are considered - if(operator.equals("<")) - { - for(int i = 0; i < numDraw; i++) - { - if(sampling[listdl[i]] == currSampling) - { - if(Math.abs(array[listdl[i]]) < value) - { - listdl[num++] = listdl[i]; - } - } - else - { - // don't check energy for other layers and don't cut - listdl[num++] = listdl[i]; - } - } - } - else if(operator.equals(">")) - { - // '>' really means '>=' for reals since they are real in - // from ascii file and don't have full precison - for(int i = 0; i < numDraw; i++) - { - if(sampling[listdl[i]] == currSampling) - { - if(Math.abs(array[listdl[i]]) >= value) - { - listdl[num++] = listdl[i]; - } - } - else - { - // don't check energy for other layers and don't cut - listdl[num++] = listdl[i]; - } - } - } - else - { - throw new Error(operator + " operator not sensible for floats"); - } - - numDraw = num; - } - - } // cutEnergyByLayer() ------------------------------------------------- - - - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsCalo", "LArET", "LArET", et); - cut("CutsCalo", "LArEnergy", "LArEnergy", energy); - - // energy cut (E) per layers - cutEnergyByLayer("CutsCalo", "LArEnergyLayer0", "LArEnergyLayer0", - energy, sampling, 0); - cutEnergyByLayer("CutsCalo", "LArEnergyLayer1", "LArEnergyLayer1", - energy, sampling, 1); - cutEnergyByLayer("CutsCalo", "LArEnergyLayer2", "LArEnergyLayer2", - energy, sampling, 2); - cutEnergyByLayer("CutsCalo", "LArEnergyLayer3", "LArEnergyLayer3", - energy, sampling, 3); - - // cut by LAr region (+- EndCap, All) - int cutSub = parameterStore.get("CutsCalo", "LAr").getI(); - if(cutSub != -1) - { - - int num = 0; - for(int i = 0; i < numDraw; i++) - { - - switch(cutSub){ - case 0: - if(side[listdl[i]] == -2 || side[listdl[i]] == -3){ - listdl[num++] = listdl[i]; - } - break; - case 1: - if(side[listdl[i]] == 2 || side[listdl[i]] == 3){ - listdl[num++] = listdl[i]; - } - break; - case 2: - if(Math.abs(side[listdl[i]]) != 1){ - listdl[num++] = listdl[i]; - } - break; - case 3: - if(Math.abs(side[listdl[i]]) == 1){ - listdl[num++] = listdl[i]; - } - break; - default: - break; - - - } - } - numDraw = num; - - } - } // applyCuts() -------------------------------------------------------- - - - /** - * Returns the name of the parameter group. - * - * @return String parameter group - */ - public String getParameterGroup() - { - return "LAr"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getName() - { - return "LAr"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getNameScreenName() - { - return "LAr"; - } - - /** - * Returns the type of calorimeter (ECAL/HCAL) for a hit. - * - * @param index int hit index - * @return String calorimeter type - */ - public String getCalorimeterType(int index) - { - return "ECAL"; - } - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - ACoord[] data = ACoord.NO_HISTOGRAMS; - int mode = parameterStore.get("YX", "Mode").getI(); - if ((projection instanceof AProjectionYX) && (mode == AProjectionYX.MODE_STANDARD || - mode == AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER || - mode == AProjectionYX.MODE_LAR_ENDCAP_1 || - mode == AProjectionYX.MODE_LAR_ENDCAP_2 || - mode == AProjectionYX.MODE_LAR_ENDCAP_3 || - mode == AProjectionYX.MODE_LAR_ENDCAP_SUMMED)) - data = getYXHistograms(); - else if (projection instanceof AProjectionFR) - data = getFRHistograms(); - else if (projection instanceof AProjectionRZ) - data = getRZHistograms(); - else if (projection instanceof AProjectionFZ) - data = getFZHistograms(); - return projection.nonLinearTransform(data); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ALVL1JetElementData.java b/graphics/AtlantisJava/src/atlantis/data/ALVL1JetElementData.java deleted file mode 100644 index a4aa50b1eaa6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ALVL1JetElementData.java +++ /dev/null @@ -1,446 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import java.awt.Color; - -import atlantis.canvas.AWindow; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.APolygon; - -public class ALVL1JetElementData extends AData -{ - private float[] energy; - private float[] eta; - private float[] deta; - private float[] phi; - private float[] dphi; - - ALVL1JetElementData(AHashMap p, AEvent e) - { - super(p,e); - - phi = p.getFloatArray("phi"); - eta = p.getFloatArray("eta"); - // here energy is actually Et - energy = p.getFloatArray("energy"); - - deta = new float[numData]; - dphi = new float[numData]; - - fillGranularity(); - } - - private void fillGranularity() - { - for(int i = 0; i < numData; ++i) - { - float positiveEta = Math.abs(eta[i]); - if(positiveEta <= 2.4) - { - deta[i] = 0.1f; - dphi[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 2.7) - { - deta[i] = 0.15f; - dphi[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 2.9) - { - deta[i] = 0.1f; - dphi[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 3.2) - { - deta[i] = 0.15f; - dphi[i] = (float) (Math.PI / 32.); - } - else - { - deta[i] = 0.9f; - dphi[i] = (float) (Math.PI / 16.); - } - } - } - - public double getEta(int index) - { - return eta[index]; - } - - public double getdEta(int index) - { - return deta[index]; - } - - public double getPhi(int index) - { - return phi[index]; - } - - public double getdPhi(int index) - { - return dphi[index]; - } - - public double getET(int index) - { - return energy[index]; - } - - public String getNameScreenName() - { - return "LVL1JetElement"; - } - - public String getParameterGroup() - { - return "LVL1JetElement"; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - "\n E="+String.format("%.3f",energy[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n Energy = "); - msg.append(String.format("%.3f",energy[index])); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",phi[index])); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - return msg.toString(); - } - - protected void applyCuts() - { - cutIndex(); - cut("CutsCalo", "LVL1TriggerET", " ET", energy); - cutPhi(phi, dphi); - cutEtaDEta(eta, deta); - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == 0) - colorByConstant(); - - return 1; - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - protected ACoord getYXUser() - { - makeDrawList(); - - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi[list]; - double phiMinus = phi[list] - dphi[list]; - double cosPlus = Math.cos(phiPlus); - double sinPlus = Math.sin(phiPlus); - double cosMinus = Math.cos(phiMinus); - double sinMinus = Math.sin(phiMinus); - - // Rho range of Calo Detector is about between [148.175, 386] - double rhoMax = 380; - double rhoMinus = 155; - - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double rhoPlus = rhoMax; - if(Math.abs(energy[list]) < maxEnergy) - rhoPlus = rhoMinus + (rhoMax - rhoMinus) * Math.abs(energy[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = rhoMinus * cosPlus; - hv[1][i][0] = rhoMinus * sinPlus; - // x1, y1 - hv[0][i][1] = rhoPlus * cosPlus; - hv[1][i][1] = rhoPlus * sinPlus; - // x2, y2 - hv[0][i][2] = rhoPlus * cosMinus; - hv[1][i][2] = rhoPlus * sinMinus; - // x3, y3 - hv[0][i][3] = rhoMinus * cosMinus; - hv[1][i][3] = rhoMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getFRUser() - { - ACoord coordFR = getYXUser().convertYXToFR().includePhiWrapAround("FR"); - return coordFR; - } - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list]-phiMid); - double rSign; - if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) - rSign = -1; - else - rSign = 1; - - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta[list]))) * 2.0; - double thetaPlus = Math.atan(Math.exp(-(Math.abs(eta[list]) - deta[list]))) * 2.0; - double thetaMinus = Math.atan(Math.exp(-(Math.abs(eta[list]) + deta[list]))) * 2.0; - - if ((eta[list] > 0.) && (rSign == -1)) - { - theta = 2 * Math.PI - theta; - thetaPlus = 2 * Math.PI - thetaPlus; - thetaMinus = 2 * Math.PI - thetaMinus; - } - else if ((eta[list] < 0.) && (rSign == -1)) - { - theta += Math.PI; - thetaPlus += Math.PI; - thetaMinus += Math.PI; - } - else if ((eta[list] < 0.) && (rSign == 1)) - { - theta = Math.PI - theta; - thetaPlus = Math.PI - thetaPlus; - thetaMinus = Math.PI - thetaMinus; - } - - double cosPlus = Math.cos(thetaPlus); - double sinPlus = Math.sin(thetaPlus); - double cosMinus = Math.cos(thetaMinus); - double sinMinus = Math.sin(thetaMinus); - - // decide the region based on the theta value - final byte LAR = 0; - final byte LAR_ENDCAP = 1; - final byte FCAL_EM = 2; - byte region = LAR; - // hard-coded value is based on the values in AGeometry.xml - if(Math.abs(Math.tan(theta)) >= 0.0778 && Math.abs(Math.tan(theta)) < 0.4828) - region = LAR_ENDCAP; - else if(Math.abs(Math.tan(theta)) < 0.0778) - region = FCAL_EM; - - double radiusMinus = 0.; - switch(region) - { - // use fixed rho/z to determine the lower radius value - case LAR: - radiusMinus = 155 / Math.abs(Math.sin(theta)); - break; - case LAR_ENDCAP: - radiusMinus = 380 / Math.abs(Math.cos(theta)); - break; - case FCAL_EM: - radiusMinus = 470 / Math.abs(Math.cos(theta)); - break; - } - double radiusMax = radiusMinus + 200; - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double radiusPlus = radiusMax; - if(Math.abs(energy[list]) < maxEnergy) - radiusPlus = radiusMinus + (radiusMax - radiusMinus) * Math.abs(energy[list]) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = radiusMinus * cosPlus; - hv[1][i][0] = radiusMinus * sinPlus; - // x1, y1 - hv[0][i][1] = radiusPlus * cosPlus; - hv[1][i][1] = radiusPlus * sinPlus; - // x2, y2 - hv[0][i][2] = radiusPlus * cosMinus; - hv[1][i][2] = radiusPlus * sinMinus; - // x3, y3 - hv[0][i][3] = radiusMinus * cosMinus; - hv[1][i][3] = radiusMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getVPUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - h[i]=eta[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP) - { - ACoord centers=getUser(projection); - - int[] drawlist=centers.index; - double[] density = new double[drawlist.length]; - double maxDensity = 0.0; - double[][][] hv=new double[2][drawlist.length][4]; // cell - int[] index = new int[drawlist.length]; - ACoord geoCell; - - for(int i=0; i<drawlist.length; ++i) - { - int list=drawlist[i]; - // y coordinate of four cell corners - hv[1][i][0] = centers.hv[1][0][i] + Math.toDegrees(getdPhi(list)); - hv[1][i][1] = centers.hv[1][0][i] - Math.toDegrees(getdPhi(list)); - hv[1][i][2] = centers.hv[1][0][i] - Math.toDegrees(getdPhi(list)); - hv[1][i][3] = centers.hv[1][0][i] + Math.toDegrees(getdPhi(list)); - // x coordinate of four cell corners - hv[0][i][0] = centers.hv[0][0][i] - getdEta(list); - hv[0][i][1] = centers.hv[0][0][i] - getdEta(list); - hv[0][i][2] = centers.hv[0][0][i] + getdEta(list); - hv[0][i][3] = centers.hv[0][0][i] + getdEta(list); - - index[i] = list; - - // calculate density for all cells, and find min and max density - density[i] = Math.abs(energy[list]) / (getdPhi(list) * getdEta(list)); - if(i == 0) - maxDensity = density[i]; - else - { - if (density[i] > maxDensity) - maxDensity = density[i]; - } - } - - geoCell = window.calculateDisplay(new ACoord(hv, index, this, ACoord.POLYGONS)); - drawGeometry(geoCell, window, ag); - for (int i = 0; i < density.length; i++) - { - double factor = Math.sqrt(density[i] / maxDensity); - APolygon.scale(geoCell.hv[0][i], geoCell.hv[1][i], factor); - } - - drawHits(geoCell, window, ag); - } - else - { - super.draw(window, ag, projection); - } - } - - private void drawGeometry(ACoord display, AWindow window, AGraphics ag) - { - Color[] colorMap = AColorMap.getColors(); - boolean drawCellGeometry = parameterStore.get(getParameterGroup(), "CellGeometry").getStatus(); - boolean drawCellOutline = parameterStore.get(getParameterGroup(), "CellOutline").getStatus(); - int cellGeometryColor = parameterStore.get(getParameterGroup(), "CellGeometry").getI(); - int cellOutlineColor = parameterStore.get(getParameterGroup(), "CellOutline").getI(); - boolean drawFrame = parameterStore.get(getParameterGroup(), "Frame").getStatus(); - int frameColor = parameterStore.get(getParameterGroup(), "Frame").getI(); - int frameWidth = parameterStore.get(getParameterGroup(), "FrameWidth").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - drawFrame=true; - else - drawFrame=false; - - if(!drawCellGeometry && !drawCellOutline) - return; - - // Draw geometry - for(int i=0; i<display.hv[0].length; ++i) - { - if(drawCellGeometry) - { - if(drawFrame) - { - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 1, 0, frameWidth, 0)); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - ag.updateDrawParameters(new ADrawParameters(true, cellGeometryColor, 1, 0, 0, 0)); - ag.fillPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - if(drawCellOutline) - { - ag.setColor(colorMap[cellOutlineColor]); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - - private void drawHits(ACoord display, AWindow window, AGraphics ag) - { - int[] color = this.getColor(display.index); - - boolean drawCellGeometry = parameterStore.get(getParameterGroup(), "CellGeometry").getStatus(); - boolean drawFrame = parameterStore.get(getParameterGroup(), "Frame").getStatus(); - int frameColor = parameterStore.get(getParameterGroup(), "Frame").getI(); - int frameWidth = parameterStore.get(getParameterGroup(), "FrameWidth").getI(); - - // draw frame - if (drawFrame && !drawCellGeometry) - { - for (int i = 0; i < display.hv[0].length; i++) - { - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 1, 0, frameWidth, 0)); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - - // draw hits - for(int i=0; i<display.hv[0].length; ++i) - { - int lineWidth = parameterStore.get(getParameterGroup(), "LineWidth").getI(); - ag.updateDrawParameters(new ADrawParameters(true, color[i], 1, lineWidth, 0, 0)); - ag.fillPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ALVL1ResultData.java b/graphics/AtlantisJava/src/atlantis/data/ALVL1ResultData.java deleted file mode 100755 index db7dc97e2b1d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ALVL1ResultData.java +++ /dev/null @@ -1,292 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.event.*; -import atlantis.utils.AHashMap; - -public class ALVL1ResultData extends AData -{ - private String[] ctpItemList; - private String[] itemListL2; - private String[] itemListEF; - private int[] ctpWord0; - private int[] ctpWord1; - private int[] ctpWord2; - private float[] energyEtMiss; - //private float[] energyEx; - //private float[] energyEy; - private float[] energySumEt; - private int[] passedL1; - private int[] passedL2; - private int[] passedEF; - private int[] passedTrigger; - private String[] prescaleListEF; - private String[] prescaleListL1; - private String[] prescaleListL2; - - ALVL1ResultData(AHashMap p, AEvent e) - { - super(p,e); - - ctpItemList = p.getStringArray("ctpItemList"); - itemListL2 = p.getStringArray("itemListL2"); - itemListEF = p.getStringArray("itemListEF"); - ctpWord0 = p.getUnknownIntArray("ctpWord0"); - ctpWord1 = p.getUnknownIntArray("ctpWord1"); - ctpWord2 = p.getUnknownIntArray("ctpWord2"); - energyEtMiss = p.getUnknownFloatArray("energyEtMiss"); - //energyEx = p.getUnknownFloatArray("energyEx"); - //energyEy = p.getUnknownFloatArray("energyEy"); - energySumEt = p.getUnknownFloatArray("energySumEt"); - passedL1 = p.getUnknownIntArray("passedL1"); - passedL2 = p.getUnknownIntArray("passedL2"); - passedEF = p.getUnknownIntArray("passedEF"); - passedTrigger = p.getUnknownIntArray("passedTrigger"); - //check for backward compatibility - prescaleListEF = (p.get("prescaleListEF") != null) ? p.getStringArray("prescaleListEF"): null; - prescaleListL1 = (p.get("prescaleListL1") != null) ? p.getStringArray("prescaleListL1"): null; - prescaleListL2 = (p.get("prescaleListL2") != null) ? p.getStringArray("prescaleListL2"): null; - } - - protected void applyCuts() - {} - - public String getHitInfo(int index) - { - return "LVL1Result"; - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == 0) - colorByConstant(); - - return 3; - } - - public String getParameterGroup() - { - return "LVL1Result"; - } - - public String getNameScreenName() - { - return "LVL1Result"; - } - - public String getCtpItemList(int index) - { - return ctpItemList[index]; - } - - /** - * Returns the individual parts of the list seperated by - - * By using cleanup removes L1 from the item - */ - public String[] getCtpItemListSplit(int index, boolean cleanUp) - { - if(ctpItemList!=null) - { - if(cleanUp) - return splitItems(ctpItemList[index], "L1"); - else - return splitItems(ctpItemList[index]); - } - else - return null; - } - - public String getitemListL2(int index) - { - return itemListL2[index]; - } - - /** - * Returns the individual parts of the list seperated by - - * By using cleanup removes L2 from the item - */ - public String[] getitemListL2Split(int index, boolean cleanUp) - { - if(itemListL2!=null) - { - if(cleanUp) - return splitItems(itemListL2[index], "L2"); - else - return splitItems(itemListL2[index]); - } - else - return null; - } - - public String getitemListEF(int index) - { - return itemListEF[index]; - } - - /** - * Returns the individual parts of the list seperated by - - * By using cleanup removes EF from the item - */ - public String[] getitemListEFSplit(int index, boolean cleanUp) - { - if(itemListEF!=null) - { - if(cleanUp) - return splitItems(itemListEF[index], "EF"); - else - return splitItems(itemListEF[index]); - } - else - return null; - } - - public int getCtpWord0(int index) - { - return ctpWord0[index]; - } - - public String getBinaryCtpWord0(int index) - { - return Integer.toBinaryString(ctpWord0[index]); - } - - public int getCtpWord1(int index) - { - return ctpWord1[index]; - } - - public int getCtpWord2(int index) - { - return ctpWord2[index]; - } - - /** - * This method is needed for backward compatibility - * New xml files store this in ATriggerInfoData - */ - public float getEnergyEtMiss(int index) - { - return energyEtMiss[index]; - } - - /*public float getEnergyEx(int index) - { - return energyEx[index]; - } - public float getEnergyEy(int index) - { - return energyEy[index]; - }*/ - - /** - * This method is needed for backward compatibility - * New xml files store this in ATriggerInfoData - */ - public float getEnergySumEt(int index) - { - return energySumEt[index]; - } - - public int getPassedL1(int index) - { - return passedL1[index]; - } - - public int getPassedL2(int index) - { - return passedL2[index]; - } - - public int getPassedEF(int index) - { - return passedEF[index]; - } - - public int getPassedTrigger(int index) - { - return passedTrigger[index]; - } - - public String getPrescaleListEF(int index) - { - return prescaleListEF[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getPrescaleListEFSplit(int index) - { - if(prescaleListEF!=null) - return splitItems(prescaleListEF[index]); - else - return null; - } - - public String getPrescaleListL1(int index) - { - return prescaleListL1[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getPrescaleListL1Split(int index) - { - if(prescaleListL1!=null) - return splitItems(prescaleListL1[index]); - else - return null; - } - - public String getPrescaleListL2(int index) - { - return prescaleListL2[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getPrescaleListL2Split(int index) - { - if(prescaleListL2!=null) - return splitItems(prescaleListL2[index]); - else - return null; - } - - /** - * Function that seperates an item list and carries out cleanup - */ - private String[] splitItems(String origItems, String level) - { - //string array to hold individual items - String[] newItems=splitItems(origItems); - //remove letters from start of item and duplicated names - char[] levelChar = level.toCharArray(); - for(int i=0; i<newItems.length; i++) - { - char[] newItemsChar = newItems[i].toCharArray(); - if(newItemsChar[0]==levelChar[0] && newItemsChar[1]==levelChar[1]) - { - if(newItemsChar[2]=='_') - newItems[i]=newItems[i].substring(3); - else - newItems[i]=newItems[i].substring(2); - //get rid of duplicated parts of name - char[] newItemsChar2 = newItems[i].toCharArray(); - for(int j=0; j<newItemsChar2.length-1; j++) - { - if(newItemsChar2[j]==levelChar[0] && newItemsChar2[j+1]==levelChar[1]) - { - newItems[i]=newItems[i].substring(0, j); - break; - } - } - } - } - return newItems; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ALVL1TriggerTowerData.java b/graphics/AtlantisJava/src/atlantis/data/ALVL1TriggerTowerData.java deleted file mode 100644 index 9cfef1013428..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ALVL1TriggerTowerData.java +++ /dev/null @@ -1,800 +0,0 @@ -package atlantis.data; - -import java.util.Arrays; - -import atlantis.canvas.AWindow; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.list.AListManager; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.APolygon; - -public class ALVL1TriggerTowerData extends AData -{ - public static final boolean ELECTROMAGNETIC = true; - public static final boolean HADRONIC = false; - - // here energy is actually Et - private float[] emEnergy; - private float[] hadEnergy; - private float[] sumEnergy; - private float[] eta; - private float[] deta_em; - private float[] deta_had; - private float[] phi; - private float[] dphi_em; - private float[] dphi_had; - private int[] numADC; - private int[][] hadADC; - private int[][] emADC; - private int[] emBCID; - private int[] hadBCID; - private int[] isEMSaturated; - private int[] isHadSaturated; - - ALVL1TriggerTowerData(AHashMap p, AEvent e) - { - super(p,e); - - phi = p.getFloatArray("phi"); - eta = p.getFloatArray("eta"); - emEnergy = p.getFloatArray("emEnergy"); - hadEnergy = p.getFloatArray("hadEnergy"); - sumEnergy = p.getFloatArray("sumEnergy"); - - deta_em = new float[numData]; - deta_had = new float[numData]; - dphi_em = new float[numData]; - dphi_had = new float[numData]; - - fillGranularity(); - - numADC = p.getIntArray("numADC"); - emADC = fillADC(p.getIntArray("emADC")); - hadADC = fillADC(p.getIntArray("hadADC")); - emBCID = p.getIntArray("emBCID"); - hadBCID = p.getIntArray("hadBCID"); - isEMSaturated = p.getIntArray("isEMSaturated"); - isHadSaturated = p.getIntArray("isHadSaturated"); - } - - private void fillGranularity() - { - for(int i = 0; i < numData; ++i) - { - float positiveEta = Math.abs(eta[i]); - if(positiveEta <= 2.4) - { - deta_em[i] = 0.05f; - dphi_em[i] = (float) (Math.PI / 64.); - deta_had[i] = 0.05f; - dphi_had[i] = (float) (Math.PI / 64.); - } - else if(positiveEta <= 2.5) - { - deta_em[i] = 0.05f; - dphi_em[i] = (float) (Math.PI / 64.); - deta_had[i] = 0.1f; - dphi_had[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 3.0) - { - deta_em[i] = 0.1f; - dphi_em[i] = (float) (Math.PI / 32.); - deta_had[i] = 0.1f; - dphi_had[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 3.1) - { - deta_em[i] = 0.1f; - dphi_em[i] = (float) (Math.PI / 32.); - deta_had[i] = 0.05f; - dphi_had[i] = (float) (Math.PI / 32.); - } - else if(positiveEta <= 3.2) - { - deta_em[i] = 0.05f; - dphi_em[i] = (float) (Math.PI / 32.); - deta_had[i] = 0.2f; - dphi_had[i] = (float) (Math.PI / 16.); - } - else if(positiveEta <= 4.3) - { - deta_em[i] = 0.2f; - dphi_em[i] = (float) (Math.PI / 16.); - deta_had[i] = 0.2f; - dphi_had[i] = (float) (Math.PI / 16.); - } - else if(positiveEta <= 4.4) - { - deta_em[i] = 0.2f; - dphi_em[i] = (float) (Math.PI / 16.); - deta_had[i] = 0.35f; - dphi_had[i] = (float) (Math.PI / 16.); - } - else - { - deta_em[i] = 0.3f; - dphi_em[i] = (float) (Math.PI / 16.); - deta_had[i] = 0.35f; - dphi_had[i] = (float) (Math.PI / 16.); - } - } - } - - public int[][] fillADC(int[] tempADC) - { - int[][] ADC=null; - if(tempADC!=null) - { - ADC= new int[numADC.length][0]; - int num=0; - for(int i=0; i<numADC.length; i++) - { - // multiple numbers are associated with each cell - ADC[i]=new int[numADC[i]]; - for(int j=0; j<numADC[i]; j++) - { - ADC[i][j]=tempADC[num]; // fill in array for each cell - num++; - } - } - } // if(ADC != null) - return ADC; - } - - public void plotPulseShapes(int index) - { - if(emADC!=null && hadADC!=null) - { - //int[][] data={hadADC[index],emADC[index]}; - String[] labels={"EM trigger ADC counts","HAD trigger ADC counts","Sum trigger ADC counts"}; - int[] sumADC= new int[emADC[index].length]; - String[] axis= new String[3]; - String[] colors = new String[3]; - //EM plot - if(isEMSaturated[index]==0) - colors[0]="blue"; - else - colors[0]="red"; - axis[0]="index (BCID="+emBCID[index]+")"; - //HAD plot - if(isHadSaturated[index]==0) - colors[1]="blue"; - else - colors[0]="red"; - axis[1]="index (BCID="+hadBCID[index]+")"; - //Sum plot - colors[2]="blue"; - axis[2]="index"; - for(int i=0; i<emADC[index].length; i++) - { - sumADC[i]=emADC[index][i]+hadADC[index][i]; - } - int[][] data={emADC[index],hadADC[index],sumADC}; - String title="LVL1TriggerTower " + id[index] + " ADC counts"; - APulseShapePlot.plotADCCounts(data, title, axis, labels, colors); - } - else - { - if(emADC!=null) - { - int[][] data={emADC[index]}; - String[] axis={"index"}; - APulseShapePlot.plotADCCounts(data, "EM trigger ADC counts", axis); - } - if(hadADC!=null) - { - int[][] data={hadADC[index]}; - String[] axis={"index"}; - APulseShapePlot.plotADCCounts(data, "HAD trigger ADC counts", axis); - } - } - } - - public double getEta(int index) - { - return eta[index]; - } - - public double getdEta(int index, boolean emOrHad) - { - if(emOrHad == ELECTROMAGNETIC) - return deta_em[index]; - else - return deta_had[index]; - } - - public double getPhi(int index) - { - return phi[index]; - } - - public double getdPhi(int index, boolean emOrHad) - { - if(emOrHad == ELECTROMAGNETIC) - return dphi_em[index]; - else - return dphi_had[index]; - } - - public double getET(int index, boolean emOrHad) - { - if(emOrHad == ELECTROMAGNETIC) - return emEnergy[index]; - else - return hadEnergy[index]; - } - - public double getSumET(int index) - { - return sumEnergy[index]; - } - - public String getNameScreenName() - { - return "LVL1TriggerTower"; - } - - public String getParameterGroup() - { - return "LVL1TriggerTower"; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - "\n E="+String.format("%.3f",sumEnergy[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n EM Energy = "); - msg.append(String.format("%.3f",emEnergy[index])); - msg.append(" GeV\n Had Energy = "); - msg.append(String.format("%.3f",hadEnergy[index])); - msg.append(" GeV\n Sum Energy = "); - msg.append(String.format("%.3f",sumEnergy[index])); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - return msg.toString(); - } - - protected void applyCuts() - { - cutIndex(); - cut("CutsCalo", "LVL1TriggerET", " ET", sumEnergy); - } - - public void applyEMCuts() - { - cutPhi(phi, dphi_em); - cutEtaDEta(eta, deta_em); - } - - public void applyHadCuts() - { - cutPhi(phi, dphi_had); - cutEtaDEta(eta, deta_had); - } - - public byte[] getColor(boolean emOrHad) - { - internalColor(emOrHad); - coloring(); - byte[] temp = new byte[id.length]; - for(int i = 0; i < temp.length; i++) - temp[i] = color[getIndexFromId(id[i])]; - return temp; - } - - /* - * Returns the colours of the trigger tower cells - * If this method is used then internalColor(boolean emOrHad) - * must be called first elsewhere - */ - public int[] getColor(int[] dl) - { - coloring(); - int[] temp = new int[dl.length]; - - for(int i = 0; i < temp.length; i++) - temp[i] = color[dl[i]]; - return temp; - } - - /* - * Colour the cells if in lists or picked - * If this method is used then internalColor(boolean emOrHad) - * must be called first elsewhere - */ - public void coloring() - { - int[][] temp = AListManager.getInstance().getColorMapping(this); - int[] index = temp[0]; - int[] c = temp[1]; - // now add in colours specified in lists - - for(int i = 0; i < index.length; ++i) - if(c[i] >= 0) - color[index[i]] = (byte) c[i]; - int others = AListManager.getInstance().getColorOfOthers(); - // need to check if this data could have been picked - // so that colouring of hits by STr works even if STr - // is not in list because it wasn't on.... - if(others >= 0 && parameterStore.get("Data", getName()).getStatus()) - { - boolean[] inList = new boolean[numData]; - for(int i = 0; i < index.length; ++i) - inList[index[i]] = true; - - for(int i = 0; i < numData; ++i) - if(!inList[i]) - color[i] = (byte) others; - } - } - - protected int internalColor() - { - colorByConstant(); - return 1; - } - - protected int internalColor(boolean emOrHad) - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if(colorFunction == 0) - colorByConstant(); - else if(colorFunction ==1) - { - if(emOrHad == ELECTROMAGNETIC) - Arrays.fill(color, (byte) (parameterStore.get("Det", "ECALFill").getI() + 12)); - else - Arrays.fill(color, (byte) (parameterStore.get("Det", "HCALFill").getI() + 12)); - } - return 1; - } - - protected int getDrawOrFill() - { - return AGraphics.FILL; - } - - private void drawVP(AWindow window, AGraphics ag, boolean emOrHad) - { - ACoord centers = getVPUser(emOrHad); - - if(centers == null) - return; - - int[] drawlist = centers.index; - double[] density = new double[drawlist.length]; - double[] sumDensity = new double[drawlist.length]; - double maxDensity = 0.0; - double[][][] hv = new double[2][drawlist.length][4]; // cell - int[] index = new int[drawlist.length]; - ACoord geoCell; - - for(int i=0; i<drawlist.length; ++i) - { - int list = drawlist[i]; - // y coordinate of four cell corners - hv[1][i][0] = centers.hv[1][0][i] + Math.toDegrees(getdPhi(list, emOrHad)); - hv[1][i][1] = centers.hv[1][0][i] - Math.toDegrees(getdPhi(list, emOrHad)); - hv[1][i][2] = centers.hv[1][0][i] - Math.toDegrees(getdPhi(list, emOrHad)); - hv[1][i][3] = centers.hv[1][0][i] + Math.toDegrees(getdPhi(list, emOrHad)); - // x coordinate of four cell corners - hv[0][i][0] = centers.hv[0][0][i] - getdEta(list, emOrHad); - hv[0][i][1] = centers.hv[0][0][i] - getdEta(list, emOrHad); - hv[0][i][2] = centers.hv[0][0][i] + getdEta(list, emOrHad); - hv[0][i][3] = centers.hv[0][0][i] + getdEta(list, emOrHad); - - index[i] = list; - - // calculate density for all cells, and find min and max density - density[i] = Math.abs(getET(list, emOrHad)) / (getdPhi(list, emOrHad) * getdEta(list, emOrHad)); - sumDensity[i] = Math.abs(getSumET(list)) / (getdPhi(list, emOrHad) * getdEta(list, emOrHad)); - if(i == 0) - maxDensity = sumDensity[i]; - else - { - if (sumDensity[i] > maxDensity) - maxDensity = sumDensity[i]; - } - } - - geoCell = window.calculateDisplay(new ACoord(hv, index, this, ACoord.POLYGONS)); - drawGeometry(geoCell, window, ag, density); - for (int i = 0; i < density.length; i++) - { - double factor = Math.sqrt(density[i] / maxDensity); - APolygon.scale(geoCell.hv[0][i], geoCell.hv[1][i], factor); - } - - drawHits(geoCell, window, ag, density); - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - int energyType = parameterStore.get(PARAMETER_GROUP, "EnergyType").getI(); - if(projection instanceof AProjectionYX) - { - if(energyType == 0 || energyType == 2) - { - internalColor(ELECTROMAGNETIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getYXUser(ELECTROMAGNETIC)))); - } - if(energyType == 1 || energyType == 2) - { - internalColor(HADRONIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getYXUser(HADRONIC)))); - } - } - else if(projection instanceof AProjectionFR) - { - if(energyType == 0 || energyType == 2) - { - internalColor(ELECTROMAGNETIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getFRUser(ELECTROMAGNETIC)))); - } - if(energyType == 1 || energyType == 2) - { - internalColor(HADRONIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getFRUser(HADRONIC)))); - } - } - else if(projection instanceof AProjectionRZ) - { - if(energyType == 0 || energyType == 2) - { - internalColor(ELECTROMAGNETIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getRZUser(ELECTROMAGNETIC)))); - } - if(energyType == 1 || energyType == 2) - { - internalColor(HADRONIC); - ag.draw(window.calculateDisplay(projection.nonLinearTransform(getRZUser(HADRONIC)))); - } - } - else if(projection instanceof AProjectionVP) - { - if(energyType == 0 || energyType == 2) - { - internalColor(ELECTROMAGNETIC); - drawVP(window, ag, ELECTROMAGNETIC); - } - if(energyType == 1 || energyType == 2) - { - internalColor(HADRONIC); - drawVP(window, ag, HADRONIC); - } - } - else - { - super.draw(window, ag, projection); - } - } - - private ACoord getYXUser(boolean emOrHad) - { - makeDrawList(); - if(emOrHad == ELECTROMAGNETIC) - applyEMCuts(); - else - applyHadCuts(); - - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double et = getET(list, emOrHad); - if(et == 0.0) - continue; - double dphi = getdPhi(list, emOrHad); - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - double cosPlus = Math.cos(phiPlus); - double sinPlus = Math.sin(phiPlus); - double cosMinus = Math.cos(phiMinus); - double sinMinus = Math.sin(phiMinus); - - double rhoMax; - double rhoMinus; - - if(emOrHad == ELECTROMAGNETIC) - { - // Rho range of LAr Detector (EM) is about between [148.175, 198.47] - rhoMax = 195; - rhoMinus = 155; - } - else - { - // Rho range of TILE Detector (Had) is about between [229, 386] - rhoMax = 380; - rhoMinus = 235; - } - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double rhoPlus = rhoMax; - if(Math.abs(et) < maxEnergy) - rhoPlus = rhoMinus + (rhoMax - rhoMinus) * Math.abs(et) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = rhoMinus * cosPlus; - hv[1][i][0] = rhoMinus * sinPlus; - // x1, y1 - hv[0][i][1] = rhoPlus * cosPlus; - hv[1][i][1] = rhoPlus * sinPlus; - // x2, y2 - hv[0][i][2] = rhoPlus * cosMinus; - hv[1][i][2] = rhoPlus * sinMinus; - // x3, y3 - hv[0][i][3] = rhoMinus * cosMinus; - hv[1][i][3] = rhoMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getFRUser(boolean emOrHad) - { - ACoord coordFR = getYXUser(emOrHad).convertYXToFR().includePhiWrapAround("FR"); - return coordFR; - } - - protected ACoord getRZUser(boolean emOrHad) - { - makeDrawList(); - if(emOrHad == ELECTROMAGNETIC) - applyEMCuts(); - else - applyHadCuts(); - - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - double et = getET(list, emOrHad); - if(et == 0.0) - continue; - - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list]-phiMid); - double rSign; - if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) - rSign = -1; - else - rSign = 1; - - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta[list]))) * 2.0; - double deta = getdEta(list, emOrHad); - double thetaPlus = Math.atan(Math.exp(-(Math.abs(eta[list]) - deta))) * 2.0; - double thetaMinus = Math.atan(Math.exp(-(Math.abs(eta[list]) + deta))) * 2.0; - - if ((eta[list] > 0.) && (rSign == -1)) - { - theta = 2 * Math.PI - theta; - thetaPlus = 2 * Math.PI - thetaPlus; - thetaMinus = 2 * Math.PI - thetaMinus; - } - else if ((eta[list] < 0.) && (rSign == -1)) - { - theta += Math.PI; - thetaPlus += Math.PI; - thetaMinus += Math.PI; - } - else if ((eta[list] < 0.) && (rSign == 1)) - { - theta = Math.PI - theta; - thetaPlus = Math.PI - thetaPlus; - thetaMinus = Math.PI - thetaMinus; - } - - double cosPlus = Math.cos(thetaPlus); - double sinPlus = Math.sin(thetaPlus); - double cosMinus = Math.cos(thetaMinus); - double sinMinus = Math.sin(thetaMinus); - - // decide the region based on the theta value - final byte LAR = 0; - final byte LAR_ENDCAP = 1; - final byte FCAL_EM = 2; - byte region = LAR; - // hard-coded value is based on the values in AGeometry.xml - if(Math.abs(Math.tan(theta)) >= 0.0778 && Math.abs(Math.tan(theta)) < 0.4828) - region = LAR_ENDCAP; - else if(Math.abs(Math.tan(theta)) < 0.0778) - region = FCAL_EM; - - double radiusMinus = 0.; - double radiusMax = 0.; - switch(region) - { - // use fixed rho/z to determine the lower radius value - case LAR: - if(emOrHad == ELECTROMAGNETIC) - { - radiusMax = 195 / Math.abs(Math.sin(theta)); - radiusMinus = 155 / Math.abs(Math.sin(theta)); - } - else - { - radiusMax = 380 / Math.abs(Math.sin(theta)); - radiusMinus = 235 / Math.abs(Math.sin(theta)); - } - break; - case LAR_ENDCAP: - if(emOrHad == ELECTROMAGNETIC) - { - radiusMax = 420 / Math.abs(Math.cos(theta)); - radiusMinus = 380 / Math.abs(Math.cos(theta)); - } - else - { - radiusMax = 585 / Math.abs(Math.cos(theta)); - radiusMinus = 440 / Math.abs(Math.cos(theta)); - } - break; - case FCAL_EM: - if(emOrHad == ELECTROMAGNETIC) - { - radiusMax = 510 / Math.abs(Math.cos(theta)); - radiusMinus = 470 / Math.abs(Math.cos(theta)); - } - else - { - radiusMax = 600 / Math.abs(Math.cos(theta)); - radiusMinus = 520 / Math.abs(Math.cos(theta)); - } - break; - } - - double maxEnergy = parameterStore.get("Projection", "EnergyMax").getD(); - double radiusPlus = radiusMax; - if(Math.abs(et) < maxEnergy) - radiusPlus = radiusMinus + (radiusMax - radiusMinus) * Math.abs(et) / maxEnergy; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = radiusMinus * cosPlus; - hv[1][i][0] = radiusMinus * sinPlus; - // x1, y1 - hv[0][i][1] = radiusPlus * cosPlus; - hv[1][i][1] = radiusPlus * sinPlus; - // x2, y2 - hv[0][i][2] = radiusPlus * cosMinus; - hv[1][i][2] = radiusPlus * sinMinus; - // x3, y3 - hv[0][i][3] = radiusMinus * cosMinus; - hv[1][i][3] = radiusMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getVPUser(boolean emOrHad) - { - makeDrawList(); - if(emOrHad == ELECTROMAGNETIC) - applyEMCuts(); - else - applyHadCuts(); - - if(numDraw == 0) - return null; - - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index=new int[numDraw]; - - for(int i=0; i<numDraw; i++) - { - int list=listdl[i]; - h[i]=eta[list]; - v[i]=Math.toDegrees(phi[list]); - index[i]=list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - private void drawGeometry(ACoord display, AWindow window, AGraphics ag, double[] density) - { - boolean drawCellGeometry = parameterStore.get(getParameterGroup(), "CellGeometry").getStatus(); - boolean drawCellOutline = parameterStore.get(getParameterGroup(), "CellOutline").getStatus(); - int cellGeometryColor = parameterStore.get(getParameterGroup(), "CellGeometry").getI(); - int cellOutlineColor = parameterStore.get(getParameterGroup(), "CellOutline").getI(); - boolean drawFrame = parameterStore.get(getParameterGroup(), "Frame").getStatus(); - int frameColor = parameterStore.get(getParameterGroup(), "Frame").getI(); - int frameWidth = parameterStore.get(getParameterGroup(), "FrameWidth").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - drawFrame = true; - else - drawFrame = false; - - if(!drawCellGeometry && !drawCellOutline) - return; - - // Draw geometry - for(int i=0; i<display.hv[0].length; ++i) - { - if(density[i] == 0.0) - continue; - - if(drawCellGeometry) - { - if(drawFrame) - { - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 1, 0, frameWidth, 0)); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - ag.updateDrawParameters(new ADrawParameters(true, cellGeometryColor, 1, 0, 0, 0)); - ag.fillPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - if(drawCellOutline) - { - ag.updateDrawParameters(new ADrawParameters(true, cellOutlineColor, 0, 1, 0, 0, false, 1, 0)); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - } - } - - private void drawHits(ACoord display, AWindow window, AGraphics ag, double[] density) - { - int[] color = this.getColor(display.index); - - boolean drawCellGeometry = parameterStore.get(getParameterGroup(), "CellGeometry").getStatus(); - boolean drawFrame = parameterStore.get(getParameterGroup(), "Frame").getStatus(); - int frameColor = parameterStore.get(getParameterGroup(), "Frame").getI(); - int frameWidth = parameterStore.get(getParameterGroup(), "FrameWidth").getI(); - int lineWidth = parameterStore.get(getParameterGroup(), "LineWidth").getI(); - - for(int i=0; i<display.hv[0].length; ++i) - { - if(density[i] == 0.0) - continue; - - // draw frame - if (drawFrame && !drawCellGeometry) - { - ag.updateDrawParameters(new ADrawParameters(true, frameColor, 1, 0, frameWidth, 0)); - ag.drawPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - } - - // draw hits - ag.updateDrawParameters(new ADrawParameters(true, color[i], 1, lineWidth, 0, 0)); - ag.setCurrentDataAndIndex(this, display.index[i]); - ag.fillPolygon(display.hv[0][i], display.hv[1][i], display.hv[0][i].length); - ag.clearCurrentDataAndIndex(); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ALegoData.java b/graphics/AtlantisJava/src/atlantis/data/ALegoData.java deleted file mode 100755 index 9c2593e53eda..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ALegoData.java +++ /dev/null @@ -1,1042 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.event.*; -import java.awt.Color; -import java.awt.geom.Point2D; - -import java.util.Iterator; -import java.util.List; -import java.util.Stack; - -import atlantis.canvas.AWindow; -import atlantis.graphics.AGraphics; -import atlantis.graphics.ALegoDraw; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -public class ALegoData -{ - private static ALogger logger = ALogger.getLogger(ALegoData.class); - - private static APar parameterStore = APar.instance(); - - /** - * This function loops over the cell data to find the maxEt. - * It also rescales the height of the cells if different scales are selected - * @param lego the tower heights - * @return maxEt the heighest tower height - */ - public static double findMaxEt(double[][][] lego) - { - double maxEt = 0.0; - double[][] legosum = new double[lego.length][lego[0].length]; - //find colors to loop over - int largestColourIndex=0; - int lowestColourIndex=AProjectionLegoPlot.nLayers; - Iterator colorIterator = AProjectionLegoPlot.colorset.iterator(); - while(colorIterator.hasNext()) - { - int currentColor = ((Integer) colorIterator.next()).intValue(); - if(currentColor>largestColourIndex) - largestColourIndex=currentColor; - if(currentColor<lowestColourIndex) - lowestColourIndex=currentColor; - } - for (int x = AProjectionLegoPlot.nPhiCells - 1; x >= 0; --x) - { - for (int y = 0; y < AProjectionLegoPlot.nEtaCells; ++y) - { - for(int z=largestColourIndex; z>=lowestColourIndex; z--) - { - legosum[x][y] += lego[x][y][z]; - } - if(legosum[x][y] > maxEt) - maxEt = legosum[x][y]; - } - } - if(maxEt>0) - { - if (AProjectionLegoPlot.defaultScale ==1 ) - { - for (int x = AProjectionLegoPlot.nPhiCells - 1; x >= 0; --x) - { - for (int y = 0; y < AProjectionLegoPlot.nEtaCells; ++y) - { - for(int z=largestColourIndex; z>=lowestColourIndex; z--) - { - if(Math.log10(legosum[x][y])>=AProjectionLegoPlot.minimumofLogScale) - { - //if multiple colors then each take linear amount of full log - double fraction=(lego[x][y][z]/legosum[x][y]); - lego[x][y][z]=fraction*(Math.log10(legosum[x][y])-AProjectionLegoPlot.minimumofLogScale); - } - else - { - //if not above minimum of log scale then don't draw - lego[x][y][z]=0.0; - } - } - } - } - } - else if (AProjectionLegoPlot.defaultScale ==2 ) - { - for (int x = AProjectionLegoPlot.nPhiCells - 1; x >= 0; --x) - { - for (int y = 0; y < AProjectionLegoPlot.nEtaCells; ++y) - { - for(int z=largestColourIndex; z>=lowestColourIndex; z--) - { - //if multiple colors then each take linear amount of full sqrt - double fraction=(lego[x][y][z]/legosum[x][y]); - lego[x][y][z]=fraction*Math.sqrt(legosum[x][y]); - } - } - } - } - } - return maxEt; - } - - public static double findAODMaxEt(AEvent event) - { - double AODmaxEt = 0.0; - //From the caloCluster - String[] colCluster=event.getActiveCollectionNames("Cluster"); - for(int i=0;i<colCluster.length;i++) - { - AClusterData cluster = (AClusterData) event.get(colCluster[i]); - if (!parameterStore.get("Data", "Cluster").getStatus()) - cluster = null; - if (cluster != null) - { - cluster.makeDrawList(); - for (int m = 0; m < cluster.getNumDraw(); ++m) - { - int list = cluster.getDrawIndex(m); - float et = Math.abs(cluster.getET(list)); - if (et > AODmaxEt) - AODmaxEt = et; - } - } - } - //From the Jets - Added code to make th e jet considered in the AOD scaling - String[] colJet=event.getActiveCollectionNames("Jet"); - for(int i=0;i<colJet.length;i++) - { - AJetData jets = (AJetData) event.get(colJet[i]); - if (!parameterStore.get("Data", "Jet").getStatus()) - jets = null; - if (jets != null) - { - jets.makeDrawList(); - for (int m = 0; m < jets.getNumDraw(); ++m) - { - int list = jets.getDrawIndex(m); - float pt = Math.abs(jets.getPt()[list]); - if (pt > AODmaxEt) - AODmaxEt = pt; - } - } - } - // From the muons - String[] colMuon=event.getActiveCollectionNames("Muon"); - for(int i=0;i<colMuon.length;i++) - { - AMuonData muons = (AMuonData) event.get(colMuon[i]); - if (!parameterStore.get("Data", "Muon").getStatus()) - muons = null; - if (muons != null) - { - muons.makeDrawList(); - for (int m = 0; m < muons.getNumDraw(); ++m) - { - int list = muons.getDrawIndex(m); - float pt = Math.abs(muons.getPT(list)); - if (pt > AODmaxEt) - AODmaxEt = pt; - } - } - } - // From the electrons - String[] colElectron=event.getActiveCollectionNames("Electron"); - for(int i=0;i<colElectron.length;i++) - { - AElectronData electrons = (AElectronData) event.get(colElectron[i]); - if (!parameterStore.get("Data", "Electron").getStatus()) - electrons = null; - if (electrons != null) - { - - electrons.makeDrawList(); - for (int e = 0; e < electrons.getNumDraw(); ++e) - { - int list = electrons.getDrawIndex(e); - float pt = Math.abs(electrons.getPT(list)); - if (pt > AODmaxEt) - AODmaxEt = pt; - } - } - } - // From the photons - String[] colPhoton=event.getActiveCollectionNames("Photon"); - for(int i=0;i<colPhoton.length;i++) - { - APhotonData photons = (APhotonData) event.get(colPhoton[i]); - if (!parameterStore.get("Data", "Photon").getStatus()) - photons = null; - if (photons != null) - { - photons.makeDrawList(); - for (int p = 0; p < photons.getNumDraw(); ++p) - { - int list = photons.getDrawIndex(p); - float pt = Math.abs(photons.getPT(list)); - if (pt > AODmaxEt) - AODmaxEt = pt; - } - } - } - //From the compositeParticles - String[] colCompPart=event.getActiveCollectionNames("CompositeParticle"); - for(int i=0;i<colCompPart.length;i++) - { - ACompositeParticleData compositeParticles = (ACompositeParticleData) event.get(colCompPart[i]); - if (!parameterStore.get("Data", "CompositeParticle").getStatus()) - compositeParticles = null; - if (compositeParticles != null) - { - compositeParticles.makeDrawList(); - for (int e = 0; e < compositeParticles.getNumDraw(); ++e) - { - int list = compositeParticles.getDrawIndex(e); - float pt = Math.abs(compositeParticles.getPT(list)); - if (pt > AODmaxEt) - AODmaxEt = pt; - } - } - } - - return AODmaxEt; - } - - public static double findMissingEt(AWindow window, double[][][] lego, AEvent event) - { - double met = 0.; - List hitsAndTracks = event.getHitsAndTracks(window.getProjection()); - for (int h = 0; h < hitsAndTracks.size(); h++) - { - AData datatype = ((AData) hitsAndTracks.get(h)); - if (datatype.getName().equals("ETMis")) - { - AETMisData mis = (AETMisData) datatype; - mis.makeDrawList(); - if (mis.getNumDraw() > 0) - { - double temp = Math.sqrt(mis.getETx() * mis.getETx() + mis.getETy() * mis.getETy()); - if(temp>met) - met=temp; - } - } - } - return met; - } - - public static void fillHistograms(AEvent event, double[][][] lego) - { - AProjectionLegoPlot.colorset.clear(); - if (AProjectionLegoPlot.mode == 0) - { - // Calorimeter Lego - fillCaloLego(event, lego); - } - else if (AProjectionLegoPlot.mode == 1) - { - // Trigger Tower Lego - fillTriggerTowerLego(event, lego); - } - else - { - // Jet Elements Lego - fillJetElementLego(event, lego); - } - } - - private static void fillCaloLego(AEvent event, double[][][] lego) - { - List detectors = event.getCalorimeters(); - for (int det = 0; det < detectors.size(); det++) - { - ACalorimeterData calorimeter = (ACalorimeterData) detectors.get(det); - String calname=calorimeter.getName(); - if (!calname.equals("TILE") && !calname.equals("FCAL") - && !calname.equals("HEC") && !calname.equals("LAr") - && !calname.equals("MBTS")) - { - logger.warn("Unknown calorimeter name for LegoPlot: " + calorimeter.getName()); - } - - calorimeter.makeDrawList(); - // for coloring - byte[] c = calorimeter.getColor(); - for (int i = 0; i < calorimeter.getNumDraw(); ++i) - { - int list = calorimeter.getDrawIndex(i); - double et = calorimeter.getET(list); - //MBTS energy is in MeV not GeV - if(calname.equals("MBTS")) et/=1000.; - double phi = calorimeter.getPhi(list); - double eta = calorimeter.getEta(list); - if (eta > 5 || eta < -5 || et == 0.0) - continue; - double dphi = calorimeter.getdPhi(list); - double deta = calorimeter.getdEta(list); - phietabinsLoop("calo", phi, dphi, eta, deta, c[list], et, lego); - }// loop over that calorimeter's cells - }// loop over the calorimeters - } - - private static void fillTriggerTowerLego(AEvent event, double[][][] lego) - { - //will draw even if data status is off - String[] colTT=event.getCollectionNames("LVL1TriggerTower"); - for(int k=0;k<colTT.length;k++) - { - ALVL1TriggerTowerData lvl1TriggerTower = (ALVL1TriggerTowerData) event.get(colTT[k]); - if (lvl1TriggerTower == null) - continue; - - byte[] ttColor; - for (int j = 0; j < 2; ++j) - { - int energyType = parameterStore.get(lvl1TriggerTower.getParameterGroup(), "EnergyType").getI(); - if((j == 0 && energyType == 1) || (j == 1 && energyType == 0)) - continue; - lvl1TriggerTower.makeDrawList(); - - boolean emOrHad; - if (j == 0) - { - emOrHad = ALVL1TriggerTowerData.ELECTROMAGNETIC; - lvl1TriggerTower.applyEMCuts(); - } - else - { - emOrHad = ALVL1TriggerTowerData.HADRONIC; - lvl1TriggerTower.applyHadCuts(); - } - ttColor = lvl1TriggerTower.getColor(emOrHad); - for (int i = 0; i < lvl1TriggerTower.getNumDraw(); ++i) - { - int list = lvl1TriggerTower.getDrawIndex(i); - double et = lvl1TriggerTower.getET(list, emOrHad); - double phi = lvl1TriggerTower.getPhi(list); - double eta = lvl1TriggerTower.getEta(list); - if (eta > 5 || eta < -5 || et == 0.0) - continue; - double dphi = lvl1TriggerTower.getdPhi(list, emOrHad); - double deta = lvl1TriggerTower.getdEta(list, emOrHad); - phietabinsLoop("trigger", phi, dphi, eta, deta, ttColor[list], et, lego); - }// loop over that triggerTower's cells - } - } - } - - private static void fillJetElementLego(AEvent event, double[][][] lego) - { - //will draw even if data status is off - String[] colJE=event.getCollectionNames("LVL1JetElement"); - for(int k=0;k<colJE.length;k++) - { - ALVL1JetElementData lvl1JetElement = (ALVL1JetElementData) event.get(colJE[k]); - if (lvl1JetElement == null) - continue; - byte[] jeColor = lvl1JetElement.getColor(); - lvl1JetElement.makeDrawList(); - for (int i = 0; i < lvl1JetElement.getNumDraw(); ++i) - { - int list = lvl1JetElement.getDrawIndex(i); - double et = lvl1JetElement.getET(list); - double phi = lvl1JetElement.getPhi(list); - double eta = lvl1JetElement.getEta(list); - if (eta > 5 || eta < -5 || et == 0.0) - continue; - double dphi = lvl1JetElement.getdPhi(list); - double deta = lvl1JetElement.getdEta(list); - phietabinsLoop("jetElement", phi, dphi, eta, deta, jeColor[list], et, lego); - }// loop over that jetElement's cells - } - } - - /** - * Is used to loop over the phi and eta bins to fill the lego "sender" - * histogram - * - * @param sender name of histogram that was sent for output message - * @param phi - * @param dphi - * @param eta - * @param deta - * @param color - * @param et - * @param lego - */ - private static void phietabinsLoop(String sender, double phi, double dphi, double eta, double deta, byte color, double et, double[][][] lego) - { - if (color >= AProjectionLegoPlot.nLayers) - color = (byte) (color % AProjectionLegoPlot.nLayers); - AProjectionLegoPlot.colorset.add(new Integer(color)); - - int highphibin = 0, lowphibin = 0; - - double phibinsize = (AMath.TWO_PI / AProjectionLegoPlot.nPhiCells); - highphibin = (int) ((phi + dphi) /phibinsize); - lowphibin = (int) ((phi - dphi) /phibinsize); - - int highetabin = 0, lowetabin = 0; - double etabinsize = 10.0 / AProjectionLegoPlot.nEtaCells; - highetabin = (int) ((eta + deta + 5.0) /etabinsize); - lowetabin = (int) ((eta - deta + 5.0) /etabinsize); - //check eta values - if (lowetabin < 0) - { - lowetabin=0; - if (highetabin < 0) - highetabin=0; - } - if (highetabin >= AProjectionLegoPlot.nEtaCells) - { - highetabin =AProjectionLegoPlot.nEtaCells-1; - if (lowetabin >= AProjectionLegoPlot.nEtaCells) - lowetabin =AProjectionLegoPlot.nEtaCells-1; - } - - for (int phibin = lowphibin; phibin <= highphibin; ++phibin) - { - double phiweight = 0; - if (lowphibin == highphibin) - phiweight = 1.0; - else if (phibin == lowphibin) - phiweight = (lowphibin + 1 - ((phi - dphi) / phibinsize)) * (phibinsize/(2 * dphi)); - else if (phibin == highphibin) - phiweight = (((phi + dphi) / phibinsize) - highphibin) * (phibinsize/(2 * dphi)); - else - phiweight = phibinsize/(2 * dphi); - if (phiweight > 1 || phiweight < 0) - { - logger.error("huh(" + sender + ")? how is phiweight...? " + phiweight); - } - - for (int etabin = lowetabin; etabin <= highetabin; ++etabin) - { - double etaweight = 0; - if (lowetabin == highetabin) - etaweight = 1.0; - else if (etabin == lowetabin) - etaweight = (lowetabin + 1 - ((eta - deta + 5.0) / etabinsize)) * (etabinsize/(2 * deta)); - else if (etabin == highetabin) - etaweight = (((eta + deta + 5.0) / etabinsize) - highetabin) * (etabinsize/(2 * deta)); - else - etaweight = etabinsize/(2 * deta); - if (etaweight > 1 || etaweight < 0) - { - logger.error("huh(" + sender + ")? how is etaweight...? " + etaweight); - } - - int wphibin = phibin;// for phi wrapping - while (wphibin >= AProjectionLegoPlot.nPhiCells) - wphibin -= AProjectionLegoPlot.nPhiCells; - while (wphibin < 0) - wphibin += AProjectionLegoPlot.nPhiCells; - int retabin = etabin; - if (AProjectionLegoPlot.reverse) - retabin = AProjectionLegoPlot.nEtaCells - etabin - 1; - - // add to the legoplot - lego[wphibin][retabin][color] += et * phiweight * etaweight; - }// loop over etabins - }// loop over phibins - }// end of phietabinsloop - - /** - * If the user has a different scale selected then this updates the value - */ - public static double scaleValue(double value) - { - if(value==0) - return 0; - if (AProjectionLegoPlot.defaultScale == 2) - { - value = Math.sqrt(value); - } - else if (AProjectionLegoPlot.defaultScale == 1) - { - value = Math.log10(value) - AProjectionLegoPlot.minimumofLogScale; - } - return value; - } - - public static void drawHistograms(AWindow window, AGraphics ag, AEvent event, double[][][] lego, double maxEt, double met, double AODmaxEt) - { - // Draw the other stuff in the event: jets, missing Et, etc. - double _jetcircleradius = parameterStore.get("LegoPlot", "JetCircleRadius").getD(); - double _legocut = parameterStore.get("LegoPlot", "LegoCut").getD(); - _legocut=scaleValue(_legocut); - boolean doAOD = false; - if (AODmaxEt!=0) - doAOD = true; - - //for ordering of ROIs - Stack jetROI = new Stack(), emTauROI = new Stack(), muonROI = new Stack(); - - List hitsAndTracks = event.getHitsAndTracks(window.getProjection()); - for (int h = 0; h < hitsAndTracks.size(); h++) - { - AData datatype = ((AData) hitsAndTracks.get(h)); - if (datatype.getName().equals("Jet")) - { - AJetData jet = (AJetData) datatype; - jet.makeDrawList(); - byte[] colors = jet.getColor(); - for (int j = 0; j < jet.getNumDraw(); ++j) - { - int list = jet.getDrawIndex(j); - double et = jet.getET(list); - Color _colorJet = AProjectionLegoPlot.defaultColorMap[colors[list]]; - ALegoDraw.drawJet(et, jet.getEta(list), jet.getPhi(list), _colorJet, window, ag, _jetcircleradius); - } - } - else if (datatype.getName().equals("ETMis")) - { - AETMisData mis = (AETMisData) datatype; - mis.makeDrawList(); - if (mis.getNumDraw() > 0) - { - byte[] colors = mis.getColor(); - int phib = (int) ((mis.getPhi()) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - if (phib < 0) - phib += AProjectionLegoPlot.nPhiCells; - if (phib >= AProjectionLegoPlot.nPhiCells) - phib -= AProjectionLegoPlot.nPhiCells; - Color _colorMis = AProjectionLegoPlot.defaultColorMap[colors[0]]; - ALegoDraw.drawMissEt(window, ag, phib, mis.getET(), _colorMis, maxEt); - } - } - //save the ROIs so they can be drawn jet-em-muon - else if (datatype.getName().equals("JetROI")) - { - jetROI.push(h); - } - else if (datatype.getName().equals("EmTauROI")) - { - emTauROI.push(h); - } - else if (datatype.getName().equals("MuonROI")) - { - muonROI.push(h); - } - }//end of loop over hitsandtracks - - //now draw the ROIs in the correct order - drawROIs(jetROI, window, ag, event); - drawROIs(emTauROI, window, ag, event); - drawROIs(muonROI, window, ag, event); - - - //for towers find colors to loop over - int largestColourIndex=0; - int lowestColourIndex=AProjectionLegoPlot.nLayers; - Iterator colorIterator = AProjectionLegoPlot.colorset.iterator(); - while(colorIterator.hasNext()) - { - int currentColor = ((Integer) colorIterator.next()).intValue(); - if(currentColor>largestColourIndex) - largestColourIndex=currentColor; - if(currentColor<lowestColourIndex) - lowestColourIndex=currentColor; - } - // Draw the EM and HAD towers - for (int y = 0; y < AProjectionLegoPlot.nEtaCells; ++y) - { - for (int x = AProjectionLegoPlot.nPhiCells - 1; x >= 0; --x) - { - double binheight = 0; - if(AProjectionLegoPlot.getDrawEMHAD() && AProjectionLegoPlot.colorset.size()==2) - { - //for Em/had option should only have 2 colors - int z=AProjectionLegoPlot.colorEM; - binheight=lego[x][y][z]; - if (binheight > _legocut) - { - ALegoDraw.drawBox(window, ag, x, y, z, 0.0, binheight, maxEt, 0.5); - if(lego[x][y][AProjectionLegoPlot.colorHad]> _legocut) - { - z=AProjectionLegoPlot.colorHad; - ALegoDraw.drawBox(window, ag, x, y, z, binheight, lego[x][y][z], maxEt, 0.5); - } - } - else if(lego[x][y][AProjectionLegoPlot.colorHad]> _legocut) - { - z=AProjectionLegoPlot.colorHad; - ALegoDraw.drawBox(window, ag, x, y, z, 0.0, lego[x][y][z], maxEt, 0.5); - } - } - else - { - //if not Em/Had then loop over colors - for(int z=largestColourIndex; z>=lowestColourIndex; z--) - { - if (lego[x][y][z] > _legocut) - { - ALegoDraw.drawBox(window, ag, x, y, z, binheight, lego[x][y][z], maxEt, 0.5); - binheight += lego[x][y][z]; - } - } - } - } - } - - //loop again and draw things that need to be on top of histogram - for (int h = 0; h < hitsAndTracks.size(); h++) - { - AData datatype = ((AData) hitsAndTracks.get(h)); - if (datatype.getName().equals("Jet")) - { - AJetData jet = (AJetData) datatype; - jet.makeDrawList(); - byte[] colors = jet.getColor(); - for (int j = 0; j < jet.getNumDraw(); ++j) - { - int list = jet.getDrawIndex(j); - double et = jet.getET(list); - Color _colorJet = AProjectionLegoPlot.defaultColorMap[colors[list]]; - if (parameterStore.get("LegoPlot", "JetText").getStatus()) - ALegoDraw.drawJetText(et, jet.getEta(list), jet.getPhi(list), _colorJet, window, ag, _jetcircleradius); - } - } - } - - if (doAOD) - { - //Draw the new jet Towers - String[] colJet=event.getActiveCollectionNames("Jet"); - for(int i=0;i<colJet.length;i++) - { - AJetData jets = (AJetData) event.get(colJet[i]); - - if (!parameterStore.get("Data", "Jet").getStatus()) - jets = null; - if (jets != null) - { - jets.makeDrawList(); - byte[] colors = jets.getColor(); - for (int j = 0; j < jets.getNumDraw(); ++j) - { - int list = jets.getDrawIndex(j); - Color _colorJet = AProjectionLegoPlot.defaultColorMap[colors[list]]; - int etabin = (int) ((jets.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((jets.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double pt = Math.abs(jets.getPt()[list]); - pt=scaleValue(pt); - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_JET,_colorJet, 0, pt, maxEt, 2.0); - } - } - } - - // Draw the caloClusters - String[] colCluster=event.getActiveCollectionNames("Cluster"); - for(int i=0;i<colCluster.length;i++) - { - AClusterData cluster = (AClusterData) event.get(colCluster[i]); - if (!parameterStore.get("Data", "Cluster").getStatus()) - cluster = null; - if (cluster != null) - { - cluster.makeDrawList(); - for (int m = 0; m < cluster.getNumDraw(); ++m) - { - int list = cluster.getDrawIndex(m); - int etabin = (int) ((cluster.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((cluster.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double et = Math.abs(cluster.getET(list)); - et=scaleValue(et); - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_CLUSTER, 0, et, maxEt, .5); - } - } - } - - // Draw the bjets - String[] colBjets=event.getActiveCollectionNames("BJet"); - for(int i=0;i<colBjets.length;i++) - { - ABJetData bjets = (ABJetData) event.get(colBjets[i]); - if (!parameterStore.get("Data", "BJet").getStatus()) - bjets = null; - if (bjets != null) - { - bjets.makeDrawList(); - for (int bj = 0; bj < bjets.getNumDraw(); ++bj) - { - int list = bjets.getDrawIndex(bj); - double et = bjets.getPT(list); - ALegoDraw.drawJet(et, bjets.getEta(list), bjets.getPhi(list), AProjectionLegoPlot.defaultColorMap[parameterStore.get("BJet", "Constant").getI()], window, ag, _jetcircleradius + _jetcircleradius / 5.0); - } - } - } - - // Draw the taujets - String[] colTau=event.getActiveCollectionNames("TauJet"); - for(int i=0;i<colTau.length;i++) - { - ATauJetData tjets = (ATauJetData) event.get(colTau[i]); - if (!parameterStore.get("Data", "TauJet").getStatus()) - tjets = null; - if (tjets != null) - { - tjets.makeDrawList(); - for (int tj = 0; tj < tjets.getNumDraw(); ++tj) - { - int list = tjets.getDrawIndex(tj); - double et = tjets.getPT(list); - ALegoDraw.drawJet(et, tjets.getEta(list), tjets.getPhi(list), AProjectionLegoPlot.defaultColorMap[parameterStore.get("TauJet", "Constant").getI()], window, ag, _jetcircleradius / 2.0); - } - } - } - - //Draw the muons - String[] colMuon=event.getActiveCollectionNames("Muon"); - for(int i=0;i<colMuon.length;i++) - { - AMuonData muons = (AMuonData) event.get(colMuon[i]); - if (!parameterStore.get("Data", "Muon").getStatus()) - muons = null; - if (muons != null) - { - muons.makeDrawList(); - for (int m = 0; m < muons.getNumDraw(); ++m) - { - int list = muons.getDrawIndex(m); - int etabin = (int) ((muons.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((muons.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double pt = Math.abs(muons.getPT(list)); - pt=scaleValue(pt); - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_MUON, 0, pt, maxEt, 0.5); - } - } - } - - //Draw the electrons - String[] colElectron=event.getActiveCollectionNames("Electron"); - for(int i=0;i<colElectron.length;i++) - { - AElectronData electrons = (AElectronData) event.get(colElectron[i]); - - if (!parameterStore.get("Data", "Electron").getStatus()) - electrons = null; - if (electrons != null) - { - electrons.makeDrawList(); - for (int e = 0; e < electrons.getNumDraw(); ++e) - { - int list = electrons.getDrawIndex(e); - int etabin = (int) ((electrons.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((electrons.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double pt = Math.abs(electrons.getPT(list)); - pt=scaleValue(pt); - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_ELECTRON, 0, pt, maxEt, 0.5); - } - } - } - - //Draw the photons - String[] colPhoton=event.getActiveCollectionNames("Photon"); - for(int i=0;i<colPhoton.length;i++) - { - APhotonData photons = (APhotonData) event.get(colPhoton[i]); - if (!parameterStore.get("Data", "Photon").getStatus()) - photons = null; - if (photons != null) - { - photons.makeDrawList(); - for (int p = 0; p < photons.getNumDraw(); ++p) - { - int list = photons.getDrawIndex(p); - int etabin = (int) ((photons.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((photons.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double pt = Math.abs(photons.getPT(list)); - pt=scaleValue(pt); - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_PHOTON, 0, pt, maxEt, 0.5); - } - } - } - - //Draw the compositeParticles - String[] colCompPart=event.getActiveCollectionNames("CompositeParticle"); - for(int i=0;i<colCompPart.length;i++) - { - ACompositeParticleData compositeParticles = (ACompositeParticleData) event.get(colCompPart[i]); - if (!parameterStore.get("Data", "CompositeParticle").getStatus()) - compositeParticles = null; - if (compositeParticles != null) - { - compositeParticles.makeDrawList(); - for (int e = 0; e < compositeParticles.getNumDraw(); ++e) - { - int list = compositeParticles.getDrawIndex(e); - int etabin = (int) ((compositeParticles.getEta(list) + 5.0) * AProjectionLegoPlot.nEtaCells / 10.0); - if (AProjectionLegoPlot.reverse) - etabin = AProjectionLegoPlot.nEtaCells - etabin; - int phibin = (int) ((compositeParticles.getPhi(list)) * AProjectionLegoPlot.nPhiCells / AMath.TWO_PI); - double pt = Math.abs(compositeParticles.getPT(list)); - pt=scaleValue(pt); - //change how drawn depending on type - if(Math.abs(compositeParticles.getPdgId(list))==13) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_MUON, 0, pt, maxEt, 0.5); - else if(Math.abs(compositeParticles.getPdgId(list))==11) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_ELECTRON, 0, pt, maxEt, 0.5); - else if(Math.abs(compositeParticles.getPdgId(list))==22) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_PHOTON, 0, pt, maxEt, 0.5); - else if(Math.abs(compositeParticles.getPdgId(list))==5) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_BJET, 0, pt, maxEt, 0.5); - else if(Math.abs(compositeParticles.getPdgId(list))==15) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_TAUJET, 0, pt, maxEt, 0.5); - else if(compositeParticles.getTypeEV(list).equals("EVParticleJet")) - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_JET, 0, pt, maxEt, 0.5); - else - ALegoDraw.drawBox(window, ag, phibin, etabin, AProjectionLegoPlot.DRAW_COMPOSITEPARTICLE, 0, pt, maxEt, 0.5); - } - } - } - }//if doAOD - }//drawHistograms - - public static void drawROIs(Stack ROIstack, AWindow window, AGraphics ag, AEvent event) - { - List hitsAndTracks = event.getHitsAndTracks(window.getProjection()); - //loop over ROIs - while(ROIstack.size()>0) - { - int h = (Integer) ROIstack.pop(); - AData datatype = ((AData) hitsAndTracks.get(h)); - - byte[] ROIColor; - double deltaPhi; - double deltaEta; - AROIData ROIData = (AROIData) datatype; - ROIData.makeDrawList(); - ROIColor = datatype.getColor(); - deltaEta = parameterStore.get(datatype.getName(), "deta").getD(); - deltaPhi = parameterStore.get(datatype.getName(), "dphi").getD(); - // deltaEta and deltaPhi should not be too large - for (int j = 0; j < ROIData.getNumDraw(); ++j) - { - int numPoints = 4; - int list = ROIData.getDrawIndex(j); - double ROIphi = ROIData.getPhi(list); - double ROIeta = ROIData.getEta(list); - if (AProjectionLegoPlot.reverse) - ROIeta = -ROIeta; - double leftPhi = ROIphi - deltaPhi; - double rightPhi = ROIphi + deltaPhi; - double topEta = ROIeta + deltaEta; - double bottomEta = ROIeta - deltaEta; - if ((ROIColor[list] < AProjectionLegoPlot.defaultColorMap.length) && (ROIColor[list] >= 0)) - ag.setColor(AProjectionLegoPlot.defaultColorMap[ROIColor[list]]); - ag.setLineWidth(3); - double ROIx = 0.0; - double ROIy = 0.0; - double[][] hv = new double[2][numPoints]; - if ((rightPhi <= AMath.TWO_PI) && (leftPhi >= 0.0)) - { - for (int p = 0; p < numPoints; p++) - { - switch (p) - { - case 0: - ROIx = rightPhi * 360.0 / AMath.TWO_PI; - ROIy = bottomEta; - break; - case 1: - ROIx = leftPhi * 360.0 / AMath.TWO_PI; - ROIy = bottomEta; - break; - case 2: - ROIx = leftPhi * 360.0 / AMath.TWO_PI; - ROIy = topEta; - break; - case 3: - ROIx = rightPhi * 360.0 / AMath.TWO_PI; - ROIy = topEta; - break; - } - if(ROIy <= -5.0) - ROIy = -5.0; - if(ROIy >= 5.0) - ROIy = 5.0; - //move phi value due to slant of eta axis - ROIx=AProjectionLegoPlot.adjustPhi(window,ROIx,ROIy); - hv[0][p] = ROIx; - hv[1][p] = ROIy; - } - } - else if ((rightPhi > AMath.TWO_PI) && (leftPhi < 0.0)) - { - for (int p = 0; p < numPoints; p++) - { - switch (p) - { - case 0: - ROIx = 360.0; - ROIy = bottomEta; - break; - case 1: - ROIx = 0.0; - ROIy = bottomEta; - break; - case 2: - ROIx = 0.0; - ROIy = topEta; - break; - case 3: - ROIx = 360.0; - ROIy = topEta; - break; - } - if(ROIy <= -5.0) - ROIy = -5.0; - if(ROIy >= 5.0) - ROIy = 5.0; - //move phi value due to slant of eta axis - ROIx=AProjectionLegoPlot.adjustPhi(window,ROIx,ROIy); - hv[0][p] = ROIx; - hv[1][p] = ROIy; - } - } - else if (rightPhi > AMath.TWO_PI) - { - double[][] hvWrap = new double[2][numPoints]; - double ROIxWrap = 0.0; - for (int p = 0; p < numPoints; p++) - { - switch (p) - { - case 0: - ROIx = 360.0; - ROIxWrap = (rightPhi - AMath.TWO_PI) * 360.0 / AMath.TWO_PI; - ROIy = bottomEta; - break; - case 1: - ROIx = leftPhi * 360.0 / AMath.TWO_PI; - ROIxWrap = 0.0; - ROIy = bottomEta; - break; - case 2: - ROIx = leftPhi * 360.0 / AMath.TWO_PI; - ROIxWrap = 0.0; - ROIy = topEta; - break; - case 3: - ROIx = 360.0; - ROIxWrap = (rightPhi - AMath.TWO_PI) * 360.0 / AMath.TWO_PI; - ROIy = topEta; - break; - } - if(ROIy <= -5.0) - ROIy = -5.0; - if(ROIy >= 5.0) - ROIy = 5.0; - //move phi value due to slant of eta axis - ROIx=AProjectionLegoPlot.adjustPhi(window,ROIx,ROIy); - hv[0][p] = ROIx; - hv[1][p] = ROIy; - //move phi value due to slant of eta axis - ROIxWrap=AProjectionLegoPlot.adjustPhi(window,ROIxWrap,ROIy); - hvWrap[0][p] = ROIxWrap; - hvWrap[1][p] = ROIy; - } - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<numPoints; i++) - { - p = window.calculateDisplay(hvWrap[0][i],hvWrap[1][i]); - hvWrap[0][i]=p.x; - hvWrap[1][i]=p.y; - } - ag.fillPolygon(hvWrap[0], hvWrap[1], numPoints); - } - else - { - double[][] hvWrap = new double[2][numPoints]; - double ROIxWrap = 0.0; - for (int p = 0; p < numPoints; p++) - { - switch (p) - { - case 0: - ROIx = rightPhi * 360.0 / AMath.TWO_PI; - ROIxWrap = 360.0; - ROIy = bottomEta; - break; - case 1: - ROIx = 0.0; - ROIxWrap = (leftPhi + AMath.TWO_PI) * 360.0 / AMath.TWO_PI; - ROIy = bottomEta; - break; - case 2: - ROIx = 0.0; - ROIxWrap = (leftPhi + AMath.TWO_PI) * 360.0 / AMath.TWO_PI; - ROIy = topEta; - break; - case 3: - ROIx = rightPhi * 360.0 / AMath.TWO_PI; - ROIxWrap = 360.0; - ROIy = topEta; - break; - } - if(ROIy <= -5.0) - ROIy = -5.0; - if(ROIy >= 5.0) - ROIy = 5.0; - //move phi value due to slant of eta axis - ROIx=AProjectionLegoPlot.adjustPhi(window,ROIx,ROIy); - hv[0][p] = ROIx; - hv[1][p] = ROIy; - //move phi value due to slant of eta axis - ROIxWrap=AProjectionLegoPlot.adjustPhi(window,ROIxWrap,ROIy); - hvWrap[0][p] = ROIxWrap; - hvWrap[1][p] = ROIy; - } - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<numPoints; i++) - { - p = window.calculateDisplay(hvWrap[0][i],hvWrap[1][i]); - hvWrap[0][i]=p.x; - hvWrap[1][i]=p.y; - } - ag.fillPolygon(hvWrap[0], hvWrap[1], numPoints); - } - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<numPoints; i++) - { - p = window.calculateDisplay(hv[0][i],hv[1][i]); - hv[0][i]=p.x; - hv[1][i]=p.y; - } - ag.fillPolygon(hv[0], hv[1], numPoints); - }//end of loop over ROI data - } - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMBTSData.java b/graphics/AtlantisJava/src/atlantis/data/AMBTSData.java deleted file mode 100644 index 931b749640d5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMBTSData.java +++ /dev/null @@ -1,595 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.ALogger; - - -/** - * The Minimum Bias Trigger Scintillator implementation. - * - * @author Mark Stockton - */ -public class AMBTSData extends ACalorimeterData -{ - private static ALogger logger = ALogger.getLogger(AMBTSData.class); - - - /* - * For Rz histograms may/will need: - * - * private int[][] cellTable; - * - * phiIndex[i] - * etaIndex[i] - * outerEta -> use -> detector.getEtaMax() - * outerR -> use -> detector.getRMax() - * outerZ -> use -> detector.getZMax() - * etaGranularity - */ - - protected float[] quality; - protected float[] time; - //label not needed at present as is just a string made - // from type, module and channel - //protected String[] label; - - // data for real pulse shapes plots - private int[][] adcCounts = null; - private float[] cellPedestal = null; - private float[] cellRawTime = null; - private float[] cellRawAmplitude = null; - private static boolean pulseShapesDataAvailable = false; - private static final String LOOKUP_TABLE_FILE = - AGlobals.instance().getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - "rpsplt_tile.csv"; - // number of lookup table values for real pulse shapes plots calculation - private static final short NUMBER_OF_LOOKUP_VALUES = 401; - - - - - protected ACalorimeterDetector[] MBTSlayers = new ACalorimeterDetector[2]; - - AMBTSData(AHashMap p, AEvent e) - { - super(p,e); - - channel = p.getIntArray("channel"); - /* - * this energy is in MeV not GeV - */ - et = p.getFloatArray("energy"); - etSum = p.getFloatArray("energy"); - //label = p.getStringArray("label"); - quality = p.getFloatArray("quality"); - sampling = p.getIntArray("sampling"); - time = p.getFloatArray("time"); - - /* - * The phi and eta coordinates used here are actually not phi and eta - * - * Instead: - phi refers to the module number 0-8 - * - eta refers to which side of the detector - * - * The actual phi and eta are then calculated from the geometry object - */ - int[] inteta; - int[] intphi; - if( p.containsKey("module")) - { - //phi new version - intphi = p.getIntArray("module"); - } - else - { - //phi first version - float[] tempphi = p.getFloatArray("phi"); - intphi = new int[numData]; - for(int i=0; i<numData; i++) - { - intphi[i]=(int) (( (8*tempphi[i])/(2*Math.PI))-(1/2)); - } - } - - if( p.containsKey("type")) - { - //eta new version - inteta = p.getIntArray("type"); - } - else - { - //eta first version - float[] tempeta = p.getFloatArray("eta"); - inteta = new int[numData]; - for(int i=0; i<numData; i++) - { - if(tempeta[i]<0) - { - inteta[i] = -1; - } - else - { - inteta[i] = 1; - } - } - } - eta = new float[numData]; - phi = new float[numData]; - for(int i=0; i<numData; i++) - { - eta[i]=inteta[i]; - phi[i]=intphi[i]; - } - - //now define sub and side depending on eta value - for(int i=0; i<numData; i++) - { - if(eta[i]<0) - { - sub[i] = 0; - side[i] = -1; - } - else - { - sub[i] = 1; - side[i] = 1; - } - } - - //store the two sampling of the MBTS geometry - for (int i=0; i<ACalorimeterDetector.count(); i++) - { - ACalorimeterDetector detector = ACalorimeterDetector.get(i); - if(detector.getName().equals("Minimum Bias Trigger Scintillators")) - { - MBTSlayers[detector.getSampling()] = detector; - } - } - - // read in MBTS data for real pulse shapes plots - readPulseShapePlotData(p); - - } - - - - private void readPulseShapePlotData(AHashMap p) - { - // read ADCCounts and cell data for real pulse shapes plots - adcCounts = super.getADCCountsData(p); - - // read other MBTS data for real pulse shapes plots - cellPedestal = (p.get("cellPedestal") != null) ? p.getFloatArray("cellPedestal") : null; - cellRawTime = (p.get("cellRawTime") != null) ? p.getFloatArray("cellRawTime") : null; - cellRawAmplitude = (p.get("cellRawAmplitude") != null) ? p.getFloatArray("cellRawAmplitude") : null; - - pulseShapesDataAvailable = false; - if(adcCounts != null && cellPedestal != null && cellRawTime != null && - cellRawAmplitude != null) - { - pulseShapesDataAvailable = true; - - logger.debug(CALORIMETER_NAME + - ": data for real pulse shape plots available"); - - if(ACalorimeterRPSPLT.areTileLookupTablesInitialized()) - { - logger.debug(CALORIMETER_NAME + - ": lookup tables have already been read in"); - } - else - { - logger.debug(CALORIMETER_NAME + - ": lookup table values have not been read in yet\n" + - " trying to read file: " + LOOKUP_TABLE_FILE); - - try - { - ATILEData.readLookupTableFile(); - logger.debug(CALORIMETER_NAME + - ": values from " + LOOKUP_TABLE_FILE + - " successfully read in"); - } - catch(AAtlantisException ex) - { - logger.debug(CALORIMETER_NAME + - ": reading " + LOOKUP_TABLE_FILE + - " failed, real pulse shapes plots will not " + - "be available, reason: " + ex.getMessage(), ex); - pulseShapesDataAvailable = false; - } - } - } - - } // readPulseShapePlotData() ------------------------------------------- - - - - /** - * Returns the name of the parameter group. - * - * @return String parameter group - */ - public String getParameterGroup() - { - return "TILE"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getName() - { - return "MBTS"; - } - - /** - * Returns the name of the datatype. - * - * @return String datatype - */ - public String getNameScreenName() - { - return "MBTS"; - } - - /** - * Returns the type of calorimeter (ECAL/HCAL) for a hit. - * - * @param index int hit index - * @return String calorimeter type - */ - public String getCalorimeterType(int index) - { - return "HCAL"; - } - - /** - * Draws the MBTS data in the y-x projection. - * - * @return ACoord cell geometry polygons - */ - protected ACoord getYXUser() - { - makeDrawList(); - - int mode = parameterStore.get("YX", "Mode").getI(); - if (mode != AProjectionYX.MODE_MBTS) - { - return ACoord.NO_DATA; - } - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - double rMax = MBTSlayers[sampling[j]].getRMax(); - double rMin = MBTSlayers[sampling[j]].getRMin(); - int numPhi = MBTSlayers[sampling[j]].getNumPhi(); - double phiMin = Math.PI*2*phi[j]/numPhi; - double phiMax = Math.PI*2*(1+phi[j])/numPhi; - hv[0][i] = new double[] {rMax*Math.cos(phiMin), rMax*Math.cos(phiMax), - rMin*Math.cos(phiMax), rMin*Math.cos(phiMin)}; - hv[1][i] = new double[] {rMax*Math.sin(phiMin), rMax*Math.sin(phiMax), - rMin*Math.sin(phiMax), rMin*Math.sin(phiMin)}; - index[i] = j; - } - - return new ACoord(hv, index, this); - } - - /** - * Draws the MBTS data in the rho-z projection. See the description of - * filterDrawListRZ() for an explanation of the drawing method. - * - * @return ACoord cell geometry polygons - */ - protected ACoord getRZUser() - { - makeDrawList(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int j = listdl[i]; - int sign = MBTSlayers[sampling[j]].getRSign((int) phi[j]); - double zMax = MBTSlayers[sampling[j]].getZMax() * side[j]; - double zMin = MBTSlayers[sampling[j]].getZMin() * side[j]; - double rMax = MBTSlayers[sampling[j]].getRMax() * sign; - double rMin = MBTSlayers[sampling[j]].getRMin() * sign; - hv[0][i] = new double[] {zMax, zMin, zMin, zMax}; - hv[1][i] = new double[] {rMax, rMax, rMin, rMin}; - index[i] = j; - } - - return new ACoord(hv, index, this); - } - - /** - * Applies cuts to the data. - */ - protected void applyCuts() - { - super.applyCuts(); - - cut("CutsCalo", "MBTSEnergy", "MBTSEnergy", et); - int cutSub = parameterStore.get("CutsCalo", "MBTS").getI(); - if(cutSub != -1) - { - cutArray(sub, cutSub, "Endcap"); - } - } - - /** - * Returns the data in the phi-rho projection. - * - * @return ACoord polygons representing calorimeter cells - */ - public ACoord getFRUser() - { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - /** - * Returns info about a selected hit (for picking) - * - * @param index int hit index - * @return String info - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - "\n Energy="+correctEnergy(energy[index])+" GeV\n "; - - //find the cell energy on the opposite MBTS layer - String cellminus, cellplus; - double tempEnergy=0.0; - for(int i=0; i<energy.length; i++) - { - if(eta[i]==(-1.0*eta[index]) && phi[i]==phi[index] && sampling[i]==sampling[index]) - { - tempEnergy=energy[i]; - } - } - - if(eta[index]<0) - { - cellminus = correctEnergy(energy[index]); - cellplus = correctEnergy(tempEnergy); - } - else - { - cellplus = correctEnergy(energy[index]); - cellminus = correctEnergy(tempEnergy); - } - StringBuffer msg = new StringBuffer(CALORIMETER_NAME + " cell "); - - // calling AIdHelper.getFullIdentifier(id[index])[0] - does not work, - // id array is not present in the event data. it is arbitrarily created - // in Atlantis, however, but contains only indices, thus currently - // (2008-11-25) index and id[index] are the same values - msg.append(" (id: " + id[index] + " index: " + index + ")"); - - msg.append("\n Energy = " + correctEnergy(energy[index])); - msg.append("\n (MBTS + = " + cellplus + " MBTS - = " + cellminus + ")"); - msg.append("\n time = " + time[index]); - msg.append("\n quality = " + quality[index]); - msg.append("\n type = " + String.format("%.4f",eta[index])); - msg.append("\n module = " + String.format("%.1f",phi[index])); - msg.append("\n sampling = " + sampling[index]); - msg.append("\n channel = " + channel[index]); - - // real pulse shapes plots - msg.append("\n cell pedestal = "); - String m = (cellPedestal != null) ? Float.toString(cellPedestal[index]) + - " ADC counts" : "n/a"; - msg.append(m); - - m = pulseShapesDataAvailable ? "" : "\n data for real pulse shapes plot n/a"; - msg.append(m); - - return msg.toString(); - - } // getHitInfo() ------------------------------------------------------- - - private String correctEnergy(double energy) - { - String energyOutput; - if(energy>1.) - { - energyOutput = String.format("%.2f",energy) + " MeV"; - } - else if(energy>0.001) - { - energy*=1000.; - energyOutput = String.format("%.2f",energy) + " KeV"; - } - else - { - energy*=1000.*1000.; - energyOutput = String.format("%.2f",energy) + " eV"; - } - return energyOutput; - } - - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - ACoord[] data = ACoord.NO_HISTOGRAMS; - //TODO add MBTS RZ Histograms option turned off in gui - //if (projection instanceof AProjectionRZ) - // data = getRZHistograms(); - return projection.nonLinearTransform(data); - } - - - - // calculate real pulse shapes values based on the values in the lookup tables - // taken from ATILEData. This function can't be shared from ACalorimeterData - // (shared by LAr, FCAL, HEC) since the calculation is different and can't - // call it directly from TILE since there are two channels. - // Should likely be refactored (so that method is somewhat shared) - after - // discussion with someone from TILE/MBTS/LAr ... - private double getPhysicsPulseShape(double xTime, double pmtTime, - double pmtPedestal, double pmtEnergy, - float[] amplitude, float[] time) - throws AAtlantisException - { - double tdiv = 0.0; - int lookup = 0; - double localTime = 0.0; - double xpulse = 0.0; - - // need to get "multiple" parameter ( = number of values in adcCounts - // for each cell - adcCounts.length), shall be the same for all the - // cells - taking the length of the first array (for the first cell) - // no NullPointer or ArrayIndexBound checks are necessary here as this - // method shall only be called when the relevant data is available - double centerOfSamples = (adcCounts[0].length + 1.0) / 2.0; - - tdiv = time[1] - time[0]; - localTime = (xTime - centerOfSamples) * 25.0 - pmtTime; - lookup = (int) ((localTime - time[0]) / tdiv); - - if(lookup < 0) - { - lookup = 0; - } - if(lookup >= NUMBER_OF_LOOKUP_VALUES - 1) - { - lookup = NUMBER_OF_LOOKUP_VALUES - 2; // -1 was off by 1 - } - - try - { - if(lookup == 0 || lookup == NUMBER_OF_LOOKUP_VALUES - 2) - { - xpulse = amplitude[lookup]; - } - else - { - xpulse = amplitude[lookup] + ((amplitude[lookup + 1] - - amplitude[lookup]) / tdiv) * (localTime - time[lookup]); - } - } - catch(ArrayIndexOutOfBoundsException ex) - { - String m = "AMBTSData.getPhysicsPulseShape():\n" + - " lookup index out of bound: lookup = " + lookup; - throw new AAtlantisException(m); - } - return (xpulse * pmtEnergy) + pmtPedestal; - - } // getPhysicsPulseShape() --------------------------------------------- - - - - /** - * Utility method APulseShapePlot.plotRealPulseShapes() is called from - * here. - * Physics pulse is calculated here: getPhysicsPulseShape(). - * This method is called from APickInteraction via ACalorimeterData - * which defines abstract plotPulseShapes(). - * Method more or less copied & pasted from ATILEData, but here is - * for just one channel. - * - * @param index int - */ - public void plotPulseShapes(int index) - { - if(pulseShapesDataAvailable) - { - String title = CALORIMETER_NAME + " cell index: " + index; - - // one channel for MBTS - int[][] adcCountsLocal = new int[][] { adcCounts[index] }; - - if(super.checkADCCountsAvailability(adcCountsLocal)) - { - // adc counts are available - logger.debug(CALORIMETER_NAME + " adc counts (digits) are " + - "available for pulse shapes plots for this cell."); - } - else - { - AOutput.append("\nADC counts are not available for this cell, " + - "can't plot pulse shapes.", ALogInterface.WARNING); - return; - } - - - // step - starting from 1, need to get step numbers within - // number of ADC samples (adcCounts[0].length) - double step = (adcCounts[0].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - double[][] realPulse = new double[1][NUMBER_OF_LOOKUP_VALUES]; // 1 channel - double d = 1.0; - - // by zdenek 2008-12-02 - // DPD (slimed version of ESD) sometimes don't have cellPedestal - // for a cell (the tag exists, values are there, but are 0). check - // if pedestal is 0 and if so, take as pedestal value the first - // adc count digit - float cellPedestalLocal = cellPedestal[index]; - if(cellPedestalLocal == 0.0f) - { - logger.debug("MBTS cellPedestal is not available (i.e. " + - "are 0.0f), using first adcCount digit as pedestal."); - cellPedestalLocal = adcCounts[index][0]; - } - - try - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - realPulse[0][i] = - this.getPhysicsPulseShape(d, cellRawTime[index], - cellPedestalLocal, - cellRawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - return; - } - - APulseShapePlot.plotRealPulseShapes(adcCountsLocal, realPulse, - step, null, title); - } - else - { - logger.warn(CALORIMETER_NAME + " plotPulseShapes() method called, " + - "but data is not available."); - return; - } - - } // plotPulseShapes() -------------------------------------------------- - - - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMDTData.java b/graphics/AtlantisJava/src/atlantis/data/AMDTData.java deleted file mode 100755 index 0074b2c5a161..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMDTData.java +++ /dev/null @@ -1,338 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -public class AMDTData extends AMuonHitData -{ - protected float[] driftR; - protected float[] length; - private static final int BARREL = 1; - - private static ALogger logger = ALogger.getLogger(AMDTData.class); - - public String getParameterGroup() - { - return "MDT"; - } - - public String getName() - { - return "MDT"; - } - - public String getNameScreenName() - { - return "MDT"; - } - - AMDTData(AHashMap p, AEvent e) - { - super(p,e); - driftR = p.getFloatArray("driftR"); - length = p.getFloatArray("length"); - // removed the fudge (CT 27/7/2004), and replaced with another - // for(int i=0; i<numData; i++) - // driftR[i]*=500./700.; - for (int i = 0; i < numData; i++) - if (driftR[i] > 1.46) - driftR[i] = (float) 1.46; // don't go out of the drifttube ! - } - - protected int getStation(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(1) == 'I') { - return 0; - } else if (stationName.charAt(1) == 'E') { - return 1; - } else if (stationName.charAt(1) == 'M') { - return 2; - } else if (stationName.charAt(1) == 'O') { - return 3; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding MDT identifier", e); - } - - return 0; - } - - protected int getSub(int index) - { - try { - if (AIdHelper.stationName(id[index]).charAt(0) == 'B') { - return 1; - } else if (AIdHelper.stationEta(id[index]) < 0) { - return 0; - } else { - return 2; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding MDT identifier", e); - } - - return 1; - } - - public int getSector(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(2) == 'L') { - return 2 * (AIdHelper.stationPhi(id[index]) - 1); - } else { - return 2 * (AIdHelper.stationPhi(id[index]) - 1) + 1; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding MDT identifier", e); - } - - return 0; - } - - protected boolean getMeasuresPhi(int index) - { - return false; - } - - protected void applyCuts() - { - super.applyCuts(); - if (parameterStore.get("CutsATLAS", "CutPhi").getStatus()) - cutPhi(phi, getDPhi()); - cutEta(rho, z); - } - - // used to make phi cut - - private float[] getDPhi() - { - // only roughly correct for some special sectors - // must create all - float[] dphi = new float[numData]; - - // need only fill for those in draw list - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - dphi[list] = (float) Math.abs(Math.atan2(length[list] / 2., rho[list])); - } - return dphi; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.RHO+" = "+String.format("%.3f",rho[index])+"\n "+ - "z = " + String.format("%.3f",z[index]) + " cm\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - String temp = getNameScreenName() + " (id: " + identifier[index] + - " index: " + index + ")\n " + - AMath.RHO + " = " + String.format("%.3f",rho[index]) + " cm" + "\n " + - AMath.PHI + " = " + String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)\n " + - "z = " + String.format("%.3f",z[index]) + " cm\n " + - "driftR = " + String.format("%.3f",driftR[index]) + " cm"; - if (sector[index] != -1) - { - temp += "\n sector = " + sector[index]; - } - - return temp; - } - - private void makeDrawListYX() - { - int mode = parameterStore.get("YX", "Mode").getI(); - - if (mode > 0 && mode < 5) - { - numDraw = 0; - } - else - { - makeDrawList(); - if (mode == 0) - cut(" Barrel ", sub, "==", BARREL); - else - { - cut(" Endcaps", sub, "!=", BARREL); - cut(" Station", station, "==", mode - 5); - } - } - } - - private void makeDrawListFZ() - { - int mode = parameterStore.get("FZ", "Mode").getI(); - - if (mode > 0 && mode < 4) - { - numDraw = 0; - } - else - { - makeDrawList(); - if (mode == 0) - cut(" Endcaps", sub, "!=", BARREL); - else - { - cut(" Barrel ", sub, "==", BARREL); - if (mode == 4) - cut(" Station", station, "<=", mode - 3); - else - cut(" Station", station, "==", mode - 3); - } - } - } - - protected ACoord getYXUser() - { - return getYXUser(0); - } - - private ACoord getYXUser(int flag) - { - makeDrawListYX(); - int numPieces = 13; - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double r = rho[list]; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double phiM = Math.rint(phi[list] / AMath.PI_BY_8) * AMath.PI_BY_8; - double cosPhiM = Math.cos(phiM); - double sinPhiM = Math.sin(phiM); - double d = length[list] / 2.; - double x = r * cosPhi; - double y = r * sinPhi; - - hv[0][i] = AMath.splitLineIntoPieces(new double[] { x + d * sinPhiM, x - d * sinPhiM }, numPieces); - hv[1][i] = AMath.splitLineIntoPieces(new double[] { y - d * cosPhiM, y + d * cosPhiM }, numPieces); - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - protected ACoord getFRUser() - { - return getYXUser(1).convertYXToFR().includePhiWrapAround("FR"); - } - - protected ACoord getRZUser() - { - makeDrawList(); - int[] sign = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for (int i = 0; i < numDraw; i++) - { - double phiDiff = Math.abs(phi[listdl[i]] - phiMid); - - sign[i] = -1; - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign[i] = 1; - } - return getXZRZUser(sign); - } - - protected ACoord getXZUser() - { - makeDrawList(); - cutMuonSector(sector); - int[] sign = new int[numDraw]; - int sect=(int)Math.round(parameterStore.get("XZ", "Phi").getD() / 22.5); - - for (int i = 0; i < numDraw; i++) - { - sign[i] = 1; - if (sector[listdl[i]] != sect) - sign[i] = -1; - } - return getXZRZUser(sign); - } - - protected ACoord getXZRZUser(int[] sign) - { - // int muonMode=APar.get("Data.MDT").getI(); - int muonMode = parameterStore.get("MDT", "Mode").getI(); - int numPoints; - - if (muonMode == 0) // circles - numPoints = 48; - else - numPoints = 2; // lines - - double[][][] hv = new double[2][numDraw][numPoints]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double rC = sign[i] * getSectorRho(sector[list], rho[list], phi[list]); - double zC = z[list]; - double d = driftR[list]; - - if (muonMode == 0) - { // circles - for (int j = 0; j < numPoints; j++) - { - hv[0][i][j] = zC + d * Math.cos(Math.PI * 2 * j / (numPoints - 1)); - hv[1][i][j] = rC + d * Math.sin(Math.PI * 2 * j / (numPoints - 1)); - } - } - else - { // lines - double radius = Math.sqrt(rC * rC + zC * zC); - double sinTheta = rC / radius; - double cosTheta = zC / radius; - - hv[0][i][0] = zC + d * sinTheta; - hv[1][i][0] = rC - d * cosTheta; - hv[0][i][1] = zC - d * sinTheta; - hv[1][i][1] = rC + d * cosTheta; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - protected ACoord getFZUser() - { - makeDrawListFZ(); - double[][][] hv = new double[2][numDraw][2]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - index[i] = list; - hv[0][i][0] = z[list]; - hv[0][i][1] = z[list]; - double deltaPhi = Math.atan2(length[list] / 2., rho[list]); - - hv[1][i][0] = Math.toDegrees(phi[list] - deltaPhi); - hv[1][i][1] = Math.toDegrees(phi[list] + deltaPhi); - } - return new ACoord(hv, index, this, ACoord.POLYLINES).includePhiWrapAround("FZ"); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMuonData.java b/graphics/AtlantisJava/src/atlantis/data/AMuonData.java deleted file mode 100755 index 368a6a039886..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMuonData.java +++ /dev/null @@ -1,95 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.A4Vector; - -/** - * Reconstructed Muon - */ -public class AMuonData extends AHelixAODData -{ - private float[] chi2; - - AMuonData(AHashMap p, AEvent e) - { - super(p,e); - chi2=p.getFloatArray("chi2"); - } - - public String getParameterGroup() - { - return "Muon"; - } - - public float getchi2(int index) - { - return chi2[index]; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM(pT[k],eta[k],phi[k],0.1057); - sum.add(start); - } - - return sum; - } - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsObjects", "MuonPt", " |ET|", pT); - cut("CutsObjects", "Muonchi2", " |chi2|", chi2); - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - msg.append("\n chi2 = "); - msg.append(chi2[index]); - - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMuonHitData.java b/graphics/AtlantisJava/src/atlantis/data/AMuonHitData.java deleted file mode 100644 index 85717f5fa904..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMuonHitData.java +++ /dev/null @@ -1,192 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.*; -import atlantis.parameters.*; - -public abstract class AMuonHitData extends AHitData { - - protected float[] rho; - protected float[] phi; - protected float[] x; - protected float[] y; - protected float[] z; - protected int[] sector; - protected int[] station; - protected boolean[] measuresPhi; - - public static final int DOES_NOT_MEASURE_PHI=0; - public static final int MEASURES_PHI=1; - - // remove when go to compact id ( if compact id was in a sensible form) - String[] identifier; - - AMuonHitData(AHashMap p, AEvent e) { - super(p,e); - x=p.getFloatArray("x"); - y=p.getFloatArray("y"); - z=p.getFloatArray("z"); - rho=new float[numData]; - phi=new float[numData]; - for(int i=0; i<numData; ++i) { - rho[i]=(float)Math.sqrt(x[i]*x[i]+y[i]*y[i]); - phi[i]=(float)Math.atan2(y[i], x[i]); - if(phi[i]<0.) phi[i]+=AMath.TWO_PI; - } - identifier=p.getStringArray("identifier"); - station=new int[numData]; - sector=new int[numData]; - measuresPhi=new boolean[numData]; - for(int i=0; i<numData; ++i) { - // should be moved to AHitData - sub[i]=getSub(i); - sector[i]=getSector(i); - station[i]=getStation(i); - measuresPhi[i]=getMeasuresPhi(i); - } - } - - /** - * Get the name used for associating this datatype/collection. For the - * muon hits no storegate key is used. - * @return - */ - public String getFullName() { - return getName(); - } - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == numColorTypes + 1) // colour by Track Segment - { - colorBy(getSegments()); - } - return numColorTypes + 1; - - } // internalColor() ---------------------------------------------------- - - - abstract protected int getStation(int index); - - abstract public int getSector(int index); - - abstract protected int getSub(int index); - - abstract protected boolean getMeasuresPhi(int index); - - protected String getSegments() { - AEnumeratorParameter key = (AEnumeratorParameter) parameterStore.get("MuonSegment", "MuonSegmentCollections"); - - return "MuonSegment" + key.getCurrentText(); - } - - public int getRZSign(int index) { - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff=Math.abs(phi[index]-phiMid); - - int sign=-1; - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - sign=1; - return sign; - } - - protected String getReconstructedTracks() { - AData tracks = event.getTrackData("MuonTrack"); - if (tracks == null) { - return null; - } else { - return tracks.getName() + tracks.getStoreGateKey(); - } - } - - // get the distance of closest approach of the inifinite line representing the - // drift tube axis to Z axis - // Normal this is rho of the hit, but need not be for non standard modules - // (e.g. near feet) - static double getSectorRho(int sector, double rho, double phi) { - return rho*Math.abs(Math.cos(phi-sector*AMath.PI_BY_8)); - } - - protected void applyCuts() { - cutIndex(); - cutSimulatedTracks(); - cutReconstructedTracks(); - cutSegments(); - } - - // keep only muon hits in the input muon sectors - protected void cutMuonSector(int[] sector) { - AParameter p=parameterStore.get("XZ", "Phi"); - - // display muon data when phi is in the middle of a sector - if(p.getD() % 22.5 < 1e-2) { - int sect=(int)Math.round((p.getD() % 360.) / 22.5); - - int num=0; - - for(int i=0; i<numDraw; i++) { - int s=sector[listdl[i]]; - - if(s==sect||s==sect-8||s==sect+8) - listdl[num++]=listdl[i]; - } - numDraw=num; - } else { - numDraw=0; - } - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.RHO+" = "+String.format("%.3f",rho[index])+"\n "+ - "z = " + String.format("%.3f",z[index]) + "cm\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - String temp = getNameScreenName() + " (id: " + identifier[index] + " index: " + index + ")" + - "\n " + AMath.RHO + " = " + String.format("%.3f",rho[index]) + " cm" + - "\n " + AMath.PHI + " = " + String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)" + - "\n z = " + String.format("%.3f",z[index]) + " cm"; - - if(sector[index]!=-1) - { - temp += "\n sector = " + sector[index]; - } - - return temp; - } - - protected void setType() { //What is this doing?? - int[][] recon=event.getAssociationManager().get(getName(),getReconstructedTracks()); - for(int i=0; i<numData; i++) { - if( (recon!=null&&recon[i]!=null)) - type[i]=1; - else - type[i]=0; - } - } - - /** - * cut hits if connected/unconnected to reconstructed tracks - */ - protected void cutReconstructedTracks() - { - int cutOption = parameterStore.get("CutsMuon", "HitsByRTr").getI(); - cutByAssociationTo(getReconstructedTracks(), getName(), cutOption); - } - - /** - * cut hits if connected/unconnected to reconstructed segments - */ - protected void cutSegments() - { - int cutOption = parameterStore.get("CutsMuon", "HitsBySegment").getI(); - cutByAssociationTo(getSegments(), getName(), cutOption); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMuonROIData.java b/graphics/AtlantisJava/src/atlantis/data/AMuonROIData.java deleted file mode 100755 index 567f2f9cf5ab..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMuonROIData.java +++ /dev/null @@ -1,34 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.utils.AHashMap; - -/** - * - * Muon Region Of Interest - * - * @author Zdenek Maxa, Qiang Lu, Juergen Thomas - */ -public class AMuonROIData extends AROIData -{ - AMuonROIData(AHashMap p, AEvent e) - { - super(p,e); - } // AMuonROIData() ------------------------------------------------------ - - public String getParameterGroup() - { - return "MuonROI"; - } // getParameterGroup() ------------------------------------------------ - - public String getName() - { - return "MuonROI"; - } // getName() ---------------------------------------------------------- - - public String getNameScreenName() - { - return "MuonROI"; - } // getNameScreenName() ------------------------------------------------ - -} // class AMuonROIData ====================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/AMuonSegmentData.java b/graphics/AtlantisJava/src/atlantis/data/AMuonSegmentData.java deleted file mode 100755 index 96adc598bcf4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMuonSegmentData.java +++ /dev/null @@ -1,56 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AHashMap; - -/** - * - * @author Eric Jansen - */ -public class AMuonSegmentData extends ASegmentData { - - /** Creates a new instance of AMuonSegmentData */ - AMuonSegmentData(AHashMap p, AEvent e) { - super(p,e); - String assocKey = getName() + getStoreGateKey(); - event.getAssociationManager().add(new AAssociation(assocKey, "MDT", numHits, hits, event)); - event.getAssociationManager().add(new AAssociation(assocKey, "RPC", numHits, hits, event)); - event.getAssociationManager().add(new AAssociation(assocKey, "TGC", numHits, hits, event)); - event.getAssociationManager().add(new AAssociation(assocKey, "CSC", numHits, hits, event)); - } - - public void makeDrawList() { - super.makeDrawList(); - - if (currentProjection instanceof AProjectionYX) { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) { - numDraw = 0; - } else { - int num = 0; - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - - // Anything beyond z=13m or below r=6.5m is endcap - if (Math.sqrt(x[j]*x[j] + y[j]*y[j]) > 650. - && Math.abs(z[j]) < 1300.) { - listdl[num++] = j; - } - } - numDraw = num; - } - } - } - - public String getParameterGroup() { - return "MuonSegment"; - } - - public String getName() { - return "MuonSegment"; - } - - public String getNameScreenName() { - return "MuonSegment"; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AMuonTrackData.java b/graphics/AtlantisJava/src/atlantis/data/AMuonTrackData.java deleted file mode 100644 index cd768ea2a38d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AMuonTrackData.java +++ /dev/null @@ -1,200 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; - - -/** - * - * @author Eric Jansen - */ -public class AMuonTrackData extends ATrackData { - - private static ALogger logger = ALogger.getLogger(AMuonTrackData.class); - - protected float[] phi0; - protected float[] pT; - protected float[] cotTheta; - protected int[] author; - - /** Creates a new instance of AMuonTrackData */ - AMuonTrackData(AHashMap p, AEvent e) throws AAtlantisException { - super(p,e); - String assocKey = getName() + getStoreGateKey(); - if(p.get("numHits") != null) { - int[] numHits = p.getIntArray("numHits"); - int[] hits = p.getIntArray("hits"); - - event.getAssociationManager().add(new AAssociation(assocKey, "MDT", numHits, hits,event)); - event.getAssociationManager().add(new AAssociation(assocKey, "RPC", numHits, hits,event)); - event.getAssociationManager().add(new AAssociation(assocKey, "TGC", numHits, hits,event)); - event.getAssociationManager().add(new AAssociation(assocKey, "CSC", numHits, hits,event)); - } - - phi0 = p.getFloatArray("phi0"); - pT = p.getFloatArray("pt"); - cotTheta = p.getFloatArray("cotTheta"); - author = p.getUnsureIntArray("trackAuthor"); - } - - public String getParameterGroup() { - return "MuonTrack"; - } - - public String getName() { - return "MuonTrack"; - } - - public String getNameScreenName() { - return "MuonTrack"; - } - - protected void finalizeConstruction() { - super.finalizeConstruction(); -/* - // needs ZVTx - h = new AHelix[numData]; - for(int i = 0; i < numData; ++i) { - double p = AMath.getPFromPttL(pT[i], cotTheta[i]); - double xVtx = parameterStore.get("Event", "XVtx").getD(); - double yVtx = parameterStore.get("Event", "YVtx").getD(); - double phiVtx = Math.atan2(yVtx, xVtx); - double rho = Math.sqrt(xVtx * xVtx + yVtx * yVtx); - double d0 = -rho * Math.sin(phi0[i] - phiVtx); - // correct for average energy loss - double pTCorrected = pT[i] * (p + 3.7) / p; - - h[i] = new AHelix((float)d0, - (float)(parameterStore.get("Event", "ZVtx").getD()), - (float)Math.toDegrees(phi0[i]), cotTheta[i], (float)pTCorrected); - //calculatePhiCorrection(i); - } -*/ - } - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP - && parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() != DRAW_NEWHELIX) - { - ag.draw(window.calculateDisplay(getVPUser(window, projection))); - } - else - super.draw(window, ag, projection); - } - - protected ACoord getVPUser(AWindow window, AProjection projection) - { - makeDrawList(); - double[][][] hv = new double[2][2*numDraw][]; - int[] index = new int[2 * numDraw]; - int num = 0; - for (int j=0; j<numDraw; j++) { - int list = listdl[j]; - ADHelix dhelix = new ADHelix(h[list]); - double s1 = dhelix.getAStart(); - double s2 = 179.; - // hardwire projection.getMinRho() == 2. for now - s1 = dhelix.intersectWithRadialCylinder(((AProjection2D)projection).getMinRho(), s1, s2); - double sEnd = dhelix.intersectWithCylinder(true, AProjectionVP.getRhoVPlot(), - true, AProjectionVP.getZVPlot()); - s2 = Math.max(Math.min(s2, sEnd), s1); - // if the whole helix is to be drawn (which are unusual - // helices, shorten it a little to avoid wraparound problems - if (s1 == 0. && s2 == 180.) s2 = 179.; - - if (parameterStore.get("VP", "ShortV").getStatus() && !parameterStore.get("Data", "S3D").getStatus()) { - s1 = s2 - parameterStore.get("VP", "ShortV").getD() * (s2 - s1); - } - - // by Zdenek: - // if this condition is not entered, hv array containing coordinates - // remains empty and Atlantis will crash with NullPointerException - // in AWindow.calculateUser(ACoord user) - // magic constants here (e.g. s2) need to be understood and this - // method best reimplemented - for(int sign=-1; sign<=1; sign+=2) { - // ugly must change structure at some point - AProjectionVP.sign = sign; - ACoord pointsOnHelix; - if (s2 > s1) { - pointsOnHelix = dhelix.drawHelix(window, (AProjection2D) projection, s1, s2); - hv[0][num] = pointsOnHelix.hv[0][0]; - hv[1][num] = pointsOnHelix.hv[1][0]; - } else { - hv[0][num] = new double[0]; - hv[1][num] = new double[0]; - } - index[num] = list; - num++; - } - } - - // by Zdenek: - // condition to prevent NullPointerException in AWindow.calculateUser() - // see previous comment ... - // this condition should be removed completely 'bug in helix' - // problem is understood - ACoord coord = null; - if(hv[0].length > 0 && hv[0][0] == null) - { - logger.warn("AMuonTrackData.getVPUser(): \"" + this.getName() + - ":" + this.getStoreGateKey() + "\" can't be drawn in eta-phi"); - coord = ACoord.NO_DATA; - } - else - { - coord = new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - } - return window.calculateUser(coord).includePhiWrapAround(projection.getName()); - } - - - - private float[] getEta() - { - float[] eta = new float[numData]; - if(polylinedTrack) - { - for(int i = 0; i < numData; i++) - { - if(h!=null && h[i]!=null) eta[i] = (float) h[i].eta(); - else eta[i] = (float) AParameterUtilities.eta(z[i][0], rho[i][0]); - } - } - else - { - for(int i = 0; i < numData; i++) - { - eta[i] = (float) h[i].eta(); - } - - } - - return eta; - } - - - - protected void applyCuts() { - cutIndex(); - cut("CutsInDet", "Pt", " |Pt|", pT); - cut("CutsMuon", "Pt", " |Pt|", pT); - cut("CutsInDet", "trackAuthor", " Author", author); - cutPhi(phi0); - if(parameterStore.get("CutsATLAS", "CutEta").getStatus()) - { - cutEta(getEta()); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AOldHelix.java b/graphics/AtlantisJava/src/atlantis/data/AOldHelix.java deleted file mode 100755 index a3f490c57170..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AOldHelix.java +++ /dev/null @@ -1,338 +0,0 @@ -package atlantis.data; - -import atlantis.globals.AGlobals; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.utils.AMath; -import atlantis.utils.A3Vector; -import atlantis.utils.ALogger; - -import static java.lang.Math.PI; - -/** - * This is a convenience class to group together the six helix parameters. - */ -public class AOldHelix { - - private final static ALogger logger = ALogger.getLogger(AOldHelix.class); - - private static final int SIZE=5; - private static final boolean DEBUG = false; - private static final APar parameterStore = APar.instance(); - // C - constant depending on the magnetic field, constant proportional - // to curvature in the magnetic field - private static final double C; - static { - AParameter curvatureParameter = parameterStore.get("Event", "Curvature"); - if (curvatureParameter!=null) { - C = curvatureParameter.getD(); - } - else { - C = 100/0.6;; - logger.error("Curvature parameter not found, defaulting to "+C); - } - } - - // These fields are public but final so cannot be altered. - /** Distance between circle and (0,0) at point of closest approach (PCA). */ - public final double d0; - /** Z of circle at PCA. */ - public final double z0; - /** phi0 of track at PCA [degrees] */ - public final double phi0; - /** Dip of track = Pz/pTTrack =0.5 * ( E - 1/E ) : constant along the helix */ - public final double tL; - /** Transverse momentum * charge. */ - public final double pT; - /** ln( Pz/pTTrack + SQRT[(Pz/pTTrack)**2 +1 ] */ - public final double eta; - /** Angle between (0,0) and vertex as seen from the circle center [degrees]? - * For helices starting at PCA, startPhi=0. This is the case for reconstructed - * helices that are not yet associated to a secondary vertex or are - * drawn to PCA. - * Mutable because it is changed when tracks are used to fit a vertex. */ - double startPhi; - - // negative end vertex means none exits - double rhoVertex = 0.0; - private double rhoEndVertex = -1.0; - - private int numHits; - - double[][] cov=null; - - AOldHelix() { - this(0, 0, 0, 0, 0); - }; - - /** Standard Helix constructor without end vertex */ - AOldHelix(float rhoVertex, float phiVertex, float zVertex, - float pTTrack, float phiTrack, float etaTrack, int charge ) { - this(rhoVertex,phiVertex,zVertex,pTTrack,phiTrack,etaTrack,charge,-1); - } - - /** - * Standard Helix constructor with end vertex. - * - * Note: this method is not called when creating helix representation of - * reconstructed InDet tracks, but is called for simulated InDet tracks. - * - * @param rhoVertex rho of vertex from which track starts - * @param phiVertex phi of vertex from which track starts - * @param zVertex Z of vertex from which track starts - * @param pTTrack transverse track momentum > 0 - * @param phiTrack phi of track seen from vertex - * @param etaTrack eta = -ln(tg(theta/2)), theta = arctg(pTTrack/Pz) = 2*arctg( e**(-eta)) - * @param charge charge = +1 or -1 - * @param rhoEndVertex - */ - AOldHelix(float rhoVertex, float phiVertex, float zVertex, - float pTTrack, float phiTrack, float etaTrack, int charge, float rhoEndVertex ) { - /* - * Derived: - * rC = signed radius of circle (positive for positive particle, which - * loops in the clockwise direction in the standard xy projection, - * given that Bz is positive in the ATLAS solenoid) - * xC = x position of center of circle - * yC = y position of center of circle - * E = E**eta - * charge=1 if icode>=0 else charge=-1 - * - * Calculation: - * rC = C*pTTrack C = 100./0.6 - * xC = rhoVertex*cos(phiVertex) + rC*sin(phiTrack) - * yC = rhoVertex*sin(phiVertex) - rC*cos(phiTrack) - * tl = Pz/pTTrack = 0.5 * ( E - 1/E ) - * d0 = rC - sqrt(xC*xC + yC*yC) - * startPhi = pi/2 - phiTrack + atan2(yC,xC) modify startPhi to: -pi/2 < startPhi < pi/2 - * z0 = zVertex - rC*startPhi*tl - * phi0 = phiTrack + startPhi - * pCharge = charge*pTTrack - * Change startPhi and phi0 from radians to degrees. - * - */ - double rC=C*pTTrack*charge; - if (DEBUG) logger.debug("AOldHelix: charge, rC = "+charge+", "+rC); - double xC=rhoVertex*Math.cos(phiVertex)+rC*Math.sin(phiTrack); - double yC=rhoVertex*Math.sin(phiVertex)-rC*Math.cos(phiTrack); - if (DEBUG) logger.debug("AOldHelix: xCyC"+" "+xC+" "+yC); - double e=Math.exp(etaTrack); - tL=0.5*(e-1./e); - eta = etaTrack; - d0=rC-charge*Math.sqrt(xC*xC+yC*yC); - phiTrack = (float) AMath.nearestPhiRadians(phiTrack); - double temp=Math.atan2(yC, xC); - temp = AMath.nearestPhiRadians(temp); - double startPhiRad=charge*(PI/2)-phiTrack+temp; - startPhiRad = AMath.nearestPhiRadians(startPhiRad, 0); - z0=zVertex-rC*startPhiRad*tL; - phi0=Math.toDegrees(phiTrack+startPhiRad); - startPhi=charge*Math.toDegrees(startPhiRad); - pT=charge*pTTrack; - - // keep rhoEndVertex for simulated tracks with a daughter - this.rhoVertex=rhoVertex; - this.rhoEndVertex = rhoEndVertex; - } - - /** - * Construct AOldHelix object. - * @param d0 - * @param z0 - * @param phi0 [degrees] - * @param tL - * @param pT - */ - AOldHelix(float d0, float z0, float phi0, - float tL, float pT) { - this.d0=d0; - this.z0=z0; - this.phi0=AMath.nearestPhiDegrees(phi0); - this.tL=tL; - this.eta = calculateEta(this.tL); - this.pT=pT; - startPhi=0.; - } - - AOldHelix(float d0, float z0, float phi0, - float tL, float pT, int numHits) { - this(d0, z0, phi0, tL, pT); - this.numHits=numHits; - } - - AOldHelix(float d0, float z0, float phi0, - float tL, float pT, float[][] c) { - this.d0=d0; - this.z0=z0; - this.phi0=phi0; - this.tL=tL; - this.eta = calculateEta(this.tL); - this.pT=pT; - this.startPhi=0.; - - cov=new double[c.length][]; - if(c.length!=SIZE) - logger.error("Helix error "+c.length); - for(int i=0; i<c.length; ++i) { - if(c[i].length!=SIZE) - logger.error("Helix error "+c.length); - cov[i]=new double[c[i].length]; - } - for(int i=0; i<c.length; ++i) - for(int j=0; j<c[i].length; ++j) - cov[i][j]=c[i][j]; - } - - AOldHelix(float d0, float z0, float phi0, - float tL, float pT, int numHits, float[][] c) { - this(d0, z0, phi0, tL, pT, c); - this.numHits=numHits; - } - - public double[] getPar() { - return new double[] {d0, z0, Math.toRadians(phi0), tL, 1./pT}; - } - - public double[][] getCov() { - return cov; - } - - public double getRhoEndVertex(){ - return rhoEndVertex; - } - -/** - * Set Phi start so that the track will originate from the point on the - * reconstructed track in the YX plane which is closest to the point (Vx,Vy). - * Only used when drawing tracks originating from a reconstructed vertex. - */ - public void setPhiStartByXYPoint(double Vx, double Vy) { - //construct a local super object to get the xC and yC numbers - ADHelix Dh=new ADHelix(this); - // do the calculation to find the starting angle - double Xc=Dh.getxC(); - double Yc=Dh.getyC(); - - double a=-1.*(Vx-Xc); - double b=-1.*(Vy-Yc); - - double pTTrack=pT; - double phiTrack=Math.toRadians(phi0); - - double charge=1; - if(pTTrack<0.0) charge=-1.; - - double temp=Math.atan2(b, a); - temp = AMath.nearestPhiRadians(temp); - double sPhi=charge*(PI/2)-phiTrack+temp; - sPhi = AMath.nearestPhiRadians(sPhi, 0); - sPhi=charge*Math.toDegrees(sPhi); - startPhi=Math.abs(sPhi); - } - - public String toString() { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = ""; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",Math.abs(pT))+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta)+"\n "+ - AMath.PHI+" = "+String.format("%.3f",phi0)+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",Math.abs(pT)*Math.cos(Math.toRadians(phi0)))+" GeV "+ - "\n Py="+String.format("%.3f",Math.abs(pT)*Math.sin(Math.toRadians(phi0)))+" GeV "+ - "\n Pz="+String.format("%.3f",Math.abs(pT)*Math.sinh(eta))+" GeV "+ - "\n Charge = " + (int)(pT/Math.abs(pT)); - return output; - } - - String s=""; - double f=1.; - - if(numHits>0) - s+="\n numHits = "+numHits; - // if(Math.abs(d0)<0.1) f=10000.; - s+="\n d0 = "+String.format("%.3f",f*d0); - if(cov!=null) s+=" "+AMath.PLUSMINUS+" "+String.format("%.3f",f*Math.sqrt(cov[0][0])); - if(f>100) - s+=" um"; - else - s+=" cm"; - f=1.; - // if(Math.abs(z0)<0.1) f=10000.; - s+="\n z0 = "+String.format("%.3f",f*z0); - if(cov!=null) s+=" "+AMath.PLUSMINUS+" "+String.format("%.3f",Math.sqrt(f*cov[1][1])); - if(f>100) - s+=" um"; - else - s+=" cm"; - - double zVtx = parameterStore.get("Event", "ZVtx").getD(); - //if(Math.abs(z0-zVtx) < 0.1) f=10000.; - s+="\n |z0-zVtx| = "+String.format("%.3f",f*Math.abs(z0-zVtx)); - if(f>100) - s+=" um"; - else - s+=" cm"; - - s+="\n phi0 = "+String.format("%.3f",phi0); - if(cov!=null) - { - s += " " + AMath.PLUSMINUS + " " + - String.format("%.3f",Math.toDegrees(Math.sqrt(cov[2][2]))) + - AMath.DEGREES; - } - else - { - s += AMath.DEGREES; - - } - s+= " (" + String.format("%.3f",Math.toRadians(phi0)); - if(cov != null) - { - s += " " + AMath.PLUSMINUS + " " + - String.format("%.3f",Math.toRadians(Math.sqrt(cov[2][2]))) + " rad)"; - } - else - { - s += " rad)"; - } - - s+="\n "+AMath.ETA+" = "+String.format("%.3f",eta); - if(cov!=null) { - // based on the relation between eta and ctgTheta - double etaError = Math.sqrt(cov[3][3] / (tL * tL + 1.0)); - s+=" "+AMath.PLUSMINUS+" "+String.format("%.3f",etaError); - } - s+="\n tL = "+String.format("%.3f",tL); - if(cov!=null) s+=" "+AMath.PLUSMINUS+" "+String.format("%.3f",Math.sqrt(cov[3][3])); - s+="\n pT = "+String.format("%.2f",pT) + " GeV"; - if(cov!=null) { - double sigmaPt=Math.abs(1./(Math.abs(1./pT)+Math.sqrt(cov[4][4]))-Math.abs(pT)); - - s+=" "+AMath.PLUSMINUS+" "+String.format("%.3f",sigmaPt)+" GeV"; - } - if(pT<0.) - s+="\n p = "+String.format("%.2f",-AMath.getPFromPttL(pT,tL)); - else - s+="\n p = "+String.format("%.2f",AMath.getPFromPttL(pT,tL)); - s+= " GeV"; - - return s; - } - - public A3Vector getP() { - double pTrans=Math.abs(pT); - double phi=Math.toRadians(phi0); - return new A3Vector(pTrans*Math.cos(phi), pTrans*Math.sin(phi), pTrans*tL); - } - - /** eta = -ln(tg theta/2), so eta = -ln(sqrt(ctgtheta*ctgtheta+1)-ctgtheta) */ - private static double calculateEta(double ctgTheta) { - double eta; - eta = -Math.log(Math.sqrt(ctgTheta * ctgTheta + 1.0) - ctgTheta); - return eta; - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/data/APDGTable.java b/graphics/AtlantisJava/src/atlantis/data/APDGTable.java deleted file mode 100755 index 5fde73d31361..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/APDGTable.java +++ /dev/null @@ -1,107 +0,0 @@ -package atlantis.data; - -import atlantis.globals.AGlobals; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import atlantis.utils.xml.*; -import java.util.*; -import java.io.File; -import java.io.InputStream; -import org.w3c.dom.*; -import javax.xml.parsers.*; - -/** - * Read a PDG table from the file pdg.xml and provide - * basic accessor functions to its particles - */ -public final class APDGTable { - - //The logger - private final static ALogger logger = ALogger.getLogger(APDGTable.class); - - //Wether to validate the XML document - private final static boolean VALIDATION=true; - - //The particle table linked by PDG code - private final static Map<Integer, AParticle> particles = new HashMap<Integer, AParticle>(100); - - //Always read in the Hashmap - static { - readPDG(APDGTable.getFileInCurrentUserThenAtlantisHome("configuration","pdg.xml")); - } - - //Read in the PDG table from a file - private static void readPDG(String fileName) { - try { - DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); - - factory.setValidating(VALIDATION); - DocumentBuilder parser=factory.newDocumentBuilder(); - - parser.setErrorHandler(new AXMLErrorHandler()); - InputStream is = AUtilities.getFileAsStream(fileName); - Node pdg=parser.parse(is).getDocumentElement(); - NodeList particlesList=pdg.getChildNodes(); - int particlesCount=particlesList.getLength(); - - for(int i=0; i<particlesCount; i++) { - Node particle=particlesList.item(i); - - if(particle.getNodeType()==Node.ELEMENT_NODE) { - AParticle p=new AParticle(particle); - - particles.put(new Integer(p.getCode()), p); - } - } - } catch(Exception e) { - logger.error("Failed reading PDG table", e); - } - } - - public static int getCharge(int code) { - int sign=code/Math.abs(code); - AParticle p=particles.get(new Integer(Math.abs(code))); - - if(p!=null) - return p.getCharge()*sign; - else throw new ParticleNotFoundError(code); - } - - public static String getName(int code) { - AParticle p=particles.get(new Integer(Math.abs(code))); - int sign=1; - - if(code<0) sign=-1; - if(p!=null) - return p.getName(sign); - else throw new ParticleNotFoundError(code); - } - - public static int getParticleType(int code) { - AParticle p=particles.get(new Integer(Math.abs(code))); - - if(p!=null) - return p.getType(); - else throw new ParticleNotFoundError(code); - } - - //Declare our own error type here - no special implementation - public static class ParticleNotFoundError extends Error { - - //Only implement Error constructor with particle code - ParticleNotFoundError(int code){ - super("Particle with code "+code+" not found in PDG table"); - } - } - -public static String getFileInCurrentUserThenAtlantisHome(String directory, String name) -{ - File user = new File(name); - if (!user.canRead()) - { - return AGlobals.instance().getHomeDirectory() + directory + - System.getProperty("file.separator") + name; - } - return name; -}; -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AParticle.java b/graphics/AtlantisJava/src/atlantis/data/AParticle.java deleted file mode 100755 index 8007ae2c46f0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AParticle.java +++ /dev/null @@ -1,57 +0,0 @@ -package atlantis.data; - - -import atlantis.output.AExceptionHandler; - -import org.w3c.dom.*; - - -/** - * This class is used to store the properties of a particle. Used by APDGTable. - */ -public class AParticle { - private String name; - private int charge; - private int type; - private int code; - - private String[] chargeRep=new String[] { "-", "0", "+"}; - - public AParticle(Node node) { - NamedNodeMap atts=node.getAttributes(); - - try { - charge=Integer.parseInt(atts.getNamedItem("charge").getNodeValue()); - type=Integer.parseInt(atts.getNamedItem("type").getNodeValue()); - code=Integer.parseInt(atts.getNamedItem("code").getNodeValue()); - name=atts.getNamedItem("name").getNodeValue(); - } catch(NumberFormatException e) { - AExceptionHandler.processException("PDG error in Particle Node: "+node, e); - } - } - - public int getCharge() { - return charge; - } - - public int getType() { - return type; - } - - public int getCode() { - return code; - } - - public String getName() { - return name; - } - - public String getName(int sign) { - if(charge!=0) { - if(name.equals("Proton")&&sign==1) return "Proton"; - if(name.equals("Proton")&&sign==-1) return "Antiproton"; - return name+chargeRep[charge*sign+1]; - } else - return name; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/APhotonData.java b/graphics/AtlantisJava/src/atlantis/data/APhotonData.java deleted file mode 100755 index 7f942031f096..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/APhotonData.java +++ /dev/null @@ -1,166 +0,0 @@ -package atlantis.data; - -import java.util.Vector; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.A4Vector; - -/** - * Reconstructed Photon - */ -public class APhotonData extends AAODData -{ - private enum isEMe { Tight, Loose, none } - - private int[] isEM; - - private Vector<Enum> isEMEnum = new Vector<Enum>(); - private String[] label; - - APhotonData(AHashMap p, AEvent e) - { - super(p,e); - String[] isEMString=p.getUnsureStringArray("isEMString"); - label=p.getUnsureStringArray("label"); - isEM=p.getUnsureIntArray("isEM"); - - if(isEMString!=null) - { - for(String s : isEMString) - { - try { - isEMEnum.add(isEMe.valueOf(s)); - } - catch(IllegalArgumentException q) { - isEMEnum.add(isEMe.none); - } - } - } - else - { - for(int i=0;i<numData;i++) - { - isEMEnum.add(isEMe.none); - } - } - } - - public String getParameterGroup() - { - return "Photon"; - } - - public String getName() - { - return "Photon"; - } - - public String getisEMEnum(int index) - { - return isEMEnum.get(index).toString(); - } - - public int getisEM(int index) - { - return isEM[index]; - } - - public String getlabel(int index) - { - return label[index]; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM(pT[k],eta[k],phi[k],0); - sum.add(start); - } - return sum; - } - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsObjects", "PhotonPt", " |ET|", pT); - - // because of the retriever bug, currently 2048 means 0 for isEM - // remove this for block when the bug is fixed - if(isEM != null) - { - for(int i=0; i<isEM.length; i++) - { - if(isEM[i]==2048) - isEM[i] = 0; - } - } - - cut("CutsObjects", "PhotonisEM", " isEM", isEM); - - if (parameterStore.get("CutsObjects", "PhotonisEMString").getStatus()) - { - int cutSub = parameterStore.get("CutsObjects", "PhotonisEMString").getI(); - cutArrayEnum(isEMEnum, cutSub, "Photon isEMString"); - } - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - - if (isEM != null) - { - msg.append("\n isEM = "); - msg.append(isEM[index]); - } - if (label != null) - { - msg.append("\n label = "); - msg.append(label[index]); - } - - return msg.toString(); - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/data/APixelClusterData.java b/graphics/AtlantisJava/src/atlantis/data/APixelClusterData.java deleted file mode 100644 index acbe38d5856d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/APixelClusterData.java +++ /dev/null @@ -1,403 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * PixelCluster - Pixel clusters, as SiCluster but for Pixels - * reads in PixelCluster datatype - */ -public class APixelClusterData extends AHitData -{ - // read in from event file - private float[] x; - private float[] y; - private float[] z; - private float[] widthx; - private float[] widthy; - private int[] etaModule; - private int[] phiModule; - private float[] eloss; - - // calculated - private float[][] rho; - private float[][] phi; - private int[] layer; - - public static final int U_CLUSTER = -1; - public static final int PHI_CLUSTER = 0; - public static final int V_CLUSTER = 1; - public static final int ENDCAP_MINUS = 0; - public static final int BARREL = 1; - public static final int ENDCAP_PLUS = 2; - - - public String getParameterGroup() - { - return "PixelCluster"; - } - - public String getName() - { - return "PixelCluster"; - } - - public String getNameScreenName() - { - return "PixelCluster"; - } - - public float[] getX() - { - return x; - } - - public float[] getY() - { - return y; - } - - public float[] getZ() - { - return z; - } - - APixelClusterData(AHashMap p, AEvent e) - { - super(p,e); - x = p.getFloatArray("x0"); - y = p.getFloatArray("y0"); - z = p.getFloatArray("z0"); - widthx = p.getFloatArray("widthx"); - widthy = p.getFloatArray("widthy"); - eloss = p.getFloatArray("eloss"); - - rho = new float[2][numData]; - phi = new float[2][numData]; - - layer = new int[numData]; - for (int i = 0; i < numData; ++i) - { - sub[i] = getSub(id[i]); - layer[i] = getLayer(id[i]); - } - - etaModule = (p.get("etaModule") != null) ? p.getIntArray("etaModule") : null; - phiModule = (p.get("phiModule") != null) ? p.getIntArray("phiModule") : null; - - } // APixelClusterData() --------------------------------------------------- - - - - protected void calculateRhoPhi() - { - calculateRhoPhi(x, y, rho[0], phi[0]); - // treat wraparound - for (int i = 0; i < numData; ++i) - { - if (Math.abs(0 - phi[0][i]) > Math.PI) - { - if (0 - phi[0][i] > 0) - { - phi[0][i] += AMath.TWO_PI; - } - } - } // for - } // calculateRhoPhi() -------------------------------------------------- - - private void cutSubdetector() - { - AParameter par = parameterStore.get("CutsInDet", "SCT"); - if (par.getI() != -1) - { - cutArray(sub, par.getI(), "Barrel/Endcap"); - } - } // cutSubdetector() --------------------------------------------------- - - - protected void applyCuts() - { - cutIndex(); - cutOrientation(); - cutSubdetector(); - cut("CutsInDet", "Layer", "Layer", layer); - cutSimulatedTracks(); - cutReconstructedTracks(); - cutPhi(phi[0]); - cutEta(); - } // applyCuts() -------------------------------------------------------- - - private void cutEta() - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - if (!par.getStatus()) - return; - double etaCut = par.getD(); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double eta1 = AParameterUtilities.eta(z[list], rho[0][list]); - if (eta1 > etaLowerCut && eta1 < etaUpperCut) - listdl[num++] = list; - } - numDraw = num; - } // cutEta() ----------------------------------------------------------- - - public int getLayer(int id) - { - int layer = (id >> 27) & 0x3; - int sub = getSub(id); - if (sub != BARREL) - { - layer += 7; - } - return layer; - } // getLayer() --------------------------------------------------------- - - public int getSub(int id) - { - // bitwise operation to determine cluster position from id (1,0,2 -> endcap-,barrel,endcap+) - return(id >> 29) & 0x3; - } // getSub() ----------------------------------------------------------- - - public int getOrientation(int id) - { - int side = (id & 0x400) >> 10; - int sub = getSub(id); - if ((side == 1 && sub == BARREL) || (side == 0 && sub != BARREL)) - { - return PHI_CLUSTER; - } - - int layer = getLayer(id); - if (layer % 2 == 1) - { - return U_CLUSTER; - } - - return V_CLUSTER; - } // getOrientation() --------------------------------------------------- - - protected void cutOrientation() - { - int num = 0; - AParameter stereoAnglePar = parameterStore.get("PixelCluster", "Stereo"); - if (!stereoAnglePar.getStatus()) - { - return; - } - int orientation = stereoAnglePar.getI(); - for (int i = 0; i < numDraw; i++) - { - if (orientation == getOrientation(id[listdl[i]])) - { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } // cutOrientation() --------------------------------------------------- - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if (colorFunction == numColorTypes + 1) - { - colorBy(layer); - } - else if (colorFunction == numColorTypes + 2) - { - colorByOrientation(); - } - else if (colorFunction == numColorTypes + 3) - { - colorByEloss(); - } - - return numColorTypes + 2; - } // internalColor() ---------------------------------------------------- - - protected void colorByOrientation() - { - int numColors = parameterStore.get("HitColors", "Number").getI(); - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) - { - color[i] = (byte) col[getOrientation(id[i]) + 1 % numColors]; - } - } // colorByOrientation() ----------------------------------------------- - - protected void colorByEloss() - { - // This method currently uses the uncorrected value for eloss as an approximation to dE/dx - // Need to either loop over one track collection for associated tracks in Atlantis, or do this in JiveXML.. - - int numColors = parameterStore.get("HitColors", "Number").getI(); - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) - { - if(eloss[i] < 0.5) - { - color[i] = (byte) col[1 + 1 % numColors]; // blue - } - else if(eloss[i] >=0.5 && eloss[i] < 2) - { - color[i] = (byte) col[5 + 1 % numColors]; // yellow - } - else if(eloss[i] >=2) - { - color[i] = (byte) col[2 + 1 % numColors]; // red/orange - } - } - } // colorByEloss() ----------------------------------------------------- - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index; - - String temp = getNameScreenName() + " (id: " + id[index] + " index: " + index +")\n" + - " orientation = " + getOrientation(id[index]); - temp += "\n x = " + x[index]; - temp += "\n y = " + y[index]; - temp += "\n z = " + z[index]; - temp += "\n " + AMath.RHO + " = " + rho[0][index] + " " + rho[1][index]; - temp += "\n " + AMath.ETA + " module = "; - temp += (etaModule != null) ? Integer.toString(etaModule[index]) : "n/a"; - temp += "\n " + AMath.PHI + " module = "; - temp += (phiModule != null) ? Integer.toString(phiModule[index]) : "n/a"; - temp += "\n widthx = "; - temp += (widthx != null) ? Float.toString(widthx[index]) : "n/a"; - temp += "\n widthy = "; - temp += (widthy != null) ? Float.toString(widthx[index]) : "n/a"; - temp += "\n eloss = "; - temp += (eloss != null) ? Float.toString(eloss[index]) : "n/a"; - - temp += super.getHitInfo(index); // finds barcode information - - return temp; - } // getHitInfo() ------------------------------------------------------- - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 1; j++) - { - hv[0][j][i] = x[list]; - hv[1][j][i] = y[list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.SYMBOLS); - } // getYXUser() -------------------------------------------------------- - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[0][list] - phiMid); - double sign; - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - { - sign = +1.; - } - else - { - sign = -1.; - } - - for (int j = 0; j < 1; j++) - { - hv[0][j][i] = z[list]; - hv[1][j][i] = sign * rho[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.SYMBOLS); - } // getRZUser() -------------------------------------------------------- - - protected ACoord getFRUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 1; j++) - { - hv[0][j][i] = rho[j][list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], z[list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.SYMBOLS).includePhiWrapAround("FR"); - } // getFRUser() -------------------------------------------------------- - - protected ACoord getFZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 1; j++) - { - hv[0][j][i] = z[list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], z[list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.SYMBOLS).includePhiWrapAround("FZ"); - } // getFZUser() -------------------------------------------------------- - - protected ACoord getVPUser() - { - makeDrawList(); - int numTotal = 2 * numDraw; - double[][][] hv = new double[2][numTotal][2]; - int[] index = new int[numTotal]; - double[] sign = new double[] { -1., 1. }; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - double deltaEta = AProjectionVP.getDeltaEta(rho[0][list], z[list]); - double eta = AParameterUtilities.eta(z[list], rho[0][list]); - for (int j = 0; j < 2; j++) - { - // pixels displayed halfway in phi and eta, for some reason - // quick fix = multiply by 2 - hv[0][2 * i + j][0] = 2*(eta + sign[j] * deltaEta); - hv[1][2 * i + j][0] = 2*Math.toDegrees(phi[0][list]); - index[2 * i + j] = list; - } - - } - return new ACoord(hv, index, this, ACoord.POLYLINES).includePhiWrapAround("VP"); - } // getVPUser() -------------------------------------------------------- - -} // class APixelClusterData =================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/APixelRDOData.java b/graphics/AtlantisJava/src/atlantis/data/APixelRDOData.java deleted file mode 100644 index f9c78bd7bf8e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/APixelRDOData.java +++ /dev/null @@ -1,160 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - - -/* - * PixelRDO - Pixel Raw Data object (SpacePoint Raw Data Objects) - * The class is derived from AS3DData class (SpacePoint) - * Parameters expected in the event file for the PixelRDO datatype - * id x y z etaModule phiModule - */ -public class APixelRDOData extends AS3DData -{ - private int[] etaModule = null; - private int[] phiModule = null; - - - public String getParameterGroup() - { - return "PixelRDO"; - - } // getParameterGroup() ------------------------------------------------ - - - - public String getName() - { - return "PixelRDO"; - - } // getName() ---------------------------------------------------------- - - - - public String getNameScreenName() - { - return "PixelRDO"; - - } // getNameScreenName() ------------------------------------------------ - - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.RHO+" = "+String.format("%.3f",rho[index])+"\n "+ - "z = "+String.format("%.3f",z[index])+" cm\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - String temp = getNameScreenName() + " (id: " + id[index] + " index: " + index + ")" + - "\n " + AMath.RHO + " = " + String.format("%.3f",rho[index]) + " cm" + - "\n " + AMath.PHI + " = " + - String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)" + - "\n z = " + String.format("%.3f",z[index]) + " cm"; - - temp += "\n " + AMath.ETA + " module = "; - temp += (etaModule != null) ? Integer.toString(etaModule[index]) : "n/a"; - temp += "\n " + AMath.PHI + " module = "; - temp += (phiModule != null) ? Integer.toString(phiModule[index]) : "n/a"; - - return temp; - - } // getHitInfo() ------------------------------------------------------- - - - - APixelRDOData(AHashMap p, AEvent e) - { - super(p,e); - id = p.getIntArray("id"); - etaModule = (p.get("etaModule") != null) ? p.getIntArray("etaModule") : null; - phiModule = (p.get("phiModule") != null) ? p.getIntArray("phiModule") : null; - - } // APixelRDOData() ---------------------------------------------------- - - - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - // int colorFunction=APar.get(PARAMETER_GROUP, "ColorFunction").getI(); - // color by error will go here - // if(colorFunction==numColorTypes+1) - // colorByError() - to implement - - return numColorTypes + 1; - - } // internalColor() ---------------------------------------------------- - - - - protected void applyCuts() - { - cutIndex(); - cutPhi(phi); - cutEta(rho, z); - if(etaModule != null) - { - cut("CutsInDet", "EtaModule", " EtaModule", etaModule); - } - if(phiModule != null) - { - cut("CutsInDet", "PhiModule", " PhiModule", phiModule); - } - - cutSubdetector(); - } // applyCuts() -------------------------------------------------------- - - private void cutSubdetector() - { - AParameter subPar = parameterStore.get("CutsInDet", "SCT"); - if(subPar.getI() != -1) - cutArray(sub, subPar.getI(), "Barrel/Endcap"); - } - - protected ACoord getFRUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = rho[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FR"); - - } // getFRUser() -------------------------------------------------------- - - - - protected ACoord getFZUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = z[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FZ"); - - } // getFZUser() -------------------------------------------------------- - -} // class APixelRDOData ==================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/APulseShapePlot.java b/graphics/AtlantisJava/src/atlantis/data/APulseShapePlot.java deleted file mode 100644 index 8f1279d0fd0a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/APulseShapePlot.java +++ /dev/null @@ -1,513 +0,0 @@ -package atlantis.data; - -import java.util.Vector; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.WindowEvent; -import java.awt.event.WindowAdapter; - -import javax.swing.JFrame; -import javax.swing.JPanel; - -// JAS libraries used by Plot class below -import hep.aida.IAnalysisFactory; -import hep.aida.ITree; -import hep.aida.IPlotter; -import hep.aida.IDataPoint; -import hep.aida.IDataPointSet; -import hep.aida.IDataPointSetFactory; -import hep.aida.IPlotterStyle; -import hep.aida.ref.plotter.PlotterUtilities; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; - - -/** - * Plotting pulse shapes and ADC counts for calorimeters - * - * @author Zdenek Maxa - - */ -public class APulseShapePlot -{ - protected static Component guiComponent = AGlobals.instance().getGuiFrame(); - private static Vector<JFrame> frameVector = new Vector<JFrame>(); - - private APulseShapePlot() {} - - - /** - * Plot real pulse shapes plots - ADC counts and calculated values of the - * real pulse shape plot over it. Works for multiple channels (TILE) as - * well as for a single channel e.g. LAr - * - * @param adcCounts int[][] - * @param realPulse double[][] - * @param step double - * @param subTitle String[] - * @param title String - */ - public static void plotRealPulseShapes(int[][] adcCounts, double[][] realPulse, - double step, String[] subTitle, String title) - { - JFrame frame = new JFrame(title); - frame.setTitle(title); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - AIcon.setIconImage(frame); - frame.setLocation(guiComponent.getLocation()); - Plot p = new Plot(); - frame.setContentPane(p); - p.plotRealPulseShapes(adcCounts, realPulse, step, subTitle); - frame.pack(); - int windowWidth = 330 + ((adcCounts.length - 1) * 110); - int windowHeight = 300; - frame.setSize(windowWidth, windowHeight); - frame.setVisible(true); - - frame.addWindowListener(new AllWindowsDisposer()); - frameVector.add(frame); - - } // plotRealPulseShapes() ---------------------------------------------- - - public static void plotRawCellPulseShapes(int[][] adcCounts, double[][] rawPulse, - double[][] cellPulse, double step, - String[] subTitle, String title) - { - JFrame frame = new JFrame(title); - frame.setTitle(title); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - AIcon.setIconImage(frame); - frame.setLocation(guiComponent.getLocation()); - Plot p = new Plot(); - frame.setContentPane(p); - p.plotRawCellPulseShapes(adcCounts, rawPulse, cellPulse, step, subTitle); - frame.pack(); - int windowWidth = 440 + ((adcCounts.length - 1) * 140); - int windowHeight = 400; - frame.setSize(windowWidth, windowHeight); - frame.setVisible(true); - - frame.addWindowListener(new AllWindowsDisposer()); - frameVector.add(frame); - - } // plotRealPulseShapes() ---------------------------------------------- - - /** - * Plots only ADC counts, used as follows: - * APulseShapePlot.plotADCCounts(adcCounts[index], title) - * still used for instance when real pulse shapes plot data is not - * available, e.g. LAr presampler (layer 0) - - * @param data int[][] - * @param title String title of window - * @param axis String[] title for the horizontal axis on each plot (if null uses "bunch crossing") - */ - public static void plotADCCounts(int[][] data, String title, String[] axis) - { - String[] labels = new String[data.length]; - String[] colors = new String[data.length]; - for(int i=0; i<data.length; i++) - { - labels[i]="ADC counts"; - colors[i]="blue"; - } - String[] newAxis; - if(axis!=null) - { - newAxis=axis; - } - else - { - newAxis= new String[data.length]; - for(int i=0; i<data.length; i++) - { - newAxis[i] = "bunch crossing"; - } - } - plotADCCounts(data, title, newAxis, labels, colors); - } - - - - /** - * Plots only ADC counts, used as follows: - * APulseShapePlot.plotADCCounts(adcCounts[index], title) - * still used for instance when real pulse shapes plot data is not - * available, e.g. LAr presampler (layer 0) - - * @param data int[][] - * @param title String title of window - * @param axis String[] titles for the horizontal axis on each plot - * @param labels String[] titles for each plot - * @param colors String[] color of datapoints for each plot - */ - public static void plotADCCounts(int[][] data, String title, String[] axis, String[] labels, String[] colors) - { - JFrame frame = new JFrame(title); - AIcon.setIconImage(frame); - frame.setLocation(guiComponent.getLocation()); - Plot p = new Plot(); - frame.setContentPane(p); - p.plotADCCounts(data, axis, labels, colors); - frame.pack(); - int windowWidth = 330+ ((data.length - 1) * 110); - int windowHeight = 300; - frame.setSize(windowWidth, windowHeight); - frame.setVisible(true); - - frame.addWindowListener(new AllWindowsDisposer()); - frameVector.add(frame); - - } // plotADCCounts() -------------------------------------------------- - - - - static class AllWindowsDisposer extends WindowAdapter - { - public void windowClosing(WindowEvent e) - { - for(int i = 0; i < frameVector.size(); i++) - { - JFrame cf = frameVector.get(i); - cf.dispose(); - } - frameVector.removeAllElements(); - } - - } // class AllWindowsDisposer =========================================== - - -} // class ACaloPulseShapePlot ============================================== - - - -/** - * - * <p>Title: Plot</p> - * - * <p>Description: Plotting class using JAS library </p> - * - */ -class Plot extends JPanel -{ - - public Plot() - { - super(new BorderLayout()); - - } // Plot() ------------------------------------------------------------- - - - - protected void plotRealPulseShapes(int[][] adcCounts, double[][] realPulse, - double step, String[] subTitle) - { - - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(); - IDataPointSetFactory dpsf = af.createDataPointSetFactory(tree); - - // Create a two dimensional IDataPointSet - IDataPointSet[] dataPointSet = new IDataPointSet[adcCounts.length]; - for(int i = 0; i < adcCounts.length; i++) - { - String myTitle = (subTitle != null) ? subTitle[i] : "Real pulse shape"; - - double[] x = new double[adcCounts[i].length]; - double[] y = new double[adcCounts[i].length]; - double[] e = new double[adcCounts[i].length]; - - for(int ii = 0; ii < adcCounts[i].length; ii++) - { - x[ii] = ii + 1.0; // counting from 1 (to 9 for TILE) - y[ii] = (double) adcCounts[i][ii]; - e[ii] = 0.0; // arrays with errors - } - - // first parameter must be path - what for here? - dataPointSet[i] = dpsf.createXY(myTitle, x, y, e, e); - dataPointSet[i].setTitle(myTitle); - } // over number of channels - - // Create a two dimensional IDataPointSet - IDataPointSet[] dataPointSetReal = new IDataPointSet[realPulse.length]; - for(int i = 0; i < realPulse.length; i++) - { - String myTitle = (subTitle != null) ? subTitle[i] : "Real pulse shape"; - - double[] x = new double[realPulse[i].length]; - double[] y = new double[realPulse[i].length]; - double[] e = new double[realPulse[i].length]; - - double d = 1.0; - for(int ii = 0; ii < realPulse[i].length; ii++) - { - x[ii] = d; - y[ii] = realPulse[i][ii]; - e[ii] = 0.0; // arrays with errors - d += step; - } - - // first parameter must be path - what for here? - dataPointSetReal[i] = dpsf.createXY(myTitle, x, y, e, e); - dataPointSetReal[i].setTitle(myTitle); - - } // over number of channels - - - IPlotter plotter = af.createPlotterFactory().create(""); - - plotter.createRegions(adcCounts.length, 1); // regions 1x1, 1x2, ... - - // set common style parameters for both regions - IPlotterStyle style = af.createPlotterFactory().createPlotterStyle(); - style.xAxisStyle().setLabel("bunch crossing"); - style.yAxisStyle().setLabel("ADC counts"); - style.titleStyle().textStyle().setColor("black"); - style.titleStyle().textStyle().setBold(true); - style.xAxisStyle().labelStyle().setColor("black"); - style.yAxisStyle().labelStyle().setColor("black"); - - // set no legend at plots - style.statisticsBoxStyle().setVisible(false); // statistical legend - style.legendBoxStyle().setVisible(false); // legend for function fit - - for(int i = 0; i < adcCounts.length; i++) - { - // set style parameters different for regions - style.dataStyle().markerStyle().setParameter("size", "2"); - style.dataStyle().markerStyle().setShape("box"); // "square" - plotter.region(i).style().dataStyle().markerStyle().setColor("red"); - plotter.region(i).plot(dataPointSetReal[i], style); - - style.dataStyle().markerStyle().setParameter("size", "7"); - style.dataStyle().markerStyle().setShape("dot"); // "circle" - plotter.region(i).style().dataStyle().markerStyle().setColor("blue"); - plotter.region(i).plot(dataPointSet[i], style); - } - - // now embed the plotter - add(PlotterUtilities.componentForPlotter(plotter), BorderLayout.CENTER); - - } // plotRealPulseShapes() ---------------------------------------------- - - - - - /** - * Method creates multiple plots of ADC counts only. - * multiple channels, no fit, no pulse shapes. - * or plots of ADC Counts pulse shapes. - * - * @param data int[][] - * @param labels String[] titles for each plot - */ - public void plotADCCounts(int[][] data, String[] axis, String[] labels, String[] colors) - { - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(); - IDataPointSetFactory dpsf = af.createDataPointSetFactory(tree); - - // Create a IDataPointSet (one dimension) - IDataPointSet[] dataPointSet = new IDataPointSet[data.length]; - for(int j = 0; j < data.length; j++) - { - - dataPointSet[j] = dpsf.create("plot", labels[j], 2); - - for(int i = 0; i < data[j].length; i++) - { - dataPointSet[j].addPoint(); - IDataPoint dp = dataPointSet[j].point(i); - - dp.coordinate(0).setValue(i); - dp.coordinate(1).setValue(data[j][i]); - } - } - - - IPlotter plotter = af.createPlotterFactory().create(""); - - plotter.createRegions(data.length, 1); // regions 1x1, 1x2, ... - - IPlotterStyle style = af.createPlotterFactory().createPlotterStyle(); - style.yAxisStyle().setLabel("ADC counts"); - style.dataStyle().markerStyle().setParameter("size", "7"); - style.dataStyle().markerStyle().setShape("dot"); - style.titleStyle().textStyle().setColor("black"); - style.titleStyle().textStyle().setBold(true); - style.xAxisStyle().labelStyle().setColor("black"); - style.yAxisStyle().labelStyle().setColor("black"); - - // set no legend at plots - style.statisticsBoxStyle().setVisible(false); // statistical legend - style.legendBoxStyle().setVisible(false); // legend for function fit - - for(int j = 0; j < data.length; j++) - { - plotter.region(j).style().xAxisStyle().setLabel(axis[j]); - plotter.region(j).style().dataStyle().markerStyle().setColor(colors[j]); - plotter.region(j).style().dataStyle().outlineStyle().setColor(colors[j]); - - // plot the data - points ('style' parameter is optional for plotter) - plotter.region(j).plot(dataPointSet[j], style); - } - // now embed the plotter - add(PlotterUtilities.componentForPlotter(plotter), BorderLayout.CENTER); - - } // plotADCCounts() ------------ --------------------------------------- - - - protected void plotRawCellPulseShapes(int[][] adcCounts, double[][] rawPulse, - double[][] cellPulse, - double step, String[] subTitle) - { - - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(); - IDataPointSetFactory dpsf = af.createDataPointSetFactory(tree); - - // Create a two dimensional IDataPointSet - IDataPointSet[] dataPointSet = new IDataPointSet[adcCounts.length]; - for(int i = 0; i < adcCounts.length; i++) - { - String myTitle = "ADC counts"; - - double[] x = new double[adcCounts[i].length]; - double[] y = new double[adcCounts[i].length]; - double[] e = new double[adcCounts[i].length]; - - for(int ii = 0; ii < adcCounts[i].length; ii++) - { - x[ii] = ii + 1.0; // counting from 1 (to 9 for TILE) - y[ii] = (double) adcCounts[i][ii]; - e[ii] = 0.0; // arrays with errors - } - - // first parameter must be path - what for here? - dataPointSet[i] = dpsf.createXY(myTitle, x, y, e, e); - dataPointSet[i].setTitle(myTitle); - } // over number of channels - - // Create a two dimensional IDataPointSet - IDataPointSet[] dataPointSetCell = new IDataPointSet[cellPulse.length]; - for(int i = 0; i < cellPulse.length; i++) - { - String myTitle = "Cell time"; - - double[] x = new double[cellPulse[i].length]; - double[] y = new double[cellPulse[i].length]; - double[] e = new double[cellPulse[i].length]; - - double d = 1.0; - for(int ii = 0; ii < cellPulse[i].length; ii++) - { - x[ii] = d; - y[ii] = cellPulse[i][ii]; - e[ii] = 0.0; // arrays with errors - d += step; - } - - // first parameter must be path - what for here? - dataPointSetCell[i] = dpsf.createXY(myTitle, x, y, e, e); - dataPointSetCell[i].setTitle(myTitle); - - } // over number of channels - - - // Create a two dimensional IDataPointSet - IDataPointSet[] dataPointSetRaw = new IDataPointSet[rawPulse.length]; - for(int i = 0; i < rawPulse.length; i++) - { - String myTitle = "Raw time"; - - double[] x = new double[rawPulse[i].length]; - double[] y = new double[rawPulse[i].length]; - double[] e = new double[rawPulse[i].length]; - - double d = 1.0; - for(int ii = 0; ii < rawPulse[i].length; ii++) - { - x[ii] = d; - y[ii] = rawPulse[i][ii]; - e[ii] = 0.0; // arrays with errors - d += step; - } - - // first parameter must be path - what for here? - dataPointSetRaw[i] = dpsf.createXY(myTitle, x, y, e, e); - dataPointSetRaw[i].setTitle(myTitle); - - } // over number of channels - - - IPlotter plotter = af.createPlotterFactory().create(""); - - plotter.createRegions(adcCounts.length, 1); // regions 1x1, 1x2, ... - - // set common style parameters for both regions - IPlotterStyle style = af.createPlotterFactory().createPlotterStyle(); - style.xAxisStyle().setLabel("bunch crossing"); - style.yAxisStyle().setLabel("ADC counts"); - style.titleStyle().textStyle().setColor("black"); - style.titleStyle().textStyle().setBold(true); - style.xAxisStyle().labelStyle().setColor("black"); - style.yAxisStyle().labelStyle().setColor("black"); - - style.statisticsBoxStyle().setVisible(false); // statistical legend - style.legendBoxStyle().setVisible(true); // legend for function fit - - for(int i = 0; i < adcCounts.length; i++) - { - // set style parameters different for regions - style.dataStyle().markerStyle().setParameter("size", "4"); - style.dataStyle().markerStyle().setShape("box"); // "square" - style.dataStyle().showInLegendBox(true); - plotter.region(i).style().dataStyle().markerStyle().setColor("red"); - plotter.region(i).plot(dataPointSetRaw[i], style); - - style.dataStyle().markerStyle().setParameter("size", "2"); - style.dataStyle().markerStyle().setShape("box"); // "square" - style.dataStyle().showInLegendBox(true); - plotter.region(i).style().dataStyle().markerStyle().setColor("green"); - plotter.region(i).plot(dataPointSetCell[i], style); - - style.dataStyle().markerStyle().setParameter("size", "7"); - style.dataStyle().markerStyle().setShape("dot"); // "circle" - style.dataStyle().showInLegendBox(false); - plotter.region(i).style().dataStyle().markerStyle().setColor("blue"); - plotter.region(i).plot(dataPointSet[i], style); - - //plotter.region(i).style().legendBoxStyle().boxStyle().borderStyle().setVisible(false); - - plotter.region(i).setTitle((subTitle != null) ? subTitle[i] : "Real pulse shape"); - } - - // now embed the plotter - add(PlotterUtilities.componentForPlotter(plotter), BorderLayout.CENTER); - - } // plotRealPulseShapes() ---------------------------------------------- - - - -} // class Plot ============================================================= - - - -/* following lines for hints only (futher JAS plotting styles settings) - - IPlotterStyle style = plotterFactory.createPlotterStyle(); - style.xAxisStyle().tickLabelStyle().setFontSize(14); - style.xAxisStyle().tickLabelStyle().setBold(true); - style.xAxisStyle().tickLabelStyle().setColor("blue"); - style.xAxisStyle().labelStyle().setFontSize(24); - style.xAxisStyle().labelStyle().setItalic(true); - style.titleStyle().textStyle().setFontSize(30); - style.dataStyle().markerStyle().setParameter("size","12"); - style.dataStyle().markerStyle().setParameter("shape","3"); - style.dataStyle().markerStyle().setParameter("color","blue"); - plotter.region(0).plot(h1); - plotter.region(0).plot(h2, style); - plotter.show(); -*/ diff --git a/graphics/AtlantisJava/src/atlantis/data/AROIData.java b/graphics/AtlantisJava/src/atlantis/data/AROIData.java deleted file mode 100644 index 0b3a539e2505..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AROIData.java +++ /dev/null @@ -1,334 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Base class for EmTauROI, JetROI and MuonROI - * - * @author Gary Taylor, Zdenek Maxa, Qiang Lu - */ - -abstract public class AROIData extends AData -{ - protected float[] eta; - protected float[] phi; - protected float[] energy; - // energy variables for EmTauROIs - protected float[] energyEM; - protected float[] energyTAU; - - private int drawOrFill = AGraphics.FILL; - - AROIData(AHashMap p, AEvent e) - { - super(p,e); - eta = p.getFloatArray("eta"); - phi = p.getFloatArray("phi"); - energy = p.getFloatArray("energy"); - if(this instanceof AEmTauROIData) - { - energyEM = p.getFloatArray("energyEM"); - energyTAU = p.getFloatArray("energyTAU"); - } - } - - public float getEnergy(int index) - { - return energy[index]; - } - public float getEnergyEM(int index) - { - return energyEM[index]; - } - public float getEnergyTAU(int index) - { - return energyTAU[index]; - } - - public float getEta(int index) - { - return eta[index]; - } - - public float getPhi(int index) - { - return phi[index]; - } - - public float[] getEnergy() - { - return energy; - } - - public float[] getEnergyEM() - { - return energyEM; - } - - public float[] getEnergyTAU() - { - return energyTAU; - } - - public float[] getEta() - { - return eta; - } - - public float[] getPhi() - { - return phi; - } - - protected int getDrawOrFill() - { - return drawOrFill; - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - "\n Energy="+String.format("%.3f",energy[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - double deta = parameterStore.get(PARAMETER_GROUP, "deta").getD(); - double dphi = parameterStore.get(PARAMETER_GROUP, "dphi").getD(); - - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n energy = "); - msg.append(String.format("%.3f",energy[index])); - msg.append(" GeV\n "); - if(this instanceof AEmTauROIData) - { - if(energyEM != null) - { - msg.append("energyEM = "); - msg.append(String.format("%.3f",energyEM[index])); - msg.append(" GeV\n "); - } - if(energyTAU != null) - { - msg.append("energyTAU = "); - msg.append(String.format("%.3f",energyTAU[index])); - msg.append(" GeV\n "); - } - } - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - msg.append("\n deta = "); - msg.append(String.format("%.3f",deta)); - msg.append("\n dphi = "); - msg.append(String.format("%.3f",Math.toDegrees(dphi))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",dphi) + " rad)"); - - return msg.toString(); - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if (colorFunction == 0) - { - colorByConstant(); - } - else if (colorFunction == 1) - { - colorByIndex(); - } - - return 1; - } - - protected void applyCuts() - { - cutIndex(); - cutPhi(phi); - cutEta(eta); - } - - protected ACoord getVPUser() - { - drawOrFill = AGraphics.DRAW; - - double deta = parameterStore.get(PARAMETER_GROUP, "deta").getD() / 2; - double dphiDeg = Math.toDegrees(parameterStore.get(PARAMETER_GROUP, "dphi").getD()) / 2; - double phiDeg = 0; - - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - phiDeg = Math.toDegrees(phi[list]); - - // without the cross in the middle - // hv[0][i] = AMath.xBox(eta[list], deta); // x-dx,x-dx,x+dx,x+dx - // hv[1][i] = AMath.yBox(phiDeg, dphiDeg); // y-dy,y+dy,y+dy,y-dy - - hv[0][i] = new double[] { eta[list] - deta, eta[list] - deta, - eta[list] + deta, eta[list] - deta, eta[list] + deta, - eta[list] - deta, eta[list] + deta, eta[list] + deta }; - hv[1][i] = new double[] { phiDeg - dphiDeg, phiDeg + dphiDeg, - phiDeg - dphiDeg, phiDeg - dphiDeg, phiDeg + dphiDeg, - phiDeg + dphiDeg, phiDeg - dphiDeg, phiDeg + dphiDeg }; - index[i] = list; - } - - return new ACoord(hv, index, this).includePhiWrapAround("VP"); - } - - protected ACoord getYXUser() - { - drawOrFill = AGraphics.FILL; - double dphi = parameterStore.get(PARAMETER_GROUP, "dphi").getD() / 2; - - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiPlus = phi[list] + dphi; - double phiMinus = phi[list] - dphi; - double cosPlus = Math.cos(phiPlus); - double sinPlus = Math.sin(phiPlus); - double cosMinus = Math.cos(phiMinus); - double sinMinus = Math.sin(phiMinus); - - double rhoPlus = 1150; - double rhoMinus = 1130; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = rhoMinus * cosPlus; - hv[1][i][0] = rhoMinus * sinPlus; - // x1, y1 - hv[0][i][1] = rhoPlus * cosPlus; - hv[1][i][1] = rhoPlus * sinPlus; - // x2, y2 - hv[0][i][2] = rhoPlus * cosMinus; - hv[1][i][2] = rhoPlus * sinMinus; - // x3, y3 - hv[0][i][3] = rhoMinus * cosMinus; - hv[1][i][3] = rhoMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - - protected ACoord getFRUser() - { - ACoord coordFR = getYXUser().convertYXToFR().includePhiWrapAround("FR"); - return coordFR; - } - - protected ACoord getRZUser() - { - drawOrFill = AGraphics.FILL; - double deta = parameterStore.get(PARAMETER_GROUP, "deta").getD() / 2; - - makeDrawList(); - double[][][] hv = new double[2][numDraw][4]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi[list] - phiMid); - double rSign; - if (phiDiff > Math.PI / 2. && phiDiff <= 3 * Math.PI / 2.) - rSign = -1; - else - rSign = 1; - - // calculate theta based on the eta value - double theta = Math.atan(Math.exp(-Math.abs(eta[list]))) * 2.0; - double thetaPlus = Math.atan(Math.exp(-(Math.abs(eta[list]) - deta))) * 2.0; - double thetaMinus = Math.atan(Math.exp(-(Math.abs(eta[list]) + deta))) * 2.0; - - if ((eta[list] > 0.) && (rSign == -1)) - { - theta = 2 * Math.PI - theta; - thetaPlus = 2 * Math.PI - thetaPlus; - thetaMinus = 2 * Math.PI - thetaMinus; - } - else if ((eta[list] < 0.) && (rSign == -1)) - { - theta += Math.PI; - thetaPlus += Math.PI; - thetaMinus += Math.PI; - } - else if ((eta[list] < 0.) && (rSign == 1)) - { - theta = Math.PI - theta; - thetaPlus = Math.PI - thetaPlus; - thetaMinus = Math.PI - thetaMinus; - } - - double cosPlus = Math.cos(thetaPlus); - double sinPlus = Math.sin(thetaPlus); - double cosMinus = Math.cos(thetaMinus); - double sinMinus = Math.sin(thetaMinus); - - // decide the region based on the theta value - final byte TOP_BOTTOM = 0; - final byte LEFT_RIGHT = 1; - byte region = TOP_BOTTOM; - // hard-coded value is based on the values in Geometry - if (Math.abs(Math.tan(theta)) < 0.8) - region = LEFT_RIGHT; - - double radiusMinus = 0.; - switch (region) - { - case TOP_BOTTOM: - radiusMinus = 1330 / Math.abs(Math.sin(theta)); - break; - case LEFT_RIGHT: - radiusMinus = 1630 / Math.abs(Math.cos(theta)); - break; - } - double radiusPlus = radiusMinus + 20; - - // 4 corners of the cell area - // x0, y0 - hv[0][i][0] = radiusMinus * cosPlus; - hv[1][i][0] = radiusMinus * sinPlus; - // x1, y1 - hv[0][i][1] = radiusPlus * cosPlus; - hv[1][i][1] = radiusPlus * sinPlus; - // x2, y2 - hv[0][i][2] = radiusPlus * cosMinus; - hv[1][i][2] = radiusPlus * sinMinus; - // x3, y3 - hv[0][i][3] = radiusMinus * cosMinus; - hv[1][i][3] = radiusMinus * sinMinus; - - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.POLYGONS); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ARPCData.java b/graphics/AtlantisJava/src/atlantis/data/ARPCData.java deleted file mode 100755 index de50662cfd6d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ARPCData.java +++ /dev/null @@ -1,311 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -/** - * for comments see AMDTData - */ - -public class ARPCData extends AMuonHitData -{ - protected float[] width; - protected float[] length; - protected int[] gasGap; - - private static ALogger logger = ALogger.getLogger(ARPCData.class); - - public String getParameterGroup() - { - return "RPC"; - } - - public String getName() - { - return "RPC"; - } - - public String getNameScreenName() - { - return "RPC"; - } - - ARPCData(AHashMap p, AEvent e) - { - super(p,e); - length = p.getFloatArray("length"); - width = p.getFloatArray("width"); - gasGap = new int[numData]; - for (int i = 0; i < numData; ++i) - gasGap[i] = getGasGap(i); - } - - protected int getStation(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(1) == 'M') { - return AIdHelper.rpcDoubletR(id[index]) - 1; - } else { - return AIdHelper.rpcDoubletR(id[index]) + 1; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding RPC identifier", e); - } - - return 0; - } - - protected int getSub(int index) - { - return 0; - } - - public int getSector(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - - if (stationName.charAt(2) == 'L') { - return 2 * (AIdHelper.stationPhi(id[index]) - 1); - } else { - return 2 * (AIdHelper.stationPhi(id[index]) - 1) + 1; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding RPC identifier", e); - } - - return 0; - } - - protected int getGasGap(int index) - { - try { - return AIdHelper.rpcGasGap(id[index]); - } catch (AAtlantisException e) { - logger.error("Problem decoding RPC identifier", e); - } - - return 0; - } - - protected boolean getMeasuresPhi(int index) - { - try { - if (AIdHelper.rpcMeasuresPhi(id[index]) == 1) { - return true; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding RPC identifier", e); - } - - return false; - } - - protected void applyCuts() - { - super.applyCuts(); - if (parameterStore.get("CutsATLAS", "CutPhi").getStatus()) - cutPhi(phi, getDPhi()); - if (parameterStore.get("CutsATLAS", "CutEta").getStatus()) - cutEtaDZ(rho, z, getDZ()); - } - - private float[] getDPhi() - { - // only roughly correct - // must create all - float[] dphi = new float[numData]; - - // need only fill for those in draw list - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - if (measuresPhi[list]) - dphi[list] = (float) Math.abs(Math.atan2(width[list] / 2., rho[list])); - else - dphi[list] = (float) Math.abs(Math.atan2(length[list] / 2., rho[list])); - } - return dphi; - } - - private float[] getDZ() - { - // must create all - float[] dz = new float[numData]; - - // need only fill for those in draw list - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - if (measuresPhi[list]) - dz[list] = (float) (length[list] / 2.); - else - dz[list] = (float) (width[list] / 2.); - } - return dz; - } - - protected ACoord getYXUser() - { - makeDrawList(); - cutArray(measuresPhi, true, " Strip"); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double r = rho[list]; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double phiSector = sector[list] * AMath.PI_BY_8; - double cosPhiSector = Math.cos(phiSector); - double sinPhiSector = Math.sin(phiSector); - double d = width[list] / 2.; - if (!measuresPhi[list]) - d = length[list] / 2.; - double x = r * cosPhi; - double y = r * sinPhi; - double dx = d * sinPhiSector; - double dy = d * cosPhiSector; - - hv[0][0][i] = x + dx; - hv[1][0][i] = y - dy; - hv[0][1][i] = x - dx; - hv[1][1][i] = y + dy; - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getRZUser() - { - makeDrawList(); - cutArray(measuresPhi, false, " Strip"); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[list] - phiMid); - int sign = -1; - - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign = 1; - double rC = sign * AMDTData.getSectorRho(sector[list], rho[list], phi[list]); - double zC = z[list]; - double w = width[list] / 2.; - - hv[0][0][i] = zC - w; - hv[1][0][i] = rC; - hv[0][1][i] = zC + w; - hv[1][1][i] = rC; - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getXZUser() - { - makeDrawList(); - cutMuonSector(sector); - cutArray(measuresPhi, false, " Strip"); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - int sect=(int)Math.round(parameterStore.get("XZ", "Phi").getD() / 22.5); - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int sign = 1; - - if (sector[list] != sect) - sign = -1; - double rC = sign * AMDTData.getSectorRho(sector[list], rho[list], phi[list]); - double zC = z[list]; - double w = width[list] / 2.; - - hv[0][0][i] = zC - w; - hv[1][0][i] = rC; - hv[0][1][i] = zC + w; - hv[1][1][i] = rC; - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getFRUser() - { - makeDrawList(); - cutArray(measuresPhi, true, " Strip"); - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - private void makeDrawListFZ() - { - int mode = parameterStore.get("FZ", "Mode").getI(); - - if (mode == 0 || mode >= 4) - { - numDraw = 0; - } - else - { - makeDrawList(); - cut(" Station", station, "==", mode - 1); - } - cut("FZ", "RPCGasGap", " RPC Gas Gap", gasGap); - } - - protected ACoord getFZUser() - { - makeDrawListFZ(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - index[i] = list; - if (measuresPhi[list]) - { - hv[0][i] = AMath.xBox(z[list], length[list] / 2.); - hv[1][i] = AMath.yBox(Math.toDegrees(phi[list]), Math.toDegrees((width[list] / 2.) / rho[list])); - } - else - { - double zC = z[list]; - double r = rho[list]; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double phiSector = sector[list] * AMath.PI_BY_8; - double cosPhiSector = Math.cos(phiSector); - double sinPhiSector = Math.sin(phiSector); - double d = length[list] / 2.; - double w = width[list] / 2.; - double x = r * cosPhi; - double y = r * sinPhi; - double dx = d * sinPhiSector; - double dy = d * cosPhiSector; - double phi1 = Math.toDegrees(Math.atan2(y - dy, x + dx)); - double phi2 = Math.toDegrees(Math.atan2(y + dy, x - dx)); - hv[0][i] = AMath.xBox(zC, w); - hv[1][i] = AMath.yBox((phi1 + phi2) / 2., (phi1 - phi2) / 2.); - - } - } - return new ACoord(hv, index, this).includePhiWrapAround("FZ"); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ARVxData.java b/graphics/AtlantisJava/src/atlantis/data/ARVxData.java deleted file mode 100644 index 6d27099259a8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ARVxData.java +++ /dev/null @@ -1,1043 +0,0 @@ -/* - * CAUTION: When working on this class, remember that the number of vertices - * is not a fixed number for an event. If the user fits additional - * vertices in Atlantis, they will be appended to the list. For this - * reason everything is using ArrayList and not simple arrays. - */ - -package atlantis.data; - -import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.Vector; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.tree.DefaultMutableTreeNode; - -import atlantis.canvas.ACanvas; -import atlantis.event.AEvent; -import atlantis.event.AData; -import atlantis.event.AAssociation; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.list.AList; -import atlantis.list.AListManager; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection3D; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.ALogger; - -import static atlantis.data.AVertex.Type.*; - -/** - * Stores Reconstructed vertices formed for fitting groups - * of tracks. There may not be any reconstructed vertices when a new event - * is read in. However, empty datatype ARVxData is always created within - * the AEvent instance. RVx instances may be added at run time by the user - * when the vertex fitter algorithm is run inside Atlantis. - * - * @author Gary Taylor - */ -public class ARVxData extends AData -{ - private static ALogger logger = ALogger.getLogger(ARVxData.class); - - // size of the arrays with coordinates of the RVx ellipse, - // size of martices - private static final int SIZE = 3; - - // vertices - saved reconstructed vertices, instances of AVertex - private ArrayList<AVertex> vertices = new ArrayList<AVertex>(); - // tracksIndex - indices of tracks (starting from 0) - private ArrayList<int[]> tracksIndex = new ArrayList<int[]>(); - // tracksId - IDs of tracks (as read from event file) - private ArrayList<int[]> tracksId = new ArrayList<int[]>(); - private ArrayList<String> tracksCollection = new ArrayList<String>(); - private ArrayList<Boolean> drawFlag = new ArrayList<Boolean>(); - // false - RVx calculated in Atlantis, true - RVx calculated in Athena - private ArrayList<Boolean> athenaOrigin = new ArrayList<Boolean>(); - - // array of flags 1 - is primary vertex candidate, this - // attribute should be accessed only during event finalise phase - private int[] primVxCand = null; - - /** Vertex type from Athena: for types see - * http://alxr.usatlas.bnl.gov/lxr/source/atlas/Tracking/TrkEvent/TrkEventPrimitives/TrkEventPrimitives/VertexType.h */ - private int[] vertexType = null; - - /** Array containing number of tracks associated with each vertex. */ - private int[] numTracks = null; - - /** Flag whether track numbers are consistent: see Trac bug #551 */ - private boolean hasConsistentTrackNumbers; - - // numData (as at all other datatypes) is used instead of numVertices - // numData variable is referenced from ADrawnGraphics2D (by .getNumData - // method) and since it wasn't set properly in case of RVx it was crashing - // in ADrawnGraphics2D.drawLine() [when rubberbanding over RVx object] - - public String getParameterGroup() - { - return "RVx"; - } - - @Override - public String getName() - { - return "RVx"; - } - - public String getNameScreenName() - { - return "RecVertex"; - } - - /** - * This constructor is called when RVx datatype is found in the event file. - * This RVx data was produced in Athena. - * @param p elements within RVx element in JiveXML input: map of names to values - * @param e parent event - * @throws AAtlantisException if failing to create data - */ - ARVxData(AHashMap p, AEvent e) throws AAtlantisException - { - super(p,e); - - int[] tracks = p.getIntArray("tracks"); - numTracks = p.getUnsureIntArray("numTracks"); - if (numTracks == null) numTracks = new int[numData]; - float[] z = p.getFloatArray("z"); - float[] y = p.getFloatArray("y"); - float[] x = p.getFloatArray("x"); - float[] covMatrix = p.getFloatArray("covMatrix"); - float[] chi2 = p.getFloatArray("chi2"); - String[] storegateKeys = null; - - // Check whether numbers of tracks agree. - hasConsistentTrackNumbers = false; - if (tracks!=null) { - int numTrackIds = tracks.length; - int numTracksFromVertices = 0; - for (int numTracksFromVertex : numTracks) { - numTracksFromVertices += numTracksFromVertex; - } - if (numTracksFromVertices == numTrackIds) { - hasConsistentTrackNumbers = true; - } - } - if (!hasConsistentTrackNumbers) { - logger.error("RVx: numbers of tracks are inconsistent."); - } - - if(p.getStringArray("sgkey") != null) - { - storegateKeys = p.getStringArray("sgkey"); - } - else - { - storegateKeys = new String[numData]; - for (int i = 0; i < numData; i++) - { - storegateKeys[i] = "n/a"; - } - } - - // Allowed to be null if element not in JiveXML. - vertexType = p.getUnsureIntArray("vertexType"); - - primVxCand = p.getUnsureIntArray("primVxCand"); - if (primVxCand == null) primVxCand = new int[numData]; - - if (hasConsistentTrackNumbers) createVertexTrackAssociations(tracks, storegateKeys); - - double[] pos = new double[SIZE]; - double[][] cov = new double[SIZE][SIZE]; - int[] tracksIdArray = null; - int[] tracksIndexArray = null; - - int n = 0; - int m = 0; - for (int i = 0; i < numData; i++) - { - // x, y, z coordinates of the RVx ellipse - pos[0] = x[i]; - pos[1] = y[i]; - pos[2] = z[i]; - - // covMatrix, resp. 3x3 cov array - // numbers are too small, so JiveXML multiplies by 10k, here inverse - // [the same happens with covMatrix for tracks - AHelixData class] - for (int j = 0; j < SIZE; j++) - { - for (int k = 0; k < j + 1; k++) - { - cov[j][k] = covMatrix[n] / 10000; - cov[k][j] = cov[j][k]; - n++; - } - } - - AVertex vertex = new AVertex(chi2[i], pos, cov); - vertices.add(vertex); // new vertex - - // Only save track details if data are consistent. - if (hasConsistentTrackNumbers) { - tracksIdArray = new int[numTracks[i]]; - tracksIndexArray = new int[numTracks[i]]; - for (int j = 0; j < numTracks[i]; j++) - { - tracksIdArray[j] = tracks[m]; - // should be removed - problem that IDs run from 1 and indices - // from 0 - will be fixed - tracksIndexArray[j] = tracks[m] - 1; - m++; - } - tracksIndex.add(tracksIndexArray.clone()); // save indices of tracks - tracksId.add(tracksIdArray.clone()); // save IDs of tracks - } - - // save storeGateKey of the Tracks which form this vertex - tracksCollection.add(storegateKeys[i]); - drawFlag.add(new Boolean(true)); - athenaOrigin.add(new Boolean(true)); - } // for(int i = 0; i < numData; i++) - } // ARVxData() --------------------------------------------------------- - - - /** - * Create vertex-track associations. and adds them to the event's association manager. - * @param tracks array of track ID numbers - * @param storegateKeys array of storegate keys, one per vertex - * Also uses numTracks: number of tracks associated with each vertex. - */ - private void createVertexTrackAssociations(int[] tracks, String[] storegateKeys) { - // Create a list of unique storegate keys. - Vector<String> uniqueStoregateKeys = new Vector<String>(); - if(!storegateKeys[0].equals("n/a")){ - uniqueStoregateKeys.add(storegateKeys[0]); - } - for(int i = 0; i < storegateKeys.length; i++){ - if(storegateKeys[i].equals("n/a")){ - continue; - } - // Check if track particle type already added to list of storegate keys - boolean inVector = false; - for (String sgKey : uniqueStoregateKeys) { - if (sgKey.equals(storegateKeys[i])) { - inVector = true; - break; - } - } - // If storegate key is not in the list, it is added. - if(!inVector){ - uniqueStoregateKeys.add(storegateKeys[i]); - } - } - // Create new association int array for each unique storegate key. - for(int i = 0; i < uniqueStoregateKeys.size(); i++){ - int trackCount = 0; - Vector<Integer> TrkNum = new Vector<Integer>(); - Vector<Integer> Track = new Vector<Integer>(); - // Creating vectors of the 'number of tracks associated to each list' and 'track Ids' - for(int j = 0; j < storegateKeys.length; j++){ - if(uniqueStoregateKeys.get(i).equals(storegateKeys[j])){ - TrkNum.add(numTracks[j]); - for(int k = trackCount; k < trackCount + numTracks[j]; k++){ - Track.add(tracks[k]); - } - } - trackCount += numTracks[j]; - } - //Converting vectors to int[] - int[] assocTracks = new int[Track.size()]; - for(int j = 0; j < Track.size(); j++){ - assocTracks[j] = Track.get(j); - } - int[] numTrks = new int[TrkNum.size()]; - for(int j = 0; j < TrkNum.size(); j++){ - numTrks[j] = TrkNum.get(j); - } - //Creating associations - AAssociation assoc = new AAssociation("RVx" + getStoreGateKey(), - "InDetTrack" + uniqueStoregateKeys.get(i), numTrks, - assocTracks, event); - event.getAssociationManager().add(assoc); - } - } - - /** - * Redefined inherited method AData.getIdFromIndex() - * the array int[] id is not used in this class (unlike other types) so - * AData.getIdFromIndex() was crashing at RVx since this array was empty - * listdl[] array (also inherited from AData) should be properly handled - * in this class (used to crash when rubberbanding over displayed RVx) - * @param index int - * @return int - */ - @Override - public int getIdFromIndex(int index) - { - return listdl[index]; - } // getIdFromIndex() ----------------------------------------------------- - - /** - * - * @param listOfTracksToVertex int[] - list of track indices (internal - * Atlantis indices starting from 0) - * @param key - Track collection storeGateKey - */ - private void createVertexFromTracks(int[] listOfTracksToVertex, String key) - { - - //Retrieving/checking for pre-existing assocation - int[][] assoc = event.getAssociationManager().get("RVx","InDetTrack" + key); - if(assoc == null){ - //Create new association for the between selected tracks and the new vertex - int[] numTracks2 = new int[1]; - numTracks2[0] = listOfTracksToVertex.length; - event.getAssociationManager().add(new AAssociation("RVx","InDetTrack" + key, numTracks2, listOfTracksToVertex, event)); - }else{//if assocation already exists add new one to it - //Remove old assocation - event.getAssociationManager().remove("InDetTrack" + key + "RVx"); - //Create new assocation by copying old one and adding extra line at the end. - int[][] newAssoc = new int[assoc.length + 1][]; - for(int i = 0; i < newAssoc.length; i++){ - if(i == assoc.length){ - newAssoc[i] = listOfTracksToVertex; - }else{ - newAssoc[i] = assoc[i]; - } - } - //recreating assocation - event.getAssociationManager().add(new AAssociation("RVx","InDetTrack" + key, newAssoc, event)); - } - - - - ATrackData aRTr = null; - aRTr = event.getTrackData("InDetTrack", key); - if (aRTr == null) - { - return; - } - // get helices of the appropriate tracks, helices are access by indices - // save the IDs of tracks into trackIdLocal which will be copied to tracksId - int[] trackIdLocal = new int[listOfTracksToVertex.length]; - AHelix[] thisHelGoToFitter = new AHelix[listOfTracksToVertex.length]; - for (int j = 0; j < listOfTracksToVertex.length; j++) - { - AHelix helix = aRTr.getModifiableHelix(listOfTracksToVertex[j]); - if (helix == null) { - AOutput.alwaysAppend("\nOne or more of the selected tracks do not have perigee parameters, " - + "the vertex cannot be created\n", ALogInterface.BAD_COMMAND); - return; - } - thisHelGoToFitter[j] = helix; - trackIdLocal[j] = aRTr.getIdFromIndex(listOfTracksToVertex[j]); - } - - - double xVtx = parameterStore.get("Event", "XVtx").getD(); - double yVtx = parameterStore.get("Event", "YVtx").getD(); - double zVtx = parameterStore.get("Event", "ZVtx").getD(); - AVertex startingPoint = new AVertex(new double[] { xVtx, yVtx, zVtx }); - try - { - // RuntimeException is thrown - no vertex found or goes on (new vertex) - AVertex vertex = AVertexFit.fitVertex(startingPoint, thisHelGoToFitter); - vertices.add(vertex); // new vertex - tracksIndex.add(listOfTracksToVertex.clone()); // save indices of tracks - tracksId.add(trackIdLocal.clone()); // save IDs of tracks - tracksCollection.add(key); - drawFlag.add(new Boolean(true)); - athenaOrigin.add(new Boolean(false)); - - int[] newNumTracks = new int[numData+1]; - int[] newPrimVxCand = new int[numData+1]; - for (int i=0; i<numData; i++) { - newNumTracks[i] = numTracks[i]; - newPrimVxCand[i] = primVxCand[i]; - } - numTracks = newNumTracks; - primVxCand = newPrimVxCand; - numTracks[numData] = listOfTracksToVertex.length; - primVxCand[numData] = 2; - - if (vertexType != null) { - int[] newVertexType = new int[numData+1]; - for (int i=0; i<numData; i++) { - newVertexType[i] = vertexType[i]; - } - vertexType = newVertexType; - vertexType[numData] = 2; - } - - double[] par = vertex.getPosition(); - double Vx = par[0]; - double Vy = par[1]; - // temp set axis and orientation of 3D rotation wrt last vertex - // adjust the starting point of the tracks according to the vertex - double Vz = par[2]; - for (int j = 0; j < thisHelGoToFitter.length; j++) - { - double a = Vx - xVtx; - double b = Vy - yVtx; - double c = Vz - zVtx; - double size = Math.sqrt(a * a + b * b + c * c); - parameterStore.get("3D", "xAxis").setD(a / size); - parameterStore.get("3D", "yAxis").setD(b / size); - parameterStore.get("3D", "zAxis").setD(c / size); - thisHelGoToFitter[j].setPhiStartByXYPoint(Vx, Vy); - } - AOutput.alwaysAppend("\n" + getHitInfo(numData) + "\n", ALogInterface.NORMAL); - numData++; - makeDrawList(); - } - catch (RuntimeException e) - { - StringBuilder temp = new StringBuilder("\nRVx: tracks ("); - for (int i = 0; i < listOfTracksToVertex.length; i++) - { - if (i > 0) - { - temp.append(", "); - } - // the tracks were accessed by indices but user wants to see - // IDs like pick prints (listOfTracksToVertex[] - indices) - temp.append(aRTr.getIdFromIndex(listOfTracksToVertex[i])); - } - AOutput.alwaysAppend(temp + ")\n not originating from a common vertex\n", ALogInterface.NORMAL); - throw e; - } - } // createVertexFromTracks() ------------------------------------------- - - /** - * 'Colour by vertex type' option, that allows to colour the vertices depending on whether they are primary, - * secondary or other vertices. - */ - protected void colorbyVertexType() { - - int pri = parameterStore.get("RVx", "PriVxColor").getI(); - int sec = parameterStore.get("RVx", "SecVxColor").getI(); - int res = parameterStore.get("RVx", "RestVxColor").getI(); - - if (vertexType!=null) { - for (int i=0; i<numData; ++i) { - int typeId = vertexType[i]; - AVertex.Type type = AVertex.Type.typeFromId(typeId); - switch (type) { - case PRIMARY: - case DUMMY: - color[i] = (byte) pri; - break; - case SECONDARY: - color[i] = (byte) sec; - break; - case TEMPV0LAMBDA: - color[i] = (byte) sec; - break; - case TEMPV0LAMBDABAR: - color[i] = (byte) sec; - break; - case TEMPKSHORT: - color[i] = (byte) sec; - break; - case PILEUP: - case CONVERSION: - case V0: - case KINK: - color[i] = (byte) res; - break; - default: - color[i] = (byte) res; - - } - } - } - else if (primVxCand!=null) { // use primary vertex candidate flag as fall-back if vertex type not available - for (int i=0; i<numData; ++i) { - if (primVxCand[i]==1) { - color[i] = (byte) pri; - } - else { - color[i] = (byte) res; - } - } - } - else { // if no vertex type information, use constant colour - colorByConstant(); - } - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - // The number of vertices can increase when the user fits a vertex in - // Atlantis, make sure the color array also increases in size then - if (numData > color.length) - color = new byte[numData]; - - if (colorFunction == 0) - { - colorByConstant(); - } - else if(colorFunction == 1) - { - colorByIndex(); - } - else if (colorFunction == 2) - { - colorbyVertexType(); - } - return 0; - } // internalColor() ---------------------------------------------------- - - @Override - public void makeDrawList() - { - numDraw = 0; - listdl = new int[numData]; - for (int i = 0; i < numData; i++) { - if (drawFlag.get(i).booleanValue()) { - listdl[numDraw] = i; - numDraw++; - } - } - this.cutTracksByVertexType(); - this.applyCuts(); - } - - private void cutTracksByVertexType() { - numDraw = 0; - listdl = new int[numData]; - for (int i = 0; i < numData; i++) { - if (drawFlag.get(i).booleanValue()) { - // All=0, Primary=1, Secondary=2, Rest=3 - int vertexTypeSelected = parameterStore.get("CutsObjects", "vertextype").getI(); - if (vertexTypeSelected==0) { - listdl[numDraw] = i; - numDraw++; - } - if (vertexTypeSelected==1) { // primary - if (vertexType!=null) { - int typeId = vertexType[i]; - AVertex.Type type = AVertex.Type.typeFromId(typeId); - if (type == PRIMARY || type == DUMMY){ - listdl[numDraw] = i; - numDraw++; - } - } - } - if (vertexTypeSelected==2){ - if (vertexType!=null) { - int typeId = vertexType[i]; - AVertex.Type type = AVertex.Type.typeFromId(typeId); - if (type == SECONDARY || type == TEMPV0LAMBDA || type == TEMPV0LAMBDABAR || type == TEMPKSHORT){ - listdl[numDraw] = i; - numDraw++; - } - } - } - if (vertexTypeSelected==3){ - if (vertexType!=null) { - int typeId = vertexType[i]; - AVertex.Type type = AVertex.Type.typeFromId(typeId); - if (type == PILEUP || type == CONVERSION || type == V0 || type == KINK){ - listdl[numDraw] = i; - numDraw++; - } - } - } - } - } - } - - public String getHitInfo(int index) - { - boolean athenaOriginBoolean = athenaOrigin.get(index).booleanValue(); - String origin = (athenaOriginBoolean == true) ? "Athena" : "Atlantis"; - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - "\n calculated in "+origin; - - StringBuilder temp = new StringBuilder(); - temp.append("\n" + getNameScreenName() + " (index: " + index + ") (calculated in " + origin + ")\n" + " type of Track: " + tracksCollection.get(index) + "\n"); - temp.append(" tracks IDs = "); - boolean tracksIDsKnown = false; - if (tracksId.size() > 0) { - int[] tracksIdInVertex = (tracksId.get(index)); - for (int i = 0; i < tracksIdInVertex.length; i++) - { - int id2 = tracksIdInVertex[i]; - // if the JiveXML knows that vertex creates X number of - // tracks but doesn't know the ID, -1 is put as tracks ID - // list of -1 doesn't need to be printed - if (id2 > -1) - { - tracksIDsKnown = true; - if (i > 0) - { - temp.append(","); - } - temp.append(tracksIdInVertex[i]); - } - } - } - if (!tracksIDsKnown) temp.append("n/a"); - //To display in the output screen the vertex type number and description when this is selected - if (vertexType!=null) { - int typeId = vertexType[index]; - AVertex.Type type = AVertex.Type.typeFromId(typeId); - String vertexInfo = String.format("%nVertex type = %d (%s)", typeId, type.description); - temp.append(vertexInfo); - } - temp.append("\nPrimary candidate status = " + primVxCand[index]); - temp.append("\nnumTracks = " + numTracks[index]); - temp.append("\n" + vertices.get(index)); - return temp.toString(); - } // getHitInfo() ------------------------------------------------------- - - @Override - public ACoord getYXUser() - { - makeDrawList(); - double hv[][][] = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double[][] p = vertex.getYXEllipse(); - hv[0][i] = p[0]; - hv[1][i] = p[1]; - - index[i] = listdl[i]; - } - return new ACoord(hv, index, this); - } // getYXUser() -------------------------------------------------------- - - @Override - public ACoord getXZUser() - { - makeDrawList(); - double hv[][][] = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double[][] p = vertex.getXZEllipse(); - hv[0][i] = p[0]; - hv[1][i] = p[1]; - index[i] = listdl[i]; - } - return new ACoord(hv, index, this); - } // getXZUser() -------------------------------------------------------- - - @Override - public ACoord getYZUser() - { - makeDrawList(); - double hv[][][] = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double[][] p = vertex.getYZEllipse(); - hv[0][i] = p[0]; - hv[1][i] = p[1]; - index[i] = listdl[i]; - } - return new ACoord(hv, index, this); - } // getYZUser() -------------------------------------------------------- - - @Override - public ACoord getRZUser() - { - makeDrawList(); - double hv[][][] = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - //TODO: make "RZ ellipse" - double[][] p = vertex.getRZEllipse(); - hv[0][i] = p[0]; - hv[1][i] = p[1]; - index[i] = listdl[i]; - } - return new ACoord(hv, index, this); - } // getRZUser() -------------------------------------------------------- - - @Override - protected ACoord get3DUser() - { - makeDrawList(); - double h[] = new double[numDraw]; - double v[] = new double[numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - double[] hvo = AProjection3D.getRotated(vertices.get(listdl[i]).getPosition()); - h[i] = hvo[0]; - v[i] = hvo[1]; - index[i] = listdl[i]; - } - return new ACoord(h, v, index, this); - } // get3DUser() -------------------------------------------------------- - - @Override - public ACoord getFZUser() - { - makeDrawList(); - double h[] = new double[numDraw]; - double v[] = new double[numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double[] xyz = vertex.getPosition(); - double phi = vertex.getPhi(); - double z = xyz[2]; - h[i] = z; - v[i] = Math.toDegrees(phi); - index[i] = listdl[i]; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FZ"); - } // getFZUser() -------------------------------------------------------- - - @Override - public ACoord getFRUser() - { - makeDrawList(); - double h[] = new double[numDraw]; - double v[] = new double[numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double rho = vertex.getRho(); - double phi = vertex.getPhi(); - h[i] = rho; - v[i] = Math.toDegrees(phi); - index[i] = listdl[i]; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FR"); - } // getFRUser() -------------------------------------------------------- - - @Override - public ACoord getVPUser() - { - makeDrawList(); - double h[] = new double[numDraw * 2]; - double v[] = new double[numDraw * 2]; - int[] index = new int[numDraw * 2]; - double[] sign = new double[] { -1., 1. }; - int num = 0; - - for (int i = 0; i < numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - double[] xyz = vertex.getPosition(); - // if rho is 0, AMath.eta() divides by 0, since it's real type, - // Infinity is returned, program doesn't crash, vertex is not drawn - // proper would be to test all rho > 0.01cm values in advance - double rho = vertex.getRho(); - double phi = vertex.getPhi(); - double z = xyz[2]; - double eta = AParameterUtilities.eta(z, rho); - double delEta = AProjectionVP.getDeltaEta(rho, z); - for (int j = 0; j < 2; j++) - { - h[num] = eta + sign[j] * delEta; - v[num] = Math.toDegrees(phi); - index[num] = listdl[i]; - num++; - } - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } // getVPUser() -------------------------------------------------------- - - protected void applyCuts() - { - cutIndex(); - - float[] phi = new float[numDraw]; - float[] eta = new float[numDraw]; - for(int i=0; i<numDraw; i++) - { - AVertex vertex = vertices.get(listdl[i]); - phi[i] = (float) vertex.getPhi(); - double z = vertex.getPosition()[2]; - eta[i] = (float) AParameterUtilities.eta(z, vertex.getRho()); - } - cutPhi(phi); - cutEta(eta); - - cut("CutsInDet", "NumRVxTracks", " Ntrack", numTracks); - cut("CutsInDet", "PrimaryRVx", " Primary", primVxCand); - - } // applyCuts() -------------------------------------------------------- - - /** - * @param nodes Collection - * @return Action[] - * Method returns either empty list of Actions or Vertex item after the - * right mouse click on the list (in the list dialog) - * Vertex only appear if there is one type of reconstructed tracks in the - * list and no other datatype - */ - @Override - public Action[] getActions(Collection nodes) - { - if (nodes.size() != 1) - { - return new Action[0]; - } - final DefaultMutableTreeNode node = (DefaultMutableTreeNode) (nodes.iterator().next()); - if (!node.getAllowsChildren()) - { - return new Action[0]; - } - AList[] list = AListManager.getInstance().getChildren(node); - if (list == null) - { - return new Action[0]; - } - Set<Integer> tracks = new HashSet<Integer>(); - Set<Integer> tracksID = new HashSet<Integer>(); - // iterate over the items in the list (set of whichever datatypes) - // condition in this loop assures that 'Vertex *' action appears only - // if there is/are set(s) of one type of reconstructed tracks and no - // other types. the condition used to be - // list[i].getSource() == ... .event.getRTrData() which was - // a method depending on the current selected Hits-to-RTr association - for (int i = 0; i < list.length; i++) - { - // tests that there is either type of reconstructed tracks in the list - if (list[i].getSource() instanceof ATrackData) - { - // test that there is just one type of reconstructed tracks if - // there are more than one item in list - if (i > 0) - { - String key1 = list[i - 1].getSource().getStoreGateKey(); - String key2 = list[i].getSource().getStoreGateKey(); - if (!(key1 == null && key2 == null) && !key1.equals(key2)) - { - String msg = "info: Vertexing is available if only one " + - "Track collection is chosen in the list. " + - " (select: InDet->Track->Track Collections)\n"; - AOutput.alwaysAppend(msg, ALogInterface.NORMAL); - return new Action[0]; - } - } - // tests passed - save indices of the tracks from the hashtable - for (int j = 0; j < list[i].getItems().length; j++) - { - int index = list[i].getItems()[j]; - int id2 = list[i].getSource().getIdFromIndex(index); - tracks.add(new Integer(index)); - tracksID.add(new Integer(id2)); - } - } - else - { - return new Action[0]; - } - } // for - int numTracks2 = tracks.size(); - if (numTracks2 < 2) - { - return new Action[0]; - } - final String trackName = list[0].getSource().getNameScreenName(); - final String trackStoreGateKey = list[0].getSource().getStoreGateKey(); - final int[] trackNumbers = new int[numTracks2]; // indices of tracks - final int[] trackIDs = new int[numTracks2]; // IDs of tracks - Iterator<Integer> i = tracks.iterator(); - int n = 0; - while (i.hasNext()) - { - trackNumbers[n++] = (i.next()).intValue(); - } - i = tracksID.iterator(); - n = 0; - while (i.hasNext()) - { - trackIDs[n++] = (i.next()).intValue(); - } - Action[] action = new Action[1]; // only one action will be displayed - // after removing interactive Athena - action[0] = new AbstractAction("Vertex " + trackName + " " + trackStoreGateKey + " in Atlantis") - { - public void actionPerformed(ActionEvent e) - { - try - { - createVertexFromTracks(trackNumbers, trackStoreGateKey); - // maybe should be all windows - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - node.setUserObject(new AList(ARVxData.this, numData - 1)); - } - catch (Exception ee) - { - // this exception was initially completely ignored (empty - // block) - can't actually see the reason why it is thrown - // at the end of createVertexFromTracks since it should be - // ignored. whether or not the exception occures tells - // whether the tracks are coming from the common vertex - - logger.debug("ARVxData.getActions() exception: " + ee.getMessage(), ee); - } - } - }; - - return action; - } // getActions() ------------------------------------------------------- - - - /** - * The method is called when Remove action is selected after right-click - * on the list item. There may be vertices coming from different types of - * tracks, trackType variable assures that the current reconstructed track - * instance is retrieved and the helix paremeters set on corrent tracks - * @param index int[] - */ - @Override - public void remove(int[] index) - { - String key = null; - ATrackData aRTr = null; - for (int i = 0; i < index.length; ++i) - { - drawFlag.set(index[i], new Boolean(false)); - key = tracksCollection.get(index[i]); - aRTr = event.getTrackData("InDetTrack", key); - if (aRTr != null) - { - int[] tracksInVertex = (tracksIndex.get(index[i])); - for (int j = 0; j < tracksInVertex.length; ++j) - { - aRTr.getModifiableHelix(tracksInVertex[j]).setPhiStartByXYPoint(0., 0.); - } - } // if - } // for - } // remove() ----------------------------------------------------------- - - /** - * if RVx (with numData > 0) is present in this event, cut Tracks - * forming vertices when tracks are drawn as polylines - */ - public void cutTracksToRVx(AEvent event) - { - if (!hasConsistentTrackNumbers) return; - for (int i = 0; i < numData; i++) - { - boolean origin = athenaOrigin.get(i).booleanValue(); - if (origin) - { - // true - RVx coming from Athena -> cut the track if its - // storeGateKey is known (was saved into tracksCollection) - String trackKey = tracksCollection.get(i); - ATrackData tracks = event.getTrackData("InDetTrack", trackKey); - if (tracks != null) - { - int[] tracksIdInVertex = (tracksId.get(i)); - if (tracksIdInVertex.length < 2) //ACH - put some more cuts on this? - continue; - AHelix[] thisHelGoToFitter = new AHelix[tracksIdInVertex.length]; - AVertex vertex = vertices.get(i); - double[] par = vertex.getPosition(); - double Vx = par[0]; - double Vy = par[1]; - for (int j = 0; j < tracksIdInVertex.length; j++) - { - int id2 = tracksIdInVertex[j]; - // if the JiveXML knows that vertex creates X number of - // tracks but doesn't know the ID, -1 is put as tracks ID - // skip cutting tracks - ID is actually unknown - if (id2 > -1) - { - thisHelGoToFitter[j] = tracks.getModifiableHelix(id2); - thisHelGoToFitter[j].setPhiStartByXYPoint(Vx, Vy); - } - } - } // if(tracks != null) - } - } - } // cutTracksToRVx() ---------------------------------------------------- - - - - /** - * Returns the values of primary vertex for the current event using the - * first vertex in this RVx data if it exists. - * @return double[3] or null - */ - public double[] getPrimaryVertex() - { - double[] vtx = null; // vertex position (x, y, z order) - - if (!(numData > 0)) - { - // Check this? If we have no vertices, want to get a primary vertex - // from somewhere else - return vtx; // null - } - - // if datatype contains primVxCand subtag, then take first item - // flagged 1 (primary vertex candidate) otherwise first item of - // the whole datatype - if(primVxCand != null) - { - for(int i = 0; i < numData; i++) - { - if(primVxCand[i] == 1) - { - vtx = vertices.get(i).getPosition(); - break; - } - } - if(vtx == null) - { - // none of the vetices had flag 1, take the first one anyway - vtx = vertices.get(0).getPosition(); - } - } - else - { - // primVxCand is not available, take the first item - vtx = vertices.get(0).getPosition(); - } - - return vtx; - - } // getPrimaryVertex() ------------------------------------------------- - - - - /** - * - * @param index int - * @return double[] - * Returns double array with x, y, z positions of the vertex - */ - public double[] getVertex(int index) - { - double[] vtx = null; - vtx = vertices.get(index).getPosition(); - return vtx; - - } // getVertex() -------------------------------------------------------- - - -} // class ARVxData ========================================================= diff --git a/graphics/AtlantisJava/src/atlantis/data/AS3DData.java b/graphics/AtlantisJava/src/atlantis/data/AS3DData.java deleted file mode 100644 index 62929b6f6b8a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AS3DData.java +++ /dev/null @@ -1,486 +0,0 @@ -package atlantis.data; - -import atlantis.event.AAssociation; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - - -/* - * The input array clusters is being used to contain two types of information - * for pixel clusters - * clusters[i][0] = identifier - * clusters[i][1] = -1 - * for space points from 2 strip clusters it contains the identifiers of the - * individual strips - * clusters[i][0] = identifier of first strip - * clusters[i][1] = identifier of second strip - */ -public class AS3DData extends A3DPointData -{ - private int[][] clusters = null; - // read from the event file - protected int[] layer = null; - private int[] etaModule = null; - private int[] phiModule = null; - - // for use by the filter loop, group[] is filled in by hit filter, other - // classes contain group functionality as well but currently (2006/08) - // hit filter takes into account only S3D (SiSpacePoint) data - protected int[] group = null; - private double[] eta = null; - - private boolean[] pixel = null; - public static final int PIXEL = -1; - public static final int CUT_INDET_SCT_ALL = -1; - public static final int CUT_INDET_SCT_EC_NEG = 0; - public static final int CUT_INDET_SCT_BARREL = 1; - public static final int CUT_INDET_SCT_EC_POS = 2; - - - - public String getParameterGroup() - { - return "S3D"; - } - - - public String getName() - { - return "S3D"; - } - - - public String getNameScreenName() - { - return "SpacePoint"; - } - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - String clId = clusters[index][0] + ", " + clusters[index][1]; - String type = pixel[index] ? " (Pixel hit)" : " (SCT hit)"; - - String temp = getNameScreenName() + " (id: " + id[index] + " index: " + index + ")" + - type + - "\n cluster identifiers: " + clId + - "\n x = " + String.format("%.3f",x[index]) + " cm" + - "\n y = " + String.format("%.3f",y[index]) + " cm" + - "\n z = " + String.format("%.3f",z[index]) + " cm" + - "\n " + AMath.RHO + " = " + String.format("%.3f",rho[index]) + - " cm" + - "\n " + AMath.PHI + " = " + - String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)" + - "\n z = " + String.format("%.3f",z[index]) + " cm" + - "\n group = " + group[index]; - temp += "\n " + AMath.ETA + " module = "; - temp += (etaModule != null) ? Integer.toString(etaModule[index]) : "n/a"; - temp += "\n " + AMath.PHI + " module = "; - temp += (phiModule != null) ? Integer.toString(phiModule[index]) : "n/a"; - temp += super.getHitInfo(index); // finds barcode information - - return temp; - - } // getHitInfo() --------------------------------------------------------- - - - - AS3DData(AHashMap p, AEvent e) - { - super(p,e); - - etaModule = (p.get("etaModule") != null) ? p.getIntArray("etaModule") : null; - phiModule = (p.get("phiModule") != null) ? p.getIntArray("phiModule") : null; - - // use this for now as pixel id have bug i.e. sometimes > 0 - layer = p.getUnknownIntArray("layer"); - if(p.get("layer") == null || p.get("sub") == null) - { - calculateLayerSubdetector(); - } - group = new int[numData]; - eta = new double[numData]; - - if(p.get("clusters") != null) - { - // can only distinguish between SCT and Pixel hits if clusters - // subtag is available - pixel = new boolean[numData]; - // save IDs from event file to be available with pick info - clusters = new int[numData][]; - int[][] assocClusters = new int[numData][]; - int[] temp = p.getIntArray("clusters"); - for(int i = 0; i < numData; i++) - { - // save all clusters IDs - clusters[i] = new int[] { temp[2 * i], temp[2 * i + 1] }; - - // check if the second number, PIXEL (-1) designates pixel hit - if(temp[2 * i + 1] != PIXEL) - { - // this is SCT spacepoint - has got two clusters - assocClusters[i] = new int[] { temp[2 * i], temp[2 * i + 1] }; - } - else - { - // this is a pixel spacepoint (second cluster number is -1) - pixel[i] = true; - - // to ignore associtiation between pixel clusters and spacepoints: - // assocClusters[i] = null; - - // taking pixel cluster into account (pixel spacepoint has got - // only one cluster) (where as SCT spacepoint has got two clusters) - assocClusters[i] = new int[] { temp[2 * i] }; - } - } - event.getAssociationManager().add(new AAssociation(getFullName(), "SiCluster", assocClusters, event)); - event.getAssociationManager().add(new AAssociation(getFullName(), "PixelCluster", assocClusters, event)); - } - } - - - - protected void finalizeConstruction() - { - super.finalizeConstruction(); - super.calculateAssociationViaClusters(); - - } // finalizeConstruction() ---------------------------------------------- - - - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if(colorFunction == numColorTypes + 1) - { - colorByGroup(); - } - else if(colorFunction == numColorTypes + 2) - { - colorBy(layer); - } - return numColorTypes + 2; - - } // internalColor() ---------------------------------------------------- - - - protected void colorByGroup() - { - byte ungroupedColor; - if(parameterStore.get(PARAMETER_GROUP, "Ungrouped").getStatus()) - ungroupedColor = (byte) parameterStore.get(PARAMETER_GROUP, "Ungrouped").getI(); - else - ungroupedColor = (byte) parameterStore.get(PARAMETER_GROUP, "Unconnected"). - getI(); - int numColors = (byte) parameterStore.get("HitColors", "Number").getI(); - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for(int i = 0; i < numData; i++) - { - if(group[i] == 0) - color[i] = ungroupedColor; - else - color[i] = (byte) col[(group[i] - 1) % numColors]; - } - } - - - - /** - * define noise and good hits type = 0 means noise - * noise hits - hits associated neither with Track not STr - * good hits - hits associated either with Track or with STr plus - * group information - set by the AFilter (hit filter) - */ - protected void setType() - { - int[][] assocSTr = event.getAssociationManager().get(getFullName(), "STr"); - int[][] assocRTr = event.getAssociationManager().get(getFullName(), getReconstructedTracks()); - for(int i = 0; i < numData; i++) - { - if((assocSTr != null && assocSTr[i] != null) || - (assocRTr != null && assocRTr[i] != null) || group[i] > 0) - { - type[i] = 1; - } - else - { - type[i] = 0; - } - } - - } // setType() ---------------------------------------------------------- - - - - protected void applyCuts() - { - cutIndex(); - cutSubdetector(); - cut("CutsInDet", "Layer", " Layer", layer); - cutPhi(phi); - cutEta(rho, z); - cutSimulatedTracks(); - cutReconstructedTracks(); - cut("CutsInDet", "Group", " Group", group); - if(etaModule != null) - { - cut("CutsInDet", "EtaModule", " EtaModule", etaModule); - } - if(phiModule != null) - { - cut("CutsInDet", "PhiModule", " PhiModule", phiModule); - } - } - - private void cutSubdetector() - { - AParameter subPar = parameterStore.get("CutsInDet", "SCT"); - if(subPar.getI() != -1) - cutArray(sub, subPar.getI(), "Barrel/Endcap"); - } - - - public int getLayer(int id) - { - int layer; - if(id > -1) - layer = (id >> 21) & 0xF; - else - layer = (id >> 27) & 0x3; - int sub = getSub(id); - if(id > -1) - { - // strips - if(sub == ASiClusterData.BARREL) - layer += 3; - else - layer += 11; - } - else - { - // pixels - if(sub != ASiClusterData.BARREL) - layer += 7; - } - return layer; - } - - - public int getSub(int id) - { - if(id > -1) - return(id >> 25) & 0x3; - else - return(id >> 29) & 0x3; - } - - - private void calculateLayerSubdetector() - { - final double rhoPixelMax = 24.; - final double zBarrelPixelMax = 41.; - final double zBarrelStripsMax = 78.; - final double[] zEndcapPixel = - {51., 64., 90.}; - final double[] zEndcapStrips = - {88., 98., 116., 134., 156., 190., 233., - 263.}; - final double[] rhoBarrel = - {6.74, 11.5, 23., 34., 40., 48.}; - for(int i = 0; i < numData; i++) - { - double z = Math.abs(this.z[i]); - double r = rho[i]; - if(r < rhoPixelMax) - { - // .............................................. pixels - if(z < zBarrelPixelMax) - { - // ............................................ barrel - sub[i] = 1; - for(int l = 0; l < rhoBarrel.length; l++) - if(r < rhoBarrel[l]) - { - layer[i] = l; - break; - } - } - else - { - // ............................................ end cap - layer[i] = 10; - for(int l = 0; l < zEndcapPixel.length; l++) - { - if(z < zEndcapPixel[l]) - { - layer[i] = 7 + l; - break; - } - } - if(this.z[i] < 0) - sub[i] = 0; - else - sub[i] = 2; - } - } - else - { - // .............................................. strips - - if(z < zBarrelStripsMax) - { - // ............................................ BARREL - sub[i] = 1; - layer[i] = 6; - for(int l = 0; l < rhoBarrel.length; l++) - if(r < rhoBarrel[l]) - { - layer[i] = l; - break; - } - } - else - { - // ............................................ end cap - layer[i] = 19; - for(int l = 0; l < zEndcapStrips.length; l++) - { - if(z < zEndcapStrips[l]) - { - layer[i] = 11 + l; - break; - } - } - if(this.z[i] < 0) - sub[i] = 0; - else - sub[i] = 2; - } - } - } - } - - - // drawlist to be used as input to the filter - public int makeFilterDrawList(double etaRange) - { - calculateRhoPhi(); - - // overwrite the input array to improve speed - numDraw = 0; - for(int i = 0; i < numData; i++) - { - double eta = AParameterUtilities.eta(z[i], rho[i]); - this.eta[i] = eta; - if(eta > -etaRange && eta < etaRange) - { - listdl[numDraw++] = i; - } - } - - return numDraw; - } - - - public int[] getIntegerEta(int numBins, double etaRange, int[] integerEta) - { - // overwrite the input array to improve speed - double binWidth = 2 * etaRange / numBins; - double etaRangeOptimised = etaRange + binWidth; - for(int i = 0; i < numDraw; i++) - // implicit (int) conversion only does correct thing if positive - integerEta[i] = (int) ((eta[listdl[i]] + etaRangeOptimised) / - binWidth); - return integerEta; - } - - - public int[] getIntegerPhi(int numBins, double skew, int[] integerPhi) - { - calculateRhoPhi(); - // overwrite the input array to improve speed - double binWidth = 2 * Math.PI / numBins; - for(int i = 0; i < numDraw; i++) - { - // can only be positive - // add one to treat wraparound efficiently - double p = phi[listdl[i]] - skew * rho[listdl[i]]; - if(p < 0.) - p += 2 * Math.PI; - else if(p > 2 * Math.PI) - p -= 2 * Math.PI; - integerPhi[i] = (int) (p / binWidth) + 1; - } - return integerPhi; - } - - - public int[] getLayer(int[] layer) - { - for(int i = 0; i < numDraw; i++) - layer[i] = this.layer[listdl[i]]; - return layer; - } - - - public void setGroup(int[] group) - { - for(int i = 0; i < numData; i++) - this.group[i] = 0; - for(int i = 0; i < numDraw; i++) - this.group[listdl[i]] = group[i]; - } - - - protected ACoord getFRUser() - { - if(!parameterStore.get("SiCluster", "Stereo").getStatus())return super.getFRUser(); - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = rho[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FR"); - } - - - protected ACoord getFZUser() - { - if(!parameterStore.get("SiCluster", "Stereo").getStatus())return super.getFZUser(); - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = z[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FZ"); - } - -} // class AS3DData ========================================================= diff --git a/graphics/AtlantisJava/src/atlantis/data/ASMTrData.java b/graphics/AtlantisJava/src/atlantis/data/ASMTrData.java deleted file mode 100644 index dfd4eb8c63d4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASMTrData.java +++ /dev/null @@ -1,626 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.utils.A3Vector; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Simulated particle in the muon system - */ - -public class ASMTrData extends AData -{ - private static final double START_RADIUS = 2.; - protected int[] code; - protected int[] particleType; - protected int[] originVertex; - protected float[] pT; - protected float[][] rho; - protected float[][] phi; - protected float[][] z; - protected float[][] x; - protected float[][] y; - AHelix[] innerTrack; - protected int[] type; - private int[] index; - - - public String getParameterGroup() - { - return "SMTr"; - } - - - public String getName() - { - return "SMTr"; - } - - - public String getNameScreenName() - { - return "SimMuonTrack"; - } - - - ASMTrData(AHashMap p, AEvent e) - { - super(p,e); - rho = new float[2][]; - phi = new float[2][]; - z = new float[2][]; - x = new float[2][]; - y = new float[2][]; - x[0] = new float[numData]; - y[0] = new float[numData]; - rho[0] = p.getFloatArray("rhoVertex"); - phi[0] = p.getFloatArray("phiVertex"); - z[0] = p.getFloatArray("zVertex"); - for(int i = 0; i < numData; ++i) - { - x[0][i] = (float) (rho[0][i] * Math.cos(phi[0][i])); - y[0][i] = (float) (rho[0][i] * Math.sin(phi[0][i])); - } - x[1] = (float[]) x[0].clone(); - y[1] = (float[]) y[0].clone(); - z[1] = (float[]) z[0].clone(); - phi[1] = (float[]) phi[0].clone(); - rho[1] = (float[]) rho[0].clone(); - pT = p.getFloatArray("pt"); - code = p.getIntArray("code"); - type = new int[numData]; - particleType = new int[numData]; - originVertex = p.getIntArray("simulatedVertex"); - for(int i = 0; i < numData; i++) - { - if(Math.abs(code[i]) > 10) - // code is being used to store particle code - particleType[i] = APDGTable.getParticleType(code[i]); - } - calculateReasonableEndpoints(p.getFloatArray("phi"), - p.getFloatArray("eta")); - double[] phiD = new double[numData]; - float[] phiF = p.getFloatArray("phi"); - for(int i = 0; i < numData; i++) - phiD[i] = phiF[i]; - index = indexBy(phiD); - } - - - protected void calculateRhoPhi() - { - calculateRhoPhi(x[0], y[0], rho[0], phi[0]); - calculateRhoPhi(x[1], y[1], rho[1], phi[1]); - } - - private void calculateReasonableEndpoints(float[] phiDir, float[] eta) - { - double rhoTo = 1500.; - double zTo = 2500.; - int maxPoints = 5; - double[] d = new double[maxPoints]; - for(int i = 0; i < numData; i++) - { - int numPoints = 0; - //initial point inside volume - if(rho[0][i] < rhoTo && Math.abs(z[0][i]) < zTo) - { - d[numPoints++] = 0.; - } - double lambda = AMath.lambda(eta[i]); - double x0 = x[0][i]; - double y0 = y[0][i]; - double z0 = z[0][i]; - x[1][i] = (float) x0; - y[1][i] = (float) y0; - z[1][i] = (float) z0; - double u = Math.cos(lambda) * Math.cos(phiDir[i]); - double v = Math.cos(lambda) * Math.sin(phiDir[i]); - double w = Math.sin(lambda); - //intersections with cylinder walls - if(w != 0.) - { - d[numPoints++] = (zTo - z0) / w; - d[numPoints++] = ( -zTo - z0) / w; - } - double a = u * u + v * v; - double c = x0 * x0 + y0 * y0 - rhoTo * rhoTo; - double b = 2 * (u * x0 + v * y0); - double squared = b * b - 4 * a * c; - if(squared >= 0.) - { - d[numPoints++] = ( -b + Math.sqrt(squared)) / (2 * a); - d[numPoints++] = ( -b - Math.sqrt(squared)) / (2 * a); - } - //bubble sort points by increasing path length - for(int j = 0; j < numPoints - 1; ++j) - for(int k = j + 1; k < numPoints; ++k) - if(d[k] < d[j]) - { - double temp = d[k]; - d[k] = d[j]; - d[j] = temp; - } - for(int j = 0; j < numPoints; ++j) - if(d[j] >= 0. && j < numPoints - 1) - { - x[0][i] = (float) (x0 + d[j] * u); - y[0][i] = (float) (y0 + d[j] * v); - z[0][i] = (float) (z0 + d[j] * w); - x[1][i] = (float) (x0 + d[j + 1] * u); - y[1][i] = (float) (y0 + d[j + 1] * v); - z[1][i] = (float) (z0 + d[j + 1] * w); - break; - } - } - } - - - protected void finalizeConstruction() - { - super.finalizeConstruction(); - // needs ZVTx - innerTrack = new AHelix[numData]; - for(int i = 0; i < numData; ++i) - { - double p = AMath.getPFromPttL(pT[i], - AMath.tanLambda(AParameterUtilities.eta(z[0][i], - rho[0][i]))); - // correct for average energy loss - double pTCorrected = pT[i] * (p + 3.7) / p; - innerTrack[i] = new AHelix((float) 0., - (float) (parameterStore.get("Event", "ZVtx").getD()), ( - float) (Math.toDegrees(phi[0][i])), - (float) AMath.tanLambda(AParameterUtilities.eta(z[0][i], - rho[0][i])), (float) pTCorrected); - // calculatePhiCorrection(i); - } - } - - - protected void applyCuts() - { - cutIndex(); - cut("CutsInDet", "STrType", " STr Type", particleType); - cut("CutsInDet", "STr", " STr id", id); - cut("CutsInDet", "Pt", " |Pt|", pT); - cut("CutsInDet", "SVx", " Vertex", originVertex); - cutPhi(phi[1]); - float[] phiStart = new float[numData]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - if(rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - phiStart[list] = (float) phi[iMin][list]; - } - cutPhi(phiStart); - cutEta(rho[1], z[1]); - } - - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if(colorFunction == 0) - colorByConstant(); - else if(colorFunction == 1) - colorByIndex(index); - else if(colorFunction == 2) - colorBy("ParticleColors", particleType); - return 2; - } - - - public String getHitInfo(int index) - { - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n Type = "); - msg.append(APDGTable.getName(code[index])); - if (innerTrack != null) - msg.append(innerTrack[index].toString()); - msg.append("\n pT (muon spectrometer) = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV"); - - return msg.toString(); - } - - - protected void cutStartRadius() - { - int num = 0; - for(int i = 0; i < numDraw; i++) - if(Math.min(Math.abs(z[0][listdl[i]] / rho[0][listdl[i]]), - Math.abs(z[1][listdl[i]] / rho[1][listdl[i]])) - < 12.3 / 9.2) - listdl[num++] = listdl[i]; - numDraw = num; - } - - - protected void cutStartRadius2() - { - int num = 0; - for(int i = 0; i < numDraw; i++) - if(Math.max(Math.abs(z[0][listdl[i]] / rho[0][listdl[i]]), - Math.abs(z[1][listdl[i]] / rho[1][listdl[i]])) - > 12.3 / 9.2) - listdl[num++] = listdl[i]; - numDraw = num; - } - - - protected ACoord getYXUser() - { - makeDrawList(); - cutStartRadius(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = x[j][list]; - hv[1][j][i] = y[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - - protected ACoord getRZUser() - { - makeDrawList(); - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - int numSplit = 0; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[0][list] - phiMid); - double sign0 = -1.; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign0 = +1.; - phiDiff = Math.abs(phi[1][list] - phiMid); - double sign1 = -1.; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign1 = +1.; - if(sign0 != sign1) numSplit++; - } - int numPoints = 100; - double[][][] hv = new double[2][numDraw + numSplit][]; - int[] index = new int[numDraw + numSplit]; - int num = 0; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[0][list] - phiMid); - double sign0 = -1.; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign0 = +1.; - phiDiff = Math.abs(phi[1][list] - phiMid); - double sign1 = -1.; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign1 = +1.; - if(sign0 == sign1) - { - hv[0][num] = AMath.splitLineIntoPieces(new double[] - {z[1][list], z[0][list]}, numPoints); - double[] xx = AMath.splitLineIntoPieces(new double[] - {x[1][list], x[0][list]}, numPoints); - double[] yy = AMath.splitLineIntoPieces(new double[] - {y[1][list], y[0][list]}, numPoints); - hv[1][num] = new double[xx.length]; - for(int j = 0; j < xx.length; ++j) - hv[1][num][j] = sign0 * - Math.sqrt(xx[j] * xx[j] + yy[j] * yy[j]); - index[num++] = list; - } - else - { - //just for now.... - double a = Math.cos(phiMid); - double b = Math.sin(phiMid); - double x0 = x[0][list]; - double y0 = y[0][list]; - double z0 = z[0][list]; - double dx = x[1][list] - x0; - double dy = y[1][list] - y0; - double dz = z[1][list] - z0; - double mag = Math.sqrt(dx * dx + dy * dy + dz * dz); - dx /= mag; - dy /= mag; - dz /= mag; - double d = -(a * x0 + b * y0) / (a * dx + b * dy); - double xMid = x0 + d * dx; - double yMid = y0 + d * dy; - double zMid = z0 + d * dz; - hv[0][num] = AMath.splitLineIntoPieces(new double[] - {zMid, z[0][list]}, numPoints); - double[] xx = AMath.splitLineIntoPieces(new double[] - {xMid, x[0][list]}, numPoints); - double[] yy = AMath.splitLineIntoPieces(new double[] - {yMid, y[0][list]}, numPoints); - hv[1][num] = new double[xx.length]; - for(int j = 0; j < xx.length; ++j) - hv[1][num][j] = sign0 * - Math.sqrt(xx[j] * xx[j] + yy[j] * yy[j]); - index[num++] = list; - hv[0][num] = AMath.splitLineIntoPieces(new double[] - {z[1][list], zMid}, numPoints); - xx = AMath.splitLineIntoPieces(new double[] - {x[1][list], xMid}, numPoints); - yy = AMath.splitLineIntoPieces(new double[] - {y[1][list], yMid}, numPoints); - hv[1][num] = new double[xx.length]; - for(int j = 0; j < xx.length; ++j) - hv[1][num][j] = sign1 * - Math.sqrt(xx[j] * xx[j] + yy[j] * yy[j]); - index[num++] = list; - } - } - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - } - - - protected ACoord getFRUser() - { - makeDrawList(); - cutStartRadius(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - if(rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - double rho1 = rho[iMin][list]; - double rho2 = rho[iMax][list]; - if(rho1 > START_RADIUS) - { - hv[0][0][i] = rho1; - hv[1][0][i] = Math.toDegrees(phi[iMin][list]); - } - else - { - double[] rpz = calculateRhoPhiZAtStart(list); - hv[0][0][i] = rpz[0]; - hv[1][0][i] = Math.toDegrees(rpz[1]); - } - hv[0][1][i] = rho2; - hv[1][1][i] = Math.toDegrees(phi[iMax][list]); - index[i] = list; - } - return new ACoord(hv, index, this, - ACoord.LINES).includePhiWrapAround("FR"); - } - - - protected ACoord getXZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0 = Math.cos(phi0); - double sinPhi0 = Math.sin(phi0); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = x[j][list] * cosPhi0 + y[j][list] * sinPhi0; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - - protected ACoord getYZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0 = Math.cos(phi0); - double sinPhi0 = Math.sin(phi0); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = y[j][list] * cosPhi0 - x[j][list] * sinPhi0; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - - protected ACoord getFZUser() - { - makeDrawList(); - cutStartRadius2(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - if(rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - double rho1 = rho[iMin][list]; - if(rho1 > START_RADIUS) - { - hv[0][0][i] = z[iMin][list]; - hv[1][0][i] = Math.toDegrees(phi[iMin][list]); - } - else - { - double[] rpz = calculateRhoPhiZAtStart(list); - hv[0][0][i] = rpz[2]; - hv[1][0][i] = Math.toDegrees(rpz[1]); - } - hv[0][1][i] = z[iMax][list]; - hv[1][1][i] = Math.toDegrees(phi[iMax][list]); - index[i] = list; - } - return new ACoord(hv, index, this, - ACoord.LINES).includePhiWrapAround("FZ"); - } - - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(projection instanceof AProjectionVP) - { - ag.draw(window.calculateDisplay(getVPUser(window, projection))); - } - else - super.draw(window, ag, projection); - } - - - // a track has two arms in the VPlot - - protected ACoord getVPUser(AWindow window, AProjection projection) - { - makeDrawList(); - - // make a copy of the points to draw: both arms * ??? - double[][][] hv = new double[2][2 * numDraw][]; - int[] index = new int[2 * numDraw]; - int num = 0; - - //loop over drawn objects? - for(int j = 0; j < numDraw; ++j) - { - // get list item from draw index list? - int list = listdl[j]; - // get the helix that should be drawn - ADHelix dhelix = new ADHelix(innerTrack[list]); - // get the helix start and end - double s1 = dhelix.getAStart(); - double s2 = 179.; - // hardwire projection.getMinRho() == 2. for now - s1 = dhelix.intersectWithRadialCylinder(((AProjection2D) projection). - getMinRho(), s1, s2); - double sEnd = dhelix.intersectWithCylinder(true, - AProjectionVP.getRhoVPlot(), true, - AProjectionVP.getZVPlot()); - s2 = Math.max(Math.min(s2, sEnd), s1); - // if the whole helix is to be drawn (which are unusual - // helices, shorten it a little to avoid wraparound problems - if(s1 == 0. && s2 == 180.) s2 = 179.; - if(parameterStore.get("VP", "ShortV").getStatus() && - !parameterStore.get("Data", "S3D").getStatus()) - s1 = s2 - parameterStore.get("VP", "ShortV").getD() * (s2 - s1); - if(s2 > s1) - { - int signMin = -1; - int signMax = 1; - for(int sign = signMin; sign <= signMax; sign += 2) - { - // ugly must change structure at some point - AProjectionVP.sign = sign; - ACoord pointsOnHelix = dhelix.drawHelix(window, - (AProjection2D) projection, s1, s2); - hv[0][num] = pointsOnHelix.hv[0][0]; - hv[1][num] = pointsOnHelix.hv[1][0]; - index[num] = list; - num++; - } - } - } - return window.calculateUser(new ACoord(hv, index, this, - ACoord.SMOOTH_POLYLINES)). - includePhiWrapAround(projection.getName()); - } - - - private double[] calculateRhoPhiZAtStart(int index) - { - double[] rpz = new double[3]; - double rho1 = rho[0][index]; - double phi1 = phi[0][index]; - double z1 = z[0][index]; - double rho2 = rho[1][index]; - double phi2 = phi[1][index]; - double z2 = z[1][index]; - double x1 = rho1 * Math.cos(phi1); - double y1 = rho1 * Math.sin(phi1); - double x2 = rho2 * Math.cos(phi2); - double y2 = rho2 * Math.sin(phi2); - double fract = (START_RADIUS - rho1) / (rho2 - rho1); - double x = x1 + fract * (x2 - x1); - double y = y1 + fract * (y2 - y1); - double z = z1 + fract * (z2 - z1); - double phi = Math.atan2(y, x); - if(phi < 0.) phi += 2 * Math.PI; - rpz[0] = START_RADIUS; - rpz[1] = phi; - rpz[2] = z; - return rpz; - } - - - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumP = 0.; - double sumPt = 0.; - for(int i = 0; i < numDraw; ++i) - { - sumPt += Math.abs(pT[listdl[i]]); - double invLambda = (rho[1][listdl[i]] - rho[0][listdl[i]]) / - (z[1][listdl[i]] - z[0][listdl[i]]); - sumP += Math.abs(pT[listdl[i]] / Math.cos(Math.atan(1. / invLambda))); - } - - String msg = numDraw + " " + getNameScreenName(); - msg += " sum(PT) = " + String.format("%.1f",sumPt) + " sum(P) = " + String.format("%.1f",sumP); - - return msg; - } - - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for(int i = 0; i < num; ++i) - { - int k = list[i]; - A3Vector start = A3Vector.fromRhoPhiZ(rho[0][k], phi[0][k], - z[0][k]); - A3Vector stop = A3Vector.fromRhoPhiZ(rho[1][k], phi[1][k], - z[1][k]); - A3Vector v = (stop.subtract(start)).normalize(); - double p = pT[k] / Math.sqrt(1. - v.z * v.z); - sum.add(new A4Vector(v.scale(p), 0.)); - } - return sum; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ASNPData.java b/graphics/AtlantisJava/src/atlantis/data/ASNPData.java deleted file mode 100644 index 4c6602479950..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASNPData.java +++ /dev/null @@ -1,659 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionXZ; -import atlantis.utils.A3Vector; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -/** - * Simulated Neutral Particle - */ - -public class ASNPData extends AData -{ - private static ALogger logger = ALogger.getLogger(ASNPData.class); - - private static final double START_RADIUS = 2.; - - protected int[] code; - protected int[] particleType; - protected int[] originVertex; - protected float[] pT; - protected float[][] rho; - protected float[][] phi; - protected float[][] z; - protected float[][] x; - protected float[][] y; - protected int[] type; - private float[] temp; - private int[] index; - - public float[] getPt() - { - return pT; - } - - public String getParameterGroup() - { - return "SNP"; - } - - public String getName() - { - return "SNP"; - } - - public String getNameScreenName() - { - return "SimNeutralTrack"; - } - - ASNPData(AHashMap p, AEvent e) - { - super(p,e); - rho = new float[2][]; - phi = new float[2][]; - z = new float[2][]; - x = new float[2][numData]; - y = new float[2][numData]; - rho[0] = p.getFloatArray("rhoVertex"); - phi[0] = p.getFloatArray("phiVertex"); - z[0] = p.getFloatArray("zVertex"); - - pT = p.getFloatArray("pt"); - code = p.getIntArray("code"); - type = new int[numData]; - particleType = new int[numData]; - originVertex = p.getIntArray("simulatedVertex"); - temp = new float[numData]; - for (int i = 0; i < numData; i++) - { - if (Math.abs(code[i]) > 10) - { - // code is being used to store particle code - particleType[i] = APDGTable.getParticleType(code[i]); - } - } - calculateReasonableEndpoints(p.getFloatArray("phi"), p.getFloatArray("eta")); - - double[] phiD = new double[numData]; - float[] phiF = p.getFloatArray("phi"); - - for (int i = 0; i < numData; i++) - phiD[i] = phiF[i]; - index = indexBy(phiD); - calculateXY(rho[0], phi[0], x[0], y[0]); - calculateXY(rho[1], phi[1], x[1], y[1]); - } - - protected void calculateRhoPhi() - { - calculateRhoPhi(x[0], y[0], rho[0], phi[0]); - calculateRhoPhi(x[1], y[1], rho[1], phi[1]); - } - - public static AHashMap createSNP(AHashMap p) - { - float[] pt = p.getFloatArray("pt"); - float[] phi = p.getFloatArray("phi"); - float[] eta = p.getFloatArray("eta"); - float[] rhoVertex = p.getFloatArray("rhoVertex"); - float[] phiVertex = p.getFloatArray("phiVertex"); - float[] zVertex = p.getFloatArray("zVertex"); - int[] id = p.getIntArray("id"); - - int[] code = p.getIntArray("code"); - - int numNeutral = 0; - - for (int i = 0; i < code.length; ++i) - { - int charge = code[i]; - - try - { - if (Math.abs(code[i]) >= 10) - - // code is being used to store particle code - charge = APDGTable.getCharge(code[i]); - if (charge == 0) - numNeutral++; - } - catch (APDGTable.ParticleNotFoundError pnf){ - logger.debug(pnf.getMessage()); - } - } - - int[] simulatedVertex = ASVxData.assignVertexNumbers(phiVertex, rhoVertex, zVertex); - - int[] idN = new int[numNeutral]; - float[] rhoVertexN = new float[numNeutral]; - float[] phiVertexN = new float[numNeutral]; - float[] zVertexN = new float[numNeutral]; - float[] ptN = new float[numNeutral]; - float[] phiN = new float[numNeutral]; - float[] etaN = new float[numNeutral]; - int[] codeN = new int[numNeutral]; - int[] simulatedVertexN = new int[numNeutral]; - - numNeutral = 0; - for (int i = 0; i < code.length; ++i) - { - double charge = code[i]; - - try - { - if (Math.abs(code[i]) >= 10) - { - // code is being used to store particle code - charge = APDGTable.getCharge(code[i]); - } - if (charge == 0) - { - idN[numNeutral] = id[i]; - rhoVertexN[numNeutral] = (float) Math.sqrt(rhoVertex[i]*rhoVertex[i]-zVertex[i]*zVertex[i]); - phiVertexN[numNeutral] = phiVertex[i]; - zVertexN[numNeutral] = zVertex[i]; - ptN[numNeutral] = pt[i]; - phiN[numNeutral] = phi[i]; - etaN[numNeutral] = eta[i]; - codeN[numNeutral] = code[i]; - simulatedVertexN[numNeutral] = simulatedVertex[i]; - numNeutral++; - } - } - catch (APDGTable.ParticleNotFoundError pnf){ - logger.debug(pnf.getMessage()); - } - } - - AHashMap newP = new AHashMap(10); - - newP.put("numData", new Integer(numNeutral)); - newP.put("id", idN); - newP.put("rhoVertex", rhoVertexN); - newP.put("phiVertex", phiVertexN); - newP.put("zVertex", zVertexN); - newP.put("pt", ptN); - newP.put("phi", phiN); - newP.put("eta", etaN); - newP.put("code", codeN); - newP.put("simulatedVertex", simulatedVertexN); - return newP; - } - - private void calculateReasonableEndpoints(float[] dirPhi, float[] dirEta) - { - double rhoTo = parameterStore.get("RTr", "RadiusTr").getD(); - double zTo = parameterStore.get("RTr", "ZTr").getD(); - - rho[1] = (float[]) rho[0].clone(); - phi[1] = (float[]) phi[0].clone(); - z[1] = (float[]) z[0].clone(); - for (int i = 0; i < numData; i++) - { - if (particleType[i] == 5) - { - // photon -> ecal entrance - rhoTo = 150.; - zTo = 370.; - } - else - { - // neutral hadron -> hcal entrance - rhoTo = 228.; - zTo = 426.2; - } - if (rho[0][i] > rhoTo || Math.abs(z[0][i]) > zTo) - continue; - double rho2 = rhoTo; - double tanLambda = AMath.tanLambda(dirEta[i]); - double zz = z[0][i] + (rho2 - rho[0][i]) * tanLambda; - - if (zz > zTo) - rho2 = (zTo - z[0][i]) / tanLambda + rho[0][i]; - if (zz < -zTo) - rho2 = (-zTo - z[0][i]) / tanLambda + rho[0][i]; - double x = rho[0][i] * Math.cos(phi[0][i]); - double y = rho[0][i] * Math.sin(phi[0][i]); - // y=mx+c, x*x+y*y=rho2*rho2 - double m = Math.tan(dirPhi[i]); - double c = y - m * x; - // ax^2+bx+cc=0 - double a = m * m + 1.; - double b = 2. * m * c; - double cc = c * c - rho2 * rho2; - double d = Math.sqrt(b * b - 4 * a * cc); - double x1 = (-b + d) / (a * 2); - double x2 = (-b - d) / (a * 2); - double y1 = m * x1 + c; - double y2 = m * x2 + c; - double xx = x1; - double yy = y1; - - if ((x2 - x) * Math.cos(dirPhi[i]) + (y2 - y) * Math.sin(dirPhi[i]) > 0.) - { - xx = x2; - yy = y2; - } - zz = z[0][i] + (rho2 - rho[0][i]) * tanLambda; - rho[1][i] = (float) Math.sqrt(xx * xx + yy * yy); - phi[1][i] = (float) Math.atan2(yy, xx); - if (phi[1][i] < 0.) - phi[1][i] += 2 * Math.PI; - z[1][i] = (float) zz; - } - } - - protected void applyCuts() - { - cutIndex(); - cut("CutsInDet", "STrType", " STr Type", particleType); - cut("CutsInDet", "STr", " STr id", id); - cut("CutsInDet", "Pt", " |Pt|", pT); - cut("CutsInDet", "SVx", " Vertex", originVertex); - cut("CutsInDet", "d0", " |d0|", getD0()); - cut("CutsInDet", "d0Loose", " |d0Loose|", getD0()); - cut("CutsInDet", "z0-zVtx", " |z0-zVtx|", getZ0Primary()); - cut("CutsInDet", "z0", " |z0|", getZ0()); - cutPhi(phi[1]); - float[] phiStart = new float[numData]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - - if (rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - - if (rho[iMin][list] > START_RADIUS) - phiStart[list] = phi[iMin][list]; - else - { - double[] rpz = calculateRhoPhiZAtStart(list); - - phiStart[list] = (float) rpz[1]; - } - } - cutPhi(phiStart); - cutEta(rho[1], z[1]); - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if (colorFunction == 0) - colorByConstant(); - else if (colorFunction == 1) - colorByIndex(index); - else if (colorFunction == 2) - colorBy(getPt()); - else if (colorFunction == 3) - colorBy("ParticleColors", particleType); - else if (colorFunction == 4) - colorBy(originVertex); - return 3; - } - - public String getHitInfo(int index) - { - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n Type = "); - msg.append(APDGTable.getName(code[index])); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV"); - - return msg.toString(); - } - - protected void cutStartRadius() - { - int num = 0; - - for (int i = 0; i < numDraw; i++) - if (Math.max(rho[0][listdl[i]], rho[1][listdl[i]]) > START_RADIUS) - listdl[num++] = listdl[i]; - numDraw = num; - } - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = x[j][list]; - hv[1][j][i] = y[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[1][list] - phiMid); - double sign; - - // this is not quite correct need to split some tracks - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign = +1.; - else - sign = -1.; - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = sign * rho[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getFRUser() - { - makeDrawList(); - cutStartRadius(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - - if (rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - double rho1 = rho[iMin][list]; - double rho2 = rho[iMax][list]; - - if (rho1 > START_RADIUS) - { - hv[0][0][i] = rho1; - hv[1][0][i] = Math.toDegrees(phi[iMin][list]); - } - else - { - double[] rpz = calculateRhoPhiZAtStart(list); - - hv[0][0][i] = rpz[0]; - hv[1][0][i] = Math.toDegrees(rpz[1]); - } - hv[0][1][i] = rho2; - hv[1][1][i] = Math.toDegrees(phi[iMax][list]); - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FR"); - } - - protected ACoord getXZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0 = Math.cos(phi0); - double sinPhi0 = Math.sin(phi0); - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = x[j][list] * cosPhi0 + y[j][list] * sinPhi0; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getYZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - double cosPhi0 = Math.cos(phi0); - double sinPhi0 = Math.sin(phi0); - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = y[j][list] * cosPhi0 - x[j][list] * sinPhi0; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - protected ACoord getFZUser() - { - makeDrawList(); - cutStartRadius(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int iMax = 0; - - if (rho[1][list] > rho[0][list]) - iMax = 1; - int iMin = 1 - iMax; - double rho1 = rho[iMin][list]; - - if (rho1 > START_RADIUS) - { - hv[0][0][i] = z[iMin][list]; - hv[1][0][i] = Math.toDegrees(phi[iMin][list]); - } - else - { - double[] rpz = calculateRhoPhiZAtStart(list); - - hv[0][0][i] = rpz[2]; - hv[1][0][i] = Math.toDegrees(rpz[1]); - } - hv[0][1][i] = z[iMax][list]; - hv[1][1][i] = Math.toDegrees(phi[iMax][list]); - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FZ"); - } - - protected ACoord getVPUser() - { - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - h[i] = AParameterUtilities.eta(z[1][list], rho[1][list]); - v[i] = Math.toDegrees(phi[1][list]); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("VP"); - } - - private double[] calculateRhoPhiZAtStart(int index) - { - double[] rpz = new double[3]; - double rho1 = rho[0][index]; - double phi1 = phi[0][index]; - double z1 = z[0][index]; - double rho2 = rho[1][index]; - double phi2 = phi[1][index]; - double z2 = z[1][index]; - double x1 = rho1 * Math.cos(phi1); - double y1 = rho1 * Math.sin(phi1); - double x2 = rho2 * Math.cos(phi2); - double y2 = rho2 * Math.sin(phi2); - double fract = (START_RADIUS - rho1) / (rho2 - rho1); - double x = x1 + fract * (x2 - x1); - double y = y1 + fract * (y2 - y1); - double z = z1 + fract * (z2 - z1); - double phi = Math.atan2(y, x); - - if (phi < 0.) - phi += 2 * Math.PI; - rpz[0] = START_RADIUS; - rpz[1] = phi; - rpz[2] = z; - return rpz; - } - - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumP = 0.; - double sumPt = 0.; - - for (int i = 0; i < numDraw; ++i) - { - sumPt += Math.abs(pT[listdl[i]]); - double invLambda = (rho[1][listdl[i]] - rho[0][listdl[i]]) / (z[1][listdl[i]] - z[0][listdl[i]]); - sumP += Math.abs(pT[listdl[i]] / Math.cos(Math.atan(1. / invLambda))); - } - - String msg = numDraw + " " + getNameScreenName(); - msg += " sum(PT) = " + String.format("%.1f",sumPt) + " sum(P) = " + String.format("%.1f",sumP); - - return msg; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A3Vector start = A3Vector.fromRhoPhiZ(rho[0][k], phi[0][k], z[0][k]); - A3Vector stop = A3Vector.fromRhoPhiZ(rho[1][k], phi[1][k], z[1][k]); - A3Vector v = (stop.subtract(start)).normalize(); - double p = pT[k] / Math.sqrt(1. - v.z * v.z); - sum.add(new A4Vector(v.scale(p), 0.)); - } - - return sum; - } - - private float[] getZ0() - { - for (int i = 0; i < numDraw; ++i) - { - int list = listdl[i]; - double[] poca = getPoca(list); - temp[list] = (float) poca[2]; - } - return temp; - } - - private float[] getZ0Primary() - { - double[] primary = event.getPrimaryVertex(); - double c = primary[2]; - for (int i = 0; i < numDraw; ++i) - { - int list = listdl[i]; - double[] poca = getPoca(list); - temp[list] = (float) (poca[2] - c); - } - return temp; - } - - private float[] getD0() - { - double[] primary = event.getPrimaryVertex(); - double a = primary[0]; - double b = primary[1]; - for (int i = 0; i < numDraw; ++i) - { - int list = listdl[i]; - double[] poca = getPoca(list); - temp[list] = (float) Math.hypot(a-poca[0], b-poca[1]); - } - return temp; - } - - private double[] getPoca(int i) - { - double[] primary = event.getPrimaryVertex(); - double a = primary[0]; - double b = primary[1]; - double xMin; - double yMin; - double zMin; - double dx = x[1][i] - x[0][i]; - if (dx == 0.) - { - xMin = x[0][i]; - yMin = b; - } - else - { - double m = (y[1][i] - y[0][i]) / dx; - double c = y[0][i] - m * x[0][i]; - xMin = (a + (b - c) * m) / (m * m + 1); - yMin = m * xMin + c; - } - double dz = z[1][i] - z[0][i]; - if (dz == 0.) - { - zMin = z[0][i]; - } - else - { - double mx = (x[1][i] - x[0][i]) / dz; - if (mx != 0.) - zMin = z[0][i] + (xMin - x[0][i]) / mx; - else - { - double my = (y[1][i] - y[0][i]) / dz; - if (my != 0.) - zMin = z[0][i] + (yMin - y[0][i]) / my; - else - zMin = z[0][i]; - } - } - return new double[] { xMin, yMin, zMin }; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ASTrData.java b/graphics/AtlantisJava/src/atlantis/data/ASTrData.java deleted file mode 100644 index aa8f6caa5d79..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASTrData.java +++ /dev/null @@ -1,254 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.utils.AHashMap; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; - -public class ASTrData extends ATrackData -{ - private static ALogger logger = ALogger.getLogger(ASTrData.class); - - public static final int UNDERLYING_EVENT = 0; - public static final int NORMAL = 1; - - protected int[] code; - protected int[] type; - protected int[] particleType; - protected int[] originVertex; - - public String getParameterGroup() - { - return "STr"; - } - - public String getName() - { - return "STr"; - } - - public String getNameScreenName() - { - return "SimChargedTrack"; - } - - ASTrData(AHashMap p, AEvent e) throws AAtlantisException - { - super(p,e); - code = p.getIntArray("code"); - originVertex = p.getIntArray("originVertex"); - type = p.getIntArray("type"); - particleType = new int[numData]; - for(int i = 0; i < numData; i++) - particleType[i] = APDGTable.getParticleType(code[i]); - } - - - public static AHashMap createSTr(AHashMap p) - { - float[] pt = p.getFloatArray("pt"); - float[] phi = p.getFloatArray("phi"); - float[] eta = p.getFloatArray("eta"); - float[] rhoVertex = p.getFloatArray("rhoVertex"); - float[] phiVertex = p.getFloatArray("phiVertex"); - float[] zVertex = p.getFloatArray("zVertex"); - int[] id = p.getIntArray("id"); - int[] code = p.getIntArray("code"); - //rhoEndVertex not available in older xml files - check that it exists first. - float[] rhoEndVertex = (p.get("rhoEndVertex") != null) ? p.getFloatArray("rhoEndVertex") : null; - //float[] phiEndVertex = (p.get("phiEndVertex") != null) ? p.getFloatArray("phiEndVertex") : null; - float[] zEndVertex = (p.get("zEndVertex") != null) ? p.getFloatArray("zEndVertex") : null; - - int numCharged = 0; - for(int i = 0; i < code.length; ++i) - { - int charge = code[i]; - - try - { - if(Math.abs(code[i]) >= 10 || Math.abs(code[i]) == 1) - // code is being used to store particle code - charge = APDGTable.getCharge(code[i]); - if(charge == 1 || charge == -1) - numCharged++; - } - catch(APDGTable.ParticleNotFoundError pnf){ - logger.debug(pnf.getMessage()); - } - } - - //Assign the vertices to the particle tracks - int[] simulatedVertex = ASVxData.assignVertexNumbers(phiVertex, rhoVertex, zVertex); - - //Now build subsets of the charged tracks only - int[] idC = new int[numCharged]; - int[] typeC = new int[numCharged]; - float[] rhoVertexC = new float[numCharged]; - float[] rhoEndVertexC = new float[numCharged]; - float[] phiVertexC = new float[numCharged]; - float[] zVertexC = new float[numCharged]; - float[] ptC = new float[numCharged]; - float[] phiC = new float[numCharged]; - float[] etaC = new float[numCharged]; - int[] chargeC = new int[numCharged]; - int[] codeC = new int[numCharged]; - int[] simulatedVertexC = new int[numCharged]; - - numCharged = 0; - for(int i = 0; i < code.length; ++i) - { - int charge = code[i]; - try - { - if(Math.abs(code[i]) >= 10 || Math.abs(code[i]) == 1) - // code is being used to store particle code - charge = APDGTable.getCharge(code[i]); - if(charge == 1 || charge == -1) - { - if(id[i] > 0) - { - idC[numCharged] = id[i]; - typeC[numCharged] = NORMAL; - } - else - { - // negative id is used to flag tracks belong to a second - // track bank which correspond to the underlyingEvent - // set id to zero as it is not a kine number - idC[numCharged] = 0; - typeC[numCharged] = UNDERLYING_EVENT; - } - //copy all the information - rhoVertexC[numCharged] = (float)(Math.sqrt(rhoVertex[i]*rhoVertex[i]-zVertex[i]*zVertex[i])); - //if there is no end vertex, fill with 0.0 as in XML file - rhoEndVertexC[numCharged] = (rhoEndVertex != null) ? (float)(Math.sqrt(rhoEndVertex[i]*rhoEndVertex[i]-zEndVertex[i]*zEndVertex[i])) : 0 ; - phiVertexC[numCharged] = phiVertex[i]; - zVertexC[numCharged] = zVertex[i]; - ptC[numCharged] = pt[i]; - //if (pt[i]>5) System.out.println(zVertex[i]); - phiC[numCharged] = phi[i]; - etaC[numCharged] = eta[i]; - codeC[numCharged] = code[i]; - chargeC[numCharged] = charge; - simulatedVertexC[numCharged] = simulatedVertex[i]; - numCharged++; - } - } - catch(APDGTable.ParticleNotFoundError pnf) - { - logger.debug(pnf.getMessage()); - } - } - - //Build a new hash map with the information for the - //charged tracks only - AHashMap newP = new AHashMap(12); - newP.put("numData", new Integer(numCharged)); - newP.put("id", idC); - newP.put("type", typeC); - newP.put("rhoVertex", rhoVertexC); - newP.put("rhoEndVertex", rhoEndVertexC); - newP.put("phiVertex", phiVertexC); - newP.put("zVertex", zVertexC); - newP.put("pt", ptC); - newP.put("phi", phiC); - newP.put("eta", etaC); - newP.put("code", codeC); - newP.put("charge", chargeC); - newP.put("originVertex", simulatedVertexC); - //return the new hasp map - return newP; - } - - - /** - * Get the vertex for which sum|Pt| is maximum - * @return the index of that vertex - */ - public int getMaxSumPtVertex() - { - /*** - * Triple loop can be avoided, e.g using hashmap, - * to tired to fix all this - S.B. - */ - - //get the highest vertex number - int maxVertex = 0; - - //by looping over all tracks and looking at the vertex number - for(int i = 0; i < numData; i++) - if(type[i] == NORMAL) - if(originVertex[i] > maxVertex) - maxVertex = originVertex[i]; - - //Now make an array to hold the sumPT for all vertices - double[] sumPt = new double[maxVertex + 1]; - - //Now loop again to add up all the pT - for(int i = 0; i < numData; i++) - if(type[i] == NORMAL && Math.abs(h[i].d0()) < 2.0) - sumPt[originVertex[i]] += Math.abs(h[i].pT()); - - //Yippee - lets loop once more to find the highest pT one - int VtxIndex = 0; - for(int i = 0; i < sumPt.length; i++) - if(sumPt[i] > sumPt[VtxIndex]) - VtxIndex = i; - - return VtxIndex; - } - - - - protected void applyCuts() - { - super.applyCuts(); - - // STr are always drawn as helices, check for tracks with rhoVertex - // beyond the diameter of InDet and don't draw those - super.cutRhoVertexAfterInDetRadius(); - - cut("CutsInDet", "STr", " STr id", id); - cut("CutsInDet", "STrCode", " STr code", code); - cut("CutsInDet", "STrType", " STr Type", particleType); - cut("CutsInDet", "SVx", " Vertex", originVertex); - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - switch (colorFunction) - { - case 0: - colorByConstant(); - break; - case 1: - colorByIndex(index); - break; - case 2: - colorBy(getPt()); - break; - case 3: - colorBy("ParticleColors", particleType); - break; - case 4: - colorBy(originVertex); - break; - } - - return 4; - } - - public String getHitInfo(int index) - { - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (barcode/id: " + id[index] + " index: " + index + ")"); - msg.append("\n Type = "+APDGTable.getName(code[index])); - msg.append(" (type code "); msg.append(code[index]); - msg.append(")"); msg.append(h[index].toString()); - - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ASVxData.java b/graphics/AtlantisJava/src/atlantis/data/ASVxData.java deleted file mode 100644 index 87481919d2ad..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASVxData.java +++ /dev/null @@ -1,167 +0,0 @@ -package atlantis.data; - - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.*; -import java.util.*; - - -/** - * Simulated vertices - */ -public class ASVxData extends A3DPointData { - - // protected final String PARAMETER_GROUP = getParameterGroup(); - - - public String getParameterGroup() - { - return "SVx"; - } - - - public String getName() - { - return "SVx"; - } - - - public String getNameScreenName() - { - return "SimVertex"; - - } - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.RHO+" = "+String.format("%.3f",rho[index])+"\n "+ - "z = "+String.format("%.3f",z[index])+" cm\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - return getNameScreenName() + " (id: " + id[index] + " index: " + index + ")" + - "\n x = " + String.format("%.5f",x[index]) + " cm" + - "\n y = " + String.format("%.5f",y[index]) + " cm" + - "\n z = " + String.format("%.5f",z[index]) + " cm" + - "\n " + AMath.RHO + " = " + String.format("%.5f",rho[index]) + " cm" + - "\n " + AMath.PHI + " = " + - String.format("%.5f",Math.toDegrees(phi[index])) + AMath.DEGREES + - " (" + String.format("%.5f",phi[index]) + " rad)"; - - } // getHitInfo() -------------------------------------------------------- - - - - ASVxData(AHashMap p, AEvent e) { - super(p,e); - } - - // SVx do not come correctly in input xml file - // must create them from STr data in xml file - public static AHashMap createSVx(AHashMap p) { - float[] rhoVertex=p.getFloatArray("rhoVertex"); - float[] phiVertex=p.getFloatArray("phiVertex"); - float[] zVertex=p.getFloatArray("zVertex"); - int[] sv=ASVxData.assignVertexNumbers(phiVertex, rhoVertex, zVertex); - int numVertex=0; - - for(int i=0; i<sv.length; i++) - if(sv[i]>=numVertex) numVertex=sv[i]+1; - - float[] rho=new float[numVertex]; - float[] phi=new float[numVertex]; - float[] z=new float[numVertex]; - - for(int i=0; i<sv.length; i++) { - rho[sv[i]]=(float)(Math.sqrt(rhoVertex[i]*rhoVertex[i]-zVertex[i]*zVertex[i])); - phi[sv[i]]=phiVertex[i]; - z[sv[i]]=zVertex[i]; - } - - AHashMap newP=new AHashMap(4); - - newP.put("numData", new Integer(numVertex)); - newP.put("rho", rho); - newP.put("phi", phi); - newP.put("z", z); - return newP; - } - - public static int[] assignVertexNumbers(float[] phi, float[] rho, float[] z) { - int[] sv=new int[phi.length]; - Vertex[] key=new Vertex[phi.length]; - - HashMap vertices=new HashMap(); - -// this is ugly, related to the fact that id[i]=i+1 by default; - int num=1; - for(int i=0; i<sv.length; i++) { - key[i]=new Vertex(rho[i], phi[i], z[i]); - Object value=vertices.get(key[i]); - if(value==null) { - sv[i]=num; - vertices.put(key[i], new Integer(num++)); - } else { - sv[i]=((Integer)value).intValue(); - } - } - return sv; - } - - protected int internalColor() { - colorByConstant(); - return 1; - } - - protected void applyCuts() { - cutIndex(); - cutPhi(phi); - cutEta(rho, z); - cut("CutsInDet", "SVx", " Vertex", id); - } - - - public double[] getVertex(int index) { - - double[] vertex=new double[3]; - - if(index>-1&&index<numData) { - vertex[0]=x[index]; - vertex[1]=y[index]; - vertex[2]=z[index]; - } - return vertex; - } - -} - - -class Vertex { - float x; - float y; - float z; - int hashcode; - - Vertex(float x, float y, float z) { - this.x=x; - this.y=y; - this.z=z; - hashcode=Float.floatToIntBits(z); - } - - @Override - public int hashCode() { - return hashcode; - } - - @Override - public boolean equals(Object a) { - if(!(a instanceof Vertex)) return false; - Vertex b=(Vertex)a; - return x==b.x&&y==b.y&&z==b.z; - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/data/ASegmentData.java b/graphics/AtlantisJava/src/atlantis/data/ASegmentData.java deleted file mode 100755 index d999effdb0b2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASegmentData.java +++ /dev/null @@ -1,164 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionXZ; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * Generic track segment class. - * - * @author Eric Jansen - */ -public abstract class ASegmentData extends AData { - - protected float[] x; - protected float[] y; - protected float[] z; - protected float[] theta; - protected float[] phi; - protected int[] hits; - protected int[] numHits; - - ASegmentData(AHashMap p, AEvent e) { - super(p,e); - - x = p.getFloatArray("x"); - y = p.getFloatArray("y"); - z = p.getFloatArray("z"); - phi = p.getFloatArray("phi"); - theta = p.getFloatArray("theta"); - numHits = p.getIntArray("numHits"); - - hits = p.getIntArray("hits"); - } - - protected int internalColor() { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - switch(colorFunction) { - case 0: - colorByConstant(); - break; - case 1: - colorByIndex(); - break; - } - - return 1; - } - - - protected void applyCuts() - { - cutIndex(); - - } - - - public String getHitInfo(int index) { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - - return getName() + " (index: " + index + ")\n" - + " storegate key = " + storeGateKey + "\n" - + " " + AMath.PHI + " = " + String.format("%.3f",Math.toDegrees(phi[index])) - + " (" + String.format("%.3f",phi[index]) + " rad)" + "\n" - + " tL = " + String.format("%.3f",Math.toDegrees(1./Math.tan(theta[index]))) + "\n" - + " x = " + String.format("%.3f",x[index]) + " cm\n" - + " y = " + String.format("%.3f",y[index]) + " cm\n" - + " z = " + String.format("%.3f",z[index]) + " cm\n" - + " hits = " + numHits[index] + "\n"; - } - - protected ACoord getYXUser() { - makeDrawList(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - double length = parameterStore.get(PARAMETER_GROUP, "SegmentLength").getD(); - - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - - double dx = length * Math.sin(theta[j]) * Math.cos(phi[j]); - double dy = length * Math.sin(theta[j]) * Math.sin(phi[j]); - - hv[0][i] = new double [] {x[j]-dx, x[j]-dx/2., x[j], x[j]+dx/2., x[j]+dx}; - hv[1][i] = new double [] {y[j]-dy, y[j]-dy/2., y[j], y[j]+dy/2., y[j]+dy}; - - index[i] = j; - } - - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - } - - protected ACoord getFRUser() { - return getYXUser().convertYXToFR().includePhiWrapAround("FR"); - } - - protected ACoord getRZUser() { - makeDrawList(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - double length = parameterStore.get(PARAMETER_GROUP, "SegmentLength").getD(); - - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - - double dx = length * Math.sin(theta[j]) * Math.cos(phi[j]); - double dy = length * Math.sin(theta[j]) * Math.sin(phi[j]); - double dz = length * Math.cos(theta[j]); - - int sign = AParameterUtilities.getRhoSign(x[j], y[j]); - - hv[0][i] = new double [] {z[j]-dz, z[j]+dz}; - hv[1][i] = new double [] { - sign * Math.hypot(x[i]-dx, y[i]-dy), - sign * Math.hypot(x[i]+dx, y[i]+dy) - }; - - index[i] = j; - } - - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - protected ACoord getXZUser() { - makeDrawList(); - - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - double length = parameterStore.get(PARAMETER_GROUP, "SegmentLength").getD(); - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - - double dx = length * Math.sin(theta[j]) * Math.cos(phi[j]); - double dy = length * Math.sin(theta[j]) * Math.sin(phi[j]); - double dz = length * Math.cos(theta[j]); - - double s = x[j] * Math.cos(phi0) + y[j] * Math.sin(phi0); - double ds = dx * Math.cos(phi0) + dy * Math.sin(phi0); - - if (z[j] < 0) { - hv[0][i] = new double [] {z[j]+dz, z[j]-dz}; - hv[1][i] = new double [] {s-ds, s+ds}; - } else { - hv[0][i] = new double [] {z[j]-dz, z[j]+dz}; - hv[1][i] = new double [] {s-ds, s+ds}; - } - - index[i] = j; - } - - return new ACoord(hv, index, this, ACoord.POLYLINES); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ASiClusterData.java b/graphics/AtlantisJava/src/atlantis/data/ASiClusterData.java deleted file mode 100644 index 83cc0f980261..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASiClusterData.java +++ /dev/null @@ -1,385 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - -/** - * SiCluster - Silicon clusters, reads in STC datatype from event file - */ -public class ASiClusterData extends AHitData -{ - // read in from event file - private float[][] x; - private float[][] y; - private float[][] z; - private float[] width; - private int[] etaModule; - private int[] phiModule; - private int[] side; - - // calculated - private float[][] rho; - private float[][] phi; - private int[] layer; - - public static final int U_CLUSTER = -1; - public static final int PHI_CLUSTER = 0; - public static final int V_CLUSTER = 1; - public static final int ENDCAP_MINUS = 0; - public static final int BARREL = 1; - public static final int ENDCAP_PLUS = 2; - - - public String getParameterGroup() - { - return "SiCluster"; - } - - public String getName() - { - return "SiCluster"; - } - - public String getNameScreenName() - { - return "SCT_Cluster"; - } - - public float[][] getX() - { - return x; - } - - public float[][] getY() - { - return y; - } - - public float[][] getZ() - { - return z; - } - - - - ASiClusterData(AHashMap p, AEvent e) - { - super(p,e); - x = new float[][] { p.getFloatArray("x0"), p.getFloatArray("x1") }; - y = new float[][] { p.getFloatArray("y0"), p.getFloatArray("y1") }; - z = new float[][] { p.getFloatArray("z0"), p.getFloatArray("z1") }; - width = p.getFloatArray("width"); - - rho = new float[2][numData]; - phi = new float[2][numData]; - - layer = new int[numData]; - for (int i = 0; i < numData; ++i) - { - sub[i] = getSub(id[i]); - layer[i] = getLayer(id[i]); - } - - etaModule = (p.get("etaModule") != null) ? p.getIntArray("etaModule") : null; - phiModule = (p.get("phiModule") != null) ? p.getIntArray("phiModule") : null; - side = (p.get("side") != null) ? p.getIntArray("side") : null; - - } // ASiClusterData() --------------------------------------------------- - - - - protected void calculateRhoPhi() - { - - calculateRhoPhi(x[0], y[0], rho[0], phi[0]); - calculateRhoPhi(x[1], y[1], rho[1], phi[1]); - // treat wraparound - for (int i = 0; i < numData; ++i) - { - if (Math.abs(phi[1][i] - phi[0][i]) > Math.PI) - { - if (phi[1][i] - phi[0][i] > 0) - { - phi[0][i] += AMath.TWO_PI; - } - else - { - phi[1][i] += AMath.TWO_PI; - } - } - } // for - } // calculateRhoPhi() -------------------------------------------------- - - private void cutSubdetector() - { - AParameter par = parameterStore.get("CutsInDet", "SCT"); - if (par.getI() != -1) - { - cutArray(sub, par.getI(), "Barrel/Endcap"); - } - } // cutSubdetector() --------------------------------------------------- - - - protected void applyCuts() - { - cutIndex(); - cutOrientation(); - cutSubdetector(); - cut("CutsInDet", "Layer", "Layer", layer); - cutSimulatedTracks(); - cutReconstructedTracks(); - cutPhi(phi[0]); - cutEta(); - } // applyCuts() -------------------------------------------------------- - - private void cutEta() - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - if (!par.getStatus()) - return; - double etaCut = par.getD(); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double eta1 = AParameterUtilities.eta(z[0][list], rho[0][list]); - double eta2 = AParameterUtilities.eta(z[1][list], rho[1][list]); - double etaLower = Math.min(eta1, eta2); - double etaUpper = Math.max(eta1, eta2); - if (etaUpper > etaLowerCut && etaLower < etaUpperCut) - listdl[num++] = list; - } - numDraw = num; - } // cutEta() ----------------------------------------------------------- - - public int getLayer(int id) - { - int layer = (id & 0x01e00000) >> 21; - int sub = getSub(id); - if (sub == BARREL) - { - layer += 3; - } - else - { - layer += 11; - } - return layer; - } // getLayer() --------------------------------------------------------- - - public int getSub(int id) - { - return (id & 0x06000000) >> 25; - } // getSub() ----------------------------------------------------------- - - public int getOrientation(int id) - { - int side = (id & 0x400) >> 10; - int sub = getSub(id); - if ((side == 1 && sub == BARREL) || (side == 0 && sub != BARREL)) - { - return PHI_CLUSTER; - } - - int layer = getLayer(id); - if (layer % 2 == 1) - { - return U_CLUSTER; - } - - return V_CLUSTER; - } // getOrientation() --------------------------------------------------- - - protected void cutOrientation() - { - int num = 0; - AParameter stereoAnglePar = parameterStore.get("SiCluster", "Stereo"); - if (!stereoAnglePar.getStatus()) - { - return; - } - int orientation = stereoAnglePar.getI(); - for (int i = 0; i < numDraw; i++) - { - // only works for barrel for now !!!! - // if( getSub(id[listdl[i]])==BARREL && - // orientation==getOrientation(id[listdl[i]])) - if (orientation == getOrientation(id[listdl[i]])) - { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } // cutOrientation() --------------------------------------------------- - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if (colorFunction == numColorTypes + 1) - { - colorBy(layer); - } - else if (colorFunction == numColorTypes + 2) - { - colorByOrientation(); - } - - return numColorTypes + 2; - } // internalColor() ---------------------------------------------------- - - protected void colorByOrientation() - { - int numColors = parameterStore.get("HitColors", "Number").getI(); - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) - { - color[i] = (byte) col[getOrientation(id[i]) + 1 % numColors]; - } - } // colorByOrientation() ----------------------------------------------- - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index; - - String temp = getNameScreenName() + " (id: " + id[index] + " index: " + index +")\n" + - " orientation = " + getOrientation(id[index]); - temp += "\n x = " + x[0][index] + " " + x[1][index]; - temp += "\n y = " + y[0][index] + " " + y[1][index]; - temp += "\n z = " + z[0][index] + " " + z[1][index]; - temp += "\n " + AMath.RHO + " = " + rho[0][index] + " " + rho[1][index]; - temp += "\n " + AMath.ETA + " module = "; - temp += (etaModule != null) ? Integer.toString(etaModule[index]) : "n/a"; - temp += "\n " + AMath.PHI + " module = "; - temp += (phiModule != null) ? Integer.toString(phiModule[index]) : "n/a"; - temp += "\n side = "; - temp += (side != null) ? Integer.toString(side[index]) : "n/a"; - temp += "\n width = "; - temp += (width != null) ? Float.toString(width[index]) : "n/a"; - - temp += super.getHitInfo(index); // finds barcode information - - return temp; - } // getHitInfo() ------------------------------------------------------- - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = x[j][list]; - hv[1][j][i] = y[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } // getYXUser() -------------------------------------------------------- - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[1][list] - phiMid); - double sign; - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - { - sign = +1.; - } - else - { - sign = -1.; - } - - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = sign * rho[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } // getRZUser() -------------------------------------------------------- - - protected ACoord getFRUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = rho[j][list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], z[j][list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FR"); - } // getFRUser() -------------------------------------------------------- - - protected ACoord getFZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], z[j][list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FZ"); - } // getFZUser() -------------------------------------------------------- - - protected ACoord getVPUser() - { - makeDrawList(); - int numTotal = 2 * numDraw; - double[][][] hv = new double[2][numTotal][2]; - int[] index = new int[numTotal]; - double[] sign = new double[] { -1., 1. }; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for (int k = 0; k < 2; k++) - { - double deltaEta = AProjectionVP.getDeltaEta(rho[k][list], z[k][list]); - double eta = AParameterUtilities.eta(z[k][list], rho[k][list]); - for (int j = 0; j < 2; j++) - { - hv[0][2 * i + j][k] = eta + sign[j] * deltaEta; - hv[1][2 * i + j][k] = Math.toDegrees(phi[k][list]); - index[2 * i + j] = list; - } - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES).includePhiWrapAround("VP"); - } // getVPUser() -------------------------------------------------------- - -} // class ASiClusterData =================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/ASiClusterRDOData.java b/graphics/AtlantisJava/src/atlantis/data/ASiClusterRDOData.java deleted file mode 100644 index ac1806b4cb14..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ASiClusterRDOData.java +++ /dev/null @@ -1,481 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionVP; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - - -/** - * Silicon clusters RDO Raw Data Objects (class derived from ASiClusterData) - * Parameters expected in the event file for SCTRDO datatype: - * x0|x1|y0|y1|z0|z1|phiModule|etaModule|id|BCIDError|firstHitError| - * formatterError|lvl1Error|preambleError|secondHitError|syncError|timeBin - * - */ -public class ASiClusterRDOData extends AHitData -{ - private float[][] x = null; - private float[][] y = null; - private float[][] z = null; - private int[] etaModule = null; - private int[] phiModule = null; - private int[] BCIDError = null; - private int[] firstHitError = null; - private int[] formatterError = null; - private int[] lvl1Error = null; - private int[] preambleError = null; - private int[] secondHitError = null; - private int[] syncError = null; - private int[] timeBin = null; - // calculated here - private int[] layer; - private float[][] rho; - private float[][] phi; - - public static final int U_CLUSTER = -1; - public static final int PHI_CLUSTER = 0; - public static final int V_CLUSTER = 1; - public static final int ENDCAP_MINUS = 0; - public static final int BARREL = 1; - public static final int ENDCAP_PLUS = 2; - - - - public String getParameterGroup() - { - return "SiClusterRDO"; - - } // getParameterGroup() ------------------------------------------------ - - - - public String getName() - { - return "SiClusterRDO"; - - } // getName() ---------------------------------------------------------- - - - - public String getNameScreenName() - { - return "SiClusterRDO"; - - } // getNameScreenName() ------------------------------------------------ - - - - ASiClusterRDOData(AHashMap p, AEvent e) - { - super(p,e); - x = new float[][] - { p.getFloatArray("x0"), p.getFloatArray("x1") }; - y = new float[][] - { p.getFloatArray("y0"), p.getFloatArray("y1") }; - z = new float[][] - { p.getFloatArray("z0"), p.getFloatArray("z1") }; - etaModule = p.getIntArray("etaModule"); - phiModule = p.getIntArray("phiModule"); - BCIDError = p.getIntArray("BCIDError"); - firstHitError = p.getIntArray("firstHitError"); - formatterError = p.getIntArray("formatterError"); - lvl1Error = p.getIntArray("lvl1Error"); - preambleError = p.getIntArray("preambleError"); - secondHitError = p.getIntArray("secondHitError"); - syncError = p.getIntArray("syncError"); - timeBin = p.getIntArray("timeBin"); - rho = new float[2][numData]; - phi = new float[2][numData]; - layer = new int[numData]; - - for(int i = 0; i < numData; ++i) - { - sub[i] = getSub(id[i]); - layer[i] = getLayer(id[i]); - } - - } // ASiClusterRDOData() ------------------------------------------------ - - - protected void calculateRhoPhi() - { - calculateRhoPhi(x[0], y[0], rho[0], phi[0]); - calculateRhoPhi(x[1], y[1], rho[1], phi[1]); - // treat wraparound - for(int i = 0; i < numData; ++i) - { - if(Math.abs(phi[1][i] - phi[0][i]) > Math.PI) - { - if(phi[1][i] - phi[0][i] > 0) - { - phi[0][i] += AMath.TWO_PI; - } - else - { - phi[1][i] += AMath.TWO_PI; - } - } - } - - } // calculateRhoPhi() -------------------------------------------------- - - - - private void cutSubdetector() - { - AParameter par = parameterStore.get("CutsInDet", "SCT"); - if(par.getI() != -1) - { - cutArray(sub, par.getI(), "Barrel/Endcap"); - } - - } // cutSubdetector() --------------------------------------------------- - - - protected void applyCuts() - { - cutIndex(); - cutOrientation(); - cutSubdetector(); - cut("CutsInDet", "Layer", "Layer", layer); - cutPhi(phi[0]); - cutEta(); - - } // applyCuts() -------------------------------------------------------- - - - - private void cutEta() - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - if(!par.getStatus())return; - double etaCut = par.getD(); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double eta1 = AParameterUtilities.eta(z[0][list], rho[0][list]); - double eta2 = AParameterUtilities.eta(z[1][list], rho[1][list]); - double etaLower = Math.min(eta1, eta2); - double etaUpper = Math.max(eta1, eta2); - if(etaUpper > etaLowerCut && etaLower < etaUpperCut) - listdl[num++] = list; - } - numDraw = num; - - } // cutEta() ----------------------------------------------------------- - - - - public int getLayer(int id) - { - int layer = (id & 0x01e00000) >> 21; - int sub = getSub(id); - if(sub == BARREL) - layer += 3; - else - layer += 11; - return layer; - - } // getLayer() --------------------------------------------------------- - - - - public int getSub(int id) - { - return(id & 0x06000000) >> 25; - - } // getSub() ----------------------------------------------------------- - - - - public int getOrientation(int id) - { - int side = (id & 0x400) >> 10; - int sub = getSub(id); - if((side == 1 && sub == BARREL) || (side == 0 && sub != BARREL)) - { - return PHI_CLUSTER; - } - int layer = getLayer(id); - if(layer % 2 == 1)return U_CLUSTER; - return V_CLUSTER; - - } // getOrientation() --------------------------------------------------- - - - - protected void cutOrientation() - { - int num = 0; - AParameter stereoAnglePar = parameterStore.get("SiCluster", "Stereo"); - if(!stereoAnglePar.getStatus()) - { - return; - } - int orientation = stereoAnglePar.getI(); - for(int i = 0; i < numDraw; i++) - // only works for barrel for now !!!! - // if( getSub(id[listdl[i]])==BARREL && orientation==getOrientation(id[listdl[i]])) - if(orientation == getOrientation(id[listdl[i]])) - { - listdl[num++] = listdl[i]; - } - numDraw = num; - - } // cutOrientation() --------------------------------------------------- - - - - /** - * parameter InDet -> SiClusterRDO -> Color Function: - * pv="Constant = 0, Error = 1, Orientation = 2" - */ - protected int internalColor() - { - // it's usual to call this method from mother class, but in this case - // it uses it's own colour types co we don't care about AHitData - // int numColorTypes = super.internalColor(); - - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == 0) - { - colorByConstant(); - } - else if(colorFunction == 1) - { - colorByError(); - } - else if(colorFunction == 2) - { - colorByOrientation(); - } - - // 3 colour schemes exist here - return 3; - - } // internalColor() ---------------------------------------------------- - - - - /** - * colour elements by error (error subtags from the event file): - * BCIDError, firstHitError, formatterError, lvl1Error, preambleError, - * secondHitError, syncError ] - * if any of these flags is set to true, the element is considered erroneous - * (next iteration may be to colour by error type, if they want it ...) - */ - protected void colorByError() - { - int constantColor = parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - int errorColor = parameterStore.get(PARAMETER_GROUP, "Error").getI(); - - for(int i = 0; i < numData; i++) - { - if(BCIDError[i] != 0 || firstHitError[i] != 0 || - formatterError[i] != 0 || lvl1Error[i] != 0 || - preambleError[i] != 0 || secondHitError[i] != 0 || - syncError[i] != 0) - { - // element is erroneous - color[i] = (byte) errorColor; - } - else - { - color[i] = (byte) constantColor; - } - } - - } // colorByError() ----------------------------------------------------- - - - - protected void colorByOrientation() - { - int numColors = parameterStore.get("HitColors", "Number").getI(); - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for(int i = 0; i < numData; i++) - { - color[i] = (byte) col[getOrientation(id[i]) + 1 % numColors]; - } - - } // colorByOrientation() ----------------------------------------------- - - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index; - - String temp = getNameScreenName() + " (id: " + id[index] + " index: " + index + ")\n" + - " orientation = " + getOrientation(id[index]) + "\n" + - " x = " + x[0][index] + " " + x[1][index] + "\n" + - " y = " + y[0][index] + " " + y[1][index] + "\n" + - " z = " + z[0][index] + " " + z[1][index] + "\n" + - " " + AMath.RHO + " = " + rho[0][index] + " " + - rho[1][index] + "\n" + - " " + AMath.ETA + " module = " + etaModule[index] + "\n" + - " " + AMath.PHI + " module = " + phiModule[index] + "\n" + - " BCID error = " + BCIDError[index] + "\n" + - " first hit error = " + firstHitError[index] + "\n" + - " formatter error = " + formatterError[index] + "\n" + - " lvl1 error = " + lvl1Error[index] + "\n" + - " preamble error = " + preambleError[index] + "\n" + - " second hit error = " + secondHitError[index] + "\n" + - " sync error = " + syncError[index] + "\n" + - " time bin = " + timeBin[index]; - return temp; - - } // getHitInfo() ------------------------------------------------------- - - - - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = x[j][list]; - hv[1][j][i] = y[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - - } // getYXUser() -------------------------------------------------------- - - - - protected ACoord getRZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double phiDiff = Math.abs(phi[1][list] - phiMid); - double sign; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - { - sign = +1.; - } - else - { - sign = -1.; - } - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = sign * rho[j][list]; - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - - } // getRZUser() -------------------------------------------------------- - - - - protected ACoord getFRUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = rho[j][list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], - z[j][list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FR"); - - } // getFRUser() -------------------------------------------------------- - - - - protected ACoord getFZUser() - { - makeDrawList(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - for(int j = 0; j < 2; j++) - { - hv[0][j][i] = z[j][list]; - hv[1][j][i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[j][list], phi[j][list], - z[j][list])); - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FZ"); - - } // getFZUser() -------------------------------------------------------- - - - - protected ACoord getVPUser() - { - makeDrawList(); - int numTotal = 2 * numDraw; - int numPoints = 10; - double[][][] hv = new double[2][numTotal][numPoints]; - int[] index = new int[numTotal]; - double[] sign = new double[] - { -1., 1.}; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double xx = x[0][list]; - double delx = (x[1][list] - x[0][list]) / (numPoints - 1); - double yy = y[0][list]; - double dely = (y[1][list] - y[0][list]) / (numPoints - 1); - double zz = z[0][list]; - double delz = (z[1][list] - z[0][list]) / (numPoints - 1); - for(int k = 0; k < numPoints; k++) - { - double xxx = xx + k * delx; - double yyy = yy + k * dely; - double zzz = zz + k * delz; - double rrr = Math.sqrt(xxx * xxx + yyy * yyy); - double ppp = Math.atan2(yyy, xxx); - double deltaEta = AProjectionVP.getDeltaEta(rrr, zzz); - double eta = AParameterUtilities.eta(zzz, rrr); - for(int j = 0; j < 2; j++) - { - hv[0][2 * i + j][k] = eta + sign[j] * deltaEta; - hv[1][2 * i + j][k] = Math.toDegrees(ppp); - index[2 * i + j] = list; - } - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES). includePhiWrapAround("VP"); - - } // getVPUser() -------------------------------------------------------- - - -} // class ASiClusterRDOData ================================================ diff --git a/graphics/AtlantisJava/src/atlantis/data/ATGCData.java b/graphics/AtlantisJava/src/atlantis/data/ATGCData.java deleted file mode 100755 index e0005dce948e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATGCData.java +++ /dev/null @@ -1,340 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameterUtilities; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - -public class ATGCData extends AMuonHitData -{ - float[] swidth; - float[] lwidth; - float[] length; - int[] gasGap; - - private static ALogger logger = ALogger.getLogger(ATGCData.class); - - public String getParameterGroup() - { - return "TGC"; - } - - public String getName() - { - return "TGC"; - } - - public String getNameScreenName() - { - return "TGC"; - } - - ATGCData(AHashMap p, AEvent e) - { - super(p,e); - swidth = p.getFloatArray("swidth"); - length = p.getFloatArray("length"); - lwidth = p.getFloatArray("lwidth"); - gasGap = new int[numData]; - for (int i = 0; i < numData; i++) - gasGap[i] = getGasGap(i); - } - - protected int getStation(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - return (stationName.charAt(1) - '0') % 4; - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - } - - protected int getSub(int index) - { - try { - if (AIdHelper.stationEta(id[index]) < 0) { - return 0; - } else { - return 1; - } - - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - } - - public int getSector(int index) - { - try { - String stationName = AIdHelper.stationName(id[index]); - int stationPhi = AIdHelper.stationPhi(id[index]); - - int retval; - if (stationName.equals("T4E")) { - int temp = stationPhi % 24; - retval = 2 * (temp / 3); - } else if (stationName.charAt(2) == 'F') { - int temp = stationPhi % 24; - retval = 2 * (temp / 3); - if (temp % 3 > 1) retval += 1; - } else { - int temp = (stationPhi + 1) % 48; - retval = 2 * (temp / 6); - if (temp % 6 > 3) retval += 1; - } - return retval; - - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - - } - - protected int getGasGap(int index) - { - try { - return AIdHelper.tgcGasGap(id[index]); - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return 0; - } - - protected boolean getMeasuresPhi(int index) - { - try { - if (AIdHelper.tgcIsStrip(id[index]) == 1) { - return true; - } - } catch (AAtlantisException e) { - logger.error("Problem decoding TGC identifier", e); - } - - return false; - } - - public void applyCuts() - { - super.applyCuts(); - if (parameterStore.get("CutsATLAS", "CutPhi").getStatus()) - cutPhi(phi, getDPhi()); - if (parameterStore.get("CutsATLAS", "CutEta").getStatus()) - cutEtaDRho(rho, z, getDRho()); - } - - // used for cuts - - private float[] getDPhi() - { - // only roughly correct - // must create all - float[] dphi = new float[numData]; - - // need only fill for those in draw list - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - dphi[list] = (float) Math.abs(Math.atan2((swidth[list] + lwidth[list]) / 4., rho[list])); - } - return dphi; - } - - // used for cuts - - private float[] getDRho() - { - // only roughly correct - // must create all - float[] drho = new float[numData]; - - // need only fill for those in draw list - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - drho[list] = (float) (length[list] / 2.); - } - return drho; - } - - protected ACoord getFZUser() - { - makeDrawList(); - cutArray(measuresPhi, true, " Strip"); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - index[i] = list; - double deltaPhi = ((swidth[list] + lwidth[list]) / 4.) / rho[list]; - - hv[0][0][i] = z[list]; - hv[1][0][i] = Math.toDegrees(phi[list] - deltaPhi); - hv[0][1][i] = z[list]; - hv[1][1][i] = Math.toDegrees(phi[list] + deltaPhi); - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FZ"); - } - - private void makeDrawListYX() - { - int mode = parameterStore.get("YX", "Mode").getI(); - - if (mode == 0 || mode >= 5) - { - numDraw = 0; - } - else - { - makeDrawList(); - int num = 0; - - for (int i = 0; i < numDraw; ++i) - if (mode == station[listdl[i]] + 1) - listdl[num++] = listdl[i]; - numDraw = num; - } - cut("YX", "TGCGasGap", " TGC Gas Gap", gasGap); - } - - protected ACoord getYXUser() - { - return getYXUser(0); - } - - protected ACoord getYXUser(int flag) - { - makeDrawListYX(); - int[] split = { 6, 1, 6, 1 }; - int numPoints = 4; - boolean splitIt = parameterStore.get("YX", "FishEye").getStatus() || flag == 1; - - if (splitIt) - numPoints = 14; - double[] temp = new double[4]; - double[][][] hv = new double[2][numDraw][numPoints]; - int[] index = new int[numDraw]; - - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - - index[i] = list; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double rMid = rho[list]; - double dR = length[list] / 2.; - double r = rMid - dR; - double d = swidth[list] / 2.; - double x = r * cosPhi; - double y = r * sinPhi; - double dx = d * sinPhi; - double dy = d * cosPhi; - - hv[0][i][0] = x + dx; - hv[1][i][0] = y - dy; - hv[0][i][1] = x - dx; - hv[1][i][1] = y + dy; - r = rMid + dR; - x = r * cosPhi; - y = r * sinPhi; - d = lwidth[list] / 2.; - dx = d * sinPhi; - dy = d * cosPhi; - hv[0][i][2] = x - dx; - hv[1][i][2] = y + dy; - hv[0][i][3] = x + dx; - hv[1][i][3] = y - dy; - if (splitIt) - for (int j = 0; j < 2; ++j) - { - for (int k = 0; k < 4; ++k) - temp[k] = hv[j][i][k]; - AMath.splitArrayIntoPieces(temp, hv[j][i], split); - } - } - return new ACoord(hv, index, this); - } - - protected ACoord getFRUser() - { - return getYXUser(1).convertYXToFR().includePhiWrapAround("FR"); - } - - protected ACoord getXZRZUser(int sign[]) - { - double[][][] hv = new double[2][numDraw][]; - int index[] = new int[numDraw]; - - try { - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - double rho = Math.sqrt(x[j]*x[j] + y[j]*y[j]); - - if (AIdHelper.tgcIsStrip(id[j]) == 1) { - double drho = length[j]/2.; - hv[0][i] = new double[] { z[j], z[j] }; - hv[1][i] = new double[] { sign[i] * (rho - drho), - sign[i] * (rho + drho) }; - } else { - hv[0][i] = new double[] { z[j] }; - hv[1][i] = new double[] { sign[i] * rho }; - } - } - - return new ACoord(hv, index, this); - } catch (AAtlantisException e) { - AOutput.append("Error decoding TGC identifier: " + e.getMessage(), ALogInterface.BAD_COMMAND); - return ACoord.NO_DATA; - } - } - - protected ACoord getXZUser() { - makeDrawList(); - cutMuonSector(sector); - - int[] sign = new int[numDraw]; - int sect = (int) Math.round(parameterStore.get("XZ", "Phi").getD() / 22.5); - - for(int i=0; i<numDraw; i++) { - if (sector[listdl[i]] == sect) - sign[i] = 1; - else - sign[i] = -1; - } - - return getXZRZUser(sign); - } - - protected ACoord getRZUser() { - makeDrawList(); - - int[] sign = new int[numDraw]; - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - sign[i] = AParameterUtilities.getRhoSign(x[j], y[j]); - } - - return getXZRZUser(sign); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ATILEData.java b/graphics/AtlantisJava/src/atlantis/data/ATILEData.java deleted file mode 100755 index 99bc22c7daac..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATILEData.java +++ /dev/null @@ -1,843 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.io.FileNotFoundException; - -import com.Ostermiller.util.CSVParser; - -import atlantis.geometry.ACalorimeterDetector; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.utils.AUtilities; -import atlantis.utils.ALogger; - - -/** - * The TILE hadronic calorimeter. - * - * @author Eric Jansen - */ -public class ATILEData extends ACalorimeterData -{ - private static ALogger logger = ALogger.getLogger(ATILEData.class); - - // data for real pulse shapes plots - private float[] pmt1Energy = null; - private float[] pmt2Energy = null; - private float[] pmt1Chi2 = null; - private float[] pmt2Chi2 = null; - private float[] pmt1Time = null; - private float[] pmt2Time = null; - private float[] pmt1RawTime = null; - private float[] pmt2RawTime = null; - private float[] pmt1RawAmplitude = null; - private float[] pmt2RawAmplitude = null; - private int[][] adcCounts1 = null; - private int[][] adcCounts2 = null; - private int[] pmt1Gain = null; - private int[] pmt2Gain = null; - private float[] pmt1Pedestal = null; - private float[] pmt2Pedestal = null; - private int[] pmt1Number = null; - private int[] pmt2Number = null; - private int[] pmt1ADCStatus = null; - private int[] pmt2ADCStatus = null; - private static boolean pulseShapesDataAvailable = false; - private static final String LOOKUP_TABLE_FILE = - AGlobals.instance().getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - "rpsplt_tile.csv"; - // number of lookup table values for real pulse shapes plots calculation - private static final short NUMBER_OF_LOOKUP_VALUES = 401; - - - ATILEData(AHashMap p, AEvent e) - { - super(p,e); - - - for (int i = 0; i < numData; i++) - { - try - { - side[i] = (byte) AIdHelper.tileSide(id[i]); - etaIndex[i] = (short) AIdHelper.tileTower(id[i]); - phiIndex[i] = (short) AIdHelper.tileModule(id[i]); - sampling[i] = AIdHelper.tileSampling(id[i]); - } - catch (AAtlantisException ex) - { - System.out.println("Problem decoding ID " + id[i] + " in " + - CALORIMETER_NAME + ": " + ex.getMessage()); - side[i] = 0; - etaIndex[i] = -1; - phiIndex[i] = -1; - sampling[i] = -1; - } - } - - makeHitToGeometryMapping(); - for (int i = 0; i < et.length; ++i) - { - et[i] = Math.abs(energy[i] / (float) Math.cosh(eta[i])); - } - - // Collect some constants needed for the histograms. - for (int i = 0; i < ACalorimeterDetector.count(); i++) - { - if (ACalorimeterDetector.get(i).getName().indexOf(CALORIMETER_NAME) >= 0) - { - if (innerR == 0.0 || ACalorimeterDetector.get(i).getRMin() < innerR) - { - innerR = ACalorimeterDetector.get(i).getRMin(); - } - if (phiGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaPhi() < phiGranularity) - { - phiGranularity = ACalorimeterDetector.get(i).getDeltaPhi(); - } - if (etaGranularity == 0.0 || ACalorimeterDetector.get(i).getDeltaEta() < etaGranularity) - { - etaGranularity = ACalorimeterDetector.get(i).getDeltaEta(); - } - if (outerEta == 0.0 || ACalorimeterDetector.get(i).getEtaMax() > outerEta) - { - outerEta = ACalorimeterDetector.get(i).getEtaMax(); - } - } - - if (outerR == 0.0 || ACalorimeterDetector.get(i).getRMax() > outerR) - { - outerR = ACalorimeterDetector.get(i).getRMax(); - } - if (outerZ == 0.0 || ACalorimeterDetector.get(i).getZMax() > outerZ) - { - outerZ = ACalorimeterDetector.get(i).getZMax(); - } - } - - // Add a little bit of extra margin to prevent binning errors due to - // rounding of numbers. - outerEta += etaGranularity; - - readPulseShapePlotData(p); - - pmt1ADCStatus = (p.get("pmt1ADCStatus") != null) ? p.getIntArray("pmt1ADCStatus") : null; - pmt2ADCStatus = (p.get("pmt2ADCStatus") != null) ? p.getIntArray("pmt2ADCStatus") : null; - - - } // ATILEData() -------------------------------------------------------- - - - - /** - * readLookupTableFile() reads in comma separated values (CSV) file - * with TILE real pulse shapes plots time and amplitude lookup values - * @throws AAtlantisException - */ - protected static void readLookupTableFile() throws AAtlantisException - { - try - { - InputStream is = AUtilities.getFileAsStream(LOOKUP_TABLE_FILE); - CSVParser parser = new CSVParser(is); - parser.setCommentStart("#"); - String arrayName = null; - - while((arrayName = parser.nextValue()) != null) - { - String valueArray = parser.nextValue(); // shall now contain all values - CSVParser parserArray = new CSVParser(new StringReader(valueArray)); - String[][] s = parserArray.getAllValues(); - if("TILE_AMPLITUDE".equals(arrayName)) - { - ACalorimeterRPSPLT.TILE_AMPLITUDE = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - else if("TILE_TIME".equals(arrayName)) - { - ACalorimeterRPSPLT.TILE_TIME = - getLookupTableArray(s, NUMBER_OF_LOOKUP_VALUES); - } - } - } - catch(FileNotFoundException e) - { - throw new AAtlantisException("could not find file: " + - LOOKUP_TABLE_FILE); - } - catch(IOException e) - { - throw new AAtlantisException("exception while reading file: " + - LOOKUP_TABLE_FILE); - } - catch(AAtlantisException e) - { - throw e; - } - - } // readLookupTableFile() ---------------------------------------------- - - - - private void readPulseShapePlotData(AHashMap p) - { - pmt1Energy = (p.get("pmt1Energy") != null) ? p.getFloatArray("pmt1Energy") : null; - pmt2Energy = (p.get("pmt2Energy") != null) ? p.getFloatArray("pmt2Energy") : null; - pmt1Chi2 = (p.get("pmt1Chi2") != null) ? p.getFloatArray("pmt1Chi2") : null; - pmt2Chi2 = (p.get("pmt2Chi2") != null) ? p.getFloatArray("pmt2Chi2") : null; - pmt1Time = (p.get("pmt1Time") != null) ? p.getFloatArray("pmt1Time") : null; - pmt2Time = (p.get("pmt2Time") != null) ? p.getFloatArray("pmt2Time") : null; - - pmt1Gain = (p.get("pmt1Gain") != null) ? p.getIntArray("pmt1Gain") : null; - pmt2Gain = (p.get("pmt2Gain") != null) ? p.getIntArray("pmt2Gain") : null; - - pmt1Pedestal = (p.get("pmt1Pedestal") != null) ? p.getFloatArray("pmt1Pedestal") : null; - pmt2Pedestal = (p.get("pmt2Pedestal") != null) ? p.getFloatArray("pmt2Pedestal") : null; - - pmt1Number = (p.get("pmt1Number") != null) ? p.getIntArray("pmt1Number") : null; - pmt2Number = (p.get("pmt2Number") != null) ? p.getIntArray("pmt2Number") : null; - - int[] adc1 = (p.get("adcCounts1") != null) ? p.getIntArray("adcCounts1") : null; - int[] adc2 = (p.get("adcCounts2") != null) ? p.getIntArray("adcCounts2") : null; - - // by zdenek (2008-09-15): - // raw time: later additions to tilecal pulse shapes, doens't necessarily - // have to be in the event files, will not be in the old ones - pmt1RawTime = (p.get("pmt1RawTime") != null) ? p.getFloatArray("pmt1RawTime") : null; - pmt2RawTime = (p.get("pmt2RawTime") != null) ? p.getFloatArray("pmt2RawTime") : null; - - // by zdenek (2008-11-24): - // pmt1RawAmplitude, pmt2RawAmplitude now used to calculate pulse shape - // this is made now obligatory, without this data, the pulse shapes will - // not be available - pmt1RawAmplitude = (p.get("pmt1RawAmplitude") != null) ? p.getFloatArray("pmt1RawAmplitude") : null; - pmt2RawAmplitude = (p.get("pmt2RawAmplitude") != null) ? p.getFloatArray("pmt2RawAmplitude") : null; - - // read in ADCCounts - if(adc1 != null && adc2 != null) - { - adcCounts1 = new int[numData][0]; - adcCounts2 = new int[numData][0]; - // amount of numbers associated with each cells (i.e. with each data item) - int multiple = adc1.length / numData; - int num = 0; - for (int i = 0; i < numData; i++) - { - adcCounts1[i] = new int[multiple]; - adcCounts2[i] = new int[multiple]; - for (int j = 0; j < multiple; j++) - { - adcCounts1[i][j] = adc1[num]; // fill in array for each cell - adcCounts2[i][j] = adc2[num]; // fill in array for each cell - num++; - } - } - } - - pulseShapesDataAvailable = false; - if(adcCounts1 != null && adcCounts2 != null && adcCounts1.length != 0 && - adcCounts2.length != 0 && adcCounts1[0].length != 0 && - adcCounts2[0].length != 0 && pmt1Number != null && - pmt2Number != null && pmt1Energy != null && pmt2Energy != null && - pmt1Time != null && pmt2Time != null && pmt1Pedestal != null && - pmt2Pedestal != null && pmt1Gain != null && pmt2Gain != null && - pmt1RawAmplitude != null && pmt2RawAmplitude != null) - { - pulseShapesDataAvailable = true; - - logger.debug(CALORIMETER_NAME + - ": data for real pulse shape plots available"); - - if(ACalorimeterRPSPLT.areTileLookupTablesInitialized()) - { - logger.debug(CALORIMETER_NAME + - ": lookup tables have already been read in"); - } - else - { - - logger.debug(CALORIMETER_NAME + - ": lookup table values have not been read in yet\n" + - " trying to read file: " + LOOKUP_TABLE_FILE); - - try - { - readLookupTableFile(); - logger.debug(CALORIMETER_NAME + - ": values from " + LOOKUP_TABLE_FILE + - " successfully read in"); - } - catch(AAtlantisException ex) - { - logger.error(CALORIMETER_NAME + - ": reading " + LOOKUP_TABLE_FILE + - " failed, real pulse shapes plots will not " + - "be available, reason: " + ex.getMessage(), ex); - pulseShapesDataAvailable = false; - } - } - } - - } // readPulseShapePlotData() ------------------------------------------- - - - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsCalo", "TileET", "TileET", et); - cut("CutsCalo", "TileEnergyBottom", "TileEnergyBottom", energy); - cut("CutsCalo", "TileEnergyUp", "TileEnergyUp", energy); - - // following cut is based on pmt1ADCStatus, resp. pmt2ADCStatus - if(pmt1ADCStatus != null && pmt2ADCStatus != null) - { - cut("CutsCalo", "TilePMTADC", "TilePMTADC", pmt1ADCStatus); - cut("CutsCalo", "TilePMTADC", "TilePMTADC", pmt2ADCStatus); - } - } - - - - /** - * Returns the name of the parameter group. - * @return String parameter group - */ - public String getParameterGroup() - { - return "TILE"; - } - - /** - * Returns the name of the datatype. - * @return String datatype - */ - public String getName() - { - return "TILE"; - } - - /** - * Returns the displayed name of datatype - * @return String screen name - */ - public String getNameScreenName() - { - return "TILE"; - } - - /** - * Returns the type of calorimeter (ECAL/HCAL) for a hit. - * @param index int hit index - * @return String calorimeter type - */ - public String getCalorimeterType(int index) - { - return "HCAL"; - } - - @Override //ACalorimeterData - //Gives the hit time for this Tile cell based on the PMT times - protected double getTime(int hit) - { - if (pmt1Time == null) return 0.0; - else if (pmt2Time == null) return 0.0; - else { - if (pmt1Time[hit]!=0.0 && pmt2Time[hit]!=0.0){ - return (pmt1Time[hit]+pmt2Time[hit])/2.; - } - if (pmt1Time[hit]==0.0 && pmt2Time[hit]!=0.0){ - return pmt2Time[hit]; - } - if (pmt1Time[hit]!=0.0 && pmt2Time[hit]==0.0){ - return pmt1Time[hit]; - } - } - return 0.0; - } - - /** - * Returns calo hit info, most of the parameters are taken from from - * (mother) ACalorimeterData class. - * @param index int - * @return String - */ - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n ET="+String.format("%.3f",et[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Ex="+String.format("%.3f",et[index]*Math.cos(phi[index]))+" GeV "+ - "\n Ey="+String.format("%.3f",et[index]*Math.sin(phi[index]))+" GeV "+ - "\n Ez="+String.format("%.3f",et[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String t = ""; - String pmt1Info = ""; - String pmt2Info = ""; - - String decodedId = AIdHelper.getDecodedTileIndentifier(id[index]); - t = decodedId + " " + super.getHitInfoNoDecode(index); - - - pmt1Info += "\n PMT1 ADC status = "; - pmt1Info += (pmt1ADCStatus != null) ? Integer.toString(pmt1ADCStatus[index]) : "n/a"; - - pmt1Info += "\n PMT1 energy = "; - pmt1Info += (pmt1Energy != null) ? Float.toString(pmt1Energy[index]) + - " GeV" : "n/a"; - pmt1Info += "\n PMT1 chi2 = "; - pmt1Info += (pmt1Chi2 != null) ? Float.toString(pmt1Chi2[index]) : "n/a"; - pmt1Info += "\n PMT1 time = "; - pmt1Info += (pmt1Time != null) ? Float.toString(pmt1Time[index]) + - " ns" : "n/a"; - pmt1Info += "\n PMT1 gain = "; - pmt1Info += (pmt1Gain != null) ? Integer.toString(pmt1Gain[index]) : "n/a"; - pmt1Info += "\n PMT1 pedestal = "; - pmt1Info += (pmt1Pedestal != null) ? Float.toString(pmt1Pedestal[index]) + - " ADC counts" : "n/a"; - - - pmt2Info += "\n PMT2 ADC status = "; - pmt2Info += (pmt2ADCStatus != null) ? Integer.toString(pmt2ADCStatus[index]) : "n/a"; - - pmt2Info += "\n PMT2 energy = "; - pmt2Info += (pmt2Energy != null) ? Float.toString(pmt2Energy[index]) + - " GeV" : "n/a"; - pmt2Info += "\n PMT2 chi2 = "; - pmt2Info += (pmt2Chi2 != null) ? Float.toString(pmt2Chi2[index]) : "n/a"; - pmt2Info += "\n PMT2 time = "; - pmt2Info += (pmt2Time != null) ? Float.toString(pmt2Time[index]) + - " ns" : "n/a"; - pmt2Info += "\n PMT2 gain = "; - pmt2Info += (pmt2Gain != null) ? Integer.toString(pmt2Gain[index]) : "n/a"; - pmt2Info += "\n PMT2 pedestal = "; - pmt2Info += (pmt2Pedestal != null) ? Float.toString(pmt2Pedestal[index]) + - " ADC counts" : "n/a"; - - pmt2Info += pulseShapesDataAvailable ? "" : - "\n data for real pulse shapes plot n/a"; - - pmt2Info += "\n calc time = "+getTime(index); - - return t + pmt1Info + pmt2Info; - - } // getHitInfo() ------------------------------------------------------- - - - - // calculate real pulse shapes values based on the values in the lookup tables - private double getPhysicsPulseShape(double xTime, double pmtTime, - double pmtPedestal, double pmtEnergy, - float[] amplitude, float[] time) - throws AAtlantisException - { - double tdiv = 0.0; - int lookup = 0; - double localTime = 0.0; - double xpulse = 0.0; - - // need to get "multiple" parameter ( = number of values in adcCounts - // for each cell - adcCounts1[0].length), shall be the same for all the - // cells - taking the length of the first array (for the first cell) - // [currently (2007-05-23) is this multiple 9 but to change in real data] - // no NullPointer or ArrayIndexBound checks are necessary here as this - // method shall only be called when the relevant data is available - double centerOfSamples = (adcCounts1[0].length + 1.0) / 2.0; - - tdiv = time[1] - time[0]; - localTime = (xTime - centerOfSamples) * 25.0 - pmtTime; - lookup = (int) ((localTime - time[0]) / tdiv); - - if(lookup < 0) - { - lookup = 0; - } - if(lookup >= NUMBER_OF_LOOKUP_VALUES - 1) - { - lookup = NUMBER_OF_LOOKUP_VALUES - 2; // -1 was off by 1 - } - - try - { - if(lookup == 0 || lookup == NUMBER_OF_LOOKUP_VALUES - 2) - { - xpulse = amplitude[lookup]; - } - else - { - xpulse = amplitude[lookup] + ((amplitude[lookup + 1] - - amplitude[lookup]) / tdiv) * (localTime - time[lookup]); - } - } - catch(ArrayIndexOutOfBoundsException ex) - { - String m = "ATILEData.getPhysicsPulseShape():\n" + - " lookup index out of bound: lookup = " + lookup; - throw new AAtlantisException(m); - } - return (xpulse * pmtEnergy) + pmtPedestal; - - } // getPhysicsPulseShape() --------------------------------------------- - - - -// /** -// * Call util class which plots cell pulse shapes provided that -// * all real pulse shapes data is available -// * Functions calculates values of real pulse shape calculated in the method -// * getPhysicsPulseShape(). -// * This method is called from pick interaction. -// * -// * @param index int -// */ - /*public void plotPulseShapes(int index) - { - - if(pulseShapesDataAvailable) - { - String title = getPulseTitleString(index); - - // two channels for a TILE cell (two arrays of ADC counts) - int[][] adcCounts = new int[][] { adcCounts1[index], adcCounts2[index] }; - - if(super.checkADCCountsAvailability(adcCounts)) - { - // adc counts are available - logger.debug(CALORIMETER_NAME + " adc counts (digits) are " + - "available for pulse shapes plots for this cell."); - } - else - { - AOutput.append("\nADC counts are not available for this cell, " + - "can't plot pulse shapes.", ALogPane.WARNING); - return; - } - - - String cap1 = "Real pulse shape " + "PMT " + pmt1Number[index] + - " gain " + pmt1Gain[index]; - String cap2 = "Real pulse shape " + "PMT " + pmt2Number[index] + - " gain " + pmt2Gain[index]; - String[] subTitle = new String[] { cap1, cap2 }; - - // by zdenek (2008-11-24): - // energy calculations (lowGainFactor, highGainFactor) and related - // magic constants removed - now using pmt1RawAmplitude, pmt2RawAmplitude - // instead of pmt[1,2]Energy, resp. former local variables - // energy1, energy2 when calling getPhysicsPulseShape() further down - - // 1 .. 9 range (9 values of ADC counts, 9 samples (starts from 1!)), - // need to get 401 values within this range. number of samples will - // likely decrease in real data from 9 to 7 - double step = (adcCounts1[index].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - double[][] realPulse = new double[2][NUMBER_OF_LOOKUP_VALUES]; // 2 channels - double[][] realPulseForRawTime = null; - double d = 1.0; - - // if pmt1RawTime and pmt2RawTime are present, use those for - // calculating data for real pulse shape plot based on these time values - boolean showPlotForRawTime = false; - if(pmt1RawTime != null && pmt2RawTime != null) - { - logger.debug("TILE pmt[1,2]RawTime are present, showing another plot."); - showPlotForRawTime = true; - realPulseForRawTime = new double[2][NUMBER_OF_LOOKUP_VALUES]; // 2 channels - } - - - // by zdenek 2008-11-25 - // DPD (slimed version of ESD) sometimes don't have pmt[1,2]Pedestal - // for a cell (the tag exists, values are there, but are 0). check - // if pedestal is 0 and if so, take as pedestal value the first - // adc count digit - float pmt1PedestalLocal = pmt1Pedestal[index]; - float pmt2PedestalLocal = pmt2Pedestal[index]; - if(pmt1PedestalLocal == 0.0f && pmt2PedestalLocal == 0.0f) - { - logger.debug("TILE pmt[1,2]Pedestal are not available (i.e. " + - "are 0.0f), using minimum of first and last " + - "adcCount digit as pedestal."); - float last1 = adcCounts1[index][adcCounts1[index].length - 1]; - float last2 = adcCounts2[index][adcCounts2[index].length - 1]; - pmt1PedestalLocal = Math.min(adcCounts1[index][0], last1); - pmt2PedestalLocal = Math.min(adcCounts2[index][0], last2); - } - - - try - { - for(int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) - { - d += step; - realPulse[0][i] = - getPhysicsPulseShape(d, pmt1Time[index], pmt1PedestalLocal, - pmt1RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - realPulse[1][i] = - getPhysicsPulseShape(d, pmt2Time[index], pmt2PedestalLocal, - pmt2RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - if(showPlotForRawTime) - { - realPulseForRawTime[0][i] = - getPhysicsPulseShape(d, pmt1RawTime[index], pmt1PedestalLocal, - pmt1RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - realPulseForRawTime[1][i] = - getPhysicsPulseShape(d, pmt2RawTime[index], pmt2PedestalLocal, - pmt2RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - } - } - } - catch(AAtlantisException aaex) - { - AOutput.append(aaex.getMessage(), ALogPane.WARNING); - return; - } - - if(realPulseForRawTime != null) - { - APulseShapePlot.plotRealPulseShapes(adcCounts, realPulse, - step, subTitle, title + " (cell time)"); - APulseShapePlot.plotRealPulseShapes(adcCounts, realPulseForRawTime, - step, subTitle, title + " (raw time)"); - } - else - { - // if RawTime stuff is to be removed, there will remain only - // one such call to plot real pulse shapes - this one - APulseShapePlot.plotRealPulseShapes(adcCounts, realPulse, - step, subTitle, title); - } - } - else - { - logger.warn(CALORIMETER_NAME + " plotPulseShapes() method called, " + - "but data is not available."); - return; - } - - } */// plotPulseShapes() -------------------------------------------------- - - - - /** - * Returns the histograms for this projection. - * - * @param projection AProjection2D current projection - * @return ACoord[] polygons representing histograms - */ - protected ACoord[] getUserHistograms(AProjection2D projection) - { - ACoord[] data = ACoord.NO_HISTOGRAMS; - if (projection instanceof AProjectionYX && parameterStore.get("YX", "Mode").getI() == AProjectionYX.MODE_STANDARD) - data = getYXHistograms(); - else if (projection instanceof AProjectionFR) - data = getFRHistograms(); - else if (projection instanceof AProjectionRZ) - data = getRZHistograms(); - return projection.nonLinearTransform(data); - } - - @Override - protected String getPulseTitleString(int index) { - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - - String title = CALORIMETER_NAME + " cell: " + decodedId[0]; - - return title; - } - - @Override - protected int[][] getADCCounts(int index) { - - if (pulseShapesDataAvailable) { - // two channels for a TILE cell (two arrays of ADC counts) - return new int[][]{adcCounts1[index], adcCounts2[index]}; - } else { - return null; - } - } - - @Override - protected double[][] getPulseShape(int index) { - - if (!pulseShapesDataAvailable) return null; - - // by zdenek (2008-11-24): - // energy calculations (lowGainFactor, highGainFactor) and related - // magic constants removed - now using pmt1RawAmplitude, pmt2RawAmplitude - // instead of pmt[1,2]Energy, resp. former local variables - // energy1, energy2 when calling getPhysicsPulseShape() further down - - // 1 .. 9 range (9 values of ADC counts, 9 samples (starts from 1!)), - // need to get 401 values within this range. number of samples will - // likely decrease in real data from 9 to 7 - double step = getPulseStep(index); - double[][] realPulseRaw = new double[2][NUMBER_OF_LOOKUP_VALUES]; // 2 channels - double d = 1.0; - - // if pmt1RawTime and pmt2RawTime are present, use those for - // calculating data for real pulse shape plot based on these time values - if (pmt1RawTime == null || pmt2RawTime == null) { - logger.warn("No raw time values available"); - return null; - } - - - // by zdenek 2008-11-25 - // DPD (slimed version of ESD) sometimes don't have pmt[1,2]Pedestal - // for a cell (the tag exists, values are there, but are 0). check - // if pedestal is 0 and if so, take as pedestal value the first - // adc count digit - float pmt1PedestalLocal = pmt1Pedestal[index]; - float pmt2PedestalLocal = pmt2Pedestal[index]; - if (pmt1PedestalLocal == 0.0f && pmt2PedestalLocal == 0.0f) { - logger.debug("TILE pmt[1,2]Pedestal are not available (i.e. " + - "are 0.0f), using minimum of first and last " + - "adcCount digit as pedestal."); - float last1 = adcCounts1[index][adcCounts1[index].length - 1]; - float last2 = adcCounts2[index][adcCounts2[index].length - 1]; - pmt1PedestalLocal = Math.min(adcCounts1[index][0], last1); - pmt2PedestalLocal = Math.min(adcCounts2[index][0], last2); - } - - try { - for (int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) { - d += step; - realPulseRaw[0][i] = - getPhysicsPulseShape(d, pmt1RawTime[index], pmt1PedestalLocal, - pmt1RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - realPulseRaw[1][i] = - getPhysicsPulseShape(d, pmt2RawTime[index], pmt2PedestalLocal, - pmt2RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - } - } catch (AAtlantisException aaex) { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - return null; - } - - return realPulseRaw; - } - - protected double[][] getPulseShapeCellTime(int index) { - - if (!pulseShapesDataAvailable) return null; - - double step = getPulseStep(index); - double[][] realPulse = new double[2][NUMBER_OF_LOOKUP_VALUES]; // 2 channels - double d = 1.0; - - // by zdenek 2008-11-25 - // DPD (slimed version of ESD) sometimes don't have pmt[1,2]Pedestal - // for a cell (the tag exists, values are there, but are 0). check - // if pedestal is 0 and if so, take as pedestal value the first - // adc count digit - float pmt1PedestalLocal = pmt1Pedestal[index]; - float pmt2PedestalLocal = pmt2Pedestal[index]; - if (pmt1PedestalLocal == 0.0f && pmt2PedestalLocal == 0.0f) { - logger.debug("TILE pmt[1,2]Pedestal are not available (i.e. " + - "are 0.0f), using minimum of first and last " + - "adcCount digit as pedestal."); - float last1 = adcCounts1[index][adcCounts1[index].length - 1]; - float last2 = adcCounts2[index][adcCounts2[index].length - 1]; - pmt1PedestalLocal = Math.min(adcCounts1[index][0], last1); - pmt2PedestalLocal = Math.min(adcCounts2[index][0], last2); - } - - try { - for (int i = 0; i < NUMBER_OF_LOOKUP_VALUES; i++) { - d += step; - realPulse[0][i] = - getPhysicsPulseShape(d, pmt1Time[index], pmt1PedestalLocal, - pmt1RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - realPulse[1][i] = - getPhysicsPulseShape(d, pmt2Time[index], pmt2PedestalLocal, - pmt2RawAmplitude[index], - ACalorimeterRPSPLT.TILE_AMPLITUDE, - ACalorimeterRPSPLT.TILE_TIME); - } - } catch (AAtlantisException aaex) { - AOutput.append(aaex.getMessage(), ALogInterface.WARNING); - return null; - } - - return realPulse; - } - - - @Override - protected double getPulseStep(int index) { - return (adcCounts1[index].length - 1) / (float) NUMBER_OF_LOOKUP_VALUES; - } - - @Override - protected String[] getPulseSubtitle(int index) { - String cap1 = "Real pulse shape " + "PMT " + pmt1Number[index] + - " gain " + pmt1Gain[index]; - String cap2 = "Real pulse shape " + "PMT " + pmt2Number[index] + - " gain " + pmt2Gain[index]; - return new String[]{cap1, cap2}; - } - - public void plotPulseShapesWithTiming(int index) { - - int[][] adc = getADCCounts(index); - double[][] raw = getPulseShape(index); - double[][] cell = getPulseShapeCellTime(index); - - if (adc == null || raw == null || cell == null) { - logger.warn("Pulse shapes with raw/cell times requested but no " + - "data available, falling back to regular pulse shapes"); - plotPulseShapes(index, true); - } else { - APulseShapePlot.plotRawCellPulseShapes(adc, raw, cell, - getPulseStep(index), getPulseSubtitle(index), - getPulseTitleString(index)); - } - - /*if (!withcurve) { - APulseShapePlot.plotADCCounts(adc, getPulseTitleString(index), null); - } else { - double[][] ps = getPulseShape(index); - if (ps == null) { - logger.warn("No pulse shape information available, just plotting adc instead"); - APulseShapePlot.plotADCCounts(adc, getPulseTitleString(index), null); - } else { - APulseShapePlot.plotRealPulseShapes(adc, ps, - getPulseStep(index), getPulseSubtitle(index), getPulseTitleString(index)); - } - }*/ - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ATRTData.java b/graphics/AtlantisJava/src/atlantis/data/ATRTData.java deleted file mode 100644 index c77849df8a98..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATRTData.java +++ /dev/null @@ -1,752 +0,0 @@ -package atlantis.data; - -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.Vector; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.tree.DefaultMutableTreeNode; - -import atlantis.canvas.ACanvas; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.colormap.AColorMap; -import atlantis.list.AList; -import atlantis.list.AListManager; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AHashMap; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; - - -/** - * - * Transition Radiation Tracker data - * - * data from the event file - * id - processed by AData - * barcode (old) / barcodes and numBarcodes (new) - processed by AHitData - * phi - * rhoz - rho (for barrel) or z (for endcap) - * driftR - drift radius - * threshold - * sub - subdetector - * - * still need to have correct phi calculated from pVtx for cuts - * still need to have correct rho calculated from pVtx for cuts - * - */ -public class ATRTData extends AHitData -{ - protected float[] phi = null; - protected float[] rhoz = null; - protected float[] driftR = null; - protected int[] threshold = null; - protected int[] noise = null; - // bitPattern subtag information implemented in the retriever but - // currently (2009-01-21) not used or necessary but - // said to may become useful later - protected int[] bitPattern = null; - protected float[] timeOverThreshold = null; - protected HashMap<String, int[]> driftSign = new HashMap<String, int[]>(); - protected HashMap<String, int[]> isOutlier = new HashMap<String, int[]>(); - //error code for when driftSign/isOutlier is not present - private static final int NO_DATA =-99; - - - - public String getParameterGroup() - { - return "TRT"; - } - - - public String getName() - { - return "TRT"; - } - - - public String getNameScreenName() - { - return "TRT_DriftCircle"; - } - - - public int getDriftSign(int index) - { - //find current selection of track - AEnumeratorParameter listBox = (AEnumeratorParameter) parameterStore.get("InDetTrack", "InDetTrackCollections"); - String currentSelection = listBox.getCurrentText(); - if(driftSign!=null && !currentSelection.equals("All")) - { - //find data from current track - int[] data = (int[]) driftSign.get(currentSelection); - if(data!=null) - return data[index]; - } - //no present so return error code - return NO_DATA; - } - - - public int getIsOutlier(int index) - { - //find current selection of track - AEnumeratorParameter listBox = (AEnumeratorParameter) parameterStore.get("InDetTrack", "InDetTrackCollections"); - String currentSelection = listBox.getCurrentText(); - if(isOutlier!=null && !currentSelection.equals("All")) - { - //find data from current track - int[] data = (int[]) isOutlier.get(currentSelection); - if(data!=null) - return data[index]; - } - //no present so return error code - return NO_DATA; - } - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - StringBuilder s = new StringBuilder(); - String[] decodedId = AIdHelper.getFullIdentifier(id[index]); - s.append(getNameScreenName() + " (id: " + decodedId[0] + - " index: " + index + ")"); - // iterate over decodedId to get further details (if available), - // first item [0] was already printed out above - for(int i = 1; i < decodedId.length; i++) - { - s.append("\n " + decodedId[i]); - } - if(sub[index] == 1 || sub[index] == 2) - { - s.append("\n " + AMath.RHO + " = " + String.format("%.1f",rhoz[index]) + " cm"); - } - else - { - s.append("\n z = " + String.format("%.1f",rhoz[index]) + " cm"); - } - s.append("\n " + AMath.PHI + " = " + - String.format("%.1f",Math.toDegrees(phi[index])) + AMath.DEGREES + - " (" + String.format("%.3f",phi[index]) + " rad)" + - "\n drift radius = " + String.format("%.3f",driftR[index]) + " cm" + - "\n threshold = " + threshold[index] + - "\n sub = " + sub[index]); - - s.append(super.getHitInfo(index)); // finds barcode information - - int d = getDriftSign(index); - s.append((d!=NO_DATA) ? ("\n driftSign = " + d) : "\n driftSign = n/a"); - int o = getIsOutlier(index); - s.append((o!=NO_DATA) ? ("\n isOutlier = " + o) : "\n isOutlier = n/a"); - s.append("\n noise = " + (noise != null ? noise[index] : "n/a")); - s.append("\n time over threshold = " + - (timeOverThreshold != null ? timeOverThreshold[index] : "n/a")); - - return s.toString(); - - } // getHitInfo() ------------------------------------------------------- - - - public ATRTData(AHashMap p, AEvent e) - { - super(p,e); - phi = p.getFloatArray("phi"); - rhoz = p.getFloatArray("rhoz"); - driftR = p.getFloatArray("driftR"); - threshold = p.getUnknownIntArray("threshold"); - noise = p.getUnsureIntArray("noise"); - if(p.getIntArray("sub") == null) - { - for(int i=0; i<numData; i++) - { - sub[i] = getSub(id[i]); - } - } - // the way to retrieve bitPattern subtag information - // currently (2009-01-21) not used or necessary but - // said to may become useful later - // bitPattern = p.getIntArray("bitPattern"); - timeOverThreshold = p.getFloatArray("timeOverThreshold"); - - } // ATRTData() --------------------------------------------------------- - - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == numColorTypes + 1) // colour by Track Segment - { - colorBy(getSegments()); - } - else if(colorFunction == numColorTypes + 2) // colour by isOutlier - { - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - int iO = getIsOutlier(list); - if(iO==0) - color[list]= AColorMap.GN;//green - else if(iO==1) - color[list]= AColorMap.RD;//red - else - color[list]= (byte) parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - } - } - else if(colorFunction == numColorTypes + 3) // colour by driftSign - { - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - int ds = getDriftSign(list); - if(ds==-1) - color[list]= AColorMap.GN;//green - else if(ds==1) - color[list]= AColorMap.RD;//red - else - color[list]= (byte) parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - } - } - else if(colorFunction == numColorTypes + 4) // colour by threshold - { - for(int i=0; i<numDraw; i++) - { - int list = listdl[i]; - if(threshold[list]==1) - color[list]= AColorMap.RD; // red is preferable then previous green - else - color[list]= (byte) parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - } - } - return numColorTypes + 1; - - } // internalColor() ---------------------------------------------------- - - - - public int getLayer(int id) - { - try { - return AIdHelper.trtLayerWheel(id); - } catch (AAtlantisException e) { - return 0; - } - //return(id & 0x01F00000) >> 20; before using IDHelper - } - - - - public int getSub(int id) - { - try { - return AIdHelper.trtBarrelEndcap(id); - } catch (AAtlantisException e) { - return 0; - } - //return(id & 0x06000000) >> 25; before using IDHelper - } - - - - protected void applyCuts() - { - cutIndex(); - cut("CutsInDet", "Threshold", " Threshold", threshold); - cutSimulatedTracks(); - cutReconstructedTracks(); - cutSegments(); - cutPhi(phi); - cutEta(); - - // cut noise - if(noise != null && parameterStore.get("CutsInDet", "Noise").getStatus()) - { - cutArray(noise, 0, "TRT Noise Cut"); - } - - // cut TimeOverThreshold - // method takes care that the cut is actually turned on - // or if the timeOverThreshold array is null (n/a in the event file) - cut("CutsInDet", "TRTTimeOverThreshold", - "TRTTimeOverThreshold", timeOverThreshold); - } - - - - private void keepBarrel() - { - int num = 0; - int cutSub = parameterStore.get("CutsInDet", "TRT").getI(); - for(int i = 0; i < numDraw; i++) - { - // sub values 1 and 2 - barrel - if(sub[listdl[i]] == 1 || sub[listdl[i]] == 2) - { - if(cutSub == -1 || sub[listdl[i]] == cutSub) - { - listdl[num++] = listdl[i]; - } - } - } - numDraw = num; - } - - - - private void keepEndcap() - { - int num = 0; - for(int i = 0; i < numDraw; i++) - { - // sub values 0 and 3 - endcaps - if(sub[listdl[i]] == 0 || sub[listdl[i]] == 3) - { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - - - private void cutEta() - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - if(!par.getStatus())return; - double etaCut = par.getD(); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double z1, z2, r1, r2; - if(sub[list] == 0 || sub[list] == 3) - { - // endcap - z1 = rhoz[list]; - z2 = rhoz[list]; - r1 = 64.; - if(Math.abs(rhoz[list]) > 280.) r1 = 48.; - r2 = 103.; - } - else - { - // barrel - z1 = 0.35; - if(rhoz[list] < 62) z1 = 40.; - z2 = 74.2; - if(sub[list] == 1) - { - z1 *= -1.; - z2 *= -1.; - } - r1 = rhoz[list]; - r2 = rhoz[list]; - } - double eta1 = AParameterUtilities.eta(z1, r1); - double eta2 = AParameterUtilities.eta(z2, r2); - double etaLower = Math.min(eta1, eta2); - double etaUpper = Math.max(eta1, eta2); - if(etaUpper > etaLowerCut && etaLower < etaUpperCut) - listdl[num++] = list; - } - numDraw = num; - } - - - // in XY only TRT barrel data are displayed - protected ACoord getYXUser() - { - makeDrawList(); - keepBarrel(); - double zoomScaling=0; - //check if zoomed in enough to display circles/drift sign arrows - Point2D.Double[] corners = ACanvas.getCanvas().getPaintingWindow().getUserCorners(); - double widthx=corners[1].x-corners[0].x; - double widthy=corners[0].y-corners[2].y; - //average width of window - double width=Math.sqrt(widthx*widthx+widthy*widthy); - //calculate scaling (100 is arbitrary constant) - zoomScaling=100/width; - //now return relevant user coords depending on the zoom - //(0.25 is arbitrary constant increase to turn on drawing - // circles and arrows at a more zoomed in state) - if(zoomScaling>0.25) - return getYXUserCircle(); - else - return getYXUserNormal(); - } - - - /** - * Will give coords for a line along the TRT drift - */ - private ACoord getYXUserNormal() - { - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double r = rhoz[list]; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double d = driftR[list]; - double x = r * cosPhi; - double y = r * sinPhi; - hv[0][0][i] = x + d * sinPhi; - hv[1][0][i] = y - d * cosPhi; - hv[0][1][i] = x - d * sinPhi; - hv[1][1][i] = y + d * cosPhi; - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - - /** - * Will give coords for the drift circle and arrow showing the drift - */ - private ACoord getYXUserCircle() - { - int numPoints = 48; - int[] index = new int[numDraw]; - double[][][] hv = new double[2][numDraw][]; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int ds = getDriftSign(list); - //adjust ds if z<0 - if(sub[list] == 1) - { - ds *= -1; - } - if(ds==1 || ds==-1) - { - //has drift sign so has extra points for arrow - hv[0][i] = new double[numPoints+3]; - hv[1][i] = new double[numPoints+3]; - } - else - { - hv[0][i] = new double[numPoints]; - hv[1][i] = new double[numPoints]; - ds=0; - } - double r = rhoz[list]; - double cosPhi = Math.cos(phi[list]); - double sinPhi = Math.sin(phi[list]); - double d = driftR[list]; - double x = r * cosPhi; - double y = r * sinPhi; - int jstart=0; - //calculate starting point of circle - if(ds==1 || ds ==-1) - { - jstart = (int) (phi[list]/(Math.PI * 2 / (numPoints - 1))); - d*=ds; - } - //store points of circle - int count=0; - for (int j = jstart; j < numPoints; j++) - { - hv[0][i][count] = x + d * Math.sin(Math.PI * 2 * j / (numPoints - 1)); - hv[1][i][count] = y - d * Math.cos(Math.PI * 2 * j / (numPoints - 1)); - count++; - } - for (int j = 0; j < jstart; j++) - { - hv[0][i][count] = x + d * Math.sin(Math.PI * 2 * (j+1) / (numPoints - 1)); - hv[1][i][count] = y - d * Math.cos(Math.PI * 2 * (j+1) / (numPoints - 1)); - count++; - } - index[i] = list; - //if has drift show arrow - if(ds==1 || ds==-1) - { - //first line - hv[0][i][numPoints] = hv[0][i][2*(numPoints-1)/5]; - hv[1][i][numPoints] = hv[1][i][2*(numPoints-1)/5]; - //back to end point of circle - hv[0][i][numPoints+1] = hv[0][i][numPoints-1]; - hv[1][i][numPoints+1] = hv[1][i][numPoints-1]; - //second line - hv[0][i][numPoints+2] = hv[0][i][3*(numPoints-1)/5]; - hv[1][i][numPoints+2] = hv[1][i][3*(numPoints-1)/5]; - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } - - - protected ACoord getRZUser() - { - // correction for primary vertex - if(!parameterStore.get("RZ", "TRT").getStatus())return ACoord.NO_DATA; - makeDrawList(); - // line size was found using findRZActiveArea(){ - // may need to be found again if geometry changes... - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - if(sub[list] == 0 || sub[list] == 3) - { - // endcap - hv[0][0][i] = rhoz[list]; - hv[0][1][i] = rhoz[list]; - double phiDiff = Math.abs(phi[list] - phiMid); - double r1 = 64.; - if(Math.abs(rhoz[list]) > 280.) r1 = 48.; - double r2 = 103.; - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - { - hv[1][0][i] = r1; - hv[1][1][i] = r2; - } - else - { - hv[1][0][i] = -r1; - hv[1][1][i] = -r2; - } - } - else - { - // barrel - double z1 = 0.35; - if(rhoz[list] < 62) z1 = 40.; - double z2 = 74.2; - if(sub[list] == 1) - { - z1 *= -1.; - z2 *= -1.; - } - hv[0][0][i] = z1; - hv[0][1][i] = z2; - double phiDiff = Math.abs(phi[list] - phiMid); - if(phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - { - hv[1][0][i] = rhoz[list]; - hv[1][1][i] = rhoz[list]; - } - else - { - hv[1][0][i] = -rhoz[list]; - hv[1][1][i] = -rhoz[list]; - } - } - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES); - } - - - protected ACoord getFRUser() - { - makeDrawList(); - keepBarrel(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - double[] pVtx = event.getPrimaryVertex(); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double r = rhoz[list]; - double p = phi[list]; - double x = r * Math.cos(p); - double y = r * Math.sin(p); - double dx = x - pVtx[0]; - double dy = y - pVtx[1]; - r = Math.sqrt(dx * dx + dy * dy); - p = Math.atan2(dy, dx); - if(p < 0.) p += AMath.TWO_PI; - double delPhi = driftR[list] / r; - hv[0][0][i] = r; - hv[1][0][i] = Math.toDegrees(p - delPhi); - hv[0][1][i] = r; - hv[1][1][i] = Math.toDegrees(p + delPhi); - index[i] = list; - } - return new ACoord(hv, index, this, ACoord.LINES).includePhiWrapAround("FR"); - } - - - - protected ACoord getFZUser() - { - makeDrawList(); - keepEndcap(); - double[][][] hv = new double[2][2][numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double z = rhoz[list]; - // average rho from findRZActiveArea() - double averageRho = 81.; - if(Math.abs(z) > 280.) - averageRho = 70.; - double p = phi[list]; - double delPhi = driftR[list] / averageRho; - hv[0][0][i] = z; - hv[1][0][i] = Math.toDegrees(p - delPhi); - hv[0][1][i] = z; - hv[1][1][i] = Math.toDegrees(p + delPhi); - index[i] = list; - } - return new ACoord(hv, index, this, - ACoord.LINES).includePhiWrapAround("FZ"); - } - - - public Action[] getActions(Collection nodes) - { - if(nodes.size() != 1) - return new Action[0]; - final DefaultMutableTreeNode node = (DefaultMutableTreeNode) (nodes. - iterator().next()); - AList[] list = AListManager.getInstance().getChildren(node); - if(list == null)return new Action[0]; - Set hits = new HashSet(); - for(int i = 0; i < list.length; ++i) - { - if(list[i].getSource() == this) - { - for(int j = 0; j < list[i].getItems().length; j++) - { - hits.add(new Integer(list[i].getItems()[j])); - } - } - else - { - return new Action[0]; - } - } - int numHits = hits.size(); - if(numHits < 2) - return new Action[0]; - final int[] h = new int[numHits]; - Iterator i = hits.iterator(); - int n = 0; - while(i.hasNext()) - { - h[n++] = ((Integer) (i.next())).intValue(); - } - Action[] action = new Action[1]; - action[0] = new AbstractAction("Find Eta") - { - public void actionPerformed(ActionEvent e) - { - final double MIN = 9999.; - final double MAX = -9999.; - double minRho = MIN; - double maxRho = MAX; - double minZ = MIN; - double maxZ = MAX; - for(int i = 0; i < h.length; ++i) - { - if(sub[h[i]] == 1 || sub[h[i]] == 2) - { - minRho = Math.min(minRho, rhoz[h[i]]); - maxRho = Math.max(maxRho, rhoz[h[i]]); - } - else - { - minZ = Math.min(minZ, rhoz[h[i]]); - maxZ = Math.max(maxZ, rhoz[h[i]]); - } - } - AOutput.append("Eta results:\n minRho = " + - String.format("%.3f",minRho) + - " maxRho = " + String.format("%.3f",maxRho) + "\n" + - " minZ = " + String.format("%.3f",minZ) + - " maxZ = " + String.format("%.3f",maxZ) + "\n", - ALogInterface.NORMAL); - } - }; - return action; - } - - - @Override - protected void finalizeConstruction() { - super.finalizeConstruction(); - Vector keys = (Vector) event.getCollections().get("InDetTrack"); - if(keys != null) - { - Iterator keysIterator = keys.iterator(); - //loop over collections - while(keysIterator.hasNext()) - { - String trackCollec = (String) keysIterator.next(); - AInDetTrackData data = (AInDetTrackData) (event.get("InDetTrack" + trackCollec)); - int[][] hits = event.getAssociationManager().get("InDetTrack" + trackCollec, getName()); - int[][] drifts = event.getAssociationManager().get("InDetTrack" + trackCollec + "Drift", getName()); - int[][] outliers = event.getAssociationManager().get("InDetTrack" + trackCollec + "Outlier", getName()); - - if(drifts!=null || outliers!=null) - { - int[] driftSignData = new int[numData]; - int[] isOutlierData = new int[numData]; - //set to noData to distinguish from a 0 returned if the data is present - for(int i=0; i<this.numData; i++) - { - driftSignData[i]=NO_DATA; - isOutlierData[i]=NO_DATA; - } - //loop over alll hits in track collection - for(int i=0; i<data.getNumData(); i++) - { - for(int j=0; j<hits[i].length; j++) - { - //check if current hit matches a TRT index - int list=getIndexFromId(hits[i][j]); - if(list!=-1) - { - //found match so save value if not null - if(drifts!=null) - driftSignData[list] = drifts[i][j]; - if(outliers!=null) - isOutlierData[list] = outliers[i][j]; - } - } - } - //if has data in file then save array of values - if(drifts!=null) - driftSign.put(trackCollec, driftSignData); - if(outliers!=null) - isOutlier.put(trackCollec, isOutlierData); - } - //no data for this collection in file so save null to vector - if(drifts==null) - driftSign.put(trackCollec, null); - if(outliers==null) - isOutlier.put(trackCollec, null); - } - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ATauJetData.java b/graphics/AtlantisJava/src/atlantis/data/ATauJetData.java deleted file mode 100755 index 91ebb9af7757..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATauJetData.java +++ /dev/null @@ -1,198 +0,0 @@ -package atlantis.data; - -import java.util.Vector; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; -import atlantis.utils.A4Vector; - -/** - * Reconstructed Tau Jet - */ -public class ATauJetData extends AAODData -{ - // Note: This is a hierarchy list ! I.e. TauCutTight is assumed to have passed - // all other criteria as well. This is strictly not completely correct but - // good enough for Atlantis purposes. - private enum isTau { TauCutTight, TauCutMedium, TauCutLoose, TauLlhTight, TauLlhMedium, TauLlhLoose, none } - - private float[] charge; - private int[] integerCharge; - private int[] numTracks; - private float[] isolFrac; - private float[] logLhRatio; - private String[] label; - private Vector<Enum> isTauEnum = new Vector<Enum>(); - - ATauJetData(AHashMap p, AEvent e) - { - super(p,e); - charge=p.getFloatArray("charge"); - integerCharge = new int[charge.length]; - - // The recommended default cut for Tau charge is to equal to 1/-1, - // but the cut for float value has no "=" operator in the - // implementation, so change float[] to int[] to make it possible - // to use "=". - for(int i=0; i<charge.length; ++i) - { - integerCharge[i] = (int) charge[i]; - } - numTracks=p.getUnknownIntArray("numTracks"); - isolFrac=p.getUnsureFloatArray("isolFrac"); - logLhRatio=p.getUnsureFloatArray("logLhRatio"); - label=p.getUnsureStringArray("label"); - String[] isTauString=p.getUnsureStringArray("isTauString"); - - if(isTauString!=null){ - for(String s : isTauString) - { - try { - isTauEnum.add(isTau.valueOf(s)); - } - catch(IllegalArgumentException q) { - isTauEnum.add(isTau.none); - } - } - } - else - { - for(int i=0;i<numData;i++) - { - isTauEnum.add(isTau.none); - } - } - } - - public String getParameterGroup() - { - return "TauJet"; - } - - public String getName() - { - return "TauJet"; - } - - public float getCharge(int index) - { - return charge[index]; - } - - public int getNumTracks(int index) - { - return numTracks[index]; - } - - public float getIsolFrac(int index) - { - if(isolFrac != null) return isolFrac[index]; - else return -100; - } - - public float getLogLhRatio(int index) - { - if(logLhRatio != null) return logLhRatio[index]; - else return -100; - } - - public String getisTau(int index) - { - return isTauEnum.get(index).toString(); - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) - { - int k = list[i]; - A4Vector start = new A4Vector(); - start.setPtEtaPhiM(pT[k],eta[k],phi[k],1.77682); - sum.add(start); - } - - return sum; - } - - protected void applyCuts() - { - super.applyCuts(); - cut("CutsObjects", "TauJetPt", " |ET|", pT); - cut("CutsObjects", "TauJetCharge", " |Charge|", integerCharge); - cut("CutsObjects", "TauJetNumTracks", " |NumTracks|", numTracks); - if(isolFrac != null) - cut("CutsObjects", "TauJetisolFrac", " isolFrac", isolFrac); - if(logLhRatio != null) - cut("CutsObjects", "TauJetlogLhRatio", " logLhRatio", logLhRatio); - - if (parameterStore.get("CutsObjects", "TauJetisTauString").getStatus()) - { - int cutSub = parameterStore.get("CutsObjects", "TauJetisTauString").getI(); - cutArrayEnum(isTauEnum, cutSub, "TauJet isTauString"); - } - } - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0){ - String output = getNameScreenName()+" index: " + index; - if(simpleOutput==1 || simpleOutput==3) - output+= "\n PT="+String.format("%.3f",pT[index])+" GeV\n "+ - AMath.ETA+" = "+String.format("%.3f",eta[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - if(simpleOutput==2 || simpleOutput==3) - output+= "\n Px="+String.format("%.3f",pT[index]*Math.cos(phi[index]))+" GeV "+ - "\n Py="+String.format("%.3f",pT[index]*Math.sin(phi[index]))+" GeV "+ - "\n Pz="+String.format("%.3f",pT[index]*Math.sinh(eta[index]))+" GeV "; - return output; - } - - String k = this.getStoreGateKey(); - String sgKey = k != null ? k : "n/a"; - StringBuffer msg = new StringBuffer(getNameScreenName()); - msg.append(" (id: " + id[index] + " index: " + index + ")"); - msg.append("\n storegate key: "); - msg.append(sgKey); - msg.append("\n PT = "); - msg.append(String.format("%.3f",pT[index])); - msg.append(" GeV\n P = "); - msg.append(String.format("%.3f",Math.abs(pT[index]/Math.cos(AMath.lambda(eta[index]))))); - msg.append(" GeV\n Charge = "); - msg.append(integerCharge[index]); - msg.append("\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.3f",eta[index])); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.3f",Math.toDegrees(phi[index]))); - msg.append(AMath.DEGREES); - msg.append(" (" + String.format("%.3f",phi[index]) + " rad)"); - msg.append("\n numTracks = "); - msg.append(numTracks[index]); - - if (label != null) - { - msg.append("\n label = "); - msg.append(label[index]); - } - if (isolFrac != null) - { - msg.append("\n isolFrac = "); - msg.append(isolFrac[index]); - } - if (logLhRatio != null) - { - msg.append("\n logLhRatio = "); - msg.append(logLhRatio[index]); - } - - return msg.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ATrackData.java b/graphics/AtlantisJava/src/atlantis/data/ATrackData.java deleted file mode 100644 index bc680fdd7b15..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATrackData.java +++ /dev/null @@ -1,1389 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.canvas.ACanvas; -import atlantis.utils.AMath; -import atlantis.utils.AHashMap; -import atlantis.utils.AAtlantisException; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameterUtilities; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.projection.AProjectionXZ; -import atlantis.graphics.AGraphics; -import atlantis.canvas.AWindow; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjection3D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjectionPhi; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.A4Vector; -import atlantis.utils.ALogger; - -/** - * - * base class for ASTrData - Simulated Track - * AInDetTrackData - Reconstructed Inner Detector Track - * AMuonTrackData - Reconstructed Muon Detector Track - * - */ -public abstract class ATrackData extends AData -{ - private static final ALogger logger = ALogger.getLogger(ATrackData.class); - - public static final int DRAW_HELIX = 0; - public static final int DRAW_POLYLINE = 1; - public static final int DRAW_SMOOTH = 2; - public static final int DRAW_NEWHELIX = 3; - public static final int ADD_HELIX_POINTS = 0; - - /** True if track residual is available */ - private boolean hasResidual = false; - - protected ATrackResidualData[] residuals = null; - - /** True if reconstructed track event data contains polyline information */ - protected boolean polylinedTrack = false; - - // these attributes are used to store polyline coordinates of tracks - protected float x[][] = null; - protected float y[][] = null; - protected float z[][] = null; - protected float rho[][] = null; - protected float phi[][] = null; - - protected int numHelix[] = null; - protected boolean cosmic[] = null; - - protected AHelix[] h = null; - - /** - * rhoVertex value - for STr provided in the event file, for reconstructed - * track (Track) it is calculated from first polyline coordinates. - * This value is tested in cutRhoVertexAfterInDetRadius() method. - */ - protected float[] rhoVertex = null; - - protected int[] index = null; - - protected float chi2[] = null; - protected int numDoF[] = null; - private int[] vertexType = null; - - // methods -------------------------------------------------------------- - - ATrackData(AHashMap p, AEvent e) throws AAtlantisException - { - super(p,e); - - String assocKey = getName() + getStoreGateKey(); - if (p.get("barcode") != null) - { - int[] barcode = p.getUnknownIntArray("barcode"); - AAssociation assoc = new AAssociation(assocKey, "STr", null, barcode, event); - event.getAssociationManager().add(assoc); - } - //Get vertex type numbers - vertexType = p.getUnsureIntArray("vertexType"); - // if residual information is provided, second check is a workaround for a JiveXML bug -- EJ - if(p.get("numTsos")!=null && p.get("tsosPullLoc1")!=null) - { - hasResidual = true; - residuals = new ATrackResidualData[numData]; - int[] numTsos = p.getIntArray("numTsos"); - float[] tsosPullLoc1 = p.getFloatArray("tsosPullLoc1"); - float[] tsosResLoc1 = p.getFloatArray("tsosResLoc1"); - float[] tsosPullLoc2 = p.getFloatArray("tsosPullLoc2"); - float[] tsosResLoc2 = p.getFloatArray("tsosResLoc2"); - String[] tsosDetType = p.getUnsureStringArray("tsosDetType"); - - int num = 0; - for(int i=0; i<numData; i++) - { - int numPoints = numTsos[i]; - float[] pullLoc1 = new float[numPoints]; - float[] resLoc1 = new float[numPoints]; - float[] pullLoc2 = new float[numPoints]; - float[] resLoc2 = new float[numPoints]; - String[] detType = null; - if(tsosDetType != null) - detType = new String[numPoints]; - - for(int j=0; j<numPoints; j++) - { - pullLoc1[j] = tsosPullLoc1[num]; - resLoc1[j] = tsosResLoc1[num]; - pullLoc2[j] = tsosPullLoc2[num]; - resLoc2[j] = tsosResLoc2[num]; - if(tsosDetType != null) - detType[j] = tsosDetType[num]; - num++; - } - residuals[i] = new ATrackResidualData(this, i, numPoints, pullLoc1, - resLoc1, pullLoc2, resLoc2, detType); - } - } - - // helix may come in different formats: - // * helix track from reconstructed track ? - if (p.get("d0") != null) - { - h = new AHelix[numData]; - - float[] d0 = p.getFloatArray("d0"); - float[] phi0 = p.getFloatArray("phi0"); - float[] tl = p.getFloatArray("cotTheta"); - float[] pt = p.getFloatArray("pt"); - float[] z0 = p.getFloatArray("z0"); - - // this patch is useful when reading old event files generated by - // some older version of JiveXML, in which cotTheta is set to inf by - // error when eta equals to 0 for IDScan Tracks - if ("TrigInDetTrack".equals((String) p.get("storeGateKey"))) - { - for(int i = 0; i < tl.length; i++) - { - if(Float.isInfinite(tl[i])) - tl[i] = 0.0f; - } - } // end of the patch - - // 2005-11-16 - numbers in event file in covMatrix too small, a lot - // of them were 0.00000 hence multiplied by 10000 in JiveXML and - // divided here by 10000. only Vertex fitter affected, didn't work - // before anyway, so numbers are divided for all events - if (p.get("covMatrix") != null) - { - float[][][] cov = new float[numData][5][5]; - float[] covMatrix = p.getFloatArray("covMatrix"); - // dividing numbers - for (int i = 0; i < covMatrix.length; i++) - { - covMatrix[i] = covMatrix[i] / 10000; - } - - int n = 0; - for (int i = 0; i < numData; i++) - { - for (int j = 0; j < 5; j++) - { - for (int k = 0; k < j + 1; k++) - { - cov[i][j][k] = covMatrix[n++]; - cov[i][k][j] = cov[i][j][k]; - } - } - - h[i] = new AHelix(d0[i], z0[i], (float) Math.toDegrees(phi0[i]), tl[i], pt[i], cov[i]); - } - } - else - { - for (int i = 0; i < numData; i++) { - h[i] = new AHelix(d0[i], z0[i], (float) Math.toDegrees(phi0[i]), tl[i], pt[i]); - } - } - } - // * helix track from simulated charged tracks ? - else if (p.get("rhoVertex") != null) - { - h = new AHelix[numData]; - - // STr - save rhoVertex value for tests - rhoVertex = p.getFloatArray("rhoVertex"); - float[] rhoEndVertex = p.getFloatArray("rhoEndVertex"); - float[] pt = p.getFloatArray("pt"); - float[] phi = p.getFloatArray("phi"); - float[] eta = p.getFloatArray("eta"); - float[] phiVertex = p.getFloatArray("phiVertex"); - float[] zVertex = p.getFloatArray("zVertex"); - // charge is calculated in ASTrData, based on code subtag - // information and pdg.xml data - int[] charge = p.getIntArray("charge"); - for (int i = 0; i < numData; i++) - { - //Create helix w/ end vertex information if rhoEndVertex is set - if ( rhoEndVertex[i] != 0.0 ) - h[i] = new AHelix(rhoVertex[i], phiVertex[i], zVertex[i], pt[i], - (float)Math.toDegrees(phi[i]), eta[i], charge[i], rhoEndVertex[i]); - //Otherwise create helix w/o end vertex information - else - h[i] = new AHelix(rhoVertex[i], phiVertex[i], zVertex[i], pt[i], - (float)Math.toDegrees(phi[i]), eta[i], charge[i] ); - } - } - - // if polyline information is provided for tracks - if(p.get("numPolyline") != null) - { - int[] numPolyline = p.getIntArray("numPolyline"); - - boolean hasPolyline = false; - for (int i=0; i<numData; i++) { - if (numPolyline[i] > 0) { - hasPolyline = true; - break; - } - } - - if (hasPolyline) { - polylinedTrack = true; - x = new float[numData][]; - y = new float[numData][]; - z = new float[numData][]; - rho = new float[numData][]; - phi = new float[numData][]; - rhoVertex = new float[numData]; - numHelix = new int[numData]; - cosmic = new boolean[numData]; - - float[] polyX = p.getFloatArray("polylineX"); - float[] polyY = p.getFloatArray("polylineY"); - float[] polyZ = p.getFloatArray("polylineZ"); - int num = 0; - - for(int i = 0; i < numData; ++i) - { - numHelix[i] = 0; - cosmic[i] = false; - - // Do some checks on the track, decide what drawing we enable/disable for it. - if (numPolyline[i] >= 2) { - int first = num; - int next = num+1; - - // Find the next different point on the track. - while (next < numPolyline[i]-1 && polyX[next]==polyX[first] && polyY[next]==polyY[first]) next++; - - // Determine what direction the track has in rho and z. - float rStart = (float)Math.sqrt(polyX[first]*polyX[first] + polyY[first]*polyY[first]); - float rDir = (float)Math.sqrt(polyX[next]*polyX[next] + polyY[next]*polyY[next]) - rStart; - float zDir = Math.abs(polyZ[next]) - Math.abs(polyZ[first]); - - // Now in order to extrapolate to the IP we the track to: - // - go radially outwards - // - go away from the IP in z - // - have perigee parameters - // - have its first polyline point some distance from the perigee - // - be an InDetTrack - if (rDir > 0 && zDir > 0 && h != null && h[i] != null && rStart-Math.abs(h[i].d0()) > 1 - && this instanceof AInDetTrackData) { - numHelix[i] = ADD_HELIX_POINTS; - } - - // Check if this is perhaps a cosmic. Cosmics are allowed - // to be drawn on both sides in the rho-z projection - if (rDir < 0) { - cosmic[i] = true; - } - } else if (h != null && h[i] != null && this instanceof AInDetTrackData) { - - // In case of a track with only perigee parameters, draw it also as a helix. - numHelix[i] = ADD_HELIX_POINTS; - } - - x[i] = new float[numPolyline[i]+numHelix[i]]; - y[i] = new float[numPolyline[i]+numHelix[i]]; - z[i] = new float[numPolyline[i]+numHelix[i]]; - rho[i] = new float[numPolyline[i]+numHelix[i]]; - phi[i] = new float[numPolyline[i]+numHelix[i]]; - - for(int j = 0; j < numPolyline[i]; ++j) - { - x[i][j+numHelix[i]] = polyX[num]; - y[i][j+numHelix[i]] = polyY[num]; - z[i][j+numHelix[i]] = polyZ[num]; - rho[i][j+numHelix[i]] = (float)Math.sqrt(polyX[num]*polyX[num]+polyY[num]*polyY[num]); - num++; - - if(j == 0) - { - // first coordinate of a track - calculate rhoVertex - rhoVertex[i] = (float) Math.sqrt( x[i][numHelix[i]] * x[i][numHelix[i]] + - y[i][numHelix[i]] * y[i][numHelix[i]] ); - } - } - - if (h != null && h[i] != null) { - h[i].setPoints(x[i], y[i], z[i], numPolyline[i]); - } - - // When perigee parameters are available we extend the track all the way down to the IP - if (numHelix[i] > 0) { - // Radius of curvature of this track in the magnetic field - double R = parameterStore.get("Event", "Curvature").getD() * Math.abs(h[i].pT()); - - // +1/-1 for a clockwise/anti-clockwise helix - double S = AMath.getSign(h[i].pT()); - - // Coordinates of the center point for the helix - double xC = (S * h[i].d0() - R) * Math.cos(Math.toRadians(h[i].phi0()) + S * Math.PI / 2.); - double yC = (S * h[i].d0() - R) * Math.sin(Math.toRadians(h[i].phi0()) + S * Math.PI / 2.); - - // Determine to what radius we have to draw this track based on its - // perigee parameters. When space points are available for the track - // we stop before the first space point and make a smooth connection. - // If no space points are available we draw all the way through the - // inner detector. Not any further though, because the track will stop - // curving when it leaves the magnetic field. - double Rmax; - if (numPolyline[i] > 0) { - Rmax = Math.min(parameterStore.get("RTr", "RadiusTr").getD(), - Math.abs(Math.sqrt(x[i][numHelix[i]]*x[i][numHelix[i]] - + y[i][numHelix[i]]*y[i][numHelix[i]]) - 1)); - } else { - Rmax = parameterStore.get("RTr", "RadiusTr").getD(); - } - - // Calculate the phi value at which our helix intersects the maximum - // radius determined above. We have one circle (detector) centered at - // the origin with radius Rmax. The other circle (helix) we imagine to - // be at x=d with a radius R. Now we can easily calculate the coordinates - // (xI,+/-yI) of the intersection points. The curving direction of the - // helix determines which value of yI we have to use. Finally, the phiMax - // we're interested in is the polar angle with respect to the center of the - // helix at x=d. Calculation is straightforward. By adding phi0+S*PI/2 - // (as we do below) this solution is also valid for helices centered - // around y!=0. - double d = Math.sqrt(xC * xC + yC * yC); - double xI = (Rmax * Rmax - R * R + d * d) / (2 * d); - double yI = Math.sqrt(Rmax * Rmax - xI * xI); - double phiMax = Math.atan2(S * yI, d - xI); - - // This spreads the number of helix points evenly across the part of the - // helix we're going to draw - double dphi = phiMax / numHelix[i]; - - for (int j=0; j<numHelix[i]; j++) { - // Points on the helix in user coordinates - x[i][j] = (float) (xC + R * Math.cos(Math.toRadians(h[i].phi0()) + S * Math.PI/2. - j * dphi)); - y[i][j] = (float) (yC + R * Math.sin(Math.toRadians(h[i].phi0()) + S * Math.PI/2. - j * dphi)); - - // In R-Z the track is just a straight line - rho[i][j] = (float) Math.sqrt(x[i][j]*x[i][j] + y[i][j]*y[i][j]); - z[i][j] = (float) (h[i].z0() + h[i].cotanTheta() * (rho[i][j] - h[i].d0())); - } - } - - for (int j=0; j<numPolyline[i]+numHelix[i]; j++) { - phi[i][j] = (float)Math.atan2(y[i][j], x[i][j]); - - if (j>0 && Math.abs(phi[i][j-1]-phi[i][j]) > Math.PI) { - - // Don't let phi wrap around - if (phi[i][j] > phi[i][j-1]) { - phi[i][j] -= 2*Math.PI; - } else { - phi[i][j] += 2*Math.PI; - } - } - } - } - } - } // if(p.get("numPolyline") - - if (h != null) - { - double[] phi = new double[numData]; - for (int i = 0; i < numData; i++) - phi[i] = h[i].phi0(); - index = indexBy(phi); - } - else if(x != null && y != null) - { - double[] phi = new double[numData]; - for(int i = 0; i < numData; i++) - { - // if number of polylines for a track is 0 - Atlantis used - // to crash here with IndexOutOfBoundException - // check to avoid crashes with old events, from some point - // JiveXML doesn't output tracks with number of polylines - // coordinates less then 2 - if(x[i].length > 0 && y[i].length > 0) - { - phi[i] = Math.toDegrees(Math.atan2(y[i][0], x[i][0])); - } - else - { - String m = getName() + ":" + getStoreGateKey() + - " datatype rejected\n" + - "(no polyline coordinates)."; - throw new AAtlantisException(m, false); // non fatal - } - } - index = indexBy(phi); - } - - if (p.get("chi2") != null) chi2 = p.getFloatArray("chi2"); - if (p.get("numDoF") != null) numDoF = p.getIntArray("numDoF"); - } // ATrackData() ------------------------------------------------------- - - - public float[][] getX() - { - return x; - } - - public float[][] getY() - { - return y; - } - - public float[][] getZ() - { - return z; - } - - public float[][] getRho() - { - return rho; - } - - public float[][] getPhi() - { - return phi; - } - - public boolean getResidualStatus() - { - return hasResidual; - } - - public ATrackResidualData getTrackResidual(int index) - { - return residuals[index]; - } - - // moved from the former iPatData class where it was without the condition - protected void calculateRhoPhi() - { - if(!polylinedTrack) { - super.calculateRhoPhi(); - } - } // calculateRhoPhi() -------------------------------------------------- - - - - protected void applyCuts() - { - cutIndex(); - if (h != null) - { - cut("CutsInDet", "z0-zVtx", " |z0-zVtx|", getZ0Primary()); - cut("CutsInDet", "z0", " |z0|", getZ0()); - cut("CutsInDet", "Pt", " |Pt|", getPt()); - cut("CutsInDet", "d0", " |d0|", getD0()); - cut("CutsInDet", "d0Loose", " |d0Loose|", getD0()); - } - cutPhi(); - cutEta(); - cutNextInDrawList(); - cutReconstructedVertex(); - } // applyCuts() -------------------------------------------------------- - - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+ - ((h!=null)?h[index].toString():""); - - - String msg = getNameScreenName() + " (id: " + id[index] + " index: " + index + ")"; - msg += "\n storegate key: "; - msg += (storeGateKey == null ? "n/a" : storeGateKey); - if (h != null) - msg += h[index].toString(); - if (chi2 != null && numDoF != null) - msg += "\n chi2/numDoF = " + chi2[index]/numDoF[index]; - return msg; - - } // getHitInfo() ------------------------------------------------------- - - - // all get**User() methods which are only called when tracks are drawn - // as polylines - protected ACoord getYXUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = x[list].length; - hv[0][i] = new double[numPoints]; - hv[1][i] = new double[numPoints]; - for(int j = 0; j < numPoints; j++) - { - hv[0][i][j] = x[list][j]; - hv[1][i][j] = y[list][j]; - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - else - return new ACoord(hv, index, this, ACoord.POLYLINES); - - } // getYXUser() -------------------------------------------------------- - - - - protected ACoord getFRUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = x[list].length; - int skip = 0; - - // Skip points with very small R, phi changes rapidly here - for (skip=0; skip<numPoints; skip++) - if (rho[list][skip] > 2.) break; - - hv[0][i] = new double[numPoints-skip]; - hv[1][i] = new double[numPoints-skip]; - - double phiStart = 0.; - if(numPoints > 0) phiStart = phi[list][0]; - for(int j = skip; j < numPoints; j++) - { - double phiTemp = phi[list][j]; - if(phiTemp - phiStart > Math.PI) phiTemp -= AMath.TWO_PI; - if(phiTemp - phiStart < -Math.PI) phiTemp += AMath.TWO_PI; - - hv[0][i][j-skip] = rho[list][j]; - hv[1][i][j-skip] = Math.toDegrees(phiTemp); - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES).includePhiWrapAround("FR"); - else - return new ACoord(hv, index, this, ACoord.POLYLINES).includePhiWrapAround("FR"); - - } // getFRUser() -------------------------------------------------------- - - - - protected ACoord getFZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = x[list].length; - int skip = 0; - - // Skip points with very small R, phi changes rapidly here - for (skip=0; skip<numPoints; skip++) - if (rho[list][skip] > 2.) break; - - hv[0][i] = new double[numPoints-skip]; - hv[1][i] = new double[numPoints-skip]; - // treat phi wraparound - double phiStart = 0.; - if(numPoints > 0) phiStart = phi[list][0]; - for(int j = skip; j < numPoints; j++) - { - hv[0][i][j-skip] = z[list][j]; - double phiTemp = phi[list][j]; - if(phiTemp - phiStart > Math.PI) phiTemp -= AMath.TWO_PI; - if(phiTemp - phiStart < -Math.PI) phiTemp += AMath.TWO_PI; - hv[1][i][j-skip] = Math.toDegrees(phiTemp); - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES).includePhiWrapAround("FZ"); - else - return new ACoord(hv, index, this, ACoord.POLYLINES).includePhiWrapAround("FZ"); - - } // getFZUser() -------------------------------------------------------- - - - - protected ACoord getRZUser() - { - // not quite correct need to split tracks crossing phi boundary - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = rho[list].length; - hv[0][i] = new double[numPoints]; - hv[1][i] = new double[numPoints]; - - if (numPoints > 0) { - int sign = AParameterUtilities.getRhoSign(x[list][numPoints-1], y[list][numPoints-1]); - for(int j = 0; j < numPoints; j++) - { - if (cosmic != null && cosmic[i]) { - sign = AParameterUtilities.getRhoSign(x[list][j], y[list][j]); - } - hv[0][i][j] = z[list][j]; - hv[1][i][j] = rho[list][j] * sign; - } - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - else - return new ACoord(hv, index, this, ACoord.POLYLINES); - - } // getRZUser() -------------------------------------------------------- - - - - protected ACoord getXZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = rho[list].length; - hv[0][i] = new double[numPoints]; - hv[1][i] = new double[numPoints]; - for(int j = 0; j < numPoints; j++) - { - hv[0][i][j] = z[list][j]; - hv[1][i][j] = rho[list][j] * Math.cos(phi[list][j] - phi0); - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - else - return new ACoord(hv, index, this, ACoord.POLYLINES); - - } // getXZUser() -------------------------------------------------------- - - protected ACoord getYZUser() - { - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - double phi0 = Math.toRadians(AProjectionXZ.getPhi()); - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - int numPoints = rho[list].length; - hv[0][i] = new double[numPoints]; - hv[1][i] = new double[numPoints]; - for(int j = 0; j < numPoints; j++) - { - hv[0][i][j] = z[list][j]; - hv[1][i][j] = rho[list][j] * Math.sin(phi[list][j] - phi0); - } - index[i] = list; - } - - if (parameterStore.get(PARAMETER_GROUP, "DrawnAs").getI() == DRAW_SMOOTH) - return new ACoord(hv, index, this, ACoord.SMOOTH_POLYLINES); - else - return new ACoord(hv, index, this, ACoord.POLYLINES); - - } // getYZUser() -------------------------------------------------------- - - - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(h != null && (projection instanceof AProjectionVP || projection instanceof AProjection3D)) - { - // in VPlot only helices are drawn, so try to draw tracks as helices - // in VPlot by default ignoring Track->DrawAs option for VPlot - drawHelix(window, ag, projection); - } - else - { - AParameter drawPar = parameterStore.get(PARAMETER_GROUP, "DrawnAs"); - int drawnAs = drawPar != null ? drawPar.getI() : DRAW_HELIX; - if (polylinedTrack && (h == null || drawnAs == DRAW_POLYLINE || drawnAs == DRAW_SMOOTH)) - { - // draw as polyline - ag.draw(window.calculateDisplay(getUser(projection))); - } - else if (h != null) - { - // draw as helix - drawHelix(window, ag, projection); - } - } - - } // draw() ------------------------------------------------------------- - - protected void cutRhoVertexAfterInDetRadius() - { - int num = 0; - int wrong = 0; - int list = 0; - double rho = 108; // 1.08m - double parRhoTr = parameterStore.get("RTr", "RadiusTr").getD(); - for(int i = 0; i < numDraw; i++) - { - list = listdl[i]; - if(this.rhoVertex[list] > Math.min(rho, parRhoTr)) - { - wrong++; - } - else - { - // include into drawlist - listdl[num++] = list; - } - } - - if(wrong > 0) - { - logger.debug("AHelix.cutRhoVertexAfterInDetRadius()"); - String key = this.getStoreGateKey(); - key = key != null ? ":" + key : ""; - logger.debug(" " + numDraw + " " + this.getName() + key + - " before test, " + wrong + " removed\n"); - } - numDraw = num; - } // cutRhoVertexAfterInDetRadius() ------------------------------------- - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - switch (colorFunction) - { - case 0: - colorByConstant(); - break; - case 1: - colorByIndex(index); - break; - case 2: - colorBy(getPt()); - break; - case 3: - colorByCollection(); - break; - case 4: - colorBy("STr"); - break; - case 5: - colorBy(getRVx()); - break; - case 6: - colorBy(getJets()); - break; - case 7: // by objects - colorByObjects(); - break; - } - - return 7; - } - - public int[] getDrawList() - { - int[] temp = new int[numDraw]; - System.arraycopy(listdl, 0, temp, 0, numDraw); - return temp; - } - - protected void cutNextInDrawList() - { - AParameter nextTrkPar = parameterStore.get(PARAMETER_GROUP, "NextTrack"); - if(!nextTrkPar.getStatus()) - { - return; - } - if(numDraw == 0) - { - return; - } - - int nextTrk = nextTrkPar.getI() % numData; - int nextTrkIndex = nextTrk; - boolean hasFound = false; - while (!hasFound) - { - for (int i=0; i<numDraw; ++i) - { - if(listdl[i] == nextTrk) - { - nextTrkIndex = nextTrk; - hasFound = true; - } - } - if(!hasFound) - nextTrk = (nextTrk + 1) % numData; - } - nextTrkPar.setI(nextTrkIndex); - numDraw = 1; - listdl[0] = nextTrkIndex; - } - - protected void cutPhi() - { - AParameter par = parameterStore.get("CutsATLAS", "CutPhi"); - boolean usePhiCut = par.getStatus(); - - if (usePhiCut) - { - // use degrees for tracks - double phiCut = par.getD(); - double phiMid = AMath.nearestPhiDegrees(parameterStore.get("CutsATLAS", "PhiMiddle").getD()); - // use vplot as projection - AProjection2D projection = (AProjection2D) AProjectionsManager.getProjection("VP"); - - int num = 0; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - ADHelix dH = new ADHelix(h[list]); - double s1 = dH.getAStart(); - double s2 = dH.getAEnd(); - s1 = dH.intersectWithRadialCylinder(projection.getMinRho(), s1, s2); - double sEnd = dH.intersectWithCylinder(true, AProjectionVP.getRhoVPlot(), true, AProjectionVP.getZVPlot()); - s2 = Math.max(Math.min(s2, sEnd), s1); - - double phiDiffStart = Math.abs(AMath.nearestPhiDegrees(dH.getPhi(s1), phiMid) - phiMid); - double phiDiffEnd = Math.abs(AMath.nearestPhiDegrees(dH.getPhi(s2), phiMid) - phiMid); - double phiDiffMiddle = Math.abs(AMath.nearestPhiDegrees(dH.getPhi((s1 + s2) / 2), phiMid) - phiMid); - // treats wrap around - int numPointsInside = 0; - - if (phiDiffStart < phiCut) - numPointsInside++; - if (phiDiffMiddle < phiCut) - numPointsInside++; - if (phiDiffEnd < phiCut) - numPointsInside++; - if (numPointsInside > 1) - listdl[num++] = list; - } - numDraw = num; - } - } - - /** - * Cut tracks if connected/unconnected to reconstructed vertices. - */ - protected void cutReconstructedVertex() - { - int cutOption = parameterStore.get("CutsObjects", "RTrsByRVtx").getI(); - cutByAssociationTo( "RVx", getReconstructedTracks(), cutOption); - } - - - protected void cutEta() - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - - if (par.getStatus()) - { - // use vplot as projection - AProjection2D projection = (AProjection2D) AProjectionsManager.getProjection("VP"); - - double etaCut = par.getD(); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaC1 = etaMid - etaCut; - double etaC2 = etaMid + etaCut; - int num = 0; - for (int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - ADHelix dH = new ADHelix(h[list]); - double s1 = dH.getAStart(); - double s2 = dH.getAEnd(); - s1 = dH.intersectWithRadialCylinder(projection.getMinRho(), s1, s2); - double sEnd = dH.intersectWithCylinder(true, AProjectionVP.getRhoVPlot(), true, AProjectionVP.getZVPlot()); - s2 = Math.max(Math.min(s2, sEnd), s1); - double[] etaPoints = new double[] { dH.getEta(s1), dH.getEta((s1 + s2) / 2), dH.getEta(s2) }; - - int numPointsInside = 0; - for (int j = 0; j < etaPoints.length; ++j) - if (etaC1 < etaPoints[j] && etaPoints[j] < etaC2) - numPointsInside++; - if (numPointsInside > 1) - listdl[num++] = list; - } - numDraw = num; - } - } - - // does not work correctly if primary vertex is displaced in YX plane - private float[] getZ0Primary() - { - double[] pVtx = event.getPrimaryVertex(); - float[] temp = new float[numData]; - double zVertex = pVtx[2]; - for (int i = 0; i < numDraw; i++) - temp[listdl[i]] = (float) (h[listdl[i]].z0() - zVertex); - return temp; - } - - private float[] getZ0() - { - float[] temp = new float[numData]; - for (int i = 0; i < numDraw; i++) - temp[listdl[i]] = (float) h[listdl[i]].z0(); - return temp; - } - - protected float[] getPt() - { - float[] temp = new float[numData]; - for (int i = 0; i < numDraw; i++) - temp[listdl[i]] = (float) h[listdl[i]].pT(); - return temp; - } - - - // d0 is calculated w.r.t. to XY position of the primary vertex - private float[] getD0() - { - double[] pVtx = event.getPrimaryVertex(); - float[] temp = new float[numData]; - for (int i = 0; i < numDraw; i++) - { - double phi0 = Math.toRadians(h[listdl[i]].phi0()); - - temp[listdl[i]] = (float) (-h[listdl[i]].d0() + pVtx[1] * Math.cos(phi0) - pVtx[0] * Math.sin(phi0)); - - } - return temp; - } - - - // give back Drawable helices - public ADHelix[] getHelices() - { - makeDrawList(); - ADHelix[] tempList = new ADHelix[numDraw]; - - for (int i = 0; i < numDraw; i++) - if (h != null && h[listdl[i]] != null) - { - tempList[i] = new ADHelix(h[listdl[i]]); - if (tempList[i].getAStart() == tempList[i].getAEnd()) - { - tempList[i] = null; - } - } - else - tempList[i] = null; - return tempList; - } - - // used by vertex package when changing the position on the helix from which - // to start drawing - public AHelix getModifiableHelix(int i) - { - if (h != null) - return h[i]; - else - return null; - } - - // info on tracks contained in vplot rubberband - public String getVPHitInfo() - { - makeDrawList(); - if (numDraw == 0) - return ""; - double sumP = 0.; - double sumPt = 0.; - - for (int i = 0; i < numDraw; ++i) - { - sumPt += Math.abs(h[listdl[i]].pT()); - sumP += AMath.getPFromPttL(h[listdl[i]].pT(), h[listdl[i]].cotanTheta()); - } - - String msg = numDraw + " " + getFullName(); - msg += " sum(PT) = " + String.format("%.1f",sumPt) + " sum(P) = " + String.format("%.1f",sumP); - return msg; - } - - public A4Vector get4Vector(int num, int[] list) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) { - if (h == null || h[list[i]] == null) continue; - // Use the pion mass (~140 MeV) here - sum.add(new A4Vector(h[list[i]].p(), 0.14)); - } - return sum; - } - - public A4Vector get4Vector(int num, int[] list, double mass) - { - A4Vector sum = new A4Vector(); - for (int i = 0; i < num; ++i) { - if (h == null || h[list[i]] == null) continue; - sum.add(new A4Vector(h[list[i]].p(), mass)); - - - } - return sum; - } - - public void zoomAroundTracks() - { - AWindow window = ACanvas.getCanvas().getCurrentWindow(); - AProjection projection = window.getProjection(); - if (projection instanceof AProjectionLegoPlot) - { - AOutput.append("Zoom Next Track unavailable for LegoPlot\n", ALogInterface.NORMAL); - } - else if (projection instanceof AProjection2D) - { - ACoord user; - if (projection instanceof AProjectionVP) - user = window.calculateUser(getVPDisplayHelices(window, (AProjection2D) projection)); - else if (polylinedTrack) - user = getUser((AProjection2D) projection); - else - user = window.calculateUser(getDisplayHelices(window, (AProjection2D) projection)); - double[] min = new double[2]; - double[] max = new double[2]; - min[0] = min[1] = 100000.; - max[0] = max[1] = -100000.; - for (int i = 0; i < 2; ++i) - for (int j = 0; j < user.hv[i].length; ++j) - for (int k = 0; k < user.hv[i][j].length; ++k) - { - if (user.hv[i][j][k] < min[i]) - min[i] = user.hv[i][j][k]; - if (user.hv[i][j][k] > max[i]) - max[i] = user.hv[i][j][k]; - } - // increase by 10% to improve appearence - for (int i = 0; i < 2; ++i) - { - double diff = (max[i] - min[i]) / 2.; - double middle = (max[i] + min[i]) / 2.; - if (diff > 0.) - { - max[i] = middle + 1.1 * diff; - min[i] = middle - 1.1 * diff; - } - } - // ensure entire trt hits included - if (projection instanceof AProjectionPhi) - { - min[1] -= 0.5; - max[1] += 0.5; - } - - if (max[0] - min[0] > 0 && max[1] - min[1] > 0) - { - window.setUserCorners(min[0], max[0], min[1], max[1]); - } - } - } - - public void drawHelix(AWindow window, AGraphics ag, AProjection2D projection) - { - if (projection instanceof AProjectionVP) - { - // phi wrap around is done in user coordinates, so we convert to user coordinates, - // do the phi wrap around and convert back to display coordinates - ag.draw(window.calculateDisplay(window.calculateUser( - getVPDisplayHelices(window, projection)).includePhiWrapAround(projection.getName()) - )); - } - else if (projection instanceof AProjectionRZ) - { - ag.draw(getRZDisplayHelices(window, projection)); - } - else if (projection instanceof AProjectionPhi) - { - // phi wrap around in user coordinates, see above - ag.draw(window.calculateDisplay(window.calculateUser( - getDisplayHelices(window, projection)).includePhiWrapAround(projection.getName()) - )); - - } - else - { - ag.draw(getDisplayHelices(window, projection)); - } - } - - // treat discontinuity when RZ sign changes crossing the phi boundary - private ACoord getRZDisplayHelices(AWindow window, AProjection2D projection) - { - ACoord display = getDisplayHelices(window, projection); - ACoord user = projection.inverseNonLinearTransform(window.calculateUser(display)); - - double[][] rho = user.hv[1]; - - int extraTrackSegments = 0; - - for (int i = 0; i < rho.length; i++) - for (int j = 1; j < rho[i].length - 2; j++) - if (rho[i][j] * rho[i][j + 1] < 0. && Math.abs(rho[i][j]) > 2.) - extraTrackSegments++; - - double hv[][][] = new double[2][rho.length + extraTrackSegments][]; - int index[] = new int[rho.length + extraTrackSegments]; - - extraTrackSegments = 0; - for (int i = 0; i < rho.length; i++) - { - int startOfSegment = 0; - int endOfLastSegment = rho[i].length - 1; - - for (int j = 0; j < rho[i].length - 1; j++) - if (rho[i][j] * rho[i][j + 1] < 0. && Math.abs(rho[i][j]) > 2.) - { - if (j == 0) - { - if (Math.abs(rho[i][0]) > 1.) - startOfSegment = 1; - } - else if (j == rho[i].length - 2) - endOfLastSegment = rho[i].length - 2; - else - { - for (int k = 0; k < hv.length; ++k) - { - hv[k][i + extraTrackSegments] = new double[j + 1 - startOfSegment]; - System.arraycopy(user.hv[k][i], startOfSegment, hv[k][i + extraTrackSegments], 0, j + 1 - startOfSegment); - } - index[i + extraTrackSegments] = user.index[i]; - startOfSegment = j + 1; - extraTrackSegments++; - } - } - if (startOfSegment == 0 && endOfLastSegment == rho[i].length - 1) - { - for (int k = 0; k < hv.length; ++k) - hv[k][i + extraTrackSegments] = user.hv[k][i]; - index[i + extraTrackSegments] = user.index[i]; - } - else - { - for (int k = 0; k < hv.length; ++k) - { - hv[k][i + extraTrackSegments] = new double[endOfLastSegment - startOfSegment + 1]; - System.arraycopy(user.hv[k][i], startOfSegment, hv[k][i + extraTrackSegments], 0, endOfLastSegment - startOfSegment + 1); - } - index[i + extraTrackSegments] = user.index[i]; - } - } - - rho = hv[1]; - for (int i = 0; i < rho.length; i++) - { - int j = 0; - - while (j < rho[i].length && Math.abs(rho[i][j]) < 2.) - j++; - if (j < rho[i].length) - if (rho[i][j] > 0.) - for (int k = 0; k < j; k++) - rho[i][k] = Math.abs(rho[i][k]); - else - for (int k = 0; k < j; k++) - rho[i][k] = -Math.abs(rho[i][k]); - } - - return window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv, index, this, ACoord.POLYLINES))); - } - - protected ACoord getDisplayHelices(AWindow window, AProjection2D projection) - { - AParameter drawPar = parameterStore.get(PARAMETER_GROUP, "DrawnAs"); - int drawnAs = drawPar != null ? drawPar.getI() : DRAW_HELIX; - - if (drawnAs == DRAW_HELIX) { - ADHelix[] dhelix = getHelices(); - double[][][] hv = new double[2][dhelix.length][0]; - int[] index = getDrawList(); - - for (int j = 0; j < dhelix.length; ++j) { - if (dhelix[j] != null) { - double s1 = dhelix[j].getAStart(); // Get start phi-angle - double s2 = dhelix[j].getAEnd(); // Get end phi-angle - - // s1 becomes phi at the intersection of the minimal radius - s1 = dhelix[j].intersectWithRadialCylinder(projection.getMinRho(), s1, s2); // minrho = 0 - // avoid drawing discontinuous in phi - dhelix[j].setPhiStart(s1, s2); - // returning a set of points to be drawn for this helix - ACoord pointsOnHelix = dhelix[j].drawHelix(window, projection, s1, s2); - - hv[0][j] = pointsOnHelix.hv[0][0]; - hv[1][j] = pointsOnHelix.hv[1][0]; - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } else { // DRAW_NEW_HELIX - - // V-plot needs some additional settings - boolean showS3D = parameterStore.get("Data", "S3D").getStatus(); - AParameter shortV = parameterStore.get("VP", "ShortV"); - - makeDrawList(); - double[][][] hv = new double[2][numDraw][]; - int[] index = new int[numDraw]; - - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - index[i] = j; - - if (projection instanceof AProjectionYX) { - - hv[0][i] = h[j].getX(h[j].getAlphaMin(), h[j].getAlphaMax()); - hv[1][i] = h[j].getY(h[j].getAlphaMin(), h[j].getAlphaMax()); - - } else if (projection instanceof AProjectionRZ - || projection instanceof AProjectionXZ - || projection instanceof AProjectionYZ) { - - double alphaMin = h[j].getAlphaCylinder(projection.getMinRho(), AHelix.TRACKER_LENGTH); - hv[0][i] = h[j].getZ(alphaMin, h[j].getAlphaMax()); - hv[1][i] = h[j].getRho(alphaMin, h[j].getAlphaMax(), true); - - if (projection instanceof AProjectionXZ || projection instanceof AProjectionYZ) { - double phiC = AProjectionXZ.getPhi(); - if (projection instanceof AProjectionYZ) phiC += 90; - - double phi[] = h[j].getPhi(alphaMin, h[j].getAlphaMax(), false); - for (int k=0; k<hv[1][i].length; k++) { - hv[1][i][k] = Math.abs(hv[1][i][k]) * Math.cos(Math.toRadians(phi[k] - phiC)); - } - } - } else if (projection instanceof AProjectionFR) { - - double alphaMin = h[j].getAlphaCylinder(projection.getMinRho(), AHelix.TRACKER_LENGTH); - hv[0][i] = h[j].getRho(alphaMin, h[j].getAlphaMax(), false); - hv[1][i] = h[j].getPhi(alphaMin, h[j].getAlphaMax(), false); - - } else if (projection instanceof AProjectionFZ) { - - double alphaMin = h[j].getAlphaCylinder(projection.getMinRho(), AHelix.TRACKER_LENGTH); - hv[0][i] = h[j].getZ(alphaMin, h[j].getAlphaMax()); - hv[1][i] = h[j].getPhi(alphaMin, h[j].getAlphaMax(), false); - - } else if (projection instanceof AProjectionVP) { - - double alphaMin = h[j].getAlphaCylinder(projection.getMinRho(), AHelix.TRACKER_LENGTH); - double alphaMax = h[j].getAlphaExtrapolated(AProjectionVP.getRhoVPlot(), AHelix.TRACKER_LENGTH); - if (shortV.getStatus() && !showS3D) { - alphaMin = alphaMax - shortV.getD() * (alphaMax - alphaMin); - } - - hv[0][i] = h[j].getEta(alphaMin, alphaMax); - hv[1][i] = h[j].getPhi(alphaMin, alphaMax, true); - - } - } - - return window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv, index, this, ACoord.POLYLINES))); - } - } - - // a track has two arms in the VPlot - protected ACoord getVPDisplayHelices(AWindow window, AProjection2D projection) - { - boolean drawApex = parameterStore.get("VP", "DrawApex").getStatus(); - AParameter drawPar = parameterStore.get(PARAMETER_GROUP, "DrawnAs"); - int drawnAs = drawPar != null ? drawPar.getI() : DRAW_HELIX; - - if (drawnAs == DRAW_HELIX) { - ADHelix[] dhelix = getHelices(); - int size = 2 * dhelix.length; - if (drawApex) - size = 3 * dhelix.length; - double[][][] hv = new double[2][size][0]; - int[] index = new int[size]; - int[] indexIn = getDrawList(); - int num = 0; - - for (int j = 0; j < dhelix.length; ++j) - if (dhelix[j] != null) - { - double s1 = dhelix[j].getAStart(); - double s2 = dhelix[j].getAEnd(); - - int mode = parameterStore.get("VP", "Mode").getI(); - if(mode <= AProjectionVP.MODE_HCAL_LAYER_3 - && mode >= AProjectionVP.MODE_ECAL_LAYER_0) { - s2 = 179; - } - - s1 = dhelix[j].intersectWithRadialCylinder(projection.getMinRho(), s1, s2); - double sEnd = dhelix[j].intersectWithCylinder(true, AProjectionVP.getRhoVPlot(), true, AProjectionVP.getZVPlot()); - - s2 = Math.max(Math.min(s2, sEnd), s1); - // if the whole helix is to be drawn (which are unusual - // helices, shorten it a little to avoid wraparound problems - if (s1 == 0. && s2 == 180.) - s2 = 179.; - if (parameterStore.get("VP", "ShortV").getStatus() && !parameterStore.get("Data", "S3D").getStatus()) - s1 = s2 - parameterStore.get("VP", "ShortV").getD() * (s2 - s1); - if (s2 > s1) - { - int signMin = -1; - int signMax = 1; - double h = 0; - double v = 0; - for (int sign = signMin; sign <= signMax; sign += 2) - { - // ugly must change structure at some point - AProjectionVP.sign = sign; - ACoord pointsOnHelix = dhelix[j].drawHelix(window, projection, s1, s2); - hv[0][num] = pointsOnHelix.hv[0][0]; - hv[1][num] = pointsOnHelix.hv[1][0]; - index[num] = indexIn[j]; - h = hv[0][num][hv[0][num].length - 1]; - v = hv[1][num][hv[0][num].length - 1]; - num++; - } - if (drawApex) - { - int a = 3; - int b = 7; - hv[0][num] = new double[] { h - a, h + a, h, h, h - a, h + a }; - hv[1][num] = new double[] { v - b, v - b, v - b, v + b, v + b, v + b }; - index[num] = indexIn[j]; - num++; - } - } - } - return new ACoord(hv, index, this, ACoord.POLYLINES); - } else { // DRAW_NEW_HELIX is handled by the normal method - return getDisplayHelices(window, projection); - } - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/data/ATrackResidualData.java b/graphics/AtlantisJava/src/atlantis/data/ATrackResidualData.java deleted file mode 100644 index 6f630c066367..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATrackResidualData.java +++ /dev/null @@ -1,323 +0,0 @@ -package atlantis.data; - -import java.awt.Color; -import java.awt.Point; -import java.awt.geom.Point2D; - -import atlantis.canvas.AWindow; -import atlantis.globals.AGlobals; -import atlantis.graphics.AGraphics; -import atlantis.graphics.APickingGraphics2D; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjectionTrackResidual; - -/** - * Contains residual data for a single track - * - * @author Qiang Lu - */ -public class ATrackResidualData -{ - public static String PULL_X = "P_X"; - public static String RESIDUAL_X = "R_X"; - - private ATrackData track; - private int trackIndex; - private String showType = RESIDUAL_X; - private int numPoints; - private float[] pullLoc1; - private float[] resLoc1; - private float[] pullLoc2; - private float[] resLoc2; - private String[] detType; - - private double logMagnitudeMin; - private int pickedIndex; - private byte pickedGroup; // 1 for loc1/pull1, 2 for loc2/pull2 - private double minDiff; - - private static APar parameterStore = APar.instance(); - - /** - * @param theTrack track collection to which this residual belongs to - * @param trackIndex index of the associated track - * @param points number of residuals points - * @param pullLoc1 residuals pull data 1 - * @param resLoc1 residuals data 1 - * @param pullLoc2 residuals pull data 2 (only for Pixel) - * @param resLoc2 residuals data 2 (only for Pixel) - * @param detType detector type of each residual - */ - ATrackResidualData(ATrackData track, int trackIndex, int points, - float[] pullLoc1, float[] resLoc1, float[] pullLoc2, float[] resLoc2, - String[] detType) - { - this.track = track; - this.trackIndex = trackIndex; - numPoints = points; - this.pullLoc1 = pullLoc1; - this.resLoc1 = resLoc1; - this.pullLoc2 = pullLoc2; - this.resLoc2 = resLoc2; - this.detType = detType; - } - - /** - * @return Returns the number of residual points. - */ - public int getNumPoints() - { - return numPoints; - } - - public float[] getPullLoc1() - { - return pullLoc1; - } - - public float[] getResLoc1() - { - return resLoc1; - } - - public float[] getPullLoc2() - { - return pullLoc2; - } - - public float[] getResLoc2() - { - return resLoc2; - } - - public void setLogMagnitudeMin(double logMagnitudeMin) - { - this.logMagnitudeMin = logMagnitudeMin; - } - - public double getLogMagnitudeMin() - { - return logMagnitudeMin; - } - - public void draw(AWindow window, AGraphics ag, AProjectionTrackResidual projection) - { - Color[] colorMap=AColorMap.getColors(); - - // draw horizontal axis through 0 - double x1 = 0., y1 = 0., x2 = projection.getXLength(), y2 = 0.0; - Point2D.Double from = window.calculateDisplay(x1, y1); - Point2D.Double to = window.calculateDisplay(x2, y2); - ag.setColor(colorMap[AColorMap.BL]); - ag.drawLine(from.x, from.y, to.x, to.y); - - float[] temp1; - AParameter showExtraPar = parameterStore.get("TrackResidual", "ShowExtra"); - if(projection.getResidualType().equals(RESIDUAL_X)) - { - showType = RESIDUAL_X; - temp1 = this.resLoc1; - float[] temp2 = this.pullLoc1; // needed when drawing error bar - drawResidual(window, ag, temp1, temp2, colorMap, false); - if(showExtraPar.getStatus()) - { - temp1 = this.resLoc2; - temp2 = this.pullLoc2; - drawResidual(window, ag, temp1, temp2, colorMap, true); - } - } - else - { - showType = PULL_X; - temp1 = this.pullLoc1; - drawResidual(window, ag, temp1, null, colorMap, false); - if(showExtraPar.getStatus()) - { - temp1 = this.pullLoc2; - drawResidual(window, ag, temp1, null, colorMap, true); - } - } - - if(ag.getGraphics2D() instanceof APickingGraphics2D - && parameterStore.get("Event", "PickingMode").getI() == APickingGraphics2D.PICK_HITS_AND_TRACKS) // pick residula - { - APickingGraphics2D.mode = APickingGraphics2D.PICK_RESIDUAL; - APickingGraphics2D.setPicked(this); - } - } - - public void drawResidual(AWindow window, AGraphics ag, float[] res, - float[] pull, Color[] colorMap, boolean drawExtra) - { - // every residual is drawn as a small square with 2 pixels * 2 pixels - // N.B. when showType=PULL_X, res actually represents pull, and pull=null - double[] h = new double[4]; - double[] v = new double[4]; - int pixelOffset = 1; - - Point clickedPoint = null; - if(ag.getGraphics2D() instanceof APickingGraphics2D - && parameterStore.get("Event", "PickingMode").getI() == APickingGraphics2D.PICK_HITS_AND_TRACKS) // pick residual - { - clickedPoint = ((APickingGraphics2D)ag.getGraphics2D()).pickedPoint; - } - - Color colValid = colorMap[AColorMap.RD]; //for backward compatibility - Color colInvalid = colorMap[AColorMap.BK]; - for(int i=0; i<numPoints; i++) - { - double y; - if(res[i] == -99.0f) // unavailable - { - ag.setColor(colInvalid); - y = 0.0; - } - else - { - if(detType != null) - { - String det = detType[i]; - if("unident".equals(det)) - ag.setColor(colorMap[AColorMap.GY]); - else - { - AParameter detColor = parameterStore.get("Det", det+"Fill"); - if(detColor != null) - ag.setColor(colorMap[detColor.getI()]); - else - ag.setColor(colValid); - } - } - else // for old files that don't have <tsosDetType> - ag.setColor(colValid); - - if(parameterStore.get("TrackResidual", "Scale").getI() == 0) // linear - y = res[i]; - else // logarithmic scale - { - if(res[i] != 0.0f) - y = Math.log10(Math.abs(res[i])) - logMagnitudeMin; - else - y = res[i]; - if(res[i] < 0.0f) - y = -y; - } - } - - double tempX, tempY; - if(!drawExtra) - tempX = window.calculateDisplay(i, y).x; - else - tempX = window.calculateDisplay(i+0.25, y).x; - tempY = window.calculateDisplay(i, y).y; - - // when shape is a square, calculate the corners - // x0, y0 - h[0] = tempX - pixelOffset; - v[0] = tempY + pixelOffset; - // x1, y1 - h[1] = tempX - pixelOffset; - v[1] = tempY - pixelOffset; - // x2, y2 - h[2] = tempX + pixelOffset; - v[2] = tempY - pixelOffset; - // x3, y3 - h[3] = tempX + pixelOffset; - v[3] = tempY + pixelOffset; - - ag.fillPolygon(h, v, h.length); - - // draw error bar only for residual - AParameter showErrorBarPar = parameterStore.get("TrackResidual", "ErrorBar"); - if(showType.equals(RESIDUAL_X) && showErrorBarPar.getStatus() && - pull != null) - { - double error = 0.0; - if(pull[i] != 0.0f && pull[i] != -99.0f && y != 0.0) - error = res[i] / pull[i]; - - if(error != 0.0) // draw the error bar by linear scale always - { - double[][] vLine = new double[2][2]; - vLine[0][0] = tempX; - vLine[0][1] = tempX; - vLine[1][0] = window.calculateDisplay(i, y+error).y; - vLine[1][1] = window.calculateDisplay(i, y-error).y; - ag.drawPolyline(vLine[0], vLine[1], vLine[0].length); // verticle line - - double xMinus = tempX - 2 * pixelOffset; - double xPlus = tempX + 2 * pixelOffset; - double yTop = vLine[1][0]; - double yBottom = vLine[1][1]; - ag.drawLine(xMinus, yTop, xPlus, yTop); - ag.drawLine(xMinus, yBottom, xPlus, yBottom); - } - } - - // find the picked residual - if(ag.getGraphics2D() instanceof APickingGraphics2D - && parameterStore.get("Event", "PickingMode").getI() == APickingGraphics2D.PICK_HITS_AND_TRACKS) // pick residula - { - if(i==0 && !drawExtra) - { - pickedIndex = i; - pickedGroup = 1; - minDiff = Math.abs(clickedPoint.x - tempX); - APickingGraphics2D.pickedH = tempX; - APickingGraphics2D.pickedV = tempY; - } - else - { - double diff = Math.abs(clickedPoint.x - tempX); - if(minDiff > diff) - { - pickedIndex = i; - if(drawExtra) - pickedGroup = 2; - else - pickedGroup = 1; - minDiff = diff; - APickingGraphics2D.pickedH = tempX; - APickingGraphics2D.pickedV = tempY; - } - } - } - } - } - - public String getHitInfo() - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return track.getNameScreenName()+ - " index: "+trackIndex+"\n storegate key: "+ - (track.getStoreGateKey() == null ? "n/a" : track.getStoreGateKey()); - - StringBuffer msg = new StringBuffer(track.getNameScreenName() + " (index: "); - msg.append(trackIndex); - msg.append(")"); - msg.append("\n storegate key: "); - msg.append(track.getStoreGateKey() == null ? "n/a" : track.getStoreGateKey()); - if(showType.equals(RESIDUAL_X)) - { - msg.append("\n Residual" + pickedGroup + "(" + "index: " + pickedIndex + ") = "); - if (pickedGroup == 1) - msg.append((this.resLoc1[pickedIndex]==-99.0f)?"unavailable":this.resLoc1[pickedIndex] + "(mm)"); - else - msg.append((this.resLoc2[pickedIndex]==-99.0f)?"unavailable":this.resLoc2[pickedIndex] + "(mm)"); - } - else - { - msg.append("\n Pull" + pickedGroup + "(" + "index: " + pickedIndex + ") = "); - if (pickedGroup == 1) - msg.append((this.pullLoc1[pickedIndex]==-99.0f)?"unavailable":this.pullLoc1[pickedIndex] + "(mm)"); - else - msg.append((this.pullLoc2[pickedIndex]==-99.0f)?"unavailable":this.pullLoc2[pickedIndex] + "(mm)"); - } - - return msg.toString(); - - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/data/ATrigS3DData.java b/graphics/AtlantisJava/src/atlantis/data/ATrigS3DData.java deleted file mode 100644 index 2a20340f4ea3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATrigS3DData.java +++ /dev/null @@ -1,252 +0,0 @@ -package atlantis.data; - -import atlantis.event.*; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.utils.AHashMap; -import atlantis.utils.AMath; - - -/** - * - * Trigger SpacePoints - * - * barcodes + numBarcodes - associations with Truth (STr) - * clusters - associations with SiClusters and over it with reconstructed - * tracks (Track) - * - * cleanup notes: - * methods makeFilterDrawList(), getIntegerEta(), getIntegerPhi() were removed - * as these were only used by AFilter in S3D (this class was obviously the - * origin for the others) but AFilter doesn't work with TrigS3D - * other also unused methods are getLayer() and getSub() - what are these - * used for? - * - */ -public class ATrigS3DData extends A3DPointData -{ - private int[][] clusters = null; - - // data from the event file - protected int[] layer = null; - - private boolean[] pixel = null; - public static final int PIXEL = -1; - - - - public String getParameterGroup() - { - return "TrigS3D"; - } - - - - public String getName() - { - return "TrigS3D"; - } - - - - public String getNameScreenName() - { - return "TrigSiSpacePoint"; - } - - - - public String getHitInfo(int index) - { - int simpleOutput = AGlobals.instance().getSimpleOutput(); - if(simpleOutput>0) return getNameScreenName()+" index: " + index+"\n"+ - AMath.RHO+" = "+String.format("%.3f",rho[index])+"\n "+ - AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phi[index]))+AMath.DEGREES; - - String clId = " (" + clusters[index][0] + ", " + - clusters[index][1] + ")"; - String type = pixel[index] ? " (Pixel)" : " (SCT)"; - - String r = ""; - r += getNameScreenName() + " (id: " + id[index] + " index: " + index + ")" + - clId + type + "\n " + - "x = " + String.format("%.3f",x[index]) + " cm\n " + - "y = " + String.format("%.3f",y[index]) + " cm\n " + - "z = " + String.format("%.3f",z[index]) + " cm\n " + - AMath.RHO + " = " + String.format("%.3f",rho[index]) + " cm\n " + - AMath.PHI + " = " + - String.format("%.3f",Math.toDegrees(phi[index])) + - AMath.DEGREES + " (" + String.format("%.3f",phi[index]) + " rad)\n " + - " layer = " + layer[index]; - r += super.getHitInfo(index); // finds barcode information - - return r; - - } // getHitInfo() ------------------------------------------------------- - - - - ATrigS3DData(AHashMap p, AEvent e) - { - super(p,e); - layer = p.getUnknownIntArray("layer"); - - if(p.get("clusters") != null) - { - // can only distinguish between SCT and Pixel hits if clusters - // subtag is available - pixel = new boolean[numData]; - // save IDs from event file to be availeble with pick info - clusters = new int[numData][]; - - int[][] assocClusters = new int[numData][]; - int[] temp = p.getIntArray("clusters"); - for(int i = 0; i < numData; ++i) - { - // save all clusters IDs - clusters[i] = new int[] { temp[2 * i], temp[2 * i + 1] }; - - // check if the second number, PIXEL (-1) designates pixel hit - if(temp[2 * i + 1] != PIXEL) - { - // this is SCT spacepoint - has got two clusters - assocClusters[i] = new int[] { temp[2 * i], temp[2 * i + 1] }; - } - else - { - // this is a pixel spacepoint (second cluster number is -1) - pixel[i] = true; - - // to ignore associtiation between pixel clusters and spacepoints: - // assocClusters[i] = null; - - // taking pixel cluster into account (pixel spacepoint has got - // only one cluster) (where as SCT spacepoint has got two clusters) - assocClusters[i] = new int[] { temp[2 * i] }; - } - } - AAssociation assoc = new AAssociation(getName(), "SiCluster", - assocClusters,event); - event.getAssociationManager().add(assoc); - } - - } // ATrigS3DData() ----------------------------------------------------- - - - - protected void finalizeConstruction() - { - super.finalizeConstruction(); - super.calculateAssociationViaClusters(); - - } // finalizeConstruction() --------------------------------------------- - - - - protected int internalColor() - { - int numColorTypes = super.internalColor(); - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - if(colorFunction == numColorTypes + 1) - { - colorBy(layer); - } - - return numColorTypes + 1; - - } // internalColor() ---------------------------------------------------- - - - protected void applyCuts() - { - cutIndex(); - cutSubdetector(); - cut("CutsInDet", "Layer", "Layer", layer); - cutPhi(phi); - cutEta(rho, z); - cutSimulatedTracks(); - cutReconstructedTracks(); - - } // applyCuts() -------------------------------------------------------- - - - private void cutSubdetector() - { - AParameter subPar = parameterStore.get("CutsInDet", "SCT"); - if(subPar.getI() != -1) - { - cutArray(sub, subPar.getI(), "Barrel/Endcap"); - } - - } // cutSubdetector() --------------------------------------------------- - - - - public int[] getLayer(int[] layer) - { - for(int i = 0; i < numDraw; i++) - { - layer[i] = this.layer[listdl[i]]; - } - return layer; - - } // getLayer() --------------------------------------------------------- - - - - public int getSub(int id) - { - if(id > -1) - { - return(id >> 25) & 0x3; - } - else - { - return(id >> 29) & 0x3; - } - - } // getSub() ----------------------------------------------------------- - - - - protected ACoord getFRUser() - { - if(!parameterStore.get("SiCluster", "Stereo").getStatus())return super.getFRUser(); - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = rho[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FR"); - - } // getFRUser() -------------------------------------------------------- - - - - protected ACoord getFZUser() - { - if(!parameterStore.get("SiCluster", "Stereo").getStatus())return super.getFZUser(); - makeDrawList(); - double[] h = new double[numDraw]; - double[] v = new double[numDraw]; - int[] index = new int[numDraw]; - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - h[i] = z[list]; - v[i] = Math.toDegrees(AParameterUtilities.getPhiStereo(rho[list], phi[list], z[list])); - index[i] = list; - } - return new ACoord(h, v, index, this).includePhiWrapAround("FZ"); - - } // getFZUser() -------------------------------------------------------- - -} // class ATrigS3DData ===================================================== diff --git a/graphics/AtlantisJava/src/atlantis/data/ATriggerInfoData.java b/graphics/AtlantisJava/src/atlantis/data/ATriggerInfoData.java deleted file mode 100644 index 4e9b000c650c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/ATriggerInfoData.java +++ /dev/null @@ -1,213 +0,0 @@ -package atlantis.data; - -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.utils.AHashMap; - -public class ATriggerInfoData extends AData -{ - private float[] energyEtMiss; - //private float[] energyEx; - //private float[] energyEy; - private float[] energySumEt; - private String[] trigInfoEF; - private String[] trigInfoExtL1ID; - private String[] trigInfoL1; - private String[] trigInfoL2; - private String[] trigInfoLvl1Type; - private String[] trigInfoStatus; - private String[] trigInfoStreamTag; - - ATriggerInfoData(AHashMap p, AEvent e) - { - super(p,e); - energyEtMiss = p.getUnknownFloatArray("energyEtMiss"); - //energyEx = p.getUnknownFloatArray("energyEx"); - //energyEy = p.getUnknownFloatArray("energyEy"); - energySumEt = p.getUnknownFloatArray("energySumEt"); - trigInfoEF = p.getStringArray("trigInfoEF"); - trigInfoExtL1ID = p.getStringArray("trigInfoExtL1ID"); - trigInfoL1 = p.getStringArray("trigInfoL1"); - trigInfoL2 = p.getStringArray("trigInfoL2"); - trigInfoLvl1Type = p.getStringArray("trigInfoLvl1Type"); - trigInfoStatus = p.getStringArray("trigInfoStatus"); - trigInfoStreamTag = p.getStringArray("trigInfoStreamTag"); - } - - protected void applyCuts() - {} - - public String getHitInfo(int index) - { - return "TriggerInfo"; - } - - protected int internalColor() - { - int colorFunction = parameterStore.get(PARAMETER_GROUP, "ColorFunction").getI(); - - if(colorFunction == 0) - colorByConstant(); - - return 3; - } - - public String getParameterGroup() - { - return "TriggerInfo"; - } - - public String getNameScreenName() - { - return "TriggerInfo"; - } - - /** - * For backward compatibility if this is null or -1 - * also check the value returned from ALVL1ResultData - */ - public float getEnergyEtMiss(int index) - { - return energyEtMiss[index]; - } - - /*public float getEnergyEx(int index) - { - return energyEx[index]; - } - public float getEnergyEy(int index) - { - return energyEy[index]; - }*/ - - /** - * For backward compatibility if this is null or -1 - * also check the value returned from ALVL1ResultData - */ - public float getEnergySumEt(int index) - { - return energySumEt[index]; - } - - public String getTrigInfoEF(int index) - { - return trigInfoEF[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getTrigInfoEFSplit(int index) - { - if(trigInfoEF!=null) - return splitItems(trigInfoEF[index]); - else - return null; - } - - /** - * Returns the hex values of the - * individual parts of the list seperated by - - */ - public String[] getTrigInfoEFSplitHex(int index) - { - return hexValues(splitItems(trigInfoEF[index])); - } - - public String getTrigInfoExtL1ID(int index) - { - return trigInfoExtL1ID[index]; - } - - public String getTrigInfoL1(int index) - { - return trigInfoL1[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getTrigInfoL1Split(int index) - { - if(trigInfoL1!=null) - return splitItems(trigInfoL1[index]); - else - return null; - } - - /** - * Returns the hex values of the - * individual parts of the list seperated by - - */ - public String[] getTrigInfoL1SplitHex(int index) - { - return hexValues(splitItems(trigInfoL1[index])); - } - - public String getTrigInfoL2(int index) - { - return trigInfoL2[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getTrigInfoL2Split(int index) - { - if(trigInfoL2!=null) - return splitItems(trigInfoL2[index]); - else - return null; - } - - /** - * Returns the hex values of the - * individual parts of the list seperated by - - */ - public String[] getTrigInfoL2SplitHex(int index) - { - return hexValues(splitItems(trigInfoL2[index])); - } - - public String getTrigInfoLvl1Type(int index) - { - return trigInfoLvl1Type[index]; - } - - public String getTrigInfoStatus(int index) - { - return trigInfoStatus[index]; - } - - - public String getTrigInfoStreamTag(int index) - { - return trigInfoStreamTag[index]; - } - - /** - * Returns the individual parts of the list seperated by - - */ - public String[] getTrigInfoStreamTagSplit(int index) - { - if(trigInfoStreamTag!=null) - return splitItems(trigInfoStreamTag[index]); - else - return null; - } - - - /** - * Returns the hex values of each element in the string - * string[] items represents a long[] - */ - private String[] hexValues(String[] items) - { - for(int i=0; i<items.length; i++) - { - long longvalue= Long.valueOf(items[i]).longValue(); - items[i] = "0x"+Long.toString(longvalue, 16).toUpperCase(); - } - return items; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/data/AVertex.java b/graphics/AtlantisJava/src/atlantis/data/AVertex.java deleted file mode 100755 index ed4ea9643d78..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AVertex.java +++ /dev/null @@ -1,328 +0,0 @@ -package atlantis.data; - -import Jama.Matrix; - -import java.util.HashMap; -import java.util.Map; -import atlantis.parameters.APar; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjectionXZ; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.utils.AMath; -import atlantis.utils.AAtlantisException; - -/** - * - * Reconstructed vertex instance. Either calculated in - * Atlantis (atlantis.utils.AVertexFit class) or read in from the event data as - * RVx datatype. RVx class keeps track of all the reconstructed vertices - * and contains instances of this class Avertex. - * (2005-08-08 refactoring and clean-ups) - * (2006-01-10 covMatrix, errMatrix variables were messed up (covMatrix - * numbers were huge - was actually the inverse - the weight matrix. AVertexFit - * code didn't give any ideas, very unclear code - covFittedMatrix there - * was used to initialize errMatrix here ...)) - * - * - * variables names renaming: - * covMatrix -> weightMatrix - * errMatrix -> covErrorMatrix - * - * @author Gary Taylor - */ -public class AVertex -{ - // size of the arrays with coordinates of the RVx ellipse and matrices - private static final int SIZE = 3; - - // basic RVx data - private double[] position = null; // x, y, z centre of the ellipse - private double chi2 = 1.e+10; - private Matrix covErrMatrix = null; // covariance error matrix - private Matrix weightMatrix = null; // inverse matrix of covErrMatrix - private double phi; // phi of the ellipse - private double rho; // rho of the ellipse - - private static APar parameterStore = APar.instance(); - - public AVertex(double[] p) - { - position = new double[SIZE]; - - if (p.length != SIZE) - { - throw new IllegalArgumentException("p.length=" + p.length); - } - for (int i = 0; i < SIZE; ++i) - { - position[i] = p[i]; - } - } // AVertex() ---------------------------------------------------------- - - /** - * @param p double[] - x, y, z positions of the centre of the ellipse - * @param c double[][] - input for covErrMatrix - * @param chiSquared double - */ - public AVertex(double[] p, double[][] c, double chiSquared) - { - testInputArrays(p, c); - - position = new double[SIZE]; - double[][] covErr = new double[SIZE][SIZE]; - - for (int i = 0; i < SIZE; ++i) - { - position[i] = p[i]; - } - phi = Math.atan2(p[1], p[0]); - if (phi < 0.) - phi += AMath.TWO_PI; - rho = Math.sqrt(p[0] * p[0] + p[1] * p[1]); - for (int i = 0; i < SIZE; ++i) - { - for (int j = 0; j < SIZE; ++j) - { - covErr[i][j] = c[i][j]; - } - } - - covErrMatrix = new Matrix(covErr); - weightMatrix = covErrMatrix.inverse(); - this.chi2 = chiSquared; - } // AVertex() ---------------------------------------------------------- - - /** - * - * @param chiSquared double - * @param p double[] - x, y, z positions of the centre of the ellipse - * @param c double[][] - input for covErrMatrix - */ - public AVertex(double chiSquared, double[] p, double[][] c) throws AAtlantisException - { - testInputArrays(p, c); - - chi2 = chiSquared; - - position = new double[SIZE]; - - for (int i = 0; i < SIZE; ++i) - { - position[i] = p[i]; - } - - phi = Math.atan2(p[1], p[0]); - if (phi < 0.) - phi += AMath.TWO_PI; - rho = Math.sqrt(p[0] * p[0] + p[1] * p[1]); - - double[][] covErr = new double[SIZE][SIZE]; - for (int x = 0; x < SIZE; x++) - { - covErr[x] = (double[]) c[x].clone(); - } - - try - { - covErrMatrix = new Matrix(covErr); - weightMatrix = covErrMatrix.inverse(); - } - catch (Exception ex) - { - String msg = "Error when creating covariance and/or weight\n" + "matrix in AVertex class.\nReason: " + ex.getMessage(); - throw new AAtlantisException(msg); - } - } // AVertex() ---------------------------------------------------------- - - private void testInputArrays(double[] p, double[][] c) throws IllegalArgumentException - { - if (p.length != SIZE) - { - throw new IllegalArgumentException("p.length = " + p.length); - } - - if (c.length != SIZE) - { - throw new IllegalArgumentException("c.length = " + c.length); - } - - for (int i = 0; i < SIZE; ++i) - { - if (c[i].length != SIZE) - { - throw new IllegalArgumentException("c[" + i + "].length = " + c[i].length); - } - } - } // testInputArrays() -------------------------------------------------- - - public double[] getPosition() - { - return (double[]) position.clone(); - } // getPosition() ------------------------------------------------------ - - public Matrix getCovErrMatrix() - { - return covErrMatrix; - } // getCovErrMatrix() -------------------------------------------------- - - public double getRho() - { - return rho; - } - - public double getPhi() - { - return phi; - } - - public String toString() - { - StringBuffer msg = new StringBuffer(" x = "); - msg.append(String.format("%.5f",position[0])); - msg.append(" "); - msg.append(AMath.PLUSMINUS); - msg.append(" "); - msg.append(String.format("%.3f",Math.sqrt(covErrMatrix.get(0, 0)))); - msg.append(" cm\n y = "); - msg.append(String.format("%.5f",position[1])); - msg.append(" "); - msg.append(AMath.PLUSMINUS); - msg.append(" "); - msg.append(String.format("%.3f",Math.sqrt(covErrMatrix.get(1, 1)))); - msg.append(" cm\n z = "); - msg.append(String.format("%.5f",position[2])); - msg.append(" "); - msg.append(AMath.PLUSMINUS); - msg.append(" "); - msg.append(String.format("%.3f",Math.sqrt(covErrMatrix.get(2, 2)))); - msg.append(" cm\n "); - msg.append(AMath.ETA); - msg.append(" = "); - msg.append(String.format("%.4f",AParameterUtilities.eta(position[2], rho))); - msg.append("\n "); - msg.append(AMath.PHI); - msg.append(" = "); - msg.append(String.format("%.1f",Math.toDegrees(phi))); - msg.append(AMath.DEGREES); - msg.append("\n chi2 = "); - msg.append(String.format("%.1f",chi2)); - - return msg.toString(); - } // toString() --------------------------------------------------------- - - // Ask Alan Litke to explain this calculation - private double[][] getEllipse(Matrix rM, int[] axisMapping) - { - Matrix parPrime = rM.times(new Matrix(position, position.length)); - - double a1 = weightMatrix.get(axisMapping[0], axisMapping[0]); - double a2 = weightMatrix.get(axisMapping[1], axisMapping[1]); - double a3 = weightMatrix.get(axisMapping[2], axisMapping[2]); - double a4 = 2. * weightMatrix.get(axisMapping[0], axisMapping[1]); - double a5 = 2. * weightMatrix.get(axisMapping[0], axisMapping[2]); - double a6 = 2. * weightMatrix.get(axisMapping[1], axisMapping[2]); - double b1 = a1 - a5 * a5 / (4. * a3); - double b2 = a2 - a6 * a6 / (4. * a3); - double b3 = a4 - 2 * a5 * a6 / (4. * a3); - double[][] hv = new double[2][360]; - double sigma = parameterStore.get("RVx", "NumSigma").getD(); - for (int i = 0; i < 360; ++i) - { - double thetat = Math.toRadians(i); - double tt = Math.tan(thetat); - double x = Math.sqrt(sigma * sigma / (b1 + b2 * tt * tt + b3 * tt)); - if (i > 90 && i <= 270) - x *= -1.; - hv[0][i] = x + parPrime.get(axisMapping[0], 0); - hv[1][i] = x * tt + parPrime.get(axisMapping[1], 0); - } - return hv; - } // getEllipse() ------------------------------------------------------- - - public double[][] getYXEllipse() - { - Matrix rM = new Matrix(AProjectionYX.getRotationMatrix()); - int[] axisMapping = AProjectionYX.getAxisMapping(); - - return getEllipse(rM, axisMapping); - } // getYXEllipse() ----------------------------------------------------- - - public double[][] getYZEllipse() - { - Matrix rM = new Matrix(AProjectionYZ.getRotationMatrix()); - int[] axisMapping = AProjectionYZ.getAxisMapping(); - - return getEllipse(rM, axisMapping); - } // getYZEllipse() ----------------------------------------------------- - - public double[][] getXZEllipse() - { - Matrix rM = new Matrix(AProjectionXZ.getRotationMatrix()); - int[] axisMapping = AProjectionXZ.getAxisMapping(); - - return getEllipse(rM, axisMapping); - } // getXZEllipse() ----------------------------------------------------- - - public double[][] getRZEllipse() - { - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi-phiMid); - int rSign; if (phiDiff > Math.PI/2. && phiDiff <= 3*Math.PI/2.) rSign = -1; else rSign = 1; - - double[][] hv = new double[2][360]; - double sigma = parameterStore.get("RVx", "NumSigma").getD(); - for (int i = 0; i < 360; ++i) - { - double thetat = Math.toRadians(i); - double ey = Math.sqrt(Math.sqrt(covErrMatrix.get(0,0)*covErrMatrix.get(0,0)+covErrMatrix.get(1,1)*covErrMatrix.get(1,1))); - double ex = Math.sqrt(covErrMatrix.get(2,2)); - hv[1][i] = rSign * Math.sqrt(position[0]*position[0]+position[1]*position[1]) + sigma*ey*Math.sin(thetat); - hv[0][i] = position[2] + sigma*ex*Math.cos(thetat); - //System.out.println(i+" "+thetat+" "+hv[0][i]+" "+hv[1][i]); - } - return hv; - } // getXZEllipse() ----------------------------------------------------- - - // Vertex type - enum same as in Athena - - enum Type { - DUMMY (0, "Dummy. Track particle was not used in vertex fit."), - PRIMARY (1, "Primary"), - SECONDARY (2, "Secondary"), - PILEUP (3, "Pile-up"), - CONVERSION (4, "Conversion"), - V0 (5, "V0 decay"), - KINK (6, "Kink"), - TEMPV0LAMBDA (7, "Temporary Addition for V0 Lambda"), - TEMPV0LAMBDABAR (8, "Temporary Addition for V0 LambdaBar"), - TEMPKSHORT (9, "Temporary Addition for KShort"), - DEFAULT (99, "Not specified"); - - public final int id; - public final String description; - - private static Map<Integer,Type> typeMap = new HashMap<Integer,Type>(); - static { - for (Type type : Type.values()) { - typeMap.put(type.id, type); - } - } - - /** - * Get vertex type corresponding to given integer type identifier. - * @param id type identifier - * @return vertex type - */ - public static Type typeFromId(int id) { - return typeMap.get(id); - } - - private Type (int id, String description) { - this.id = id; - this.description = description; - } - } - -} - \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/data/AVertexFit.java b/graphics/AtlantisJava/src/atlantis/data/AVertexFit.java deleted file mode 100755 index 09fba478e393..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/AVertexFit.java +++ /dev/null @@ -1,289 +0,0 @@ -package atlantis.data; - -import atlantis.parameters.APar; -import atlantis.utils.ALogger; - -import Jama.*; - - -/** - * This class provide a java implementation of the ALEPH vertex fitting - * routine YTOPOL. At the moment the only functionality is the fitting - * of ATLAS helices to a common vertex. A reasonable starting vertex for the - * fit must be given. For B decays the primary vertex should be good enough. - * Future improvements in functionality could include estimation of a - * starting vertex and including in the fitting also already calculated - * vertices and charged and neutral particles - */ - -public class AVertexFit { - private static ALogger logger = ALogger.getLogger(AVertexFit.class); - private static APar parameterStore = APar.instance(); - - private static final int MXITR=8; - private static final double CHISC=1.E-2; - private static final double CHISR=0.01; - private static final double PARCR=0.01; - private static final boolean DEBUG=false; - - private AVertexFit() {} - - public static AVertex fitVertex(AVertex estimatedVertex, AHelix[] helix) { - Matrix[] measuredHelix=new Matrix[helix.length]; - Matrix[] covHelix=new Matrix[helix.length]; - Matrix[] errHelix=new Matrix[helix.length]; - - for(int k=0; k<helix.length; ++k) { - double[] par=helix[k].getPar(); - double[][] cov=helix[k].getCovariance(); - double signD0=-1.; - double signPt=1.; - - par[0]*=signD0; - par[4]*=signPt; - - for(int i=0; i<5; ++i) { - cov[0][i]*=signD0; - cov[i][0]*=signD0; - cov[4][i]*=signPt; - cov[i][4]*=signPt; - } - - measuredHelix[k]=new Matrix(par, par.length); - covHelix[k]=new Matrix(cov); - errHelix[k]=covHelix[k].inverse(); - - // AOutput.logln( "measuredHelix "+k+" "+measuredHelix[k]); - // AOutput.logln( measuredHelix[k].toString()); - // AOutput.logln( covHelix[k].toString()); - - } - - int numFreeParam=3+3*helix.length; - Matrix fitted=new Matrix(numFreeParam, 1); - double[] estVertex=estimatedVertex.getPosition(); - int ipar; - - for(ipar=0; ipar<3; ++ipar) - fitted.set(ipar, 0, estVertex[ipar]); - ipar=3; - for(int k=0; k<helix.length; ++k) { - fitted.set(ipar++, 0, parameterStore.get("Event", "Curvature").getD()/measuredHelix[k].get(4, 0)-measuredHelix[k].get(0, 0)); - - fitted.set(ipar++, 0, measuredHelix[k].get(3, 0)); - fitted.set(ipar++, 0, measuredHelix[k].get(2, 0)); - } - - logger.debug("fittedHelix "+0+" "+new Transformation(fitted, 0).helixFromFitted()); - logger.debug("fittedHelix "+1+" "+new Transformation(fitted, 1).helixFromFitted()); - - // AOutput.logln( fitted.toString()); - - Matrix g=new Matrix(numFreeParam, 1); - Matrix gg=new Matrix(numFreeParam, numFreeParam); - int iteration=0; - double chiso=0.; - double chisq=0.; - boolean converged; - - FITTINGLOOP: - do { - g.timesEquals(0.); - gg.timesEquals(0.); - for(int k=0; k<helix.length; ++k) { - Transformation t=new Transformation(fitted, k); - - Matrix fittedHelix=t.helixFromFitted(); - - logger.debug("fittedHelix "+k+" "+fittedHelix); - Matrix dMdF=t.getHelixdMdF(); - Matrix delFM=fittedHelix.minus(measuredHelix[k]); - // helices are independent of each other so can - // use temporary matrices to avoid large matrix multiplications - Matrix gtemp=(errHelix[k].times(dMdF)).transpose().times(delFM); - Matrix ggtemp=dMdF.transpose().times(errHelix[k].times(dMdF)); - - // now put these into the large matrices - for(int i=0; i<3; ++i) { - int ix=3+3*k; - - g.set(i, 0, g.get(i, 0)+gtemp.get(i, 0)); - g.set(ix+i, 0, g.get(ix+i, 0)+gtemp.get(3+i, 0)); - for(int j=0; j<3; ++j) { - gg.set(i, j, gg.get(i, j)+ggtemp.get(i, j)); - gg.set(ix+i, j, gg.get(ix+i, j)+ggtemp.get(3+i, j)); - gg.set(i, ix+j, gg.get(i, ix+j)+ggtemp.get(i, 3+j)); - gg.set(ix+i, ix+j, gg.get(ix+i, ix+j)+ggtemp.get(3+i, 3+j)); - } - } - if(iteration==0) { - double chih=delFM.transpose().times(errHelix[k].times(delFM)).get(0, 0); - - chiso+=Math.min(chih, 1.0e+10); - // AOutput.logln( "initial chi2"+chih); - } - } - - // AOutput.logln( gg.toString()); - - gg=gg.inverse(); - Matrix delFitted=gg.times(g); - - logger.debug("DELFITTED "+iteration+" "+delFitted.toString()); - - fitted.minusEquals(delFitted); - - int jter=0; - int kter=0; - - while(true) { - if(kter>10) break FITTINGLOOP; - if(jter>100) break FITTINGLOOP; - - double chish=0.; - - chisq=0.; - for(int k=0; k<helix.length; ++k) { - Transformation t=new Transformation(fitted, k); - Matrix fittedHelix=t.helixFromFitted(); - Matrix delFM=fittedHelix.minus(measuredHelix[k]); - double chih=delFM.transpose().times(errHelix[k].times(delFM)).get(0, 0); - - chish+=Math.min(chih, 1.0e+10); - } - chisq+=chish; - - double chis1=0.; - - if((chisq>chiso+0.0001&&jter==0)||chisq>1.1*chiso) { - delFitted.timesEquals(0.5); - fitted.plusEquals(delFitted); - jter++; - chis1=chisq; - continue; - } else { - if(jter>0) { - // estimate best parameters - double chtrm=chis1+chiso-2.*chisq; - double fx; - - if(chtrm>0.) { - // concave chisq dependance - fx=(chis1-chiso)/(2.*(chis1+chiso-2.*chisq)); - fx=Math.max(fx, -2.); - fx=Math.min(fx, 2.); - } else { - // convex chisq dependance - fx=-2.; - } - delFitted.timesEquals(fx); - - jter=0; - kter++; - continue; - } - } - break; - } - - double dchi2=chiso-chisq; - - chiso=chisq; - converged=true; - // check for change in chisq - if(dchi2>CHISC&&dchi2>CHISR*chisq) converged=false; - // check for change in parameters - for(int i=0; i<numFreeParam; i++) - if(delFitted.get(i, 0)*delFitted.get(i, 0)>PARCR*gg.get(i, i)) - converged=false; - } while((!converged)&&iteration++<MXITR); - - double[] fittedVertex=new double[3]; - double[][] fittedVertexCov=new double[3][]; - - for(int i=0; i<3; i++) { - fittedVertex[i]=fitted.get(i, 0); - fittedVertexCov[i]=new double[3]; - for(int j=0; j<3; j++) - fittedVertexCov[i][j]=gg.get(i, j); - } - - return new AVertex(fittedVertex, fittedVertexCov, chisq); - } - - private static class Transformation { - double rho, tau, phi0, d0, z0, sinPhi, cosPhi, sinDPhi, cosDPhi, eta, s, r, dPhi; - - Transformation(Matrix fitted, int iHelix) { - int index=3+3*iHelix; - - eta=fitted.get(index++, 0); - tau=fitted.get(index++, 0); - phi0=fitted.get(index++, 0); - double sinPhi0=Math.sin(phi0); - double cosPhi0=Math.cos(phi0); - double xC=-eta*sinPhi0; - double yC=eta*cosPhi0; - - // if(DEBUG) AOutput.logln(" Afit xCyC"+iHelix+" "+xC+" "+yC+" "+eta); - - double xVxC=fitted.get(0, 0)-xC; - double yVyC=fitted.get(1, 0)-yC; - - r=0.; - if(eta>0.) - r=Math.sqrt(xVxC*xVxC+yVyC*yVyC); - else - r=-Math.sqrt(xVxC*xVxC+yVyC*yVyC); - - d0=r-eta; - sinPhi=xVxC/r; - cosPhi=-yVyC/r; - double phi=Math.atan2(sinPhi, cosPhi); - - if(phi-phi0<-Math.PI) phi+=2.*Math.PI; - dPhi=phi-phi0; - s=dPhi*r; - z0=fitted.get(2, 0)-s*tau; - sinDPhi=Math.sin(dPhi); - cosDPhi=Math.cos(dPhi); - rho=1./r; - } - - Matrix getHelixdMdF() { - Matrix dMdF=new Matrix(5, 6); - - double curvature = parameterStore.get("Event", "Curvature").getD(); - dMdF.set(4, 0, -curvature*rho*rho*sinPhi); - dMdF.set(4, 1, curvature*rho*rho*cosPhi); - dMdF.set(4, 3, -curvature*rho*rho*cosDPhi); - dMdF.set(4, 5, -curvature*rho*rho*eta*sinDPhi); - dMdF.set(3, 4, 1.); - dMdF.set(2, 5, 1.); - dMdF.set(0, 0, sinPhi); - dMdF.set(0, 1, -cosPhi); - dMdF.set(0, 3, cosDPhi-1.); - dMdF.set(0, 5, eta*sinDPhi); - dMdF.set(1, 0, -tau*(sinPhi*dPhi+cosPhi)); - dMdF.set(1, 1, tau*(cosPhi*dPhi-sinPhi)); - dMdF.set(1, 2, 1.); - dMdF.set(1, 3, -tau*(dPhi*cosDPhi-sinDPhi)); - dMdF.set(1, 4, -s); - dMdF.set(1, 5, -tau*(eta*(dPhi*sinDPhi+cosDPhi)-r)); - return dMdF; - } - - Matrix helixFromFitted() { - Matrix helix=new Matrix(5, 1); - - helix.set(4, 0, rho*parameterStore.get("Event", "Curvature").getD()); - helix.set(3, 0, tau); - helix.set(2, 0, phi0); - helix.set(0, 0, d0); - helix.set(1, 0, z0); - return helix; - } - - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/data/package.html b/graphics/AtlantisJava/src/atlantis/data/package.html deleted file mode 100644 index 15056059d098..000000000000 --- a/graphics/AtlantisJava/src/atlantis/data/package.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<p>All classes handling particular datatypes are part of this package. -They all implement AData from the atlantis.event package.</p> -</body> -</html> - diff --git a/graphics/AtlantisJava/src/atlantis/event/AAssociation.java b/graphics/AtlantisJava/src/atlantis/event/AAssociation.java deleted file mode 100755 index b2338def707a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AAssociation.java +++ /dev/null @@ -1,298 +0,0 @@ -package atlantis.event; - -import atlantis.utils.ALogger; - -/** - * Representation of the association between two data types. The association is - * stored using the string name+storeGateKey for both data types. - * - * The actual association is a an array of arrays of integers. The first index - * of this array is the index of an element in the first datatype. The array - * then contains the Athena IDs of the element in the second datatype that are - * associated to it. This is necessary because the second datatype might not - * have been read from the XML file yet, so the indices are unknown. - * - * @todo Modify this class to perform a translation of Athena ID to Atlantis ID - * for the identifiers of "b". This can be done together with purgeIDNotInData() - * and avoids the need for continuously looking up Athena IDs when drawing. - */ -public class AAssociation { - - /** Logger */ - private static final ALogger logger = ALogger.getLogger(AAssociation.class); - - /** Event this association belongs to */ - private final AEvent event; - - /** Identifying the datatype this association if from */ - private final String a; - - /** Identifying the datatype this association is to */ - private final String b; - - /** - * Association, the first index is the index of an element of "a", the - * second index then loops over the Athena IDs in "b" to which the element - * of "a" is associated. - */ - private final int[][] assoc; - - /** - * Constructor, taking as input a flat array (btoa) and an array that - * specifies how many entries correspond to each object in "a". - * - * For example: - * - * from = "Jet"; - * to = "Track"; - * numbtoa = {2, 0, 3}; - * btoa = {1, 5, 3, 4, 6}; - * - * This means that the first jet in the event (index=0) is associated - * to 2 tracks, namely index 1 and 5. The second jet has no associated - * tracks and the third jet (index=2) is associated to 3 tracks, indices - * 3, 4 and 6. - * - * Alternatively, numbtoa can be null. In that case the length of btoa has - * to be equal to the number of entries in "a". Every object in "a" will be - * associated to exactly one object in "b". - * - * @param from name+key this association is from, "a" - * @param to name+key this association is to, "b" - * @param numbtoa number of elements in "b" that each element in "a" is associated to - * @param btoa contents of the association in flat array - * @param e event object this association belongs to - */ - public AAssociation(String from, String to, int[] numbtoa, int[] btoa, AEvent e) { - - // Association to STr is done using barcodes, this is the only exception - // here: for barcodes ID=0 means no association. So we skip those entries. - boolean skipZero = to.startsWith("STr") && numbtoa == null; - - event = e; - a = from; - b = to; - - if (btoa == null) { - - assoc = null; - - } else { - - if (numbtoa != null) { - - // Multiple "b" entries associated to an "a" entry - assoc = new int[numbtoa.length][]; - - int num = 0; - for (int i = 0; i < numbtoa.length; ++i) { - if (numbtoa[i] <= 0) { - assoc[i] = new int[0]; - } else { - assoc[i] = new int[numbtoa[i]]; - } - - for (int j=0; j<numbtoa[i]; ++j) { - assoc[i][j] = btoa[num++]; - } - } - - } else { - - // Simple 1-on-1 association - assoc = new int[btoa.length][]; - - for (int i=0; i<btoa.length; i++) { - if (skipZero && btoa[i] <= 0) { - assoc[i] = new int[0]; - } else { - assoc[i] = new int[] { btoa[i] }; - } - } - } - - } - } - - /** - * Copy constructor - * - * @param from source datatype - * @param to target datatype - * @param associations association index arrays - * @param e event the association belongs to - */ - public AAssociation(String from, String to, int[][] associations, AEvent e) { - event = e; - a = from; - b = to; - assoc = associations; - } - - /** - * Get the name of association - * @return association name, concatenation of the two data types it associates - */ - public String getName() { - return a + b; - } - - /** - * Get source data type of association - * @return name of source data type - */ - public String getFrom() { - return a; - } - - /** - * Get target data type of association - * @return name of target data type - */ - public String getTo() { - return b; - } - - /** - * Get association array - * @return association array - */ - public int[][] getData() { - return assoc; - } - - /** - * Method that constructs the association b->a when only an association a->b - * currently exists. The complication here is due to the fact that "a" uses - * Atlantis indices (0, 1, ...), while "b" uses Athena IDs (1611690048, - * 1635282976, etc.). - * - * @return inverted association - */ - public AAssociation invert() { - - AData aData = event.get(a); - AData bData = event.get(b); - - if (aData == null || bData == null) { - logger.debug(getClass().getName() - + ": No association found between " + a + " and " + b); - return null; - - } else { - - try { - // New assoc will have the same number of entries as "b" - int[][] inv = new int[bData.getNumData()][]; - - // Athena IDs of object "a" - int[] ida = aData.getID(); - - // Loop over all entries in "a", the current association array - for (int i=0; i<assoc.length; ++i) { - if (assoc[i] != null) { - for (int j=0; j<assoc[i].length; ++j) { - - // For each associated entry in "b", we need to find - // the index from the Athena ID - int index = bData.getIndexFromId(assoc[i][j]); - - if (index != AData.NO_INVERSE) { - - if (inv[index] == null) { - - // The object in "a" is the first object that - // this object in "b" is associated to. Create - // a new array and add this entry. - inv[index] = new int[] { ida[i] }; - - } else { - - // The object in "b" is already associated to - // other objects in "a". Retrieve the other - // objects, increment the size and add the - // current object in "a". - int[] temp = new int[inv[index].length + 1]; - for (int k=0; k<inv[index].length; ++k) { - temp[k] = inv[index][k]; - } - temp[inv[index].length] = ida[i]; - inv[index] = temp; - } - } - } - } - } - return new AAssociation(b, a, inv, event); - - } catch (Exception e) { - logger.error("Unable to invert association.", e); - return null; - } - } - } // invert() --------------------------------------------------------------- - - /** - * Remove associations between items that are not present in the event data - */ - void purgeIDNotInData() { - // remove inconsistencies - // TRT hits from RTr<->SiCluster - // Association to an STr which does not exist in STr - - AData source = event.get(b); - if (assoc == null || source == null) { - return; - } - int INVALID_ID = -1; // (i hope!) - for (int i = 0; i < assoc.length; i++) { - if (assoc[i] != null) { - int num = 0; - for (int j = 0; j < assoc[i].length; j++) { - if (source.getIndexFromId(assoc[i][j]) == AData.NO_INVERSE) { - assoc[i][j] = INVALID_ID; - num++; - } - } - if (num > 0) { - if (num == assoc[i].length) { - assoc[i] = null; - } else { - int[] temp = new int[assoc[i].length - num]; - num = 0; - for (int j = 0; j < assoc[i].length; j++) { - if (assoc[i][j] != INVALID_ID) { - temp[num++] = assoc[i][j]; - } - } - assoc[i] = temp; - } - } - } - } - } - - /** - * Convert association into an informational message for the user - */ - @Override - public String toString() { - StringBuilder s = new StringBuilder(); - s.append(a).append(" to ").append(this.b); - if (assoc == null) { - s.append(" is empty\n"); - return s.toString(); - } else { - s.append("\n"); - for (int i = 0; i < assoc.length; i++) { - if (assoc[i] != null) { - for (int j = 0; j < assoc[i].length; j++) { - s.append(assoc[i][j]).append(" "); - } - s.append("\n"); - } - } - } - return s.toString(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AAssociationManager.java b/graphics/AtlantisJava/src/atlantis/event/AAssociationManager.java deleted file mode 100755 index cc1cbedaf47b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AAssociationManager.java +++ /dev/null @@ -1,118 +0,0 @@ -package atlantis.event; - - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import atlantis.utils.ALogger; - -public class AAssociationManager -{ - private static ALogger logger = ALogger.getLogger(AAssociationManager.class); - - private Map<String, AAssociation> associations = new HashMap<String, AAssociation>(); - - public AAssociationManager() {} - - public void clear() - { - associations = new HashMap<String, AAssociation>(); - } - - public void add(AAssociation a) - { - associations.put(a.getName(), a); - } - - public void remove(String key) - { - associations.remove(key); - } - - public int[][] get(String a, String b) - { - Object o = associations.get(a + b); - if(o != null) - { - return((AAssociation) o).getData(); - } - else - { - o = associations.get(b + a); - if(o != null) - { - //AOutput.logln("AAssociationManager.get()\n" + - // "querying non-existing association from-" + a + "-to-" + b + - // "\ncalculating inverse association ...") ; - AAssociation ass = ((AAssociation) o).invert(); - // following test prevents Atlantis from crashing if there - // is something wrong with the association between clusters - // and cells - if(ass != null) - { - add(ass); - return ass.getData(); - } - else - { - String name = "AAssociationManager.get(): "; - logger.debug(name + "No association " + - "found between " + a + " and " + b); - return null; - } - } - } - return null; - } // get() -------------------------------------------------------------- - - - public AAssociation getAssociation(String a, String b) - { - return (AAssociation) associations.get(a + b); - } - - public void correct() - { - Collection<AAssociation> c = associations.values(); - for (AAssociation a : c) { - a.purgeIDNotInData(); - } - } - - - public String[] getKnownAssociations(String a) - { - Collection<AAssociation> c = associations.values(); - Set<String> list = new TreeSet<String>(); - for (AAssociation ass : c) { - if(ass.getFrom().equals(a)) - { - list.add(ass.getTo()); - } - else if(ass.getTo().equals(a)) - { - list.add(ass.getFrom()); - } - } - return (String[]) list.toArray(new String[list.size()]); - } - - - public String getAllKnownAssociations() - { - Collection<AAssociation> col = associations.values(); - StringBuilder r = new StringBuilder(); - int c = 0; - - for (AAssociation ass : col) { - c++; - r.append(c + " association from " + ass.getFrom() + " to " + - ass.getTo() + " (name: " + ass.getName() + ")\n"); - } - - return r.toString(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/ABufferedEventSource.java b/graphics/AtlantisJava/src/atlantis/event/ABufferedEventSource.java deleted file mode 100644 index 7d089cf7ce8d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/ABufferedEventSource.java +++ /dev/null @@ -1,263 +0,0 @@ -package atlantis.event; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.ALogger; -import java.util.Vector; - -/** - * Extension class to AEventSource providing buffering for a fixed number of events. - * @author sboeser - */ -public abstract class ABufferedEventSource implements AEventSource { - - //Logging interface - private final static ALogger logger = ALogger.getLogger(ABufferedEventSource.class); - - //The index of the currently selected event in the list - private static int currentEvent = -1; - //The maximum number of events to save - public static int maxNumberOfEvents = 1; - //A vector of available events - private static Vector<AEvent> eventContainer = new Vector<AEvent>(); - // the current event navigation mode - private NavigationMode eventNavigationMode = NavigationMode.SEQUENTIAL; - - /** - * Abstract read next event method to be implemented by all subclasses - * @return the next event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - protected abstract AEvent readNext(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException; - /** - * Abstract read previous event method to be implemented by all subclasses - * @return the previous event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - protected abstract AEvent readPrevious(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException; - - /** - * Get the next event, either from the buildin buffer or by reading it in - * @return the next event - * @throws atlantis.event.AEventSource.NoMoreEventsException - * @throws atlantis.event.AEventSource.InvalidEventSourceException - * @throws atlantis.event.AEventSource.ReadEventException - */ - public AEvent nextEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException - { - //Check if we are already at the last event - if (currentEvent == eventContainer.size()-1){ - - //if so, try to get another event - AEvent event = null; - try{ - event = readNext(getCurrentEventInfo()); - } catch ( OutOfMemoryError oom ) { - - //throw an error message - logger.error("Ran out of memory while reading event data"); - - //See if we can clear memory by removing events - if ( getNumberOfEvents() > 0) { - //be verbose - logger.info("Clearing event cache and retry..."); - //remove events - clearEventContainer(); - //Call garbage collector to free resources - System.gc(); - //Now retry (no current event) - event = readNext(null); - } - } - - //Add it to the eventContainer as last one - addEvent(event,false); - - } else { - // simply increase event counter - setCurrentEvent(currentEvent+1); - } - - //Now return the new current event - return eventContainer.get(currentEvent); - } - - public AEvent previousEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException { - - //Check if we are already at the first event - if (currentEvent <= 0 ){ - - //if so, try to get another event - AEvent event = null; - try{ - event = readPrevious(getCurrentEventInfo()); - } catch ( OutOfMemoryError oom ) { - - //throw an error message - logger.error("Ran out of memory while reading event data"); - - //See if we can clear memory by removing events - if ( getNumberOfEvents() > 0) { - //be verbose - logger.info("Clearing event cache and retry..."); - //remove events - clearEventContainer(); - //Call garbage collector to free resources - System.gc(); - //Now retry (no current event) - event = readPrevious(null); - } - } - - //Add it to the eventContainer as first one - addEvent(event,true); - - } else { - // simply decrease event counter - setCurrentEvent(currentEvent-1); - } - - //Now return the new current event - return eventContainer.get(currentEvent); - - } - - /** - * Get the event navigation mode for the current source. - * @return current event navigation mode - */ - public NavigationMode getNavigationMode() { - return eventNavigationMode; - } - - /** - * Set the event navigation mode for the current source, - * clears the buffer and reads the first event. - * Throws InvalidEventSourceException if the current - * source does not support the requested mode - * @param mode requested event navigation mode - */ - public void setNavigationMode(NavigationMode mode) throws InvalidEventSourceException - { - if(supportsNavigationMode(mode)) { - NavigationMode oldMode = getNavigationMode(); - eventNavigationMode = mode; - - // empty the buffer - clearEventContainer(); - } else - throw new InvalidEventSourceException("Mode '"+mode.name()+"' not supported by current source"); - } - - /** - * Checks whether the current event source supports - * a particular display mode. - * @return true if the mode is supported - * @param mode requested event navigation mode - */ - public abstract boolean supportsNavigationMode(NavigationMode mode); - - /** - * Returns number of events saved in the eventContainer - * @return int - */ - public int getNumberOfEvents() - { - return eventContainer != null ? eventContainer.size() : 0; - - } - - /** - * Add the given even to the event container. By default, events are added - * to the end of the container. If skipping backward, it may be necessary to - * add to the beginning of the container, as indicated by the asFirst flag - * The new event will also be set as default event - * - * @param event the event to add - * @param asFirst whether to add the event at the beginning (default is end) - */ - private synchronized void addEvent(AEvent event, boolean asFirst) - { - //create event container if it does not exist - if(eventContainer == null) eventContainer = new Vector<AEvent>(); - - //Make sure container does not get too large - while (eventContainer.size() >= maxNumberOfEvents){ - // remove at the side at which we are not adding event - if (asFirst) eventContainer.remove(eventContainer.lastElement()); - else eventContainer.remove(0); - } - - //At the end or at the beginning - int index = (asFirst) ? 0 : eventContainer.size(); - - //add the event - eventContainer.add(index,event); - - //be verbose - logger.debug(eventContainer.size() + " event(s) in memory"); - - //set as current event - setCurrentEvent(index); - } - - - /** - * Clear the event container, reset the current event - */ - protected synchronized void clearEventContainer() - { - //Make sure the event container exits before clearing it - if(eventContainer != null){ - // let the user know - String msg = "Clearing event container with "+getNumberOfEvents()+" events."; - logger.warn(msg); - AOutput.append(msg, ALogInterface.WARNING); - - //Clear the container - eventContainer.clear(); - } - - //Alse reset current event - currentEvent = -1; - - //Run the garbage collector to free space immediately - System.gc(); - - } - - private void setCurrentEvent(int index) { - //Check for out-of-bounds - if ((index < 0) || ( index >= eventContainer.size())) - throw new ArrayIndexOutOfBoundsException("Cannot set index "+index+" in event container of size "+eventContainer.size()); - currentEvent = index; - } - - /** - * @return the curent event or null if there is none - */ - private AEventInfo getCurrentEventInfo(){ - - //Check if the current event is there - try { - //get the current events name - return eventContainer.get(currentEvent); - } catch (ArrayIndexOutOfBoundsException ex){ - //return an empty string if there is no current event - return null; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AData.java b/graphics/AtlantisJava/src/atlantis/event/AData.java deleted file mode 100644 index 6bf4541ac22d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AData.java +++ /dev/null @@ -1,1661 +0,0 @@ -package atlantis.event; - -import java.awt.Component; -import java.util.Vector; -import java.util.Collection; -import javax.swing.Action; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.canvas.AWindow; -import atlantis.data.ACompositeParticleData; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.ADrawable; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.list.AListManager; -import atlantis.output.AExceptionHandler; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjection3D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.utils.A4Vector; -import atlantis.utils.AHashMap; -import atlantis.utils.AIntHashtable; -import atlantis.utils.AMath; -import atlantis.list.AListProcessor; -import atlantis.utils.ALogger; - -/** - * Base class which holds the data from a subdetector (e.g. TRT) This - * representation is appropriate for data with a static number of entries but - * not for example for reconstructed vertices the number of which may be changed - * interactively by the user. AData should perhaps become an interface. - */ -abstract public class AData implements ADrawable, AListProcessor { - private static final ALogger logger = ALogger.getLogger(AData.class); //the event that this data belongs to - protected static AEventManager eventManager = AEventManager.instance(); - protected static APar parameterStore = APar.instance(); - protected static Component guiComponent = AGlobals.instance().getGuiFrame(); - protected final AEvent event; - protected static final int NO_INVERSE = -1; - protected int numData; - protected int numDraw; - protected int[] listdl; - protected byte[] color; - protected int[] id; - protected AIntHashtable indexFromId; - protected String storeGateKey = null; - protected final String PARAMETER_GROUP = getParameterGroup(); - - abstract protected int internalColor(); - - abstract protected void applyCuts(); - - abstract public String getNameScreenName(); - - abstract public String getHitInfo(int index); // pick info - - abstract public String getParameterGroup(); - // Holds the projection object that we are currently drawing on. This is *NOT* the same - // as ACanvas.getCanvas().getCurrentWindow().getProjection(), since this function gives - // the projection in the active window. Particularly at startup windows will be redrawn - // without being the active window. Hence this variable. - // - // By the way: this is also inherently bad design. Why does the data need - // to know about the projection? The main flaw is that the data draws itself, - // rather then the graphics context drawing the data - S.B. - protected AProjection2D currentProjection; - - // dummy version, only applies to dynamic data sources (e.g. RecVertex (RVx)) - public void remove(int[] index) {} - - // used to finalize the state of this object - // after all other AData objects are essentially built - // e.g. calculate the number of S3D hits on a track after both are read - protected void finalizeConstruction() {} - - // x y and z are now stored - // rho and phi arrays are only correct after a call to this function - protected void calculateRhoPhi() {} - - // used by rubberband in V-Plot - public String getVPHitInfo() { - return ""; - } - - public AData(AHashMap p, AEvent e) { - //save reference to the event this data belongs to - event = e; - - numData = p.getInt("numData"); - numDraw = numData; - listdl = new int[numData]; - color = new byte[numData]; - - storeGateKey = (String) p.get("storeGateKey"); - if ("".equals(storeGateKey) || storeGateKey == null) { - storeGateKey = null; - } - - if (p.get("id") != null) { - id = p.getIntArray("id"); - } else { - id = new int[numData]; - for (int i = 0; i < numData; i++) { - // start IDs calculated in Atlantis from 0, should be the same - // as in JiveXML - id[i] = i; - } - } - - indexFromId = new AIntHashtable(id); - } // AData() - - AData(Node node, AEvent e) { - //save reference to the event this data belongs to - event = e; - numData = 0; - NodeList children = node.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - if (children.item(i).getNodeType() == Node.ELEMENT_NODE) { - numData++; - } - } - numDraw = numData; - listdl = new int[numData]; - color = new byte[numData]; - id = new int[numData]; - for (int i = 0; i < numData; i++) { - id[i] = i; - } - indexFromId = new AIntHashtable(id); - } - - public AEvent getEvent(){ - return event; - } - - public int getIndexFromId(int id) { - return indexFromId.get(id); - } - - public final A4Vector get4Vector() { - makeDrawList(); - return get4Vector(numDraw, listdl); - } - - // only applies to data which can provide 4 vectors - public A4Vector get4Vector(int num, int[] list) { - return null; - } - - // only applies to data which can provide 4 vectors - public A4Vector get4Vector(int num, int[] list, double mass) { - return null; - } - - public int getNumData() { - return numData; - } - - public int getNumDraw() { - return numDraw; - } - - public int getDrawIndex(int index) { - return this.listdl[index]; - } - - public int[] getID() { - return id; - } - - protected int getNum(String name, int index) { - int[][] ass = event.getAssociationManager().get(getFullName(), name); - if (ass != null && ass[index] != null) { - return ass[index].length; - } else { - return 0; - } - } - - protected int[] getNum(String name) { - int[][] ass = event.getAssociationManager().get(getFullName(), name); - int[] num = new int[numData]; - if (ass != null) { - for (int i = 0; i < ass.length; ++i) { - if (ass[i] != null) { - num[i] = ass[i].length; - } - } - } - return num; - } - - public byte[] getColor() { - color(); - byte[] temp = new byte[id.length]; - - for (int i = 0; i < temp.length; i++) { - temp[i] = color[getIndexFromId(id[i])]; - } - return temp; - } - - public int[] getColor(int[] dl) { - color(); - int[] temp = new int[dl.length]; - - for (int i = 0; i < temp.length; i++) { - temp[i] = color[dl[i]]; - } - return temp; - } - - public int getColor(int index){ - return color[index]; - } - - public void makeDrawList() { - calculateRhoPhi(); - constructDefaultDrawlist(); - applyCuts(); - } - - public void constructDefaultDrawlist() { - if (!parameterStore.get("CutsATLAS", "ByList").getStatus()) { - // if some hits are on a list they must be drawn last - int[][] temp = AListManager.getInstance().getColorMapping(this); - int[] index = temp[0]; - int[] ctemp = temp[1]; - if (index.length > 0) { - // AOutput.logln("AData.constructDefaultDrawlist() numData = " + - // numData); - int[] c = new int[numData]; - final int NONE = -999; - for (int i = 0; i < numData; ++i) { - c[i] = NONE; - } - for (int i = 0; i < index.length; ++i) { - c[index[i]] = ctemp[i]; - } - numDraw = 0; - for (int i = 0; i < numData; ++i) { - if (c[i] == NONE) { - listdl[numDraw++] = i; - } - } - for (int i = 0; i < numData; ++i) { - if (c[i] != NONE && c[i] != AColorMap.INVISIBLE) { - listdl[numDraw++] = i; - // nb invisible are not in the drawlist - } - } - } else { - // this is the standard case - numDraw = numData; - for (int i = 0; i < numDraw; ++i) { - listdl[i] = i; - } - } - } else { - // drawlist set by cuts..... - boolean[] selected = AListManager.getInstance().getSelection(this); - numDraw = 0; - for (int i = 0; i < selected.length; ++i) { - if (selected[i]) { - listdl[numDraw++] = i; - } - } - } - } - - // provides the draw list as a boolean array parallel to the data array - protected boolean[] isDrawn() { - boolean[] drawn = new boolean[numData]; - - for (int i = 0; i < numDraw; i++) { - drawn[listdl[i]] = true; - } - return drawn; - } - - public void cut(String groupName, String parameterName, String text, float[] array) { - AParameter par = parameterStore.get(groupName, parameterName); - - if (par != null && par.getStatus() && array != null) { - double value = par.getD(); - String operator = par.getOperator(); - int num = 0; - - if (par.isModulus()) { - if (operator.equals("<")) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) < value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">")) { - // '>' really means '>=' for reals since they are real in - // from ascii file and don't have full precison - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) >= value) { - listdl[num++] = listdl[i]; - } - } - } else { - throw new Error(operator + " operator not sensible for floats"); - } - } else { - if (operator.equals("<")) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] < value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">")) { - // '>' really means '>=' for reals since they are real in - // from ascii file - // and don't have full precison - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] >= value) { - listdl[num++] = listdl[i]; - } - } - } else { - throw new Error(operator + " operator not sensible for floats"); - } - } - numDraw = num; - } - } - - protected void cut(String groupName, String parameterName, String text, int[] array) { - AParameter par = parameterStore.get(groupName, parameterName); - - if (par != null && par.getStatus() && array != null) { - int value = par.getI(); - - // consider two special cases: Electron/isEM and Photon/isEM - if (parameterName.endsWith("isEM")) { - if (!isEMValidate(value)) { - return; - } - String binaryString = Integer.toBinaryString(value); - Vector<String> possibleValues = getPossibleValues(binaryString); - cutIsEM(text, array, possibleValues); - } else { - String operator = par.getOperator(); - boolean modulus = par.isModulus(); - - cut(text, modulus, array, operator, value); - } - } - } - - protected void cut(String text, int[] array, String operator, int value) { - cut(text, false, array, operator, value); - } - - protected void cut(String text, boolean modulus, int[] array, String operator, int value) { - int num = 0; - - if (modulus) { - if (operator.equals("<")) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) < value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">")) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) > value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("=") || operator.equals("==")) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) == value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("!=") || operator.equals(AMath.NOTEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) != value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("<=") || operator.equals(AMath.LESSEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) <= value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">=") || operator.equals(AMath.GREATEREQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (Math.abs(array[listdl[i]]) >= value) { - listdl[num++] = listdl[i]; - } - } - } else { - throw new Error(operator + " operator not sensible for integers"); - } - } else { - if (operator.equals("<")) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] < value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">")) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] > value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("=") || operator.equals("==")) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] == value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("!=") || operator.equals(AMath.NOTEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] != value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("<=") || operator.equals(AMath.LESSEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] <= value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">=") || operator.equals(AMath.GREATEREQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (array[listdl[i]] >= value) { - listdl[num++] = listdl[i]; - } - } - } else { - throw new Error(operator + " operator not sensible for integers"); - } - } - numDraw = num; - } - - // cut based on the i'th item in the data array - public void cutIndex() { - AParameter par = parameterStore.get("CutsATLAS", "Index"); - - if (par.getStatus()) { - int value = par.getI(); - String operator = par.getOperator(); - int num = 0; - - if (operator.equals("<")) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] < value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">")) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] > value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("=") || operator.equals("==")) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] == value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("!=") || operator.equals(AMath.NOTEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] != value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals("<=") || operator.equals(AMath.LESSEQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] <= value) { - listdl[num++] = listdl[i]; - } - } - } else if (operator.equals(">=") || operator.equals(AMath.GREATEREQUAL)) { - for (int i = 0; i < numDraw; i++) { - if (listdl[i] >= value) { - listdl[num++] = listdl[i]; - } - } - } else { - throw new Error(operator + " operator not sensible for integers"); - } - numDraw = num; - } - } - - protected void cutArray(int[] value, int cutValue, String description) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - - if (value[listdl[i]] == cutValue) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - protected void cutArray(byte[] value, int cutValue, String description) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - - if (value[listdl[i]] == cutValue) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - //isEMString cut declaration - // - // Clone of above cut, but to allow values less than or equal to the cut value - // At the moment, Specific to isEMString for Electrons and Photons, and isTauString. - // - protected void cutArrayEnum(Vector<Enum> value, int cutValue, String description) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - if ((value.get(listdl[i]).ordinal()) <= cutValue) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - // End isEMString cut declaration - - protected void cutArray(boolean[] value, boolean cutValue, String description) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - if (value[listdl[i]] == cutValue) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - protected void cutArrayOR(int[] value, int cutValue1, int cutValue2, - String description) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - if (value[listdl[i]] == cutValue1 || value[listdl[i]] == cutValue2) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - // apply phi+-deltaphi cut to lines (e.g. TRT) - protected void cutPhi(float[] phi, float[] dphi) { - AParameter par = parameterStore.get("CutsATLAS", "CutPhi"); - - if (!par.getStatus()) { - return; - } - double phiCut = Math.toRadians(par.getD()); - double phiMid = Math.toRadians(AMath.nearestPhiDegrees(parameterStore.get("CutsATLAS", "PhiMiddle").getD())); - double phiLowerCut = phiMid - phiCut; - double phiUpperCut = phiMid + phiCut; - int num = 0; - - for (int i = 0; i < numDraw; i++) { - int list = listdl[i]; - double phiHit = AMath.nearestPhiRadians(phi[list], phiMid); - double phiLower = phiHit - dphi[list]; - double phiUpper = phiHit + dphi[list]; - - if (phiUpper - phiLowerCut > 1.0e-6 && phiUpperCut - phiLower > 1.0e-6) { - listdl[num++] = list; - } - } - numDraw = num; - } - - /** Apply phi+-deltaphi cut to points (e.g. S3D) */ - public void cutPhi(float[] phi) { - AParameter par = parameterStore.get("CutsATLAS", "CutPhi"); - boolean usePhiCut = par.getStatus(); - - if (usePhiCut) { - double phiCut = Math.toRadians(Math.abs(par.getD())); - double phiMid = Math.toRadians(AMath.nearestPhiDegrees(parameterStore.get("CutsATLAS", "PhiMiddle").getD())); - int num = 0; - - for (int i = 0; i < numDraw; i++) { - double phiDiff = Math.abs(AMath.nearestPhiRadians(phi[listdl[i]], phiMid) - phiMid); - - if (phiCut - phiDiff > 1.0e-6) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - } - - /** apply eta+-deltaeta cut to points (e.g. S3D) */ - public void cutEta(float[] eta) { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - boolean useEtaCut = par.getStatus(); - - if (useEtaCut) { - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - int num = 0; - - for (int i = 0; i < numDraw; i++) { - double etaDiff = Math.abs(eta[listdl[i]] - etaMid); - - if (etaCut - etaDiff > 1.0e-6) { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - } - - protected void colorByConstant() { - if (!PARAMETER_GROUP.equals("CompositeParticle")) { - int constantColor = parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - - for (int i = 0; i < numData; i++) { - color[i] = (byte) constantColor; - } - } else { - ACompositeParticleData compositeParticles = (ACompositeParticleData) this; - compositeParticles.makeDrawList(); - for (int e = 0; e < compositeParticles.getNumDraw(); ++e) { - int list = compositeParticles.getDrawIndex(e); - switch (Math.abs(compositeParticles.getPdgId(list))) { - case 13: - color[list] = (byte) parameterStore.get("Muon", "Constant").getI(); - break; - case 11: - color[list] = (byte) parameterStore.get("Electron", "Constant").getI(); - break; - case 22: - color[list] = (byte) parameterStore.get("Photon", "Constant").getI(); - break; - case 5: - color[list] = (byte) parameterStore.get("BJet", "Constant").getI(); - break; - case 15: - color[list] = (byte) parameterStore.get("TauJet", "Constant").getI(); - break; - case 24: - color[list] = (byte) parameterStore.get("CompositeParticle", "ConstantW").getI(); - break; - case 6: - color[list] = (byte) parameterStore.get("CompositeParticle", "ConstantTop").getI(); - break; - case 25: - color[list] = (byte) parameterStore.get("CompositeParticle", "ConstantH").getI(); - break; - - default: - if (compositeParticles.getTypeEV(list).equals("EVParticleJet")) { - color[list] = (byte) parameterStore.get("Jet", "Constant").getI(); - } else { - color[list] = (byte) parameterStore.get("CompositeParticle", "Constant").getI(); - } - } - } - } - } - - - /** Colour by index. - * e.g. colorByIndex(indexBy(phi)); - * will allow nearby phi tracks to be coloured differently. - * @param index - */ - protected void colorByIndex(int[] index) { - int numColors = parameterStore.get("HitColors", "Number").getI(); - - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) { - color[index[i]] = (byte) col[i % numColors]; - } - } - - protected void colorByIndex() { - int numColors = parameterStore.get("HitColors", "Number").getI(); - - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) { - color[i] = (byte) col[i % numColors]; - } - } - - protected void colorByCollection() { - int constantColor = parameterStore.get(PARAMETER_GROUP, "Constant").getI(); - int numColors = parameterStore.get("HitColors", "Number").getI(); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - AEvent ev = eventManager.getCurrentEvent(); - // vector with store gate keys for a particular datatype name: this.getName() - Vector<String> v = ev.getCollections().get(this.getName()); - int keyIndex = 0; - if (v != null && (keyIndex = v.indexOf(this.getStoreGateKey())) != -1) { - // v is null - requested datatype name doesn't exists in the current - // event - - // if keyIndex is -1 it means the current - // store gate key doesn't exists in the current event (for a datatype - // which exists in the current event) - // previous event(s) are being drawn and this colouring function - // won't work for them but only for the current event - - // constant colour index is used purely as modifier so as all datatypes - // coloured by colletictions don't start at the same colour ... - keyIndex += constantColor; - for (int i = 0; i < numData; i++) { - color[i] = (byte) col[keyIndex % numColors]; - } - } else { - logger.debug("colorByCollection(): can't colour by collection"); - } - - } // colorByCollection() ------------------------------------------------ - - /** - * Colour another class by association. This class is providing the colour, - * we assign colours from the local class to the target using col[] and id[][]. - * - * @param col target class colour array - * @param id association array from this class to the target class - * @param unconnectedColor colour for unconnected hits - * @param sharedColor colour for shared hits - */ - protected void colorByAssociation(AData target, int[][] id, - byte unconnectedColor, byte sharedColor) { - - // All hits are unconnected by default - for (int i=0; i<target.color.length; i++) { - target.color[i] = unconnectedColor; - } - - if (id == null) return; - - // Loop over drawn objects in this class, then colour the other elements - // that are associated. i iterates over the drawn items, j is the true - // index and k refers to an associated item in the target class, with true - // index l. - for (int i=0; i<numDraw; i++) { - int j = listdl[i]; - - if (id[j] != null) { - for (int k = 0; k < id[j].length; k++) { - int l = target.getIndexFromId(id[j][k]); - - if (l < 0) continue; - - if (target.color[l] != unconnectedColor) { - // If item l was already connected, that means it is shared - target.color[l] = sharedColor; - } else { - // Assign associated item l the colour of item j in the local class - target.color[l] = this.color[j]; - } - } - } - } - } // colorByAssociation() ----------------------------------------------- - - protected void setColor(int index, byte color) { - if (index >= 0 && index < this.color.length) { - this.color[index] = color; - } else { - logger.debug(getClass().getName() + ": Set color for data with index = " + index); - } - } - - protected void setColor(byte color) { - for (int i = 0; i < this.color.length; i++) { - this.color[i] = color; - } - } - - protected void colorBy(int[] coloringVariable) { - int numColors = parameterStore.get("HitColors", "Number").getI(); - - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - - for (int i = 0; i < numData; i++) { - color[i] = (byte) col[coloringVariable[i] % numColors]; - } - } - - protected void colorBy(String colorGroup, int[] coloringVariable) { - int numColors = parameterStore.get(colorGroup, "Number").getI(); - - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray(colorGroup, "C1", numColors); - - for (int i = 0; i < numData; i++) { - color[i] = (byte) col[coloringVariable[i] % numColors]; - } - } - - protected void colorBy(float[] Pt) { - int numColors = parameterStore.get("HitColors", "Number").getI(); - - numColors = Math.min(7, numColors); - int[] col = parameterStore.getArray("HitColors", "C1", numColors); - for (int i = 0; i < numData; i++) { - int icol = 0; - if (Math.abs(Pt[i]) < 2) { - icol = 4; //lichtblauw - } else if (Math.abs(Pt[i]) < 4) { - icol = 2; //blauw - } else if (Math.abs(Pt[i]) < 10) { - icol = 5; //paars - } else if (Math.abs(Pt[i]) < 40) { - icol = 3; //oranje - } else { - icol = 0; //rood - } - color[i] = (byte) col[icol]; - } - } - - public String getName() { - return getParameterGroup(); - } - - public String getStoreGateKey() { - return storeGateKey; - } - - // x y from rho phi - protected void calculateXY(float[] rho, float[] phi, float[] x, float[] y) { - for (int i = 0; i < x.length; ++i) { - x[i] = (float) (rho[i] * Math.cos(phi[i])); - y[i] = (float) (rho[i] * Math.sin(phi[i])); - } - } - - /** Calculate rho phi from x y */ - protected void calculateRhoPhi(float[] x, float[] y, float[] rho, float[] phi) { - // [2007-07-20] method is again always called from AData.makeDrawList() - // but reference to primary vertex is removed, it's not taken into account now - // double[] pVtx = Atlantis.getEventManager().getCurrentEvent().getPrimaryVertex(); - // double dx = x[i] - pVtx[0]; - // double dy = y[i] - pVtx[1]; - - for (int i = 0; i < rho.length; i++) { - double dx = x[i]; - double dy = y[i]; - - rho[i] = (float) (Math.sqrt(dx * dx + dy * dy)); - phi[i] = (float) (Math.atan2(dy, dx)); - if (phi[i] < 0.) { - phi[i] += AMath.TWO_PI; - } - } - } - - /** Draw the data form this detector on this window and projection */ - public void draw(AWindow window, AGraphics ag, AProjection2D projection) { - ag.draw(window.calculateDisplay(getUser(projection))); - } - - /** Get the data from a projection without non linear transform applied. - * @param projection - * @return - */ - protected ACoord getUserNoTransform(AProjection projection) { - ACoord data = ACoord.NO_DATA; - // don't use reflection as debugging is then harder - if (projection instanceof AProjectionYX) { - data = getYXUser(); - } else if (projection instanceof AProjectionFR) { - data = getFRUser(); - } else if (projection instanceof AProjectionRZ) { - data = getRZUser(); - } else if (projection instanceof AProjectionXZ) { - data = getXZUser(); - } else if (projection instanceof AProjectionYZ) { - data = getYZUser(); - } else if (projection instanceof AProjectionFZ) { - data = getFZUser(); - } else if (projection instanceof AProjectionVP) { - data = getVPUser(); - } else if (projection instanceof AProjection3D) { - data = get3DUser(); - } - - return data; - } - - /** Get the data form a projection with non linear transform applied. */ - protected ACoord getUser(AProjection2D projection) { - currentProjection = projection; - return projection.nonLinearTransform(getUserNoTransform(projection)); - } - - /** Should the polygon from this detector be drawn or filled? */ - protected int getDrawOrFill() { - return AGraphics.DRAW; - } - - /** - * Prints info about association in which AData:index participates - * (pick + n (navigate) - * @param index int - * @return String - */ - public String navigate(int index) { - StringBuilder temp = new StringBuilder(); - String assocKey = getFullName(); - String[] knownAssoc = event.getAssociationManager().getKnownAssociations(assocKey); - temp.append(" associated to:\n"); - for (int i = 0; i < knownAssoc.length; i++) { - AData source = eventManager.getCurrentEvent().get(knownAssoc[i]); - if (source == null) continue; - int[][] ass = event.getAssociationManager().get(assocKey, knownAssoc[i]); - if (ass != null && ass[index] != null) { - for (int x = 0; x < ass[index].length; x++) { - temp.append(" " + knownAssoc[i] + " id: " + ass[index][x] + - " index: " + source.getIndexFromId(ass[index][x]) + "\n"); - } - } - } - return temp.toString(); - - } // navigate() --------------------------------------------------------- - - private boolean isEMValidate(int inputValue) { - if (inputValue > 65535) { - String displayMessage = "isEM is a 16-bit binary data, maximum is 65535"; - AExceptionHandler.processException("warning", displayMessage.toString()); - return false; - } - return true; - } - - // "1" means a wildcard, can be "0" or "1" - private Vector<String> getPossibleValues(String bStr) { - Vector<String> possibleValues = new Vector<String>(); - if (bStr.length() == 1) { - possibleValues.add("0"); - if (bStr.charAt(0) == '1') { - possibleValues.add("1"); - } - } else { - Vector<String> possibleValuesWithoutFirstChar = getPossibleValues(bStr.substring(1)); - for (int i = 0; i < possibleValuesWithoutFirstChar.size(); i++) { - String str = possibleValuesWithoutFirstChar.get(i); - possibleValues.add("0" + str); - if (bStr.charAt(0) == '1') { - possibleValues.add("1" + str); - } - } - - } - return possibleValues; - } - - private void cutIsEM(String text, int[] array, Vector<String> possibleValues) { - int num = 0; - - for (int i = 0; i < numDraw; i++) { - for (int j = 0; j < possibleValues.size(); j++) { - String str = possibleValues.get(j); - int value = Integer.parseInt(str, 2); - if (array[listdl[i]] == value) { - listdl[num++] = listdl[i]; - break; - } - } - } - - numDraw = num; - } - - /** - * Track name + Track storeGateKey is returned according to selected - * Track collection in InDet -> Track -> TrackCollection listbox - * @return String - */ - protected String getReconstructedTracks() { - AData tracks = eventManager.getCurrentEvent().getTrackData("InDetTrack"); - String r = null; - if (tracks != null) { - r = tracks.getName() + tracks.getStoreGateKey(); - } - - return r; - - } // getReconstructedTracks() --------------------------------------------- - - /** - * Jet + Jet storeGateKey is returned according to selected - * Jet collection in ATLAS -> Jet -> JetCollection listbox - * @return String - */ - protected String getJets() { - AData jets = eventManager.getCurrentEvent().getJetData(); - String r = null; - if (jets != null) { - r = jets.getName() + jets.getStoreGateKey(); - } - - return r; - - } // getJets() ---------------------------------------------------------- - - /** - * RVx + RVx storeGateKey is returned according to selected - * vertex collection in InDet -> RecVertex -> VerteCollection listbox - * @return String - */ - protected String getRVx() { - AData rvx = eventManager.getCurrentEvent().getRVxData(); - String r = null; - if (rvx != null) { - r = rvx.getName() + rvx.getStoreGateKey(); - } - - return r; - - } // getRVx() ---------------------------------------------------------- - - protected AData getObjectCollection(String type) { - return eventManager.getCurrentEvent().getData(type); - } - - /** - * Cluster + Cluster storeGateKey is returned according to selected - * Cluster collection in Calo -> Cluster -> Cluster listbox - * @return String - */ - protected String getClusters() { - AData clusters = eventManager.getCurrentEvent().getClusterData(); - String r = null; - if (clusters != null) { - r = clusters.getName() + clusters.getStoreGateKey(); - } - - return r; - - } // getClusters() ------------------------------------------------------ - - public int[] getDrawList() { - return listdl; - - } // getDrawList() ------------------------------------------------------ - - /** Apply eta+-deltaEta cut to points (e.g. S3D) */ - protected void cutEta(float[] rho, float[] z) - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - boolean useEtaCut = par.getStatus(); - - if(useEtaCut) - { - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLower = etaMid - etaCut; - double etaUpper = etaMid + etaCut; - int num = 0; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double eta = AParameterUtilities.eta(z[list], rho[list]); - - if(eta - etaLower > 1.0e-6 && etaUpper - eta > 1.0e-6) - listdl[num++] = list; - } - numDraw = num; - } - } - - - /** Apply eta+-deltaEta cut to lines perpendicular to beam axis */ - protected void cutEtaDRho(float[] rho, float[] z, float[] drho) - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - boolean useEtaCut = par.getStatus(); - - if(useEtaCut) - { - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double eta1 = AParameterUtilities.eta(z[list], rho[list] + drho[list]); - double eta2 = AParameterUtilities.eta(z[list], rho[list] - drho[list]); - double etaLower = Math.min(eta1, eta2); - double etaUpper = Math.max(eta1, eta2); - - if(etaUpper - etaLowerCut > 1.0e-6 - && etaUpperCut - etaLower > 1.0e-6) - listdl[num++] = list; - } - numDraw = num; - } - } - - /** Apply eta+- deltaEta cut to lines parallel to beam axis */ - protected void cutEtaDZ(float[] rho, float[] z, float[] dz) - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - boolean useEtaCut = par.getStatus(); - - if(useEtaCut) - { - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double etaLower = AParameterUtilities.eta(z[list] - dz[list], rho[list]); - double etaUpper = AParameterUtilities.eta(z[list] + dz[list], rho[list]); - - if(etaUpper - etaLowerCut > 1.0e-6 - && etaUpperCut - etaLower > 1.0e-6) - listdl[num++] = list; - } - numDraw = num; - } - } - - /** apply eta+-deltaeta cut to lines (e.g. TRT) */ - protected void cutEtaDEta(float[] eta, float[] deta) - { - AParameter par = parameterStore.get("CutsATLAS", "CutEta"); - - if(!par.getStatus()) - return; - double etaCut = Math.abs(par.getD()); - double etaMid = parameterStore.get("CutsATLAS", "EtaMiddle").getD(); - double etaLowerCut = etaMid - etaCut; - double etaUpperCut = etaMid + etaCut; - int num = 0; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - double etaLower = eta[list] - deta[list]; - double etaUpper = eta[list] + deta[list]; - - if(etaUpper - etaLowerCut > 1.0e-6 - && etaUpperCut - etaLower > 1.0e-6) - listdl[num++] = list; - } - numDraw = num; - - } - - - - /** - * - * @param sourceDatatype name of the datatype according to - * which the cut is being done - * @param beingCutDatatype name of the datatype which is - * being cut - * @param cutOption integer value of the cut option in GUI - */ - protected void cutByAssociationTo(String sourceDatatype, - String beingCutDatatype, int cutOption) - { - if(cutOption == 0) - { - // SA select all - // do nothing, draw everything - return; - } - - AEvent ev = eventManager.getCurrentEvent(); - AData source = ev.get(sourceDatatype); - int[][] assoc = event.getAssociationManager().get(beingCutDatatype, sourceDatatype); - if (assoc == null || source == null) { - AData being = ev.get(beingCutDatatype); - String screenName; - if(being!=null)screenName= being.getNameScreenName(); - else screenName="null"; - logger.warn(screenName + " - null (" + beingCutDatatype + " - " - + sourceDatatype +") association, nothing to draw"); - // if 'connected' or 'unconnected' is selected and association - // or datatype to associate with doesn't exist, draw nothing - // (numDraw = 0) - numDraw = 0; - return; - } - - if(cutOption == 1) - { - // SC select connected - int num = 0; - // first remove those not connected to anything - for(int i = 0; i < numDraw; i++) - { - if(assoc[listdl[i]] != null) - { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - // if tracks exist apply cuts to them - numDraw = source.cutByAssociation(numDraw, listdl, assoc); - } - else if(cutOption == 2) - { - // SU select unconnected - int num = 0; - for(int i = 0; i < numDraw; i++) - { - if(assoc[listdl[i]] == null) - { - listdl[num++] = listdl[i]; - } - } - numDraw = num; - } - - } // cutByAssociationTo() ----------------------------------------------- - - - - private int cutByAssociation(int numDraw, int[] listdl, int[][] id) - { - // aaargh danger modifies input listdl - makeDrawList(); - boolean[] drawn = isDrawn(); - int num = 0; - - for(int i = 0; i < numDraw; i++) - { - int list = listdl[i]; - if(id[list] != null) - { - for(int j = 0; j < id[list].length; ++j) - { - int inverse = indexFromId.get(id[list][j]); - if(inverse != NO_INVERSE && drawn[inverse]) - listdl[num++] = list; - break; - } - } - } - numDraw = num; - return numDraw; - } - - /** - * return graphics attributes corresponding to layer =0 frame layer =1 hits - * or tracks type=0 noise type=1 non-noise - */ - public ADrawParameters getDrawParameters(int layer, int type) - { - boolean draw = true; - int singleColor = -1; - int size = 10; - int lineWidth = 1; - int symbol = 0; - int frameWidth = 0; - boolean forceSymbols = false; - int minSize = 0; - - AParameter forceSymbolsPar = parameterStore.getUnknown(PARAMETER_GROUP, "ForceSymbols"); - AParameter symbolSize = parameterStore.getUnknown(PARAMETER_GROUP, "SymbolSize"); - AParameter symbolType = parameterStore.getUnknown(PARAMETER_GROUP, "Symbol"); - AParameter lineWidthPar = parameterStore.getUnknown(PARAMETER_GROUP, "LineWidth"); - - if(forceSymbolsPar != null) - { - forceSymbols = forceSymbolsPar.getStatus(); - if(forceSymbols && symbolSize != null) - minSize = Math.max(symbolSize.getI(), 1); - } - - if(symbolSize != null) - size = symbolSize.getI(); - if(symbolType != null) - symbol = symbolType.getI(); - if(lineWidthPar != null) - lineWidth = lineWidthPar.getI(); - //for etmiss, line width scaled by energy by using the stroke setting - if(lineWidth<=0) - lineWidth = 1; - - if(type == 0) - { - AParameter noiseSymbolType = parameterStore.getUnknown(PARAMETER_GROUP, "Noise"); - - if(noiseSymbolType != null && noiseSymbolType.getStatus()) - { - AParameter noiseSymbolSize = parameterStore.getUnknown(PARAMETER_GROUP, "NoiseSize"); - AParameter noiseWidth = parameterStore.getUnknown(PARAMETER_GROUP, "NoiseWidth"); - - if(noiseSymbolSize != null) - size = noiseSymbolSize.getI(); - if(noiseWidth != null) - lineWidth = noiseWidth.getI(); - symbol = noiseSymbolType.getI(); - } - else - { - AParameter noiseWidth = parameterStore.getUnknown(PARAMETER_GROUP, "NoiseWidth"); - - if(noiseWidth != null && noiseWidth.getStatus()) - lineWidth = noiseWidth.getI(); - } - } - - if(layer == 0) - { - AParameter frameWidthPar = parameterStore.getUnknown(PARAMETER_GROUP, "FrameWidth"); - if(parameterStore.get(PARAMETER_GROUP, "Frame")!=null) - { - boolean drawFrame = parameterStore.get(PARAMETER_GROUP, "Frame").getStatus(); - singleColor = parameterStore.get(PARAMETER_GROUP, "Frame").getI(); - //only draw frames for Grey/BW color maps if is selected to draw frames - if(drawFrame && AColorMap.drawFrames()) - { - if(frameWidthPar != null) - frameWidth = frameWidthPar.getI(); - } - } - } - return new ADrawParameters(draw, singleColor, size, lineWidth, - frameWidth, symbol, forceSymbols, minSize, getDrawOrFill()); - } - - /** Provide an array of indices with increasing a, - * used e.g. by coloring. - * @param a - * @return - */ - protected int[] indexBy(double[] a) - { - int[] index = new int[a.length]; - - for(int i = 0; i < a.length; i++) - index[i] = i; - // this is only cosmetic improvement in appearance so if input data too - // large simply return null - if(a.length > 1000) - return index; - - for(int i = 0; i < a.length - 1; i++) - for(int j = i + 1; j < a.length; j++) - if(a[index[i]] > a[index[j]]) - { - int temp = index[i]; - index[i] = index[j]; - index[j] = temp; - } - return index; - } - - /** - * Colour items in this class by the associated class that is given by - * association. The difference with the method colorByAssociation is that - * colorBy is called on the target class, while colorByAssociation is called - * on the source class of the colour. (i.e. colour hits by tracks invokes - * AHitData.colorBy("Tracks"), calling ATrackData.colourByAssociation(...) - * internally. - * - * @param otherClass source class for the colours - */ - protected void colorBy(String otherClass) - { - AData source = eventManager.getCurrentEvent().get(otherClass); - byte unconnected = (byte) parameterStore.get(PARAMETER_GROUP, "Unconnected").getI(); - if(source != null) - { - byte shared = (byte) parameterStore.get(PARAMETER_GROUP, "Shared").getI(); - String assocKey = getFullName(); - int[][] assoc = event.getAssociationManager().get(otherClass, assocKey); - source.makeDrawList(); - source.color(); - source.colorByAssociation(this, assoc, unconnected, shared); - - } - else - { - /* - * given association doesn't exist. for instance, there are only - * hits in the event file and nothing to associate them with. - * if some 'association colouring' (e.g. colour by reconstructed - * track) is selected in that case, the items appear all in - * 'unconnected' colour. another option is to colour them in - * constant colour, simply by calling only colorByConstant(); - */ - for(int i = 0; i < numData; i++) - { - color[i] = (byte) unconnected; - } - } - - } // colorBy() ---------------------------------------------------------- - - protected void colorByObjects() - { - // initially set all with unconnected color, connected will be changed later - byte unconnectedColor = (byte) parameterStore.get(PARAMETER_GROUP, "Unconnected").getI(); - setColor(unconnectedColor); - String[] objectList = new String[] {"Jet", "BJet", "TauJet", "Photon", "Electron", "Muon"}; - for(int i=0; i<objectList.length; ++i) - { - if (parameterStore.get("Data", objectList[i]).getStatus()) - colorByObject(getObjectCollection(objectList[i])); - } - } - - private void colorByObject(AData objectData) - { - if(objectData == null) - { - return; - } - - AEnumeratorParameter listBox = (AEnumeratorParameter) parameterStore.get(getName(), getName() + "Collections"); - String selectedCollection = listBox.getCurrentText(); - if(!("All".equals(selectedCollection) || "None".equals(selectedCollection))) - { - String assName = getName(); - if(getName().indexOf("Track") >= 0) - assName = "Track"; - AAssociation assoc = event.getAssociationManager().getAssociation(objectData.getName()+objectData.getStoreGateKey(), assName); - if(assoc != null) - { - if(!(assoc instanceof AObjectsAssociation)) - { - logger.warn(getClass().getName() + ": no objects association is found!"); - return; - } - int[][] associatedIndex = ((AObjectsAssociation) assoc).getData(); - String[] associatedKey = ((AObjectsAssociation) assoc).getKey(); - - // if currently selected collection is included in associatedKey, show associations - // otherwise using the color set for unconnected cluster/track - int objectIndex = 0; - for(int i=0; i<associatedKey.length;) - { - // objectIndex is the index of the associated object (e.g. Electron) - // associatedIndex[objectIndex][] contain the index of the associated Cluster/Track - if ("none".equals(associatedKey[i])) - { - i++; - objectIndex++; - } - else - { - if (associatedKey[i].equals(selectedCollection)) - for(int j=0; j<associatedIndex[objectIndex].length; ++j) - setColor(associatedIndex[objectIndex][j], objectData.getColor()[objectIndex]); - i+=associatedIndex[objectIndex++].length; - } - } - } - } - } - - /** - * The same as name, but if it's multiple collection datatype, the full - * name is getName() + getStoreGateKey() - * @return String - */ - public String getFullName() - { - String k = this.getStoreGateKey(); - String full = this.getName() + (k != null ? k : ""); - return full; - } - - public int getIdFromIndex(int index) - { - return id[index]; - } - - // sets the color of each hit - protected final void color() - { - // standard scheme - internalColor(); - int[][] temp = AListManager.getInstance().getColorMapping(this); - int[] index = temp[0]; - int[] c = temp[1]; - // now add in colors specified in lists - - for(int i = 0; i < index.length; ++i) - if(c[i] >= 0) - color[index[i]] = (byte) c[i]; - int others = AListManager.getInstance().getColorOfOthers(); - // need to check if this data could have been picked - // so that coloring of hits by STr works even if STr - // is not in list because it wasn't on.... - if(others >= 0 && parameterStore.get("Data", getName()).getStatus()) - { - boolean[] inList = new boolean[numData]; - for(int i = 0; i < index.length; ++i) - inList[index[i]] = true; - - for(int i = 0; i < numData; ++i) - if(!inList[i]) - color[i] = (byte) others; - } - - - - } - - - /** Type = e.g. noise/good */ - public int[] getType(int[] dl) - { - return new int[dl.length]; - } - - // get data representation in user space in different projections - // empty by default - protected ACoord getYXUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getRZUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getYZUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getXZUser() - { - return ACoord.NO_DATA; - } - - protected ACoord get3DUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getUserUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getUserUser2() - { - return ACoord.NO_DATA; - } - - protected ACoord getFRUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getFZUser() - { - return ACoord.NO_DATA; - } - - protected ACoord getVPUser() - { - return ACoord.NO_DATA; - } - - public int getNumTypes() - { - return 1; - } - - - /** The only method from AListProcessor interface. */ - @Override - public Action[] getActions(Collection nodes) - { - return new Action[0]; - } // getActions() ------------------------------------------------------- - - /** - * Function to split a list of items seperated by - - */ - public String[] splitItems(String origItems) - { - char[] origItemsChar = origItems.toCharArray(); - int origItemsLength = origItems.length(); - int spacePosition=0, noOfItems=0, count=0; - //calculate the number of items - for(int i=0;i<origItemsLength;i++) - if((i!=0 && origItemsChar[i]=='-') || (i==origItemsLength-1 && origItemsChar[i]!='-')) - noOfItems++; - //split up the array into newItems - if(noOfItems>0) - { - //string array to hold individual items - String[] newItems=new String[noOfItems]; - for(int i=0;i<origItemsLength;i++) - { - if(i==0 && origItemsChar[i]=='-') - spacePosition=i+1;//ignore first'-' - else if(i==origItemsLength-1 && origItemsChar[i]!='-') - { - //store the text from previous '-' upto end if doesn't end with '-' - newItems[count]=origItems.substring(spacePosition,i+1); - spacePosition=i+1; - count++; - } - else if(origItemsChar[i]=='-' && i!=0) - { - //store the text from previous '-' upto current '-' - newItems[count]=origItems.substring(spacePosition,i); - spacePosition=i+1; - count++; - } - } - return newItems; - } - else - return null; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AEpsImageProducer.java b/graphics/AtlantisJava/src/atlantis/event/AEpsImageProducer.java deleted file mode 100644 index eef4e9615f1f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEpsImageProducer.java +++ /dev/null @@ -1,117 +0,0 @@ -package atlantis.event; - -import java.io.File; -import java.io.IOException; - -import atlantis.utils.*; -import atlantis.canvas.ACanvas; -import atlantis.graphics.encoders.AImageEncoder; -import java.awt.Dimension; - - -/** - * Implements ANewEventListener and creates EPS files - * upon each newEvent call. A scale factor allows to e.g. produce thumbnails by - * scaling down image. The image producer works in two modes: - * a) If no file name is given, a file name will be generated from run and event - * number. In case the output file exists, no file is created but a warning is written out. - * b) If a file name is given, a temporary file is generated first, and then - * renamed to the given file name. If renaming fails, a warning is written out - * and the temporary file is deleted. - * - * @author Sebastian Boeser - */ - -public class AEpsImageProducer extends AImageProducer -{ - // the logger - private static final ALogger logger = ALogger.getLogger(AEpsImageProducer.class); - - // Our image encode - private final AImageEncoder imageEncoder = new AImageEncoder(); - - /** - * Fully qualified constructor, - * intializing all the attributes and check the parameters validity - * @param dir the directory in which to save all the files - * @param size the dimensions of the images - * @param scale the factor by which to scale the images - * @param fileName if not null, that file will be overwritten for each event - * @throws InstantiationException if we fail to create the object - */ - public AEpsImageProducer(String dir, Dimension size, double scale, String fileName) throws InstantiationException - { - super(dir, size, scale, fileName); - } - - /** - * Called whenever a new event appears. Store an EPS in the directory, - * either with a generated file name (no overwrite) or with a fixed file name (overwrite) - * @param event the event from which to generate the EPS - */ - public void newEvent(AEvent event) - { - - //If auto had been set for size (height is negative), get height from Canvas - if (imageSize.height < 0) imageSize.setSize(imageSize.width, ACanvas.getCanvas().getRespectiveHeight(imageSize.width)); - - //Create the file to write the data into - File outFile; - //If we don't have a fixed file name, - //generate a unique one based on run- and event number - if (fixedFileName==null){ - - //Now construct all the full path for the file we want to save - String outFileName = String.format("%s%s%s.eps",directory, - System.getProperty("file.separator"), - getEventFileName(event)); - - // Create file handles to the file and check if it exists - outFile = new File(outFileName); - //Do not overwrite any existing files - if (outFile.exists()) { - logger.warn("File "+ outFileName +" already exists - will not overwrite"); - return; - } - //otherwise generate a temporary file first, - //then move it in place later - } else { - //make a temporary file in the final directory - try { - outFile = File.createTempFile(filePrefix+"_", ".eps",directory); - } catch (IOException ex) { - logger.warn("Failed to create temporary file in "+directory.getAbsolutePath()); - return; - } - } - - //Now try saving the acquired data, - //and if it shall go to a fixed file, move it there - try { - imageEncoder.saveEPS(imageSize.width, imageSize.height, outFile); - - //move to fixed file name if requested - if (fixedFileName != null){ - - //Get a handle to the final destination - File fixedFile = new File(directory,fixedFileName); - - //delete target if exits - if (fixedFile.exists() && (!fixedFile.delete())) - throw new IOException("Failed to delete existing file "+fixedFile.getAbsolutePath()); - - //And move the new file in place - if (!outFile.renameTo(fixedFile)) - throw new IOException("Failed to rename temporary file to "+fixedFile.getAbsolutePath()); - } - } catch (IOException ioe) { - //If we fail, throw a warning - logger.warn("Could not save EPS files for history\n"+ioe.toString()); - } finally { - //In any case, delete the pngFile, if it was just temporary - if (fixedFileName != null) outFile.delete(); - } - - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AEvent.java b/graphics/AtlantisJava/src/atlantis/event/AEvent.java deleted file mode 100755 index beeae482f160..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEvent.java +++ /dev/null @@ -1,1051 +0,0 @@ -package atlantis.event; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.TreeMap; -import java.util.LinkedHashMap; -import java.util.Set; - -import atlantis.list.AListManager; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.parameters.APar; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; -import atlantis.data.*; -import atlantis.globals.AGlobals; - -/** - * AEvent is the Container for an ATLAS physics event. - * It is identified by deriving from AEventInfo and holds a map of all the - * data that is available in the event. - * - */ -public class AEvent extends AEventInfo -{ - private static ALogger logger = ALogger.getLogger(AEvent.class); - - // container with all datatypes within the event - private Map<String,AData> data = new HashMap<String,AData>(); - // storegate keys for collections-aware datatypes - // Use parameterized type but keep Hashtable and Vector instead of HashMap - // and ArrayList until I work out if thread safety is an issue. - Ben 31/1/11 - private Hashtable<String,Vector<String>> collections = new Hashtable<String,Vector<String>>(); - - private AAssociationManager assocmgr = new AAssociationManager(); - - private static APar parameterStore = APar.instance(); - - /** - * @param eventNumber the event number - * @param runNumber the run number - * @param dateTime the date and time of the event - * @param sourceName the name of the event source - * @param lumiBlock the lumiBlock number - */ - public AEvent(String eventNumber, String runNumber, String dateTime, String sourceName, String lumiBlock, String eventProperties) { - - //Initialize event information - super(Integer.parseInt(eventNumber), Integer.parseInt(runNumber), dateTime, sourceName, lumiBlock, eventProperties); - - } // AEvent() ----------------------------------------------------------- - - /** - * @return the hashtable of available collections - */ - public Hashtable<String,Vector<String>> getCollections(){ - return collections; - } // getCollections() --------------------------------------------------- - - - public void add(AData dataSet) throws AAtlantisException - { - String name = dataSet.getClass().getName(); - - int index = name.lastIndexOf('.'); - if(index >= 0 && index < name.length() - 1) - { - name = name.substring(index + 1); - } - - // remove the "A" and "Data" - name = name.substring(1, name.length() - 4); - String newKey = dataSet.getStoreGateKey(); - - if(newKey == null) - { - // no storegatekey comes with this dataset (datatype) - // hash data shouldn't contain entry under sourceName key, if it does - // the old one is replaced - data.put(name, dataSet); - } - else - { - // just checking for the same key at the datatypes in the event - if(data.containsKey(name + newKey)) - { - String msg = "Error - datatype " + name + " with storeGateKey\n" + - newKey + " already exists in this event."; - AAtlantisException aaex = new AAtlantisException(msg); - // Stuck the trace in the logging for good measure - AD - logger.error("\n" + msg, aaex); - throw aaex; - } - else - { - data.put(name + newKey, dataSet); - // saving key of a particular sourceName (datatype) - Vector<String> keys = new Vector<String>(); - if(collections.containsKey(name)) - { - keys = collections.get(name); - if(keys.contains(newKey)) - { - String msg = "Previously read datatype " + name + "\n" + - "(different collection) contained " + - "storeGateKey " + newKey + ". Error."; - AAtlantisException aaex = new AAtlantisException(msg); - logger.error(msg, aaex); - throw aaex; - } - else - { - keys.add(newKey); - collections.put(name, keys); - } - } - else - { - keys.add(newKey); - collections.put(name, keys); - } - } - } - - } // add() --------------------------------------------------------------- - - - - - - // < get<DATA_TYPE> methods > ------------------------------------------- - - - public AData get(String name) - { - return data.get(name); - } - - public AData[] getData() - { - AData[] aData = new AData[data.size()]; - Collection<AData> collection = data.values(); - return collection.toArray(aData); - } - - - /** - * AJetData getJetData() - * returns collection of Jet datatype according to selected - * collection (Jet storeGateKey) in ATLAS -> Jet -> Jet Collection - * if 'all' (or 'none') is selected - returns null (no association will - * be taken into account) - * @return AJetData - */ - public AJetData getJetData() - { - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("Jet", "JetCollections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) -{ - logger.debug("AEvent.getJetData(): " + selectedKey + - " is selected in Jet->JetCollection, no association " + - " to Jet is taken into account, null is returned"); - return null; - } - else - { - AJetData jet = (AJetData) data.get("Jet" + selectedKey); - return jet; - } - } - - - // can combine with the other methods (e.g. getClusterData) - public AData getData(String type) - { - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get(type, type+"Collections"); - String selectedKey = (listBox == null) ? "" : listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) { - - logger.debug("AEvent.getData(String type): " + selectedKey + - " is selected in " + type + "->" + type + " Collections, " + - "no association to " + type + " is taken into account."); - - return null; - } - else - { - return data.get(type + selectedKey); - } - } - - /** - * AClusterData getClusterData() - * returns collection of Cluster datatype according to selected - * collection (Cluster storeGateKey) in ATLAS -> Cluster -> Cluster Collection - * if 'all' (or 'none') is selected - returns null (no association will - * be taken into account) - * @return AClusterData - */ - public AClusterData getClusterData() - { - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("Cluster", "ClusterCollections"); - String selectedKey = listBox.getCurrentText(); - if ("All".equals(selectedKey) || "None".equals(selectedKey)) { - - logger.debug("AEvent.getClusterData(): " + selectedKey + - " is selected in Cluster->ClusterCollection, no association " + - " to Cluster is taken into account, null is returned"); - - return null; - } - else - { - AClusterData cluster = (AClusterData) data.get("Cluster" + selectedKey); - return cluster; - } - } - - - /** - * ATrackData getTrackData(String type) - * type is InDetTrack, MuonTrack - the internal datatype sourceName for Track - * returns collection of Track datatype according to selected - * collection (Track storeGateKey) in InDet -> Track -> TrackCollection - * if 'all' (or 'none') is selected - returns null (no association will - * be taken into account) - * @param type String - * @return ATrackData - */ - public ATrackData getTrackData(String type) - { - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get(type, type + "Collections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) - { - logger.debug("AEvent.getTrackData(" + type + "): " + selectedKey + - " is selected in Track->TrackCollection, no association " + - " to Track is taken into account, null is returned"); - return null; - } - else - { - ATrackData track = (ATrackData) data.get(type + selectedKey); - return track; - } - } - - - /** - * ATrackData getTrackData(String type, String key) - * returns specified collection of Track datatype if it exists - * @param type String - * @param key String - * @return ATrackData - */ - public ATrackData getTrackData(String type, String key) - { - Vector<String> keys = collections.get(type); - if(keys == null) { - logger.warn("AEvent: " + type + " datatype doesn't exist " + - "in current event"); - return null; - } - else - { - if(keys.contains(key)) - { - return (ATrackData) data.get(type + key); - } - else { - - logger.warn("AEvent: " + type + " datatype: storeGateKey " + - key + " doesn't exist in current event"); - return null; - } - } - } - - - - - public ASTrData getSTrData() - { - return (ASTrData) data.get("STr"); - } - - public ASNPData getSNPData() - { - return (ASNPData) data.get("SNP"); - } - - public APixelClusterData getPixelClusterData() - { - return (APixelClusterData) data.get("PixelCluster"); - } - - public ASiClusterData getSiClusterData() - { - return (ASiClusterData) data.get("SiCluster"); - } - - public AS3DData getS3DData() - { - return (AS3DData) data.get("S3D"); - } - - public ATRTData getTRTData() - { - return (ATRTData) data.get("TRT"); - } - - public ALArData getLArData() - { - return (ALArData) data.get("LAr"); - } - - public ATILEData getTILEData() - { - return (ATILEData) data.get("TILE"); - } - - public AHECData getHECData() - { - return (AHECData) data.get("HEC"); - } - - public AFCALData getFCALData() - { - return (AFCALData) data.get("FCAL"); - } - - public AMBTSData getMBTSData() - { - return (AMBTSData) data.get("MBTS"); - } - - //Because some things need to access the data before the parameters are filled, another method - //for accessing the data has been added. This method first checks the list of available storegate keys - //and see's if there is one starting with MDT. As the dataType + storegatekey is hard coded into how - //the hash map keys are created this should be a stable way of doing it. If there are multiple - //results for the search, it then checks which one is currently selected by the user. - - public AMDTData getMDTData() - { - Vector<String> storeGateKeys = new Vector<String>(); - Set<String> keys = data.keySet(); - for(String entry : keys){ - if(entry.startsWith("MDT")){ - storeGateKeys.add(entry); - } - } - if(storeGateKeys.size() == 1){ - return (AMDTData) data.get(storeGateKeys.get(0)); - }else{ - - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("MDT", "MDTCollections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) - { - logger.debug("AEvent.getMDTata(): " + selectedKey + - " is selected in MDT->MDTCollection, no association " + - " to MDT is taken into account, null is returned"); - return null; - - } - else{ - AMDTData mdt = (AMDTData) data.get("MDT" + selectedKey); - return mdt; - } - - - } - - } - - //See description for getMDTData - - public ARPCData getRPCData() - { - - Vector<String> storeGateKeys = new Vector<String>(); - Set<String> keys = data.keySet(); - for(String entry : keys){ - if(entry.startsWith("RPC")){ - storeGateKeys.add(entry); - } - } - if(storeGateKeys.size() == 1){ - return (ARPCData) data.get(storeGateKeys.get(0)); - }else{ - - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("RPC", "RPCCollections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) - { - logger.debug("AEvent.getRPCData(): " + selectedKey + - " is selected in RPC->RPCCollection, no association " + - " to RPC is taken into account, null is returned"); - return null; - - } - else{ - ARPCData rpc = (ARPCData) data.get("RPC" + selectedKey); - return rpc; - } - - - } - } - //See description for getMDTData - - public ATGCData getTGCData() - { - Vector<String> storeGateKeys = new Vector<String>(); - Set<String> keys = data.keySet(); - for(String entry : keys){ - if(entry.startsWith("TGC")){ - storeGateKeys.add(entry); - } - } - if(storeGateKeys.size() == 1){ - return (ATGCData) data.get(storeGateKeys.get(0)); - }else{ - - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("TGC", "TGCCollections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) - { - logger.debug("AEvent.getTGCData(): " + selectedKey + - " is selected in TGC->TGCCollection, no association " + - " to TGC is taken into account, null is returned"); - return null; - - } - else{ - ATGCData tgc = (ATGCData) data.get("TGC" + selectedKey); - return tgc; - } - - - } - } - //See description for getMDTData - - public ACSCDData getCSCDData() - { - Vector<String> storeGateKeys = new Vector<String>(); - Set<String> keys = data.keySet(); - for(String entry : keys){ - if(entry.startsWith("CSC")){ - storeGateKeys.add(entry); - } - } - if(storeGateKeys.size() == 1){ - return (ACSCDData) data.get(storeGateKeys.get(0)); - }else{ - - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("CSC", "CSCCollections"); - String selectedKey = listBox.getCurrentText(); - if("All".equals(selectedKey) || "None".equals(selectedKey)) - { - logger.debug("AEvent.getCSCData(): " + selectedKey + - " is selected in CSC->CSCCollection, no association " + - " to CSC is taken into account, null is returned"); - return null; - - } - else{ - ACSCDData csc = (ACSCDData) data.get("CSC" + selectedKey); - return csc; - } - - - } - } - - public ASVxData getSVxData() - { - return (ASVxData) data.get("SVx"); - } - - public ARVxData getRVxData() - { - AEnumeratorParameter listBox = - (AEnumeratorParameter) parameterStore.get("RVx", "RVxCollections"); - String selectedKey = listBox.getCurrentText(); - if ("All".equals(selectedKey)) { - - logger.debug("AEvent.getRVxData(): " + selectedKey + - " is selected in InDet->RecVertex, no association " + - " to vertex is taken into account, null is returned"); - - return null; - } else if ("None".equals(selectedKey)) { - // Return collection without for backwards compatibility - return (ARVxData) data.get("RVx"); - } else - { - ARVxData rvx = (ARVxData) data.get("RVx" + selectedKey); - return rvx; - } - } - - public ATrigS3DData getTrigS3DData() - { - return (ATrigS3DData) data.get("TrigS3D"); - } - - public ALVL1TriggerTowerData getLvl1TriggerTowerData() - { - return (ALVL1TriggerTowerData) data.get("LVL1TriggerTower"); - } - - public ALVL1ResultData getLvl1ResultData() - { - return (ALVL1ResultData) data.get("LVL1Result"); - } - - public ALVL1JetElementData getLvl1JetElementData() - { - return (ALVL1JetElementData) data.get("LVL1JetElement"); - } - - public ATriggerInfoData getTriggerInfoData() - { - return (ATriggerInfoData) data.get("TriggerInfo"); - } - - /** - * This function returns the names currently selected for a certain collection - * which has its data draw status set to true - * @param collectionType String sourceName of the collection - * @return string of collection names length 0 if none in event - */ - public String[] getActiveCollectionNames(String collectionType) - { - //LVL1Result is not on the Data list as it is always on hence check this first - boolean collectionStatus = collectionType.equals("LVL1Result"); - if(!collectionStatus) - collectionStatus=parameterStore.get("Data", collectionType).getStatus(); - if (collectionStatus) - { - return getCollectionNames(collectionType); - } - else - return new String[0]; - } - - /** - * This function returns the names currently selected for a certain collection - * @param collectionType String sourceName of the collection - * @return string of collection names length 0 if none in event - */ - public String[] getCollectionNames(String collectionType) - { - String[] col; - Vector<String> keys = collections.get(collectionType); - if (keys != null) - { - String[] collec = keys.toArray(new String[keys.size()]); - AEnumeratorParameter listBox = (AEnumeratorParameter) parameterStore.get(collectionType, collectionType + "Collections"); - String currentSelection = listBox.getCurrentText(); - int count=0; - //count how many items in list - for (int i = 0; i < collec.length; i++) - { - if ("All".equals(currentSelection) || collec[i].equals(currentSelection)) - count++; - } - col=new String[count]; - count=0; - //now save items into string array - for (int i = 0; i < collec.length; i++) - { - if ("All".equals(currentSelection) || collec[i].equals(currentSelection)) - { - col[count] = collectionType + collec[i]; - count++; - } - } - return col; - } - else - return new String[0]; - } - - // </ get<DATA_TYPE> methods > -------------------------------------------- - - public List<ACalorimeterData> getCalorimeters() - { - List<ACalorimeterData> v = new ArrayList<ACalorimeterData>(); - Iterator<AData> i = data.values().iterator(); - while(i.hasNext()) - { - AData data = i.next(); - if(data instanceof ACalorimeterData) - { - ACalorimeterData calorimeter = (ACalorimeterData) data; - if(parameterStore.get("Data", calorimeter.getCalorimeterName()).getStatus() && - (parameterStore.getUnknown("Det", calorimeter.getCalorimeterName() + "Fill") == null - || parameterStore.get("Det", calorimeter.getCalorimeterName() + "Fill").getStatus())) - { - v.add(calorimeter); - } - } - } - return v; - - } // getCalorimeters() --------------------------------------------------- - - - - public List<AData> getHitsAndTracks(AProjection projection) - { - int mode = parameterStore.get(projection.getName(), "Mode").getI(); - String[][] det = new String[0][0]; - String[] simTr = new String[0]; - String[] recTr = new String[0]; - String[] hits = new String[0]; - String[] aod = new String[0]; - - if(mode == 0 || projection instanceof AProjectionVP - || projection instanceof AProjectionLegoPlot) - { - simTr = new String[] { "STr", "SNP", "SMTr" }; - recTr = new String[] { "InDetSegment", "MuonSegment", "G4Step", - "InDetTrack", "MuonTrack" }; - - aod = new String[] {"CompositeParticle", "BJet", "TauJet", "Photon", "Electron", "Muon" }; - - if(parameterStore.get("InDetDrawingOrder", "SpacePoints").getI() == 0) - { - hits = new String[] {"UserHit", "RVx", "TRT", "SiCluster", - "SiClusterRDO", "S3D", "PixelCluster", "PixelRDO", "TrigS3D", - "MDT", "CSCD", "CSC", "RPC", "R3D", "TGC", "T3D", "SVx", - "Jet", "EmTauROI", "Particle", "Cluster", "ETMis", - "JetROI", "MuonROI", "LVL1TriggerTower", "LVL1JetElement"}; - } - else - { - hits = new String[] {"UserHit", "RVx", "TRT", "SiCluster", - "SiClusterRDO", "TrigS3D", "S3D", "PixelCluster", "PixelRDO", - "MDT", "CSCD", "CSC", "RPC", "R3D", "TGC", "T3D", "SVx", - "Jet", "EmTauROI", "Particle", "Cluster", "ETMis", - "JetROI", "MuonROI", "LVL1TriggerTower", "LVL1JetElement"}; - } - } - else if(projection instanceof AProjectionYX - || projection instanceof AProjectionFR) - { - if(mode >= AProjectionYX.MODE_MDT_INNER && mode <= AProjectionYX.MODE_MDT_OUTER) - { - simTr = new String[] { "SMTr", "SMTr" }; - recTr = new String[] { "MuonTrack", "MuonSegment" }; - if(mode == AProjectionYX.MODE_MDT_INNER) - { - hits = new String[] { "MDT", "CSCD", "CSC" }; - } - else - { - hits = new String[] { "MDT" }; - } - } - else if(mode < AProjectionYX.MODE_MDT_INNER) - { - simTr = new String[] { "SMTr", "SMTr" }; - recTr = new String[] { "MuonTrack", "MuonSegment" }; - hits = new String[] { "TGC", "T3D" }; - } - } - else if(projection instanceof AProjectionFZ) - { - if(mode >= 4) - { - simTr = new String[] { "SMTr", "SMTr" }; - recTr = new String[] { "MuonTrack", "MuonSegment" }; - hits = new String[] { "MDT" }; - } - else - { - simTr = new String[] { "SMTr", "SMTr" }; - recTr = new String[] { "MuonTrack", "MuonSegment" }; - hits = new String[] { "RPC", "R3D" }; - } - } - - if(parameterStore.get("InDetDrawingOrder", "SpacePointsTracks").getI() == 0) - { - // Simulated tracks, reconstructed tracks, hits - det = new String[][] { simTr, recTr, hits, aod }; - } - else if(parameterStore.get("InDetDrawingOrder", "SpacePointsTracks").getI() == 1) - { - // Simulated tracks, hits, reconstructed tracks - det = new String[][] { simTr, hits, recTr, aod }; - } - else - { - // Reconstructed tracks, hits, simulated tracks - det = new String[][] { recTr, hits, simTr, aod }; - } - - AEnumeratorParameter listBox = null; - List<AData> v = new ArrayList<AData>(); - for(int i = 0; i < det.length; ++i) - { - for(int j = 0; j < det[i].length; ++j) - { - if(collections.containsKey(det[i][j])) - { - Vector<String> keys = collections.get(det[i][j]); - String[] array; - array = keys.toArray(new String[keys.size()]); - // GUI listbox sourceName datatype + "Collections" - listBox = (AEnumeratorParameter) parameterStore.get(det[i][j], - det[i][j] + "Collections"); - String currentSelection = listBox.getCurrentText(); - for(int c = 0; c < array.length; c++) - { - if("All".equals(currentSelection) || - array[c].equals(currentSelection)) - { - AData a = data.get(det[i][j] + array[c]); - processDataSet(v, a); - } - } - } - else - { - AData a = data.get(det[i][j]); - processDataSet(v, a); - } - } - } - return v; - - } // getHitsAndTracks() ------------------------------------------------- - - - private static void processDataSet(List<AData> v, AData a) - { - if(a != null) - { - if(parameterStore.getUnknown("Data", a.getName()) != null && - parameterStore.get("Data", a.getName()).getStatus() && - (parameterStore.getUnknown("Det", a.getName() + "Fill") == null || - parameterStore.get("Det", a.getName() + "Fill").getStatus())) - { - v.add(a); - } - } - - } // processDataSet() --------------------------------------------------- - - - - public List<ACalorimeterData> getElectromagneticCalorimeters() - { - List<ACalorimeterData> v = new ArrayList<ACalorimeterData>(); - Iterator<AData> i = data.values().iterator(); - while(i.hasNext()) - { - AData a = i.next(); - if(a instanceof ALArData || a instanceof AFCALData) - { - v.add((ACalorimeterData)a); - } - } - return v; - - } // getElectromagneticCalorimeters() ------------------------------------ - - - - public List<ACalorimeterData> getHadronicCalorimeters() - { - List<ACalorimeterData> v = new ArrayList<ACalorimeterData>(); - Iterator<AData> i = data.values().iterator(); - while(i.hasNext()) - { - AData a = i.next(); - if(a instanceof ATILEData || a instanceof AHECData - || a instanceof AFCALData || a instanceof AMBTSData) - { - v.add((ACalorimeterData)a); - } - } - return v; - - } // getHadronicCalorimeters() ------------------------------------------- - - - - /** - * setPrimaryVertex() called during event finalisation - * sets Event: XVtx, YVtx, ZVtx in the internal parameter store - * (in GUI: Projection -> eta-phi -> XVtx, YVtx, ZVtx) - - * 1) gets values from RecVertex (RVx) - see conditions in ARVxData class - * 2) gets values from simulated vertices with highest pt sum (STr) - * 3) if above fail, sets 0.0, 0.0, 0.0 - * - * (taking primary vertex from reconstructed tracks was removed) - * - */ - public void setPrimaryVertex() - { - double[] vtx = null; - - // (1) - if(getRVxData() != null) - { - // RVx data exists, try to retrieve primary vertex information - vtx = getRVxData().getPrimaryVertex(); - } - // (2) - if(vtx == null && getSTrData() != null) - { - // STr data exists, try to get primary vertex information - int vtxIndex = getSTrData().getMaxSumPtVertex(); - - //retrieve that vertex - vtx = getSVxData().getVertex(vtxIndex); - - //Completely unclear to me... why 4? - if(vtx[0] * vtx[0] + vtx[1] * vtx[1] > 4.) - { - logger.info("replacing primary with first"); - logger.info(" was " + vtx[0] + " " + vtx[1] + " " + vtx[2]); - vtx = getSVxData().getVertex(0); - if(vtx[0] * vtx[0] + vtx[1] * vtx[1] > 4.) - { - vtx[0] = 0.; - vtx[1] = 0.; - vtx[2] = 0.; - } - logger.info(" now is " + vtx[0] + " " + vtx[1] + " " + vtx[2]); - } - } - - if(vtx == null) - { - vtx = new double[] { 0.0, 0.0, 0.0 }; - } - - parameterStore.get("Event", "XVtx").setD(vtx[0]); - parameterStore.get("Event", "YVtx").setD(vtx[1]); - parameterStore.get("Event", "ZVtx").setD(vtx[2]); - - AOutput.append("\n\nPrimary vertex set for projection " + - AMath.PHI + AMath.ETA + ":\n" + - " XVtx = " + String.format("%.5f",vtx[0]) + " cm\n" + - " YVtx = " + String.format("%.5f",vtx[1]) + " cm\n" + - " ZVtx = " + String.format("%.5f",vtx[2]) + " cm\n", ALogInterface.NORMAL); - - } // setPrimaryVertex() ------------------------------------------------- - - - - /** - * Finalize event construction: - * - finalize all data objects - * - set primary vertex - * - calculate the number of hits on a track - * - create associations - * - update collections - * @return the event - */ - public AEvent finalizeEvent() - { - - // setting primary vertex must be done before finalizeConstruction() - // happens on datatypes! - setPrimaryVertex(); - - Iterator<AData> iter = data.values().iterator(); - while(iter.hasNext()) - { - AData data = iter.next(); - if(data instanceof AData) - { - try { - ((AData) data).finalizeConstruction(); - } catch ( Exception e ){ - //Get sourceName of the object where the error occured - String ObjName = ((AData)data).getFullName(); - logger.error("Exception while finalizing construction of "+ObjName,e); - AOutput.append("\n\nError while constructing " + ObjName +"\n", ALogInterface.WARNING); - AOutput.append(" - object will not be shown!\n",ALogInterface.WARNING); - iter.remove(); - - } - } - } - - if (!AGlobals.isAtlantisHeadless()) { - AListManager.getInstance().resetAndPreserveInvisible(); - } - - // are there any RVx read in from the event file? if so, cut the tracks - // which form vertices (when drawn as helices) to the reconstructed - // vertices. - ARVxData rvxData = this.getRVxData(); - if(rvxData != null) - { - rvxData.cutTracksToRVx(this); - } - - assocmgr.correct(); - - return this; - - } // AEvent finalizeEvent() --------------------------------------------- - - - /** - * Returns information about datatypes and number of items datatypes in - * the current event - * First item of the result array is the datatype sourceName followed - * by ":<storeGateKey>" if that exists for a datatype and second item is - * integer number (numData). - * The array is alphabetically sorted. - * - * @return String[][] - */ - public String[][] getInfo() - { - AData[] sources = getData(); - Map<String,String> m = new LinkedHashMap<String,String>(); - m.clear(); - for(int i = 0; i < sources.length; i++) - { - String sg = sources[i].getStoreGateKey(); - String a = sources[i].getNameScreenName(); - a += sg != null ? ":" + sg : ""; - m.put(a, String.valueOf(sources[i].getNumData())); - } - - TreeMap<String,String> tm = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER); - tm.clear(); - tm.putAll(m); - - String[][] s = new String[tm.size()][2]; - int i = 0; - for(Iterator<String> iter = tm.keySet().iterator() ; iter.hasNext() ; i++) - { - String key = iter.next(); - s[i][0] = key; - s[i][1] = tm.get(key); - } - - return s; - - } // getInfo() ----------------------------------------------------------- - - - /** - * Returns information about datatypes and number of items datatypes in - * the current event drawn for all event data, and data passing cuts - * First item of the result array is the datatype sourceName followed - * by ":<storeGateKey>" if that exists for a datatype and second/third items are - * integer number (numData, numDraw). - * The array is alphabetically sorted. - * - * @return String[][] - */ - public String[][] getInfoDraw() - { - AData[] sources = getData(); - Map<String,String> m = new LinkedHashMap<String,String>(); - m.clear(); - Map<String,String> mDraw = new LinkedHashMap<String,String>(); - mDraw.clear(); - - for(int i = 0; i < sources.length; i++) - { - String sg = sources[i].getStoreGateKey(); - String a = sources[i].getNameScreenName(); - a += sg != null ? ":" + sg : ""; - m.put(a, String.valueOf(sources[i].getNumData())); - mDraw.put(a, String.valueOf(sources[i].getNumDraw())); - } - - TreeMap<String,String> tm = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER); - tm.clear(); - tm.putAll(m); - TreeMap<String,String> tmDraw = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER); - tmDraw.clear(); - tmDraw.putAll(mDraw); - - - String[][] s = new String[tm.size()][3]; - int i = 0; - for(Iterator<String> iter = tm.keySet().iterator() ; iter.hasNext() ; i++) - { - String key = iter.next(); - - s[i][0] = key; - s[i][1] = tm.get(key); - s[i][2] = tmDraw.get(key); - } - - return s; - - } // getInfoDraw() ----------------------------------------------------------- - - - /** - * Get coordinates of event vertex. - * - * The coordinates are obtained from the parameter store rather than - * from the event itself, since the vertex position can be changed by the - * user through the GUI. - * - * @return (x,y,z) of vertex - */ - public double[] getPrimaryVertex() - { - return AParameterUtilities.getPrimaryVertex(); - } - - public AAssociationManager getAssociationManager() { - return assocmgr; - } - - -} // class AEvent ------------------------------------------------------------ diff --git a/graphics/AtlantisJava/src/atlantis/event/AEventInfo.java b/graphics/AtlantisJava/src/atlantis/event/AEventInfo.java deleted file mode 100644 index 0fe0aca7a014..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEventInfo.java +++ /dev/null @@ -1,212 +0,0 @@ -package atlantis.event; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Comparator; -import java.util.Date; - -/** - * The AEventInfo class summarizes the information that uniquely identifies a event. - * It also provides an "equals" function allowing to compare if two events are identical. - * @author sboeser - */ -public class AEventInfo { - - // number of the run of the event - private final long runNumber; - // event number in a run - private final long eventNumber; - // Athena time when XML event file was made in JiveXML - private final String dateTime; - // the name of the source this event was coming from (filename, servername, ...) - private final String sourceName; - // the lumiBlock number - private final String lumiBlock; - // Any additional eventProperties that may be important - private final String eventProperties; - // any additional info that is needed - - //the date format to use with the event info - public final static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); - - /** - * Fully qualified constructor - * @param run the run number - * @param event the event number - * @param time the date and time of the event - */ - AEventInfo(long event, long run, String time, String source, String lumiBlock, String eventProperties){ - this.runNumber = run; - this.eventNumber = event; - this.dateTime = time != null ? time : "n/a"; - this.sourceName = source != null ? source : "n/a"; - this.lumiBlock = checkString(lumiBlock); - this.eventProperties = checkString(eventProperties); - } - - /** - * Copy constructor - * @param the evenInfo object to copy - */ - AEventInfo(AEventInfo event){ - this(event.getEventNumber(),event.getRunNumber(), - event.getDateTime(),event.getSourceName(), - event.getLumiBlock(),event.getEventProperties()); - } - - /** - * @return the run number - */ - public long getRunNumber() { - return runNumber; - } // getRunNumber() ----------------------------------------------------- - - /** - * @return the event number - */ - public long getEventNumber(){ - return eventNumber; - } // getEventNumber() --------------------------------------------------- - - - /** - * @return the date and time of the event - */ - public String getDateTime() { - return dateTime; - } // getEventNumber() --------------------------------------------------- - - /** - * @return the name of the event source - */ - public String getSourceName() { - return sourceName; - } // getSourceName() ---------------------------------------------------------- - - /** - * @return the lumiBlock - */ - public String getLumiBlock() { - return lumiBlock; - } // getSourceName() ---------------------------------------------------------- - - /** - * @return the eventProperties - */ - public String getEventProperties() { - return eventProperties; - } // getSourceName() ---------------------------------------------------------- - - - - /** - * Performs test to see if there is a valid value for send string - */ - private String checkString(String receivedString){ - String temp; - if(receivedString == null || receivedString.endsWith("-1")){ - temp = "default"; - }else{ - temp = receivedString; - } - return temp; - } - - - - - /** - * Check whether this event is identical to the event described by info - * @param info the event information for the event to compare to - * @return true if identical - */ - // FIXME: Should take Object as argument. Need to consider how to deal with - // subclasses like AEvent. - public boolean equals(AEventInfo info){ - //check if info is valid - if (info == null) return false; - //Only compare run- and event number and time, source may be different - return ((info.getRunNumber() == runNumber)&& - (info.getEventNumber() == eventNumber)); - } - -// Need to override hashCode() to guarantee correct behaviour of equals() -@Override -public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (eventNumber ^ (eventNumber >>> 32)); - result = prime * result + (int) (runNumber ^ (runNumber >>> 32)); - return result; -} - - -/** - * Implementation of Comparable interface - sort events by run- and event number - */ - public static class RunEventNumberComparator implements Comparator { - - /** - * @param o1 , o2 the two eventInfo objects to compare - * @return negative/zero/positive int if o1 is less/equal/larger than o2 - */ - public int compare(Object o1, Object o2) { - - /** - * Cast to an event info object - if this fails, someone has mixed this with - * another class in a collection and we better crash with ClassCastException than catch - */ - AEventInfo info1 = (AEventInfo)o1; - AEventInfo info2 = (AEventInfo)o2; - - //compare by run number first - Long run = info1.getRunNumber(); - if (run.compareTo(info2.getRunNumber()) != 0) - return run.compareTo(info2.getRunNumber()); - - //otherwise return by event number - Long event = info2.getEventNumber(); - return event.compareTo(info2.getEventNumber()); - } - } - - /** - * Implementation of Comparable interface - sort events by date and time - */ - public static class DateTimeComparator implements Comparator { - - /** - * @param o1 , o2 the two eventInfo objects to compare - * @return negative/zero/positive int if o1 is less/equal/larger than o2 - */ - public int compare(Object o1, Object o2) { - - /** - * Cast to an event info object - if this fails, someone has mixed this with - * another class in a collection and we better crash with ClassCastException than catch - */ - AEventInfo info1 = (AEventInfo)o1; - AEventInfo info2 = (AEventInfo)o2; - - //return zero for events that are equal - if (info1.equals(info2)) return 0; - - //Now get date and time objects - Date date1 = null; Date date2=null; - try { - date1 = dateTimeFormat.parse(info1.getDateTime()); - date2 = dateTimeFormat.parse(info2.getDateTime()); - } catch (ParseException pex) { - throw new ClassCastException("Parse exception when comparing dates"); - } - - //If there is not date assoicated with any of these, throw an exception - if ((date1==null)||(date2==null)) - throw new ClassCastException("Could not parse valid date comparing " - +info1.getDateTime()+" to "+info2.getDateTime()); - - //Finally, compare the two dates - return date1.compareTo(date2); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AEventInfoPrinter.java b/graphics/AtlantisJava/src/atlantis/event/AEventInfoPrinter.java deleted file mode 100644 index 174eed015a78..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEventInfoPrinter.java +++ /dev/null @@ -1,60 +0,0 @@ -package atlantis.event; - -import atlantis.globals.AGlobals; -import atlantis.output.ALogInterface; - -/** - * Print event information for each new event to the log pane - * @author sboeser - */ -public class AEventInfoPrinter implements ANewEventListener { - - private ALogInterface logPane = null; - - /** - * Constructor with the log pane where the information shall be printed - * @param output the output pane to which to write - */ - public AEventInfoPrinter(ALogInterface output){ - logPane = output; - } - - private void printEventInfo(AEvent event, ALogInterface dest) - { - //For Minerva just output name and coded event and run numbers - //Not on canvas title, but teachers may want to see the number to help - //with recognising difficult events - if(AGlobals.instance().getSimpleOutput()>0) - { - String r = "\n" + event.getSourceName() + - " (" + event.getRunNumber() + "00"+ event.getEventNumber() + ")\n"; - dest.append(r + "\n", ALogInterface.NORMAL); - return; - } - - int lineLen = 39; - String r = "\n" + event.getSourceName() + "\n" + - "run number: " + event.getRunNumber() + - " event number: " + event.getEventNumber() + "\n" + - "--------------------------------------\n"; - - String[][] s = event.getInfo(); - - for(int i = 0; i < s.length; i++) - { - r += String.format("%-"+lineLen+"s", s[i][0]) + ": " + s[i][1] + "\n"; - } - dest.append(r + "\n", ALogInterface.NORMAL); - - } // printEventInfo() ---------------------------------------------------*/ - - /** - * For each new event print log information to the log pane - * @param event the change event - */ - public void newEvent(AEvent event) { - //simply print it - printEventInfo(event,logPane); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AEventManager.java b/graphics/AtlantisJava/src/atlantis/event/AEventManager.java deleted file mode 100755 index ba5b27b035be..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEventManager.java +++ /dev/null @@ -1,319 +0,0 @@ -package atlantis.event; - -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.event.AEventSource.NavigationMode; -import atlantis.event.oncrpc.AONCRPCEventSource; -import atlantis.event.xmlrpc.AXMLRPCEventSource; -import java.util.Vector; - -import atlantis.utils.ALogger; - -/** - * All new physics events come into Atlantis via the AEventManager - * The AEventManager may hold a list of event, has the index of the - * current event int the list and informs its listeners about new events. - * Only one event can be active at one time. - * - * @author sboeser - */ -public class AEventManager -{ - private final static ALogger logger = ALogger.getLogger(AEventManager.class); - private static AEventManager instance; - - /** Private constructor for singleton. */ - private AEventManager() {} - - /** Get the singleton instance. */ - public synchronized static AEventManager instance() { - if (instance==null) instance = new AEventManager(); - return instance; - } - - //The current event source - private AEventSource eventSource = null; - - //The current event - i.e. the last delivered by any event source - private AEvent currentEvent = null; - - //A list of listeners for new events - private Vector<ANewEventListener> NewEventListeners = new Vector<ANewEventListener>(); - - //A list of listeners for new events sources - private Vector<ANewEventSourceListener> NewEventSourceListeners = new Vector<ANewEventSourceListener>(); - - /** - * Return the currently active event - * @return AEvent - */ - public synchronized AEvent getCurrentEvent() - { - //simply return the current event - return currentEvent; - } - - - /** - * Set the event with the given index as the current event - * @param index the index of the new event - */ - private synchronized void setCurrentEvent(AEvent event) - { - //Now simply set the current event - currentEvent = event; - //Inform all listeners - fireNewEvent(getCurrentEvent()); - } - - - /** - * @return the current active event source - */ - public synchronized AEventSource getEventSource(){ - return eventSource; - } - - /** - * Set a new already constructed event source. Note that this constructor - * does not throw InvalidEventSource exception as the AEventSource object - * is already constructed. - * @param source the AEventSource object - */ - public synchronized void setEventSource( AEventSource source ) - { - //Simply set the source and we are done - eventSource = source; - fireNewEventSource(getEventSource()); - } - - - /** - * Set the source given by name as new event source. If the event source is - * not valid (e.g invalid file name) we rely on the constructor to fail, throwing - * an InvalidEventSourceException. Thus, the old source is retained if the new one - * can not be created. - * @param sourceName the name of the source (e.g. file name, url, server name,...) - * @throws InvalidEventSourceException - */ - public synchronized void setEventSource(String sourceName) throws InvalidEventSourceException - { - //Make a nice string out of it - String theSourceName = sourceName.toLowerCase().trim(); - - // XMLRPC Server source given as "xmlrpc://server:port" - if(theSourceName.startsWith("xmlrpc://")) { - eventSource = new AXMLRPCEventSource(sourceName); - // ONCRPC Server source given as "oncrpc://server[:port]" - } else if(theSourceName.startsWith("oncrpc://")) { - eventSource = new AONCRPCEventSource(sourceName); - // Metwork sources possibilities - // .xml, .zip or web directory containing event files - } else if(theSourceName.startsWith("http://")) { - // normal xml file - if(theSourceName.endsWith(".xml")){ - eventSource = new AURLEventSource(sourceName); - // zip file on the web - } else if(theSourceName.endsWith(".zip")) { - eventSource = new AZipEventSource(sourceName); - //Anything else should be a web directory - } else { - eventSource = new AURLEventSource(sourceName); - } - - // local disk access possibilities (.xml, .zip, .gz, .gzip) - // event source starts with file:// - } else if(theSourceName.startsWith("file://")) { - // normal xml file - if (theSourceName.endsWith(".xml")) { - eventSource = new AFileEventSource(sourceName); - // normal zip file - } else if (theSourceName.endsWith(".zip")) { - eventSource = new AZipEventSource(sourceName); - // compressed single xml file - } else if (theSourceName.endsWith(".gz") || theSourceName.endsWith(".gzip")) { - eventSource = new AFileEventSource(sourceName); - } else { - String msg = "Could not identify event source: "+sourceName; - logger.error(msg); - throw new InvalidEventSourceException(msg); - } - } else { - String msg = "Could not identify event source: "+sourceName; - logger.error(msg); - throw new InvalidEventSourceException(msg); - } - fireNewEventSource(getEventSource()); - } - - /** - * Sets event navigation mode: random, push, loop or sequential. - * Throws InvalidEventSourceException if there is no source - * or if it doesn't support the requested mode. - * @throws InvalidEventSourceException - */ - public synchronized void setNavigationMode(NavigationMode mode) throws InvalidEventSourceException - { - if(eventSource == null) throw new InvalidEventSourceException("Current event source is NULL"); - - NavigationMode oldMode = eventSource.getNavigationMode(); - - // check if we're really setting a new mode, or if - // the user just clicked on the same button twice - if(oldMode != mode) { - if(eventSource.supportsNavigationMode(mode)) { - eventSource.setNavigationMode(mode); - fireNewEventSource(getEventSource()); - // go to the next event - try { - nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "No more events from current source"; - logger.error(msg); - } catch (ReadEventException re) { - String msg = "Error while reading the event"; - logger.error(msg); - } - } else throw new InvalidEventSourceException("Current event source does not support the selected display mode"); - } - } - - /** - * Gets the current event navigation mode. - * @return event navigation mode - */ - public synchronized NavigationMode getNavigationMode() throws InvalidEventSourceException - { - if(eventSource == null) throw new InvalidEventSourceException("Current event source is NULL"); - return eventSource.getNavigationMode(); - } - - /** - * Check if the current source supports a specific event navigation mode. - * @param mode the requested event navigation mode - * @return true if the event navigation mode is supported - */ - public boolean supportseventNavigationMode(NavigationMode mode) throws InvalidEventSourceException - { - if(eventSource == null) throw new InvalidEventSourceException("Current event source is NULL"); - return eventSource.supportsNavigationMode(mode); - } - - /** - * Read the next event from the current event source. - * Throws NoMoreEvents if there is none. - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - public void nextEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException - { - - // Check for valid event source. - if (eventSource==null) - throw new InvalidEventSourceException("Current event source is NULL"); - - // Simply read next event from it. - AEvent event = eventSource.nextEvent(); - setCurrentEvent(event); - - } - - - /** - * Read previous event from current event source. - * Throws NoMoreEvents if there is none. - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - public void previousEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException - { - - // Check for valid event source. - if (eventSource==null) - throw new InvalidEventSourceException("Current event source is NULL"); - - // Simply read previous event from it. - setCurrentEvent(eventSource.previousEvent()); - - } - - /** - * Add a new listener for newEvent incidents - * @param listener to be added to list - */ - public void addNewEventListener(ANewEventListener listener) - { - //Add this listener - NewEventListeners.addElement(listener); - //If there are already some events - if (getCurrentEvent() == null) return; - //Make the new listener aware of the current event - listener.newEvent(getCurrentEvent()); - } - - /** - * Remove a listener from the list. - * @param listener to be removed from list - */ - public void removeNewEventListener(ANewEventListener listener) - { - //Remove this listener - NewEventListeners.removeElement(listener); - } - - /** - * Call stateChanges of all newEvent listeners - * @param event the new event passed on to all listeners - */ - private synchronized void fireNewEvent(AEvent event) - { - - // Loop over all listeners - for ( ANewEventListener listener : NewEventListeners ) - // give them the new event - listener.newEvent(event); - } - - /** - * Add a new listener for newEventSource incidents - * @param listener to be added to list - */ - public void addNewEventSourceListener(ANewEventSourceListener listener) - { - //Add this listener - NewEventSourceListeners.addElement(listener); - //If there are already some events - if (getEventSource() == null) return; - //Make the new listener aware of the current event - listener.newEventSource(getEventSource()); - } - - /** - * Remove a listener from the list - * @param listener to be removed from list - */ - public void removeNewEventSourceListener(ANewEventSourceListener listener) - { - NewEventSourceListeners.removeElement(listener); - } - - /** - * Call eventSourceChanged of all event source changes listeners - * @param eventSource the new event source - */ - private synchronized void fireNewEventSource(AEventSource eventSource) - { - // Loop over all listeners - for ( ANewEventSourceListener listener : NewEventSourceListeners ) - // give them the new event - listener.newEventSource(eventSource); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AEventSource.java b/graphics/AtlantisJava/src/atlantis/event/AEventSource.java deleted file mode 100755 index 01fef1e727de..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEventSource.java +++ /dev/null @@ -1,114 +0,0 @@ -package atlantis.event; - -/** - * Basic interface class to be implemented by all event sources - * @author sboeser - */ - -public interface AEventSource -{ - - /*** - * Exception that is thrown if an event can not be read from this source - */ - public class ReadEventException extends AEventSourceException - { - //Default constructor - public ReadEventException() { super(); } - //Constructor with a string - public ReadEventException( String message ){ super( message ); } - //Constructor with a description and cause - public ReadEventException( String message, Throwable cause ){ super( message, cause ); } - } - - /*** - * Exception that is thrown if there are no more events from this source - */ - public class NoMoreEventsException extends AEventSourceException - { - //Default constructor - public NoMoreEventsException() { super(); } - //Constructor with a string - public NoMoreEventsException( String message ){ super( message ); } - //Constructor with a description and cause - public NoMoreEventsException( String message, Throwable cause ){ super( message, cause ); } - } - - /** - * Exception that is thrown if the event source is invalid - */ - public class InvalidEventSourceException extends AEventSourceException - { - //Default constructor - public InvalidEventSourceException() { super(); } - //Constructor with a string - public InvalidEventSourceException( String message ){ super( message ); } - //Constructor with a description and cause - public InvalidEventSourceException( String message, Throwable cause ){ super( message, cause ); } - } - - /** - * Read the next event from the source, throws NoMoreEvents - * if no next event is available - * @return the next event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - AEvent nextEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException; - - /** - * Read the previous event from the source, throws NoMoreEvents - * if no previous event is available - * @return the previous event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - AEvent previousEvent() throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException; - /** - * Get a string uniquly identifying the event source, e.g the URL, the zip - * archive name or the server:port string - * @return a unique name describing the source - */ - String getSourceName(); - - /*** - * Enum that stores the possible event navigation modes - */ - public enum NavigationMode { - SEQUENTIAL, //go through events in their natural order - LOOP, //start from beginning when reaching the end - RANDOM, //take a random event - PUSH //event loop is driven from outside (see AServerXMLRPC) - } - - /** - * Get the event navigation mode for the current source. - * @return current navigation mode - */ - NavigationMode getNavigationMode(); - - /** - * Set the event navigation mode for the current source. - * Throws InvalidEventSourceException if the current - * source does not support the requested mode - * @param mode requested event navigation mode - * @throws InvalidEventSourceException if the mode is not supported - */ - void setNavigationMode(NavigationMode mode) throws InvalidEventSourceException; - - /** - * Checks whether the current event source supports - * a particular display mode. - * @return true if the mode is supported - * @param mode requested event navigation mode - */ - boolean supportsNavigationMode(NavigationMode mode); - -} - diff --git a/graphics/AtlantisJava/src/atlantis/event/AEventSourceException.java b/graphics/AtlantisJava/src/atlantis/event/AEventSourceException.java deleted file mode 100644 index 94061279df36..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AEventSourceException.java +++ /dev/null @@ -1,65 +0,0 @@ - -package atlantis.event; - -/** - * All exceptions occuring while attempting to read events shall be chaught - * and converted into one of the three generic event source exceptions: - * - * -NoMoreEventsException: there is no next/previous event - * -InvalidEventSourceException: the specified event source is invalid - * -ReadEventException: there was an error reading in the event - * - * All three of them derive from AEventSourceException which provides printing methods. - * - * These three exceptions are then handed up to the GUI level, where they are treated - * differently, depending on the current reading mode (e.g. NoMoreEvents can be ignored - * when waiting for events to appear on a server, web-dir, etc..) - * - * @author sboeser - */ -public class AEventSourceException extends Exception{ - - //Default constructor - public AEventSourceException() { super(); } - //Constructor with a string - public AEventSourceException( String message ){ super( message ); } - //Constructor with a description and cause - public AEventSourceException( String message, Throwable cause ){ super( message, cause ); } - - /** - * Generates a string with the cause of this message and all causing ones - * @return the generated string - */ - public String getCauseMessages(){ - - //Create the string buffer - StringBuffer msg = new StringBuffer(); - - //Add all cause messages starting from this exception - addCauseMessage(this,msg); - - //return string - return msg.toString(); - } - - /** - * Recursively add cause messages to string buffer - * @param t the exception - * @param msg the string buffer - */ - private void addCauseMessage(Throwable t, StringBuffer msg){ - - //Add the name of the exception class - msg.append(t.getClass().getName()); - //Add the description of the exception - msg.append(": "); - msg.append(t.getMessage()); - - //Check if there has been a cause given - if (t.getCause() != null){ - //Add cause messages in next line - msg.append("\n caused by "); - addCauseMessage(t.getCause(),msg); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AFileEventSource.java b/graphics/AtlantisJava/src/atlantis/event/AFileEventSource.java deleted file mode 100644 index 51625ac86d35..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AFileEventSource.java +++ /dev/null @@ -1,309 +0,0 @@ -package atlantis.event; - -import atlantis.data.AEventFromXML; -import java.io.File; -import java.io.FilenameFilter; -import java.io.InputStream; - -import java.util.Arrays; -import java.util.zip.GZIPInputStream; -import java.util.Random; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - - -/** - * Read a single event from an XML file in a directory - * @author sboeser - */ -public class AFileEventSource extends ABufferedEventSource -{ - - //The current directory - private File directory = null; - - //A filter for valid files in the current directory - private final XMLFilenameFilter filter = new XMLFilenameFilter(); - - // needed for random mode - private Random randomGenerator = new Random(); - - /** - * Constructor with file name given - * @param sourceName - * @throws AEventSource.InvalidEventSourceException - */ - public AFileEventSource(String sourceName) throws AEventSource.InvalidEventSourceException - { - // check if it's a well-formed event path - if(sourceName.startsWith("file://")) { - // strip file:// from the sourceName - sourceName = sourceName.substring(7); - //Check if the current file name is valid - directory = new File(sourceName); - - //Check that we can read that file or directory - if (!directory.canRead()) - throw new InvalidEventSourceException("Can not read from "+sourceName); - } else throw new InvalidEventSourceException(sourceName+" is not in the form file://path"); - } - - /** - * @return the full name of the file or directory - */ - public String getSourceName() { - return directory.getAbsolutePath(); - } - - /** - * @param mode event navigation mode - * @return true if the requested mode is supported by this source - */ - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.SEQUENTIAL || - mode == NavigationMode.RANDOM || - mode == NavigationMode.LOOP) - return true; - return false; - } - - /** - * Read an event from the current file and directory - * @return the event - * @throws ReadEventException - * @throws InvalidEventSourceException - */ - protected AEvent readEventFromFile(File file) throws ReadEventException, - InvalidEventSourceException - { - //Reassemble full file name - String FullFileName = file.getAbsolutePath(); - - try{ - - //Use full path and name to specify the file - InputStream is = new FileInputStream(FullFileName); - - //Check if this might be a gzip stream - if ((file.getName().toLowerCase().endsWith(".gz"))|| - (file.getName().toLowerCase().endsWith(".gzip"))){ - - //Run through GZIPInput for decoding - is = new GZIPInputStream(is); - } - //Read file from stream - return AEventFromXML.read(is, file.getName()); - - } catch( OutOfMemoryError oom ) { - - //Check if we can clear the event container - if( getNumberOfEvents() > 0) clearEventContainer(); - - //Run garbage collector - System.gc(); - - //Retry reading the event - return readEventFromFile(file); - - } catch(FileNotFoundException fnfe){ - //rethrow - throw new InvalidEventSourceException("File not found: "+FullFileName,fnfe); - } catch(IOException ioe){ - //rethrow - throw new ReadEventException("I/O error readding file: "+FullFileName,ioe); - } - } - - /** - *Get a sorted list of files in the directory of the current file - */ - private String[] getListOfFiles(){ - - //get a list of files in the same directory using the filter - String[] FileList = directory.list(filter); - - //Sort the list - Arrays.sort(FileList); - - return FileList; - - } - - protected AEvent readRandom() throws ReadEventException, InvalidEventSourceException { - - //The file we want to pass on to the reading routine - File file = null; - //On the first encounter "directory" might be a file - if (directory.isFile()){ - //set this as the file we want to read - file = directory.getAbsoluteFile(); - //store its parent directory - directory = file.getParentFile(); - } else { - //Get a list of files - String[] FileList = getListOfFiles(); - //Check there are more files - if (FileList.length == 0) - throw new InvalidEventSourceException("No valid files in directory " - +directory.getAbsolutePath()); - //Loop over file list - int iName = randomGenerator.nextInt(FileList.length); - - //Now get the new file - file = new File(directory,FileList[iName]); - } - - //Should now have a file in any case, try to read from it - return readEventFromFile(file); - - } - - - /** - * Read the next event from the next XML file in the same directory - * @return the next event - * @throws NoMoreEventsException - * @throws ReadEventException - * @throws InvalidEventSourceException - */ - public AEvent readNext(AEventInfo currentEvent) throws NoMoreEventsException, - ReadEventException, - InvalidEventSourceException - { - // if random mode is set, return a random event - if(getNavigationMode() == NavigationMode.RANDOM) return readRandom(); - - //The file we want to pass on to the reading routine - File file = null; - //On the first encounter "directory" might be a file - if (directory.isFile()){ - //set this as the file we want to read - file = directory.getAbsoluteFile(); - //store its parent directory - directory = file.getParentFile(); - } else { - //Get a list of files - String[] FileList = getListOfFiles(); - //Check there are more files - if (FileList.length == 0) - throw new NoMoreEventsException("No valid files in directory " - +directory.getAbsolutePath()); - //Loop over file list - int iName = 0; - //search for next entry that is lexicographically larger - //taking first one if there is no current event to compare to - while ((currentEvent != null ) && - (currentEvent.getSourceName().compareTo(FileList[iName]) >= 0)){ - //Go to next file - ++iName; - // if we have reached the end of the list - if (iName == FileList.length) { - // if in loop mode, go back to the first file - if(getNavigationMode() == NavigationMode.LOOP) { - iName = 0; - break; - } - // if not in loop mode, abort - else throw new NoMoreEventsException("No more files after" - + currentEvent.getSourceName() + " in directory "+directory.getAbsolutePath()); - } - } - - //Now get the new file - file = new File(directory,FileList[iName]); - } - - //Should now have a file in any case, try to read from it - return readEventFromFile(file); - - } - - /** - * Read the next event from the previous XML file in the same directory - * @return the previous event - * @throws NoMoreEventsException - * @throws ReadEventException - * @throws InvalidEventSourceException - */ - public AEvent readPrevious(AEventInfo currentEvent) throws NoMoreEventsException, - ReadEventException, - InvalidEventSourceException - { - // in random mode there's no looking back - if(getNavigationMode() == NavigationMode.RANDOM) throw new NoMoreEventsException("No more random events left in the buffer"); - //The file we want to pass on to the reading routine - File file = null; - //On the first encounter "directory" might be a file - if (directory.isFile()){ - //set this as the file we want to read - file = directory.getAbsoluteFile(); - //store its parent directory - directory = file.getParentFile(); - } else { - //Get a list fo files - String[] FileList = getListOfFiles(); - //Check there are more files - if (FileList.length == 0) - throw new NoMoreEventsException("No valid files in directory " - +directory.getAbsolutePath()); - //Loop over file list - int iName = FileList.length-1; - //search for next entry that is lexicographically smaller - //taking last one if there is no current one to compare to - while ((currentEvent != null) && - (currentEvent.getSourceName().compareTo(FileList[iName]) <= 0)){ - //Go to next file - --iName; - // if we have reached the end of the list - if (iName < 0) { - // if in loop mode, go to the last event - if(getNavigationMode() == NavigationMode.LOOP) { - iName = FileList.length - 1; - break; - } - // if not in loop mode, abort - else throw new NoMoreEventsException("No more files before" - + currentEvent.getSourceName() + " in directory "+directory.getName()); - } - } - - //Now get the new file - file = new File(directory,FileList[iName]); - } - - //Should now have a file in any case, try to read from it - return readEventFromFile(file); - } -} -/** - * Filter helper class only accepting file names ending in .xml, .gz or .gzip - * @author sboeser - */ -class XMLFilenameFilter implements FilenameFilter -{ - - // accept all readable .xml .gz and .gzip files, no directories - public boolean accept(File dir, String name) - { - //First check the name - if ( ! name.toLowerCase().endsWith(".xml")) - if ( ! name.toLowerCase().endsWith(".gzip")) - if ( ! name.toLowerCase().endsWith(".gz")) - //invalid ending - return false; - - //Check file properties - File f = new File(dir, name); - - //Reject directories - if(! f.isFile()) return false; - //Reject unreadable files - if(! f.canRead()) return false; - - //Finally accept - return true; - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AFilter.java b/graphics/AtlantisJava/src/atlantis/event/AFilter.java deleted file mode 100755 index e6293cba5dfc..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AFilter.java +++ /dev/null @@ -1,275 +0,0 @@ -package atlantis.event; - - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.data.AS3DData; - - -/** - * Filter of S3D hits ask Hans Drevermann - */ - -public class AFilter { - - final static int FILTER_GROUP=76; - - static int[] h=null; - static int[] eta=null; - static int[] phi=null; - static int[] layer=null; - static int[] group=null; - static int[] skewGroup=null; - static int[] groupMapping=null; - - static int[] bin=null; - static int[] ll=null; - static int[] hitLayers=null; - static int[] id=null; - static boolean[] good=null; - static int numEtaBins=0; - - private static APar parameterStore = APar.instance(); - - final static int[] layerAsBits=new int[32]; - static { - layerAsBits[0]=1; - for(int i=1; i<32; i++) - layerAsBits[i]=2*layerAsBits[i-1]; - } - - - public static void filter(AS3DData aS3DData) { - if(aS3DData==null) { - AOutput.append("AS3DData not found can't filter\n", ALogInterface.BAD_COMMAND); - return; - } - - int numUsefulPhiBins=parameterStore.get("Fil", "NumPhi").getI(); - int numUsefulEtaBins=parameterStore.get("Fil", "NumEta").getI(); - // +2 for wrap around and edge effect - int numPhiBins=numUsefulPhiBins+2; - - // +2 for edge effects - numEtaBins=numUsefulEtaBins+2; - - double etaRange=parameterStore.get("Fil", "EtaRange").getD(); - int requiredHitsInBin=parameterStore.get("Fil", "NumHits").getI(); - int numSkewSteps=parameterStore.get("Fil", "NumSkew").getI(); - double skewStepSize=parameterStore.get("Fil", "SkewStep").getD(); - - int numHits=aS3DData.makeFilterDrawList(etaRange); - int maxBins=numHits+1; - - if(h==null||h.length<numPhiBins*numEtaBins) h=new int[numPhiBins*numEtaBins]; - if(layer==null||layer.length<numHits) layer=new int[numHits]; - if(eta==null||eta.length<numHits) eta=new int[numHits]; - if(phi==null||phi.length<numHits) phi=new int[numHits]; - if(group==null||group.length<numHits) group=new int[numHits]; - if(skewGroup==null||skewGroup.length<numHits) skewGroup=new int[numHits]; - if(groupMapping==null||groupMapping.length<numHits) groupMapping=new int[numHits]; - // - if(bin==null||bin.length<maxBins) bin=new int[maxBins]; - if(hitLayers==null||hitLayers.length<maxBins) hitLayers=new int[maxBins]; - if(id==null||id.length<maxBins) id=new int[maxBins]; - if(ll==null||ll.length<maxBins) ll=new int[maxBins]; - if(good==null||good.length<maxBins) good=new boolean[maxBins]; - - layer=aS3DData.getLayer(layer); - eta=aS3DData.getIntegerEta(numUsefulEtaBins, etaRange, eta); - - // initialise - for(int i=0; i<numHits; ++i) - group[i]=0; - - if(!parameterStore.get("Fil", "Loop").getStatus()) numSkewSteps=0; - - int numGroups=0; - - for(int step=-numSkewSteps; step<=numSkewSteps; step++) { - double skew=0.; - - // TODO: Check if 166.666 should be the curvature parameter from the parameter store - if(numSkewSteps!=0) - skew=(1./skewStepSize)*step/(numSkewSteps*2*166.666); - - for(int i=0; i<maxBins; ++i) { - hitLayers[i]=0; - good[i]=false; - } - - phi=aS3DData.getIntegerPhi(numUsefulPhiBins, skew, phi); - - int numBins=1; - - for(int i=0; i<numHits; ++i) { - int b=phi[i]*numEtaBins+eta[i]; - - if(h[b]==0) { - h[b]=numBins; - bin[numBins]=b; - numBins++; - } - hitLayers[h[b]]|=layerAsBits[layer[i]]; - } - - // must treat the phi wraparound here...... - - for(int e=0; e<numEtaBins; e++) { - h[(0)*numEtaBins+e]=h[(numUsefulPhiBins)*numEtaBins+e]; - h[(numUsefulPhiBins+1)*numEtaBins+e]=h[(1)*numEtaBins+e]; - } - - int ngood=0; - - for(int i=1; i<numBins; i++) { - int b=bin[i]; - int hitLayersSummed=0; - - // add hits from 3x3 region around this bin - for(int p=b-numEtaBins; p<b+2*numEtaBins; p+=numEtaBins) - for(int e=p-1; e<p+2; ++e) { - int ibin=h[e]; - - if(ibin>0) - hitLayersSummed|=hitLayers[ibin]; - } - if(countBits(hitLayersSummed)>=requiredHitsInBin) { - good[i]=true; - ll[ngood++]=i; - } - } - - for(int i=0; i<ngood; ++i) - id[ll[i]]=0; - - int firstGroup=numGroups+1; - - for(int i=0; i<ngood; ++i) - if(id[ll[i]]==0) - add(ll[i], ++numGroups); - - for(int j=firstGroup; j<=numGroups; ++j) { - int hls=0; - - for(int i=0; i<ngood; i++) - if(id[ll[i]]==j) { - hls|=hitLayers[ll[i]]; - } - if(countBits(hls)<requiredHitsInBin) - for(int i=0; i<ngood; i++) - if(id[ll[i]]==j) - good[ll[i]]=false; - } - - for(int i=0; i<numHits; ++i) { - int b=h[phi[i]*numEtaBins+eta[i]]; - - if(good[b]) - skewGroup[i]=id[b]; - else - skewGroup[i]=0; - } - - // now zero the histogram for next call - for(int i=1; i<numBins; i++) - h[bin[i]]=0; - // wrap around - for(int e=0; e<numEtaBins; e++) { - h[(0)*numEtaBins+e]=0; - h[(numPhiBins-1)*numEtaBins+e]=0; - } - - group=mergeGroups(numHits, numGroups, group, skewGroup); - - } - - group=renumberGroups(numHits, group); - - int num=0; - - for(int i=0; i<numHits; ++i) - if(group[i]>0) num++; - - AOutput.alwaysAppend("\nFiltering:\n Input hits = "+numHits+"\n Num grouped = "+num+"\n",ALogInterface.NORMAL_BOLD); - - aS3DData.setGroup(group); - } - - public static void add(int i, int numGroup) { - id[i]=numGroup; - int b=bin[i]; - - // add hits from 3x3 region around this bin - for(int p=b-numEtaBins; p<b+2*numEtaBins; p+=numEtaBins) - for(int e=p-1; e<p+2; ++e) { - int ibin=h[e]; - - if(good[ibin]&&id[ibin]==0) - add(ibin, numGroup); - } - } - - public static int[] mergeGroups(int numHits, int numGroups, int[] group, int[] skewgroup) { - - for(int i=1; i<=numGroups; ++i) - groupMapping[i]=i; - - for(int i=0; i<numHits; ++i) - if(skewGroup[i]>0&&group[i]>0) { - int g1=groupMapping[group[i]]; - int g2=groupMapping[skewGroup[i]]; - - if(g1!=g2) - for(int g=1; g<=numGroups; ++g) - if(groupMapping[g]==g1||groupMapping[g]==g2) groupMapping[g]=g1; - } - - for(int i=0; i<numHits; ++i) - if(skewGroup[i]>0||group[i]>0) { - int g=skewGroup[i]; - - if(g==0) - g=group[i]; - group[i]=groupMapping[g]; - } - return group; - } - - public static int[] renumberGroups(int numHits, int[] group) { - int numGroups=0; - - for(int i=0; i<numHits; ++i) - if(group[i]>0) { - int g=group[i]; - - numGroups++; - for(int j=i; j<numHits; ++j) - if(group[j]==g) - group[j]=-numGroups; - } - for(int i=0; i<numHits; ++i) - group[i]=-group[i]; - return group; - } - - // Return the number of bits currently set. This is done via a lookup table - - final static int[] countLUT= {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, - 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, - 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, - 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, - 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, - 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, - 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, - 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, - 7, 5, 6, 6, 7, 6, 7, 7, 8}; - - final static int maskByte=255; - - public static int countBits(int bits) { - return countLUT[bits&maskByte]+countLUT[(bits>>>8)&maskByte]+countLUT[(bits>>>16)&maskByte]; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AImageProducer.java b/graphics/AtlantisJava/src/atlantis/event/AImageProducer.java deleted file mode 100644 index 74615cbd896c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AImageProducer.java +++ /dev/null @@ -1,129 +0,0 @@ -package atlantis.event; - -import atlantis.utils.*; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import atlantis.Atlantis; -import atlantis.canvas.ACanvas; -import atlantis.graphics.encoders.AImageEncoder; -import java.awt.Dimension; - - -/** - * Implements ANewEventListener and creates image files - * upon each newEvent call. A scale factor allows to e.g. produce thumbnails by - * scaling down image. The image producer works in two modes: - * a) If no file name is given, a file name will be generated from run and event - * number. In case the output file exists, no file is created but a warning is written out. - * b) If a file name is given, a temporary file is generated first, and then - * renamed to the given file name. If renaming fails, a warning is written out - * and the temporary file is deleted. - * - * @author Sebastian Boeser - */ - -public abstract class AImageProducer implements ANewEventListener -{ - /** File name prefix */ - protected static final String filePrefix = "atlantis"; - /** Minimum number of digits for event- and run-number when writing files */ - protected static final int encodeNumberDigits = 6; - - /** directory to store files in */ - protected final File directory ; - /** Default image dimensions */ - protected final Dimension imageSize; - /** The thumbnail scale */ - protected final double scaleFactor; - /** A fixed filename if given on the command line */ - protected final String fixedFileName; - - /** - * Inner exception class - */ - public static class InstantiationException extends Exception { - //only declare constructor - InstantiationException(String what){ - super(what); - } - }; - - /** - * Fully qualified constructor, - * intializing all the attributes and check the parameters validity - * @param dir the directory in which to save all the files - * @param size the dimensions of the images - * @param scale the factor by which to scale the images - * @param fileName if not null, that file will be overwritten for each event - * @throws InstantiationException if we fail to create the object - */ - protected AImageProducer(String dir, Dimension size, double scale, String fileName) throws InstantiationException - { - // First check the directory parameter - directory = new File(dir); - - //That it exists - if(! directory.exists()) throw new InstantiationException("Directory "+dir+" doesn't exist"); - - //That it is a directory - if(! directory.isDirectory()) throw new InstantiationException(dir + " is not a directory"); - - //And that we can write in it - if(! directory.canWrite()) throw new InstantiationException("Cannot write to directory "+dir); - - //Check frequency and history length arguments - if (scale <= 0) throw new InstantiationException("Negative or zero scale factor"); - - // store all parameters - imageSize = size; - scaleFactor = scale; - fixedFileName = fileName; - - } - - - /** - * Return the string build from this events file name - * @param evt the event info from which to build the filename - * @param minDigit minimum number of digits for run- and event-number - * @return the file name - */ - protected String getEventFileName(AEventInfo evt){ - String nameFormat = String.format("%%s_%%0%dd_%%0%dd",encodeNumberDigits,encodeNumberDigits); - return String.format(nameFormat, - filePrefix,evt.getRunNumber(),evt.getEventNumber()); - } - - - /** - * Safes a byteArray of data into a file given by a fileName - * @param data the data - * @param file the file to write into - * @throws Exception in case of saving fails - */ - protected void saveDataIntoFile(byte[] data, File file) throws IOException - { - - //Sanity check - if ((data == null) ||(file == null)) return; - - //Open output stream and write to output stream - FileOutputStream fos = new FileOutputStream(file); - OutputStream os = new BufferedOutputStream(fos); - os.write(data); - os.flush(); - os.close(); - - } - - /** - * Called whenever a new event appears. Store an image in the directory, - * either with a generated file name (no overwrite) or with a fixed file name (overwrite) - * @param event the event from which to generate the image - */ - public abstract void newEvent(AEvent event); -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/event/ANewEventListener.java b/graphics/AtlantisJava/src/atlantis/event/ANewEventListener.java deleted file mode 100644 index 7657cbe48392..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/ANewEventListener.java +++ /dev/null @@ -1,18 +0,0 @@ - -package atlantis.event; - -/** - * Interface for all NewEventListener classes. Each time a new event is - * brought to the event manager, the NewEvent:isteners newEvent method is - * called with the new event as an argument - * @author sboeser - */ -public interface ANewEventListener { - - /** - * This method gets called each time a new new is available. - * @param event the new event - */ - abstract public void newEvent(AEvent event); - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/event/ANewEventSourceListener.java b/graphics/AtlantisJava/src/atlantis/event/ANewEventSourceListener.java deleted file mode 100644 index 6101f3a4f1b9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/ANewEventSourceListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package atlantis.event; - -/** - * Interface for all NewEventSourceListener classes. Each time the event source - * is changed, the newEventSourcemethod is called. - * @author maillard - */ -public interface ANewEventSourceListener { - - /** - * This method gets called each time the layout is changed. - * @param eventSource the new event source - */ - abstract public void newEventSource(AEventSource eventSource); - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AObjectsAssociation.java b/graphics/AtlantisJava/src/atlantis/event/AObjectsAssociation.java deleted file mode 100644 index 6f4b148b4368..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AObjectsAssociation.java +++ /dev/null @@ -1,26 +0,0 @@ -package atlantis.event; - -/** - * @author Qiang Lu - * - */ -public class AObjectsAssociation extends AAssociation -{ - private String[] key; - - public AObjectsAssociation(String a, String b, String[] associatedKey, - int[] associatedIndex, int[] associatedLinkCount, AEvent e) - { - super(a, b, associatedLinkCount, associatedIndex,e); - this.key = new String[associatedKey.length]; - for (int i=0; i<associatedKey.length; i++) - { - this.key[i] = associatedKey[i]; - } - } - - public String[] getKey() - { - return key; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/APngImageProducer.java b/graphics/AtlantisJava/src/atlantis/event/APngImageProducer.java deleted file mode 100644 index 21cd4d7199bf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/APngImageProducer.java +++ /dev/null @@ -1,119 +0,0 @@ -package atlantis.event; - -import atlantis.utils.*; -import java.io.File; -import java.io.IOException; - -import atlantis.canvas.ACanvas; -import atlantis.graphics.encoders.AImageEncoder; -import java.awt.Dimension; - - -/** - * Implements ANewEventListener and creates PNG files - * upon each newEvent call. A scale factor allows to e.g. produce thumbnails by - * scaling down image. The image producer works in two modes: - * a) If no file name is given, a file name will be generated from run and event - * number. In case the PNG file exists, no file is created but a warning is written out. - * b) If a file name is given, a temporary file is generated first, and then - * renamed to the given file name. If renaming fails, a warning is written out - * and the temporary file is deleted. - * - * @author Sebastian Boeser - */ - -public class APngImageProducer extends AImageProducer -{ - // the logger - private static final ALogger logger = ALogger.getLogger(APngImageProducer.class); - - // Our image encode - private final AImageEncoder imageEncoder = new AImageEncoder(); - - /** - * Fully qualified constructor, - * intializing all the attributes and check the parameters validity - * @param dir the directory in which to save all the files - * @param size the dimensions of the images - * @param scale the factor by which to scale the images - * @param fileName if not null, that file will be overwritten for each event - * @throws InstantiationException if we fail to create the object - */ - public APngImageProducer(String dir, Dimension size, double scale, String fileName) throws InstantiationException - { - super(dir, size, scale, fileName); - } - - /** - * Called whenever a new event appears. Store a PNG in the directory, - * either with a generated file name (no overwrite) or with a fixed file name (overwrite) - * @param event the event from which to generate the PNG - */ - public void newEvent(AEvent event) - { - - //If auto had been set for size (height is negative), get height from Canvas - if (imageSize.height < 0) imageSize.setSize(imageSize.width, ACanvas.getCanvas().getRespectiveHeight(imageSize.width)); - - //Create the file to write the data into - File pngFile; - //If we don't have a fixed file name, - //generate a unique one based on run- and event number - if (fixedFileName==null){ - - //Now construct all the full path for the file we want to save - String pngName = String.format("%s%s%s.png",directory, - System.getProperty("file.separator"), - getEventFileName(event)); - - // Create file handles to the file and check if it exists - pngFile = new File(pngName); - //Do not overwrite any existing files - if (pngFile.exists()) { - logger.warn("File "+ pngName +" already exists - will not overwrite"); - return; - } - //otherwise generate a temporary file first, - //then move it in place later - } else { - //make a temporary file in the final directory - try { - pngFile = File.createTempFile(filePrefix+"_", ".png",directory); - } catch (IOException ex) { - logger.warn("Failed to create temporary file in "+directory.getAbsolutePath()); - return; - } - } - - //Now create the image. If the scaleFactor equals 1, no scaling will happen. - byte[] pngData = imageEncoder.getScaledPNGData(imageSize.width,imageSize.height,scaleFactor); - - //Now try saving the acquired data, - //and if it shall go to a fixed file, move it there - try { - //Save the PNG - saveDataIntoFile(pngData, pngFile); - //move to fixed file name if requested - if (fixedFileName != null){ - - //Get a handle to the final destination - File fixedFile = new File(directory,fixedFileName); - - //delete target if exits - if (fixedFile.exists() && (!fixedFile.delete())) - throw new IOException("Failed to delete existing file "+fixedFile.getAbsolutePath()); - - //And move the new file in place - if (!pngFile.renameTo(fixedFile)) - throw new IOException("Failed to rename temporary file to "+fixedFile.getAbsolutePath()); - } - } catch (IOException ioe) { - //If we fail, throw a warning - logger.warn("Could not save PNG files for history\n"+ioe.toString()); - } finally { - //In any case, delete the pngFile, if it was just temporary - if (fixedFileName != null) pngFile.delete(); - } - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AStreamedEventSource.java b/graphics/AtlantisJava/src/atlantis/event/AStreamedEventSource.java deleted file mode 100644 index b41e007072f9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AStreamedEventSource.java +++ /dev/null @@ -1,52 +0,0 @@ -package atlantis.event; - -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import java.util.Vector; - -/** - * This interface shall be implemented by all event sources that support event - * streams. Only provides simple get and set methods. - * @author sboeser - */ -public interface AStreamedEventSource extends AEventSource { - - /** - * Exception that is thrown if the stream is invalid - */ - public class InvalidStreamException extends AEventSourceException - { - //Default constructor - public InvalidStreamException() { super(); } - //Constructor with a string - public InvalidStreamException( String message ){ super( message ); } - //Constructor with a description and cause - public InvalidStreamException( String message, Throwable cause ){ super( message, cause ); } - } - - /** - * Get an array of names of all available streams - * @return the array of stream names - * @throws InvalidEventSourceException if the list of streams can not be obtained - */ - Vector<String> getAvailableStreams() throws InvalidEventSourceException; - - /** - * Set the stream from which to provide events - * @param streamName the stream from which to get events - * @throws InvalidStreamException if the given name does not specify a valid stream - * @throws InvalidEventSourceException if the server cannot be contacted to get the stream names - */ - void setStream(String streamName) throws InvalidStreamException, - InvalidEventSourceException; - - /** - * Get the currently selected stream, or the default stream if none is selected - * @return the name of the currently selected stream - * @throws InvalidEventSourceException if the list of streams can not be obtained - * @throws NoMoreEventsException if no stream is available - * - */ - String getStream() throws InvalidEventSourceException, - NoMoreEventsException; -} diff --git a/graphics/AtlantisJava/src/atlantis/event/ASvgImageProducer.java b/graphics/AtlantisJava/src/atlantis/event/ASvgImageProducer.java deleted file mode 100644 index a27830547d92..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/ASvgImageProducer.java +++ /dev/null @@ -1,117 +0,0 @@ -package atlantis.event; - -import java.io.File; -import java.io.IOException; - -import atlantis.utils.*; -import atlantis.canvas.ACanvas; -import atlantis.graphics.encoders.AImageEncoder; -import java.awt.Dimension; - - -/** - * Implements ANewEventListener and creates SVG files - * upon each newEvent call. A scale factor allows to e.g. produce thumbnails by - * scaling down image. The image producer works in two modes: - * a) If no file name is given, a file name will be generated from run and event - * number. In case the output file exists, no file is created but a warning is written out. - * b) If a file name is given, a temporary file is generated first, and then - * renamed to the given file name. If renaming fails, a warning is written out - * and the temporary file is deleted. - * - * @author Tom McLaughlan - */ - -public class ASvgImageProducer extends AImageProducer -{ - // the logger - private static final ALogger logger = ALogger.getLogger(ASvgImageProducer.class); - - // Our image encode - private final AImageEncoder imageEncoder = new AImageEncoder(); - - /** - * Fully qualified constructor, - * intializing all the attributes and check the parameters validity - * @param dir the directory in which to save all the files - * @param size the dimensions of the images - * @param scale the factor by which to scale the images - * @param fileName if not null, that file will be overwritten for each event - * @throws InstantiationException if we fail to create the object - */ - public ASvgImageProducer(String dir, Dimension size, double scale, String fileName) throws InstantiationException - { - super(dir, size, scale, fileName); - } - - /** - * Called whenever a new event appears. Store an SVG in the directory, - * either with a generated file name (no overwrite) or with a fixed file name (overwrite) - * @param event the event from which to generate the SVG - */ - public void newEvent(AEvent event) - { - - //If auto had been set for size (height is negative), get height from Canvas - if (imageSize.height < 0) imageSize.setSize(imageSize.width, ACanvas.getCanvas().getRespectiveHeight(imageSize.width)); - - //Create the file to write the data into - File outFile; - //If we don't have a fixed file name, - //generate a unique one based on run- and event number - if (fixedFileName==null){ - - //Now construct all the full path for the file we want to save - String outFileName = String.format("%s%s%s.svg",directory, - System.getProperty("file.separator"), - getEventFileName(event)); - - // Create file handles to the file and check if it exists - outFile = new File(outFileName); - //Do not overwrite any existing files - if (outFile.exists()) { - logger.warn("File "+ outFileName +" already exists - will not overwrite"); - return; - } - //otherwise generate a temporary file first, - //then move it in place later - } else { - //make a temporary file in the final directory - try { - outFile = File.createTempFile(filePrefix+"_", ".svg",directory); - } catch (IOException ex) { - logger.warn("Failed to create temporary file in "+directory.getAbsolutePath()); - return; - } - } - - //Now try saving the acquired data, - //and if it shall go to a fixed file, move it there - try { - imageEncoder.saveSVG(imageSize.width, imageSize.height, outFile); - - //move to fixed file name if requested - if (fixedFileName != null){ - - //Get a handle to the final destination - File fixedFile = new File(directory,fixedFileName); - - //delete target if exits - if (fixedFile.exists() && (!fixedFile.delete())) - throw new IOException("Failed to delete existing file "+fixedFile.getAbsolutePath()); - - //And move the new file in place - if (!outFile.renameTo(fixedFile)) - throw new IOException("Failed to rename temporary file to "+fixedFile.getAbsolutePath()); - } - } catch (IOException ioe) { - //If we fail, throw a warning - logger.warn("Could not save SVG files for history\n"+ioe.toString()); - } finally { - //In any case, delete the pngFile, if it was just temporary - if (fixedFileName != null) outFile.delete(); - } - - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/AURLEventSource.java b/graphics/AtlantisJava/src/atlantis/event/AURLEventSource.java deleted file mode 100644 index 530a3793cd81..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AURLEventSource.java +++ /dev/null @@ -1,385 +0,0 @@ -package atlantis.event; - -import atlantis.data.AEventFromXML; - -import java.util.ArrayList; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.FileNotFoundException; -import java.net.URL; -import java.net.MalformedURLException; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.Random; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.ALogger; - -import java.util.Collections; - - -/** - * This class obtains an event from an XML file which is read from - * URL address (from a remote source). - * - * Once the file is read the classes tries to create an internal - * list of XML event files from this remote source which is utilised - * when the user accesses next, resp. previous event from this address. - * - * It is dependent on the fact that the web server supports directory - * listings - i.e. it returns an HTML page which this class parses - * and gets all files conforming ".*\.xml" regular expression. - * - * It is possible to specify only URL with a directory where the event - * files are. - * - * @author sboeser - */ -public class AURLEventSource extends ABufferedEventSource -{ - // get the logger - private static final ALogger logger = ALogger.getLogger(AURLEventSource.class); - // the name of the event source - private String directoryURL = null; - - // needed for random mode - private Random randomGenerator = new Random(); - - /** - * @param mode event navigation mode - * @return true if the requested mode is supported by this source - */ - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.SEQUENTIAL || - mode == NavigationMode.RANDOM || - mode == NavigationMode.LOOP) - return true; - return false; - } - - /** - * Constructor with the URL of the directory - * @param sourceName - * @throws atlantis.event.AEventSource.InvalidEventSourceException - */ - public AURLEventSource(String sourceName) throws InvalidEventSourceException - { - - //Make sure the event source starts with http:// - if( ! sourceName.toLowerCase().startsWith("http://")) - throw new InvalidEventSourceException("URL event source name does"+ - "not start with \"http://\""); - - //Store event source - directoryURL = sourceName; - } - - /** - * @return the directory URL string - */ - public String getSourceName() { - return directoryURL; - } - - /** - * Get a list of files in a directory given by a URL - * @param url the url of the directory - * @return a list of urls to the individual files - * @throws atlantis.event.AEventSource.InvalidEventSourceException - */ - private ArrayList<String> getEventListForURL(String url) throws InvalidEventSourceException { - - //the url of the directory we are searching - String baseUrl = url; - //trim any file endings from url - if (url.endsWith(".xml")) - baseUrl = url.substring(0, url.lastIndexOf('/')); - - - //The input stream - need to be closed in the end - InputStreamReader urlStream = null; - BufferedReader br = null; - - //be a bit verbose - logger.info("Trying to get directory listing from " + baseUrl); - - //Create an array to return - ArrayList<String> eventList = new ArrayList<String>(); - - //Now try reading stuff from the web - try { - //Get an input stream reader - urlStream = new InputStreamReader(new URL(baseUrl).openStream()); - //get a buffered reader for that stream - br = new BufferedReader(urlStream); - - // input is the whole line from HTML directory listing - // example to match: <a href="atlantis_event_70417_93.xml"> - // We use regular expressions patterns to catch the lines of interest - // ( ) defines group, group 0 is the whole match and group 1 is - // just the desired file name within the parentheses - Pattern pattern = Pattern.compile("<a href=\"(.*\\.xml)\">"); - - //Loop over all lines - String line = null; - while ((line = br.readLine()) != null) { - //try to match the patter - Matcher matcher = pattern.matcher(line); - if (matcher.find()) // not .match() (!) - { - //Get the first group from the pattern - //i.e the file name and add to our event list - eventList.add(matcher.group(1)); - } - } - - //be a bit verbose - logger.debug("List of " + eventList.size() + " events loaded from " + baseUrl); - - - } catch (MalformedURLException mue) { - String msg = "Incorrect URL address: " + baseUrl; - logger.error(msg); - AOutput.alwaysAppend("\n" + msg + "\n", ALogInterface.WARNING); - throw new InvalidEventSourceException(msg, mue); - } catch (IOException ioe) { - String msg = "IO error while reading URL: " + baseUrl; - logger.error(msg); - AOutput.alwaysAppend("\n" + msg + "\n", ALogInterface.WARNING); - throw new InvalidEventSourceException(msg, ioe); - } finally { - //In any case close everything - try { - br.close(); - urlStream.close(); - } catch (Throwable t) { - //do nothing here - } - } - - //check if there were at least some events - if (eventList.size()==0) - throw new InvalidEventSourceException("No events found at "+baseUrl); - - //In the end sort the event list - Collections.sort(eventList); - - //and return it - return eventList; - - } - - /** - * Read in an event from a fully specified path - * @param fileName the URL to the file - * @param directoryURL the name of the event source - * @return the event - */ - private AEvent readEventFromURL(String fileName, String directoryURL) - throws ReadEventException { - //Things we need to close in the end - InputStream urlStream = null; - BufferedInputStream buffStream = null; - AEvent event = null; - - try { - //Open the url as stream - String fullURL = directoryURL + "/" + fileName; - URL eventURL = new URL(fullURL); - urlStream = eventURL.openStream(); - buffStream = new BufferedInputStream(urlStream); - //then read the event from there - logger.debug("Reading event data stream from " + eventURL.toString() + "..."); - event = AEventFromXML.read(buffStream, fileName); - - } catch (FileNotFoundException fnfe) { - //Show as a warning and rethrow - String msg = "File not found at " + directoryURL+"/"+fileName; - logger.error(msg); - AOutput.alwaysAppend("\n" + msg + "\n", ALogInterface.WARNING); - throw new ReadEventException(msg, fnfe); - } catch (IOException ioe) { - //Show as an error and rethrow - String msg = "IO error when reading " + directoryURL; - logger.error(msg); - AOutput.alwaysAppend("\n" + msg + "\n", ALogInterface.WARNING); - throw new ReadEventException(msg, ioe); - } finally { - try { - if (urlStream != null) { - urlStream.close(); - } - if (buffStream != null) { - buffStream.close(); - } - } catch (Throwable t) { - //Ignore all errors - } - } - return event; - } - - /** - * Read a random event - * @return the random event - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - protected AEvent readRandom() throws InvalidEventSourceException, ReadEventException - { - - String fileName = null; - - //Check if we have been given a fully specified file url - if(directoryURL.endsWith(".xml")){ - //Store the file name from the url - fileName = directoryURL.substring(directoryURL.lastIndexOf('/')+1,directoryURL.length()); - //trim file endings from url - directoryURL = directoryURL.substring(0, directoryURL.lastIndexOf('/')); - - } else { - - //Update event list every time, so we get new files - ArrayList<String> eventList=getEventListForURL(directoryURL); - - //Check there are more files - if (eventList.size() == 0) - throw new InvalidEventSourceException("No valid files at "+directoryURL); - - //Pick a random event - int iName = randomGenerator.nextInt(eventList.size()); - - //Now get the new file - fileName = eventList.get(iName); - } - - //Now read exactly that event and return it - return readEventFromURL(fileName,directoryURL); - } - - - /** - * Read the previous event from the URL directory - * @return the previous event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - public AEvent readNext(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException - { - // if random mode is set, return a random event - if(getNavigationMode() == NavigationMode.RANDOM) return readRandom(); - - String fileName = null; - - //Check if we have been given a fully specified file url - if(directoryURL.endsWith(".xml")){ - //Store the file name from the url - fileName = directoryURL.substring(directoryURL.lastIndexOf('/')+1,directoryURL.length()); - //trim file endings from url - directoryURL = directoryURL.substring(0, directoryURL.lastIndexOf('/')); - - } else { - - //Update event list every time, so we get new files - ArrayList<String> eventList=getEventListForURL(directoryURL); - - //Check there are more files - if (eventList.size() == 0) - throw new NoMoreEventsException("No valid files at "+directoryURL); - //Loop over file list - int iName = 0; - //search for next entry that is lexicographically larger - //taking first one if there is no current one to compare to - while ((currentEvent != null) && - (currentEvent.getSourceName().compareTo(eventList.get(iName)) >= 0)){ - //Go to next file - ++iName; - // if we have reached the end of the list... - if (iName == eventList.size()) - // if in loop mode go to the first event - if(getNavigationMode() == NavigationMode.LOOP) { - iName = 0; - break; - } - // if not in loop mode, abort - else throw new NoMoreEventsException("No more files after " - + currentEvent.getSourceName() + " in directory "+directoryURL); - } - - //Now get the new file - fileName = eventList.get(iName); - } - - //Now read exactly that event and return it - return readEventFromURL(fileName,directoryURL); - } - - /** - * Read the previous event from the current URL directory - * @return the previous event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - public AEvent readPrevious(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException - { - // in random mode there's no looking back - if(getNavigationMode() == NavigationMode.RANDOM) throw new NoMoreEventsException("No more random events left in the buffer"); - - String fileName = null; - - //Check if we have been given a fully specified file url - if(directoryURL.endsWith(".xml")){ - //Store the file name from the url - fileName = directoryURL.substring(directoryURL.lastIndexOf('/')+1,directoryURL.length()); - //trim file endings from url - directoryURL = directoryURL.substring(0, directoryURL.lastIndexOf('/')); - - } else { - - //Update event list every time, so we get new files - ArrayList<String> eventList=getEventListForURL(directoryURL); - - //Check there are more files - if (eventList.size() == 0) - throw new NoMoreEventsException("No valid files at "+directoryURL); - //Loop over file list - int iName = eventList.size()-1; - //search from the end for the first entry that is lexicographically smaller - //taking last one if there is no previous one to compare to - while ((currentEvent != null) && - (currentEvent.getSourceName().compareTo(eventList.get(iName)) <= 0)){ - //Go to next file - --iName; - // if we have reached the end of the list... - if (iName < 0) - // if in loop mode, go to the last file - if(getNavigationMode() == NavigationMode.LOOP) { - iName = eventList.size()-1; - break; - } - // if not in loop mode, abort - else throw new NoMoreEventsException("No more files before " - + currentEvent.getSourceName() + " in directory "+directoryURL); - } - - //Now get the new file - fileName = eventList.get(iName); - } - - //Now read exactly that event and return it - return readEventFromURL(fileName,directoryURL); - } - -} // class AURLEventSource diff --git a/graphics/AtlantisJava/src/atlantis/event/AZipEventSource.java b/graphics/AtlantisJava/src/atlantis/event/AZipEventSource.java deleted file mode 100644 index 16aeb4d0f5e6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/AZipEventSource.java +++ /dev/null @@ -1,478 +0,0 @@ -package atlantis.event; - -import atlantis.data.AEventFromXML; - -import java.io.IOException; -import java.io.File; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.ArrayList; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AUtilities; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.zip.ZipException; -import java.util.Random; - -/** - * Reading zip archives from local or network files or from zip files stored within .jar file - */ -public class AZipEventSource implements AEventSource -{ - - //define the source type - private enum SourceType { - JAR_FILE, - ZIP_FILE, - ZIP_NETWORK_FILE - }; - - // current event navigation mode - private NavigationMode eventNavigationMode = NavigationMode.SEQUENTIAL; - - // needed for random mode - private Random randomGenerator = new Random(); - - // A list of entries in the zip file - ArrayList<ZipEntry> ZipEntries = new ArrayList<ZipEntry>(); - // pointer to the current zip entry - int eventIndex = -1; - // flag if zip file is read from jar file (as stream) - SourceType sourceType = null; - // event file name (or event archive name) - String eventSource = null; - - /** - * @return current event navigation mode - */ - public NavigationMode getNavigationMode() { - return eventNavigationMode; - } - - /** - * @param mode sets the event navigation mode - */ - public void setNavigationMode(NavigationMode mode) throws InvalidEventSourceException { - if(supportsNavigationMode(mode)) { - eventNavigationMode = mode; - // go to the first event - eventIndex = -1; - } - else - throw new InvalidEventSourceException("Mode '"+mode+"' not supported by current source"); - } - - /** - * @param mode event navigation mode - * @return true if the requested mode is supported by this source - */ - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.SEQUENTIAL || - mode == NavigationMode.RANDOM || - mode == NavigationMode.LOOP) - return true; - return false; - } - - /** - * Constructor with event source - * @param sourceName the name of the source - * @throws InvalidEventSourceException - */ - public AZipEventSource(String sourceName) throws InvalidEventSourceException - { - //Locally opened things - ZipFile zipfile = null; - ZipInputStream stream = null; - - try { - // first check if it is an network file - if (sourceName.startsWith("http://")) { - - //open network zip file input stream - stream = openNetworkStream(sourceName); - //try to read entries from network file - readEntriesFromStream(stream); - //set the source type - sourceType = SourceType.ZIP_NETWORK_FILE; - - } else if (sourceName.startsWith("file://")) { - - // strip the file:// from the source name - sourceName = sourceName.substring(7); - - // Check if this is a regular file - File file = new File(sourceName); - - //Read entries from regular file - if( (file.exists() && file.canRead())){ - - //Now try to open as a zipfile - zipfile = new ZipFile(sourceName); - //Try to read the entries from that file - readEntriesFromFile(zipfile); - //set the source type - sourceType = SourceType.ZIP_FILE; - - - } else { - //might still be a zip file in a jar archive - stream = openJarStream(sourceName); - //try to read entries from jar file - readEntriesFromStream(stream); - //set the source type - sourceType = SourceType.JAR_FILE; - } - } - } catch(AAtlantisException ae) { - //Rethrow - throw new InvalidEventSourceException("Atlantis exception reading from: "+eventSource,ae); - } catch(MalformedURLException mue) { - //Rethrow - throw new InvalidEventSourceException("An unknown protocol is specified: "+eventSource,mue); - } catch(ZipException zfe) { - //Rethrow - throw new InvalidEventSourceException("ZIP format error has occurred: "+eventSource,zfe); - } catch(IOException ioe) { - //Rethrow - throw new InvalidEventSourceException("I/O error has occurred reading: "+eventSource,ioe); - } finally { - //Try to close everthing that has been opened - try { - if (zipfile != null) zipfile.close(); - if (stream != null) stream.close(); - } catch (Throwable t){ - //Do nothing if closing fails - } - } - - //If we have not got a valid source type, throw an error - if (sourceType == null) - throw new InvalidEventSourceException("Could not identify source type of "+sourceName); - - //Make sure there are valid events in the file - if (ZipEntries.size() == 0) - throw new InvalidEventSourceException("No entries in ZIP archive: "+sourceName); - - //Store source name - eventSource=sourceName; - //Otherwise set counter to first event - eventIndex = -1; - } - - /** - * @return the name of the event file or archive - */ - public String getSourceName() { - return eventSource; - } - - /** - * Try to open a zip file in a jar file as input stream - * @param sourceName the name of the zip file - * @return the zip stream - */ - private ZipInputStream openJarStream(String sourceName) throws AAtlantisException - { - //Open as zip input stream - return new ZipInputStream(AUtilities.getFileAsStream(sourceName)); - } - - /** - * Try to open a zip file on the net as input stream - * @param sourceName the URL of the zip file - * @return the zip stream - */ - private ZipInputStream openNetworkStream(String sourceName) throws ZipException, - MalformedURLException, - IOException - { - //Open a network zip file as input stream - return new ZipInputStream(new URL(sourceName).openStream()); - } - - - /** - * Check if this is a valid name of an entry in a zip file or stream - * @param entryName the name of the entry - * @return true if valid - */ - private boolean checkZipEntry(ZipEntry entry){ - //Make sure it is not a directory - if(entry.isDirectory()) return false; - //Make sure it ends with .xml - if (! entry.getName().toLowerCase().endsWith(".xml")) return false; - //everthing fine - return true; - } - - /** - * Get a list of all valid entries from a zip stream - * @param zis the input stream - */ - private void readEntriesFromStream(ZipInputStream zis) throws InvalidEventSourceException - { - try { - //Loop over zip entries - ZipEntry next = null; - while((next = zis.getNextEntry()) != null){ - //If it is valid add it to our list fo entries - if (checkZipEntry(next)) ZipEntries.add(next); - } - } catch(ZipException ze) { - //Rethrow - throw new InvalidEventSourceException("ZIP exception reading entry from zip stream",ze); - } catch(IOException ioe){ - //rethrow - throw new InvalidEventSourceException("I/O exception reading entry from zip stream",ioe); - } - } - - /** - * Get a list of all valid XML file entries from a zip file - * @param file the zip input file - * @throws InvalidEventSourceException - */ - private void readEntriesFromFile(ZipFile file) throws InvalidEventSourceException{ - - //Seems to be a regular file - try{ - //Get the zip file entries - Enumeration<? extends ZipEntry> myenum = file.entries(); - //Loop over zip entries - while(myenum.hasMoreElements()){ - //get the entry - ZipEntry next = (ZipEntry) myenum.nextElement(); - //If it is valid add it to our list fo entries - if (checkZipEntry(next)) ZipEntries.add(next); - } - } catch(IllegalStateException ise){ - //rethrow - throw new InvalidEventSourceException("Zip file was cleased while trying to read entries: "+file.getName()); - } - } - /** - * Read a particular event from a stream. - * Since the file is read as stream, it's not possible to reference a - * particular zip entry. However, we know the number of a zip entry - * we want to get (eventIndex), so we seek (getNextEntry()) to the - * zip entry of interest and then read it. - * @return the event - */ - private AEvent readEventFromStream() throws ReadEventException - { - //Things we need to close in the end - ZipInputStream zis = null; - AEvent event = null; - - try{ - //Check which kind of stream we have and open it - if (sourceType == SourceType.JAR_FILE) - zis = openJarStream(eventSource); - else if (sourceType == SourceType.ZIP_NETWORK_FILE) - zis = openNetworkStream(eventSource); - else - throw new ReadEventException("Trying to read stream from neither jar file nor network file:" +eventSource); - - //Now seek through file to current entry - ZipEntry entry = null; - for(int i = 0; i <= eventIndex; i++) - entry = zis.getNextEntry(); - - //Check if we have reached EOF while skipping - if (entry == null) - throw new ReadEventException("Reached EOF while skippeng to entry #"+eventIndex - +" with name "+ZipEntries.get(eventIndex).getName()+ " in "+eventSource); - - //Next check if this is the entry we wanted to have - if (! entry.getName().equals(ZipEntries.get(eventIndex).getName())) - throw new ReadEventException("Content of zip stream changed since opening it:"+eventSource); - - //Finally read-in this entry - event = AEventFromXML.read(zis, entry.getName()); - } catch (AAtlantisException ae) { - throw new ReadEventException("Atlantis exception reading from: " + eventSource, ae); - } catch (ZipException ze) { - throw new ReadEventException("A ZIP format error has occurred reading entry " + - ZipEntries.get(eventIndex).getName() + " from " + eventSource, ze); - } catch (IllegalStateException ise) { - throw new ReadEventException("The zip file has been closed while reading entry" + - ZipEntries.get(eventIndex).getName() + " from " + eventSource, ise); - } catch (IOException ioe) { - throw new ReadEventException("I/O exception reading from: " + eventSource, ioe); - - } finally { - try { - //Always close the files in the end; - if (zis != null) { - zis.close(); - } - } catch (Throwable t) { - //Do nothing if closing the stream fails - } - } - - //Evertthing is fine, return the event - return event; - } - - /** - * Read a particular event from a zip file - * @param file the zip file - * @return the event - * @throws ReadEventException - */ - private AEvent readEventFromFile() throws ReadEventException - { - ZipFile file = null; - AEvent event = null; - try { - //Open the zip file - file = new ZipFile(eventSource); - //Get the input stream for the requested entry - InputStream stream = file.getInputStream(ZipEntries.get(eventIndex)); - //Get the entry name - String eventName = ZipEntries.get(eventIndex).getName(); - //Read the event - event = AEventFromXML.read(stream,eventName); - } catch (ZipException ze){ - throw new ReadEventException("A ZIP format error has occurred reading entry "+ - ZipEntries.get(eventIndex).getName() + " from "+ eventSource, ze); - } catch (IllegalStateException ise){ - throw new ReadEventException("The zip file has been closed while reading entry"+ - ZipEntries.get(eventIndex).getName() + " from "+ eventSource, ise); - } catch(IOException ioe){ - throw new ReadEventException("I/O error reading entry "+ - ZipEntries.get(eventIndex).getName() + " from "+ eventSource, ioe); - } finally { - //Always close the input stream - try { - if(file != null) file.close(); - } catch (Throwable t) { - //Ignore all errors here - } - } - - //Everything fine so we can return the event - return event; - } - - /** - * Reads a random event from a zipped source - * @return the event - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - protected AEvent randomEvent() throws InvalidEventSourceException, - ReadEventException - { - //Check if we have a valid source - if(( sourceType == null ) || ( eventSource==null )) - throw new InvalidEventSourceException("No valid input source"); - - //Now go to next event - eventIndex = randomGenerator.nextInt(ZipEntries.size()); - - //Now get this stream from its proper source - switch (sourceType){ - case JAR_FILE: return readEventFromStream(); - case ZIP_NETWORK_FILE: return readEventFromStream(); - case ZIP_FILE: return readEventFromFile(); - default: throw new ReadEventException("Unknown event source type"); - } - } - - /** - * Read the next event from a zipped source - * @return the event - * @throws InvalidEventSourceException - * @throws NoMoreEventsException - * @throws ReadEventException - */ - public AEvent nextEvent() throws InvalidEventSourceException, - NoMoreEventsException, - ReadEventException - { - // if random mode is selected, return a random event - if(getNavigationMode() == NavigationMode.RANDOM) return randomEvent(); - - //Check if we have a valid source - if(( sourceType == null ) || ( eventSource==null )) - throw new InvalidEventSourceException("No valid input source"); - - // if we're in loop mode and at the last event, go to the first one - if(getNavigationMode() == NavigationMode.LOOP && eventIndex >= ZipEntries.size() - 1) - eventIndex = 0; - // if we're not in loop mode and at the last event... - else { - // check that there are still some events - if(eventIndex >= ZipEntries.size() - 1){ - String msg="Already at last event in archive"; - // inform user - AOutput.alwaysAppend("\n" + msg+"\n", ALogInterface.WARNING); - throw new NoMoreEventsException(msg); - } - // go to next event. - eventIndex++; - } - - //Now get this stream from its proper source - switch (sourceType){ - case JAR_FILE: return readEventFromStream(); - case ZIP_NETWORK_FILE: return readEventFromStream(); - case ZIP_FILE: return readEventFromFile(); - default: throw new ReadEventException("Unknown event source type"); - } - } - - - /** - * Read the previous event from a zipped source - * @return the event - * @throws InvalidEventSourceException - * @throws NoMoreEventsException - * @throws ReadEventException - */ - public AEvent previousEvent() throws InvalidEventSourceException, - NoMoreEventsException, - ReadEventException - { - - // in random mode there's no looking back - if(getNavigationMode() == NavigationMode.RANDOM) throw new NoMoreEventsException("Cannot go back in random mode"); - - //Check if we have a valid source - if(( sourceType == null ) || ( eventSource==null )) - throw new InvalidEventSourceException("No valid input source"); - - // if we're in loop mode and we're at the first event, go to the last one - if(getNavigationMode() == NavigationMode.LOOP && eventIndex == 0) - eventIndex = ZipEntries.size() -1; - // if we're not il loop mode and at the first event... - else { - // check that there are still some events - if(eventIndex == 0){ - String msg="Already at first event in archive"; - // inform user - AOutput.alwaysAppend("\n" + msg+"\n", ALogInterface.WARNING); - throw new NoMoreEventsException(msg); - } - // go to previous event. - eventIndex--; - } - - //Now get this stream from its proper source - switch (sourceType){ - case JAR_FILE: return readEventFromStream(); - case ZIP_NETWORK_FILE: return readEventFromStream(); - case ZIP_FILE: return readEventFromFile(); - default: throw new ReadEventException("Unknown event source type"); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/oncrpc/AONCRPCEventSource.java b/graphics/AtlantisJava/src/atlantis/event/oncrpc/AONCRPCEventSource.java deleted file mode 100644 index 42410d719418..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/oncrpc/AONCRPCEventSource.java +++ /dev/null @@ -1,304 +0,0 @@ - -package atlantis.event.oncrpc; - -import atlantis.data.AEventFromXML; -import atlantis.utils.ALogger; - -import atlantis.event.ABufferedEventSource; -import atlantis.event.AEvent; -import atlantis.event.AEventInfo; -import atlantis.event.AStreamedEventSource; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; - -import org.acplt.oncrpc.XdrVoid; -import org.acplt.oncrpc.OncRpcTcpClient; -import org.acplt.oncrpc.OncRpcException; -import org.acplt.oncrpc.OncRpcProgramNotRegisteredException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.ConnectException; -import java.net.InetAddress; -import java.util.Arrays; -import java.util.Vector; - -/** - * Implements an event source retrieving events from an ONC/RPC server. - * By implementing a ABufferedEventSource, a number of previous events will be - * available to the user. Care is taken to clear the buffer in case we run into - * memory problems. This event source also provides event streams by implementing - * AStreamedEventSource. - * - * @author sboeser - */ - -public class AONCRPCEventSource extends ABufferedEventSource implements AStreamedEventSource { - - //The logger - private static final ALogger logger = ALogger.getLogger(AONCRPCEventSource.class); - - //The ONC/RPC client - private OncRpcTcpClient client = null; - - //The default timeout value in milliseconds for calling the server - private static final int DEFAULT_TIMEOUT = 2000; - //The name of the stream to read events from - private String currentStream = null; - - /** - * Constructor with the server name and port as a string value - * @param sourceName - * @throws InvalidEventSourceException - */ - public AONCRPCEventSource(String sourceName) throws InvalidEventSourceException { - - //Remove any leading "oncrpc://" indicator - sourceName = sourceName.replaceFirst("oncrpc://", ""); - - //Check if we can split the sourceName in hostName:port pair - String[] sourceParams = sourceName.split(":"); - //Do some sanity check - if (sourceParams.length > 3) - throw new InvalidEventSourceException("Invalid <server[:port][:stream]> specification: "+sourceName); - - //Now try to get the port number if it was given, - //Otherwise get port from portmapper by using 0; - int port = 0; - if ((sourceParams.length > 1)&&(sourceParams[1].length() > 0)){ - try { - port = Integer.decode(sourceParams[1]); - } catch (NumberFormatException nfe){ - throw new InvalidEventSourceException("Invalid port number: "+sourceParams[1]); - } - } - - //More sanity checks - if (port < 0) - throw new InvalidEventSourceException("Invalid port number: "+port); - - //If a stream name was given, set it now - if (sourceParams.length > 2) currentStream = sourceParams[2]; - - - //Now call the fully qualified constructor with the defaul timeout value - createClient(sourceParams[0],port,DEFAULT_TIMEOUT); - - } - - /** - * Constructor with server name, port number and timeout - * @param hostName the name or IP-address of the remote server - * @param port the port number to which the request is send - can be 0 - * @param timeout a timeout value in milliseconds - * @throws InvalidEventSourceException - */ - public AONCRPCEventSource(String hostName, int port, int timeout) throws InvalidEventSourceException { - //Call common constructor entry - createClient(hostName,port,timeout); - } - - /** - * @return a string of the form oncrpc://hostName:port:stream - */ - public String getSourceName() { - return "oncrpc://"+client.getHost().getHostName()+":"+ client.getPort()+ - ((currentStream != null) ? ":"+currentStream : ""); - } - - /** - * This source only supports sequential mode. - * @param mode event navigation mode to test - * @return true if the requested mode is supported by this source - */ - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.SEQUENTIAL) - return true; - return false; - } - - /** - * Common entry point for all constructors - * @param hostName the name or IP-address of the remote server - * @param port the port number to which the request is send - * @param timeout a timeout value in milliseconds - * @throws InvalidEventSourceException - */ - private void createClient(String hostName, int port, int timeout) throws InvalidEventSourceException { - - //Now try to create the client - try { - client = new OncRpcTcpClient(InetAddress.getByName(hostName), - Server.ONCRPCSERVERPROG,Server.ONCRPCSERVERVERS,port); - } catch ( ConnectException e ) { - throw new InvalidEventSourceException("Could not connect to "+hostName,e); - } catch ( OncRpcProgramNotRegisteredException e ) { - throw new InvalidEventSourceException("Server not (yet) registered on "+hostName,e); - } catch ( OncRpcException e ) { - throw new InvalidEventSourceException("ONC/RPC exception while connecting to "+hostName,e); - } catch ( IOException e ) { - throw new InvalidEventSourceException("I/O Exception while connecting to "+hostName,e); - } - - //Set the requested timeout - client.setTimeout(timeout); - } - - /** - * Read the next event from the server - * @param currentEvent the current event - * @return the next event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - @Override - protected synchronized AEvent readNext(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException { - - //Be verbose - logger.info("Call to remote server "+getSourceName()); - - //Ping the server to make sure it is alive, otherwise try to recreate client - try { - client.call(Server.ONCRPC_NULL_PROC,XdrVoid.XDR_VOID, XdrVoid.XDR_VOID); - } catch (OncRpcException e) { - //Server does not respond to ping, try to recreate client - logger.info("Failed to ping server "+getSourceName()+", trying to recreate client"); - //Use setting from old client to create new client, but allow new port number - createClient(client.getHost().getHostName(),0,client.getTimeout()); - } - - //Create an event request - this may als set the default stream - EventRequest eventReq = new EventRequest(-1,-1,getStream()); - - - //use information from existing event if there is - if (currentEvent != null){ - eventReq.EventNumber = currentEvent.getEventNumber(); - eventReq.RunNumber = currentEvent.getRunNumber(); - } - - //Also prepare the return structure - Event event = new Event(); - - //record calling time - long startTime = System.currentTimeMillis(); - - - // perform the remote call - try { - client.call(Server.ONCRPC_GETEVENT_PROC, eventReq, event); - } catch (OncRpcException e) { - throw new InvalidEventSourceException("Failed to get new event from server",e); - } - - //do some statistics - long callDuration = System.currentTimeMillis() - startTime; - logger.debug("Received " + event.EventData.length + " bytes in " + callDuration + " ms"); - - //Now analyze the event we got - //Check if we already have the event - if (event.isIdentical) - //already have this event - throw new NoMoreEventsException("Already have event "+event.EventNumber + - " from run "+event.RunNumber); - //Check if the stream was available - if (!event.isAvailable) - //make event source invalid - throw new InvalidEventSourceException("No event available for stream "+eventReq.StreamName); - - //Check if the event is compressed - if (event.isCompressed) - //not supported yet - throw new UnsupportedOperationException("Support for compressed events not yet implemented"); - - //It seems we got something worth processing - //Strip the trailing null character - event.EventData=(new String(event.EventData)).trim().getBytes(); - //Wrap the data as an inputstream - ByteArrayInputStream bais = new ByteArrayInputStream(event.EventData); - - //Finally construct a new event and return it - return AEventFromXML.read(bais, currentStream); - } - -/** - * Requesting to read the previouse event from the server only appears - * if we have already reached the beginning of the event buffer. - * Only one current events are provided by the server at any time, thus we - * will always throw a NoMoreEventsException. Handling of the exception is left - * to the GUI interface. - * @param currentEvent will be ignored - * @return nothing as it will always raise an exception - * @throws NoMoreEventsException - */ - @Override - protected AEvent readPrevious(AEventInfo currentEvent) throws NoMoreEventsException - { - throw new NoMoreEventsException("ONC/RPC server does not provide a previous event"); - } - - /** - * Get a list of available streams from the server - * @return the list of stream names - * @throws InvalidEventSourceException if the server cannot be contacted - */ - public synchronized Vector<String> getAvailableStreams() throws InvalidEventSourceException { - - //Prepare response structure - Streams streams = new Streams(); - - - //Call the server - try { - client.call(Server.ONCRPC_GETSTREAMS_PROC, XdrVoid.XDR_VOID, streams); - } catch (OncRpcException e) { - throw new InvalidEventSourceException("Failed to get new stream list from server",e); - } - //We got stream names, so just return them - return new Vector(Arrays.asList(streams.StreamNames)); - } - - /** - * Set a new stream as current stream - * @param streamName the name of the stream - * @throws InvalidStreamException if the stream does not exist at the server - */ - public synchronized void setStream(String streamName) throws InvalidStreamException, - InvalidEventSourceException{ - //Check if the requested stream is available - if (! getAvailableStreams().contains(streamName)) - throw new InvalidStreamException("Stream \""+streamName+"\" not available at server"); - - //Store this as the new current stream - currentStream = streamName; - } - - /** - * Get the currently selected stream - * @return the name of the currently selected stream - * @throws NoMoreEventsException if no streams are available - * @throws InvalidEventSourceException if the list of streams can not be obtained - */ - public synchronized String getStream() throws InvalidEventSourceException, - NoMoreEventsException - { - - //If stream name is not set, set it to first available by default - if (currentStream==null){ - //Get list of streams - Vector<String> streams = getAvailableStreams(); - //If there are none throw a "NoMoreEventsException" - if (streams.size()<1) throw new NoMoreEventsException("No streams available"); - //Now set current stream as first one in list - currentStream=streams.firstElement(); - //be verbose - logger.info("Stream not set, using '"+currentStream+"'"); - } - - return currentStream; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Event.java b/graphics/AtlantisJava/src/atlantis/event/oncrpc/Event.java deleted file mode 100644 index cf34cf74cb0f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Event.java +++ /dev/null @@ -1,86 +0,0 @@ -package atlantis.event.oncrpc; -import org.acplt.oncrpc.*; -import java.io.IOException; - -/** - * This structure declares the event as returned from a call - * to the ONCRPC_GETEVENT_PROC. - * @author Sebastian Boeser - */ -public class Event implements XdrAble { - - - /** False if no event exists for the requested stream at the server*/ - public boolean isAvailable; - /** True if no new event exists at the server */ - public boolean isIdentical; - /** True if the event data is compressed */ - public boolean isCompressed; - /** The name fo the stream this event belongs to */ - public String StreamName; - /** The number of the event */ - public long EventNumber; - /** The number of the run */ - public long RunNumber; - /** The event data as byte array */ - public byte [] EventData; - - /** - * Constructor - */ - public Event() { - //Initialize variables - isAvailable = false ; - isIdentical = false ; - isCompressed = false ; - StreamName = ""; - EventNumber = -1; - RunNumber = -1; - EventData = null; - } - - /** - * Constructor that can be used with RPC client call - * @param xdr the stream that holds the encoded event - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public Event(XdrDecodingStream xdr) throws OncRpcException, IOException { - xdrDecode(xdr); - } - - /** - * Encode the information in XDR representation - * @param xdr the stream to encode into - * @throws OncRpcException if encoding fails - * @throws IOException - */ - public void xdrEncode(XdrEncodingStream xdr) throws OncRpcException, IOException { - //Encode all fields in proper order into the stream - xdr.xdrEncodeBoolean(isAvailable); - xdr.xdrEncodeBoolean(isIdentical); - xdr.xdrEncodeBoolean(isCompressed); - xdr.xdrEncodeString(StreamName); - xdr.xdrEncodeLong(EventNumber); - xdr.xdrEncodeLong(RunNumber); - xdr.xdrEncodeByteVector(EventData); - } - - /** - * Decode the information from XDR representation - * @param xdr the stream to decode from - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public void xdrDecode(XdrDecodingStream xdr) throws OncRpcException, IOException { - //Decode all fields in proper order from stream - isAvailable = xdr.xdrDecodeBoolean(); - isIdentical = xdr.xdrDecodeBoolean(); - isCompressed = xdr.xdrDecodeBoolean(); - StreamName = xdr.xdrDecodeString(); - EventNumber = xdr.xdrDecodeLong(); - RunNumber = xdr.xdrDecodeLong(); - EventData = xdr.xdrDecodeDynamicOpaque(); - } - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/event/oncrpc/EventRequest.java b/graphics/AtlantisJava/src/atlantis/event/oncrpc/EventRequest.java deleted file mode 100644 index fa60d7828576..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/oncrpc/EventRequest.java +++ /dev/null @@ -1,79 +0,0 @@ -package atlantis.event.oncrpc; -import org.acplt.oncrpc.*; -import java.io.IOException; - -/** - * Data structure as passed to the ONCRPC_GETEVENT_PROC - * When sending an event request to the server, we have to specify the stream name, - * along with informatian about events we already have. Negative event and run number - * indicates we don't have any events yet. - * @author Sebastian Boeser - */ -public class EventRequest implements XdrAble { - - /** The event number of the event we already have */ - public long EventNumber; - /** The run number of the event we already have */ - public long RunNumber; - /** The name of the stream we are asking events from */ - public String StreamName; - - /** - * Constructor - */ - public EventRequest() { - //Initialize values - EventNumber = -1; - RunNumber = -1; - StreamName = ""; - } - - /** - * Fully qualified constructor - * @param eventNumber the event number of the event we already have - * @param runNumber the run number of the event we already have - * @param streamName the stream we are asking events from - */ - public EventRequest(long eventNumber, long runNumber, String streamName){ - EventNumber = eventNumber; - RunNumber = runNumber; - StreamName = streamName; - } - - /** - * Construct an event request returned from an rpc call - * @param xdr the stream to construct the request from - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public EventRequest(XdrDecodingStream xdr) throws OncRpcException, IOException { - xdrDecode(xdr); - } - - /** - * Encode the information in XDR representation - * @param xdr the stream to encode into - * @throws OncRpcException if encoding fails - * @throws IOException - */ - public void xdrEncode(XdrEncodingStream xdr) throws OncRpcException, IOException { - //Encode into stream in proper order - xdr.xdrEncodeLong(EventNumber); - xdr.xdrEncodeLong(RunNumber); - xdr.xdrEncodeString(StreamName); - } - - /** - * Decode the information in XDR representation - * @param xdr the stream to decode from - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public void xdrDecode(XdrDecodingStream xdr) throws OncRpcException, IOException { - //Decode from stream in proper order - EventNumber = xdr.xdrDecodeLong(); - RunNumber = xdr.xdrDecodeLong(); - StreamName = xdr.xdrDecodeString(); - } - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Server.java b/graphics/AtlantisJava/src/atlantis/event/oncrpc/Server.java deleted file mode 100644 index be83e8e71c9f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Server.java +++ /dev/null @@ -1,47 +0,0 @@ -package atlantis.event.oncrpc; - -/** - * A collection of constants used by the "ONCRPCServer" ONC/RPC program. - * These constants need to match the respective definitons on the C++ server - * side, where they are defined in JiveXML/JiveXML/ONCRPCServer.h - * @author Sebastian Boeser - */ -public interface Server { - - /** - * The ID by which the server is identified - */ - public static final int ONCRPCSERVERPROG = 200048965; - - /** - * The version of the current server interface - */ - public static final int ONCRPCSERVERVERS = 2; - - /** - * The ID of the void procdure - */ - public static final int ONCRPC_NULL_PROC = 0; - - /** - * The ID of the getStatus procedure - */ - public static final int ONCRPC_GETSTATUS_PROC = 1; - - /** - * The ID of the getStreams procedure - */ - public static final int ONCRPC_GETSTREAMS_PROC = 2; - - - /** - * The ID of the getEvent procedure - */ - public static final int ONCRPC_GETEVENT_PROC = 3; - - /** - * The ID of the SetNewEvent procedure - is not implemented in this client - */ - //public static final int ONCRPC_SETEVENT_PROC = 4; -} - diff --git a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Streams.java b/graphics/AtlantisJava/src/atlantis/event/oncrpc/Streams.java deleted file mode 100644 index b61d84cb9732..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/oncrpc/Streams.java +++ /dev/null @@ -1,53 +0,0 @@ -package atlantis.event.oncrpc; -import org.acplt.oncrpc.*; -import java.io.IOException; - -/** - * Data structure as returned from ONCRPC_GETSTREAMS_PROC is a list of stream names - * available at the server. - * @author Sebastian Boeser - */ -public class Streams implements XdrAble { - - /** The array of stream names */ - public String [] StreamNames; - - /** - * Constructor - */ - public Streams() { - //Array is empty by default, nothing to initialize - } - - /** - * Constructure that can be passed to an RPC client call - * @param xdr the stream to decode from - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public Streams(XdrDecodingStream xdr) throws OncRpcException, IOException { - xdrDecode(xdr); - } - - /** - * Encode the information in XDR representation - * @param xdr the XDR stream to encode into - * @throws OncRpcException if encoding fails - * @throws IOException - */ - public void xdrEncode(XdrEncodingStream xdr) throws OncRpcException, IOException { - //Encode the stream name - xdr.xdrEncodeStringVector(StreamNames); - } - - /** - * Decode the information from XDR representation - * @param xdr the XDR stream to decode from - * @throws OncRpcException if decoding fails - * @throws IOException - */ - public void xdrDecode(XdrDecodingStream xdr) throws OncRpcException, IOException { - //Encode stream names - StreamNames = xdr.xdrDecodeStringVector(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/event/package.html b/graphics/AtlantisJava/src/atlantis/event/package.html deleted file mode 100644 index b6788c40f433..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/package.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<p>This package holds all the main event base classes, such as - the data type base AData or the event class AEvent. It also hold the event - sourc managers and interfaces, as well as their concrete implementations. -</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AClientXMLRPC.java b/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AClientXMLRPC.java deleted file mode 100755 index 2e795e433c13..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AClientXMLRPC.java +++ /dev/null @@ -1,244 +0,0 @@ -package atlantis.event.xmlrpc; - -import atlantis.utils.*; -import java.net.URL; -import java.net.MalformedURLException; -import java.util.Vector; - -import org.apache.xmlrpc.client.XmlRpcClient; -import org.apache.xmlrpc.client.AsyncCallback; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; -import org.apache.xmlrpc.client.TimingOutCallback; - - -/** - * Implementation of XMLRPC client communicating to the - * server side running within the Athena framework - JiveXML C++ ulxmlrpcpp server, - * Python Interactive server. - * - * @author Zdenek Maxa - */ -public class AClientXMLRPC -{ - private final static ALogger logger = ALogger.getLogger(AClientXMLRPC.class); - - private String methodName = ""; - private AsyncCallback caller = null; - - // timeout - default timeout delay for synchronous calls [ms] - private int timeout = 6000; - - - - - /** - * Constructor for synchronous XMLRPC calls - * @param method - */ - public AClientXMLRPC(String method) - { - this.methodName = method; - this.caller = null; // synchronous calls will be demanded - - } // AClientXMLRPC() ---------------------------------------------------- - - - - /** - * Constructor for asynchronous XMLRPC calls - * @param method - * @param caller - */ - public AClientXMLRPC(String method, AsyncCallback caller) - { - this.methodName = method; - this.caller = caller; // asynchronous calls - - } // AClientXMLRPC() ---------------------------------------------------- - - - - public void setTimeout(int value) - { - this.timeout = value; - - } // setTimeout() ------------------------------------------------------- - - - - /** - * Asynchronous XMLRPC call, returns immediately and callback - * caller is later invoked when result is available. - * @param client - * @param params - * @throws ARemoteCallerException - */ - private void asynchronousCallXMLRPCServer(XmlRpcClient client, Vector params) - throws ARemoteCallerException - { - String msg = ""; - - logger.debug("Asynchronous XMLRPC call ..."); - try - { - client.executeAsync(methodName, params, caller); - - } - catch(Throwable t) - { - if(t instanceof XmlRpcException) - { - msg = "XMLRPC exception occured, performing the remote call failed."; - } - else - { - msg = "Unspecified exception occured, reason: " + t.getMessage(); - } - logger.debug(msg, t); - throw new ARemoteCallerException(msg); - } - - } // asynchronousCallXMLRPCServer() ------------------------------------- - - - - /** - * Synchronous XMLRPC call. Implemented as asynchronous but timing-out - * call so that we wait until the result is available. This way it prevents - * Atlantis from hanging if remote server (Athena) crashes. - * @param client - * @param params - * @return - * @throws ARemoteCallerException - */ - private String synchronousCallXMLRPCServer(XmlRpcClient client, Vector params) - throws ARemoteCallerException - { - String msg = ""; - String result = null; - - logger.debug("Synchronous timing-out XMLRPC call (timeout " + - timeout / 1000 + "s) ..."); - - TimingOutCallback callback = new TimingOutCallback(timeout); - try - { - client.executeAsync(methodName, params, callback); - } - catch(XmlRpcException xmle) - { - msg = "XMLRPC exception occured, performing the remote call failed."; - logger.debug(msg, xmle); - throw new ARemoteCallerException(msg); - } - - - try - { - result = (String) callback.waitForResponse(); - - // no error, result should be event data - all well - logger.debug("Performing timing out XMLRPC call successful."); - } - catch(Throwable t) - { - if(t instanceof InterruptedException) - { - msg = "The request was interrupted, timed out after " + - timeout / 1000 + "s, try increasing the timer."; - } - else if(t instanceof TimingOutCallback.TimeoutException) - { - msg = "No response was received after waiting " + - timeout / 1000 + "s, try increasing the timer."; - } - else - { - msg = "An error was returned by the server, reason: " + t.getMessage(); - } - logger.debug(msg, t); - throw new ARemoteCallerException(msg); - } - - return result; - - } // synchronousCallXMLRPCServer() -------------------------------------- - - - - /** - * Main method calling remote server methods via XMLRPC - * - * @param serverName - name of the XMLRPC server to call method on - * @param port - where XMLRPC runs - * @param params - Vector containing either command to execute, - * name of a remote variable to get its value or expression to - * process (to change some variables's value) - * @return String - result - * @throws ARemoteCallerException - */ - public String callXMLRPCServer(String serverName, int port, Vector params) - throws ARemoteCallerException - { - - XmlRpcClient client = null; - String result = null; - String msg = null; // logging temporary variable - - msg = "Calling " + serverName + ":" + port; - logger.info(msg); - - - // create instance of XMLRPC client - try - { - // Vector type is only acceptable for XmlRpcClient.execute() / - // .executeAsync() - // String is expected on the remote side by C++ ulxmlrpcpp server - // String, among others, is accepted by Python server as well - - // throws MalformedURLException - XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); - config.setServerURL(new URL(serverName + ":" + port)); - client = new XmlRpcClient(); - client.setConfig(config); - logger.debug("XMLRPC client instantiated successfully."); - } - catch(Throwable t) - { - if(t instanceof MalformedURLException) - { - msg = "Could not create XMLRPC client, bad address " + - serverName + ":" + port + "\n" + - "reason: " + t.getMessage(); - } - else - { - msg = "Unspecified exception occured\n" + - "reason: " + t.getMessage(); - } - - logger.debug(msg, t); - throw new ARemoteCallerException(msg); - } - - - if(caller != null) - { - // perform asynchronous XMLRPC call, returns immediately - asynchronousCallXMLRPCServer(client, params); - } - else - { - // synchronous call, timing out synchronous call - result = synchronousCallXMLRPCServer(client, params); - } - - client = null; - return result; - - } // callXMLRPCServer() ------------------------------------------------- - - -} // class AClientXMLRPC ==================================================== \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/ARemoteCallerException.java b/graphics/AtlantisJava/src/atlantis/event/xmlrpc/ARemoteCallerException.java deleted file mode 100755 index b6958f4d1ea0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/ARemoteCallerException.java +++ /dev/null @@ -1,22 +0,0 @@ -package atlantis.event.xmlrpc; - -import atlantis.utils.*; - - -/** - * - * Exception thrown after errors occured during calls - * to remote server methods (within Athena) via XMLRPC - * - * @author Zdenek Maxa - */ -public class ARemoteCallerException extends AAtlantisException -{ - public ARemoteCallerException(String msg) - { - super("Exception while calling remote procedure.\n" + msg); - - } // ARemoteCallerException() ------------------------------------------- - - -} // class ARemoteCallerException =========================================== diff --git a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPC.java b/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPC.java deleted file mode 100644 index 8d481b260b6e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPC.java +++ /dev/null @@ -1,43 +0,0 @@ -package atlantis.event.xmlrpc; - -import atlantis.utils.*; -import java.io.IOException; -import org.apache.xmlrpc.XmlRpcException; -import org.apache.xmlrpc.webserver.WebServer; -import org.apache.xmlrpc.server.XmlRpcServer; -import org.apache.xmlrpc.server.PropertyHandlerMapping; - -/** - * - * @author Adam Davison - */ -public class AServerXMLRPC { - - private static ALogger logger = ALogger.getLogger(AServerXMLRPC.class); - - private WebServer m_ws; - - public AServerXMLRPC(int port, Class handler) throws XmlRpcException { - - logger.debug("Attempting to create XMLRPC server on port " + port); - logger.debug("Serving requests to handler of type " + handler.getName()); - - m_ws = new WebServer(port); - XmlRpcServer xmlRpcServer = m_ws.getXmlRpcServer(); - PropertyHandlerMapping phm = new PropertyHandlerMapping(); - phm.addHandler(handler.getName(), handler); - xmlRpcServer.setHandlerMapping(phm); - - logger.debug("XMLRPC server created successfully"); - - } - - public void start() throws IOException { - - logger.debug("Attempting to start XMLRPC server"); - m_ws.start(); - logger.info("XMLRPC server started"); - - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPCEventSource.java b/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPCEventSource.java deleted file mode 100644 index f3bf0fe2c684..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AServerXMLRPCEventSource.java +++ /dev/null @@ -1,146 +0,0 @@ -package atlantis.event.xmlrpc; - -import atlantis.utils.*; -import atlantis.canvas.ACanvas; -import atlantis.data.AEventFromXML; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource; -import atlantis.globals.AGlobals; -import atlantis.graphics.encoders.AImageEncoder; -import java.io.ByteArrayInputStream; - -/** - * - * @author Adam Davison - */ -public class AServerXMLRPCEventSource implements AEventSource{ - - private static ALogger logger = ALogger.getLogger(AServerXMLRPCEventSource.class); - - private AEventManager m_aem; - private ACanvas m_canv; - private AImageEncoder m_ie; - - private AEvent m_event = null; // Current event - private String m_sourcename = ""; // Source name - - private NavigationMode eventNavigationMode = NavigationMode.PUSH; - - public AServerXMLRPCEventSource() { - m_aem = AEventManager.instance(); - m_canv = ACanvas.getCanvas(); - m_ie = new AImageEncoder(); - } - - public String getVersion() { - return AGlobals.instance().getVersion(); - } - - public boolean isReady() { - return true; - } - - public boolean shutdown() { - logger.info("Exiting atlantis..."); - System.exit(0); - return true; - } - - public NavigationMode getNavigationMode() { - return eventNavigationMode; - } - - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.PUSH) - return true; - return false; - } - - public void setNavigationMode(NavigationMode mode) throws InvalidEventSourceException { - if(mode != NavigationMode.PUSH) - throw new InvalidEventSourceException("Mode '"+mode.name()+"' not supported by current source"); - eventNavigationMode = mode; - } - - private void setEventFromBytes(byte[] eventdata, String sourcename) throws Exception { - AEvent e = AEventFromXML.read(new ByteArrayInputStream(eventdata), sourcename); - - m_event = e; - m_sourcename = sourcename; - - // Force update from event manager - m_aem.setEventSource(this); - m_aem.nextEvent(); - } - - private byte[] getSingleImage(int w, int h, String type, double s) throws Exception { - if (type.equalsIgnoreCase("png")) { - return m_ie.getPNGData(w, h); - } else if (type.equalsIgnoreCase("scaledpng")) { - return m_ie.getScaledPNGData(w, h, s); - } - - throw new Exception("Unknown image format: " + type); - } - - private byte[] getSingleImageAspect(int w, String type, double s) throws Exception { - int h = m_canv.getRespectiveHeight(w); - return getSingleImage(w, h, type, s); - } - - public byte[][] generateDefaultImages(byte[] eventdata, String sourcename, - int width, double thumb_scale) { - - byte ret[][] = new byte[2][]; - - try { - setEventFromBytes(eventdata, sourcename); - ret[0] = getSingleImageAspect(width, "png", 0.0); - ret[1] = getSingleImageAspect(width, "scaledpng", thumb_scale); - } catch (Exception e) { - logger.error("Error while handling request to generateDefaultImages()", e); - return null; - } - - return ret; - } - - public AEvent nextEvent() throws NoMoreEventsException, InvalidEventSourceException, ReadEventException { - if (m_event == null) { - throw new InvalidEventSourceException(); - } - return m_event; - } - - public AEvent previousEvent() throws NoMoreEventsException, InvalidEventSourceException, ReadEventException { - throw new NoMoreEventsException(); - } - - public String getSourceName() { - return m_sourcename; - } - - /*public byte[][] generateImages(byte[] eventdata, String sourcename, - Integer nimgs, Object[] w, Object[] h, Object[] type, Object[] s) { - - byte ret[][] = new byte[nimgs][]; - - try { - setEventFromBytes(eventdata, sourcename); - - for (int i = 0; i < nimgs; i++) { - // Handle cast of s better here - ret[i] = getSingleImage((Integer) (w[i]), (Integer) (h[i]), - (String) (type[i]), (Double) (s[i])); - } - - } catch (Exception e) { - logger.error("Error while handling request to generateImages()", e); - return null; - } - - return ret; - }*/ - -} diff --git a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AXMLRPCEventSource.java b/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AXMLRPCEventSource.java deleted file mode 100644 index 29967b6e3106..000000000000 --- a/graphics/AtlantisJava/src/atlantis/event/xmlrpc/AXMLRPCEventSource.java +++ /dev/null @@ -1,238 +0,0 @@ - -package atlantis.event.xmlrpc; - -import atlantis.event.*; -import atlantis.data.AEventFromXML; -import atlantis.Atlantis; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; - -import atlantis.utils.ALogger; - -import java.io.ByteArrayInputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Vector; - - -/** - * Implements an event source retrieving events from an XMLRCP server. - * By implementing a ABufferedEventSource, a number of previous events will be - * available to the user. Care is taken to clear the buffer in case we run into - * memory problems. - * - * @author sboeser - */ - -public class AXMLRPCEventSource extends ABufferedEventSource { - - //The logger - private static final ALogger logger = ALogger.getLogger(AXMLRPCEventSource.class); - - //The XMLRPC client - private AClientXMLRPC XMLRPCClient = null; - //The Method to call on the server side - private static final String GETEVENTDATA = "getEventData"; - //The default timeout value in milliseconds for calling the server - private static final int DEFAULT_TIMEOUT = 2000; - //The name of the local machine (send along with event request) - private String localMachineName = "<unknown>"; - //The name and port number of the remote host - private String remoteMachineName = null; - //The port number to which we should connect - private Integer portNumber = null; - //The timeout for a request - private Integer timeOut = null; - - /** - * Constructor with the server name and port as a string value - * @param sourceName - * @throws InvalidEventSourceException - */ - public AXMLRPCEventSource(String sourceName) throws InvalidEventSourceException { - - //Remove any leading "xmlrpc://" indicator - sourceName = sourceName.replaceFirst("xmlrpc://", ""); - //try to split sourceName in serverName:port pair - String[] sourceParams = sourceName.split(":"); - //Do some checks - if (sourceParams.length != 2) - throw new InvalidEventSourceException("Invalid <server:port> specification: "+sourceName); - - //Try to get the port number - int port = -1; - try { - port = Integer.decode(sourceParams[1]); - } catch (NumberFormatException nfe){ - throw new InvalidEventSourceException("Invalid port number: "+sourceParams[1]); - } - - if (port < 0) - throw new InvalidEventSourceException("Invalid port number: "+port); - - //Now call the fully qualified constructor with the defaul timeout value - CreateXMLRPCEventSource(sourceParams[0],port,DEFAULT_TIMEOUT); - - } - - /** - * Constructor with server name, port number and timeout - * @param serverName the name or IP-address of the remote server - * @param port the port number to which the request is send - * @param timeout a timeout value in milliseconds - * @throws InvalidEventSourceException - */ - public AXMLRPCEventSource(String serverName, int port, int timeout) - throws InvalidEventSourceException { - //Call common constructor entry - CreateXMLRPCEventSource(serverName,port,timeout); - } - - /** - * @return a string of the form xmlrpc://servername:port - */ - public String getSourceName() { - return "xmlrpc://"+remoteMachineName+":"+portNumber; - } - - /** - * @param mode event navigation mode - * @return true if the requested mode is supported by this source - */ - public boolean supportsNavigationMode(NavigationMode mode) { - if(mode == NavigationMode.SEQUENTIAL) - return true; - return false; - } - - /** - * Common entry point for all constructors - * @param serverName the name or IP-address of the remote server - * @param port the port number to which the request is send - * @param timeout a timeout value in milliseconds - * @throws InvalidEventSourceException - */ - private void CreateXMLRPCEventSource(String serverName, int port, int timeout) - throws InvalidEventSourceException { - - //Store the input values - remoteMachineName = serverName; - portNumber = port; - timeOut = timeout; - - //try to obtain the name of the local machine - try { - localMachineName = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException ex) { - //Can't get name of local host - String msg = "Unable to obtain local machine name, using \"" - + localMachineName +"\" instead"; - logger.error(msg); - } catch(Exception ex) { - //Rethrow everything else as invalid source exception - throw new InvalidEventSourceException("Exception trying to obtain local machine name",ex); - } - - //Finally create a new AClientXMLRPC object - XMLRPCClient = new AClientXMLRPC(GETEVENTDATA); - - } - - /** - * Read the next event from the server - * @param currentEvent the current event - * @return the next event - * @throws NoMoreEventsException - * @throws InvalidEventSourceException - * @throws ReadEventException - */ - @Override - protected AEvent readNext(AEventInfo currentEvent) throws NoMoreEventsException, - InvalidEventSourceException, - ReadEventException { - //Be verbose - logger.info("Call to remote server xmlrpc://" + remoteMachineName + ":" + portNumber.toString()); - - //send the name of the local machine to the JiveXML server - Vector<String> parameters = new Vector(); - parameters.add(localMachineName); - - //record calling time - long startTime = System.currentTimeMillis(); - - //The XMLRPC client will return data as a string - String eventXMLData = null; - - // perform the remote call - try { - eventXMLData = XMLRPCClient.callXMLRPCServer("http://"+remoteMachineName, portNumber, parameters); - } catch (ARemoteCallerException ex) { - //An error occured - String msg = "readNext(): Exception while calling remote server"; - logger.error(msg,ex); - //rethrow - throw new InvalidEventSourceException(msg, ex); - } - - //do some statistics - long callDuration = System.currentTimeMillis() - startTime; - logger.debug("Received " + eventXMLData.length() + " bytes in " + callDuration + " ms"); - - - //If there is just no new event, we should get back an empty string - if (eventXMLData.length() == 0) { - throw new NoMoreEventsException("No event available from the server (yet)"); // something was received, going to process the result - } - if (!(eventXMLData.startsWith("<?xml"))) { - String msg = "Invalid event data received from JiveXML server"; - logger.error(msg); - throw new ReadEventException(msg); - } - - - - //So it seems we got something worth processing - logger.info("Received data from remote server, going to process it ..."); - - // Wrap the string as an inputstream - ByteArrayInputStream bais = new ByteArrayInputStream(eventXMLData.getBytes()); - - //Construct a new event - AEvent event = AEventFromXML.read(bais, remoteMachineName+":"+portNumber); - - /** - * The XMLRPC server is not clever enough to return no event if there is no - * new one. In order to avoid filling the buffer with identical events, we - * therefore check here if we don't already have that event, and throw a - * NoMoreEventsException in case we do. - */ - if (event.equals(currentEvent)){ - String msg = "Already have event "+event.getEventNumber()+" in run " - + event.getRunNumber() + " - ignored!"; - throw new NoMoreEventsException(msg); - } - - - //Now we are sure we have a next event, return it - return event; - - } - -/** - * Requesting to read the previous event from the server only appears - * if we have already reached the beginning of the event buffer. - * Only one current events are provided by the server at any time, thus we - * will always throw a NoMoreEventsException. Handling of the exception is left - * to the GUI interface, and may e.g be ignored in loop mode. - * @param currentEvent will be ignored - * @return nothing as it will always raise an exception - * @throws NoMoreEventsException - */ - @Override - protected AEvent readPrevious(AEventInfo currentEvent) throws NoMoreEventsException - { - throw new NoMoreEventsException("XMLRPC server does not provide a previous event"); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AAtlasDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AAtlasDetector.java deleted file mode 100755 index bf8b9a267fbf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AAtlasDetector.java +++ /dev/null @@ -1,119 +0,0 @@ -package atlantis.geometry; - -import java.util.regex.Pattern; - -import atlantis.config.ADefaultValues; -import atlantis.utils.ALogger; - - -/** - * AAtlasDetector - * contains one instance of - * ABoxDetectors (which contains all instances of ABoxDetector) (MDT,RPC in barrel) - * ATrapezoidDetectors (which contains all instances of ATrapezoidDetector) (MDT,TGC endcap) - * AGeneralDetectors (which contains all instances of AGeneralPathDetector, - * ADiscDetector, ARectangleDetector) (all others) - */ -public class AAtlasDetector extends ADetectorSystem -{ - private static ALogger logger = ALogger.getLogger(AAtlasDetector.class); - private static ADetectorSystem theDetector; - - public AAtlasDetector(String geomIdCalo) - { - super(new ADetectors[] - { - new AGeneralDetectors( - new AGeometryFromXMLReader().readDetectorGeometryFromXML(geomIdCalo)) - }); - - logger.info("Using geometry file: " + geomIdCalo); - - setGeometryName(geomIdCalo); - - } // AAtlasDetector(String fileName) ------------------------------------ - - - - public AAtlasDetector(String geomIdCalo, String geomMuon) - { - super(new ADetectors[] - { - new ABoxDetectors( - new AGeometryFromXMLReader().readDetectorGeometryFromXML(geomMuon)), - new ATrapezoidDetectors( - new AGeometryFromXMLReader().readDetectorGeometryFromXML(geomMuon)), - new AGeneralDetectors( - new AGeometryFromXMLReader().readDetectorGeometryFromXML(geomMuon)), - new AGeneralDetectors( - new AGeometryFromXMLReader().readDetectorGeometryFromXML(geomIdCalo)) - }); - - logger.info("Using geometry file: " + geomIdCalo); - logger.info("Using geometry file: " + geomMuon); - - setGeometryName(geomIdCalo); - - } // AAtlasDetector(String fileName, String muFileName) ----------------- - - - - private static void setGeometryName(String absFileName) - { - // default geometry file, shall always be AGeometry.xml - // arbitrary, named geometry file, geometry name after '_' character - // (but there is also AGeometryTB.xml) - String name = "AGeometry"; - String ext = ".xml"; - String pattern = ".*" + name + "_?.*" + ext; - - if(Pattern.compile(pattern).matcher(absFileName).matches()) - { - int s = absFileName.lastIndexOf(name); - int e = absFileName.lastIndexOf(ext); - String r = absFileName.substring(s + name.length(), e); - if(r.startsWith("_")) - { - // arbitrary, named geometry - geometryName = r.substring(1); // without leading _ - ADefaultValues.set("GeometryName", geometryName); - } - else if("".equals(r)) - { - // default geometry (no name given: "") - geometryName = "<default>"; - ADefaultValues.set("GeometryName", ""); - } - else - { - geometryName = r; - ADefaultValues.set("GeometryName", geometryName); - } - } - else - { - logger.warn("Geometry name not matching regular expression: " + - pattern + "\n geometry name will be: n/a"); - geometryName = "n/a"; - } - - } // setGeometryName() -------------------------------------------------- - - - /** - * @return the detector - */ - public static ADetectorSystem getDetector() { - return theDetector; - } - - - /** - * @param theDetector the ATLAS detector geometry to be used - */ - public static void setDetector(ADetectorSystem theDetector) { - AAtlasDetector.theDetector = theDetector; - } - - -} // class class AAtlasDetector ============================================= diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelCalorimeterDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ABarrelCalorimeterDetector.java deleted file mode 100755 index 870a7d46f7ef..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelCalorimeterDetector.java +++ /dev/null @@ -1,284 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.graphics.AClipper; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AMath; - -/** - * Class representing a calorimeter part in the barrel section of ATLAS. - * - * @author Eric Jansen - */ -public class ABarrelCalorimeterDetector extends ACalorimeterDetector { - - /** - * Constructs a new barrel calorimeter object. - * @param name String name of the object - * @param color String name of the color used to draw this object - * @param sampling int sampling of this calorimeter part - * @param region int region of this calorimeter part - * @param rMin double inner radius - * @param rMax double outer radius - * @param zMin double inner z - * @param zMax double outer z - * @param eta0 double start of the first cell in eta - * @param deta double size of a cell in eta - * @param neta int number of cells in eta - * @param meta int eta index of the first cell - * @param phi0 double start of the first cell in phi - * @param nphi int number of cells in phi - */ - public ABarrelCalorimeterDetector(String name, String color, int sampling, int region, - double rMin, double rMax, double zMin, double zMax, - double eta0, double deta, int neta, int meta, - double phi0, int nphi) { - super(name, color); - - // Just to be sure we take absolute values here. - this.sampling = Math.abs(sampling); - this.region = Math.abs(region); - - this.rMin = rMin; - this.rMax = rMax; - this.zMin = zMin; - this.zMax = zMax; - this.eta0 = eta0; - this.deltaEta = deta; - this.numEta = neta; - this.minEta = meta; - this.phi0 = Math.toRadians(phi0); - this.numPhi = nphi; - this.deltaPhi = 2.*Math.PI/numPhi; - - this.detEtaMin = AMath.etaAbs(this.zMax, this.rMax); - this.detEtaMax = AMath.etaAbs(this.zMin, this.rMin); - - if (this.eta0 <= 0.0) { - this.zMin = -this.zMax; - this.detEtaMin = -this.detEtaMax; - } - - // This one is used for clipping the cell geometry in rho-z. - this.clipper = new AClipper(this.zMin, this.zMax, this.rMin, this.rMax); - - // These arrays are used by the getDetectorIndex() method in ACalorimeterData. - // They provide fast mapping of hits to detectors. - if (this.name.indexOf("LAr") >= 0 && this.sampling < lar[1].length - && this.region < lar[1][this.sampling].length) { - - lar[1][this.sampling][this.region] = detectors.indexOf(this); - } else if (this.name.equals("TILE Barrel") && this.sampling < tile.length) { - tile[this.sampling] = detectors.indexOf(this); - - } else if (this.name.equals("Extended TILE") && this.sampling < tile_ext.length) { - tile_ext[this.sampling] = detectors.indexOf(this); - - } else { - System.out.println("Unknown calorimeter object: '" + this.name + "'" - + " some hits might not be displayed correctly."); - } - } - - /** - * Returns the y-x geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getYXUser() { - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - for (int i = 0; i < numPhi + 1; i++) { - hv[0][i] = rMin * Math.cos(phi0 + i * deltaPhi); - hv[1][i] = rMin * Math.sin(phi0 + i * deltaPhi); - hv[0][numPhi + 1 + i] = rMax * Math.cos(phi0 - i * deltaPhi); - hv[1][numPhi + 1 + i] = rMax * Math.sin(phi0 - i * deltaPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phi0, rMin, rMax)); - } - } - - /** - * Returns the rho-z geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getRZUser() { - double[] h, v; - - double etaMax = eta0 + numEta * deltaEta; - double etaMin; - if (eta0 <= 0.0) { - etaMin = -etaMax; - } else { - etaMin = eta0; - } - - // Calculate the polygon in the positive h and v. - if (name.indexOf("TILE") >= 0) { - h = new double[] {zMax, zMin, zMin, zMax}; - v = new double[] {rMax, rMax, rMin, rMin}; - } else { - double z0 = rMax*Math.sinh(etaMax); - double z1 = rMax*Math.sinh(etaMin); - double z2 = rMin*Math.sinh(etaMin); - double z3 = rMin*Math.sinh(etaMax); - - h = new double[] {z0, z1, z2, z3}; - v = new double[] {rMax, rMax, rMin, rMin}; - } - - // Clip the polygon. - ACoord coord = clipper.clipPolygon(h, v, h.length); - - // Copy it to negative v. - coord = new ACoord(coord, coord.mirrorV()); - if (eta0 > 0.0) { - // If it doesn't continue through h=0, copy it to negative h. - coord = new ACoord(coord, coord.mirrorH()); - } - - return coord; - } - - /** - * Returns the phi-rho geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getFRUser() { - double[][] hv = new double[2][]; - - hv[0] = new double[] {rMin, rMax, rMax, rMin}; - hv[1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the y-x geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getYXCell(int eta, int phi) { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - double[][] hv = new double[2][]; - double phiMin = phi0+phi*deltaPhi; - double phiMax = phiMin+deltaPhi; - - hv[0] = new double[] {rMax*Math.cos(phiMin), rMax*Math.cos(phiMax), - rMin*Math.cos(phiMax), rMin*Math.cos(phiMin)}; - hv[1] = new double[] {rMax*Math.sin(phiMin), rMax*Math.sin(phiMax), - rMin*Math.sin(phiMax), rMin*Math.sin(phiMin)}; - - return new ACoord(hv); - } - - /** - * Returns the rho-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getRZCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - int sign = getRSign(phi); - - if (side != 0) side /= Math.abs(side); - - if (name.indexOf("TILE") >= 0) { - // Outer layer of TILE has eta increments of two. - if (sampling == 2) eta = minEta + (eta-minEta)/2; - - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - - if (name.indexOf("Barrel") >= 0 && sampling == 1) { - double dr = (rMax-rMin); - double r0 = rMin; - double r1 = rMin+dr/2.; - double r2 = rMax; - double z0 = (rMin+dr/4.) * Math.sinh(etaMin); - double z1 = (rMax-dr/4.) * Math.sinh(etaMin); - double z2 = (rMin+dr/4.) * Math.sinh(etaMax); - double z3 = (rMax-dr/4.) * Math.sinh(etaMax); - - if (eta == this.minEta && this.zMin > 0) z0 = z1 = this.zMin; - if (eta == this.minEta + this.numEta - 1) z2 = z3 = this.zMax; - - hv[0] = new double[] {z3, z1, z1, z0, z0, z2, z2, z3}; - hv[1] = new double[] {r2, r2, r1, r1, r0, r0, r1, r1}; - } else { - double zMin = (rMin+rMax)/2. * Math.sinh(etaMin); - double zMax = (rMin+rMax)/2. * Math.sinh(etaMax); - - if (eta == this.minEta && this.zMin > 0)zMin = this.zMin; - if (eta == this.minEta + this.numEta - 1) zMax = this.zMax; - - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {rMax, rMax, rMin, rMin}; - } - } else if (name.indexOf("LAr") >= 0) { - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - - hv[0] = new double[] {rMax*Math.sinh(etaMax), rMax*Math.sinh(etaMin), - rMin*Math.sinh(etaMin), rMin*Math.sinh(etaMax)}; - hv[1] = new double[] {rMax, rMax, rMin, rMin}; - } else { - return ACoord.NO_DATA; - } - - // Clip the cell and send it to the right quadrant. - ACoord coord = clipper.clipPolygon(hv[0], hv[1], hv[0].length); - for (int i=0; i<coord.hv[0][0].length; i++) { - coord.hv[0][0][i] *= side; - coord.hv[1][0][i] *= sign; - } - - return coord; - } - - /** - * Returns the eta-phi geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getVPCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - double phiMin = Math.toDegrees(phi0 + phi*deltaPhi); - double phiMax = phiMin + Math.toDegrees(deltaPhi); - - side /= Math.abs(side); - - hv[0] = new double[] {side*etaMax, side*etaMin, side*etaMin, side*etaMax}; - hv[1] = new double[] { phiMax, phiMax, phiMin, phiMin}; - - return new ACoord(hv); - } - - /** - * Returns the eta value of the center (in eta) of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double eta value - */ - public double getEta(int eta, int side) { - if (side < 0) { - return -getEta(eta, -side); - } else { - if (name.indexOf("TILE") >= 0) { - // Outer layer of TILE has eta increments of two. - if (sampling == 2) eta = minEta + (eta-minEta)/2; - } - - return eta0 + (eta - minEta + 0.5) * deltaEta; - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelSiliconDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ABarrelSiliconDetector.java deleted file mode 100755 index 14e53e77d059..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelSiliconDetector.java +++ /dev/null @@ -1,276 +0,0 @@ -package atlantis.geometry; - -import atlantis.canvas.AWindow; -import atlantis.data.AS3DData; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionYX; -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -/** - * Class representing a pixel/SCT barrel detector part. - * Also implements methods to draw more detailed structure of the detector. - * - * @author Eric Jansen - */ -public class ABarrelSiliconDetector extends ADetector { - - private static List detectors = null; - - protected int layer; - protected double length; - protected double width; - protected double thickness; - protected int numZ; - protected int numPhi; - protected double tilt; - protected double r0; - protected double phi0; - protected double zMin; - protected double zMax; - - protected double deltaPhi; - protected double deltaZ; - protected double rMin; - protected double rMax; - - public ABarrelSiliconDetector(String name, String color, int layer, double length, double width, double thickness, - int numZ, int numPhi, double tilt, double r0, double phi0, double zMin, double zMax) { - super(name, " ", color); - - if (detectors == null) { - detectors = new ArrayList(); - } - detectors.add(this); - - this.layer = layer; - this.length = length; - this.width = width; - this.thickness = thickness; - this.numZ = numZ; - this.numPhi = numPhi; - this.tilt = Math.toRadians(tilt); - this.r0 = r0; - this.phi0 = Math.toRadians(phi0); - this.zMin = zMin; - this.zMax = zMax; - - this.deltaPhi = 2.*Math.PI / this.numPhi; - this.deltaZ = (this.zMax - this.zMin) / this.numZ; - - // We do not take thickness/2 and width/2 to have some extra margin - this.rMin = this.r0 - Math.abs(this.thickness*Math.cos(this.tilt)) - - Math.abs(this.width*Math.sin(this.tilt)); - this.rMax = this.r0 + Math.abs(this.thickness*Math.cos(this.tilt)) - + Math.abs(this.width*Math.sin(this.tilt)); - } - - /** - * Empties the list of instances of this class. - */ - public static void clear() { - if (detectors != null) { - detectors.clear(); - } - } - - /** - * This function draws the wafer/stave structure of the silicon detectors. It is called - * from ADetectorSystem.draw(). - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - public static void drawAdditionalItems(AWindow window, AGraphics ag, AProjection2D projection) { - AParameter inDetDetail = parameterStore.getUnknown("Det", "SiliconDetail"); - if (inDetDetail != null && detectors != null && inDetDetail.getStatus()) { - for (int i=0; i<detectors.size(); i++) { - ACoord coord = ACoord.NO_DATA; - ABarrelSiliconDetector detector = (ABarrelSiliconDetector) detectors.get(i); - if (projection instanceof AProjectionYX) { - coord = detector.getYXDetail(); - } else if (projection instanceof AProjectionRZ) { - coord = detector.getRZDetail(); - } else if (projection instanceof AProjectionFZ) { - coord = detector.getFZDetail(); - } else if (projection instanceof AProjectionFR) { - coord = detector.getYXDetail().convertYXToFR().includePhiWrapAround("FR"); - } - - if (coord != ACoord.NO_DATA) { - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "SiliconDetail").getI()]); - - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - for (int j=0; j<display.hv[0].length; j++) { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - } - - /** - * Determines if this element should be visible or not. - * @return visibility - */ - protected boolean isVisible() { - int cut = parameterStore.get("CutsInDet", "SCT").getI(); - - if (cut == AS3DData.CUT_INDET_SCT_ALL || cut == AS3DData.CUT_INDET_SCT_BARREL) { - return true; - } else { - return false; - } - } - - /** - * Returns the detector outline in the y-x projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getYXUser() { - if (!isVisible()) { - return ACoord.NO_DATA; - } - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) { - return ACoord.NO_DATA; - } - - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - - for (int i = 0; i < numPhi + 1; i++) { - hv[0][i] = rMin * Math.cos(phi0 + (i + 0.5) * deltaPhi); - hv[1][i] = rMin * Math.sin(phi0 + (i + 0.5) * deltaPhi); - - hv[0][numPhi + 1 + i] = rMax * Math.cos(phi0 - (i + 0.5) * deltaPhi); - hv[1][numPhi + 1 + i] = rMax * Math.sin(phi0 - (i + 0.5) * deltaPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phi0, rMin, rMax)); - } - } - - /** - * Returns the detector outline in the rho-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getRZUser() { - //if (!isVisible()) return ACoord.NO_DATA; - - double[][][] hv = new double[2][2][]; - - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFZUser() { - if (!isVisible()) return ACoord.NO_DATA; - - double[][] hv = new double[2][]; - - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-rho projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFRUser() { - if (!isVisible()) return ACoord.NO_DATA; - - double[][] hv = new double[2][]; - - hv[0] = new double[] {rMin, rMax, rMax, rMin}; - hv[1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the wafer/stave structure in the y-x projection. - * @return ACoord polygons representing the wafers/staves - */ - protected ACoord getYXDetail() { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - if (!isVisible()) return ACoord.NO_DATA; - - double[][][] hv = new double[2][numPhi][]; - for (int i=0; i<numPhi; i++) { - double phi = phi0 + i*deltaPhi; - - double x1 = r0*Math.cos(phi) + width/2.*Math.sin(phi+tilt) + thickness/2.*Math.cos(phi+tilt); - double x2 = r0*Math.cos(phi) - width/2.*Math.sin(phi+tilt) + thickness/2.*Math.cos(phi+tilt); - double x3 = r0*Math.cos(phi) - width/2.*Math.sin(phi+tilt) - thickness/2.*Math.cos(phi+tilt); - double x4 = r0*Math.cos(phi) + width/2.*Math.sin(phi+tilt) - thickness/2.*Math.cos(phi+tilt); - - double y1 = r0*Math.sin(phi) - width/2.*Math.cos(phi+tilt) + thickness/2.*Math.sin(phi+tilt); - double y2 = r0*Math.sin(phi) + width/2.*Math.cos(phi+tilt) + thickness/2.*Math.sin(phi+tilt); - double y3 = r0*Math.sin(phi) + width/2.*Math.cos(phi+tilt) - thickness/2.*Math.sin(phi+tilt); - double y4 = r0*Math.sin(phi) - width/2.*Math.cos(phi+tilt) - thickness/2.*Math.sin(phi+tilt); - - hv[0][i] = new double[] {x1, x2, x3, x4}; - hv[1][i] = new double[] {y1, y2, y3, y4}; - } - return new ACoord(hv); - } - - /** - * Returns the wafer/stave structure in the rho-z projection. - * @return ACoord polygons representing the wafers/staves - */ - protected ACoord getRZDetail() { - // if (!isVisible()) return ACoord.NO_DATA; - - double[][][] hv = new double[2][2*numZ][]; - - for (int i=0; i<numZ; i++) { - hv[0][i] = new double[] {zMin+(i+1)*deltaZ, zMin+i*deltaZ, zMin+i*deltaZ, zMin+(i+1)*deltaZ}; - hv[1][i] = new double[] {rMax, rMax, rMin, rMin}; - - hv[0][numZ+i] = new double[] {zMin+(i+1)*deltaZ, zMin+i*deltaZ, zMin+i*deltaZ, zMin+(i+1)*deltaZ}; - hv[1][numZ+i] = new double[] {-rMin, -rMin, -rMax, -rMax}; - } - return new ACoord(hv); - } - - /** - * Returns the wafer/stave structure in the phi-z projection. - * @return ACoord polygons representing the wafers/staves - */ - protected ACoord getFZDetail() { - if (!isVisible()) return ACoord.NO_DATA; - - // Phi geometry is a mess, draw only the staves in this projection. - double[][][] hv = new double[2][numZ+1][2]; - for (int i=0; i<=numZ; i++) { - hv[0][i][0] = zMin + i*deltaZ; - hv[1][i][0] = 360.; - hv[0][i][1] = zMin + i*deltaZ; - hv[1][i][1] = 0.; - } - - return new ACoord(hv).includePhiWrapAround("FZ"); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelTRTDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ABarrelTRTDetector.java deleted file mode 100755 index 8ccd0a795285..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ABarrelTRTDetector.java +++ /dev/null @@ -1,184 +0,0 @@ -package atlantis.geometry; - -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionYX; -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -/** - * Class representing a TRT barrel detector part. - * Also implements methods to draw more detailed structure of the detector. - * - * @author Eric Jansen - */ -public class ABarrelTRTDetector extends ADetector { - - private static List detectors = null; - - protected int layer; - protected int numPhi; - protected double rMin; - protected double rMax; - protected double phiIn; - protected double phiOut; - protected double zMin; - protected double zMax; - protected double deltaPhi; - - public ABarrelTRTDetector(String name, String color, int layer, int numPhi, double rMin, double rMax, - double phiIn, double phiOut, double zMin, double zMax) { - super(name, " ", color); - - if (detectors == null) { - detectors = new ArrayList(); - } - detectors.add(this); - - this.layer = layer; - this.numPhi = numPhi; - this.rMin = rMin; - this.rMax = rMax; - this.phiIn = Math.toRadians(phiIn); - this.phiOut = Math.toRadians(phiOut); - this.zMin = zMin; - this.zMax = zMax; - - this.deltaPhi = 2.*Math.PI / numPhi; - } - - /** - * Empties the list of instances of this class. - */ - public static void clear() { - if (detectors != null) { - detectors.clear(); - } - } - - /** - * This function draws the module structure of the TRT detector. It is called - * from ADetectorSystem.draw(). - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - public static void drawAdditionalItems(AWindow window, AGraphics ag, AProjection2D projection) { - AParameter inDetDetail = parameterStore.getUnknown("Det", "TRTDetail"); - if (inDetDetail != null && detectors != null && inDetDetail.getStatus()) { - for (int i=0; i<detectors.size(); i++) { - ACoord coord = ACoord.NO_DATA; - ABarrelTRTDetector detector = (ABarrelTRTDetector) detectors.get(i); - if (projection instanceof AProjectionYX) { - coord = detector.getYXDetail(); - } else if (projection instanceof AProjectionFR) { - coord = detector.getYXDetail().convertYXToFR().includePhiWrapAround("FR"); - } - - if (coord != ACoord.NO_DATA) { - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "TRTDetail").getI()]); - - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - for (int j=0; j<display.hv[0].length; j++) { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - } - - /** - * Returns the detector outline in the y-x projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getYXUser() { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - - for (int i = 0; i < numPhi + 1; i++) { - hv[0][i] = rMin * Math.cos(phiIn + i * deltaPhi); - hv[1][i] = rMin * Math.sin(phiIn + i * deltaPhi); - - hv[0][numPhi + 1 + i] = rMax * Math.cos(phiOut - i * deltaPhi); - hv[1][numPhi + 1 + i] = rMax * Math.sin(phiOut - i * deltaPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phiIn, rMin, rMax)); - } - } - - /** - * Returns the detector outline in the rho-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getRZUser() { - double[][][] hv = new double[2][2][]; - - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFZUser() { - return ACoord.NO_DATA; - } - - /** - * Returns the detector outline in the phi-rho projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFRUser() { - double[][] hv = new double[2][]; - - hv[0] = new double[] {rMin, rMax, rMax, rMin}; - hv[1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the module structure in the y-x projection. - * @return ACoord polygons representing the modules - */ - protected ACoord getYXDetail() { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - - double[][][] hv = new double[2][numPhi][]; - for (int i=0; i<numPhi; i++) { - double phiMin = i*deltaPhi; - double phiMax = (i+1)*deltaPhi; - - double x1 = rMax*Math.cos(phiMin+phiOut); - double x2 = rMax*Math.cos(phiMax+phiOut); - double x3 = rMin*Math.cos(phiMax+phiIn); - double x4 = rMin*Math.cos(phiMin+phiIn); - - double y1 = rMax*Math.sin(phiMin+phiOut); - double y2 = rMax*Math.sin(phiMax+phiOut); - double y3 = rMin*Math.sin(phiMax+phiIn); - double y4 = rMin*Math.sin(phiMin+phiIn); - - hv[0][i] = new double[] {x1, x2, x3, x4}; - hv[1][i] = new double[] {y1, y2, y3, y4}; - } - return new ACoord(hv); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetector.java deleted file mode 100755 index 68fda4c768eb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetector.java +++ /dev/null @@ -1,172 +0,0 @@ -package atlantis.geometry; - -import atlantis.utils.AMath; -import atlantis.parameters.*; -import atlantis.graphics.ACoord; - -/** - * in ATLAS boxes are RPC and MDT in the barrel - */ - -public class ABoxDetector extends ADetector { - - double zMin; - double zMax; - double rMin; - double rMax; - double phi; - double excl; - double size; - String stationName; - int stationEta; - int stationPhi; - int sector; - - public ABoxDetector(String name, double zMin, double zMax, double rMin, - double rMax, double phi, double excl, double size, int stationEta, int stationPhi) { - super(name, " ", name.substring(0, 3)); - this.zMin=zMin; - this.zMax=zMax; - this.rMin=rMin; - this.rMax=rMax; - this.phi=phi; - this.excl=excl; - this.size=size; - this.stationName=name.substring(4, 7); - this.stationEta=stationEta; - this.stationPhi=stationPhi; - this.sector=((int)((phi+Math.PI/16)/(Math.PI/8)))%16; - } - - protected ACoord getFZUser() { - double cosPhi=Math.cos(phi); - double sinPhi=Math.sin(phi); - double d=size/2.; - double r=rMin; - double x=r*cosPhi-excl*sinPhi; - double y=r*sinPhi+excl*cosPhi; - double dsinPhi=d*sinPhi; - double dcosPhi=d*cosPhi; - double phi1=Math.toDegrees(Math.atan2(y-dcosPhi, x+dsinPhi)); - double phi2=Math.toDegrees(Math.atan2(y+dcosPhi, x-dsinPhi)); - - if(phi1<0.) phi1+=360.; - if(phi2<0.) phi2+=360.; - if(phi1-phi2>180.) phi1-=360.; - if(phi2-phi1>180.) phi2-=360.; - - return new ACoord(AMath.xBox((zMin+zMax)/2.,(zMax-zMin)/2.), - AMath.yBox((phi1+phi2)/2.,(phi1-phi2)/2.)); - } - - protected ACoord getRZUser() { - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff=Math.abs(phi-phiMid); - double sign=-1.; - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - sign=+1.; - return getXZRZUser(sign); - } - - protected ACoord getXZUser() { - AParameter p=parameterStore.get("XZ", "Phi"); - - // display muon data when phi is in the middle of a sector - if(p.getD() % 22.5 < 1e-2) { - int sect=(int)Math.round((p.getD() % 360.) / 22.5); - if(sector==sect) { - return getXZRZUser(1.); - } else if(sector==sect-8||sector==sect+8) { - return getXZRZUser(-1.); - } - } - return ACoord.NO_DATA; - } - - protected ACoord getXZRZUser(double sign) { - return new ACoord( - AMath.xBox( (zMin + zMax) / 2., (zMax - zMin) / 2.), - AMath.yBox( sign*(rMin + rMax) / 2., sign*(rMax - rMin) / 2.)); - } - - - protected ACoord getYXUser() { - return getYXUser(0); - } - - protected ACoord getFRUser() { - return convertYXToFR(getYXUser(1)); - } - - private ACoord getYXUser(int flag) { - int[] split= {12, 1, 12, 1}; - int numPoints=4; - boolean splitIt=parameterStore.get("YX", "FishEye").getStatus()||parameterStore.get("YX", "Clock").getStatus() - ||flag==1; - - if(splitIt) - numPoints=26; - double[] temp=new double[4]; - double[][] hv=new double[2][numPoints]; - double cosPhi=Math.cos(phi); - double sinPhi=Math.sin(phi); - double d=size/2.; - double r=rMin; - double x=r*cosPhi-excl*sinPhi; - double y=r*sinPhi+excl*cosPhi; - double dx=d*sinPhi; - double dy=d*cosPhi; - - hv[0][0]=x+dx; - hv[1][0]=y-dy; - hv[0][1]=x-dx; - hv[1][1]=y+dy; - r=rMax; - x=r*cosPhi-excl*sinPhi; - y=r*sinPhi+excl*cosPhi; - - hv[0][3]=x+dx; - hv[1][3]=y-dy; - hv[0][2]=x-dx; - hv[1][2]=y+dy; - if(splitIt) - for(int j=0; j<2; ++j) { - for(int k=0; k<4; ++k) - temp[k]=hv[j][k]; - AMath.splitArrayIntoPieces(temp, hv[j], split); - } - return new ACoord(hv); - } - - protected boolean equalsYX(ADetector o) { - if (o instanceof ABoxDetector) { - ABoxDetector that = (ABoxDetector) o; - return this.rMin == that.rMin && - this.rMax == that.rMax && - this.phi == that.phi && - this.size == that.size && - this.excl == that.excl; - } else - return false; - } - - protected boolean equalsRZ(ADetector o) { - if (o instanceof ABoxDetector) { - ABoxDetector that = (ABoxDetector) o; - return this.rMin == that.rMin && - this.rMax == that.rMax && - this.zMin == that.zMin && - this.zMax == that.zMax; - } else - return false; - } - - public double getZMin() { return zMin; } - public double getZMax() { return zMax; } - public double getRMin() { return rMin; } - public double getRMax() { return rMax; } - public double getPhi() { return phi; } - public double getSize() { return size; } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetectors.java b/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetectors.java deleted file mode 100755 index a4b10b150709..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ABoxDetectors.java +++ /dev/null @@ -1,168 +0,0 @@ -package atlantis.geometry; - -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import java.util.*; - - -/** - * ABoxDetector's contains all instances of ABoxDetector. - * In different projections not all Boxes need to be drawn - * as they may exactly overlap. Filling of these areas is - * slow, so only the Boxes needed are drawn in each projection. - * (That is why boxes are group into ABoxDetectors) - * This is achieved by making a drawlist before drawing. - */ -public final class ABoxDetectors extends ADetectors { - - private int numRZTypes; - private int[] typeRZ; - private int numYXTypes; - private int[] typeYX; - - private ABoxDetector[] box; - - public ABoxDetectors(List detectors) { - super(filterBoxDetectors(detectors)); - box= new ABoxDetector[det.length]; - for(int i=0;i<box.length;++i) - box[i]=(ABoxDetector)det[i]; - - typeYX=new int[numData]; - for(int i=0; i<numData; ++i) - typeYX[i]=-1; - - numYXTypes=0; - for(int i=0; i<numData; ++i) - if(typeYX[i]==-1) { - typeYX[i]=numYXTypes; - for(int j=i+1; j<numData; ++j) - if(typeYX[j]==-1&&det[i].equalsYX(det[j])) - typeYX[j]=numYXTypes; - numYXTypes++; - } - - typeRZ=new int[numData]; - for(int i=0; i<numData; ++i) - typeRZ[i]=-1; - - numRZTypes=0; - for(int i=0; i<numData; ++i) - if(typeRZ[i]==-1) { - typeRZ[i]=numRZTypes; - for(int j=i+1; j<numData; ++j) - if(typeRZ[j]==-1&&det[i].equalsRZ(det[j])) - typeRZ[j]=numRZTypes; - numRZTypes++; - } - } - - private static ADetector[] filterBoxDetectors(List detectors) { - - List tempDetectors=new ArrayList(detectors.size()); - Iterator it=detectors.iterator(); - - while(it.hasNext()) { - Object o=it.next(); - if(o instanceof ABoxDetector || o instanceof ATBxDetector) tempDetectors.add(o); - } - return (ADetector[])tempDetectors.toArray(new ADetector[tempDetectors.size()]); - } - - private void makeDrawListYX() { - int mode=parameterStore.get("YX", "Mode").getI(); - - if(mode==0) { - numDraw=numYXTypes; - for(int i=0; i<numData; ++i) - listdl[typeYX[i]]=i; - } else - numDraw=0; - } - - private void makeDrawListXZ() { - AParameter p=parameterStore.get("XZ", "Phi"); - - // display muon data when phi is in the middle of a sector - if(p.getD() % 22.5 < 1e-2) { - int sect=(int)Math.round((p.getD() % 360.) / 22.5); - int num=0; - for(int i=0; i<numData; i++) { - int s=box[i].sector; - if(s==sect||s==sect-8||s==sect+8) { - listdl[num++]=i; - } - } - numDraw=num; - } else { - numDraw=0; - } - } - - private void makeDrawListRZ() { - // first make the draw list - // for each type find out if it has both +ve and negative sign - int[] pos=new int[typeRZ.length]; - int[] neg=new int[typeRZ.length]; - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for(int i=0; i<numRZTypes; ++i) - neg[i]=pos[i]=-1; - - for(int i=0; i<numData; ++i) { - double phiDiff=Math.abs(box[i].phi-phiMid); - - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - pos[typeRZ[i]]=i; - else - neg[typeRZ[i]]=i; - } - - int num=0; - for(int i=0; i<numRZTypes; ++i) { - if(pos[i]!=-1) - listdl[num++]=pos[i]; - if(neg[i]!=-1) - listdl[num++]=neg[i]; - } - numDraw=num; - } - - private void makeDrawListFZ() { - int mode=parameterStore.get("FZ", "Mode").getI(); - - if(mode==0) - numDraw=0; - else { - int num=0; - - for(int i=0; i<numData; ++i) { - char type=det[i].getName().charAt(0); - char station=det[i].getName().charAt(5); - char io=det[i].getName().charAt(det[i].getName().length()-1); - - if((mode==1&&station=='M'&&io=='I'&&type=='R')||(mode==2&&station=='M'&&io=='O'&&type=='R') - ||(mode==3&&station=='O'&&type=='R')||(mode==4&&(station=='I'||station=='E')&&type=='M') - ||(mode==5&&station=='M'&&type=='M')||(mode==6&&station=='O'&&type=='M')) - listdl[num++]=i; - numDraw=num; - } - } - } - - protected void makeDrawList(String projection) { - if (projection.equals("YX") || projection.equals("FR") ) - makeDrawListYX(); - else if (projection.equals("FZ")) - makeDrawListFZ(); - else if (projection.equals("RZ")) - makeDrawListRZ(); - else if (projection.equals("XZ")) - makeDrawListXZ(); - else - numDraw=0; - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ACalorimeterDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ACalorimeterDetector.java deleted file mode 100755 index da80146936d7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ACalorimeterDetector.java +++ /dev/null @@ -1,699 +0,0 @@ -package atlantis.geometry; - -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AClipper; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AIdHelper; -import atlantis.utils.AMath; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionYX; -import java.awt.Color; -import java.util.List; -import java.util.ArrayList; - -/** - * Abstract class representing a region of a certain sampling of a ATLAS - * calorimeter. Based on the parameters given to the constructor, the - * derived classes should be able to calculate the geometrical properties - * of the cells they contain. This behavior is required for drawing the data. - * - * @author Eric Jansen - */ -abstract public class ACalorimeterDetector extends ADetector { - - // Keep a static list of instances for easy access - protected static List detectors = null; - - // These arrays are used for fast cell to detector mapping. - protected static int[][][] lar = null; - protected static int[][] hec = null; - protected static int[] tile = null; - protected static int[] tile_ext = null; - protected static int[][] tile_gap = null; - protected static int[] mbts = null; - - protected int sampling; - protected int region; - protected double rMin; - protected double rMax; - protected double zMin; - protected double zMax; - protected double phi0; - protected int numPhi; - protected double deltaPhi; - protected double eta0; - protected double deltaEta; - protected int numEta; - protected int minEta; - - protected double detEtaMin; - protected double detEtaMax; - protected AClipper clipper; - - /** - * Constructs a new calorimeter object. - * @param name String name of the object - * @param color String name of the color used to draw this object - */ - public ACalorimeterDetector(String name, String color) { - super(name, " ", color); - - if (detectors == null) { - detectors = new ArrayList(40); - - // These numbers correspond to the maximum number of values that can - // be encoded in the identifier. - lar = new int[4][4][8]; - hec = new int[4][2]; - tile = new int[16]; - tile_ext = new int[16]; - tile_gap = new int[16][64]; - mbts = new int[2]; - - // Initialize them to -1, which means no detector element known. - for (int i=0; i<lar.length; i++) - for (int j=0; j<lar[i].length; j++) - for (int k=0; k<lar[i][j].length; k++) - lar[i][j][k] = -1; - - for (int i=0; i<hec.length; i++) - for (int j=0; j<hec[i].length; j++) - hec[i][j] = -1; - - for (int i=0; i<tile.length; i++) - tile[i] = -1; - - for (int i=0; i<tile_ext.length; i++) - tile_ext[i] = -1; - - for (int i=0; i<tile_gap.length; i++) - for (int j=0; j<tile_gap[i].length; j++) - tile_gap[i][j] = -1; - - for (int i=0; i<mbts.length; i++) - mbts[i] = -1; - } - - detectors.add(this); - } - - /** - * Returns one of the instances of this class. - * @param index int index of instance - * @return ACalorimeterDetector instance at the requested index - */ - public static ACalorimeterDetector get(int index) { - return (ACalorimeterDetector) detectors.get(index); - } - - /** - * Shows the number of instances of this class that have been created. - * @return int number of instances - */ - public static int count() { - if (detectors != null) { - return detectors.size(); - } else { - return 0; - } - } - - /** - * This functions maps the calorimeter cells to a geometry object. In principle we could - * compare every cell to every geometry object, but that would be too slow. Therefore we - * organize the geometry in an array structure. - * @param id int identifier of a cell - * @return int index of the geometry object in the detector array - */ - public static int getDetectorIndex(int id) { - if (detectors == null) return -1; - - try { - switch (AIdHelper.subDetector(id)) { - case 4: - switch (AIdHelper.larPart(id)) { - case 1: - // LAr EM - return lar[Math.abs(AIdHelper.larBarrelEndcap(id))] - [AIdHelper.larSampling(id)][AIdHelper.larRegion(id)]; - case 2: - // HEC - return hec[AIdHelper.larSampling(id)][AIdHelper.larRegion(id)]; - case 3: - // FCAL - return -1; - default: - return -1; - } - case 5: - switch (AIdHelper.tileSection(id)) { - case 1: - // TILE barrel - return tile[AIdHelper.tileSampling(id)]; - case 2: - // TILE extended barrel - return tile_ext[AIdHelper.tileSampling(id)]; - case 3: - // ITC gap/crack - return tile_gap[AIdHelper.tileSampling(id)][AIdHelper.tileTower(id)]; - case 4: - // MBTS - return -1; - default: - return -1; - } - default: - return -1; - } - } catch (AAtlantisException e) { - return -1; - } - } - - /** - * Clear the list of instances. This is called before reading another geometry file. - */ - public static void clear() { - if (detectors != null) { - detectors.clear(); - } - detectors = null; - lar = null; - hec = null; - tile = null; - tile_ext = null; - tile_gap = null; - mbts = null; - } - - /** - * Get the outline of a certain cell in a certain projection. - * @param projection AProjection projection - * @param eta int eta index of the cell - * @param phi int phi index of the cell - * @param side int side sign of the z coordinate of the cell - * @return ACoord cell outline - */ - public ACoord getCell(AProjection projection, int eta, int phi, int side) { - if (projection instanceof AProjectionYX) { - return getYXCell(eta, phi); - } else if (projection instanceof AProjectionRZ) { - return getRZCell(eta, phi, side); - } else if (projection instanceof AProjectionFR) { - return getFRCell(eta, phi); - } else if (projection instanceof AProjectionFZ) { - return getFZCell(eta, phi, side); - } else if (projection instanceof AProjectionVP) { - return getVPCell(eta, phi, side); - } else { - return ACoord.NO_DATA; - } - } - - /** - * Returns the y-x geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getYXCell(int eta, int phi) { - return ACoord.NO_DATA; - } - - /** - * Returns the rho-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getRZCell(int eta, int phi, int side) { - return ACoord.NO_DATA; - } - - /** - * Returns the phi-rho geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getFRCell(int eta, int phi) { - return convertYXToFR(getYXCell(eta, phi)); - } - - /** - * Returns the phi-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord - */ - public ACoord getFZCell(int eta, int phi, int side) { - return ACoord.NO_DATA; - } - - /** - * Returns the eta-phi geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getVPCell(int eta, int phi, int side) { - return ACoord.NO_DATA; - } - - /** - * Returns the eta value of the center (in eta) of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double eta value - */ - public double getEta(int eta, int side) { - if (side < 0) { - return -getEta(eta, -side); - } else { - return eta0 + (eta - minEta + 0.5) * deltaEta; - } - } - - /** - * Returns the lowest eta value of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double lowest eta value - */ - public double getEtaMin(int eta, int side) { - if (side < 0) { - return -getEtaMax(eta, -side); - } else { - return eta0 + (eta - minEta) * deltaEta; - } - } - - /** - * Returns the highest eta value of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double highest eta value - */ - public double getEtaMax(int eta, int side) { - if (side < 0) { - return -getEtaMin(eta, -side); - } else { - return eta0 + (eta - minEta + 1) * deltaEta; - } - } - - /** - * Returns the phi value of the center of a cell. - * @param phi int phi index of the cell - * @return double phi value - */ - public double getPhi(int phi) { - return phi0 + (phi + 0.5) * deltaPhi; - } - - /** - * Returns the lowest phi value of a cell. - * @param phi int phi index of the cell - * @return double lowest phi value - */ - public double getPhiMin(int phi) { - return phi0 + phi * deltaPhi; - } - - /** - * Returns the highest phi value of a cell. - * @param phi int phi index of the cell - * @return double highest phi value - */ - public double getPhiMax(int phi) { - return phi0 + (phi + 1) * deltaPhi; - } - - /** - * Determines on which side a certain cell should be drawn in the RZ projection, - * based on the phi angle the user has set in the menu. - * @param phi int phi index of the cell - * @return int 1 or -1, meaning top or bottom repectively - */ - public int getRSign(int phi) { - double cellPhi = phi0 + phi*deltaPhi + deltaPhi/2.; - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(cellPhi-phiMid); - if (phiDiff <= Math.PI/2.|| phiDiff > 3*Math.PI/2.) { - return 1; - } else { - return -1; - } - } - - /** - * Returns the number of cells in phi for this calorimeter part. - * @return int number of cells in phi - */ - public int getNumPhi() { - return numPhi; - } - - /** - * Returns the size of a cell in phi for this calorimeter part (this is the same for all cells). - * @return double size of a cell in radians - */ - public double getDeltaPhi() { - return deltaPhi; - } - - /** - * Returns the number of cells in eta for this calorimeter part. - * @return double number of cells in eta - */ - public int getNumEta() { - return numEta; - } - - /** - * Returns the size of a cell in eta for this calorimeter part (this is the same for all cells). - * @return double size of a cell in eta - */ - public double getDeltaEta() { - return deltaEta; - } - - /** - * Returns the center radius of the calorimeter part. - * @return double center radius - */ - public double getR() { - return (rMin+rMax)/2.; - } - - /** - * Returns the inner radius of the calorimter part. - * @return double inner radius - */ - public double getRMin() { - return rMin; - } - - /** - * Returns the outer radius of the calorimeter part. - * @return double outer radius - */ - public double getRMax() { - return rMax; - } - - /** - * Returns the center z of the calorimeter part. - * @return double center z - */ - public double getZ() { - return (zMin+zMax)/2.f; - } - - /** - * Returns the inner z of the calorimeter part. - * @return double inner z - */ - public double getZMin() { - return zMin; - } - - /** - * Returns the outer z of the calorimter part. - * @return double outer z - */ - public double getZMax() { - return zMax; - } - - /** - * Returns the inner eta of the calorimeter part. - * @return double inner eta - */ - public double getEtaMin() { - return eta0; - } - - /** - * Returns the outer eta of the calorimeter part. - * @return double outer eta - */ - public double getEtaMax() { - return eta0 + numEta*deltaEta; - } - - /** - * Returns the sampling of the calorimeter part. This corresponds to the layers of the calorimeter. - * @return int sampling - */ - public int getSampling() { - return sampling; - } - - /** - * Returns the region of this calorimeter part. Within a layer a new region is started when the - * size of the cells changes. - * @return int region - */ - public int getRegion() { - return region; - } - - /** - * Returns the eta index of the first cell in eta for this calorimeter part. - * @return int eta - */ - public int getFirstEta() { - return minEta; - } - - /** - * Returns the eta index of the last cell in eta for this calorimeter part. - * @return int eta - */ - public int getLastEta() { - if (sampling == 2 && name.indexOf("TILE") >= 0) - return minEta + 2*numEta; - else - return minEta + numEta-1; - } - - /** - * Returns the phi index of the first cell in phi for this calorimeter part. - * @return int phi - */ - public int getFirstPhi() { - // This is always 0, still we provide this method for consistency. - return 0; - } - - /** - * Returns the phi index of the last cell in phi for this calorimeter part. - * @return int phi - */ - public int getLastPhi() { - return numPhi-1; - } - - /** - * This function draws the module structure of the calorimeter. It is called - * from ADetectorSystem.draw(). - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - public static void drawAdditionalItems(AWindow window, AGraphics ag, AProjection2D projection) { - AParameter caloDetail = parameterStore.getUnknown("Det", "CaloDetail"); - if (caloDetail != null && detectors != null && caloDetail.getStatus()) - { - for (int i=0; i<detectors.size(); i++) - { - ACalorimeterDetector detector = (ACalorimeterDetector) detectors.get(i); - - // Only draw region 0 in YX, not the few different cells at the ends - if ((projection instanceof AProjectionYX && detector.getRegion() == 0) || projection instanceof AProjectionFR) - { - int start; - int mode = parameterStore.get("YX", "Mode").getI(); - if(mode==AProjectionYX.MODE_STANDARD) - //only needs one eta for standard view - start = detector.getFirstEta(); - else if(mode>=AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && mode <=AProjectionYX.MODE_HEC_4) - //need to loop over eta for endcaps - start = detector.getLastEta(); - else - start=0; - if(mode==AProjectionYX.MODE_STANDARD || (mode>=AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && mode <=AProjectionYX.MODE_HEC_4) || mode==AProjectionYX.MODE_MBTS) - { - for (int eta=start; eta>=detector.getFirstEta(); eta--) - { - for (int phi=detector.getFirstPhi(); phi<=detector.getLastPhi(); phi++) - { - ACoord coord = detector.getCell(projection, eta, phi, 1); - if (coord != ACoord.NO_DATA) { - ACoord display; - if (projection instanceof AProjectionYX) - display = window.calculateDisplay(projection.nonLinearTransform(coord)); - else - display = window.calculateDisplay(projection.nonLinearTransform( - coord.includePhiWrapAround("FR")) - ); - - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "CaloDetail").getI()]); - - for (int j=0; j<display.hv[0].length; j++) - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - else if((mode==AProjectionYX.MODE_LAR_ENDCAP_SUMMED && (detector.getName().equals("LAr Endcap Presampler")||detector.getName().equals("LAr_EC_Presampler"))) - || (mode==AProjectionYX.MODE_HEC_SUMMED && detector.getName().equals("HEC") && detector.getSampling()==0)) - { - //For summed endcaps only need to do this once - //The cells match the bining used but are not specific to the detector - //hence they do not all lie inside the detector - double etaBin=0.1,phiBin=(2*Math.PI/64); - int binvalue; - if(mode==AProjectionYX.MODE_HEC_SUMMED) - { - binvalue = parameterStore.get("YX", "HECBin").getI(); - } - else - { - binvalue = parameterStore.get("YX", "LArBin").getI(); - } - if(binvalue==3) - { - etaBin=0.1; - phiBin=(2*Math.PI/64); - } - else - { - etaBin*=binvalue; - phiBin*=binvalue; - } - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "CaloDetail").getI()]); - double firstZMin=detector.getZMin(); - //check etaSplit is set correct - if(binvalue==3) - { - setEtaSplit(); - } - //loop between values greater and less than the actual size - for(double Eta=1.2; Eta<3.3; Eta+=etaBin) - { - if(binvalue==3 && Eta>=parameterStore.get("YX", "SplitEta").getD()) - { - etaBin=0.2; - phiBin=(2*Math.PI/32); - } - double RMax=firstZMin/Math.sinh(Eta); - double RMin=firstZMin/Math.sinh(Eta+etaBin); - for(double Phi=0.0; Phi<(2*Math.PI); Phi+=phiBin) - { - double[][] hv = new double[2][]; - hv[0] = new double[] {RMax*Math.cos(Phi), RMax*Math.cos(Phi+phiBin), - RMin*Math.cos(Phi+phiBin), RMin*Math.cos(Phi)}; - hv[1] = new double[] {RMax*Math.sin(Phi), RMax*Math.sin(Phi+phiBin), - RMin*Math.sin(Phi+phiBin), RMin*Math.sin(Phi)}; - - ACoord coord = new ACoord(hv); - ACoord display; - - if (projection instanceof AProjectionYX) - display = window.calculateDisplay(projection.nonLinearTransform(coord)); - else - display = window.calculateDisplay(projection.nonLinearTransform( - coord.convertYXToFR().includePhiWrapAround("FR")) - ); - for(int j=0; j<display.hv[0].length; j++) - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - - } - else if (projection instanceof AProjectionRZ) - { - for (int eta=detector.getFirstEta(); eta<=detector.getLastEta(); eta++) - { - - for (int phi=detector.getFirstPhi(); - phi<=detector.getFirstPhi()+detector.getNumPhi()/2; - phi+=detector.getNumPhi()/2) - { - - for (int side=-1; side<=1; side+=2) { - ACoord coord = detector.getCell(projection, eta, phi, side); - - if (coord != ACoord.NO_DATA) - { - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "CaloDetail").getI()]); - ag.drawPolygon(display.hv[0][0], display.hv[1][0], display.hv[0][0].length); - } - } - } - } - } - else if (projection instanceof AProjectionFZ) - { - int eta = detector.getFirstEta(); - - for (int phi=detector.getFirstPhi(); phi<=detector.getLastPhi(); phi++) - { - for (int side=-1; side<=1; side+=2) - { - ACoord coord = detector.getCell(projection, eta, phi, side).includePhiWrapAround("FZ"); - - if (coord != ACoord.NO_DATA) - { - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "CaloDetail").getI()]); - - for (int j=0; j<display.hv[0].length; j++) - { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - } - } - } - } - - /** - * This function sets the value of EtaSplit to a minimum of 1.2 and - * to an accuracy of 1 decimal place - * 1.2 is minimum as is minimum of where cells outline is drawn - */ - public static void setEtaSplit() { - if(parameterStore.get("YX", "SplitEta").getD()<1.2) - parameterStore.get("YX", "SplitEta").setD(1.2); - else - { - int temp=(int) Math.floor(parameterStore.get("YX", "SplitEta").getD()*10.0); - parameterStore.get("YX", "SplitEta").setD(temp/10.0); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ADetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ADetector.java deleted file mode 100755 index b7196bfe34a7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ADetector.java +++ /dev/null @@ -1,157 +0,0 @@ -package atlantis.geometry; - -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; - -/** - * Base class of all individual detectors - */ - -public abstract class ADetector { - - String name; - String projection; - String color; - AParameter fillColorParameter; - - protected static APar parameterStore = APar.instance(); - protected static AGlobals globals = AGlobals.instance(); - - final static protected double[][] NO_DETECTORS=new double[2][0]; - - ADetector(String name, String projection, String color) { - this.name=name; - this.projection=projection; - this.color=color; - fillColorParameter=APar.instance().get("Det", color+"Fill"); - } - - protected ACoord getYXUser() { - return ACoord.NO_DATA; - } - - protected ACoord getRZUser() { - return ACoord.NO_DATA; - } - - protected ACoord getYZUser() { - return ACoord.NO_DATA; - } - - protected ACoord getXZUser() { - return ACoord.NO_DATA; - } - - protected ACoord getFRUser() { - return ACoord.NO_DATA; - } - - protected ACoord getFZUser() { - return ACoord.NO_DATA; - } - - protected ACoord getVPUser() { - return ACoord.NO_DATA; - } - - protected ACoord getUser(String projection) { - if (projection.equals("YX")) - return getYXUser(); - else if (projection.equals("RZ")) - return getRZUser(); - else if (projection.equals("XZ")) - return getXZUser(); - else if (projection.equals("YZ")) - return getYZUser(); - else if (projection.equals("FZ")) - return getFZUser(); - else if (projection.equals("FR")) - return getFRUser(); - else if (projection.equals("VP")) - return getVPUser(); - else - return ACoord.NO_DATA; - } - - public String getName() { - return name; - } - - public int getFillColor() { - return fillColorParameter.getI(); - } - - protected boolean getDraw() { - return fillColorParameter.getStatus(); - } - - protected boolean equalsYX(ADetector that) { - return false; - } - - protected boolean equalsRZ(ADetector that) { - return false; - } - - protected ACoord convertYXToFR(ACoord coord) { - double phiLast=0.; - - for (int i=0; i<coord.hv[0].length; i++) { - for (int j=0; j<coord.hv[0][i].length; j++) { - double xx=coord.hv[0][i][j]; - double yy=coord.hv[1][i][j]; - double rho=Math.sqrt(xx*xx+yy*yy); - double phi=Math.toDegrees(Math.atan2(yy, xx)); - - if(phi<0.) - phi+=360.; - if(j>0) { - if(phi-phiLast>180.) phi-=360.; - if(phi-phiLast<-180.) phi+=360.; - } - coord.hv[0][i][j]=rho; - coord.hv[1][i][j]=phi; - phiLast=phi; - } - } - - return coord; - } - - protected double[][][] generateAnnulusTris(int numPhi, double phi0, - double rMin, double rMax) { - - //rMin *= 1.02; - - int numTris = 2 * (numPhi); - double[][][] hv = new double[2][numTris][3]; - - double deltaPhi = 2. * Math.PI / numPhi; - - for (int i = 0; i < numPhi; i++) { - hv[0][i][0] = rMax * Math.cos(phi0 + i * deltaPhi); - hv[1][i][0] = rMax * Math.sin(phi0 + i * deltaPhi); - - hv[0][i][1] = rMax * Math.cos(phi0 + (i + 1) * deltaPhi); - hv[1][i][1] = rMax * Math.sin(phi0 + (i + 1) * deltaPhi); - - float midi = ((float) i) + 0.5f; - hv[0][i][2] = rMin * Math.cos(phi0 + midi * deltaPhi); - hv[1][i][2] = rMin * Math.sin(phi0 + midi * deltaPhi); - - int offi = i + (numPhi); - hv[0][offi][0] = rMin * Math.cos(phi0 + midi * deltaPhi); - hv[1][offi][0] = rMin * Math.sin(phi0 + midi * deltaPhi); - - hv[0][offi][1] = rMax * Math.cos(phi0 + (i + 1) * deltaPhi); - hv[1][offi][1] = rMax * Math.sin(phi0 + (i + 1) * deltaPhi); - - hv[0][offi][2] = rMin * Math.cos(phi0 + (midi + 1) * deltaPhi); - hv[1][offi][2] = rMin * Math.sin(phi0 + (midi + 1) * deltaPhi); - } - - return hv; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ADetectorSystem.java b/graphics/AtlantisJava/src/atlantis/geometry/ADetectorSystem.java deleted file mode 100755 index e0c93a93856d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ADetectorSystem.java +++ /dev/null @@ -1,122 +0,0 @@ -package atlantis.geometry; - - -import java.awt.*; - -import atlantis.canvas.*; -import atlantis.graphics.*; -import atlantis.graphics.colormap.AColorMap; -import atlantis.gui.*; -import atlantis.parameters.*; -import atlantis.projection.*; - - -public class ADetectorSystem -{ - - private ADetectors[] detectors; - protected static String geometryName = null; - - protected static APar parameterStore = APar.instance(); - - ADetectorSystem(ADetectors[] detectors) - { - this.detectors=detectors; - } - - public ADetectors[] getDetectors() - { - return detectors; - } - - // The whole of atlas is drawn in one loop to avoid problem with frames - // overlapping - - - public void draw(AWindow window, AGraphics ag, AProjection2D projection) - { - if(!parameterStore.get("Det", "Detectors").getStatus()) return; - boolean drawFrames=parameterStore.get("Det", "HideDetectors").getStatus(); - //also draw frames for Grey/BW color maps - boolean colorBW=AColorMap.drawFrames(); - Color[] colorMap=AColorMap.getColors(); - ADetectors[] detectors=getDetectors(); - ACoord[] display=new ACoord[detectors.length]; - int[][] index=new int[detectors.length][]; - int[][] detColor=new int[detectors.length][]; - boolean[][] draw=new boolean[detectors.length][]; - int bkgColor = parameterStore.get("Color","BkgFill").getI(); - - for(int det=0; det<detectors.length; ++det) { - display[det]=window.calculateDisplay(detectors[det].getUser(projection)); - index[det]=display[det].index; - detColor[det]=detectors[det].getColor(index[det]); - draw[det]=detectors[det].getDraw(index[det]); - } - - boolean modeSelection = parameterStore.get(projection.getName(), "Mode").getI()==0 - ||(parameterStore.get(projection.getName(), "Mode").getI()>8 - &&(projection instanceof AProjectionYX||projection instanceof AProjectionFR)); - - for(int layer=0; layer<2; ++layer) - { - for(int det=0; det<detectors.length; ++det) - { - ADrawParameters dp=detectors[det].getDrawParameters(layer, 0); - ag.updateDrawParameters(dp); - for(int i=0; i<display[det].hv[0].length; ++i) - { - int numPoints=display[det].hv[0][i].length; - ag.setColor(colorMap[detColor[det][i]]); - if(draw[det][i]&& numPoints>0) - { - if(modeSelection) - { - if(layer==0 && (drawFrames||colorBW)) - { - if(colorBW) - ag.setColor(colorMap[AColorMap.BK]); - ag.drawPolygon(display[det].hv[0][i], display[det].hv[1][i], numPoints); - } - else if(layer==1) - { - if(drawFrames) - ag.setColor(colorMap[bkgColor]); - ag.fillPolygon(detectors[det], index[det][i], display[det].hv[0][i], - display[det].hv[1][i], numPoints); - } - } - else - { - if(layer==0) - { - if(drawFrames) - ag.setColor(colorMap[bkgColor]); - ag.fillPolygon(detectors[det], index[det][i], display[det].hv[0][i], - display[det].hv[1][i], numPoints); - } - else if(layer==1 && (drawFrames||colorBW)) - { - if(colorBW) - ag.setColor(colorMap[AColorMap.BK]); - ag.drawPolygon(display[det].hv[0][i], display[det].hv[1][i], numPoints); - } - } - } - } - } - } - ABarrelSiliconDetector.drawAdditionalItems(window, ag, projection); - AEndcapSiliconDetector.drawAdditionalItems(window, ag, projection); - ABarrelTRTDetector.drawAdditionalItems(window, ag, projection); - AEndcapTRTDetector.drawAdditionalItems(window, ag, projection); - ACalorimeterDetector.drawAdditionalItems(window, ag, projection); - } - - public static String getGeometryName() - { - return geometryName == null ? "n/a" : geometryName; - - } // getName() ------------------------------------------------------------ - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ADetectors.java b/graphics/AtlantisJava/src/atlantis/geometry/ADetectors.java deleted file mode 100755 index 1f11913e80d1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ADetectors.java +++ /dev/null @@ -1,114 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.*; -import atlantis.parameters.APar; -import atlantis.projection.*; - -/** - * Base class of all collections of detectors - * All non muon geometry is in AGeometry.xml - * All muon geometry is in AMuonGeometry.xml - * ADetectors is the interface to the rest of the program and contains - * collections of detectors. - * When a line in our XML file describes several detectors these are stored - * individually. - */ -public abstract class ADetectors { - - protected ADetector[] det=null; - - protected int[] listdl; - protected int numDraw; - protected int numData; - - protected static APar parameterStore = APar.instance(); - - public ADetectors(ADetector[] det) { - this.det=det; - numData=det.length; - numDraw=0; - listdl=new int[numData]; - } - - public ADetector[] getDetectors() { - return det; - } - - protected void constructDefaultDrawList() { - numDraw=numData; - for(int i=0; i<numDraw; ++i) - listdl[i]=i; - } - - protected void makeDrawList(String projection){ - constructDefaultDrawList(); - } - - protected ACoord getUser(String projection) { - makeDrawList(projection); - int[] numPoly = new int[numDraw]; - int numTotal = 0; - for (int i=0; i<numDraw; i++) { - int len = det[listdl[i]].getUser(projection).hv[0].length; - numPoly[i] = len; - numTotal += len; - } - double[][][] hv = new double[2][numTotal][]; - int[] index = new int[numTotal]; - for (int i=0, k=0; i<numDraw; i++) { - double temp[][][] = det[listdl[i]].getUser(projection).hv; - for(int j = 0; j < numPoly[i]; j++, k++) { - hv[0][k] = temp[0][j]; - hv[1][k] = temp[1][j]; - index[k] = listdl[i]; - } - } - return new ACoord(hv, index); - } - - protected int[] getColor(int[] dl) { - int[] col=new int[dl.length]; - - for(int i=0; i<dl.length; ++i) - col[i]=det[dl[i]].getFillColor(); - return col; - } - - protected boolean[] getDraw(int[] dl) { - boolean[] draw=new boolean[dl.length]; - - for(int i=0; i<dl.length; ++i) - draw[i]=det[dl[i]].getDraw(); - return draw; - } - - public String getInfo(int index) { - return det[index].getName(); - } - - protected ADrawParameters getDrawParameters(int layer, int type) { - if(layer==0) - return new ADrawParameters(true, 0, 0, 0, 1, 0); - else - return new ADrawParameters(true, 0, 0, 1, 0, 0); - } - - protected ACoord getUserNoTransform(AProjection projection) { - String name=projection.getName(); - ACoord data=getUser(name); - if(name.charAt(0)=='F') - data.includePhiWrapAround(name); - return data; - } - - protected ACoord getUser(AProjection2D projection) { - return projection.nonLinearTransform(getUserNoTransform(projection)); - } - - /* - protected void draw(AWindow window,AGraphics ag,AProjection2D projection) { - // in a simple world the implementation would be here - throw new RuntimeException(); - } - */ -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ADiscDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ADiscDetector.java deleted file mode 100755 index a8241c1889ce..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ADiscDetector.java +++ /dev/null @@ -1,57 +0,0 @@ -package atlantis.geometry; - -import atlantis.utils.*; -import atlantis.graphics.ACoord; - -public class ADiscDetector extends ADetector { - - double rInner; - double rOuter; - int nInner; - int nOuter; - - ADiscDetector(String name, String projection, String color, double rInner, double rOuter, int nInner, int nOuter) { - super(name, projection, color); - this.rInner=rInner; - this.nInner=nInner; - this.rOuter=rOuter; - this.nOuter=nOuter; - } - - protected ACoord getYXUser() { - if (!projection.equals("YX")) { - return ACoord.NO_DATA; - } - - if (!globals.getUseOpenGL()) { - int numPoints = nInner + nOuter + 2; - double[][] hv = new double[2][numPoints]; - - for (int j = 0; j < nInner + 1; j++) { - hv[0][j] = rInner * Math.cos(Math.PI * 2 * j / nInner); - hv[1][j] = rInner * Math.sin(Math.PI * 2 * j / nInner); - } - for (int j = 0; j < nOuter + 1; j++) { - hv[0][j + nInner + 1] = rOuter * Math.cos(Math.PI * 2 * (nOuter - j) / nOuter); - hv[1][j + nInner + 1] = rOuter * Math.sin(Math.PI * 2 * (nOuter - j) / nOuter); - } - return new ACoord(hv); - } else { - //FIXME: - //Note that generateAnnulusTris can't really handle this different number - //of inner and outer points thing so we're just going to take the mean here - //Maybe one day we fix this somehow or just remove one of the ns - //All the other round detectors get along fine without it... - // -- Adam - return new ACoord(generateAnnulusTris((nInner + nOuter) / 2, 0.0, rInner, rOuter)); - } - } - - protected ACoord getFRUser() { - if(!projection.equals("FR")) return ACoord.NO_DATA; - return new ACoord (AMath.xBox((rInner+rOuter)/2.,(rOuter-rInner)/2.), - AMath.yBox(180.,180.)); - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCalorimeterDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCalorimeterDetector.java deleted file mode 100755 index a5df48ac54f2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCalorimeterDetector.java +++ /dev/null @@ -1,328 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.graphics.AClipper; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AMath; - -/** - * Class representing a calorimeter part in the endcap section of ATLAS. - */ -public class AEndcapCalorimeterDetector extends ACalorimeterDetector { - - /** - * Constructs a new endcap calorimeter object - * @param name String name of the object - * @param color String name of the color used to draw this object - * @param sampling int sampling of this calorimeter part - * @param region int region of this calorimeter part - * @param rMin double inner radius - * @param rMax double outer radius - * @param zMin double inner z - * @param zMax double outer z - * @param eta0 double start of the first cell in eta - * @param deta double size of a cell in eta - * @param neta int number of cells in eta - * @param meta int eta index of the first cell - * @param phi0 double start of the first cell in phi - * @param nphi int number of cells in phi - */ - public AEndcapCalorimeterDetector(String name, String color, int sampling, int region, - double rMin, double rMax, double zMin, double zMax, - double eta0, double deta, int neta, int meta, - double phi0, int nphi) { - super(name, color); - - this.sampling = sampling; - this.region = region; - this.rMin = rMin; - this.rMax = rMax; - this.zMin = zMin; - this.zMax = zMax; - this.eta0 = eta0; - this.deltaEta = deta; - this.numEta = neta; - this.minEta = meta; - this.phi0 = Math.toRadians(phi0); - this.numPhi = nphi; - this.deltaPhi = 2.*Math.PI / numPhi; - - this.detEtaMin = AMath.etaAbs(this.zMin, this.rMax); - this.detEtaMax = AMath.etaAbs(this.zMax, this.rMax); - - // This one is used for clipping the cell geometry in rho-z. - this.clipper = new AClipper(zMin, zMax, rMin, rMax); - - // These arrays are used by the getDetectorIndex() method in ACalorimeterData. - // They provide fast mapping of hits to detectors. - if (this.name.indexOf("LAr") >= 0 && this.name.indexOf("Inner") >= 0 - && this.sampling < lar[3].length && this.region < lar[3][this.sampling].length) { - - lar[3][this.sampling][this.region] = detectors.indexOf(this); - } else if (this.name.indexOf("LAr") >= 0 && this.sampling < lar[2].length - && this.region < lar[2][this.sampling].length) { - - lar[2][this.sampling][this.region] = detectors.indexOf(this); - } else if (this.name.equals("HEC") && this.sampling < hec.length - && this.region < hec[this.sampling].length) { - - hec[this.sampling][this.region] = detectors.indexOf(this); - } else { - System.out.println("Unknown calorimeter object: '" + this.name + "'" - + " some hits might not be displayed correctly."); - } - } - - /** - * Returns the y-x geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getYXUser() { - int mode = parameterStore.get("YX", "Mode").getI(); - if ( mode < AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER) - return ACoord.NO_DATA; - else if((mode==AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && (name.equals("LAr Endcap Presampler")||name.equals("LAr_EC_Presampler"))) - || (name.equals("LAr Outer Endcap") && sampling==mode-AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER) - || (name.equals("LAr Inner Endcap") && sampling==mode-AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER-1) - || (name.equals("HEC") && sampling==mode-AProjectionYX.MODE_HEC_1) - || (mode==AProjectionYX.MODE_LAR_ENDCAP_SUMMED && name.indexOf("LAr")>=0) - || (mode==AProjectionYX.MODE_HEC_SUMMED && name.equals("HEC"))) - { - - double etaMax = eta0 + numEta * deltaEta; - double etaMin = eta0; - double r1, r2; - if (name.equals("HEC")) - { - r1=rMax; - r2=rMin; - } - else - { - if (name.indexOf("Inner") >= 0 || name.indexOf("Presampler") >= 0) - r1 = zMin/Math.sinh(etaMin); - else - r1=rMax; - r2 = zMin/Math.sinh(etaMax); - } - - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - for (int i = 0; i < numPhi + 1; i++) { - hv[0][i] = r2 * Math.cos(phi0 + i * deltaPhi); - hv[1][i] = r2 * Math.sin(phi0 + i * deltaPhi); - hv[0][numPhi + 1 + i] = r1 * Math.cos(phi0 - i * deltaPhi); - hv[1][numPhi + 1 + i] = r1 * Math.sin(phi0 - i * deltaPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phi0, r1, r2)); - } - } - else - return ACoord.NO_DATA; - } - - /** - * Returns the rho-z geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getRZUser() { - double h[], v[]; - double etaMax = eta0 + numEta * deltaEta; - double etaMin = eta0; - - // Calculate the polygon in the positive h and v. - if (name.indexOf("HEC") >= 0) { - h = new double[] {zMax, zMin, zMin, zMax}; - v = new double[] {rMax, rMax, rMin, rMin}; - } else { - double r0 = zMax/Math.sinh(etaMin); - double r1 = zMin/Math.sinh(etaMin); - double r2 = zMin/Math.sinh(etaMax); - double r3 = zMax/Math.sinh(etaMax); - - h = new double[] {zMax, zMin, zMin, zMax}; - v = new double[] {r0, r1, r2, r3}; - } - - // Clip the polygon. - ACoord coord = clipper.clipPolygon(h, v, h.length); - - // Copy it to negative v. - coord = new ACoord(coord, coord.mirrorV()); - // Copy it to negative h. - coord = new ACoord(coord, coord.mirrorH()); - - return coord; - } - - /** - * Returns the phi-rho geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getFRUser() { - return getYXUser().convertYXToFR(); - } - - /** - * Returns the phi-z geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getFZUser() { - double[][][] hv = new double[2][2][]; - double phiMin = 0.; - double phiMax = 360.; - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] {phiMax, phiMax, phiMin, phiMin}; - hv[0][1] = new double[] { -zMax, -zMin, -zMin, -zMax}; - hv[1][1] = new double[] {phiMax, phiMax, phiMin, phiMin}; - return new ACoord(hv); - } - - /** - * Returns the y-x geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getYXCell(int eta, int phi) - { - int mode = parameterStore.get("YX", "Mode").getI(); - if(mode < AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER || mode > AProjectionYX.MODE_HEC_SUMMED) - return ACoord.NO_DATA; - else if((mode==AProjectionYX.MODE_LAR_ENDCAP_SUMMED && name.indexOf("LAr")>=0) - || (mode==AProjectionYX.MODE_HEC_SUMMED && name.equals("HEC"))) - { - //don't need to carry out calculation just needs return a blank ACoord - double[][] hv = new double[2][]; - hv[0] = new double[] {0}; - hv[1] = new double[] {0}; - return new ACoord(hv); - } - else if((mode==AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER && (name.equals("LAr Endcap Presampler") || name.equals("LAr_EC_Presampler"))) - || (name.equals("LAr Outer Endcap") && sampling==mode-AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER) - || (name.equals("LAr Inner Endcap") && sampling==mode-AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER-1) - || (name.equals("HEC") && sampling==mode-AProjectionYX.MODE_HEC_1)) - { - double[][] hv = new double[2][]; - double phiMin = phi0+phi*deltaPhi; - double phiMax = phiMin+deltaPhi; - double newrMax=0, newrMin=0; - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - newrMax=zMin/Math.sinh(etaMin); - newrMin=zMin/Math.sinh(etaMax); - if (name.equals("HEC")) - { - if(newrMax>rMax) - newrMax=rMax; - if(newrMin<rMin) - newrMin=rMin; - } - hv[0] = new double[] {newrMax*Math.cos(phiMin), newrMax*Math.cos(phiMax), - newrMin*Math.cos(phiMax), newrMin*Math.cos(phiMin)}; - hv[1] = new double[] {newrMax*Math.sin(phiMin), newrMax*Math.sin(phiMax), - newrMin*Math.sin(phiMax), newrMin*Math.sin(phiMin)}; - return new ACoord(hv); - } - else - return ACoord.NO_DATA; - } - - /** - * Returns the rho-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getRZCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - int sign = getRSign(phi); - - // This shouldn't be 0, but just to be on the safe side. - if (side != 0) side /= Math.abs(side); - - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - - if (name.indexOf("HEC") >= 0) { - if (sampling == 0) { - double rMin = (zMin+zMax)/2. / Math.sinh(etaMax); - double rMax = (zMin+zMax)/2. / Math.sinh(etaMin); - - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {rMax, rMax, rMin, rMin}; - } else { - double dz = (zMax-zMin); - double z0 = zMin; - double z1 = zMin+dz/2.; - double z2 = zMax; - double r0 = (zMin+dz/4.) / Math.sinh(etaMax); - double r1 = (zMax-dz/4.) / Math.sinh(etaMax); - double r2 = (zMin+dz/4.) / Math.sinh(etaMin); - double r3 = (zMax-dz/4.) / Math.sinh(etaMin); - - hv[0] = new double[] {z2, z1, z1, z0, z0, z1, z1, z2}; - hv[1] = new double[] {r3, r3, r2, r2, r0, r0, r1, r1}; - } - } else { - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {zMax/Math.sinh(etaMin), zMin/Math.sinh(etaMin), - zMin/Math.sinh(etaMax), zMax/Math.sinh(etaMax)}; - } - - // Clip the cell and send it to the right quadrant. - ACoord coord = clipper.clipPolygon(hv[0], hv[1], hv[0].length); - for (int i=0; i<coord.hv[0][0].length; i++) { - coord.hv[0][0][i] *= side; - coord.hv[1][0][i] *= sign; - } - - return coord; - } - - /** - * Returns the phi-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord - */ - public ACoord getFZCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - double phiMin = Math.toDegrees(phi0 + phi*deltaPhi); - double phiMax = phiMin + Math.toDegrees(deltaPhi); - - side /= Math.abs(side); - - hv[0] = new double[] {side*zMax, side*zMin, side*zMin, side*zMax}; - hv[1] = new double[] { phiMax, phiMax, phiMin, phiMin}; - - return new ACoord(hv); - } - - /** - * Returns the eta-phi geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getVPCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - double etaMin = eta0+(eta-minEta)*deltaEta; - double etaMax = etaMin+deltaEta; - double phiMin = Math.toDegrees(phi0 + phi*deltaPhi); - double phiMax = phiMin + Math.toDegrees(deltaPhi); - - side /= Math.abs(side); - - hv[0] = new double[] {side*etaMax, side*etaMin, side*etaMin, side*etaMax}; - hv[1] = new double[] { phiMax, phiMax, phiMin, phiMin}; - - return new ACoord(hv); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCryostatDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCryostatDetector.java deleted file mode 100755 index 8d1122eba4bf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapCryostatDetector.java +++ /dev/null @@ -1,158 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.graphics.AClipper; -import atlantis.projection.AProjectionYX; -import atlantis.utils.AMath; - -/** - * Class representing a detector part in the endcap cryostat section of ATLAS. - */ -public class AEndcapCryostatDetector extends ACalorimeterDetector { - - /** - * Constructs a new endcap calorimeter object - * @param name String name of the object - * @param color String name of the color used to draw this object - * @param sampling int sampling of this calorimeter part - * @param region int region of this calorimeter part - * @param rMin double inner radius - * @param rMax double outer radius - * @param zMin double inner z - * @param zMax double outer z - * @param neta int number of cells in eta - * @param nphi int number of cells in phi - */ - public AEndcapCryostatDetector(String name, String color, int sampling, int region, double rMin, - double rMax, double zMin, double zMax, int neta, int nphi) { - super(name, color); - - this.sampling = sampling; - this.region = region; - this.rMin = rMin; - this.rMax = rMax; - this.zMin = zMin; - this.zMax = zMax; - this.numEta = neta; - this.numPhi = nphi; - this.deltaPhi = 2.*Math.PI / numPhi; - this.phi0 = 0.0; - this.eta0 = AMath.etaAbs(this.zMin, this.rMin); - - this.detEtaMin = AMath.etaAbs(this.zMin, this.rMax); - this.detEtaMax = AMath.etaAbs(this.zMax, this.rMax); - - // This one is used for clipping the cell geometry in rho-z. - this.clipper = new AClipper(zMin, zMax, rMin, rMax); - - // These arrays are used by the getDetectorIndex() method in ACalorimeterData. - // They provide fast mapping of hits to detectors. - if (this.name.equals("Minimum Bias Trigger Scintillators")) { - mbts[this.sampling] = detectors.indexOf(this); - } else { - System.out.println("Unknown calorimeter object: '" + this.name + "'" - + " some hits might not be displayed correctly."); - } - } - - /** - * Returns the y-x geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getYXUser() { - int mode = parameterStore.get("YX", "Mode").getI(); - if (mode!=AProjectionYX.MODE_MBTS) - return ACoord.NO_DATA; - else - { - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - for (int j = 0; j < numPhi + 1; j++) { - hv[0][j] = rMin * Math.cos(Math.PI * 2 * j / numPhi); - hv[1][j] = rMin * Math.sin(Math.PI * 2 * j / numPhi); - } - for (int j = 0; j < numPhi + 1; j++) { - hv[0][j + numPhi + 1] = rMax * Math.cos(Math.PI * 2 * (numPhi - j) / numPhi); - hv[1][j + numPhi + 1] = rMax * Math.sin(Math.PI * 2 * (numPhi - j) / numPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phi0, rMin, rMax)); - } - } - } - - /** - * Returns the rho-z geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getRZUser() { - double h[], v[]; - // Calculate the polygon in the positive h and v. - h = new double[] {zMax, zMin, zMin, zMax}; - v = new double[] {rMax, rMax, rMin, rMin}; - // Clip the polygon. - ACoord coord = clipper.clipPolygon(h, v, h.length); - // Copy it to negative v. - coord = new ACoord(coord, coord.mirrorV()); - // Copy it to negative h. - coord = new ACoord(coord, coord.mirrorH()); - return coord; - } - - /** - * Returns the phi-rho geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getFRUser() { - return getYXUser().convertYXToFR(); - } - - /** - * Returns the y-x geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getYXCell(int eta, int phi) - { - int mode = parameterStore.get("YX", "Mode").getI(); - if(mode!=AProjectionYX.MODE_MBTS) - return ACoord.NO_DATA; - else - { - double[][] hv = new double[2][]; - double phiMin = Math.PI*2*phi/numPhi; - double phiMax = Math.PI*2*(1+phi)/numPhi; - hv[0] = new double[] {rMax*Math.cos(phiMin), rMax*Math.cos(phiMax), - rMin*Math.cos(phiMax), rMin*Math.cos(phiMin)}; - hv[1] = new double[] {rMax*Math.sin(phiMin), rMax*Math.sin(phiMax), - rMin*Math.sin(phiMax), rMin*Math.sin(phiMin)}; - return new ACoord(hv); - } - } - - /** - * Returns the rho-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getRZCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - int sign = getRSign(phi); - // This shouldn't be 0, but just to be on the safe side. - if (side != 0) side /= Math.abs(side); - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {rMax, rMax, rMin, rMin}; - // Clip the cell and send it to the right quadrant. - ACoord coord = clipper.clipPolygon(hv[0], hv[1], hv[0].length); - for (int i=0; i<coord.hv[0][0].length; i++) { - coord.hv[0][0][i] *= side; - coord.hv[1][0][i] *= sign; - } - return coord; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapSiliconDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AEndcapSiliconDetector.java deleted file mode 100755 index e28c5f168695..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapSiliconDetector.java +++ /dev/null @@ -1,220 +0,0 @@ -package atlantis.geometry; - -import atlantis.canvas.AWindow; -import atlantis.data.AS3DData; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionYX; -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -/** - * Class representing a pixel/SCT endcap detector part. - * Also implements methods to draw more detailed structure of the detector. - * - * @author Eric Jansen - */ -public class AEndcapSiliconDetector extends ADetector { - - private static List detectors = null; - - protected int layer; - protected double length; - protected double width; - protected double thickness; - protected int numZ; - protected int numPhi; - protected double phi0; - protected double zMin; - protected double zMax; - - protected double deltaPhi; - protected double deltaZ; - protected double rMin; - protected double rMax; - - public AEndcapSiliconDetector(String name, String color, int layer, double length, double width, double thickness, - int numZ, int numPhi, double rMin, double rMax, double phi0, double zMin, double zMax) { - super(name, " ", color); - - if (detectors == null) { - detectors = new ArrayList(); - } - detectors.add(this); - - this.layer = layer; - this.length = length; - this.width = width; - this.thickness = thickness; - this.numZ = numZ; - this.numPhi = numPhi; - this.rMin = rMin; - this.rMax = rMax; - this.phi0 = Math.toRadians(phi0); - this.zMin = zMin; - this.zMax = zMax; - - this.deltaPhi = 2.*Math.PI / this.numPhi; - this.deltaZ = (this.zMax - this.zMin) / this.numZ; - } - - /** - * Empties the list of instances of this class. - */ - public static void clear() { - if (detectors != null) { - detectors.clear(); - } - } - - /** - * This function draws the wafer/stave structure of the silicon detectors. It is called - * from ADetectorSystem.draw(). - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - public static void drawAdditionalItems(AWindow window, AGraphics ag, AProjection2D projection) { - AParameter inDetDetail = parameterStore.getUnknown("Det", "SiliconDetail"); - if (inDetDetail != null && detectors != null && inDetDetail.getStatus()) { - for (int i=0; i<detectors.size(); i++) { - ACoord coord = ACoord.NO_DATA; - AEndcapSiliconDetector detector = (AEndcapSiliconDetector) detectors.get(i); - if (projection instanceof AProjectionYX) { - coord = detector.getYXDetail(); - } else if (projection instanceof AProjectionFR) { - coord = detector.getYXDetail().convertYXToFR().includePhiWrapAround("FR"); - } - - if (coord != ACoord.NO_DATA) { - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "SiliconDetail").getI()]); - - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - for (int j=0; j<display.hv[0].length; j++) { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - } - - /** - * Determines if this element should be visible or not. - * @return visibility - */ - protected boolean isVisible() { - int cut = parameterStore.get("CutsInDet", "SCT").getI(); - - if (cut == AS3DData.CUT_INDET_SCT_ALL || cut == AS3DData.CUT_INDET_SCT_EC_NEG - || cut == AS3DData.CUT_INDET_SCT_EC_POS) { - return true; - } else { - return false; - } - } - - /** - * Returns the detector outline in the y-x projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getYXUser() { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - if (!isVisible()) return ACoord.NO_DATA; - - if (!globals.getUseOpenGL()) { - int numPoints = 2 * (numPhi + 1); - double[][] hv = new double[2][numPoints]; - - for (int i = 0; i < numPhi + 1; i++) { - hv[0][i] = rMin * Math.cos(phi0 + (i + 0.5) * deltaPhi); - hv[1][i] = rMin * Math.sin(phi0 + (i + 0.5) * deltaPhi); - - hv[0][numPhi + 1 + i] = rMax * Math.cos(phi0 - (i + 0.5) * deltaPhi); - hv[1][numPhi + 1 + i] = rMax * Math.sin(phi0 - (i + 0.5) * deltaPhi); - } - return new ACoord(hv); - } else { - return new ACoord(generateAnnulusTris(numPhi, phi0, rMin, rMax)); - } - } - - /** - * Returns the detector outline in the rho-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getRZUser() { - double[][][] hv = new double[2][4][]; - - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - - hv[0][2] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][2] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][3] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][3] = new double[] {-rMin, -rMin, -rMax, -rMax}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFZUser() { - if (!isVisible()) return ACoord.NO_DATA; - - double[][][] hv = new double[2][2][]; - - hv[0][0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] {360., 360., 0., 0.}; - hv[0][1] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-rho projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFRUser() { - if (!isVisible()) return ACoord.NO_DATA; - - return getYXUser().convertYXToFR(); - } - - /** - * Returns the wafer/stave structure in the y-x projection. - * @return ACoord polygons representing the wafers/staves - */ - protected ACoord getYXDetail() { - if (parameterStore.get("YX", "Mode").getI() != AProjectionYX.MODE_STANDARD) return ACoord.NO_DATA; - if (!isVisible()) return ACoord.NO_DATA; - - double[][][] hv = new double[2][numPhi][]; - for (int i=0; i<numPhi; i++) { - hv[0][i] = new double[] { - rMax*Math.sin(phi0+(i-0.5)*deltaPhi), - rMax*Math.sin(phi0+(i+0.5)*deltaPhi), - rMin*Math.sin(phi0+(i+0.5)*deltaPhi), - rMin*Math.sin(phi0+(i-0.5)*deltaPhi) - }; - hv[1][i] = new double[] { - rMax*Math.cos(phi0+(i-0.5)*deltaPhi), - rMax*Math.cos(phi0+(i+0.5)*deltaPhi), - rMin*Math.cos(phi0+(i+0.5)*deltaPhi), - rMin*Math.cos(phi0+(i-0.5)*deltaPhi) - }; - } - - return new ACoord(hv); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapTRTDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AEndcapTRTDetector.java deleted file mode 100755 index a23bfaf0d022..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AEndcapTRTDetector.java +++ /dev/null @@ -1,173 +0,0 @@ -package atlantis.geometry; - -import atlantis.canvas.AWindow; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -/** - * Class representing a TRT endcap detector part. - * Also implements methods to draw more detailed structure of the detector. - * - * @author Eric Jansen - */ -public class AEndcapTRTDetector extends ADetector { - - private static List detectors = null; - - protected int layer; - protected int numPhi; - protected double rMin; - protected double rMax; - protected double phi0; - protected double zMin; - protected double zMax; - protected double deltaPhi; - - public AEndcapTRTDetector(String name, String color, int layer, int numPhi, double rMin, double rMax, - double phi0, double zMin, double zMax) { - super(name, " ", color); - - if (detectors == null) { - detectors = new ArrayList(); - } - detectors.add(this); - - this.layer = layer; - this.numPhi = numPhi; - this.rMin = rMin; - this.rMax = rMax; - this.phi0 = Math.toRadians(phi0); - this.zMin = zMin; - this.zMax = zMax; - - this.deltaPhi = 2.*Math.PI / numPhi; - } - - /** - * Empties the list of instances of this class. - */ - public static void clear() { - if (detectors != null) { - detectors.clear(); - } - } - - /** - * This function draws the module structure of the TRT detector. It is called - * from ADetectorSystem.draw(). - * @param window AWindow window to use - * @param ag AGraphics graphics object to draw onto - * @param projection AProjection2D current projection - */ - public static void drawAdditionalItems(AWindow window, AGraphics ag, AProjection2D projection) { - AParameter inDetDetail = parameterStore.getUnknown("Det", "TRTDetail"); - if (inDetDetail != null && detectors != null && inDetDetail.getStatus()) { - for (int i=0; i<detectors.size(); i++) { - ACoord coord = ACoord.NO_DATA; - AEndcapTRTDetector detector = (AEndcapTRTDetector) detectors.get(i); - if (projection instanceof AProjectionRZ) { - coord = detector.getRZDetail(); - } else if (projection instanceof AProjectionFZ) { - coord = detector.getFZDetail(); - } - - if (coord != ACoord.NO_DATA) { - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[parameterStore.get("Det", "TRTDetail").getI()]); - - ACoord display = window.calculateDisplay(projection.nonLinearTransform(coord)); - for (int j=0; j<display.hv[0].length; j++) { - ag.drawPolygon(display.hv[0][j], display.hv[1][j], display.hv[0][j].length); - } - } - } - } - } - - /** - * Returns the detector outline in the y-x projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getYXUser() { - return ACoord.NO_DATA; - } - - /** - * Returns the detector outline in the rho-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getRZUser() { - double[][][] hv = new double[2][4][]; - - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - hv[0][2] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][2] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][3] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][3] = new double[] {-rMin, -rMin, -rMax, -rMax}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-z projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFZUser() { - double[][][] hv = new double[2][2][]; - - hv[0][0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] {360., 360., 0., 0.}; - hv[0][1] = new double[] {-zMax, -zMin, -zMin, -zMax}; - hv[1][1] = new double[] {360., 360., 0., 0.}; - - return new ACoord(hv); - } - - /** - * Returns the detector outline in the phi-rho projection. - * @return ACoord polygon representing the detector - */ - protected ACoord getFRUser() { - return ACoord.NO_DATA; - } - - /** - * Returns the module structure in the rho-z projection. - * @return ACoord polygons representing the modules - */ - protected ACoord getRZDetail() { - return ACoord.NO_DATA; - } - - /** - * Returns the module structure in the phi-z projection. - * @return ACoord polygons representing the modules - */ - protected ACoord getFZDetail() { - double[][][] hv = new double[2][2*numPhi][2]; - for (int i=0; i<numPhi; i++) { - hv[0][i][0] = zMin; - hv[1][i][0] = Math.toDegrees(phi0 + i*deltaPhi); - hv[0][i][1] = zMax; - hv[1][i][1] = Math.toDegrees(phi0 + i*deltaPhi); - hv[0][numPhi+i][0] = -zMax; - hv[1][numPhi+i][0] = Math.toDegrees(phi0 + i*deltaPhi); - hv[0][numPhi+i][1] = -zMin; - hv[1][numPhi+i][1] = Math.toDegrees(phi0 + i*deltaPhi); - } - - return new ACoord(hv).includePhiWrapAround("FZ"); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AGapCalorimeterDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/AGapCalorimeterDetector.java deleted file mode 100755 index a27a9872377a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AGapCalorimeterDetector.java +++ /dev/null @@ -1,179 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.parameters.AParameterUtilities; - -/** - * Class representing a calorimeter in the gap region between TILE and extended TILE. - * This is a fairly straightforward implementation of ACalorimeterDetector with only - * one cell per object. - * - * @author Eric Jansen - */ -public class AGapCalorimeterDetector extends ACalorimeterDetector { - - protected int eta; - - /** - * Constructs a new gap calorimeter object (one cell in eta). - * @param name String name of the object - * @param color String name of the color used to draw this object - * @param sampling int sampling of this calorimeter part - * @param region int region of this calorimeter part - * @param rMin double inner radius - * @param rMax double outer radius - * @param zMin double inner z - * @param zMax double outer z - * @param eta int eta index of this cell - * @param phi0 double start of the first cell in phi - * @param nphi int number of cells in phi - */ - public AGapCalorimeterDetector(String name, String color, int sampling, int region, - double rMin, double rMax, double zMin, double zMax, - int eta, double phi0, int nphi) { - super(name, color); - - // Just to be sure we take absolute values here. - this.sampling = Math.abs(sampling); - this.region = Math.abs(region); - this.eta = Math.abs(eta); - - this.rMin = rMin; - this.rMax = rMax; - this.zMin = zMin; - this.zMax = zMax; - this.phi0 = Math.toRadians(phi0); - this.numPhi = nphi; - this.deltaPhi = 2.*Math.PI/numPhi; - - // These arrays are used by the getDetectorIndex() method in ACalorimeterData. - // They provide fast mapping of hits to detectors. - if (this.name.indexOf("ITC") >= 0 && this.sampling < tile_gap.length - && this.eta < tile_gap[this.sampling].length) { - - tile_gap[this.sampling][this.eta] = detectors.indexOf(this); - } else { - System.out.println("Unknown calorimeter object: '" + this.name + "'" - + " some hits might not be displayed correctly."); - } - } - - /** - * Returns the eta value of the center (in eta) of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double eta value - */ - public double getEta(int eta, int side) { - if (side < 0) { - return -getEta(eta, -side); - } else { - return AParameterUtilities.eta((zMin+zMax)/2.f, (rMin+rMax)/2.f); - } - } - - /** - * Returns the lowest eta value of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double lowest eta value - */ - public double getEtaMin(int eta, int side) { - if (side < 0) { - return -getEtaMax(eta, -side); - } else { - return AParameterUtilities.eta((zMin+zMax)/2.f, rMax); - } - } - - /** - * Returns the highest eta value of a cell. - * @param eta int eta index of the cell - * @param side int sign of the z coordinate of the cell - * @return double highest eta value - */ - public double getEtaMax(int eta, int side) { - if (side < 0) { - return -getEtaMin(eta, -side); - } else { - return AParameterUtilities.eta((zMin+zMax)/2.f, rMin); - } - } - - /** - * Returns the rho-z geometry of the full calorimeter part. - * @return ACoord polygons representing geometry - */ - protected ACoord getRZUser() { - double[][][] hv; - if (zMin < 0) { - hv = new double[2][2][]; - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - } else { - hv = new double[2][4][]; - hv[0][0] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][0] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][1] = new double[] { zMax, zMin, zMin, zMax}; - hv[1][1] = new double[] {-rMin, -rMin, -rMax, -rMax}; - hv[0][2] = new double[] {-zMin, -zMax, -zMax, -zMin}; - hv[1][2] = new double[] { rMax, rMax, rMin, rMin}; - hv[0][3] = new double[] {-zMin, -zMax, -zMax, -zMin}; - hv[1][3] = new double[] {-rMin, -rMin, -rMax, -rMax}; - } - return new ACoord(hv); - } - - /** - * Returns the rho-z geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getRZCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - int sign = getRSign(phi); - - // This shouldn't be 0, but just to be on the safe side. - if (side != 0) { - side /= Math.abs(side); - } - - hv[0] = new double[] {zMax, zMin, zMin, zMax}; - hv[1] = new double[] {rMax, rMax, rMin, rMin}; - - // Send it to the right quadrant. - ACoord coord = new ACoord(hv); - for (int i=0; i<coord.hv[0][0].length; i++) { - coord.hv[0][0][i] *= side; - coord.hv[1][0][i] *= sign; - } - - return coord; - } - - /** - * Returns the eta-phi geometry of a specific cell in this calorimeter part. - * @param eta int eta index of cell - * @param phi int phi index of cell - * @param side int sign of the z coordinate of cell - * @return ACoord polygon representing cell geometry - */ - public ACoord getVPCell(int eta, int phi, int side) { - double[][] hv = new double[2][]; - double etaMin = AParameterUtilities.eta((zMin+zMax)/2.f, rMax); - double etaMax = AParameterUtilities.eta((zMin+zMax)/2.f, rMin); - double phiMin = Math.toDegrees(phi0 + phi*deltaPhi); - double phiMax = phiMin + Math.toDegrees(deltaPhi); - - side /= Math.abs(side); - - hv[0] = new double[] {side*etaMax, side*etaMin, side*etaMin, side*etaMax}; - hv[1] = new double[] { phiMax, phiMax, phiMin, phiMin}; - - return new ACoord(hv); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AGeneralDetectors.java b/graphics/AtlantisJava/src/atlantis/geometry/AGeneralDetectors.java deleted file mode 100755 index bb939996da50..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AGeneralDetectors.java +++ /dev/null @@ -1,71 +0,0 @@ -package atlantis.geometry; - -import atlantis.parameters.APar; -import java.util.*; - -/** - * Used to store all detectors which are not part of the muon system - * these may be of different types. - */ - -public final class AGeneralDetectors extends ADetectors { - - public AGeneralDetectors(List detectors) { - super(filterGeneralDetectors(detectors)); - } - - private static ADetector[] filterGeneralDetectors(List detectors) { - - List tempDetectors=new ArrayList(detectors.size()); - Iterator it=detectors.iterator(); - - while(it.hasNext()) { - Object o=it.next(); - if((o instanceof ADetector)&&!(o instanceof ABoxDetector)&&!(o instanceof ATrapezoidDetector)) tempDetectors.add(o); - } - return (ADetector[])tempDetectors.toArray(new ADetector[tempDetectors.size()]); - } - - private void makeDrawListYX() { - int mode=parameterStore.get("YX", "Mode").getI(); - if(mode==0) { - int num=0; - for(int i=0; i<numData; ++i) - if(det[i].getName().indexOf("FCAL")<0) - listdl[num++]=i; - numDraw=num; - } - else if(mode>8) - { - int num=0; - for(int i=0; i<numData; ++i) - if((mode==9 && det[i].getName().equals("FCAL EM")) - ||(mode==10 && det[i].getName().equals("FCAL HAD 1")) - ||(mode==11 && det[i].getName().equals("FCAL HAD 2")) - ||(mode==12 && (det[i].getName().equals("LAr Endcap Presampler"))||det[i].getName().equals("LAr_EC_Presampler")) - ||(mode>=13 && mode<= 15 && (det[i].getName().equals("LAr Outer Endcap") || det[i].getName().equals("LAr Inner Endcap"))) - ||(mode>=16 && mode<= 19 && det[i].getName().equals("HEC")) - ||(parameterStore.get("YX", "DrawFCAL").getStatus() && mode==17 && det[i].getName().equals("FCAL EM")) - ||(parameterStore.get("YX", "DrawFCAL").getStatus() && mode==18 && det[i].getName().equals("FCAL HAD 1")) - ||(parameterStore.get("YX", "DrawFCAL").getStatus() && mode==19 && det[i].getName().equals("FCAL HAD 2")) - ||(mode==20 && (det[i].getName().indexOf("LAr")>=0 || det[i].getName().indexOf("Endcap")>=0 || det[i].getName().indexOf("EC")>=0)) - ||(mode==21 && det[i].getName().equals("HEC")) - ||(mode==22)&& det[i].getName().equals("Minimum Bias Trigger Scintillators")) - listdl[num++]=i; - numDraw=num; - } else - numDraw=0; - } - - protected void makeDrawList(String projection) { - if (projection.equals("YX") || projection.equals("FR")) - makeDrawListYX(); - else { - if(parameterStore.get(projection, "Mode").getI()==0) - constructDefaultDrawList(); - else - numDraw=0; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/AGeometryFromXMLReader.java b/graphics/AtlantisJava/src/atlantis/geometry/AGeometryFromXMLReader.java deleted file mode 100755 index 8b7eb48bf489..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/AGeometryFromXMLReader.java +++ /dev/null @@ -1,286 +0,0 @@ -package atlantis.geometry; - -import java.io.InputStream; -import java.util.List; -import java.util.ArrayList; - -import atlantis.output.AExceptionHandler; -import atlantis.utils.xml.AXMLErrorHandler; -import atlantis.utils.AUtilities; -import org.xml.sax.helpers.*; - -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.Attributes; - - -class AGeometryFromXMLReader extends DefaultHandler { - - private static final boolean VALIDATION=false; - private SAXParser parser; - - private static List<ADetector> detectors; - - public AGeometryFromXMLReader() { - try { - SAXParserFactory factory=SAXParserFactory.newInstance(); - - factory.setValidating(true); - factory.setNamespaceAware(true); - parser=factory.newSAXParser(); - if(VALIDATION) - parser.getXMLReader().setErrorHandler(new AXMLErrorHandler()); - } catch(Exception e) { - AExceptionHandler.processException("Cannot create AGeometryFromXMLReader", e); - } - } - - protected List<ADetector> readDetectorGeometryFromXML(String fileName) - { - detectors = new ArrayList<ADetector>(2500); - try - { - InputStream isGeom = AUtilities.getFileAsStream(fileName); - parser.parse(isGeom, this); - } - catch(Exception e) - { - String msg = "Error when reading geometry file:\n" + e.getMessage(); - AExceptionHandler.processException(msg, e); - } - - return detectors; - } - - static private double calculatePhi(String name, double phi0, int phiIndex) { - String technology = name.substring(0, 3); - if (technology.equals("TGC")) { - if (name.charAt(6) == 'E' && name.charAt(5) != '4') - return Math.toRadians(phi0) + (phiIndex - 1) * Math.PI / 24.; - else - return Math.toRadians(phi0) + (phiIndex - 1) * Math.PI / 12.; - } else { - return Math.toRadians(phi0) + (phiIndex - 1) * Math.PI / 4.; - } - } - - // ContentHandler Implementation - - public void startElement(String namespaceURI, String localName, String qName, Attributes atts) { - if(localName.equals("ABox")||localName.equals("ATBx")) { - String name=atts.getValue("n"); - double zi=Double.parseDouble(atts.getValue("zi")); - double zo=Double.parseDouble(atts.getValue("zo")); - double ri=Double.parseDouble(atts.getValue("ri")); - double ro=Double.parseDouble(atts.getValue("ro")); - double w=Double.parseDouble(atts.getValue("w")); - double dPhi=Double.parseDouble(atts.getValue("dphi")); - double rpci=Double.parseDouble(atts.getValue("RPCi")); - double rpco=Double.parseDouble(atts.getValue("RPCo")); - double s=Double.parseDouble(atts.getValue("sh")); - int stationEta=Integer.parseInt(atts.getValue("eta")); - String[] phis=atts.getValue("phi").split(" "); - - if(localName.equals("ABox")) { - for(int i=0; i<phis.length; ++i) - for(int zSide=-1; zSide<=1; zSide+=2) { - int stationPhi = Integer.parseInt(phis[i]); - double phi = calculatePhi(name, dPhi, stationPhi); - detectors.add(new ABoxDetector(name, zSide*zi, zSide*zo, ri+rpci, ro-rpco, phi, s, w, - zSide*stationEta, stationPhi)); - if(rpci>0.) - detectors.add(new ABoxDetector("RPC"+name.substring(3)+"_I", zSide*zi, zSide*zo, ri, - ri+rpci, phi, s, w, zSide*stationEta, stationPhi)); - if(rpco>0.) - detectors.add(new ABoxDetector("RPC"+name.substring(3)+"_O", zSide*zi, zSide*zo, - ro-rpco, ro, phi, s, w, zSide*stationEta, stationPhi)); - } - } else if(localName.equals("ATBx")) { - double zis=Double.parseDouble(atts.getValue("zis")); - double zos=Double.parseDouble(atts.getValue("zos")); - double ws=Double.parseDouble(atts.getValue("ws")); - double or=Double.parseDouble(atts.getValue("or")); - for(int i=0; i<phis.length; ++i) - for(int zSide=-1; zSide<=1; zSide+=2) { - int stationPhi = Integer.parseInt(phis[i]); - double phi = calculatePhi(name, dPhi, stationPhi); - detectors.add(new ATBxDetector(name, zSide*zi, zSide*zo, ri+rpci, ro-rpco, phi, s, w, - zSide*zis, zSide*zos, ws, or, zSide*stationEta, stationPhi)); - if(rpci>0.) - detectors.add(new ATBxDetector("RPC"+name.substring(3)+"_I", zSide*zi, zSide*zo, ri, - ri+rpci, phi, s, w, zSide*zis, zSide*zos, ws, or, zSide*stationEta, stationPhi)); - if(rpco>0.) - detectors.add(new ATBxDetector("RPC"+name.substring(3)+"_O", zSide*zi, zSide*zo, - ro-rpco, ro, phi, s, w, zSide*zis, zSide*zos, ws, or, zSide*stationEta, stationPhi)); - } - } - - } else if(localName.equals("ATrd")) { - String name=atts.getValue("n"); - double zi=Double.parseDouble(atts.getValue("zi")); - double zo=Double.parseDouble(atts.getValue("zo")); - double ri=Double.parseDouble(atts.getValue("ri")); - double ro=Double.parseDouble(atts.getValue("ro")); - - double wi=Double.parseDouble(atts.getValue("wi")); - double wo=Double.parseDouble(atts.getValue("wo")); - double dPhi=Double.parseDouble(atts.getValue("dphi")); - double alpha=Double.parseDouble(atts.getValue("a")); - int stationEta=Integer.parseInt(atts.getValue("eta")); - String[] phis=atts.getValue("phi").split(" "); - - for(int i=0; i<phis.length; ++i) { - for(int zSide = -1; zSide <= 1; zSide += 2) { - int stationPhi = Integer.parseInt(phis[i]); - double phi = calculatePhi(name, dPhi, stationPhi); - detectors.add(new ATrapezoidDetector(name, zSide*zi, zSide*zo, ri, ro, phi, wi, wo, - alpha, zSide*stationEta, stationPhi)); - } - } - } else if(localName.equals("ABarrelCalorimeter")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int sampling = Integer.parseInt(atts.getValue("sampling")); - int region = Integer.parseInt(atts.getValue("region")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - double eta0 = Double.parseDouble(atts.getValue("eta0")); - double deta = Double.parseDouble(atts.getValue("deta")); - int neta = Integer.parseInt(atts.getValue("neta")); - int meta = Integer.parseInt(atts.getValue("meta")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - detectors.add(new ABarrelCalorimeterDetector(name, color, sampling, region, rMin, rMax, - zMin, zMax, eta0, deta, neta, meta, phi0, nphi)); - } else if(localName.equals("AEndcapCalorimeter")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int sampling = Integer.parseInt(atts.getValue("sampling")); - int region = Integer.parseInt(atts.getValue("region")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - double eta0 = Double.parseDouble(atts.getValue("eta0")); - double deta = Double.parseDouble(atts.getValue("deta")); - int neta = Integer.parseInt(atts.getValue("neta")); - int meta = Integer.parseInt(atts.getValue("meta")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - detectors.add(new AEndcapCalorimeterDetector(name, color, sampling, region, rMin, rMax, - zMin, zMax, eta0, deta, neta, meta, phi0, nphi)); - } else if(localName.equals("AEndcapCryostat")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int sampling = Integer.parseInt(atts.getValue("sampling")); - int region = Integer.parseInt(atts.getValue("region")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - int neta = Integer.parseInt(atts.getValue("neta")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - detectors.add(new AEndcapCryostatDetector(name, color, sampling, region, rMin, rMax, zMin, - zMax, neta, nphi)); - } else if(localName.equals("AGapCalorimeter")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int sampling = Integer.parseInt(atts.getValue("sampling")); - int region = Integer.parseInt(atts.getValue("region")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - int eta = Integer.parseInt(atts.getValue("eta")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - detectors.add(new AGapCalorimeterDetector(name, color, sampling, region, rMin, rMax, - zMin, zMax, eta, phi0, nphi)); - } else if(localName.equals("ABarrelSiliconDetector")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int layer = Integer.parseInt(atts.getValue("layer")); - double length = Double.parseDouble(atts.getValue("length")); - double width = Double.parseDouble(atts.getValue("width")); - double thickness = Double.parseDouble(atts.getValue("thickness")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - int nz = Integer.parseInt(atts.getValue("nz")); - double tilt = Double.parseDouble(atts.getValue("tilt")); - double r0 = Double.parseDouble(atts.getValue("r0")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - detectors.add(new ABarrelSiliconDetector(name, color, layer, length, width, thickness, nz, - nphi, tilt, r0, phi0, zMin, zMax)); - } else if(localName.equals("AEndcapSiliconDetector")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int layer = Integer.parseInt(atts.getValue("layer")); - double length = Double.parseDouble(atts.getValue("length")); - double width = Double.parseDouble(atts.getValue("width")); - double thickness = Double.parseDouble(atts.getValue("thickness")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - int nz = Integer.parseInt(atts.getValue("nz")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - detectors.add(new AEndcapSiliconDetector(name, color, layer, length, width, thickness, nz, - nphi, rMin, rMax, phi0, zMin, zMax)); - } else if(localName.equals("ABarrelTRTDetector")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int layer = Integer.parseInt(atts.getValue("layer")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double phiIn = Double.parseDouble(atts.getValue("phiIn")); - double phiOut = Double.parseDouble(atts.getValue("phiOut")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - detectors.add(new ABarrelTRTDetector(name, color, layer, nphi, rMin, rMax, phiIn, phiOut, zMin, zMax)); - } else if(localName.equals("AEndcapTRTDetector")) { - String name = atts.getValue("n"); - String color = atts.getValue("c"); - int layer = Integer.parseInt(atts.getValue("layer")); - int nphi = Integer.parseInt(atts.getValue("nphi")); - double rMin = Double.parseDouble(atts.getValue("rMin")); - double rMax = Double.parseDouble(atts.getValue("rMax")); - double phi0 = Double.parseDouble(atts.getValue("phi0")); - double zMin = Double.parseDouble(atts.getValue("zMin")); - double zMax = Double.parseDouble(atts.getValue("zMax")); - detectors.add(new AEndcapTRTDetector(name, color, layer, nphi, rMin, rMax, phi0, zMin, zMax)); - } else if(localName.equals("ADisc")) { - String name=atts.getValue("n"); - String projection=atts.getValue("p"); - String color=atts.getValue("c"); - double rInner=Double.parseDouble(atts.getValue("rIn")); - double rOuter=Double.parseDouble(atts.getValue("rOut")); - int nInner=Integer.parseInt(atts.getValue("nIn")); - int nOuter=Integer.parseInt(atts.getValue("nOut")); - - detectors.add(new ADiscDetector(name, projection, color, rInner, rOuter, nInner, nOuter)); - } else if(localName.equals("ARectangle")) { - String name=atts.getValue("n"); - String projection=atts.getValue("p"); - String color=atts.getValue("c"); - double xMin=Double.parseDouble(atts.getValue("xMin")); - double xMax=Double.parseDouble(atts.getValue("xMax")); - double yMin=Double.parseDouble(atts.getValue("yMin")); - double yMax=Double.parseDouble(atts.getValue("yMax")); - boolean xReflect=atts.getValue("xR").equals("YES"); - boolean yReflect=atts.getValue("yR").equals("YES"); - - detectors.add(new ARectangleDetector(name, projection, color, xMin, xMax, yMin, yMax)); - if(xReflect) detectors.add(new ARectangleDetector(name, projection, color, -xMin, -xMax, yMin, - yMax)); - if(yReflect) detectors.add(new ARectangleDetector(name, projection, color, xMin, xMax, -yMin, - -yMax)); - if(xReflect&&yReflect) detectors.add(new ARectangleDetector(name, projection, color, -xMin, - -xMax, -yMin, -yMax)); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ARectangleDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ARectangleDetector.java deleted file mode 100755 index 3af8f2f9b901..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ARectangleDetector.java +++ /dev/null @@ -1,49 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.utils.AMath; - -public class ARectangleDetector extends ADetector -{ - double xMin; - double xMax; - double yMin; - double yMax; - - ARectangleDetector(String name, String projection, String color, double xMin, double xMax, double yMin, double yMax) - { - super(name, projection, color); - this.xMin = xMin; - this.xMax = xMax; - this.yMin = yMin; - this.yMax = yMax; - } - - protected ACoord getRZUser() - { - return getUser("RZ"); - } - - protected ACoord getFZUser() - { - return getUser("FZ"); - } - - protected ACoord getXZUser() - { - return getUser("XZ"); - } - - protected ACoord getYZUser() - { - return getUser("YZ"); - } - - protected ACoord getUser(String proj) - { - if (!projection.equals(proj)) - return ACoord.NO_DATA; - return new ACoord(AMath.xBox((xMin + xMax) / 2., (xMax - xMin) / 2.), AMath.yBox((yMin + yMax) / 2., (yMax - yMin) / 2.)); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ATBxDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ATBxDetector.java deleted file mode 100755 index e4c3dc8204e5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ATBxDetector.java +++ /dev/null @@ -1,81 +0,0 @@ -package atlantis.geometry; - -import atlantis.graphics.ACoord; -import atlantis.utils.AMath; - -/** - * Special t shape Box used for MDT chambers near the feet. - * These are only different in th FZ projection - */ - -public class ATBxDetector extends ABoxDetector { - - double zis; - double zos; - double ws; - double or; - - public ATBxDetector(String name, double zMin, double zMax, double rMin, - double rMax, double phi, double excl, double size, double zis, double zos, - double ws, double or, int etaIndex, int phiIndex) { - super(name, zMin, zMax, rMin, rMax, phi, excl, size, etaIndex, phiIndex); - this.zis=zis; - this.zos=zos; - this.ws=ws; - this.or=or; - } - - protected ACoord getFZUser() { - double[][] hv=new double[2][8]; - double cosPhi=Math.cos(phi); - double sinPhi=Math.sin(phi); - double d=size/2.; - double r=rMin; - double x=r*cosPhi-excl*sinPhi; - double y=r*sinPhi+excl*cosPhi; - double dsinPhi=d*sinPhi; - double dcosPhi=d*cosPhi; - double phi1=Math.toDegrees(Math.atan2(y-dcosPhi, x+dsinPhi)); - double phi2=Math.toDegrees(Math.atan2(y+dcosPhi, x-dsinPhi)); - - if(phi1<0.) phi1+=360.; - if(phi2<0.) phi2+=360.; - if(phi1-phi2>180.) phi1-=360.; - if(phi2-phi1>180.) phi2-=360.; - double phiLower=Math.min(phi1, phi2); - double phiUpper=Math.max(phi1, phi2); - double phiMid=phiLower+ws/size*(phiUpper-phiLower); - hv[0][0]=zMin; - hv[0][1]=zMin; - hv[0][2]=zis; - hv[0][3]=zis; - hv[0][4]=zos; - hv[0][5]=zos; - hv[0][6]=zMax; - hv[0][7]=zMax; - if(or>90.) { - phiMid=phiLower+ws/size*(phiUpper-phiLower); - hv[1][0]=phiUpper; - hv[1][1]=phiMid; - hv[1][2]=phiMid; - hv[1][3]=phiLower; - hv[1][4]=phiLower; - hv[1][5]=phiMid; - hv[1][6]=phiMid; - hv[1][7]=phiUpper; - } else { - phiMid=phiUpper-ws/size*(phiUpper-phiLower); - hv[1][0]=phiLower; - hv[1][1]=phiMid; - hv[1][2]=phiMid; - hv[1][3]=phiUpper; - hv[1][4]=phiUpper; - hv[1][5]=phiMid; - hv[1][6]=phiMid; - hv[1][7]=phiLower; - } - - return new ACoord(hv); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetector.java b/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetector.java deleted file mode 100755 index 7850795a05c0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetector.java +++ /dev/null @@ -1,211 +0,0 @@ -package atlantis.geometry; - - -import atlantis.utils.AMath; -import atlantis.parameters.*; -import atlantis.graphics.ACoord; - -/** - * In ATLAS Trapezoids are TGC and MDT in the endcap. - */ - -public class ATrapezoidDetector extends ADetector { - - double zMin; - double zMax; - double rMin; - double rMax; - double phi; - double sizeS; - double sizeL; - double alpha; - int stationEta; - int stationPhi; - int sector; - - public ATrapezoidDetector(String name, double zMin, double zMax, double rMin, - double rMax, double phi, double sizeS, double sizeL, - double alpha, int stationEta, int stationPhi) { - super(name, " ", name.substring(0, 3)); - this.zMin = zMin; - this.zMax = zMax; - this.rMin = rMin; - this.rMax = rMax; - this.phi = phi; - this.sizeS = sizeS; - this.sizeL = sizeL; - this.alpha = alpha; - this.stationEta = stationEta; - this.stationPhi = stationPhi; - this.sector = ( (int) ( (phi + Math.PI / 16) / (Math.PI / 8))) % 16; - } - - protected boolean equalsYX(ADetector o) { - if (o instanceof ATrapezoidDetector) { - ATrapezoidDetector that = (ATrapezoidDetector) o; - return this.rMin == that.rMin && - this.rMax == that.rMax && - this.phi == that.phi && - this.sizeS == that.sizeS && - this.sizeL == that.sizeL; - } else - return false; - } - - protected boolean equalsRZ(ADetector o) { - if (o instanceof ATrapezoidDetector) { - ATrapezoidDetector that = (ATrapezoidDetector) o; - return this.rMin == that.rMin && - this.rMax == that.rMax && - this.zMin == that.zMin && - this.zMax == that.zMax && - this.alpha == that.alpha; - } - else - return false; - } - - protected ACoord getRZUser() { - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi - phiMid); - double sign = -1.; - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) - sign = +1.; - return getXZRZUser(sign); - } - - protected ACoord getXZUser() { - AParameter p=parameterStore.get("XZ", "Phi"); - - // display muon data when phi is in the middle of a sector - if(p.getD() % 22.5 < 1e-2) { - int sect=(int)Math.round((p.getD() % 360.) / 22.5); - if (sector == sect) { - return getXZRZUser(1.); - } - else if (sector == sect - 8 || sector == sect + 8) { - return getXZRZUser( -1.); - } - } - return ACoord.NO_DATA; - } - - protected ACoord getXZRZUser(double sign) { - if (alpha == 0.) { - return new ACoord( - AMath.xBox( (zMin + zMax) / 2., (zMax - zMin) / 2.), - AMath.yBox(sign * (rMin + rMax) / 2., sign * (rMax - rMin) / 2.)); - } - else { - double[][] hv = new double[2][]; - double zMid = (zMin + zMax) / 2.; - double rMid = (rMin + rMax) / 2.; - double dRho = (rMax - rMin) / 2; - double dZ = (zMax - zMin) / 2; - double sinAlpha = Math.sin(Math.toRadians(alpha)); - double cosAlpha = Math.cos(Math.toRadians(alpha)); - - if (zMid * rMid > 0.) - sinAlpha *= -1.; - - hv[0] = new double[] { - zMid - sinAlpha * dRho - cosAlpha * dZ, - zMid - sinAlpha * dRho + cosAlpha * dZ, - zMid + sinAlpha * dRho + cosAlpha * dZ, - zMid + sinAlpha * dRho - cosAlpha * dZ}; - hv[1] = new double[] { - sign * (rMid + cosAlpha * dRho - sinAlpha * dZ), - sign * (rMid + cosAlpha * dRho + sinAlpha * dZ), - sign * (rMid - cosAlpha * dRho + sinAlpha * dZ), - sign * (rMid - cosAlpha * dRho - sinAlpha * dZ)}; - return new ACoord(hv); - } - } - - protected ACoord getFZUser() { - double deltaPhi = Math.max(Math.atan2(sizeL / 2., rMax), - Math.atan2(sizeS / 2., rMin)); - - if (alpha == 0.) { - return new ACoord( - AMath.xBox( (zMin + zMax) / 2., (zMax - zMin) / 2.), - AMath.yBox( Math.toDegrees(phi), Math.toDegrees(deltaPhi) )); - } - else { - double[][] hv = new double[2][]; - double zMid = (zMin + zMax) / 2.; - double rMid = (rMin + rMax) / 2.; - double dRho = (rMax - rMin) / 2; - double dZ = (zMax - zMin) / 2; - double sinAlpha = Math.sin(Math.toRadians(alpha)); - double cosAlpha = Math.cos(Math.toRadians(alpha)); - - if (zMid * rMid > 0.) - sinAlpha *= -1.; - - hv[0] = new double[] { - zMid - sinAlpha * dRho - cosAlpha * dZ, - zMid - sinAlpha * dRho - cosAlpha * dZ, - zMid + sinAlpha * dRho + cosAlpha * dZ, - zMid + sinAlpha * dRho + cosAlpha * dZ}; - hv[1] = new double[] { - Math.toDegrees(phi - deltaPhi), - Math.toDegrees(phi + deltaPhi), - Math.toDegrees(phi + deltaPhi), - Math.toDegrees(phi - deltaPhi)}; - return new ACoord(hv); - } - } - - protected ACoord getYXUser() { - return getYXUser(0); - } - - protected ACoord getFRUser() { - return convertYXToFR(getYXUser(1)); - } - - private ACoord getYXUser(int flag) { - int[] split= {12, 1, 12, 1}; - int numPoints=4; - boolean splitIt=parameterStore.get("YX", "FishEye").getStatus()||parameterStore.get("YX", "Clock").getStatus() - ||flag==1; - - if(splitIt) - numPoints=26; - double[] temp=new double[4]; - double[][] hv=new double[2][numPoints]; - double cosPhi=Math.cos(phi); - double sinPhi=Math.sin(phi); - double d=sizeS/2.; - double r=rMin; - double x=r*cosPhi; - double y=r*sinPhi; - double dx=d*sinPhi; - double dy=d*cosPhi; - - hv[0][0]=x+dx; - hv[1][0]=y-dy; - hv[0][1]=x-dx; - hv[1][1]=y+dy; - r=rMax; - x=r*cosPhi; - y=r*sinPhi; - d=sizeL/2.; - dx=d*sinPhi; - dy=d*cosPhi; - - hv[0][3]=x+dx; - hv[1][3]=y-dy; - hv[0][2]=x-dx; - hv[1][2]=y+dy; - if(splitIt) - for(int j=0; j<2; ++j) { - for(int k=0; k<4; ++k) - temp[k]=hv[j][k]; - AMath.splitArrayIntoPieces(temp, hv[j], split); - } - return new ACoord(hv); - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetectors.java b/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetectors.java deleted file mode 100755 index 943c34722fa6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/ATrapezoidDetectors.java +++ /dev/null @@ -1,163 +0,0 @@ -package atlantis.geometry; - -// not quite correct for CSC (alpha!=0.) in YX and FR - -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import java.util.*; - -/** - * see comments in ABoxDetectors - */ - -public final class ATrapezoidDetectors extends ADetectors { - - private int numRZTypes; - private int[] typeRZ; - private int numYXTypes; - private int[] typeYX; - - private ATrapezoidDetector[] trapezoid; - - public ATrapezoidDetectors(List detectors) { - super(filterTrapezoidDetectors(detectors)); - trapezoid= new ATrapezoidDetector[det.length]; - for(int i=0;i<trapezoid.length;++i) - trapezoid[i]=(ATrapezoidDetector)det[i]; - - - typeYX=new int[numData]; - for(int i=0; i<numData; ++i) - typeYX[i]=-1; - - numYXTypes=0; - for(int i=0; i<numData; ++i) - if(typeYX[i]==-1) { - typeYX[i]=numYXTypes; - for(int j=i+1; j<numData; ++j) - if(typeYX[j]==-1&&det[i].equalsYX(det[j])) - typeYX[j]=numYXTypes; - numYXTypes++; - } - - typeRZ=new int[numData]; - for(int i=0; i<numData; ++i) - typeRZ[i]=-1; - - numRZTypes=0; - for(int i=0; i<numData; ++i) - if(typeRZ[i]==-1) { - typeRZ[i]=numRZTypes; - for(int j=i+1; j<numData; ++j) - if(typeRZ[j]==-1&&det[i].equalsRZ(det[j])) - typeRZ[j]=numRZTypes; - numRZTypes++; - } - } - - private static ADetector[] filterTrapezoidDetectors(List detectors) { - - List tempDetectors=new ArrayList(detectors.size()); - Iterator it=detectors.iterator(); - - while(it.hasNext()) { - Object o=it.next(); - if(o instanceof ATrapezoidDetector) tempDetectors.add(o); - } - return (ADetector[])tempDetectors.toArray(new ADetector[tempDetectors.size()]); - } - - private void makeDrawListYX() { - int mode=parameterStore.get("YX", "Mode").getI(); - - if(mode==0) - numDraw=0; - else { - int num=0; - for(int i=0; i<numData; ++i) { - double z=trapezoid[i].zMin; - String name=det[i].getName().substring(4, 6); - if(z>0.) - if((mode==1&&name.equals("T4"))||(mode==2&&name.equals("T1")) - ||(mode==3&&name.equals("T2"))||(mode==4&&name.equals("T3")) - ||(mode==5&&(name.equals("EI")||name.equals("CS")))||(mode==6&&name.equals("EE")) - ||(mode==7&&name.equals("EM"))||(mode==8&&name.equals("EO"))) - listdl[num++]=i; - numDraw=num; - } - } - } - - private void makeDrawListXZ() { - AParameter p=parameterStore.get("XZ", "Phi"); - - // display muon data when phi is in the middle of a sector - if(p.getD() % 22.5 < 1e-2) { - int sect=(int)Math.round((p.getD() % 360.) / 22.5); - int num=0; - for(int i=0; i<numData; i++) { - int s=trapezoid[i].sector; - - if(s==sect||s==sect-8||s==sect+8) { - listdl[num++]=i; - } - } - numDraw=num; - } else { - numDraw=0; - } - } - - private void makeDrawListRZ() { - // first make the draw list - // for each type find out if it has both +ve and negative sign - int[] pos=new int[typeRZ.length]; - int[] neg=new int[typeRZ.length]; - double phiMid=Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - for(int i=0; i<numRZTypes; ++i) - neg[i]=pos[i]=-1; - - for(int i=0; i<numData; ++i) { - double phiDiff=Math.abs(trapezoid[i].phi-phiMid); - - if(phiDiff<Math.PI/2.||phiDiff>3*Math.PI/2.) - pos[typeRZ[i]]=i; - else - neg[typeRZ[i]]=i; - } - - int num=0; - for(int i=0; i<numRZTypes; ++i) { - if(pos[i]!=-1) - listdl[num++]=pos[i]; - if(neg[i]!=-1) - listdl[num++]=neg[i]; - } - numDraw=num; - } - - private void makeDrawListFZ() { - if(parameterStore.get("FZ", "Mode").getI()==0) { - constructDefaultDrawList(); - } else { - numDraw=0; - } - } - - protected void makeDrawList(String projection) { - if (projection.equals("YX") || projection.equals("FR") ) - makeDrawListYX(); - else if (projection.equals("FZ")) - makeDrawListFZ(); - else if (projection.equals("RZ")) - makeDrawListRZ(); - else if (projection.equals("XZ")) - makeDrawListXZ(); - else - numDraw=0; - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/geometry/package.html b/graphics/AtlantisJava/src/atlantis/geometry/package.html deleted file mode 100644 index 8c66987e1f11..000000000000 --- a/graphics/AtlantisJava/src/atlantis/geometry/package.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<p>Classes handling the detector description - ADetectorSystem -contains the information used to draw detector components on the -screen.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/globals/AGlobals.java b/graphics/AtlantisJava/src/atlantis/globals/AGlobals.java deleted file mode 100644 index ce6bce2447e2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/globals/AGlobals.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * - */ -package atlantis.globals; - -import java.awt.Frame; -import java.awt.GraphicsEnvironment; - - -/** - * Provides access to Atlantis global variables in a slightly less bad way than - * using the main atlantis.Atlantis class. - * - * @author waugh - * - */ -public class AGlobals { - /** The singleton instance. No point in lazy instantiation. */ - private static AGlobals globals = new AGlobals(); - - /** Get the singleton instance */ - public static AGlobals instance() {return globals;} - - /** Prevent instantiation except through singleton accessor. */ - private AGlobals() {} - - /** Normally the directory that Atlantis was loaded from. */ - private String homeDirectory; - - /** The version of AtlantisJava from Svn. */ - private String version; - - /** Flag for displaying HLTAutoKey data. */ - private boolean showHLTAutoKeys = false; - - /** Flag for using simple output, used by Minerva. */ - private int SIMPLE_OUTPUT = 0; - - /** This is the URL that is used as default for "Read events from URL". */ - private String LIVE_POINT_1_EVENTS_URL; - - /** The path to the user's configuration file. */ - private String userConfigFile; - - /** Whether to use OpenGL. */ - private boolean useOpenGL; - - /** Whether we are in demo mode. */ - private boolean demoMode; - - /** Component representing the GUI, if any. */ - private Frame guiFrame; - - /** - * Set the Atlantis home directory, normally the directory that Atlantis was loaded from. - * - * @param homeDirectory the Atlantis home directory - */ - public void setHomeDirectory(String homeDirectory) { - this.homeDirectory = homeDirectory; - } - - /** - * Get the Atlantis home directory, normally the directory that Atlantis was loaded from. - * - * @return the Atlantis home directory - */ - public String getHomeDirectory() { - return homeDirectory; - } - - /** - * Get AtlantisJava version. - * @return the Svn version, set in Atlantis.main() - */ - public String getVersion() { - return version; - } - - /** - * Set AtlantisJava version, called from Atlantis.main(). - * @param version the version to set - */ - public void setVersion(String version) { - this.version = version; - } - - /** - * Whether to show data with storeGateKey containing "HLTAutoKey". - * - * @return true to show, false to ignore - */ - public boolean showHLTAutoKeys() { - return showHLTAutoKeys; - } - - /** - * Whether to show data with storeGateKey containing "HLTAutoKey". - * - * @param showHLTAutoKeys true to show, false to ignore - */ - public void setHLTAutoKeys(boolean showHLTAutoKeys) { - this.showHLTAutoKeys = showHLTAutoKeys; - } - - /** - * @return the sIMPLE_OUTPUT - */ - public int getSimpleOutput() { - return SIMPLE_OUTPUT; - } - - /** - * @param sIMPLE_OUTPUT the sIMPLE_OUTPUT to set - */ - public void setSimpleOutput(int sIMPLE_OUTPUT) { - SIMPLE_OUTPUT = sIMPLE_OUTPUT; - } - - /** - * @return the URL for the Point 1 live events server - */ - public String getLivePoint1EventsURL() { - return LIVE_POINT_1_EVENTS_URL; - } - - /** - * @param livePoint1EventsURL the URL for the Point 1 live events server - */ - public void setLivePoint1EventsURL(String livePoint1EventsURL) { - LIVE_POINT_1_EVENTS_URL = livePoint1EventsURL; - } - - /** - * @param userConfigFilePath the path to the user's configuration file - */ - public void setUserConfigFile(String userConfigFilePath) { - this.userConfigFile = userConfigFilePath; - } - - /** - * @return the path to the user's configuration file - */ - public String getUserConfigFile() { - return this.userConfigFile; - } - - /** - * @return true if we should be using OpenGL - */ - public boolean getUseOpenGL() { - return useOpenGL; - } - - /** - * @param useOpenGL true to use OpenGL, false otherwise - */ - public void setUseOpenGL(boolean useOpenGL) { - this.useOpenGL = useOpenGL; - } - - /** - * Check whether we are in headless mode - * @return true if headless (no graphics available) - */ - public static boolean isAtlantisHeadless() { - return GraphicsEnvironment.isHeadless(); - } - - /** - * Whether the demo mode loop is running. - * @return true if in demo mode - */ - public boolean isDemoMode() { - return demoMode; - } - - /** - * Signal whether the demo loop is running. - * @param demoMode true when starting loop, false when stopping - */ - public void setDemoMode(boolean demoMode) { - this.demoMode = demoMode; - } - - /** - * For use as parent of dialogues, avoiding dependency on AGUI class itself. - * @return the GUI frame - */ - public Frame getGuiFrame() { - return guiFrame; - } - - /** - * Set the GUI frame, called from AGUI when the instance is created. - * @param guiFrame the GUI frame - */ - public void setGuiFrame(Frame guiFrame) { - this.guiFrame = guiFrame; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/globals/package.html b/graphics/AtlantisJava/src/atlantis/globals/package.html deleted file mode 100644 index e763965d1afb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/globals/package.html +++ /dev/null @@ -1,13 +0,0 @@ -<html> -<head></head> -<body> -<p>Provides access to Atlantis global variables.</p> -<p>This has been introduced as part of a process of breaking unwanted - dependencies between packages. This package can contain any required - global state so that other packages (atlantis.data etc.) do not need - to depend on the "atlantis" package that contains the main Atlantis - class, and which unavoidably depends on the rest of the - packages.</p> -<p>With luck this will prove not to be necessary in the long term!</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AAbstractGraphics2D.java b/graphics/AtlantisJava/src/atlantis/graphics/AAbstractGraphics2D.java deleted file mode 100755 index ddfeba3edb9c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AAbstractGraphics2D.java +++ /dev/null @@ -1,315 +0,0 @@ -package atlantis.graphics; - -import java.awt.*; -import java.awt.font.*; -import java.awt.geom.*; -import java.awt.image.*; -import java.awt.image.renderable.*; - -/** - * This graphics is used when nothing should really be drawn on the screen - */ - -public abstract class AAbstractGraphics2D extends Graphics2D { - - public void transform(AffineTransform z) { - if(true) throw new RuntimeException(); - } - - public void fill(Shape z) { - if(true) throw new RuntimeException(); - } - - public void draw(Shape z) { - if(true) throw new RuntimeException(); - } - - public void drawImage(BufferedImage a, BufferedImageOp b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public boolean drawImage(Image a, AffineTransform b, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public void drawRenderedImage(RenderedImage a, AffineTransform z) { - if(true) throw new RuntimeException(); - } - - public void drawRenderableImage(RenderableImage a, AffineTransform z) { - if(true) throw new RuntimeException(); - } - - public void drawString(java.text.AttributedCharacterIterator a, float b, float z) { - if(true) throw new RuntimeException(); - } - - public void drawString(String a, int b, int z) { - if(true) throw new RuntimeException(); - } - - public void drawString(String a, float b, float z) { - if(true) throw new RuntimeException(); - } - - public void drawString(java.text.AttributedCharacterIterator a, int b, int z) { - if(true) throw new RuntimeException(); - } - - public void drawGlyphVector(GlyphVector a, float b, float z) { - if(true) throw new RuntimeException(); - } - - public boolean hit(Rectangle a, Shape b, boolean z) { - if(true) throw new RuntimeException(); - return false; - } - - public GraphicsConfiguration getDeviceConfiguration() { - if(true) throw new RuntimeException(); - return null; - } - - public void setComposite(Composite z) { - if(true) throw new RuntimeException(); - } - - public void setPaint(Paint z) { - if(true) throw new RuntimeException(); - } - - public void setStroke(Stroke z) { - if(true) throw new RuntimeException(); - } - - public void setRenderingHint(RenderingHints.Key a, Object z) { - if(true) throw new RuntimeException(); - } - - public Object getRenderingHint(RenderingHints.Key z) { - if(true) throw new RuntimeException(); - return null; - } - - public void setRenderingHints(java.util.Map z) { - if(true) throw new RuntimeException(); - } - - public void addRenderingHints(java.util.Map z) { - if(true) throw new RuntimeException(); - } - - public RenderingHints getRenderingHints() { - if(true) throw new RuntimeException(); - return null; - } - - public void translate(double a, double z) { - if(true) throw new RuntimeException(); - } - - public void translate(int a, int z) { - if(true) throw new RuntimeException(); - } - - public void rotate(double a, double b, double z) { - if(true) throw new RuntimeException(); - } - - public void rotate(double z) { - if(true) throw new RuntimeException(); - } - - public void scale(double a, double z) { - if(true) throw new RuntimeException(); - } - - public void shear(double a, double z) { - if(true) throw new RuntimeException(); - } - - public void setTransform(AffineTransform z) { - if(true) throw new RuntimeException(); - } - - public AffineTransform getTransform() { - if(true) throw new RuntimeException(); - return null; - } - - public Paint getPaint() { - if(true) throw new RuntimeException(); - return null; - } - - public Composite getComposite() { - if(true) throw new RuntimeException(); - return null; - } - - public void setBackground(Color z) { - if(true) throw new RuntimeException(); - } - - public Color getBackground() { - if(true) throw new RuntimeException(); - return null; - } - - public Stroke getStroke() { - if(true) throw new RuntimeException(); - return null; - } - - public void clip(Shape z) { - if(true) throw new RuntimeException(); - } - - public FontRenderContext getFontRenderContext() { - if(true) throw new RuntimeException(); - return null; - } - - public void setColor(Color z) { - if(true) throw new RuntimeException(); - } - - public Graphics create() { - if(true) throw new RuntimeException(); - return null; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, int f, int g, int h, int i, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public boolean drawImage(Image a, int b, int c, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public boolean drawImage(Image a, int b, int c, Color d, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, Color f, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, int f, int g, int h, int i, Color j, ImageObserver z) { - if(true) throw new RuntimeException(); - return false; - } - - public Color getColor() { - if(true) throw new RuntimeException(); - return null; - } - - public void fillRect(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void setPaintMode() { - if(true) throw new RuntimeException(); - } - - public void setXORMode(Color z) { - if(true) throw new RuntimeException(); - } - - public Font getFont() { - if(true) throw new RuntimeException(); - return null; - } - - public void setFont(Font z) { - if(true) throw new RuntimeException(); - } - - public FontMetrics getFontMetrics(Font z) { - if(true) throw new RuntimeException(); - return null; - } - - public Rectangle getClipBounds() { - if(true) throw new RuntimeException(); - return null; - } - - public void clipRect(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void setClip(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void setClip(Shape z) { - if(true) throw new RuntimeException(); - } - - public Shape getClip() { - if(true) throw new RuntimeException(); - return null; - } - - public void copyArea(int a, int b, int c, int d, int e, int z) { - if(true) throw new RuntimeException(); - } - - // public void drawLine(int a,int b,int c,int z) { if (true) throw new RuntimeException(); } - public void clearRect(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void drawRoundRect(int a, int b, int c, int d, int e, int z) { - if(true) throw new RuntimeException(); - } - - public void fillRoundRect(int a, int b, int c, int d, int e, int z) { - if(true) throw new RuntimeException(); - } - - public void drawOval(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void fillOval(int a, int b, int c, int z) { - if(true) throw new RuntimeException(); - } - - public void drawArc(int a, int b, int c, int d, int e, int z) { - if(true) throw new RuntimeException(); - } - - public void fillArc(int a, int b, int c, int d, int e, int z) { - if(true) throw new RuntimeException(); - } - - public void drawPolyline(int[] a, int[] b, int z) { - if(true) throw new RuntimeException(); - } - - public void drawPolygon(int[] a, int[] b, int z) { - if(true) throw new RuntimeException(); - } - - public void fillPolygon(int[] a, int[] b, int z) { - if(true) throw new RuntimeException(); - } - - public void dispose() { - if(true) throw new RuntimeException(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AClipper.java b/graphics/AtlantisJava/src/atlantis/graphics/AClipper.java deleted file mode 100755 index c525102c7021..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AClipper.java +++ /dev/null @@ -1,226 +0,0 @@ -package atlantis.graphics; - -import atlantis.utils.AClipPolygon; -import atlantis.utils.APolygon; -import java.awt.Rectangle; - - -/** - * Implement uniform treatment of Clipping for screen, - * postscript and picking. - */ - -public class AClipper { - double[] upper; - double[] lower; - double[][] x; - boolean[][] below; - boolean[][] within; - boolean[][] above; - double hLower; - double hUpper; - double vLower; - double vUpper; - - public static final int NONE_WITHIN=0; - public static final int MAYBE_WITHIN=1; - public static final int ALL_WITHIN=2; - - public AClipper(double hLower, double hUpper, double vLower, double vUpper) { - - x=new double[2][2]; - upper=new double[2]; - lower=new double[2]; - below=new boolean[2][2]; - within=new boolean[2][2]; - above=new boolean[2][2]; - upper[0]=hUpper; - upper[1]=vUpper; - lower[0]=hLower; - lower[1]=vLower; - this.hUpper=hUpper; - this.hLower=hLower; - this.vUpper=vUpper; - this.vLower=vLower; - } - - public AClipper(Rectangle clipBounds) { - this(clipBounds.getX(), clipBounds.getX()+clipBounds.getWidth(), clipBounds.getY(), - clipBounds.getY()+clipBounds.getHeight()); - } - - public boolean isPointWithin(double h0, double v0) { - return hLower<=h0&&h0<=hUpper&&vLower<=v0&&v0<=vUpper; - } - - public boolean isLineWithin(double h0, double v0, double h1, double v1) { - int roughCheck=fastWithin(h0, v0, h1, v1); - - if(roughCheck==0) return false; - x[0][0]=h0; - x[1][0]=v0; - x[0][1]=h1; - x[1][1]=v1; - if(roughCheck==2) return true; - - update(0); - update(1); - - outer: - while(!lineFullyInside()) { - if(lineFullyOutside()) return false; - - for(int i=0; i<2; i++) - for(int point=0; point<2; point++) { - if(!within[i][point]) { - if(below[i][point]) { - x[1-i][point]+=((x[1-i][1-point]-x[1-i][point])/(x[i][1-point]-x[i][point])) - *(lower[i]-x[i][point]); - x[i][point]=lower[i]; - } else if(above[i][point]) { - x[1-i][point]+=((x[1-i][1-point]-x[1-i][point])/(x[i][1-point]-x[i][point])) - *(upper[i]-x[i][point]); - x[i][point]=upper[i]; - } - update(point); - continue outer; - } - } - } - // don't allow non-zero length line to be given zero length - // by th clipper - if((x[0][0]==x[0][1])&&(x[1][0]==x[1][1])) - return false; - return true; - } - - private void update(int p) { - for(int i=0; i<2; i++) { - below[i][p]=false; - within[i][p]=false; - above[i][p]=false; - if(x[i][p]<lower[i]) - below[i][p]=true; - else if(x[i][p]>upper[i]) - above[i][p]=true; - else - within[i][p]=true; - } - } - - public boolean lineFullyInside() { - boolean inside=true; - - for(int i=0; i<2; i++) - for(int j=0; j<2; j++) - inside=inside&&within[i][j]; - return inside; - } - - public boolean lineFullyOutside() { - boolean outside=false; - - for(int i=0; i<2; i++) { - outside=outside||(below[i][0]&&below[i][1]); - outside=outside||(above[i][0]&&above[i][1]); - } - return outside; - } - - public double[][] getHV() { - return x; - } - - public double getH0() { - return x[0][0]; - } - - public double getV0() { - return x[1][0]; - } - - public double getH1() { - return x[0][1]; - } - - public double getV1() { - return x[1][1]; - } - - public int fastWithin(double h0, double v0, double h1, double v1) { - if(h0<hLower&&h1<hLower) return NONE_WITHIN; - if(h0>hUpper&&h1>hUpper) return NONE_WITHIN; - if(v0<vLower&&v1<vLower) return NONE_WITHIN; - if(v0>vUpper&&v1>vUpper) return NONE_WITHIN; - if(hLower<=h0&&h0<=hUpper&&hLower<=h1&&h1<=hUpper&&vLower<=v0&&v0<=vUpper&&vLower<=v1 - &&v1<=vUpper) return ALL_WITHIN; - return MAYBE_WITHIN; - } - - public int fastWithin(double[] h, double[] v, int numPoints) { - if(numPoints==0) return NONE_WITHIN; - boolean firstWithin=hLower<=h[0]&&h[0]<=hUpper&&vLower<=v[0]&&v[0]<=vUpper; - - if(firstWithin) { - for(int i=1; i<numPoints; ++i) - if(!(hLower<=h[i]&&h[i]<=hUpper&&vLower<=v[i]&&v[i]<=vUpper)) return MAYBE_WITHIN; - return ALL_WITHIN; - } else { - if(h[0]<hLower) { - int num=1; - - for(int i=1; i<numPoints; ++i) - if(h[i]<hLower) - num++; - else - break; - if(num==numPoints) return NONE_WITHIN; - } - if(h[0]>hUpper) { - int num=1; - - for(int i=1; i<numPoints; ++i) - if(h[i]>hUpper) - num++; - else - break; - if(num==numPoints) return NONE_WITHIN; - } - if(v[0]<vLower) { - int num=1; - - for(int i=1; i<numPoints; ++i) - if(v[i]<vLower) - num++; - else - break; - if(num==numPoints) return NONE_WITHIN; - } - if(v[0]>vUpper) { - int num=1; - - for(int i=1; i<numPoints; ++i) - if(v[i]>vUpper) - num++; - else - break; - if(num==numPoints) return NONE_WITHIN; - } - return MAYBE_WITHIN; - } - } - - public ACoord clipPolygon(double[] h, double[] v, int numPoints) { - double[] clipH=new double[] { lower[0], upper[0], upper[0], lower[0] }; - double[] clipV=new double[] { lower[1], lower[1], upper[1], upper[1] }; - AClipPolygon clipArea=new AClipPolygon(clipH, clipV); - APolygon badPolygon=new APolygon(h, v); - - badPolygon.clip(clipArea); - h=badPolygon.getX(); - v=badPolygon.getY(); - return new ACoord(h, v); - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ACoord.java b/graphics/AtlantisJava/src/atlantis/graphics/ACoord.java deleted file mode 100755 index 71aa21563792..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ACoord.java +++ /dev/null @@ -1,355 +0,0 @@ -package atlantis.graphics; - -import atlantis.parameters.APar; -import atlantis.utils.*; - -/** - * Used to store a collection of User or display 2D coordinates of hits or tracks - * together with their indices in the corresponding AData - * (used for picking, colors etc.). N.B. the storage model is different for - * SYMBOLS/LINES(with two end points) than for POLYLINES/POLYGONS for - * efficiency reasons. Transformations between user/display coordinaates are based - * on ACoords. - */ -public class ACoord { - - private static ALogger logger = ALogger.getLogger(ACoord.class); - - public double[][][] hv; - public int[] index; - protected int type=POLYGONS; - public ADrawable source; - - final static public int SYMBOLS=1; - final static public int LINES=2; - final static public int POLYLINES=3; - final static public int POLYGONS=4; - final static public int DOTTED_POLYGONS=5; // for drawing missing ET in V-Plot - final static public int SMOOTH_POLYLINES=6; - final static public int TRANSPARENT_POLYGONS=7; - - final static public ACoord NO_DATA=new ACoord(new double[2][0][0], new int[0]); - final static public ACoord NO_POLYGONS=new ACoord(new double[2][0][0], new int[0]); - final static public ACoord NO_POLYLINES=new ACoord(new double[2][0][0], new int[0]); - final static public ACoord[] NO_HISTOGRAMS=new ACoord[0]; - - protected static APar parameterStore = APar.instance(); - - public ACoord(double h, double v, int index) { - this(h, v); - this.index=new int[] {index}; - } - - public ACoord(double h, double v) { - this.hv=new double[2][1][1]; - this.hv[0][0][0]=h; - this.hv[1][0][0]=v; - this.index=null; - this.type=SYMBOLS; - } - - public ACoord(double[] h, double[] v) { - this.hv=new double[2][1][]; - this.hv[0][0]=h; - this.hv[1][0]=v; - this.index=new int[] {0}; - } - - private ACoord(double[][] hv, int[] index) { - if(hv.length!=2) throw new IllegalArgumentException("hv.length="+hv.length); - this.hv = new double[2][1][0]; - this.hv[0][0]=hv[0]; - this.hv[1][0]=hv[1]; - this.index=index; - } - - private ACoord(double[][] hv, int[] index, ADrawable source) { - this(hv, index); - this.source=source; - } - - public ACoord(double[][] hv) { - if(hv.length!=2) throw new IllegalArgumentException("hv.length="+hv.length); - this.hv = new double[2][1][]; - this.hv[0][0]=hv[0]; - this.hv[1][0]=hv[1]; - this.index=null; - } - - public ACoord(double[][][] hv, int[] index) { - if(hv.length!=2) throw new IllegalArgumentException("hv.length="+hv.length); - this.hv=hv; - this.index=index; - } - - public ACoord(double[][][] hv, int[] index, ADrawable source) { - this(hv, index); - this.source=source; - } - - public ACoord(double[][][] hv) { - if(hv.length!=2) throw new IllegalArgumentException("hv.length="+hv.length); - this.hv=hv; - this.index=null; - } - - private ACoord(ACoord a) { - this.hv=new double[a.hv.length][][]; - for(int i=0; i<a.hv.length; i++) { - this.hv[i]=new double[a.hv[i].length][]; - for(int j=0; j<a.hv[i].length; j++) { - this.hv[i][j]=new double[a.hv[i][j].length]; - for(int k=0; k<a.hv[i][j].length; k++) - this.hv[i][j][k]=a.hv[i][j][k]; - } - } - this.index=new int[a.index.length]; - for(int i=0; i<a.index.length; i++) - this.index[i]=a.index[i]; - this.type=a.type; - this.source=a.source; - } - - public ACoord(double[][] hv, int[] index, ADrawable source, int type) { - this(hv, index, source); - this.type=type; - } - - public ACoord(double[][][] hv, int[] index, ADrawable source, int type) { - this(hv, index, source); - this.type=type; - } - - public ACoord(double[] h, double[] v, int[] index, ADrawable source) { - if(h.length!=v.length) - throw new IllegalArgumentException("h.length "+h.length+" !=v.length "+v.length); - if(h.length!=index.length) - throw new IllegalArgumentException("h.length "+h.length+" !=index.length "+index.length); - this.hv=new double[2][1][]; - this.hv[0][0]=h; - this.hv[1][0]=v; - this.index=index; - this.type=SYMBOLS; - this.source=source; - } - - public void print() { - for(int j=0; j<hv[0].length; j++) { - logger.debug(" index = "+index[j]); - for(int i=0; i<2; i++) { - if(i==0) - logger.debug("h "); - else - logger.debug("v "); - for(int k=0; k<hv[0][j].length; k++) - logger.debug((float)hv[i][j][k]+"\t"); - } - } - } - - // careful this does not make an independent copy - public ACoord(ACoord a, ACoord b) { - this.hv=new double[2][a.hv[0].length+b.hv[0].length][]; - this.index=new int[a.hv[0].length+b.hv[0].length]; - this.type=a.type; - this.source=a.source; - - for(int i=0; i<2; i++) { - int num=0; - - for(int j=0; j<a.hv[i].length; j++) { - this.hv[i][num]=a.hv[i][j]; - this.index[num]=a.index[j]; - num++; - } - for(int j=0; j<b.hv[i].length; j++) { - this.hv[i][num]=b.hv[i][j]; - this.index[num]=b.index[j]; - num++; - } - } - } - - public ACoord convertYXToFR() { - if(type==SYMBOLS||type==LINES) { - for(int j=0; j<hv[0][0].length; j++) { - double phiLast=0.; - - for(int i=0; i<hv[0].length; i++) { - double xx=hv[0][i][j]; - double yy=hv[1][i][j]; - double rho=Math.sqrt(xx*xx+yy*yy); - double phi=Math.toDegrees(Math.atan2(yy, xx)); - - if(phi<0.) - phi+=360.; - if(i>0) { - if(phi-phiLast>180.) phi-=360.; - if(phi-phiLast<-180.) phi+=360.; - } - hv[0][i][j]=rho; - hv[1][i][j]=phi; - phiLast=phi; - } - } - - } else { - for(int i=0; i<hv[0].length; i++) { - double phiLast=0.; - - for(int j=0; j<hv[0][i].length; j++) { - double xx=hv[0][i][j]; - double yy=hv[1][i][j]; - double rho=Math.sqrt(xx*xx+yy*yy); - double phi=Math.toDegrees(Math.atan2(yy, xx)); - - if(phi<0.) - phi+=360.; - if(j>0) { - if(phi-phiLast>180.) phi-=360.; - if(phi-phiLast<-180.) phi+=360.; - } - hv[0][i][j]=rho; - hv[1][i][j]=phi; - phiLast=phi; - } - } - } - return this; - } - - public ACoord includePhiWrapAround(String projectionName) { - // assumes phi is always the v coordinaate - int numFrames=parameterStore.get(projectionName, "FramesCount").getI(); - int initialFrame=parameterStore.get(projectionName, "InitialFrame").getI(); - - if(type==SYMBOLS||type==LINES) { - int numPoints=hv[1].length; - int numInitialData=hv[1][0].length; - - double[][][] hvtemp=new double[2][numPoints][numFrames*numInitialData]; - int[] indextemp=new int[numFrames*numInitialData]; - - int num=0; - - for(int f=initialFrame; f<initialFrame+numFrames; f++) { - for(int i=0; i<numInitialData; i++) { - if(index!=null) indextemp[num]=index[i]; - for(int j=0; j<numPoints; ++j) { - hvtemp[0][j][num]=this.hv[0][j][i]; - hvtemp[1][j][num]=this.hv[1][j][i]+f*360.; - } - num++; - } - } - hv=hvtemp; - if (index!=null) index=indextemp; - } else { - int numInitialData=hv[1].length; - double[][][] hvtemp=new double[2][numFrames*numInitialData][]; - int[] indextemp=new int[numFrames*numInitialData]; - - int num=0; - - for(int f=initialFrame; f<initialFrame+numFrames; f++) { - for(int i=0; i<numInitialData; i++) { - int numPoints=hv[1][i].length; - - hvtemp[0][num]=new double[numPoints]; - hvtemp[1][num]=new double[numPoints]; - for(int j=0; j<numPoints; j++) { - hvtemp[0][num][j]=this.hv[0][i][j]; - hvtemp[1][num][j]=this.hv[1][i][j]+f*360.; - } - if (index!=null) indextemp[num]=index[i]; - num++; - } - } - hv=hvtemp; - if (index!=null) index=indextemp; - } - return this; - } - - /** - * used in ATLAS context for the TRT - * Force data to be drawn as symbols if - * forceSymbols=true - * or - * all lines are smaller than minSize - */ - public ACoord toSymbols(boolean forceSymbols, int minSize) { - if(type==LINES) { - double dmax2=0.; - - for(int i=0; i<hv[0][0].length; i++) { - double dh=(hv[0][0][i]-hv[0][1][i]); - double dv=(hv[1][0][i]-hv[1][1][i]); - double d=dh*dh+dv*dv; - - if(d>dmax2) dmax2=d; - } - if(Math.sqrt(dmax2)<minSize||forceSymbols) { - type=SYMBOLS; - for(int i=0; i<hv[0][0].length; i++) { - hv[0][0][i]=(hv[0][0][i]+hv[0][1][i])/2.; - hv[1][0][i]=(hv[1][0][i]+hv[1][1][i])/2.; - } - } - } else if(type==POLYLINES||type==POLYGONS||type==TRANSPARENT_POLYGONS) { - double dmax2=0.; - - for(int j=0; j<hv[0].length; j++) { - for(int i=0; i<hv[0][j].length; i++) { - double dh=(hv[0][j][0]-hv[0][j][i]); - double dv=(hv[1][j][0]-hv[1][j][i]); - double d=dh*dh+dv*dv; - - if(d>dmax2) dmax2=d; - } - } - - if(Math.sqrt(dmax2)<minSize||forceSymbols) { - type=SYMBOLS; - double[][][] hvnew=new double[2][1][hv[0].length]; - - for(int j=0; j<hv[0].length; j++) { - double h=0.; - double v=0.; - - for(int i=0; i<hv[0][j].length; i++) { - h+=hv[0][j][i]; - v+=hv[1][j][i]; - } - h/=hv[0][j].length; - v/=hv[0][j].length; - hvnew[0][0][j]=h; - hvnew[1][0][j]=v; - } - hv=hvnew; - } - } - return this; - } - - public ACoord mirrorH () { - ACoord coord = new ACoord(this); - for(int i=0; i<coord.hv[0].length; i++) { - for(int j=0; j<coord.hv[0][i].length; j++) { - coord.hv[0][i][j] *= -1; - } - } - return coord; - } - - public ACoord mirrorV () { - ACoord coord = new ACoord(this); - for(int i=0; i<coord.hv[1].length; i++) { - for(int j=0; j<coord.hv[1][i].length; j++) { - coord.hv[1][i][j] *= -1; - } - } - return coord; - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ACursorFactory.java b/graphics/AtlantisJava/src/atlantis/graphics/ACursorFactory.java deleted file mode 100755 index 133abd8f8d49..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ACursorFactory.java +++ /dev/null @@ -1,227 +0,0 @@ -package atlantis.graphics; - - -import java.awt.Toolkit; -import java.awt.Dimension; -import java.awt.Cursor; -import java.awt.Point; -import java.awt.Image; -import java.awt.dnd.DragSource; - -import atlantis.globals.AGlobals; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; - -/** - * Singleton class factory for producing cursors. - * Due to difference in the default cursors provided by the different OSs, - * all cursors are generated by Atlantis itself. - */ - -public class ACursorFactory { - - private static ALogger logger = ALogger.getLogger(ACursorFactory.class); - - /** singleton class, pointer to this instance */ - private static ACursorFactory instance; - - /** Cursor size string, either "64x64" or "32x32" */ - private String cursorSize; - - /** Cursor color string, either "bw" or "" */ - private String bAndW=""; - - /** - * @return true if if system supports custom cursors - */ - public boolean getCustomCursors() { return customCursors; } - private final boolean customCursors; - - /** - * @return the default Cursor - */ - public Cursor getDefaultCursor() { return defaultCursor; } - private Cursor defaultCursor = null; - - /** Drag-and-drop valid cursor */ - private Cursor dragValidCursor=null; - public Cursor getDragValidCursor() { return dragValidCursor; } - /** Drag-and-drop invalid cursor */ - private Cursor dragInvalidCursor=null; - public Cursor getDragInvalidCursor() { return dragValidCursor; } - - /** Zoom cursor */ - public Cursor getZoomCursor() { return zoomCursor; } - private Cursor zoomCursor=null; - /** Move cursor */ - public Cursor getMoveCursor() { return moveCursor; } - private Cursor moveCursor=null; - /** Rotate cursor */ - public Cursor getRotateCursor() { return rotateCursor; } - private Cursor rotateCursor=null; - - /** Pick cursor */ - public Cursor getPickCursor() { return pickCursor; } - private Cursor pickCursor=null; - /** Rectangular selection cursor */ - public Cursor getRectSelectCursor() { return rectSelectCursor; } - private Cursor rectSelectCursor=null; - - /** Syncro cursor */ - public Cursor getSyncCursor() { return syncCursor; } - private Cursor syncCursor=null; - /** FishEye cursor */ - public Cursor getFishEyeCursor() { return fishEyeCursor; } - private Cursor fishEyeCursor=null; - - /** FishEye symbol also needed as a FishEye on/off indicator */ - public Image getFishEyeIndicator() { return fishEyeIndicator; } - private Image fishEyeIndicator=null; - - /** ATLAS logo can be printed on canvas */ - public Image getAtlasLogo() { return atlasLogo; } - private Image atlasLogo=null; - - /** - * Public singleton instantiation accessor - * @return the singleton instance - */ - public static ACursorFactory getInstance() { - - //Check if we already have an instance - if (instance == null) instance = new ACursorFactory(); - - //Return the singleton instance - return instance; - } - - - /** Constructor */ - private ACursorFactory(){ - - logger.debug("Creating cursor and image factory ..."); - String FILE_SEPAR = System.getProperty("file.separator"); - String homeDirectory = AGlobals.instance().getHomeDirectory(); - - //Provide images and indicators even in headless mode - //Fisheye - String path = homeDirectory + "img" + FILE_SEPAR + - "cursor_fisheye_"+bAndW+"32x32.gif"; - fishEyeIndicator = AUtilities.getFileAsImageIcon(path).getImage(); - - //Atlas logo - path = homeDirectory + "img" + FILE_SEPAR + - "atlas_logo_big.png"; - atlasLogo = AUtilities.getFileAsImageIcon(path).getImage(); - - - //Don't create any cursors in headless mode - if (AGlobals.isAtlantisHeadless()){ - //Custom cursors not supported on this platform - customCursors=false; - return; - } - - //Check for best cursor size on this system - trying largest - Dimension bestCursorSize=Toolkit.getDefaultToolkit().getBestCursorSize(64,64); - - //Check if custom cursors are allowed - if (bestCursorSize.width > 0){ - - customCursors=true; - - //We only support 32x32 and 64x64 cursors. Check which one we are closer to - if (bestCursorSize.width < 48) cursorSize="32x32"; - else cursorSize="64x64"; - - //Check if we have enough colours for greyscale cursors - if (Toolkit.getDefaultToolkit().getMaximumCursorColors() < 255) - bAndW="bw_"; - else bAndW=""; - - logger.info("Using "+bAndW+cursorSize+" cursors"); - - //Now create the individual cursors - Toolkit tools = Toolkit.getDefaultToolkit(); - - - //Drag and drop cursors ----------------------------------------------- - - //Valid DnD - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_DnD_valid_" + cursorSize+ ".gif"; - Image validDnDImg = AUtilities.getFileAsImageIcon(path).getImage(); - - dragValidCursor=tools.createCustomCursor(validDnDImg, new Point(1, 1),"ValidDnD"); - - //Invalid Dnd - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_DnD_invalid_" + cursorSize + ".gif"; - Image invalidDnDImg = AUtilities.getFileAsImageIcon(path).getImage(); - dragInvalidCursor=tools.createCustomCursor(invalidDnDImg,new Point(9, 9),"InvalidDnD"); - - //Zoom, move and rotate cursors ----------------------------------------------- - //Zoom - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_zoom_"+bAndW+cursorSize+".gif"; - Image zoomImg = AUtilities.getFileAsImageIcon(path).getImage(); - zoomCursor=tools.createCustomCursor(zoomImg, new Point(9, 9),"Zoom"); - - //Move - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_move_" + cursorSize+".gif"; - Image moveImg = AUtilities.getFileAsImageIcon(path).getImage(); - moveCursor=tools.createCustomCursor(moveImg,new Point(10, 10),"Move"); - - //Rotate - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_rotate_"+bAndW+cursorSize+".gif"; - Image rotateImg = AUtilities.getFileAsImageIcon(path).getImage(); - rotateCursor=tools.createCustomCursor(rotateImg,new Point(11, 11),"Rotate"); - - //Pick and RectSelect cursors ----------------------------------------------- - //Pick - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_pick_"+cursorSize+".gif"; - Image pickImg = AUtilities.getFileAsImageIcon(path).getImage(); - pickCursor=tools.createCustomCursor(pickImg, new Point(6, 1),"Pick"); - - //Rectangle select - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_rectsel_"+cursorSize+".gif"; - Image rectSelectImg = AUtilities.getFileAsImageIcon(path).getImage(); - rectSelectCursor=tools.createCustomCursor(rectSelectImg,new Point(12, 12),"RectSelect"); - - //Syncro and FishEye cursors ----------------------------------------------------- - //Sync - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_sync_" + cursorSize + ".gif"; - Image syncImg = AUtilities.getFileAsImageIcon(path).getImage(); - syncCursor=tools.createCustomCursor(syncImg, new Point(10, 10),"Sync"); - - //FishEye - path = homeDirectory + "img" + FILE_SEPAR + - "cursor_fisheye_"+bAndW+cursorSize+".gif"; - Image fishEyeImg = AUtilities.getFileAsImageIcon(path).getImage(); - fishEyeCursor=tools.createCustomCursor(fishEyeImg, new Point(1, 8),"FishEye"); - - } else customCursors=false; - - - //Now check for any cursors that have not been set yet - //And set them to system defaults - if (defaultCursor == null) defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR); - - if (dragValidCursor == null) dragValidCursor = DragSource.DefaultMoveDrop; - if (dragInvalidCursor == null) dragInvalidCursor = DragSource.DefaultMoveNoDrop; - - if (zoomCursor == null) zoomCursor = new Cursor(Cursor.DEFAULT_CURSOR); - if (moveCursor == null) moveCursor = new Cursor(Cursor.MOVE_CURSOR); - if (rotateCursor == null) rotateCursor = new Cursor(Cursor.DEFAULT_CURSOR); - - if (pickCursor == null) pickCursor = new Cursor(Cursor.HAND_CURSOR); - if (rectSelectCursor == null) rectSelectCursor = new Cursor(Cursor.NW_RESIZE_CURSOR); - if (syncCursor == null) syncCursor = new Cursor(Cursor.CROSSHAIR_CURSOR); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ADrawParameters.java b/graphics/AtlantisJava/src/atlantis/graphics/ADrawParameters.java deleted file mode 100755 index 214b6e05b459..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ADrawParameters.java +++ /dev/null @@ -1,98 +0,0 @@ -package atlantis.graphics; - -import atlantis.graphics.colormap.AColorMap; - -import java.awt.Color; - -/** - * Contains graphics attributes of a collection of data - */ -public class ADrawParameters { - - boolean draw; - Color color; - int size; - int minSize=0; - boolean forceSymbols=false; - int lineWidth; - int frameWidth; - int symbol; - int drawOrFill=AGraphics.DRAW; - - public ADrawParameters(boolean draw, int color, int size, int lineWidth, int frameWidth, int symbol) { - Color[] colorMap=AColorMap.getColors(); - - this.draw=draw; - if(color!=-1) - this.color=colorMap[color]; - else - this.color=null; - this.size=size; - this.lineWidth=lineWidth; - this.frameWidth=frameWidth; - this.symbol=symbol; - } - - public ADrawParameters(boolean draw, int color, int size, int lineWidth, int frameWidth, int symbol, - boolean forceSymbols, int minSize, int drawOrFill) { - Color[] colorMap=AColorMap.getColors(); - - this.draw=draw; - if(color!=-1) - this.color=colorMap[color]; - else - this.color=null; - this.size=size; - this.lineWidth=lineWidth; - this.frameWidth=frameWidth; - this.symbol=symbol; - this.forceSymbols=forceSymbols; - this.minSize=minSize; - this.drawOrFill=drawOrFill; - } - - public ADrawParameters(boolean draw, Color color, int size, int lineWidth, int frameWidth, int symbol, int drawOrFill) { - this.draw=draw; - this.color=color; - this.size=size; - this.lineWidth=lineWidth; - this.frameWidth=frameWidth; - this.symbol=symbol; - this.drawOrFill=drawOrFill; - } - - public void setColor(int color) { - Color[] colorMap=AColorMap.getColors(); - - this.color=colorMap[color]; - } - - public void setFrameWidth(int width) { - this.frameWidth=width; - } - - public void setSize(int size) { - this.size=size; - } - - public boolean toBeDrawn() { - return draw; - } - - public int getSize() { - return size; - } - - public int getMinSize() { - return minSize; - } - - public boolean getForceSymbols() { - return forceSymbols; - } - - public int getDrawOrFill() { - return drawOrFill; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ADrawable.java b/graphics/AtlantisJava/src/atlantis/graphics/ADrawable.java deleted file mode 100755 index bf36d13b60e7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ADrawable.java +++ /dev/null @@ -1,24 +0,0 @@ -package atlantis.graphics; - - -import atlantis.canvas.AWindow; -import atlantis.projection.AProjection2D; - - -public interface ADrawable { - void draw(AWindow window, AGraphics ag, AProjection2D projection); - int[] getColor(int[] dl); - int[] getType(int[] dl); - int getNumTypes(); - - /** - * The data are normally drawn in two layers - * (layer=0 is for frames) - * (layer=1 is the data) - * The data may be of more than 1 type which are drawn in sequence - * e.g. type=0 noise - * type=1 others - */ - ADrawParameters getDrawParameters(int layer, int type); -} - diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ADrawnGraphics2D.java b/graphics/AtlantisJava/src/atlantis/graphics/ADrawnGraphics2D.java deleted file mode 100755 index 5cd633a5e933..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ADrawnGraphics2D.java +++ /dev/null @@ -1,149 +0,0 @@ -package atlantis.graphics; - -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.geom.PathIterator; -import java.util.ArrayList; -import java.util.HashMap; - -import atlantis.data.ACalorimeterData; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.data.AHistogram; -import atlantis.list.AList; -import atlantis.list.AListManager; -import atlantis.utils.ALogger; - -/** - * Simple graphics context simply decides whether something was drawn or not - */ - -public class ADrawnGraphics2D extends ATemplateGraphics2D -{ - private static ALogger logger = ALogger.getLogger(ADrawnGraphics2D.class); - private static AEventManager eventManager = AEventManager.instance(); - - private static HashMap map; - private static ArrayList histogramList; - - public ADrawnGraphics2D(Rectangle bounds) - { - super(bounds); - map = new HashMap(); - histogramList = new ArrayList(); - AEvent event = eventManager.getCurrentEvent(); - if (event != null) - { - AData[] data = event.getData(); - for (int i = 0; i < data.length; ++i) - { - map.put(data[i], new boolean[data[i].getNumData()]); - } - } - } // ADrawnGraphics2D() ---------------------------------------------------- - - ADrawnGraphics2D(ADrawnGraphics2D a) - { - super(a); - } // ADrawnGraphics2D() ---------------------------------------------------- - - public static void updateLastDrawn() - { - AListManager.getInstance().clearLastDrawn(); - AEvent event = eventManager.getCurrentEvent(); - if (event != null) - { - AData[] data = event.getData(); - for (int i = 0; i < data.length; ++i) - { - boolean[] drawn = (boolean[]) map.get(data[i]); - if (data[i] instanceof ACalorimeterData) - { - drawn = ((ACalorimeterData) data[i]).expandDrawn(drawn); - } - AListManager.getInstance().addLastDrawn(new AList(data[i], drawn)); - } - for (int i = 0; i < histogramList.size(); ++i) - { - boolean[] drawn = (boolean[]) map.get(histogramList.get(i)); - AListManager.getInstance().addLastDrawn(new AList((AData)histogramList.get(i), drawn)); - } - } - } // updateLastDrawn() ----------------------------------------------------- - - public Graphics create() - { - return new ADrawnGraphics2D(this); - } - - public void drawLine(double h0, double v0, double h1, double v1) - { - if (AGraphics.currentData != null) - { - ((boolean[]) map.get(AGraphics.currentData))[AGraphics.currentIndex] = true; - } - } - - public void fillRect(int h, int v, int width, int height) - { - double dh = width / 2.; - double dv = height / 2.; - drawLine(h - dh, v - dv, h + dh, v - dv); - drawLine(h + dh, v - dv, h + dh, v + dv); - drawLine(h + dh, v + dv, h - dh, v + dv); - drawLine(h - dh, v + dv, h - dh, v - dv); - } - - public void draw(Shape s) - { - PathIterator path = s.getPathIterator(null); - double[] coords = new double[6]; - double h0 = 0.; - double v0 = 0.; - double h1 = 0.; - double v1 = 0.; - while (!path.isDone()) - { - int segType = path.currentSegment(coords); - - switch (segType) - { - case PathIterator.SEG_MOVETO: - h0 = coords[0]; - v0 = coords[1]; - break; - - case PathIterator.SEG_LINETO: - case PathIterator.SEG_CUBICTO: - h1 = coords[0]; - v1 = coords[1]; - drawLine(h0, v0, h1, v1); - h0 = h1; - v0 = v1; - break; - - case PathIterator.SEG_CLOSE: - break; - - default: - logger.error(" Error unknown segment type"); - break; - } - path.next(); - } - } - - public void fill(Shape s) - { - draw(s); - } - - public void addHistogramData(AHistogram data) - { - histogramList.add(data); - map.put(data, new boolean[data.getNumData()]); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ADummyGraphics2D.java b/graphics/AtlantisJava/src/atlantis/graphics/ADummyGraphics2D.java deleted file mode 100755 index 9c8cded5a0a8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ADummyGraphics2D.java +++ /dev/null @@ -1,215 +0,0 @@ -package atlantis.graphics; - -import java.awt.*; -import java.awt.image.*; -import java.awt.image.renderable.*; -import java.awt.geom.*; -import java.awt.font.*; - -/** - * This graphics is used when nothing should really be drawn on the screen - */ - -public class ADummyGraphics2D extends Graphics2D { - - private int x; - private int y; - private int width; - private int height; - - public ADummyGraphics2D() {} - - public Rectangle getClipBounds() { - return new Rectangle(x, y, width, height); - } - - public void setClip(int x, int y, int width, int height) { - this.x=x; - this.y=y; - this.width=width; - this.height=height; - } - - public void transform(AffineTransform z) {} - - public void fill(Shape z) {} - - public void draw(Shape z) {} - - public void drawImage(BufferedImage a, BufferedImageOp b, int c, int z) {} - - public boolean drawImage(Image a, AffineTransform b, ImageObserver z) { - return false; - } - - public void drawRenderedImage(RenderedImage a, AffineTransform z) {} - - public void drawRenderableImage(RenderableImage a, AffineTransform z) {} - - public void drawString(java.text.AttributedCharacterIterator a, float b, float z) {} - - public void drawString(String a, int b, int z) {} - - public void drawString(String a, float b, float z) {} - - public void drawString(java.text.AttributedCharacterIterator a, int b, int z) {} - - public void drawGlyphVector(GlyphVector a, float b, float z) {} - - public boolean hit(Rectangle a, Shape b, boolean z) { - return false; - } - - public GraphicsConfiguration getDeviceConfiguration() { - return null; - } - - public void setComposite(Composite z) {} - - public void setPaint(Paint z) {} - - public void setStroke(Stroke z) {} - - public void setRenderingHint(RenderingHints.Key a, Object z) {} - - public Object getRenderingHint(RenderingHints.Key z) { - return null; - } - - public void setRenderingHints(java.util.Map z) {} - - public void addRenderingHints(java.util.Map z) {} - - public RenderingHints getRenderingHints() { - return null; - } - - public void translate(double a, double z) {} - - public void translate(int a, int z) {} - - public void rotate(double a, double b, double z) {} - - public void rotate(double z) {} - - public void scale(double a, double z) {} - - public void shear(double a, double z) {} - - public void setTransform(AffineTransform z) {} - - public AffineTransform getTransform() { - return null; - } - - public Paint getPaint() { - return null; - } - - public Composite getComposite() { - return null; - } - - public void setBackground(Color z) {} - - public Color getBackground() { - return null; - } - - public Stroke getStroke() { - return null; - } - - public void clip(Shape z) {} - - public FontRenderContext getFontRenderContext() { - return null; - } - - public void setColor(Color z) {} - - public Graphics create() { - return null; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, int f, int g, int h, int i, ImageObserver z) { - return false; - } - - public boolean drawImage(Image a, int b, int c, ImageObserver z) { - return false; - } - - public boolean drawImage(Image a, int b, int c, Color d, ImageObserver z) { - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, Color f, ImageObserver z) { - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, ImageObserver z) { - return false; - } - - public boolean drawImage(Image a, int b, int c, int d, int e, int f, int g, int h, int i, Color j, ImageObserver z) { - return false; - } - - public Color getColor() { - return null; - } - - public void fillRect(int a, int b, int c, int z) {} - - public void setPaintMode() {} - - public void setXORMode(Color z) {} - - public Font getFont() { - return null; - } - - public void setFont(Font z) {} - - public FontMetrics getFontMetrics(Font z) { - return null; - } - - // public Rectangle getClipBounds () { return null;} - public void clipRect(int a, int b, int c, int z) {} - - // public void setClip(int a,int b,int c,int z) { } - public void setClip(Shape z) {} - - public Shape getClip() { - return null; - } - - public void copyArea(int a, int b, int c, int d, int e, int z) {} - - public void drawLine(int a, int b, int c, int z) {} - - public void clearRect(int a, int b, int c, int z) {} - - public void drawRoundRect(int a, int b, int c, int d, int e, int z) {} - - public void fillRoundRect(int a, int b, int c, int d, int e, int z) {} - - public void drawOval(int a, int b, int c, int z) {} - - public void fillOval(int a, int b, int c, int z) {} - - public void drawArc(int a, int b, int c, int d, int e, int z) {} - - public void fillArc(int a, int b, int c, int d, int e, int z) {} - - public void drawPolyline(int[] a, int[] b, int z) {} - - public void drawPolygon(int[] a, int[] b, int z) {} - - public void fillPolygon(int[] a, int[] b, int z) {} - - public void dispose() {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AGLPixelGraphics.java b/graphics/AtlantisJava/src/atlantis/graphics/AGLPixelGraphics.java deleted file mode 100644 index 299aa5fd26b0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AGLPixelGraphics.java +++ /dev/null @@ -1,47 +0,0 @@ -package atlantis.graphics; - -import atlantis.canvas.AGLGraphics; - -/* - * This class subclasses APixelGraphics to allow some optimisations slightly - * higher up the graphics chain in cases where OpenGL renders faster in - * certain ways - * - * @author Adam Davison - */ - -public class AGLPixelGraphics extends APixelGraphics { - - protected AGLGraphics m_glg; - - public AGLPixelGraphics(AGLGraphics g) { - super(g); - m_glg = g; - } - - @Override - public void fillPolygon(double[] h, double[] v, int numPoints) { - /*int type = getContainmentType(h, v, numPoints, POLYGON); - if (type == FULLY_INSIDE || type == INTERSECTS) { - if (type == INTERSECTS) { - ACoord clipped = clipper.clipPolygon(h, v, numPoints); - h = clipped.hv[0][0]; - v = clipped.hv[1][0]; - numPoints = h.length; - }*/ - /*int[] hInt = new int[numPoints]; - int[] vInt = new int[numPoints]; - for (int i = 0; i < numPoints; ++i) { - hInt[i] = (int) h[i]; - vInt[i] = (int) v[i]; - }*/ - updateColor(); - m_glg.fillPolygon(h, v, numPoints); - //g.drawPolygon(hInt, vInt, numPoints); - /*} else if (type == CONTAINS) { - Rectangle bounds = g.getClipBounds(); - updateColor(); - g.fillRect((int) Math.rint(bounds.getX()), (int) Math.rint(bounds.getY()), (int) Math.rint(bounds.getWidth()), (int) Math.rint(bounds.getHeight())); - }*/ - } -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AGraphics.java b/graphics/AtlantisJava/src/atlantis/graphics/AGraphics.java deleted file mode 100755 index 225eb608a887..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AGraphics.java +++ /dev/null @@ -1,407 +0,0 @@ -package atlantis.graphics; - -import atlantis.canvas.AGLGraphics; -import java.awt.Color; -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.Image; -import java.awt.Stroke; - -import atlantis.event.AData; -import atlantis.geometry.ADetectors; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; -import atlantis.utils.APolygon; - -import org.sourceforge.jlibeps.epsgraphics.*; -import org.apache.batik.svggen.SVGGraphics2D; - -/** - * Normally all drawing should be done on an AGraphics. For special uses, e.g. - * Braintest projections, standard Java Graphics may be used. To allow this, - * projections are always given a graphics which they must convert to an - * AGraphics with AGraphics.makeAGraphics. AGraphics provides picking of drawn - * objects. - */ - -public abstract class AGraphics -{ - protected Graphics2D g; - AClipper clipper = null; - Color currentColor; - Color lastDrawnColor = null; - Rectangle bounds; - int lineWidth = 1; - int size; - int symbol; - ADrawParameters lastDrawParameters = null; - - static AData currentData = null; - static ADetectors currentDetector = null; - static int currentIndex; - - public static final int SYMBOL_FILLED_BOX = 0; - public static final int SYMBOL_HORIZONTAL_LINE = 1; - public static final int SYMBOL_VERTICAL_LINE = 2; - public static final int SYMBOL_PLUS = 3; - public static final int SYMBOL_FILLED_CIRCLE = 4; - - public static final int DRAW = 0; - public static final int FILL = 1; - - protected static final int NUM_LAYERS = 2; - - protected static final int FULLY_INSIDE = 0; - protected static final int FULLY_OUTSIDE = 1; - protected static final int CONTAINS = 2; - protected static final int INTERSECTS = 3; - - protected static final int POLYGON = 0; - protected static final int POLYLINE = 1; - - AGraphics(Graphics g) - { - this.g = (Graphics2D) g; - if (g.getClipBounds() != null) - clipper = new AClipper(g.getClipBounds()); - currentColor = g.getColor(); - } - - public Graphics2D getGraphics2D() - { - return g; - } - - public static AGraphics makeAGraphics(Graphics g) - { - if (g instanceof EpsGraphics2D || g instanceof APickingGraphics2D || - g instanceof ADrawnGraphics2D || g instanceof SVGGraphics2D) - { - return new AVectorGraphics(g); - } - else if (g instanceof AGLGraphics) - { - return new AGLPixelGraphics((AGLGraphics)g); - } - else - { - return new APixelGraphics(g); - } - } - - public static void setCurrentDataAndIndex(AData current, int index) - { - currentData = current; - currentIndex = index; - } - - public static void setCurrentDetectorAndIndex(ADetectors current, int index) - { - currentDetector = current; - currentIndex = index; - } - - public static void clearCurrentDetectorAndIndex() - { - currentDetector = null; - currentIndex = -1; - } - - public static void clearCurrentDataAndIndex() - { - currentData = null; - currentIndex = -1; - } - - public void setFont(Font f) - { - g.setFont(f); - } - - public void setStroke(Stroke s) - { - g.setStroke(s); - } - - public void setColor(Color c) - { - currentColor = c; - } - - public void updateColor() - { - if (currentColor != lastDrawnColor) - { - g.setColor(currentColor); - lastDrawnColor = currentColor; - } - } - - public abstract void setLineWidth(int lineWidth); - - public void updateDrawParameters(ADrawParameters dp) - { - if (dp != lastDrawParameters) - { - setColor(dp.color); - lineWidth = Math.max(dp.lineWidth, 1) + 2 * dp.frameWidth; - setLineWidth(lineWidth); - size = dp.size + 2 * dp.frameWidth; - symbol = dp.symbol; - lastDrawParameters = dp; - } - } - - public void drawString(String str, double x, double y) - { - g.drawString(str, (int) x, (int) y); - } - - public void draw(Shape s) - { - g.draw(s); - } - - public void drawPoint(AData detector, int index, double h, double v, int pixelsH, int pixelsV) - { - setCurrentDataAndIndex(detector, index); - drawPoint(h, v, pixelsH, pixelsV); - clearCurrentDataAndIndex(); - } - - public void drawPoint(double h, double v, int pixelsH, int pixelsV) - { - if (clipper.isPointWithin(h, v)) - fillRect(h, v, pixelsH, pixelsV); - } - - public void drawSymbol(double h, double v) - { - if (clipper.isPointWithin(h, v)) - { - if (symbol == SYMBOL_FILLED_BOX) - { - fillRect(h, v, size, size); - } - else if (symbol == SYMBOL_HORIZONTAL_LINE) - { - fillRect(h, v, size, lineWidth); - } - else if (symbol == SYMBOL_VERTICAL_LINE) - { - fillRect(h, v, lineWidth, size); - } - else if (symbol == SYMBOL_PLUS) - { - fillRect(h, v, size, lineWidth); - fillRect(h, v, lineWidth, size); - } - else if (symbol == SYMBOL_FILLED_CIRCLE) - { - fillOval(h, v, size, size); - } - } - } - - //Draw an image at postion x,y of this graphics context - //Introduced for FishEye symbol showing FishEye status - public void drawImage(Image img, int x, int y){ - //Draw the image on screen - g.drawImage(img,x,y,null); - } - - - public void fillPolygon(AData detector, int index, double[] h, double[] v, int numPoints) - { - setCurrentDataAndIndex(detector, index); - fillPolygon(h, v, numPoints); - clearCurrentDataAndIndex(); - } - - public void fillRect(int h, int v, int width, int height) - { - updateColor(); - g.fillRect(h, v, width, height); - } - - public void fillOval(int h, int v, int width, int height) - { - g.fillOval(h, v, width, height); - } - - public abstract void drawPolyline(double[] h, double[] v, int numPoints); - - public abstract void drawDottedPolyline(double[] h, double[] v, int numPoints); - - public abstract void drawSmoothPolyline(double[] h0, double[] v0, int numPoints0); - - public abstract void drawLine(double h0, double v0, double h1, double v1); - - public abstract void drawPolygon(double[] h, double[] v, int numPoints); - - protected abstract void fillRect(double h, double v, int width, int height); - - protected abstract void fillOval(double h, double v, int width, int height); - - public void fillPolygon(ADetectors det, int index, double[] h, double[] v, int numPoints) - { - setCurrentDetectorAndIndex(det, index); - fillPolygon(h, v, numPoints); - clearCurrentDetectorAndIndex(); - } - - public void fillPolygon(double[] h, double[] v, int numPoints, float alpha) - { - Composite originalComposite = g.getComposite(); - int ACtype = AlphaComposite.SRC_OVER; - g.setComposite(AlphaComposite.getInstance(ACtype, alpha)); - fillPolygon(h, v, numPoints); - g.setComposite(originalComposite); - } - - protected int getContainmentType(double[] h, double[] v, int numPoints, int shape) - { - int within = clipper.fastWithin(h, v, numPoints); - if (within == AClipper.NONE_WITHIN) - return FULLY_OUTSIDE; - if (within == AClipper.ALL_WITHIN) - return FULLY_INSIDE; - for (int i = 0; i < numPoints - 1; ++i) - if (clipper.isLineWithin(h[i], v[i], h[i + 1], v[i + 1])) - return INTERSECTS; - if (shape == POLYGON && numPoints > 1) - if (clipper.isLineWithin(h[numPoints - 1], v[numPoints - 1], h[0], v[0])) - return INTERSECTS; - Rectangle bounds = g.getClipBounds(); - double xCentreClipped = bounds.getX() + bounds.getWidth() / 2.; - double yCentreClipped = bounds.getY() + bounds.getHeight() / 2.; - if (isPointInside(h, v, numPoints, xCentreClipped, yCentreClipped)) - return CONTAINS; - return FULLY_OUTSIDE; - } - - public abstract void fillPolygon(double[] h, double[] v, int numPoints); - - public void drawPolygon(APolygon p) - { - drawPolygon(p.getX(), p.getY(), p.nrNodes()); - } - - public static boolean isPointInside(double[] h, double[] v, int numPoints, double hP, double vP) - { - double[] a = new double[numPoints]; - - for (int i = 0; i < numPoints; ++i) - { - a[i] = Math.atan2(v[i] - vP, h[i] - hP); - } - double[] d = new double[numPoints]; - - for (int i = 0; i < numPoints; ++i) - { - if (i < numPoints - 1) - d[i] = a[i + 1] - a[i]; - else - d[i] = a[0] - a[i]; - if (d[i] > Math.PI) - d[i] -= 2. * Math.PI; - else if (d[i] < -Math.PI) - d[i] += 2. * Math.PI; - } - double sum = 0.; - - for (int i = 0; i < numPoints; ++i) - { - sum += d[i]; - } - if (Math.abs(sum) > Math.PI) - return true; - else - return false; - } - - public void draw(ACoord display) - { - ADrawable source = display.source; - - if (source == null) - return; - ADrawParameters adp = source.getDrawParameters(0, 0); - - if (adp.getForceSymbols() == true || adp.getMinSize() > 0) - display.toSymbols(adp.getForceSymbols(), adp.getMinSize()); - Color[] colorMap = AColorMap.getColors(); - int[] index = display.index; - int[] c = source.getColor(index); - int[] t = source.getType(index); - double[][] h = display.hv[0]; - double[][] v = display.hv[1]; - - for (int layer = 0; layer < NUM_LAYERS; layer++) - { - for (int type = 0; type < source.getNumTypes(); type++) - { - ADrawParameters dp = source.getDrawParameters(layer, type); - int drawType = dp.getDrawOrFill(); - updateDrawParameters(dp); - if (dp.draw) - { - for (int j = 0; j < t.length; j++) - { - if (t[j] == type) - { - if (layer == NUM_LAYERS - 1) - { - setColor(colorMap[c[j]]); - if (source instanceof AData) - setCurrentDataAndIndex((AData) source, index[j]); - } - if (display.type == ACoord.SYMBOLS) - drawSymbol(h[0][j], v[0][j]); - else if (display.type == ACoord.POLYGONS && h[j].length == 1) - drawSymbol(h[j][0], v[j][0]); - else if (display.type == ACoord.LINES) - drawLine(h[0][j], v[0][j], h[1][j], v[1][j]); - else if (display.type == ACoord.POLYLINES) - drawPolyline(h[j], v[j], h[j].length); - else if (display.type == ACoord.SMOOTH_POLYLINES) - drawSmoothPolyline(h[j], v[j], h[j].length); - else if (display.type == ACoord.DOTTED_POLYGONS) - drawDottedPolyline(h[j], v[j], h[j].length); - else if (display.type == ACoord.POLYGONS) - { - if (drawType == DRAW) - drawPolygon(h[j], v[j], h[j].length); - else if (drawType == FILL) - fillPolygon(h[j], v[j], h[j].length); - } - else if (display.type == ACoord.TRANSPARENT_POLYGONS) - { - if(g instanceof EpsGraphics2D){ - // setComposite is currently unsupported for EpsGraphics2D - // for now just draw as an outline, so we can still see - // jets and the underlying objects - drawPolygon(h[j], v[j], h[j].length); - } - else { - Composite originalComposite = g.getComposite(); - int ACtype = AlphaComposite.SRC_OVER; - g.setComposite(AlphaComposite.getInstance(ACtype, (float)APar.instance().get("Jet","Alpha").getD())); - fillPolygon(h[j], v[j], h[j].length); - g.setComposite(originalComposite); - } - } - clearCurrentDataAndIndex(); - } - } - } - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AIcon.java b/graphics/AtlantisJava/src/atlantis/graphics/AIcon.java deleted file mode 100644 index a2add88871f9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AIcon.java +++ /dev/null @@ -1,28 +0,0 @@ -package atlantis.graphics; - -import java.awt.Frame; - -import javax.swing.ImageIcon; - -import atlantis.globals.AGlobals; -import atlantis.utils.AUtilities; - -/** - * - * @author waugh - * - */ -public class AIcon { - /** Set icon image for a frame to be the Atlantis icon. */ - public static void setIconImage(Frame f) - { - String path = AGlobals.instance().getHomeDirectory() + "img" + - System.getProperty("file.separator") + - "atlantis_icon.gif"; - ImageIcon ii = AUtilities.getFileAsImageIcon(path); - f.setIconImage(ii.getImage()); - - } // setIconImage() ----------------------------------------------------- - - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ALegoDraw.java b/graphics/AtlantisJava/src/atlantis/graphics/ALegoDraw.java deleted file mode 100755 index ab9137ea80ad..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ALegoDraw.java +++ /dev/null @@ -1,1150 +0,0 @@ -package atlantis.graphics; -import java.awt.BasicStroke; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Stroke; -import java.awt.geom.Point2D; - -import atlantis.canvas.AWindow; -import atlantis.event.AEvent; -import atlantis.data.ALVL1ResultData; -import atlantis.data.ATriggerInfoData; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.AEnumeratorParameter; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.utils.AMath; - -public class ALegoDraw -{ - - protected static APar parameterStore = APar.instance(); - - private static int legendHeight=0; - private static int lineHeight = 17;//seperation of lines - //colors to use in legend - - //width of lines in lego grid - private static float legoGridWidth = 1.6f; - private static float legoTowersWidth = 1.0f; - - private static Color textColor=Color.white, - backgroundColor=AColorMap.getColors()[parameterStore.get("Color", "BkgFill").getI()], - borderColor=Color.lightGray; - - public static Color getBackgroundColor() - { - return backgroundColor; - } - - public static void fillBackground(AWindow window, AGraphics ag) - { - - backgroundColor = AColorMap.getColors()[parameterStore.get("Color", "BkgFill").getI()]; // inherit bkg colour from main background colour - - ag.setColor(backgroundColor); - ag.fillRect(0, 0, window.getWidth(), window.getHeight()); - } - - public static void drawLegend(AWindow window, AGraphics ag, AEvent event, double met, double maxEt, double AODmaxEt) - { - //colors to use - textColor=Color.black; - if(backgroundColor.getBlue()+backgroundColor.getGreen()+backgroundColor.getRed() < 400) - textColor=Color.white; - //change the font size (reset at end) - float originalFontSize= ag.g.getFont().getSize2D(); - float newFontSize= (float) 0.9*originalFontSize; - ag.g.setFont(ag.g.getFont().deriveFont(newFontSize)); - //variables to locate where to write/draw - legendHeight = lineHeight+2;//distance from top of legend - int indent = window.getWidth()- 200;//distance from left of legend - int pos = 90;//distance to start writing second half of line - //loop over Lvl1resultdata collections - String[] colLvl1=event.getActiveCollectionNames("LVL1Result"); - ALVL1ResultData lvl1ResultData[] = null; - if(colLvl1.length>0) - lvl1ResultData = new ALVL1ResultData[colLvl1.length]; - for(int i=0;i<colLvl1.length;i++) - { - lvl1ResultData[i] = (ALVL1ResultData) event.get(colLvl1[i]); - } - ATriggerInfoData triggerInfoData = event.getTriggerInfoData(); - - //check window is large enough - if(window.getWidth()<250 || window.getHeight()<250) - { - drawWindowTooSmall(window, ag, indent); - //reset font size - ag.g.setFont(ag.g.getFont().deriveFont(originalFontSize)); - return; - } - - //draw main legend - if(parameterStore.get("LegoPlot", "MainLegend").getStatus()) - drawLegendMain(window, ag, event, met, maxEt, AODmaxEt, lvl1ResultData, indent, pos); - //draw lvl1 sumEt and missEt - if(parameterStore.get("LegoPlot", "L1EtLegend").getStatus()) - drawLegendL1ET(ag, lvl1ResultData, triggerInfoData, indent); - //draw the item list - boolean drawLegend=false; - if(!drawLegend && parameterStore.get("LegoPlot", "L1Items").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "L2Items").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "EFItems").getStatus())drawLegend=true; - if(drawLegend) - drawLegendItems(window, ag, lvl1ResultData, indent); - - //reset font size - ag.g.setFont(ag.g.getFont().deriveFont(originalFontSize)); - } - - public static void drawWindowTooSmall(AWindow window, AGraphics ag, int indent) - { - - //change indent to make legend smaller - indent+=135; - // create legend boarder with two concentric rectangles - // outer rectangle: - ag.setColor(borderColor); - ag.fillRect(indent - 4, 5, 65, 3*lineHeight); - // inner rectangle: - ag.setColor(backgroundColor); - ag.fillRect(indent - 4 + 2, 7, 65 - 4, 3*lineHeight-4); - ag.setColor(textColor); - ag.updateColor(); - - ag.drawString("Window", indent + 6, legendHeight); - legendHeight += lineHeight; - ag.drawString("too small", indent + 6, legendHeight); - legendHeight += lineHeight; - ag.drawString("for legend", indent + 6, legendHeight); - legendHeight += lineHeight; - } - - public static void drawLegendMain(AWindow window, AGraphics ag, AEvent event, double met, double maxEt, double AODmaxEt, ALVL1ResultData lvl1ResultData[], int indent, int pos) - { - - // create legend boarder with two concentric rectangles - // outer rectangle: - ag.setColor(borderColor); - //ag.fillRect(/*indent - 4*/window.getWidth()/1.8, /*5*/window.getHeight()/3.0, (int)(1-(window.getWidth()/1.8)), (int)(1-(window.getHeight()/3.0))); - ag.fillRect(indent - 4, 5, 200, 105); - - // inner rectangle: - ag.setColor(backgroundColor); - ag.fillRect(indent - 4 + 2, 7, 200 - 4, 105 - 4); - //ag.fillRect(/*indent - 4*/window.getWidth()/1.8 +2, /*5*/window.getHeight()/3.0 +2, (int)(1-(window.getWidth()/1.8))+4, (int)(1-(window.getHeight()/3.0))+4); - - ag.setColor(textColor); - ag.updateColor(); - - //First item Missing ET (may remove met box from plot later) - if(met!=0) - drawLegendPartMain1(ag, event, met, indent, pos); - else - ag.drawString("No Missing Et", indent + 6, legendHeight); - legendHeight += lineHeight; - ag.setColor(textColor); - ag.updateColor(); - - //Second item colourby - //make sure there are cells by checking the maximum energy - //and that there have been colours added to the colourset - //(can have maxE and no colours when scaling to AOD) - if(maxEt!=0 && AProjectionLegoPlot.colorset.size()>0) - drawLegendMain2(ag, indent, pos); - else - { - ag.setColor(textColor); - ag.updateColor(); - ag.drawString("No cells", indent + 6, legendHeight); - } - legendHeight += lineHeight; - ag.setColor(textColor); - ag.updateColor(); - - //Third item maximum height of towers - if(maxEt!=0 || AODmaxEt!=0) - drawLegendMain3(ag, maxEt, AODmaxEt, indent, pos); - else - { - ag.drawString("No towers", indent + 6, legendHeight); - legendHeight += lineHeight; - } - legendHeight += lineHeight; - ag.setColor(textColor); - ag.updateColor(); - - //Fourth item lvl1 result - if (lvl1ResultData == null){ - ag.drawString("Trigger Decision N/A", indent+6, legendHeight); - legendHeight+=lineHeight;//move by a line to keep same spacing - }else if (lvl1ResultData.length>1){ - ag.drawString(">1 LVL1Result collections selected", indent+6, legendHeight); - legendHeight+=lineHeight; - ag.drawString("View on event properties or choose 1", indent+6, legendHeight); - }else{ - drawLegendMain4(ag, lvl1ResultData[0], indent, pos); - } - legendHeight+=lineHeight; - ag.setColor(textColor); - ag.updateColor(); - } - - public static void drawLegendPartMain1(AGraphics ag, AEvent event, double met, int indent, int pos) - { - ag.setColor(AProjectionLegoPlot.defaultColorMap[parameterStore.get("ETMis", "Constant").getI()]); - //draw dashed line - ag.fillRect(indent + 6, 11, 5, 3); - ag.fillRect(indent + 6 + 10, 11, 5, 3); - ag.fillRect(indent + 6 + 20, 11, 5, 3); - ag.fillRect(indent + 6 + 30, 11, 5, 3); - ag.setColor(textColor); - ag.updateColor(); - String[] names = event.getActiveCollectionNames("ETMis"); - if(names.length==1) - ag.drawString("Missing ET= " + Math.round(met) + " GeV" , indent + 0.6*pos, legendHeight); - else - ag.drawString("Max Missing ET= " + Math.round(met) + " GeV" , indent + 0.6*pos, legendHeight); - } - - public static void drawLegendMain2(AGraphics ag, int indent, int pos) - { - String modeName; - if (AProjectionLegoPlot.mode == 0) - { - modeName="LAr"; - } - else if (AProjectionLegoPlot.mode == 1) - { - modeName="LVL1TriggerTower"; - } - else - { - modeName="LVL1JetElement"; - } - AEnumeratorParameter param = (AEnumeratorParameter) parameterStore.get(modeName, "ColorFunction"); - String colorFunction = param.getText(param.getI()); - ag.drawString(colorFunction + " (1-" + AProjectionLegoPlot.colorset.size() + ")",indent + pos, legendHeight); - int barwidth = 6, barheight = 6; - if(AProjectionLegoPlot.getDrawEMHAD()) - { - if(AProjectionLegoPlot.colorset.size()==2) - { - //for Em/had option should only have 2 colors - ag.setColor(AProjectionLegoPlot.defaultColorMap[AProjectionLegoPlot.colorEM]); - ag.fillRect(indent + barwidth * 2, 28, barwidth * 2, barheight); - ag.setColor(AProjectionLegoPlot.defaultColorMap[AProjectionLegoPlot.colorHad]); - ag.fillRect(indent + 2 * barwidth* 2, 28, barwidth * 2, barheight); - } - else - { - //if more colors then lists must be in use - int c = 0; - ++c; - ag.setColor(AProjectionLegoPlot.defaultColorMap[AProjectionLegoPlot.colorEM]); - ag.fillRect(indent + c * barwidth, 28, barwidth, barheight); - ++c; - ag.setColor(AProjectionLegoPlot.defaultColorMap[AProjectionLegoPlot.colorHad]); - ag.fillRect(indent + c * barwidth, 28, barwidth, barheight); - for (int i = 0; i <AProjectionLegoPlot.caloColorMap.length ; i++) - { - if (!AProjectionLegoPlot.colorset.contains(new Integer(i))) - continue; - if(i==AProjectionLegoPlot.colorEM || i==AProjectionLegoPlot.colorHad) - continue; - ++c; - ag.setColor(AProjectionLegoPlot.caloColorMap[i]); - ag.fillRect(indent + c * barwidth, 28, barwidth, barheight); - } - } - } - else - { - //if not Em/Had then loop over colors - int c = 0; - barwidth = 90/AProjectionLegoPlot.caloColorMap.length; - for (int i = 0; i <AProjectionLegoPlot.caloColorMap.length ; i++) - { - if (!AProjectionLegoPlot.colorset.contains(new Integer(i))) - continue; - ++c; - ag.setColor(AProjectionLegoPlot.caloColorMap[i]); - ag.fillRect(indent + c * barwidth, 28, barwidth, barheight); - } - } - } - - public static void drawLegendMain3(AGraphics ag, double maxEt, double AODmaxEt, int indent, int pos) - { - ag.drawString( "Height of tallest tower:", indent + 6, legendHeight); - //next line has the values - legendHeight += lineHeight; - if (parameterStore.get("LegoPlot", "ETAxisHeight").getD() > 0.0) - ag.drawString("User selection: " + Math.round(maxEt) + " GeV ", indent +6, legendHeight); - else if (parameterStore.get("LegoPlot", "ScaleToAOD").getStatus()) - ag.drawString("Scale to AOD: " + Math.round(maxEt) + " GeV ", indent +6, legendHeight); - else - { - if(maxEt!=0) - { - ag.drawString("Cells: " + Math.round(maxEt) + " GeV ", indent +6, legendHeight); - if(AODmaxEt!=0) - ag.drawString("AOD: " + Math.round(AODmaxEt) + " GeV ", indent + pos, legendHeight); - } - else - ag.drawString("AOD: " + Math.round(AODmaxEt) + " GeV ", indent + 6, legendHeight); - } - } - - public static void drawLegendMain4(AGraphics ag, ALVL1ResultData lvl1ResultData, int indent, int pos) - { - ag.drawString("Trigger Decision:", indent +6, legendHeight); - legendHeight+=lineHeight; - String[] trigRes={"NA","NA","NA"}; - int[] temp=new int[3]; - temp[0]=lvl1ResultData.getPassedL1(0); - temp[1]=lvl1ResultData.getPassedL2(0); - temp[2]=lvl1ResultData.getPassedEF(0); - for(int i=0;i<3;i++) - { - switch(temp[i]) - { - case -1: - trigRes[i]="N/C"; - break; - case 0: - trigRes[i]="failed"; - break; - case 1: - trigRes[i]="passed"; - break; - default: - trigRes[i]="NA"; - } - } - ag.drawString("L1:" + trigRes[0] +" L2:" + trigRes[1]+" EF:" + trigRes[2], indent +6, legendHeight); - } - - public static void drawLegendL1ET(AGraphics ag, ALVL1ResultData lvl1ResultData[], ATriggerInfoData triggerInfoData, int indent) - { - // create legend boarder with two concentric rectangles - // outer rectangle: - ag.setColor(borderColor); - ag.fillRect(indent - 4, legendHeight, 200, (int) (lineHeight*1.5)); - // inner rectangle: - ag.setColor(backgroundColor); - ag.fillRect(indent - 4 + 2, legendHeight + 2, 200 - 4, (int) (lineHeight*1.5 - 4)); - ag.setColor(textColor); - ag.updateColor(); - legendHeight+=lineHeight; - //if no trigger info and "All" Lvlresult selected display warning - if(triggerInfoData==null && lvl1ResultData!=null && lvl1ResultData.length>1){ - ag.drawString(">1 LVL1Result collections selected", indent+6, legendHeight); - legendHeight+=lineHeight; - return; - } - - float LVL1EtMiss=-1.0f,LVL1SumEt=-1.0f; - if(triggerInfoData!=null) - { - LVL1EtMiss=triggerInfoData.getEnergyEtMiss(0); - LVL1SumEt=triggerInfoData.getEnergySumEt(0); - } - else if(lvl1ResultData!=null && lvl1ResultData.length==1) - { - LVL1EtMiss=lvl1ResultData[0].getEnergyEtMiss(0); - LVL1SumEt=lvl1ResultData[0].getEnergySumEt(0); - } - String LVL1EtMissOutput,LVL1SumEtOutput; - if(LVL1EtMiss>0) - LVL1EtMissOutput=""+LVL1EtMiss; - else - LVL1EtMissOutput="N/A"; - if(LVL1SumEt>0) - LVL1SumEtOutput=""+LVL1SumEt; - else - LVL1SumEtOutput="N/A"; - - ag.drawString("L1-EtMiss: "+LVL1EtMissOutput+" L1-SumEt: "+LVL1SumEtOutput, indent , legendHeight); - legendHeight+=lineHeight; - } - - public static void drawLegendItems(AWindow window, AGraphics ag, ALVL1ResultData lvl1ResultData[], int indent) - { - // ag.setStroke(new BasicStroke(legoTowersWidth)); returning to original line width - - if(lvl1ResultData!=null && lvl1ResultData.length>1){ - //create legend boarder with two concentric rectangles - //outer rectangle: - ag.setColor(borderColor); - ag.fillRect(indent - 4, legendHeight, 200, (int) (lineHeight*5.5)); - // inner rectangle: - ag.setColor(backgroundColor); - ag.fillRect(indent - 4 + 2, legendHeight + 2, 200 - 4, (int) (lineHeight*5.5 - 4)); - ag.setColor(textColor); - ag.updateColor(); - legendHeight+=lineHeight; - ag.drawString(">1 LVL1Result collections selected", indent+6, legendHeight); - legendHeight+=lineHeight; - ag.drawString("Either select 1 LVL1Result collection", indent+6, legendHeight); - legendHeight+=lineHeight; - ag.drawString("from: Calo->LVL1Result", indent+6, legendHeight); - legendHeight+=lineHeight; - ag.drawString("or to see all items select:", indent+6, legendHeight); - legendHeight+=lineHeight; - ag.drawString("file->Event Properties", indent+6, legendHeight); - legendHeight+=lineHeight; - return; - } - - //output message to say no lvl1result - if(lvl1ResultData==null){ - ag.setColor(borderColor); - ag.updateColor(); - ag.fillRect(window.getWidth() -200 - 4, legendHeight+4, 200, (int) Math.round(1.5*lineHeight)); - ag.setColor(backgroundColor); - ag.updateColor(); - ag.fillRect(window.getWidth() -200 - 4 + 2, legendHeight +4+ 2, 200 - 4, (int) Math.round(1.5*lineHeight)-4); - ag.setColor(textColor); - ag.updateColor(); - legendHeight+=lineHeight; - ag.drawString("No LVL1Result collection in event", window.getWidth() - 200 + 2, legendHeight+4); - return; - } - - int origlineHeight =lineHeight;//save lineheight to be reset at end of function - lineHeight*=0.8;//for item list bunch together - int startrowHeight =legendHeight; - - //now output items in columns in new legend box - - //lists to draw - int dolist1 = parameterStore.get("LegoPlot", "L1Items").getStatus()?1:0; - int dolist2 = parameterStore.get("LegoPlot", "L2Items").getStatus()?1:0; - int dolist3 = parameterStore.get("LegoPlot", "EFItems").getStatus()?1:0; - - //number of items per column and number of columns - int maxItems=(int) Math.round(((0.8*window.getHeight()-legendHeight)/lineHeight )-0.5); - int columnWidth= 72; - int maxColumns=(int) Math.floor((0.9*window.getWidth())/columnWidth); - - // store items and headers - String[][] items=new String[3][]; - if(dolist1>0) items[0]=newList("---L1 items---", lvl1ResultData[0].getCtpItemListSplit(0,true)); - if(dolist2>0) items[1]=newList("---L2 items---", lvl1ResultData[0].getitemListL2Split(0,true)); - if(dolist3>0) items[2]=newList("---EF items---", lvl1ResultData[0].getitemListEFSplit(0,true)); - - //number of columns for each list - int[] num=new int[3]; - num[0]= (dolist1==0)? 0 : (int) Math.ceil(items[0].length/((double)maxItems)); - num[1]= (dolist2==0)? 0 : (int) Math.ceil(items[1].length/((double)maxItems)); - num[2]= (dolist3==0)? 0 : (int) Math.ceil(items[2].length/((double)maxItems)); - - boolean doWarning=false;//for printing see event properties message - //calculate total number of columns - if(num[0]+num[1]+num[2]>maxColumns){ - //too many in list so each can just have the average - int av = (int) Math.floor(maxColumns/((double)(dolist1+dolist2+dolist3))); - if(dolist1>0) num[0]=av; - if(dolist2>0) num[1]=av; - if(dolist3>0) num[2]=av; - doWarning=true; - } - int noOfColumns=num[0]+num[1]+num[2]; - - //now store each column into an array [column][row] - String[][] list=new String[noOfColumns][maxItems]; - int list_counter=0; - //loop over each list - for(int i=0; i<3; i++){ - //loop over items in a list - int item_counter=0; - //only loop over columns can display for each list - for(int j=0; j<num[i]; j++){ - //loop over all items for a column - for(int k=0; k<maxItems; k++){ - if(item_counter<items[i].length) - list[list_counter][k]=items[i][item_counter]; - else - list[list_counter][k]=""; - item_counter++; - } - //next column - list_counter++; - } - } - - // makes outer and inner borders of table: - ag.setColor(borderColor); - ag.fillRect(window.getWidth() -noOfColumns*columnWidth - 4, legendHeight, (int)(noOfColumns*columnWidth), (int) Math.round((maxItems+0.5)*lineHeight)); - - //draw columns - for(int i=0; i<noOfColumns; i++){ - //draw column to draw onto - legendHeight=startrowHeight; - ag.setColor(backgroundColor); - ag.updateColor(); - ag.fillRect(window.getWidth() -(noOfColumns-i)*columnWidth - 4 + 2, legendHeight + 2, columnWidth - 4, (int) Math.round((maxItems+0.5)*lineHeight)-4); - ag.setColor(textColor); - ag.updateColor(); - //draw item - for(int j=0; j<maxItems; j++){ - legendHeight+=lineHeight; - ag.drawString(list[i][j], window.getWidth() - (noOfColumns-i)*columnWidth + 2, legendHeight); - } - } - - //output warning if too many items - if(doWarning){ - legendHeight+=lineHeight; - //draw under columns - ag.setColor(borderColor); - ag.updateColor(); - ag.fillRect(window.getWidth() -90 - 4, legendHeight+4, 90, (int) Math.round(2.5*lineHeight)); - ag.setColor(backgroundColor); - ag.updateColor(); - ag.fillRect(window.getWidth() -90 - 4 + 2, legendHeight +4+ 2, 90 - 4, (int) Math.round(2.5*lineHeight)-4); - ag.setColor(textColor); - ag.updateColor(); - legendHeight+=lineHeight; - ag.drawString(" more items in", window.getWidth() - 90 + 2, legendHeight+4); - legendHeight+=lineHeight; - ag.drawString("event properties", window.getWidth() - 90 + 2, legendHeight+4); - } - lineHeight=origlineHeight;//reset line height - } - - static String[] newList(String first, String[] rest){ - int counter = 2;//1 for title 1 for N/A if needed - if(rest!=null) counter+=rest.length-1;//now don't need N/A - - String[] editedList=new String[counter]; - editedList[0]=first; - if(rest!=null){ - System.arraycopy(rest, 0, editedList, 1, rest.length); - }else{ - editedList[1]="N/A"; - } - - return editedList; - } - - static void drawline(AWindow window, AGraphics ag, Point2D.Double from, Point2D.Double to) - { - from=window.calculateDisplay(from); - to=window.calculateDisplay(to); - ag.drawLine( from.x,from.y,to.x,to.y); - } - - static void drawline(AWindow window, AGraphics ag, double fromX, double fromY, double toX, double toY) - { - Point2D.Double from= new Point2D.Double(fromX,fromY); - Point2D.Double to= new Point2D.Double(toX,toY); - drawline(window, ag, from, to); - } - - //converts from energy into eta coords - static void drawline(AWindow window, AGraphics ag, double fromX, double fromY, double toX, double toY, int etAxisMaximum) - { - fromY=-5-(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(fromY/etAxisMaximum)*0.9; - toY=-5-(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(toY/etAxisMaximum)*0.9; - Point2D.Double from= new Point2D.Double(fromX,fromY); - Point2D.Double to= new Point2D.Double(toX,toY); - drawline(window, ag, from, to); - } - - static void drawstring(AWindow window, AGraphics ag, String str, double hereX, double hereY) - { - Point2D.Double here= new Point2D.Double(hereX,hereY); - here=window.calculateDisplay(here); - ag.drawString(str, here.x,here.y); - } - - //converts from energy into eta coords - static void drawstring(AWindow window, AGraphics ag, String str, double hereX, double hereY, int etAxisMaximum) - { - hereY=-5-(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(hereY/etAxisMaximum)*0.9; - Point2D.Double here= new Point2D.Double(hereX,hereY); - here=window.calculateDisplay(here); - ag.drawString(str, here.x,here.y); - } - - public static void drawGrid(AWindow window, AGraphics ag, double maxEt) - { - ag.setStroke(new BasicStroke(legoGridWidth)); //setting grid line width - int width = window.getSize().width; - int dpi = 72; - // Set a scaling font size with window width (sqrt prevents text from going too small in the small window) - int newFontSize = (int) Math.round(35.0 * Math.sqrt(width) / (double) dpi); - - //change the font size (reset at end) - float originalFontSize= ag.g.getFont().getSize2D(); - Font f = new Font("SansSerif", Font.PLAIN, newFontSize); - ag.setFont(f); - - // Draw the scale and labels on Et axis - ag.setColor(Color.darkGray); - if(backgroundColor.getBlue()+backgroundColor.getGreen()+backgroundColor.getRed() < 400) - ag.setColor(Color.lightGray); - ag.updateColor(); - int etAxisMaximum=(int) maxEt;//convert to int for use later on - int etAxisScale = 10;//seperation of ticks in ET - if (AProjectionLegoPlot.defaultScale ==1 ) - { - etAxisScale=1; - } - else if (maxEt > 10.0) - { - //set scale to 0.1 of nearest hundred to maximum - etAxisScale = 10 * ((int) Math.ceil(maxEt / 100.0)); - } - else if (maxEt == 10.0) - { - etAxisScale = 5; - } - else if (maxEt < 10.0) - { - etAxisScale = 2; - } - double lowPhi=-360*AProjectionLegoPlot.getxz(window.getIndex()); - //lowPhi = 1; - int ticksizex = 10; - double ticksizey = 0.5; - //Draw Et axis - drawline(window,ag,lowPhi,0.0,lowPhi,etAxisMaximum, etAxisMaximum); - //Draw the ticks - for(int s = etAxisMaximum-etAxisScale; s >= 0.0; s-=etAxisScale) - { - drawline(window,ag,lowPhi, s,lowPhi + ticksizex,s, etAxisMaximum); - if (AProjectionLegoPlot.defaultScale ==1 ) - drawstring(window,ag,"10^" + Integer.toString( s + AProjectionLegoPlot.minimumofLogScale ),lowPhi + 2*ticksizex,s,etAxisMaximum); - else - drawstring(window,ag,Integer.toString( s ),lowPhi + 2*ticksizex,s,etAxisMaximum); - } - // Draw the title on Et axis - drawline(window,ag,lowPhi, etAxisMaximum,lowPhi + ticksizex,etAxisMaximum, etAxisMaximum); - if (AProjectionLegoPlot.defaultScale ==1) - drawstring(window,ag,"10^" + Integer.toString( etAxisMaximum + AProjectionLegoPlot.minimumofLogScale) + " ET (GeV)",lowPhi + 2*ticksizex,etAxisMaximum,etAxisMaximum); - else if(AProjectionLegoPlot.defaultScale ==2) - drawstring(window,ag,Integer.toString( etAxisMaximum ) + " ET (GeV)^1/2",lowPhi + 2*ticksizex,etAxisMaximum,etAxisMaximum); - else - drawstring(window,ag,Integer.toString( etAxisMaximum ) + " ET (GeV)",lowPhi + 2*ticksizex,etAxisMaximum,etAxisMaximum); - - // Draw a grid - int t = -1; - for (double p = 0.; p <= 1.; p += 1. / 8.) - { - // parallel to the right side - drawline(window, ag, 360*p+lowPhi, -5.0, 360*p, 5.0); - if (++t % 2 == 0) - { - // a tick - drawline(window,ag,360*p,5.0,360*p,5.0+ticksizey); - String str = new Integer(((int) (360. * p))).toString(); - drawstring(window,ag,str,360*p-7.0,5.0+2.0*Math.sqrt(ticksizey)); - } - } - //Draw the title on phi axis - drawstring(window,ag,AMath.PHI,0.6*360,5.0+3.0*Math.sqrt(ticksizey)); - - for (double e = 0.; e <= 1.; e += 1. / 10.) - { - // parallel to the bottom - drawline(window, ag, lowPhi*(1-e), 10.0*e-5.0, 360.0+lowPhi*(1-e), 10.0*e-5.0); - // a tick - drawline(window, ag, lowPhi*(1-e), 10.0*e-5.0, lowPhi*(1-e), 10.0*e-5.0+ticksizey); - String str = new Integer((int)Math.round(e*10)-5).toString(); - if (AProjectionLegoPlot.reverse) - str = new Integer((int)Math.round(-e*10)+5).toString(); - drawstring(window,ag,str,lowPhi*(1-e)-20, 10.0*e-5.0+3.0*Math.sqrt(ticksizey)); - } - //Draw the title on eta axis - drawstring(window,ag,AMath.ETA,0.5*lowPhi-30,+5.0*Math.sqrt(ticksizey)); - - //reset font size - ag.g.setFont(ag.g.getFont().deriveFont(originalFontSize)); - } - - public static void drawJet(double et, double eta, double phi, Color color, AWindow window, AGraphics ag, double radius) - { - ag.setStroke(new BasicStroke(legoTowersWidth)); //Setting Lego Towers Width - double x = (phi*360)/ AMath.TWO_PI;//x is phi converted from rad to deg - int numPoints = 128;//points around circumference of circle - double[][] hj = new double[2][numPoints]; - double[][] vj = new double[2][numPoints]; - int phiwrap = 0; - double old_jetx = -1; - int[] pj = new int[2]; - pj[0] = pj[1] = 0; - for (int p = 0; p < numPoints; p++) - { - //add on fraction of diameter of circle in phi - double jetx = x + radius*36 * Math.cos(AMath.TWO_PI * p / (numPoints - 1)); - if (jetx < 0) - jetx += 360; - if(jetx >= 360) - jetx -= 360; - if(old_jetx > 0) - { - double jetx_diff = Math.abs(jetx - old_jetx); - if(jetx_diff > 360 / 2) - phiwrap = (phiwrap + 1) % 2; - } - // remember the last jetx, to see if we've wrapped around next time - old_jetx = jetx; - double y = eta; - if (AProjectionLegoPlot.reverse) - y = -y; - //add on fraction of diameter of circle in eta - double jety = y + radius * Math.sin(AMath.TWO_PI * p / (numPoints - 1)); - jetx=AProjectionLegoPlot.adjustPhi(window,jetx,jety);//move phi value due to slant of eta axis - Point2D.Double[] corners=window.getUserCorners(); - if(jetx < corners[0].x || jetx > corners[1].x || jety < corners[1].y || jety > corners[2].y) - continue;//exits loop if not in limits of drawn plot - hj[phiwrap][pj[phiwrap]] = jetx; - vj[phiwrap][pj[phiwrap]] = jety; - ++pj[phiwrap]; - } - - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<pj[0]; i++) - { - p = window.calculateDisplay(hj[0][i],vj[0][i]); - hj[0][i]=p.x; - vj[0][i]=p.y; - } - p.x=0; p.y=0; - for(int i=0; i<pj[1]; i++) - { - p = window.calculateDisplay(hj[1][i],vj[1][i]); - hj[1][i]=p.x; - vj[1][i]=p.y; - } - Stroke origStroke = ag.getGraphics2D().getStroke(); - boolean drawFrames = AColorMap.drawFrames(); - //if drawing frames this part draws the frame otherwise draws the fill - ag.setStroke(new BasicStroke(3)); - if(drawFrames) - ag.setColor(AProjectionLegoPlot.defaultColorMap[AColorMap.BK]); - else - ag.setColor(color); - - if (pj[0] > 2) - { - ag.drawPolygon(hj[0], vj[0], pj[0]); - } - if (pj[1] > 2) - { - ag.drawPolygon(hj[1], vj[1], pj[1]); - } - - //this part will draw the fill color inside the frame if is not black otherwise already drawn - if(drawFrames && !color.equals(AProjectionLegoPlot.defaultColorMap[AColorMap.BK])) - { - ag.setStroke(new BasicStroke(1)); - ag.setColor(color); - - if (pj[0] > 2) - { - ag.drawPolygon(hj[0], vj[0], pj[0]); - } - if (pj[1] > 2) - { - ag.drawPolygon(hj[1], vj[1], pj[1]); - } - } - - //reset stroke - ag.setStroke(origStroke); - } - - public static void drawJetText(double et, double eta, double phi, Color color, AWindow window, AGraphics ag, double radius) - { - double x = (phi*360)/ AMath.TWO_PI;//x is phi converted from rad to deg - int numPoints = 128;//points around circumference of circle - double[][] hj = new double[2][numPoints]; - double[][] vj = new double[2][numPoints]; - int phiwrap = 0; - double old_jetx = -1; - int[] pj = new int[2]; - pj[0] = pj[1] = 0; - for (int p = 0; p < numPoints; p++) - { - //add on fraction of diameter of circle in phi - double jetx = x + radius*36 * Math.cos(AMath.TWO_PI * p / (numPoints - 1)); - if (jetx < 0) - jetx += 360; - if(jetx >= 360) - jetx -= 360; - if(old_jetx > 0) - { - double jetx_diff = Math.abs(jetx - old_jetx); - if(jetx_diff > 360 / 2) - phiwrap = (phiwrap + 1) % 2; - } - // remember the last jetx, to see if we've wrapped around next time - old_jetx = jetx; - double y = eta; - if (AProjectionLegoPlot.reverse) - y = -y; - //add on fraction of diameter of circle in eta - double jety = y + radius * Math.sin(AMath.TWO_PI * p / (numPoints - 1)); - jetx=AProjectionLegoPlot.adjustPhi(window,jetx,jety);//move phi value due to slant of eta axis - Point2D.Double[] corners=window.getUserCorners(); - if(jetx < corners[0].x || jetx > corners[1].x || jety < corners[1].y || jety > corners[2].y) - continue;//exits loop if not in limits of drawn plot - hj[phiwrap][pj[phiwrap]] = jetx; - vj[phiwrap][pj[phiwrap]] = jety; - ++pj[phiwrap]; - } - - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<pj[0]; i++) - { - p = window.calculateDisplay(hj[0][i],vj[0][i]); - hj[0][i]=p.x; - vj[0][i]=p.y; - } - - //draw the jet et as text - String s = Double.toString(et); - int dot = s.indexOf('.'); - String ss = s.substring(0, dot+0); - float originalFontSize= ag.g.getFont().getSize2D(); - float newFontSize= (float) 25.; - ag.g.setFont(ag.g.getFont().deriveFont(newFontSize)); - ag.g.setColor(color); - ag.drawString(" "+ss, hj[0][0], vj[0][0]); - ag.g.setFont(ag.g.getFont().deriveFont(originalFontSize)); - } - - public static void drawMissEt(AWindow window, AGraphics ag, int phi, double pt, Color color, double maxEt) - { - //color - ag.setColor(color); - - drawBox(window, ag, phi, 0, AProjectionLegoPlot.DRAW_MET, 0, pt, maxEt, 0.5); - - double phibinsize=360.0/AProjectionLegoPlot.nPhiCells; - double[] h = new double[4]; - double[] v = new double[4]; - double etaChange = 0.5; - for(double etaStart=-5.0; etaStart<5.0; etaStart+=2*etaChange) - { - v[0] = etaStart; - h[0] = AProjectionLegoPlot.adjustPhi(window,phi*phibinsize,v[0]); - v[1] = v[0]+etaChange; - h[1] = AProjectionLegoPlot.adjustPhi(window,phi*phibinsize,v[1]); - v[2] = v[1]; - h[2] = h[1] + phibinsize; - v[3] = v[0]; - h[3] = h[0] + phibinsize; - //convert to window coords - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<4; i++) - { - p = window.calculateDisplay(h[i],v[i]); - h[i]=p.x; - v[i]=p.y; - } - //draw - ag.fillPolygon(h, v, 4); - } - } - - public static void drawBox(AWindow window, AGraphics ag, int phi, int eta, int colouring, double et1, double et2, double maxEt, double boxsize) - { - Color drawingColor; - //if colouring < 0 ->AOD object, otherwise its cells - switch(colouring){ - case AProjectionLegoPlot.DRAW_MET: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("ETMis", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_MUON: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("Muon", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_ELECTRON: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("Electron", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_PHOTON: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("Photon", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_CLUSTER: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("Cluster", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_COMPOSITEPARTICLE: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("CompositeParticle", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_BJET: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("BJet", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_TAUJET: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("TauJet", "Constant").getI()]; - break; - case AProjectionLegoPlot.DRAW_JET: - drawingColor=AProjectionLegoPlot.defaultColorMap[parameterStore.get("Jet", "Constant").getI()]; - break; - default: drawingColor=AProjectionLegoPlot.caloColorMap[colouring]; - } - - int object = -colouring;//should be positive for "objects" and negative for calo cells - - //now check transparency option - //result is transparent if colouring is < 0 - switch(parameterStore.get("LegoPlot", "TowerOutlines").getI()){ - //AOD: colouring is already correct - case 0: break; - //cells: reverse so now AOD solid - case 1: colouring*=-1; break; - //both - case 2: colouring=-1; break; - //neither - case 3: colouring=1; break; - } - double phibinsize=360.0/AProjectionLegoPlot.nPhiCells; - double etabinsize=10.0/AProjectionLegoPlot.nEtaCells; - double x = phi*phibinsize;//x is real phi position - double y = eta*etabinsize-5;//y is real eta position - if (object>0) {phibinsize=360./64.; etabinsize=10./100.;} - double x1 = AProjectionLegoPlot.adjustPhi(window,x, y);//x1 is real phi position - double x2 = AProjectionLegoPlot.adjustPhi(window,x, y-etabinsize);//shifted x due to eta bin size - double[][] h = new double[3][4]; - double[][] v = new double[3][4]; - //adjust the values of the energies - et1=(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(et1/maxEt)*0.9; - et2=et1+(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(et2/maxEt)*0.9; - - double phishift = boxsize * (phibinsize/2); //to center towers with recpt eta-phi coordinates x1 and x2 - double etashift = boxsize * ((etabinsize)/2); - - //front - h[0][0] = x1 - phishift; - v[0][0] = y-et1 - etashift; // (bottom front) - h[0][1] = x1 - phishift; - v[0][1] = y-et2 - etashift; - h[0][2] = x1 + phishift; - v[0][2] = y-et2 - etashift; - h[0][3] = x1 + phishift; - v[0][3] = y-et1 - etashift; - //top - h[1][0] = x2 - phishift; - v[1][0] = y-et2- etashift-etashift; //SHIFT to make top squared - h[1][1] = x1 - phishift; - v[1][1] = y-et2 - etashift; - h[1][2] = x1 + phishift; - v[1][2] = y-et2 - etashift; - h[1][3] = x2 + phishift; - v[1][3] = y-et2- etashift-etashift; //SHIFT to make top squared - //side - h[2][0] = x2 - (phishift); - v[2][0] = y-(et2)- etashift -etashift; // top back SHIFT to make top squared - h[2][1] = x1 - phishift; - v[2][1] = y-et2 - etashift; // top front - h[2][2] = x1 - phishift; - v[2][2] = y-(et1) - etashift; // bottom front - h[2][3] = x2 - (phishift); - v[2][3] = y-et1 -(etashift); // bottom back - - - //convert to window coords - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<4; i++) - { - p = window.calculateDisplay(h[0][i],v[0][i]); - h[0][i]=p.x; - v[0][i]=p.y; - p.x=0; p.y=0; - p = window.calculateDisplay(h[1][i],v[1][i]); - h[1][i]=p.x; - v[1][i]=p.y; - p.x=0; p.y=0; - p = window.calculateDisplay(h[2][i],v[2][i]); - h[2][i]=p.x; - v[2][i]=p.y; - } - - //draw sides - ag.setColor(drawingColor); - if (colouring>=0) - ag.fillPolygon(h[2], v[2], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[2], v[2], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); //f specifies transparency fraction - } - else - ag.fillPolygon(h[2], v[2], 4, 0.8f); //f specifies transparency fraction - - //colour front - ag.setColor(drawingColor); - //draw front - if (colouring>=0) - ag.fillPolygon(h[0], v[0], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[0], v[0], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); //f specifies transparency fraction - } - else - ag.fillPolygon(h[0], v[0], 4, 0.8f); //f specifies transparency fraction - - //colour top - Color ddc = drawingColor.darker().darker(); - ag.setColor(new Color(ddc.getRed(),ddc.getGreen(),ddc.getBlue())); - //draw top - if (colouring>=0) - ag.fillPolygon(h[1], v[1], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[1], v[1], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); //f specifies transparency fraction - } - else - ag.fillPolygon(h[1], v[1], 4, 0.8f); //f specifies transparency fraction - - } - - //draw box method that can be used when not all the towers of certain object have assigned the same colour - the parameter color specifies the i color component - public static void drawBox(AWindow window, AGraphics ag, int phi, int eta, int colouring, Color color, double et1, double et2, double maxEt, double boxsize) - { - Color drawingColor; - switch(colouring){ - case AProjectionLegoPlot.DRAW_MET: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_MUON: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_ELECTRON: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_PHOTON: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_CLUSTER: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_COMPOSITEPARTICLE: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_BJET: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_TAUJET: - drawingColor= color; - break; - case AProjectionLegoPlot.DRAW_JET: - drawingColor= color; - break; - default: drawingColor=AProjectionLegoPlot.caloColorMap[colouring]; - } - - int object = -colouring;//should be positive for "objects" and negative for calo cells - - //now check transparency option - //result is transparent if colouring is < 0 - switch(parameterStore.get("LegoPlot", "TowerOutlines").getI()){ - //AOD: colouring is already correct - case 0: break; - //cells: reverse so now AOD solid - case 1: colouring*=-1; break; - //both - case 2: colouring=-1; break; - //neither - case 3: colouring=1; break; - } - double phibinsize=360.0/AProjectionLegoPlot.nPhiCells; - double etabinsize=10.0/AProjectionLegoPlot.nEtaCells; - double x = phi*phibinsize;//x is real phi position - double y = eta*etabinsize-5;//y is real eta position - if (object>0) {phibinsize=360./64.; etabinsize=10./100.;} - double x1 = AProjectionLegoPlot.adjustPhi(window,x, y);//x1 is real phi position - double x2 = AProjectionLegoPlot.adjustPhi(window,x, y-etabinsize);//shifted x due to eta bin size - double[][] h = new double[3][4]; - double[][] v = new double[3][4]; - //adjust the values of the energies - et1=(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(et1/maxEt)*0.9; - et2=et1+(1-AProjectionLegoPlot.getyz(window.getIndex()))*50*(et2/maxEt)*0.9; - - double phishift = boxsize * (phibinsize/2); //to center towers with recpt eta-phi coordinates x1 and x2 - double etashift = boxsize * ((etabinsize)/2); - - //front - h[0][0] = x1 - phishift; - v[0][0] = y-et1 - etashift; // (bottom front) - h[0][1] = x1 - phishift; - v[0][1] = y-et2 - etashift; - h[0][2] = x1 + phishift; - v[0][2] = y-et2 - etashift; - h[0][3] = x1 + phishift; - v[0][3] = y-et1 - etashift; - //top - h[1][0] = x2 - phishift; - v[1][0] = y-et2- etashift-etashift; //SHIFT to make top squared - h[1][1] = x1 - phishift; - v[1][1] = y-et2 - etashift; - h[1][2] = x1 + phishift; - v[1][2] = y-et2 - etashift; - h[1][3] = x2 + phishift; - v[1][3] = y-et2- etashift-etashift; //SHIFT to make top squared - //side - h[2][0] = x2 - (phishift); - v[2][0] = y-(et2)- etashift -etashift; // top back SHIFT to make top squared - h[2][1] = x1 - phishift; - v[2][1] = y-et2 - etashift; // top front - h[2][2] = x1 - phishift; - v[2][2] = y-(et1) - etashift; // bottom front - h[2][3] = x2 - (phishift); - v[2][3] = y-et1 -(etashift); // bottom back - - //convert to window coords - Point2D.Double p= new Point2D.Double(0,0); - for(int i=0; i<4; i++) - { - p = window.calculateDisplay(h[0][i],v[0][i]); - h[0][i]=p.x; - v[0][i]=p.y; - p.x=0; p.y=0; - p = window.calculateDisplay(h[1][i],v[1][i]); - h[1][i]=p.x; - v[1][i]=p.y; - p.x=0; p.y=0; - p = window.calculateDisplay(h[2][i],v[2][i]); - h[2][i]=p.x; - v[2][i]=p.y; - } - - //draw sides - ag.setColor(drawingColor); - if (colouring>=0) - ag.fillPolygon(h[2], v[2], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[2], v[2], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); - }else if (colouring == AProjectionLegoPlot.DRAW_BJET) { - ag.fillPolygon(h[2], v[2], 4, 0.4f); - }else - ag.fillPolygon(h[2], v[2], 4, 0.8f); //f specifies transparency fraction - - //colour front - ag.setColor(drawingColor); - //draw front - if (colouring>=0) - ag.fillPolygon(h[0], v[0], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[0], v[0], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); - }else if(colouring == AProjectionLegoPlot.DRAW_BJET) { - ag.fillPolygon(h[0], v[0], 4, 0.4f); - }else - ag.fillPolygon(h[0], v[0], 4, 0.8f); //f specifies transparency fraction - - //colour top - Color ddc = drawingColor.darker().darker(); - ag.setColor(new Color(ddc.getRed(),ddc.getGreen(),ddc.getBlue())); - //draw top - if (colouring>=0) - ag.fillPolygon(h[1], v[1], 4); - else if(colouring == AProjectionLegoPlot.DRAW_JET){ - ag.fillPolygon(h[1], v[1], 4, (float)APar.instance().get("Jet","AlphaJets").getD()); //f specifies transparency fraction - }else if(colouring == AProjectionLegoPlot.DRAW_BJET) { - ag.fillPolygon(h[1], v[1], 4, 0.4f); //f specifies transparency fraction - } - else - ag.fillPolygon(h[1], v[1], 4, 0.8f); //f specifies transparency fraction - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/graphics/APickingGraphics2D.java b/graphics/AtlantisJava/src/atlantis/graphics/APickingGraphics2D.java deleted file mode 100755 index 9757b84ccdd1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/APickingGraphics2D.java +++ /dev/null @@ -1,432 +0,0 @@ -package atlantis.graphics; - -import java.awt.Graphics; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Shape; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.PathIterator; -import java.util.ArrayList; - -import javax.swing.JPopupMenu; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.event.AData; -import atlantis.data.ATrackData; -import atlantis.data.ATrackResidualData; -import atlantis.list.AList; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjectionTrackResidual; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.ALogger; - -/** - * A very limited PostScript graphics context for output of Atlantis functions - * Any call to a none implemented will throw an exception - */ - -public class APickingGraphics2D extends ATemplateGraphics2D -{ - private static ALogger logger = ALogger.getLogger(APickingGraphics2D.class); - - public final static int PICK_HITS_AND_TRACKS = 0; - public final static int PICK_DETECTORS = 1; - public final static int MOVE = 2; - public final static int PICK_RESIDUAL = 3; - - public static int mode; - - static AData pickedData = null; - static ATrackResidualData pickedResidual = null; - static ArrayList pickedDetectors; - static int pickedIndex; - - public static Point pickedPoint; - static double minDist; - public static double pickedH; - public static double pickedV; - - private static JPopupMenu residualPopupMenu; - private static final String SHOW_RESIDUALS_X = "Show Residual X"; - private static final String SHOW_PULLS_X = "Show Pull X"; - - static - { - residualPopupMenu = new JPopupMenu(); - ActionListener residualPopupActionListener = - new APickingGraphics2D.ResidualPopupMenuActionListener(); - residualPopupMenu.add(SHOW_RESIDUALS_X).addActionListener(residualPopupActionListener); - residualPopupMenu.add(SHOW_PULLS_X).addActionListener(residualPopupActionListener); - } - - static class ResidualPopupMenuActionListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - - // Use window "B" to show track residual - String residualWindowName = "B"; - if(ACanvas.getCanvas().isValidWindowName(residualWindowName)) - { - AWindow residualWindow = ACanvas.getCanvas().getWindow(residualWindowName); - AProjectionTrackResidual residualProj = - (AProjectionTrackResidual) AProjectionsManager.getProjection("TrackResidual"); - if (action.equals(SHOW_RESIDUALS_X)) - residualProj.setResidualType(ATrackResidualData.RESIDUAL_X); - else if (action.equals(SHOW_PULLS_X)) - residualProj.setResidualType(ATrackResidualData.PULL_X); - - // when this action is activated, the pickedData must be a track - ATrackData trackData = (ATrackData) pickedData; - residualProj.setResidual(trackData.getTrackResidual(pickedIndex)); - ACanvas.getCanvas().moveToFrontWindow(residualWindowName); - residualWindow.setProjection(residualProj); - } - else - AOutput.append("\nWindow " + residualWindowName + " is not available in current layout" - + "\n", ALogInterface.WARNING); - } - } - - public APickingGraphics2D(Rectangle bounds, int m, Point p) - { - super(bounds); - mode = m; - pickedPoint = p; - minDist = 10000000.; - if (mode != MOVE) - { - pickedData = null; - pickedIndex = -1; - } - if (pickedDetectors == null) - { - pickedDetectors = new ArrayList(); - } - else - { - pickedDetectors.clear(); - } - } - - APickingGraphics2D(APickingGraphics2D a) - { - super(a); - } - - public Graphics create() - { - return new APickingGraphics2D(this); - } - - public void drawLine(double h0, double v0, double h1, double v1) - { - if (mode == PICK_DETECTORS) - return; - if (AGraphics.currentData == null) - return; - if (mode == MOVE && - !(AGraphics.currentData == pickedData && AGraphics.currentIndex == pickedIndex)) - return; - double hPicked = pickedPoint.getX(); - double vPicked = pickedPoint.getY(); - // treat first two endpoints - double delH = h0 - hPicked; - double delV = v0 - vPicked; - double dist = delH * delH + delV * delV; - - if (dist < minDist) - { - minDist = dist; - setPicked(h0, v0); - } - delH = h1 - hPicked; - delV = v1 - vPicked; - dist = delH * delH + delV * delV; - if (dist < minDist) - { - minDist = dist; - setPicked(h1, v1); - } - // now treat point within line being closest - double h10 = h1 - h0; - double v10 = v1 - v0; - double hp0 = hPicked - h0; - double vp0 = vPicked - v0; - double size = h10 * h10 + v10 * v10; - - if (size > 0.0) - { - double u = (h10 * hp0 + v10 * vp0) / size; - - if (u > 0. && u < 1.) - { - double hClosest = h0 + u * h10; - double vClosest = v0 + u * v10; - - delH = hClosest - hPicked; - delV = vClosest - vPicked; - dist = delH * delH + delV * delV; - if (dist < minDist) - { - minDist = dist; - setPicked(hClosest, vClosest); - } - } - } - } - - public void fillRect(int h, int v, int width, int height) - { - if (mode == PICK_DETECTORS && AGraphics.currentDetector != null) - { - // Collect the different detector names. - String info = AGraphics.currentDetector.getInfo(AGraphics.currentIndex); - if (!pickedDetectors.contains(info)) - { - pickedDetectors.add(info); - } - } - double dh = width / 2.; - double dv = height / 2.; - drawLine(h - dh, v - dv, h + dh, v - dv); - drawLine(h + dh, v - dv, h + dh, v + dv); - drawLine(h + dh, v + dv, h - dh, v + dv); - drawLine(h - dh, v + dv, h - dh, v - dv); - } - - public void draw(Shape s) - { - PathIterator path = s.getPathIterator(null); - double[] coords = new double[6]; - double h0 = 0.; - double v0 = 0.; - double h1 = 0.; - double v1 = 0.; - double hInit = 0.; - double vInit = 0.; - while (!path.isDone()) - { - int segType = path.currentSegment(coords); - - switch (segType) - { - case PathIterator.SEG_MOVETO: - h0 = coords[0]; - v0 = coords[1]; - hInit = h0; - vInit = v0; - break; - - case PathIterator.SEG_LINETO: - case PathIterator.SEG_CUBICTO: - h1 = coords[0]; - v1 = coords[1]; - drawLine(h0, v0, h1, v1); - h0 = h1; - v0 = v1; - break; - - case PathIterator.SEG_CLOSE: - drawLine(h0, v0, hInit, vInit); - break; - - default: - logger.error(" Error unknown segment type"); - break; - } - path.next(); - } - } - - public void fill(Shape s) - { - if (mode == PICK_DETECTORS && AGraphics.currentDetector != null) - { - double[][] hv = getPolygon(s); - if (AGraphics.isPointInside(hv[0], hv[1], hv[0].length, pickedPoint.getX(), pickedPoint.getY())) - { - // Collect the different detector names. - String info = AGraphics.currentDetector.getInfo(AGraphics.currentIndex); - if (!pickedDetectors.contains(info)) - { - pickedDetectors.add(info); - } - } - } - else - { - draw(s); - } - } - - public double[][] getPolygon(Shape s) - { - double[] coords = new double[6]; - - int numPoints = 0; - PathIterator path = s.getPathIterator(null); - while (!path.isDone()) - { - int segType = path.currentSegment(coords); - switch (segType) - { - case PathIterator.SEG_MOVETO: - numPoints++; - break; - - case PathIterator.SEG_LINETO: - case PathIterator.SEG_CUBICTO: - numPoints++; - break; - - case PathIterator.SEG_CLOSE: - // numPoints++; - break; - - default: - break; - } - path.next(); - } - double[][] hv = new double[2][numPoints]; - numPoints = 0; - path = s.getPathIterator(null); - while (!path.isDone()) - { - int segType = path.currentSegment(coords); - - switch (segType) - { - case PathIterator.SEG_MOVETO: - hv[0][numPoints] = coords[0]; - hv[1][numPoints] = coords[1]; - numPoints++; - break; - - case PathIterator.SEG_LINETO: - case PathIterator.SEG_CUBICTO: - hv[0][numPoints] = coords[0]; - hv[1][numPoints] = coords[1]; - numPoints++; - break; - - case PathIterator.SEG_CLOSE: - // drawLine(h0,v0,hInit,vInit); - break; - - default: - logger.error(" Error unknown segment type"); - break; - } - path.next(); - } - return hv; - } - - private static void setPicked(double h, double v) - { - pickedData = AGraphics.currentData; - pickedIndex = AGraphics.currentIndex; - pickedH = h; - pickedV = v; - } - - public static AData getPickedData() - { - return pickedData; - - } // getPickedData() - - public static ATrackResidualData getPickedResidual() - { - return pickedResidual; - } - - public static int getPickedH() - { - return (int) Math.rint(pickedH); - } - - public static int getPickedV() - { - return (int) Math.rint(pickedV); - } - - public static AList getPickedHit() - { - if (pickedData != null) - return new AList(pickedData, pickedIndex); - else - return null; - } - - public static Integer getPickedHitIndex() - { - if (pickedData != null) - { - return new Integer(pickedIndex); - } - else - { - return null; - } - } - - public static void setPicked(AData data, int index) - { - pickedData = data; - pickedIndex = index; - } - - public static void setPicked(ATrackResidualData data) - { - pickedResidual = data; - } - - public static void printPicked() - { - if(mode == APickingGraphics2D.PICK_RESIDUAL) - { - AOutput.alwaysAppend("\n\n" + pickedResidual.getHitInfo(), ALogInterface.PICK); - mode = APickingGraphics2D.PICK_HITS_AND_TRACKS; - } - else - { - if (pickedData != null) - { - AOutput.alwaysAppend("\n\n" + pickedData.getHitInfo(pickedIndex), ALogInterface.PICK); - } - else if (pickedDetectors != null && pickedDetectors.size() > 0) - { - AOutput.alwaysAppend("\n\nYou are inside:\n", ALogInterface.PICK); - for (int i = 0; i < pickedDetectors.size(); i++) - { - AOutput.alwaysAppend(" " + pickedDetectors.get(i) + "\n", ALogInterface.PICK); - } - } - } - } - - /** - * Method is called after pick+n (navigate = show data associations) - */ - public static void navigatePicked() - { - if(pickedData != null) - { - String navigateInfo = pickedData.navigate(pickedIndex); - AOutput.alwaysAppend("\n" + navigateInfo + "\n", ALogInterface.PICK); - } - } - - public static void showTrackResiduals(AWindow window, int x, int y) - { - APickingGraphics2D.residualPopupMenu.show(window, x, y); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/APixelGraphics.java b/graphics/AtlantisJava/src/atlantis/graphics/APixelGraphics.java deleted file mode 100755 index 44a5136d93c1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/APixelGraphics.java +++ /dev/null @@ -1,304 +0,0 @@ -package atlantis.graphics; - -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.geom.GeneralPath; - -/** - * This graphics is used for drawing on the screen and making pixel based - * images. In the end all drawing is done in pixels(integers). Picking is - * implemented here. Provide high quality pixel based drawing of thin frames - * around lines and areas, in the method draw. - */ -// When drawing borders could speed things up by only drawing what is needed -public class APixelGraphics extends AGraphics -{ - APixelGraphics(Graphics g) - { - super(g); - } - - public void setLineWidth(int lineWidth) - {} - - public void drawLine(double h0, double v0, double h1, double v1) - { - if (clipper.isLineWithin(h0, v0, h1, v1)) - { - double[][] hvClipped = clipper.getHV(); - double h0Clipped = hvClipped[0][0]; - double v0Clipped = hvClipped[1][0]; - double h1Clipped = hvClipped[0][1]; - double v1Clipped = hvClipped[1][1]; - if (lineWidth == 1) - { - updateColor(); - g.drawLine((int) h0Clipped, (int) v0Clipped, (int) h1Clipped, (int) v1Clipped); - } - else - { - drawThickLine(h0Clipped, v0Clipped, h1Clipped, v1Clipped); - } - } - - } // drawLine() - - private void drawThickLine(double h0, double v0, double h1, double v1) - { - // Drawing thick line this way is quicker than using setLine width - // correct for Postscipt - // pretty good for pixel device (assume java line drawing is Bresenhams - // or similar) - double h = Math.abs(h1 - h0); - double v = Math.abs(v1 - v0); - - for (int i = 0; i < lineWidth; ++i) - { - // 101/50 to avoid rounding toward 0 problem - int d = i + (101 - lineWidth) / 2 - 50; - - int h0new = (int) h0; - int v0new = (int) v0; - int h1new = (int) h1; - int v1new = (int) v1; - - if (h > v) - { - v0new += d; - v1new += d; - } - else - { - h0new += d; - h1new += d; - } - - // Caution!!! - // When point (h0, v0) or (h1, v1) is close to the border of the - // drawing area, after +/- d, the (h0new, v0new) or (h1new, v1new) - // might beyond the valid value range, which will cause an - // IndexArrayOutOfBound error thrown from g.drawLine method. - if(clipper.isLineWithin(h0new, v0new, h1new, v1new)) - { - updateColor(); - h0new = (int) clipper.getH0(); - v0new = (int) clipper.getV0(); - h1new = (int) clipper.getH1(); - v1new = (int) clipper.getV1(); - g.drawLine(h0new, v0new, h1new, v1new); - } - } - } - - public void drawSmoothLine(double h0, double v0, double ch0, double cv0, - double ch1, double cv1, double h1, double v1) - { - GeneralPath curve = new GeneralPath(); - for (int i=0; i<lineWidth; ++i) { - // 101/50 to avoid rounding toward 0 problem - int d = i + (101 - lineWidth) / 2 - 50; - float dh, dv; - - if (Math.abs(h1 - h0) > Math.abs(v1 - v0)) { - dh = 0; - dv = d; - } else { - dh = d; - dv = 0; - } - - curve.moveTo((float)h0+dh, (float)v0+dv); - curve.curveTo((float)ch0+dh, (float)cv0+dv, (float)ch1+dh, (float)cv1+dv, (float)h1+dh, (float)v1+dv); - } - updateColor(); - g.draw(curve); - } - - protected void fillRect(double h, double v, int width, int height) - { - updateColor(); - g.fillRect((int) (h - width / 2.), (int) (v - height / 2.), width, height); - } - - @Override - protected void fillOval(double h, double v, int width, int height) { - - g.fillOval((int) (h - width / 2.), (int) (v - height / 2.), width, height); - g.drawOval((int) (h - width / 2.), (int) (v - height / 2.), width, height); - } - - public void drawPolygon(double[] h, double[] v, int numPoints) - { - int type = getContainmentType(h, v, numPoints, POLYGON); - - if (type == FULLY_INSIDE || type == INTERSECTS) - { - for (int i = 0; i < numPoints - 1; ++i) - { - drawLine(h[i], v[i], h[i + 1], v[i + 1]); - } - if (numPoints > 1) - { - drawLine(h[numPoints - 1], v[numPoints - 1], h[0], v[0]); - } - } - } // drawPolygon() - - public void drawPolyline(double[] h, double[] v, int numPoints) - { - int type = getContainmentType(h, v, numPoints, POLYLINE); - if (type == FULLY_INSIDE || type == INTERSECTS) - { - // Some code here to simplify polylines by only drawing segments - // at least 1 pixel long, speeds up the ellipses for recvertices - // quite a lot since they're often very small but have thousands - // of line segments - AD - double lasth = 0.0; - double lastv = 0.0; - - for (int i = 0; i < numPoints - 1; ++i) { - if (i == 0) { - // Always draw something - lasth = h[1]; - lastv = v[1]; - drawLine(h[0], v[0], h[1], v[1]); - } - - double diffh = h[i+1] - lasth; - double diffv = v[i+1] - lastv; - - if ((diffh*diffh + diffv*diffv) > 1.0) { - drawLine(lasth, lastv, h[i + 1], v[i + 1]); - lasth = h[i+1]; - lastv = v[i+1]; - } - } - } - } // drawPolyline() - - public void drawDottedPolyline(double[] h, double[] v, int numPoints) - { - int type = getContainmentType(h, v, numPoints, POLYLINE); - if (type == FULLY_INSIDE || type == INTERSECTS) - { - for (int i = 0; i < numPoints - 1; i += 2) - drawLine(h[i], v[i], h[i + 1], v[i + 1]); - } - } // drawDottedPolyline() - - public void drawSmoothPolyline(double[] h0, double[] v0, int numPoints0) { - - // For curves having less than 3 points and for picking use the normal polyline. - if (numPoints0 < 3 || g instanceof APickingGraphics2D) { - drawPolyline(h0, v0, numPoints0); - return; - } - - int type = getContainmentType(h0, v0, numPoints0, POLYLINE); - if (type == FULLY_INSIDE || type == INTERSECTS) { - - int numPoints = 3 * numPoints0 - 2; - - // Add the control points to the array, at 1/3 and 2/3 - // between the already existing points. - float[] h = new float[numPoints]; - float[] v = new float[numPoints]; - for (int i=0; i<numPoints; i++) { - - switch (i%3) { - case 0: - // One of the fixed points. - h[i] = (float)h0[i/3]; - v[i] = (float)v0[i/3]; - break; - case 1: - // First control point. - h[i] = (float)(2./3. * h0[i/3] + 1./3. * h0[i/3+1]); - v[i] = (float)(2./3. * v0[i/3] + 1./3. * v0[i/3+1]); - break; - case 2: - // Second control point. - h[i] = (float)(1./3. * h0[i/3] + 2./3. * h0[i/3+1]); - v[i] = (float)(1./3. * v0[i/3] + 2./3. * v0[i/3+1]); - break; - } - } - - // Now we have a normal polyline (straight line segments between fixed points), - // but as a cubic Bezier curve. All we need to do to make it smooth is to move - // the control points away from the curve, in such a way that [control point 2] - - // [fixed point] - [control point 1] is a straight line for every fixed point. - // We do this by averaging the angles of the line segments on either side of a - // fixed point. - for (int i=3; i<numPoints-2; i+=3) { - double lenLeft = Math.sqrt(Math.pow(h[i]-h[i-1], 2) + Math.pow(v[i]-v[i-1], 2)); - double lenRight = Math.sqrt(Math.pow(h[i+1]-h[i], 2) + Math.pow(v[i+1]-v[i], 2)); - - // Without length we cannot define an angle, so skip the point. - if (lenLeft < 1e-6 || lenRight < 1e-6) continue; - - double phiLeft = Math.atan2(v[i]-v[i-1], h[i]-h[i-1]); - double phiRight = Math.atan2(v[i+1]-v[i], h[i+1]-h[i]); - - if (phiLeft-phiRight > Math.PI) { - phiRight += 2.*Math.PI; - } else if (phiRight-phiLeft > Math.PI) { - phiLeft += 2.*Math.PI; - } - - if (Math.abs(phiLeft-phiRight) > Math.PI/2.) { - // The line turns more than 90 degrees, this is wrong. Move the control points - // back in so they are the same as the point on the line. This disables the smooth - // curve locally, reverting to a normal connect-the-dots polyline. - h[i-1] = h[i+1] = h[i]; - v[i-1] = v[i+1] = v[i]; - } else { - // Calculate the desired angle for the tangent by weighting the angle on each side, - // the weight is inverse proportional to the distance to the next point. - double phi = (lenRight*phiLeft + lenLeft*phiRight) / (lenLeft+lenRight); - - h[i-1] = h[i] - (float)(lenLeft*Math.cos(phi)); - v[i-1] = v[i] - (float)(lenLeft*Math.sin(phi)); - h[i+1] = h[i] + (float)(lenRight*Math.cos(phi)); - v[i+1] = v[i] + (float)(lenRight*Math.sin(phi)); - } - } - - for (int i=0; i<numPoints-1; i+=3) { - drawSmoothLine(h[i], v[i], h[i+1], v[i+1], h[i+2], v[i+2], h[i+3], v[i+3]); - } - } - } - - public void fillPolygon(double[] h, double[] v, int numPoints) - { - int type = getContainmentType(h, v, numPoints, POLYGON); - if (type == FULLY_INSIDE || type == INTERSECTS) - { - if (type == INTERSECTS) - { - ACoord clipped = clipper.clipPolygon(h, v, numPoints); - h = clipped.hv[0][0]; - v = clipped.hv[1][0]; - numPoints = h.length; - } - int[] hInt = new int[numPoints]; - int[] vInt = new int[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - hInt[i] = (int) h[i]; - vInt[i] = (int) v[i]; - } - updateColor(); - g.fillPolygon(hInt, vInt, numPoints); - drawPolygon(h, v, numPoints); - } - else if (type == CONTAINS) - { - Rectangle bounds = g.getClipBounds(); - updateColor(); - g.fillRect((int) Math.rint(bounds.getX()), (int) Math.rint(bounds.getY()), (int) Math.rint(bounds.getWidth()), (int) Math.rint(bounds.getHeight())); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/ATemplateGraphics2D.java b/graphics/AtlantisJava/src/atlantis/graphics/ATemplateGraphics2D.java deleted file mode 100755 index 12dcf005ccc4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/ATemplateGraphics2D.java +++ /dev/null @@ -1,47 +0,0 @@ -package atlantis.graphics; - -import java.awt.*; - -/** - * A very limited template graphics which implements the default behaviour - * of the clip region. - */ - -public abstract class ATemplateGraphics2D extends ADummyGraphics2D { - - private Rectangle currentClip; - private Rectangle imageBounds; - - public ATemplateGraphics2D(Rectangle bounds) { - currentClip=new Rectangle(bounds); - imageBounds=new Rectangle(bounds); - } - - protected ATemplateGraphics2D(ATemplateGraphics2D parent) { - currentClip=new Rectangle(parent.currentClip); - imageBounds=new Rectangle(parent.imageBounds); - } - - public abstract Graphics create(); - - public Rectangle getClipBounds() { - return new Rectangle(currentClip); - } - - public void setClip(int x, int y, int width, int height) { - currentClip=new Rectangle(x, y, width, height); - } - - public void clipRect(int x, int y, int width, int height) { - currentClip=currentClip.intersection(new Rectangle(x, y, width, height)); - } - - public void translate(int x, int y) { - translate((double)x, (double)y); - } - - public void translate(double x, double y) { - currentClip.setLocation((int)Math.round(currentClip.x-x), (int)Math.round(currentClip.y-y)); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/AVectorGraphics.java b/graphics/AtlantisJava/src/atlantis/graphics/AVectorGraphics.java deleted file mode 100755 index 058f8c075aa0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/AVectorGraphics.java +++ /dev/null @@ -1,309 +0,0 @@ -package atlantis.graphics; - -import java.awt.*; -import java.awt.geom.Ellipse2D; -import java.awt.geom.GeneralPath; - -/** - * Used when drawing to postscript - */ -public class AVectorGraphics extends AGraphics { - - private GeneralPath path=new GeneralPath(); - - AVectorGraphics(Graphics g) { - super(g); - } - - public void setLineWidth(int lineWidth) { - setStroke(new BasicStroke(lineWidth)); - } - - public void drawLine(int h0, int v0, int h1, int v1) { - drawLine((double)h0, (double)v0, (double)h1, (double)v1); - } - - public void drawLine(double h0, double v0, double h1, double v1) { - if(clipper.isLineWithin(h0, v0, h1, v1)) { - double[][] hvClipped=clipper.getHV(); - double h0Clipped=hvClipped[0][0]; - double v0Clipped=hvClipped[1][0]; - double h1Clipped=hvClipped[0][1]; - double v1Clipped=hvClipped[1][1]; - - path.reset(); - path.moveTo((float)h0Clipped, (float)v0Clipped); - path.lineTo((float)h1Clipped, (float)v1Clipped); - updateColor(); - g.draw(path); - } - } - - protected void fillRect(double h, double v, int width, int height) { - path.reset(); - float h0=(float)h; - float v0=(float)v; - float dh=(float)(width/2.); - float dv=(float)(height/2.); - - path.moveTo(h0-dh, v0-dv); - path.lineTo(h0+dh, v0-dv); - path.lineTo(h0+dh, v0+dv); - path.lineTo(h0-dh, v0+dv); - path.closePath(); - updateColor(); - g.fill(path); - } - - protected void fillOval(double h, double v, int width, int height) { - - Ellipse2D oval = new Ellipse2D.Float((float)(h-width/2.), (float)(v-height/2.), width, height); - updateColor(); - g.fill(oval); - } - - public void drawPolygon(double[] h, double[] v, int numPoints) { - - int type=getContainmentType(h, v, numPoints, POLYGON); - if(type==FULLY_INSIDE||type==INTERSECTS) { - if(type==INTERSECTS) { - ACoord clipped=clipper.clipPolygon(h, v, numPoints); - h=clipped.hv[0][0]; - v=clipped.hv[1][0]; - numPoints=h.length; - } - - path.reset(); - for(int i=0; i<numPoints; ++i) { - if(i==0) - path.moveTo((float)h[i], (float)v[i]); - else - path.lineTo((float)h[i], (float)v[i]); - } - if(numPoints>0) { - path.closePath(); - updateColor(); - g.draw(path); - } - } - } - - public void drawPolyline(double[] h, double[] v, int numPoints) { - int type=getContainmentType(h, v, numPoints, POLYLINE); - if(type==FULLY_INSIDE||type==INTERSECTS) { - int start=0; - int end=numPoints-1; - - if(type==INTERSECTS) { - // clip polylines if there is only one interval - for(int i=0; i<numPoints-1; i++) { - if(clipper.isLineWithin(h[i], v[i], h[i+1], v[i+1])) { - start=i; - break; - } - } - for(int i=numPoints-1; i>start; i--) { - if(clipper.isLineWithin(h[i], v[i], h[i-1], v[i-1])) { - end=i; - break; - } - } - for(int i=start; i<end; i++) { - if(!clipper.isLineWithin(h[i], v[i], h[i+1], v[i+1])) { - start=0; - end=numPoints-1; - break; - } - } - } - - /* - if (type == INTERSECTS) { - ACoord clipped = clipper.clipPolygon(h, v, numPoints); - h = clipped.hv[0][0]; - v = clipped.hv[1][0]; - numPoints = h.length; - } - */ - - path.reset(); - for(int i=start; i<=end; ++i) { - if(i==start) - path.moveTo((float)h[i], (float)v[i]); - else - path.lineTo((float)h[i], (float)v[i]); - } - if(end-start>0) { - updateColor(); - g.draw(path); - } - } - } - - // very similar with drawPolyline, but draw a dotted instead - public void drawDottedPolyline(double[] h, double[] v, int numPoints) { - int type=getContainmentType(h, v, numPoints, POLYLINE); - if(type==FULLY_INSIDE||type==INTERSECTS) { - int start=0; - int end=numPoints-1; - - if(type==INTERSECTS) { - // clip polylines if there is only one interval - for(int i=0; i<numPoints-1; i++) { - if(clipper.isLineWithin(h[i], v[i], h[i+1], v[i+1])) { - start=i; - break; - } - } - for(int i=numPoints-1; i>start; i--) { - if(clipper.isLineWithin(h[i], v[i], h[i-1], v[i-1])) { - end=i; - break; - } - } - for(int i=start; i<end; i++) { - if(!clipper.isLineWithin(h[i], v[i], h[i+1], v[i+1])) { - start=0; - end=numPoints-1; - break; - } - } - } - - path.reset(); - boolean drawFlag = false; - for(int i=start; i<=end; ++i) { - if(drawFlag) - path.lineTo((float)h[i], (float)v[i]); - else - path.moveTo((float)h[i], (float)v[i]); - drawFlag = !drawFlag; - } - if(end-start>0) { - updateColor(); - g.draw(path); - } - } - - } - - public void drawSmoothPolyline(double[] h0, double[] v0, int numPoints0) { - - // For curves having less than 3 points and for picking use the normal polyline. - if (numPoints0 < 3 || g instanceof APickingGraphics2D) { - drawPolyline(h0, v0, numPoints0); - return; - } - - int type = getContainmentType(h0, v0, numPoints0, POLYLINE); - if (type == FULLY_INSIDE || type == INTERSECTS) { - - GeneralPath curve = new GeneralPath(); - int numPoints = 3 * numPoints0 - 2; - - // Add the control points to the array, at 1/3 and 2/3 - // between the already existing points. - float[] h = new float[numPoints]; - float[] v = new float[numPoints]; - for (int i=0; i<numPoints; i++) { - - switch (i%3) { - case 0: - // One of the fixed points. - h[i] = (float)h0[i/3]; - v[i] = (float)v0[i/3]; - break; - case 1: - // First control point. - h[i] = (float)(2./3. * h0[i/3] + 1./3. * h0[i/3+1]); - v[i] = (float)(2./3. * v0[i/3] + 1./3. * v0[i/3+1]); - break; - case 2: - // Second control point. - h[i] = (float)(1./3. * h0[i/3] + 2./3. * h0[i/3+1]); - v[i] = (float)(1./3. * v0[i/3] + 2./3. * v0[i/3+1]); - break; - } - } - - // Now we have a normal polyline (straight line segments between fixed points), - // but as a cubic Bezier curve. All we need to do to make it smooth is to move - // the control points away from the curve, in such a way that [control point 2] - - // [fixed point] - [control point 1] is a straight line for every fixed point. - // We do this by averaging the angles of the line segments on either side of a - // fixed point. - for (int i=3; i<numPoints-2; i+=3) { - double lenLeft = Math.sqrt(Math.pow(h[i]-h[i-1], 2) + Math.pow(v[i]-v[i-1], 2)); - double lenRight = Math.sqrt(Math.pow(h[i+1]-h[i], 2) + Math.pow(v[i+1]-v[i], 2)); - - // Without length we cannot define an angle, so skip the point. - if (lenLeft < 1e-6 || lenRight < 1e-6) continue; - - double phiLeft = Math.atan2(v[i]-v[i-1], h[i]-h[i-1]); - double phiRight = Math.atan2(v[i+1]-v[i], h[i+1]-h[i]); - - if (phiLeft-phiRight > Math.PI) { - phiRight += 2.*Math.PI; - } else if (phiRight-phiLeft > Math.PI) { - phiLeft += 2.*Math.PI; - } - - if (Math.abs(phiLeft-phiRight) > Math.PI/2.) { - // The line turns more than 90 degrees, this is wrong. Move the control points - // back in so they are the same as the point on the line. This disables the smooth - // curve locally, reverting to a normal connect-the-dots polyline. - h[i-1] = h[i+1] = h[i]; - v[i-1] = v[i+1] = v[i]; - } else { - // Calculate the desired angle for the tangent by weighting the angle on each side, - // the weight is inverse proportional to the distance to the next point. - double phi = (lenRight*phiLeft + lenLeft*phiRight) / (lenLeft+lenRight); - - h[i-1] = h[i] - (float)(lenLeft*Math.cos(phi)); - v[i-1] = v[i] - (float)(lenLeft*Math.sin(phi)); - h[i+1] = h[i] + (float)(lenRight*Math.cos(phi)); - v[i+1] = v[i] + (float)(lenRight*Math.sin(phi)); - } - } - - curve.moveTo(h[0], v[0]); - for (int i=3; i<numPoints; i+=3) { - curve.curveTo(h[i-2], v[i-2], h[i-1], v[i-1], h[i], v[i]); - } - - updateColor(); - g.draw(curve); - } - } - - public void fillPolygon(double[] h, double[] v, int numPoints) { - int type=getContainmentType(h, v, numPoints, POLYGON); - if(type==FULLY_INSIDE||type==INTERSECTS) { - if(type==INTERSECTS) { - ACoord clipped=clipper.clipPolygon(h, v, numPoints); - h=clipped.hv[0][0]; - v=clipped.hv[1][0]; - numPoints=h.length; - } - path.reset(); - - for(int i=0; i<numPoints; ++i) - if(i==0) - path.moveTo((float)h[i], (float)v[i]); - else - path.lineTo((float)h[i], (float)v[i]); - if(numPoints>0) { - path.closePath(); - updateColor(); - g.fill(path); - g.draw(path); - } - } else if(type==CONTAINS) { - Rectangle bounds=g.getClipBounds(); - updateColor(); - g.fillRect((int)Math.rint(bounds.getX()), (int)Math.rint(bounds.getY()), - (int)Math.rint(bounds.getWidth()), (int)Math.rint(bounds.getHeight())); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/colormap/AColorMap.java b/graphics/AtlantisJava/src/atlantis/graphics/colormap/AColorMap.java deleted file mode 100755 index 423a613163a3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/colormap/AColorMap.java +++ /dev/null @@ -1,365 +0,0 @@ -package atlantis.graphics.colormap; - -import java.io.File; -import java.io.InputStream; -import java.awt.Color; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.NamedNodeMap; - -import atlantis.globals.AGlobals; -import atlantis.output.AExceptionHandler; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.utils.AUtilities; -import atlantis.utils.ALogger; -import atlantis.utils.xml.AXMLErrorHandler; - - -public final class AColorMap -{ - private static ALogger logger = ALogger.getLogger(AColorMap.class); - - private static final boolean VALIDATION = true; - final public static int NO_COLOR = -1; - final public static int INVISIBLE = -2; - static final public int BG = 8; //background - static final public int WH = 0; //white - static final public int GY = 14; //grey - static final public int RD = 20; //red - static final public int GN = 21; //green - static final public int BL = 22; //blue - static final public int YE = 23; //yellow - static final public int MA = 24; //magenta - static final public int CY = 25; //cyan - static final public int BK = 26; //black - static final public int OR = 27; //orange - static final public int CB = 28; //cornflower blue - private static final String[] mapNames = {"Default(1)", "Default(2)", "M4+M5", "GrayDet", - "Original", "Gray", "B/W", "HitCol", "GrayHitCol"}; - private static final String[] mapNamesPS = {"default1","default2","m4m5", "graydet", - "original", "gray", "bw", "hitcol", "grayhitcol"}; - private static MappedColor[][] maps; - private static int numColors; - private static int numMaps; - - // Color map indices. - public static final int COLOR_MAP_DEFAULT1 = 0; - public static final int COLOR_MAP_DEFAULT2 = 1; - public static final int COLOR_MAP_M4M5 = 2; - public static final int COLOR_MAP_GRAYDET = 3; - public static final int COLOR_MAP_ORIGINAL = 4; - public static final int COLOR_MAP_GRAY = 5; - public static final int COLOR_MAP_BW = 6; - public static final int COLOR_MAP_HITCOL = 7; - public static final int COLOR_MAP_GRAY_HITCOL = 8; - - //color map used if wrong value in config file - static int currentMap = COLOR_MAP_DEFAULT1; - - - public static void readColorMap(String name) - { - String fileName = null; - String FILE_SEPAR = System.getProperty("file.separator"); - - if(name != null && new File(name).canRead()) - { - // color map file specified as command line argument - fileName = name; - } - else - { - if(name != null) - { - logger.warn("Can't read color map file: " + name); - } - // color map file wasn't specified as command line argument - fileName = ".Atlantis-colormap.xml"; // default name - String fileNameFull = System.getProperty("user.home") + FILE_SEPAR + fileName; - if(new File(fileNameFull).canRead()) - { - // use existing user's color map file - fileName = fileNameFull; - } - else - { - // use default color map file from Atlantis distribution - fileName = AGlobals.instance().getHomeDirectory() + "configuration" + - FILE_SEPAR + "colormap.xml"; - } - } - - logger.info("Using color map file: " + fileName); - try - { - InputStream isColorMap = AUtilities.getFileAsStream(fileName); - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(VALIDATION); - DocumentBuilder parser = factory.newDocumentBuilder(); - parser.setErrorHandler(new AXMLErrorHandler()); - Node colormap = parser.parse(isColorMap).getDocumentElement(); - NamedNodeMap cm = colormap.getAttributes(); - numMaps = Integer.parseInt(cm.getNamedItem("numMaps").getNodeValue(). - trim()); - numColors = Integer.parseInt(cm.getNamedItem("numColors"). - getNodeValue().trim()); - maps = new MappedColor[numMaps][numColors]; - NodeList list = colormap.getChildNodes(); - int count = list.getLength(); - for(int i = 0; i < count; i++) - { - Node mapping = list.item(i); - if(mapping.getNodeType() == Node.ELEMENT_NODE) - { - NamedNodeMap atts = mapping.getAttributes(); - try - { - int map = Integer.parseInt(atts.getNamedItem("map"). - getNodeValue().trim()); - int index = Integer.parseInt(atts.getNamedItem("index"). - getNodeValue().trim()); - int r = Integer.parseInt(atts.getNamedItem("r"). - getNodeValue().trim()); - int g = Integer.parseInt(atts.getNamedItem("g"). - getNodeValue().trim()); - int b = Integer.parseInt(atts.getNamedItem("b"). - getNodeValue().trim()); - if(map < maps.length) - { - if(index < maps[map].length) - { - maps[map][index] = new MappedColor(r, g, b, - index); - } - } - } - catch(NumberFormatException e) - { - AExceptionHandler.processException("Colour map error:\n" + - mapping, e); - } - } // if - } // for - } - catch(Exception e) - { - AExceptionHandler.processException("Error while reading colour map:\n" + - fileName, e); - } - for(int i = 0; i < maps.length; i++) - { - for(int j = 0; j < maps[i].length; j++) - { - if(maps[i][j] == null) - { - AOutput.append("\nColorMap (" + i + "," + j + - ") is not present", - ALogInterface.BAD_COMMAND); - } - } - } - - } // readColorMap() ----------------------------------------------------- - - - - public static int getNumMaps() - { - return numMaps; - } - - - public static int getNumColors() - { - return numColors; - } - - - /** - * Returns color map in the XML format. - * [Former method writeColorMap() was writing the XML data directly into - * the file.] - * @return String - */ - public static String getColorMapXML() - { - StringBuffer buffer = new StringBuffer(); - // color map DTD - buffer.append( - "<?xml version=\"1.0\"?>\n" + - "<!DOCTYPE colormap [\n" + - " <!ELEMENT colormap (Mapping*)>" + - " <!ATTLIST colormap\n" + - " numMaps CDATA #REQUIRED\n" + - " numColors CDATA #REQUIRED>\n" + - " <!ELEMENT Mapping EMPTY>\n" + - " <!ATTLIST Mapping\n" + - " map CDATA #REQUIRED\n" + - " index CDATA #REQUIRED\n" + - " r CDATA #REQUIRED\n" + - " g CDATA #REQUIRED\n" + - " b CDATA #REQUIRED>\n" + - "]>\n\n\n"); - buffer.append("<colormap numMaps=\"" + maps.length + - "\" numColors=\"" + maps[0].length + "\" >\n"); - for(int i = 0; i < maps.length; i++) - { - for(int j = 0; j < maps[i].length; j++) - { - int r = maps[i][j].getRed(); - int g = maps[i][j].getGreen(); - int b = maps[i][j].getBlue(); - buffer.append(" <Mapping map=\"" + i + "\" index=\"" + j + - "\" r=\"" + r + "\" g=\"" + g + "\" b=\"" + - b + "\"/>\n"); - } - } - buffer.append("</colormap>\n"); - return buffer.toString(); - - } // getColorMapXML() --------------------------------------------------- - - - - public static String getPSPrologColorMap() - { - StringBuffer s = new StringBuffer(); - String newLine = System.getProperty("line.separator"); - s.append(newLine); - for(int i = 0; i < maps.length; ++i) - { - s.append("/" + mapNamesPS[i] + "ColorMap" + newLine); - s.append("<<" + newLine); - for(int j = 0; j < maps[i].length; ++j) - s.append(" /C" + j + " [" + - String.format("%.3f",maps[i][j].getRed() / 255.) + " " - + String.format("%.3f",maps[i][j].getGreen() / 255.) + " " + - String.format("%.3f",maps[i][j].getBlue() / 255.) - + "]" + newLine); - s.append(">> def" + newLine); - s.append(newLine); - } - return s.toString(); - - } // getPSPrologColorMap() ---------------------------------------------- - - - - public static Color[] getColors(int map) - { - Color[] col = new Color[maps[map].length]; - for(int i = 0; i < col.length; ++i) - col[i] = (Color) maps[map][i]; - return col; - } - - //From hot (red), index 255, to cold (blue), index 0 - public static Color[] getShades(int num) - { - assert (num>=2); - Color[] col = new Color[num]; - col[0]=new Color(170,170,170);//grey for "other" - for(int i = 1; i < num-1; ++i) - col[i] = new Color(((255*i)/num),80,255-((255*i)/num)); - return col; - } - - public static Color[] getColors() - { - return getColors(currentMap); - } - - - public static void setColorMap(int map) - { - if(map >= 0 && map < maps.length) - { - currentMap = map; - APar parameterStore = APar.instance(); - parameterStore.get("Prefs","ColorMap").setI(map); - } - } - - - public static void setColorMap(String mapName) - { - for(int i = 0; i < mapNames.length; i++) - if(mapNames[i].equals(mapName)) - setColorMap(i); - } - - - public static int getColorMap() - { - return currentMap; - } - - public static boolean drawFrames() - { - if(currentMap==COLOR_MAP_GRAY || currentMap==COLOR_MAP_BW) - return true; - else - return false; - } - - public static String getPSColorMapName() - { - return mapNamesPS[getColorMap()]; - - } // getPSColorMapName() ------------------------------------------------ - - - public MappedColor getMappedColor(int colorIndex) - { - if(colorIndex < 0 && colorIndex >= maps[currentMap].length) - { - return null; - } - else - { - return maps[currentMap][colorIndex]; - } - } - - - public Color getColor(int colorIndex) - { - if(colorIndex < 0 && colorIndex >= maps[currentMap].length) - { - return null; - } - else - { - return(Color) maps[currentMap][colorIndex]; - } - } - - - public static String getTag(int colorIndex) - { - if(colorIndex < 0 && colorIndex >= maps[0].length) - { - return null; - } - else - { - return "C" + colorIndex; - } - } - - - public static String[] getMapNames() - { - return(String[]) mapNames.clone(); - } - - public static MappedColor[][] getMaps() { - return maps; - } - -} // class AColorMap ======================================================== diff --git a/graphics/AtlantisJava/src/atlantis/graphics/colormap/MappedColor.java b/graphics/AtlantisJava/src/atlantis/graphics/colormap/MappedColor.java deleted file mode 100755 index 53ace099fe82..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/colormap/MappedColor.java +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2000, CERN, Geneva, Switzerland and University of Santa Cruz, California, U.S.A. -package atlantis.graphics.colormap; - - -import java.awt.Color; - - -/** - * - * @author Charles Loomis - **/ -public class MappedColor extends java.awt.Color { - - /** - * Index of the color in the color map. */ - protected int colorIndex; - - /** - * Value of the brightness/darkness of this color. Larger values - * indicate darker colors and vice versa. */ - protected int brightness; - - /** - * Constructor takes the RGB color components and the color index. */ - public MappedColor(int r, int g, int b, - int colorIndex) { - - // Call the Color constructor. - super(r, g, b); - - // Set the color index and brightness. - this.colorIndex=colorIndex; - brightness=0; - } - - /** - * Constructor takes the RGB color components, the color index, - * and the brightness. */ - public MappedColor(int r, int g, int b, - int colorIndex, - int brightness) { - - // Call the Color constructor. - super(r, g, b); - - // Set the color index and brightness. - this.colorIndex=colorIndex; - this.brightness=brightness; - } - - /** - * Make a brightened color based on this color. */ - public Color brighter() { - - int r=getRed()*10/7; - int g=getGreen()*10/7; - int b=getBlue()*10/7; - - r=Math.max(0, Math.min(255, r)); - g=Math.max(0, Math.min(255, g)); - b=Math.max(0, Math.min(255, b)); - - return (Color)new MappedColor(r, g, b, colorIndex, brightness-1); - } - - /** - * Make a darkened color based on this color. */ - public Color darker() { - - int r=getRed()*7/10; - int g=getGreen()*7/10; - int b=getBlue()*7/10; - - r=Math.max(0, Math.min(255, r)); - g=Math.max(0, Math.min(255, g)); - b=Math.max(0, Math.min(255, b)); - - return (Color)new MappedColor(r, g, b, colorIndex, brightness-1); - } - - /** - * Get the brightness of this color. */ - public int getBrightness() { - return brightness; - } - - /** - * Get the tag associated with this color. */ - public String getColorTag() { - return AColorMap.getTag(colorIndex); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ACallBack.java b/graphics/AtlantisJava/src/atlantis/graphics/dnd/ACallBack.java deleted file mode 100755 index 5cc4ec0a64c4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ACallBack.java +++ /dev/null @@ -1,9 +0,0 @@ -package atlantis.graphics.dnd; - - -/** - * Used in the Drag and Drop operations. - */ -public interface ACallBack { - void callBack(Object from); -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDButton.java b/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDButton.java deleted file mode 100755 index f637b28172b4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDButton.java +++ /dev/null @@ -1,88 +0,0 @@ -package atlantis.graphics.dnd; - -import java.awt.Point; -import java.awt.Graphics; -import javax.swing.JButton; -import java.awt.image.BufferedImage; -import java.awt.dnd.DragSourceDropEvent; -import java.awt.dnd.DragSourceListener; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragSource; -import java.awt.dnd.DragSourceDragEvent; -import java.awt.dnd.DragSourceEvent; -import java.util.Vector; - -/** - * A button wich has Drag and Drop support ( see java.awt.dnd.*) - * Used by the rubberbands. - */ - -public class ADnDButton extends JButton - implements DragSourceListener, DragGestureListener, ACallBack { - - private DragSource dragSource; - private Vector dragListeners; - - public ADnDButton(String name) { - super(name); - setName(name); - - dragSource=DragSource.getDefaultDragSource(); - dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); - - dragListeners=new Vector(); - } - - // implementation of DragSourceListener - - // This method is invoked to signify that the Drag and Drop operation is complete. - public void dragDropEnd(DragSourceDropEvent dsde) {} - - // Called as the hotspot enters a platform dependent drop site. - public void dragEnter(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_VALID); - } - - // Called as the hotspot exits a platform dependent drop site. - public void dragExit(DragSourceEvent dse) { - dse.getDragSourceContext().setCursor(ADnDLabel.DROP_INVALID); - } - - // Called as the hotspot moves over a platform dependent drop site. - public void dragOver(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_VALID); - } - - // Called when the user has modified the drop gesture. - public void dropActionChanged(DragSourceDragEvent dsde) {} - - // implementation of DragGestureListener - - public void dragGestureRecognized(DragGestureEvent dge) { - BufferedImage resizeCursorImage=new BufferedImage(64, 64, BufferedImage.TYPE_4BYTE_ABGR); - - Graphics g=resizeCursorImage.getGraphics(); - - g.drawLine(0, 0, 64, 64); - g.dispose(); - - // return Toolkit.getDefaultToolkit().createCustomCursor(resizeCursorImage, center, "resize") - - - AObjectTransferable cbt=new AObjectTransferable(this); - - dragSource.startDrag(dge, ADnDLabel.DROP_INVALID, resizeCursorImage, new Point(0, 0), cbt, this); - } - - public void callBack(Object to) { - for(int i=0; i<dragListeners.size(); i++) - ((ADragListener)dragListeners.get(i)).dragPerformed(this, to, -1); - } - - public void addDragListener(ADragListener l) { - dragListeners.addElement(l); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDLabel.java b/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDLabel.java deleted file mode 100755 index 2b1873f55637..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADnDLabel.java +++ /dev/null @@ -1,184 +0,0 @@ -package atlantis.graphics.dnd; - -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragSource; -import java.awt.dnd.DragSourceDragEvent; -import java.awt.dnd.DragSourceDropEvent; -import java.awt.dnd.DragSourceEvent; -import java.awt.dnd.DragSourceListener; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.awt.dnd.DropTargetListener; -import java.util.Vector; - -import javax.swing.JLabel; - -import atlantis.graphics.ACursorFactory; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; - -/** - * A label which has Drag and Drop support. - * Used in the Window Control. - */ -public class ADnDLabel extends JLabel -implements DropTargetListener, DragSourceListener, DragGestureListener { - - private DragSource dragSource=null; - private Vector dragListeners; - private boolean dragHighlight; - private String[] page; - - public JLabel getLabel() { - return this; - } - - public static final Cursor DROP_VALID; - public static final Cursor DROP_INVALID; - - static { - /* if(Toolkit.getDefaultToolkit().getBestCursorSize(64, 64).equals(new Dimension(64, 64))) { - DROP_VALID=Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().getImage(Atlantis.getHomeDirectory() - +"img"+Atlantis.fileSep+"cursor_DnD_valid_64x64.gif"), - new Point(1, 1), "ValidDnD"); - DROP_INVALID=Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().getImage(Atlantis.getHomeDirectory() - +"img"+Atlantis.fileSep+"cursor_DnD_invalid_64x64.gif"), - new Point(9, 9), "InvalidDnD"); - } else { - DROP_VALID=DragSource.DefaultMoveDrop; - DROP_INVALID=DragSource.DefaultMoveNoDrop; - } */ - DROP_VALID = ACursorFactory.getInstance().getDragValidCursor(); - DROP_INVALID = ACursorFactory.getInstance().getDragInvalidCursor(); - } - - public ADnDLabel(String name, boolean dragHighlight) { - super(name, JLabel.CENTER); - setName(name); - setOpaque(true); - page=null; - this.dragHighlight=dragHighlight; - - dragSource=new DragSource(); - dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); - this.setDropTarget(new DropTarget(this, this)); - dragListeners=new Vector(); - } - - public ADnDLabel(String name, String[] wnames, boolean dragHighlight) { - super(name, JLabel.CENTER); - setName(name); - setOpaque(true); - page=wnames; - this.dragHighlight=dragHighlight; - - dragSource=new DragSource(); - dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); - this.setDropTarget(new DropTarget(this, this)); - dragListeners=new Vector(); - } - - public Dimension getPreferredSize() { - return new Dimension(15, 15); - } - - // implementation of DropTargetListener - - private Color old; - - // Called when a drag operation has encountered the DropTarget. - public void dragEnter(DropTargetDragEvent dtde) { - dtde.acceptDrag(DnDConstants.ACTION_MOVE); - if(dragHighlight) { - old=getBackground(); - setBackground(new Color(150, 150, 150)); - } - } - - // The drag operation has departed the DropTarget without dropping. - public void dragExit(DropTargetEvent dte) { - if(dragHighlight) - setBackground(old); - } - - // Called when a drag operation is ongoing on the DropTarget. - public void dragOver(DropTargetDragEvent dtde) { - } - - // The drag operation has terminated with a drop on this DropTarget. - public void drop(DropTargetDropEvent dtde) { - try { - Transferable transferable=dtde.getTransferable(); - DataFlavor javaObjectDataFlavor=new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType); - - if(transferable.isDataFlavorSupported(javaObjectDataFlavor)) { - dtde.acceptDrop(DnDConstants.ACTION_MOVE); - Object object=transferable.getTransferData(javaObjectDataFlavor); - - if(object instanceof ACallBack) - ((ACallBack)object).callBack(this); - else - fireDragEvent(object); - dtde.getDropTargetContext().dropComplete(true); - } else - AOutput.append("Cannot accept drop\n", ALogInterface.BAD_COMMAND); - } catch(Exception e) { - e.printStackTrace(); - dtde.rejectDrop(); - } - } - - private void fireDragEvent(Object from) { - for(int i=0; i<dragListeners.size(); i++) - ((ADragListener)dragListeners.get(i)).dragPerformed(from, this, -1); - } - - // Called if the user has modified the current drop gesture. - public void dropActionChanged(DropTargetDragEvent dtde) {} - - // implementation of DragSourceListener - - // This method is invoked to signify that the Drag and Drop operation is complete. - public void dragDropEnd(DragSourceDropEvent dsde) {} - - // Called as the hotspot enters a platform dependent drop site. - public void dragEnter(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(DROP_VALID); - } - - // Called as the hotspot exits a platform dependent drop site. - public void dragExit(DragSourceEvent dse) { - dse.getDragSourceContext().setCursor(DROP_INVALID); - } - - // Called as the hotspot moves over a platform dependent drop site. - public void dragOver(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(DROP_VALID); - } - - // Called when the user has modified the drop gesture. - public void dropActionChanged(DragSourceDragEvent dsde) {} - - // implementation of DragGestureListener - public void dragGestureRecognized(DragGestureEvent dge) { - dragSource.startDrag(dge, DROP_VALID, new AObjectTransferable(this), this); - } - - public void addDragListener(ADragListener l) { - dragListeners.addElement(l); - } - - public String[] returnPageName() - { - return page; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADragListener.java b/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADragListener.java deleted file mode 100755 index 429b9a0af144..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/dnd/ADragListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package atlantis.graphics.dnd; - - -/** - * The listener to drag operations. It is suported by ADnDLabel and ADnDButton. - */ -public interface ADragListener { - void dragPerformed(Object from, Object to, int action); -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/dnd/AObjectTransferable.java b/graphics/AtlantisJava/src/atlantis/graphics/dnd/AObjectTransferable.java deleted file mode 100755 index d823077f674b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/dnd/AObjectTransferable.java +++ /dev/null @@ -1,62 +0,0 @@ -package atlantis.graphics.dnd; - - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; - - -/** - * Used by Drag and Drop - * A implementation of a transferable which - * transfers an Java object (really an pointer to it). - */ -public class AObjectTransferable implements Transferable { - private Object object; - - /** - * Creates the Transferable which will transfer the specified object. - * @param object The object to be transferred - */ - public AObjectTransferable(Object object) { - this.object=object; - } - - /** - * Returns the transferred for a specific DataFlavor. - * @param flavor The DataFlavor for which to get the transferred object. - * @return The transferred object. - */ - public Object getTransferData(DataFlavor flavor) { - return object; - } - - /** - * Returns an array of DataFlavor objects indicating the flavors the - * data can be provided in. - * @return The set of available flavors. - */ - public DataFlavor[] getTransferDataFlavors() { - DataFlavor df=null; - - try { - df=new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType); - } catch(ClassNotFoundException e) { - throw new Error("Cannot create DataFlavor.javaJVMLocalObjectMimeType "+e.getMessage()); - } - return new DataFlavor[] {df}; - } - - /** - * Returns whether or not the specified data flavor is - * supported by this transferable. - * @param flavor The data flavor that needs to be checked - * @return True if the flavor is supported. False Otherwise. - */ - public boolean isDataFlavorSupported(DataFlavor flavor) { - if(flavor.getHumanPresentableName().equals(DataFlavor.javaJVMLocalObjectMimeType)) - return true; - else - return false; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/encoders/AImageEncoder.java b/graphics/AtlantisJava/src/atlantis/graphics/encoders/AImageEncoder.java deleted file mode 100644 index a27b4f07d8b1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/encoders/AImageEncoder.java +++ /dev/null @@ -1,167 +0,0 @@ -package atlantis.graphics.encoders; - -import atlantis.canvas.ACanvas; -import atlantis.utils.ALogger; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.File; -import java.io.FileOutputStream; -import java.io.BufferedOutputStream; - -import org.apache.batik.dom.svg.SVGDOMImplementation; -import org.apache.batik.svggen.SVGGraphics2D; - -import org.sourceforge.jlibeps.epsgraphics.*; -import org.w3c.dom.*; -import org.w3c.dom.svg.SVGDocument; - -/** - * Takes the image drawn on the canvas and encodes it in the given format - * @author sboeser - */ -public class AImageEncoder { - - //The logger - private final static ALogger logger = ALogger.getLogger(AImageEncoder.class); - - /** - * Grabs canvas and encodes the data in PNG format. - * @param imageWidth resulting image width - * @param imageHeight resulting image height - * @return byte[] - */ - public byte[] getPNGData(int imageWidth, int imageHeight){ - - // Draw image - Image image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB); - ACanvas.getCanvas().drawScaledCanvas(image.getGraphics(), imageWidth, imageHeight, "png"); - - // Encode as PNG. - PngEncoder encoder = new PngEncoder(image, true, PngEncoder.FILTER_NONE, 9); - byte[] data = encoder.pngEncode(); - return data; - - } - - /** - * Get a scaled version of the PNG image - mostly used to create thumbnails - * NOTE: in contrast to getPNGData, this will first create the image with given - * width and height and then scale everything (including window - * borders, title bar, etc...) - * @param width image width before scaling - * @param height image height before scaling - * @param scale the scale factor - * @return the PNG data - */ - public byte[] getScaledPNGData(int width, int height, double scale){ - - // Draw a temporary full-size image - Image inputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - ACanvas.getCanvas().drawScaledCanvas(inputImage.getGraphics(), width, height, "png"); - - //Calculate target height keeping aspect ratio - int targetHeight = (int)(scale*height); - int targetWidth = (int)(scale*width); - - - /** - * Now rescale the image in steps - do not use Image.getScaledInstance, - * which is outdated and way to slow! - */ - - while (inputImage.getWidth(null) != targetWidth){ - - //Resize by no more than a factor of two in one step - if (inputImage.getWidth(null)/targetWidth > 2. ){ - width = (int)(inputImage.getWidth(null)/2.); - height = (int)(inputImage.getHeight(null)/2.); - } else { - width = targetWidth; - height = targetHeight; - } - - //log for debugging - logger.debug("Rescaling image from "+inputImage.getWidth(null)+"x"+inputImage.getHeight(null)+ - " to "+width+"x"+height); - - //Now redraw that to the scaled image - BufferedImage scaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D scaledGraphics = scaledImage.createGraphics(); - scaledGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC); - scaledGraphics.drawImage(inputImage, 0, 0, width, height, null); - scaledGraphics.dispose(); - - //Provide the scaled image as new input in case we need to rescale once more - inputImage = scaledImage; - } - - // Encode as PNG. - PngEncoder encoder = new PngEncoder(inputImage, true, PngEncoder.FILTER_NONE, 9); - byte[] data = encoder.pngEncode(); - return data; - - } - - - /** - * Grab canvas, encode the information as EPS and save to a file - * @param imageWidth image width - * @param imageHeight image height - * @param saveFile save file - */ - - public void saveEPS(int imageWidth, int imageHeight, File saveFile) throws IOException{ - - //Create the output stream - FileOutputStream fos = new FileOutputStream(saveFile); - BufferedOutputStream bos = new BufferedOutputStream(fos); - - // Create a new postscript graphics object - EpsGraphics2D g = new EpsGraphics2D("Atlantis",bos,0,0,imageWidth,imageHeight); - // Draw text as shapes - g.setAccurateTextMode(true); - // Draw into the postscript graphics - ACanvas.getCanvas().drawScaledCanvas(g, imageWidth, imageHeight, "eps"); - g.flush(); - g.close(); - fos.close(); - bos.close(); - - } - - /** - * Grab canvas, encode the information as SVG and save to a file - * @param imageWidth image width - * @param imageHeight image height - * @param saveFile save file - */ - - public void saveSVG(int imageWidth, int imageHeight, File saveFile) throws IOException{ - - // Document Object Model to define our SVG Document - DOMImplementation domImpl = - SVGDOMImplementation.getDOMImplementation(); - - // We need to write the SVG into a Document - String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; - SVGDocument doc = (SVGDocument) domImpl.createDocument(svgNS, "svg", null); - - // Construct an SVGGraphics2D from our Document - SVGGraphics2D g = new SVGGraphics2D(doc); - - g.setSVGCanvasSize(new Dimension(imageWidth, imageHeight)); - - // Paint the scaled Canvas onto our SVG Graphics2D - ACanvas.getCanvas().drawScaledCanvas(g, imageWidth, imageHeight, "svg"); - - // Stream the output into our chosen file - g.stream(saveFile.getAbsolutePath()); - - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/encoders/PngEncoder.java b/graphics/AtlantisJava/src/atlantis/graphics/encoders/PngEncoder.java deleted file mode 100755 index a9c7b5aa61b3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/encoders/PngEncoder.java +++ /dev/null @@ -1,582 +0,0 @@ -package atlantis.graphics.encoders; - -// package com.keypoint; - - -import java.awt.*; -import java.awt.image.*; -import java.util.zip.*; -import java.io.*; - -/** - * PngEncoder takes a Java Image object and creates a byte string which can be saved as a PNG file. - * The Image is presumed to use the DirectColorModel. - * - * Thanks to Jay Denny at KeyPoint Software - * http://www.keypoint.com/ - * who let me develop this code on company time. - * - * You may contact me with (probably very-much-needed) improvements, - * comments, and bug fixes at: - * - * david@catcode.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * A copy of the GNU LGPL may be found at - * http://www.gnu.org/copyleft/lesser.html, - * - * @author J. David Eisenberg - * @version 1.4, 31 March 2000 - * - * Added ImageObserver so that getHeight, getWidth calls work properly. - * - * @author M.Donszelmann - */ -public class PngEncoder extends Object implements ImageObserver { - - /** Constant specifying that alpha channel should be encoded. */ - public static final boolean ENCODE_ALPHA=true; - - /** Constant specifying that alpha channel should not be encoded. */ - public static final boolean NO_ALPHA=false; - - /** Constants for filters */ - public static final int FILTER_NONE=0; - public static final int FILTER_SUB=1; - public static final int FILTER_UP=2; - public static final int FILTER_LAST=2; - - protected byte[] pngBytes; - protected byte[] priorRow; - protected byte[] leftBytes; - protected Image image; - protected int width, height; - protected int bytePos, maxPos; - protected int hdrPos, dataPos, endPos; - protected CRC32 crc=new CRC32(); - protected long crcValue; - protected boolean encodeAlpha; - protected int filter; - protected int bytesPerPixel; - protected int compressionLevel; - - public PngEncoder() { - this(null, false, FILTER_NONE, 0); - } - - /** - * Class constructor specifying Image to encode, with no alpha channel encoding. - * - * @param image A Java Image object which uses the DirectColorModel - * @see java.awt.Image - */ - public PngEncoder(Image image) { - this(image, false, FILTER_NONE, 0); - } - - /** - * Class constructor specifying Image to encode, and whether to encode alpha. - * - * @param image A Java Image object which uses the DirectColorModel - * @param encodeAlpha Encode the alpha channel? false=no; true=yes - * @see java.awt.Image - */ - public PngEncoder(Image image, boolean encodeAlpha) { - this(image, encodeAlpha, FILTER_NONE, 0); - } - - /** - * Class constructor specifying Image to encode, whether to encode alpha, and filter to use. - * - * @param image A Java Image object which uses the DirectColorModel - * @param encodeAlpha Encode the alpha channel? false=no; true=yes - * @param whichFilter 0=none, 1=sub, 2=up - * @see java.awt.Image - */ - public PngEncoder(Image image, boolean encodeAlpha, int whichFilter) { - this(image, encodeAlpha, whichFilter, 0); - } - - /** - * Class constructor specifying Image source to encode, whether to encode alpha, filter to use, and compression level. - * - * @param image A Java Image object - * @param encodeAlpha Encode the alpha channel? false=no; true=yes - * @param whichFilter 0=none, 1=sub, 2=up - * @param compLevel 0..9 - * @see java.awt.Image - */ - public PngEncoder(Image image, boolean encodeAlpha, int whichFilter, - int compLevel) { - this.image=image; - this.encodeAlpha=encodeAlpha; - setFilter(whichFilter); - if(compLevel>=0&&compLevel<=9) { - this.compressionLevel=compLevel; - } - } - - /** - * Set the image to be encoded - * - * @param image A Java Image object which uses the DirectColorModel - * @see java.awt.Image - */ - public void setImage(Image image) { - this.image=image; - pngBytes=null; - } - - /** method to wait for image */ - private int imageStatus; - - public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) { - imageStatus=flags; - if(((flags&ALLBITS)==ALLBITS)||((flags&(ABORT|ERROR))!=0)) { - return false; - } - return true; - } - - /** - * Creates an array of bytes that is the PNG equivalent of the current image, specifying whether to encode alpha or not. - * - * @param encodeAlpha boolean false=no alpha, true=encode alpha - * @return an array of bytes, or null if there was a problem - */ - public byte[] pngEncode(boolean encodeAlpha) { - byte[] pngIdBytes= { -119, 80, 78, 71, 13, 10, 26, 10 }; - - if(image==null) { - return null; - } - - imageStatus=0; - boolean status=Toolkit.getDefaultToolkit().prepareImage(image, -1, -1, this); - - if(!status) { - while(((imageStatus&(ALLBITS))==0)&&((imageStatus&(ABORT|ERROR))==0)) { - try { - Thread.sleep(100); - } catch(Exception e) {} - } - // FIXED: moved this inside the "if (!status)" area - if((imageStatus&(ALLBITS))==0) { - return null; - } - } - - width=image.getWidth(null); - height=image.getHeight(null); - - /* - * start with an array that is big enough to hold all the pixels - * (plus filter bytes), and an extra 200 bytes for header info - */ - pngBytes=new byte[((width+1)*height*3)+200]; - - /* - * keep track of largest byte written to the array - */ - maxPos=0; - - bytePos=writeBytes(pngIdBytes, 0); - hdrPos=bytePos; - writeHeader(); - dataPos=bytePos; - if(writeImageData()) { - writeEnd(); - pngBytes=resizeByteArray(pngBytes, maxPos); - } else { - pngBytes=null; - } - return pngBytes; - } - - /** - * Creates an array of bytes that is the PNG equivalent of the current image. - * Alpha encoding is determined by its setting in the constructor. - * - * @return an array of bytes, or null if there was a problem - */ - public byte[] pngEncode() { - return pngEncode(encodeAlpha); - } - - /** - * Set the alpha encoding on or off. - * - * @param encodeAlpha false=no, true=yes - */ - public void setEncodeAlpha(boolean encodeAlpha) { - this.encodeAlpha=encodeAlpha; - } - - /** - * Retrieve alpha encoding status. - * - * @return boolean false=no, true=yes - */ - public boolean getEncodeAlpha() { - return encodeAlpha; - } - - /** - * Set the filter to use - * - * @param whichFilter from constant list - */ - public void setFilter(int whichFilter) { - this.filter=FILTER_NONE; - if(whichFilter<=FILTER_LAST) { - this.filter=whichFilter; - } - } - - /** - * Retrieve filtering scheme - * - * @return int (see constant list) - */ - public int getFilter() { - return filter; - } - - /** - * Set the compression level to use - * - * @param level 0 through 9 - */ - public void setCompressionLevel(int level) { - if(level>=0&&level<=9) { - this.compressionLevel=level; - } - } - - /** - * Retrieve compression level - * - * @return int in range 0-9 - */ - public int getCompressionLevel() { - return compressionLevel; - } - - /** - * Increase or decrease the length of a byte array. - * - * @param array The original array. - * @param newLength The length you wish the new array to have. - * @return Array of newly desired length. If shorter than the - * original, the trailing elements are truncated. - */ - protected byte[] resizeByteArray(byte[] array, int newLength) { - byte[] newArray=new byte[newLength]; - int oldLength=array.length; - - System.arraycopy(array, 0, newArray, 0, Math.min(oldLength, newLength)); - return newArray; - } - - /** - * Write an array of bytes into the pngBytes array. - * Note: This routine has the side effect of updating - * maxPos, the largest element written in the array. - * The array is resized by 1000 bytes or the length - * of the data to be written, whichever is larger. - * - * @param data The data to be written into pngBytes. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - */ - protected int writeBytes(byte[] data, int offset) { - maxPos=Math.max(maxPos, offset+data.length); - if(data.length+offset>pngBytes.length) { - pngBytes=resizeByteArray(pngBytes, pngBytes.length+Math.max(1000, data.length)); - } - System.arraycopy(data, 0, pngBytes, offset, data.length); - return offset+data.length; - } - - /** - * Write an array of bytes into the pngBytes array, specifying number of bytes to write. - * Note: This routine has the side effect of updating - * maxPos, the largest element written in the array. - * The array is resized by 1000 bytes or the length - * of the data to be written, whichever is larger. - * - * @param data The data to be written into pngBytes. - * @param nBytes The number of bytes to be written. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - */ - protected int writeBytes(byte[] data, int nBytes, int offset) { - maxPos=Math.max(maxPos, offset+nBytes); - if(nBytes+offset>pngBytes.length) { - pngBytes=resizeByteArray(pngBytes, pngBytes.length+Math.max(1000, nBytes)); - } - System.arraycopy(data, 0, pngBytes, offset, nBytes); - return offset+nBytes; - } - - /** - * Write a two-byte integer into the pngBytes array at a given position. - * - * @param n The integer to be written into pngBytes. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - */ - protected int writeInt2(int n, int offset) { - byte[] temp= { (byte)((n>>8)&0xff), (byte)(n&0xff) }; - return writeBytes(temp, offset); - } - - /** - * Write a four-byte integer into the pngBytes array at a given position. - * - * @param n The integer to be written into pngBytes. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - */ - protected int writeInt4(int n, int offset) { - byte[] temp= { (byte)((n>>24)&0xff), (byte)((n>>16)&0xff), (byte)((n>>8)&0xff), (byte)(n&0xff) }; - return writeBytes(temp, offset); - } - - /** - * Write a single byte into the pngBytes array at a given position. - * - * @param b The integer to be written into pngBytes. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - */ - protected int writeByte(int b, int offset) { - byte[] temp= { (byte)b }; - return writeBytes(temp, offset); - } - - /** - * Write a string into the pngBytes array at a given position. - * This uses the getBytes method, so the encoding used will - * be its default. - * - * @param s The string to be written into pngBytes. - * @param offset The starting point to write to. - * @return The next place to be written to in the pngBytes array. - * @see java.lang.String#getBytes() - */ - protected int writeString(String s, int offset) { - return writeBytes(s.getBytes(), offset); - } - - /** - * Write a PNG "IHDR" chunk into the pngBytes array. - */ - protected void writeHeader() { - int startPos; - - startPos=bytePos=writeInt4(13, bytePos); - bytePos=writeString("IHDR", bytePos); - width=image.getWidth(null); - height=image.getHeight(null); - bytePos=writeInt4(width, bytePos); - bytePos=writeInt4(height, bytePos); - bytePos=writeByte(8, bytePos); // bit depth - bytePos=writeByte((encodeAlpha)?6:2, bytePos); // direct model - bytePos=writeByte(0, bytePos); // compression method - bytePos=writeByte(0, bytePos); // filter method - bytePos=writeByte(0, bytePos); // no interlace - crc.reset(); - crc.update(pngBytes, startPos, bytePos-startPos); - crcValue=crc.getValue(); - bytePos=writeInt4((int)crcValue, bytePos); - } - - /** - * Perform "sub" filtering on the given row. - * Uses temporary array leftBytes to store the original values - * of the previous pixels. The array is 16 bytes long, which - * will easily hold two-byte samples plus two-byte alpha. - * - * @param pixels The array holding the scan lines being built - * @param startPos Starting position within pixels of bytes to be filtered. - * @param width Width of a scanline in pixels. - */ - protected void filterSub(byte[] pixels, int startPos, int width) { - int i; - int offset=bytesPerPixel; - int actualStart=startPos+offset; - int nBytes=width*bytesPerPixel; - int leftInsert=offset; - int leftExtract=0; - - for(i=actualStart; i<startPos+nBytes; i++) { - leftBytes[leftInsert]=pixels[i]; - pixels[i]=(byte)((pixels[i]-leftBytes[leftExtract])%256); - leftInsert=(leftInsert+1)%0x0f; - leftExtract=(leftExtract+1)%0x0f; - } - } - - /** - * Perform "up" filtering on the given row. - * Side effect: refills the prior row with current row - * - * @param pixels The array holding the scan lines being built - * @param startPos Starting position within pixels of bytes to be filtered. - * @param width Width of a scanline in pixels. - */ - protected void filterUp(byte[] pixels, int startPos, int width) { - int i, nBytes; - byte current_byte; - - nBytes=width*bytesPerPixel; - - for(i=0; i<nBytes; i++) { - current_byte=pixels[startPos+i]; - pixels[startPos+i]=(byte)((pixels[startPos+i]-priorRow[i])%256); - priorRow[i]=current_byte; - } - } - - /** - * Write the image data into the pngBytes array. - * This will write one or more PNG "IDAT" chunks. In order - * to conserve memory, this method grabs as many rows as will - * fit into 32K bytes, or the whole image; whichever is less. - * - * - * @return true if no errors; false if error grabbing pixels - */ - protected boolean writeImageData() { - int rowsLeft=height; // number of rows remaining to write - int startRow=0; // starting row to process this time through - int nRows; // how many rows to grab at a time - - byte[] scanLines; // the scan lines to be compressed - int scanPos; // where we are in the scan lines - int startPos; // where this line's actual pixels start (used for filtering) - - byte[] compressedLines; // the resultant compressed lines - int nCompressed; // how big is the compressed area? - - PixelGrabber pg; - - bytesPerPixel=(encodeAlpha)?4:3; - - Deflater scrunch=new Deflater(compressionLevel); - ByteArrayOutputStream outBytes=new ByteArrayOutputStream(1024); - - DeflaterOutputStream compBytes=new DeflaterOutputStream(outBytes, scrunch); - try { - while(rowsLeft>0) { - nRows=Math.min(32767/(width*(bytesPerPixel+1)), rowsLeft); - // nRows = rowsLeft; - int[] pixels=new int[width*nRows]; - - pg=new PixelGrabber(image, 0, startRow, width, nRows, pixels, 0, width); - try { - pg.grabPixels(); - } catch(Exception e) { - System.err.println("interrupted waiting for pixels!"); - return false; - } - if((pg.getStatus()&ImageObserver.ABORT)!=0) { - System.err.println("image fetch aborted or errored"); - return false; - } - - /* - * Create a data chunk. scanLines adds "nRows" for - * the filter bytes. - */ - scanLines=new byte[width*nRows*bytesPerPixel+nRows]; - - if(filter==FILTER_SUB) { - leftBytes=new byte[16]; - } - if(filter==FILTER_UP) { - priorRow=new byte[width*bytesPerPixel]; - } - - scanPos=0; - startPos=1; - for(int i=0; i<width*nRows; i++) { - if(i%width==0) { - scanLines[scanPos++]=(byte)filter; - startPos=scanPos; - } - scanLines[scanPos++]=(byte)((pixels[i]>>16)&0xff); - scanLines[scanPos++]=(byte)((pixels[i]>>8)&0xff); - scanLines[scanPos++]=(byte)((pixels[i])&0xff); - if(encodeAlpha) { - scanLines[scanPos++]=(byte)((pixels[i]>>24)&0xff); - } - if((i%width==width-1)&&(filter!=FILTER_NONE)) { - if(filter==FILTER_SUB) { - filterSub(scanLines, startPos, width); - } - if(filter==FILTER_UP) { - filterUp(scanLines, startPos, width); - } - } - } - - /* - * Write these lines to the output area - */ - compBytes.write(scanLines, 0, scanPos); - - startRow+=nRows; - rowsLeft-=nRows; - } - compBytes.close(); - - /* - * Write the compressed bytes - */ - compressedLines=outBytes.toByteArray(); - nCompressed=compressedLines.length; - - crc.reset(); - bytePos=writeInt4(nCompressed, bytePos); - bytePos=writeString("IDAT", bytePos); - crc.update("IDAT".getBytes()); - bytePos=writeBytes(compressedLines, nCompressed, bytePos); - crc.update(compressedLines, 0, nCompressed); - - crcValue=crc.getValue(); - bytePos=writeInt4((int)crcValue, bytePos); - scrunch.finish(); - return true; - } catch(IOException e) { - System.err.println(e.toString()); - return false; - } - } - - /** - * Write a PNG "IEND" chunk into the pngBytes array. - */ - protected void writeEnd() { - bytePos=writeInt4(0, bytePos); - bytePos=writeString("IEND", bytePos); - crc.reset(); - crc.update("IEND".getBytes()); - crcValue=crc.getValue(); - bytePos=writeInt4((int)crcValue, bytePos); - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/graphics/layout/AFlowLayout.java b/graphics/AtlantisJava/src/atlantis/graphics/layout/AFlowLayout.java deleted file mode 100755 index 1d391e05e845..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/layout/AFlowLayout.java +++ /dev/null @@ -1,115 +0,0 @@ -package atlantis.graphics.layout; - -import java.awt.Container; -import java.awt.Insets; -import java.awt.LayoutManager; -import java.awt.Component; -import java.awt.Dimension; - -/** - * This Layout manager aranges the components in a flow like awt.FlowLayout. - * The difference is that this layout resizes the container to the minimum - * size after every layout operation, and therefore ensures that all components - * it laysout are visible. Nothing to do with the layout of the Atlantis canvas. - */ - -public class AFlowLayout implements LayoutManager { - private int hgap; - private int vgap; - - public AFlowLayout(int hgap, int vgap) { - this.hgap=hgap; - this.vgap=vgap; - } - - public void addLayoutComponent(String name, Component comp) {} - - public void removeLayoutComponent(Component comp) {} - - public Dimension minimumLayoutSize(Container target) { - return preferredLayoutSize(target); - } - - public Dimension preferredLayoutSize(Container target) { - Insets insets=target.getInsets(); - Dimension D=target.getSize(); - int W=D.width-insets.left-insets.right; - int L=hgap; - int y=vgap; - int w, h, hmax=0; - - for(int i=0; i<target.getComponentCount(); i++) { - Dimension d=target.getComponent(i).getPreferredSize(); - - w=d.width; - h=d.height; - - if(L+w+hgap<W) { - L+=w+hgap; - if(h>hmax) hmax=h; - } else { - L=hgap+w+hgap; - y+=hmax+vgap; - hmax=0; - if(h>hmax) hmax=h; - } - } - if(target.getComponentCount()>0) - y+=hmax+vgap; - - return new Dimension(W, y); - } - - public void layoutContainer(Container target) { - Insets insets=target.getInsets(); - Dimension D=target.getSize(); - int W=D.width-insets.left-insets.right; - int L=hgap; - int y=vgap; - int from=0; - int to=0; - int w, h, hmax=0; - - for(int i=0; i<target.getComponentCount(); i++) { - Dimension d=target.getComponent(i).getPreferredSize(); - - w=d.width; - h=d.height; - - if(L+w+hgap<W) { - L+=w+hgap; - to=i; - if(h>hmax) hmax=h; - } else { - layout(target, hgap+insets.left+(W/2-L/2), y, from, to); - L=hgap+w+hgap; - from=i; - to=i; - y+=hmax+vgap; - hmax=0; - if(h>hmax) hmax=h; - } - } - - if(target.getComponentCount()>0) - layout(target, hgap+insets.left+(W/2-L/2), y, from, to); - - /* - if (y + hmax + vgap != D.height) - SwingUtilities.invokeLater(new ARunAnotherLayout(target)); - */ - } - - public void layout(Container target, int x, int y, int from, int to) { - int xi=x; - - for(int i=from; i<=to; i++) { - Component comp=target.getComponent(i); - Dimension d=comp.getPreferredSize(); - - comp.setBounds(xi, y, d.width, d.height); - xi+=d.width+hgap; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/layout/AGridLayout.java b/graphics/AtlantisJava/src/atlantis/graphics/layout/AGridLayout.java deleted file mode 100755 index 034287a49e1f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/layout/AGridLayout.java +++ /dev/null @@ -1,214 +0,0 @@ -package atlantis.graphics.layout; - -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.LayoutManager2; -import java.awt.Rectangle; - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; - -import atlantis.canvas.ACanvas; - -/** - * This layout manager is a simplification of the - * <code>ConstrainedGridLayout</code> layout manager written by Charles A. - * Loomis. This layout manager hase two modes of operation: 1) CONSTRAINED - - * cell size is calculated by dividing the container size acording to aspect - * ratio. 2) PREFERRED - cell size is given at creation time - * - * @author Dumitru Petrusca. - */ -public class AGridLayout implements LayoutManager2 -{ - private Dimension gridSize; - private int cellSize; - private Dimension initialSize; - - public final static int CONSTRAINED = 0; - public final static int PREFERRED = 1; - private int layoutType; - private boolean secondLayout; - - final public static String GRID_SIZE_ERROR = "Grid size must have width and height > 0."; - - final public static String ASPECT_RATIO_ERROR = "Aspect ratio must have width and height > 0."; - - final public static String CONSTRAINT_ERROR = "Constraint must be a Rectangle with positive width and height."; - - final public static String AGRID_LAYOUT_CONSTRAINT = "ConstrainedGridLayout.RectangularConstraint"; - - /** - * Creates a new GridLayout of type CONSTRAINNED. - */ - public AGridLayout(Dimension gridSize, Dimension initialSize) - { - layoutType = CONSTRAINED; - setGridSize(gridSize); - secondLayout = true; - this.initialSize = initialSize; - } - - /** - * Creates a new GridLayout of type PREFERRED - */ - public AGridLayout(Dimension gridSize, int cellSize) - { - layoutType = PREFERRED; - setGridSize(gridSize); - this.cellSize = cellSize; - secondLayout = false; - initialSize = null; - } - - private void setGridSize(Dimension gridSize) - { - // Check that all of the dimensions given are reasonable. - if (gridSize.width <= 0 || gridSize.height <= 0 || gridSize.width > 100 || gridSize.height > 100) - throw new IllegalArgumentException(GRID_SIZE_ERROR); - - // Copy the information into the layout manager. - this.gridSize = new Dimension(0, 0); - this.gridSize.setSize(gridSize); - } - - public Dimension getGridSize() - { - return new Dimension(gridSize); - } - - /** - * Set (or reset) the constraints for the given component. - */ - public void setConstraints(Component comp, Rectangle constraints) - { - if (comp instanceof JComponent) - { - Rectangle copy = new Rectangle(constraints); - JComponent jc = (JComponent) comp; - - jc.putClientProperty(AGRID_LAYOUT_CONSTRAINT, copy); - } - } - - /** - * Get the constraints being used for the given component. - */ - public Rectangle getConstraints(Component comp) - { - Rectangle r = null; - - if (comp instanceof JComponent) - { - JComponent jc = (JComponent) comp; - Object constraint = jc.getClientProperty(AGRID_LAYOUT_CONSTRAINT); - - if (constraint instanceof Rectangle) - r = (Rectangle) constraint; - } - - return (r != null) ? new Rectangle(r) : null; - } - - // implementation of LayoutMamager interface - - public void addLayoutComponent(String name, Component comp) - {} - - public void removeLayoutComponent(Component comp) - {} - - public Dimension preferredLayoutSize(Container parent) - { - if (layoutType == CONSTRAINED) - { - Dimension d = parent.getSize(); - if (initialSize != null) - { - d = new Dimension(initialSize); - initialSize = null; - } - - int hCellSize = d.width / gridSize.width; - int vCellSize = d.height / gridSize.height; - if(ACanvas.getCanvas().getCurrentLayout().getName().equals("FULL SCREEN")) - { - return new Dimension(gridSize.width * hCellSize, gridSize.height * vCellSize); - } - cellSize = Math.min(hCellSize, vCellSize); - } - - return new Dimension(gridSize.width * cellSize, gridSize.height * cellSize); - } - - public Dimension minimumLayoutSize(Container parent) - { - return preferredLayoutSize(parent); - } - - public void layoutContainer(Container parent) - { - Dimension d = parent.getSize(); - int hCellSize = d.width / gridSize.width; - int vCellSize = d.height / gridSize.height; - int compCount = parent.getComponentCount(); - - for (int i = 0; i < compCount; i++) - { - Component comp = parent.getComponent(i); - Rectangle r = getConstraints(comp); - - if (r != null) - { - if(ACanvas.getCanvas().getCurrentLayout().getName().equals("FULL SCREEN")) - comp.setBounds(r.x * hCellSize, r.y * vCellSize, r.width * hCellSize, r.height * vCellSize); - else - comp.setBounds(r.x * cellSize, r.y * cellSize, r.width * cellSize, r.height * cellSize); - } - } - - if (secondLayout) - SwingUtilities.invokeLater(new ARunAnotherLayout(parent)); - } - - // implementation of LayoutMamager2 interface - - /** - * Adds the specified component to the layout, using the specified - * constraint object. - */ - public void addLayoutComponent(Component comp, Object constraints) - { - if (constraints instanceof Rectangle) - { - Rectangle r = (Rectangle) constraints; - - if (r.width <= 0 || r.height <= 0) - throw new IllegalArgumentException(CONSTRAINT_ERROR); - - setConstraints(comp, r); - } - else if (constraints != null) - throw new IllegalArgumentException(CONSTRAINT_ERROR); - } - - public Dimension maximumLayoutSize(Container target) - { - return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); - } - - public float getLayoutAlignmentX(Container target) - { - return 0.5f; - } - - public float getLayoutAlignmentY(Container target) - { - return 0.5f; - } - - public void invalidateLayout(Container target) - {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/layout/ARunAnotherLayout.java b/graphics/AtlantisJava/src/atlantis/graphics/layout/ARunAnotherLayout.java deleted file mode 100755 index ce1330374e3f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/layout/ARunAnotherLayout.java +++ /dev/null @@ -1,26 +0,0 @@ -package atlantis.graphics.layout; - - -import java.awt.Container; -import java.awt.Window; -import javax.swing.SwingUtilities; - - -/** - * Used by the Layout Managers to invoke another layout operation. - * Needed to resize the canvas preserving aspect ratio. - */ - -public class ARunAnotherLayout implements Runnable { - private Container parent; - - public ARunAnotherLayout(Container parent) { - this.parent=parent; - } - - public void run() { - Window window=SwingUtilities.getWindowAncestor(parent); - - if(window!=null) window.pack(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/graphics/package.html b/graphics/AtlantisJava/src/atlantis/graphics/package.html deleted file mode 100644 index 0d498ed42593..000000000000 --- a/graphics/AtlantisJava/src/atlantis/graphics/package.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<p>2D graphical classes, graphical primitives.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/gui/AAboutDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AAboutDialog.java deleted file mode 100755 index 62546b209703..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AAboutDialog.java +++ /dev/null @@ -1,214 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.awt.Font; -import java.awt.Color; -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; - -import javax.swing.JPanel; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JTextPane; -import javax.swing.BorderFactory; -import javax.swing.JFrame; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.utils.AUtilities; - - -/** - * - * About information dialog (Help -> About) - * - * @author Zdenek Maxa, Mark Stockton - */ -public class AAboutDialog extends JFrame -{ - - private static JPanel a_panel1 = null; - private static JPanel a_panel2 = null; - private static JPanel a_panel3 = null; - private static JPanel a_panel4 = null; - private static JPanel a_textPanel = null; - private static JLabel a_label1 = null; - private static JTextPane a_label2 = null; - private static JLabel a_label3 = null; - private static JTextPane a_label4 = null; - - private static JPanel m_panel1 = null; - private static JPanel m_panel2 = null; - private static JPanel m_panel3 = null; - private static JPanel m_panel4 = null; - private static JPanel m_textPanel = null; - private static JLabel m_label1 = null; - private static JTextPane m_label2 = null; - private static JTextPane m_label3 = null; - private static JTextPane m_label4 = null; - - private static JPanel c_panel1 = null; - - private static JPanel mainPanel = null; - - - private static JButton closeButton = null; - - private static AAboutDialog instance = null; - - private static final AGlobals globals = AGlobals.instance(); - - - private AAboutDialog(String title) - { - super(title); - try - { - createGUI(); - pack(); - } - catch(Exception ex) - { - ex.printStackTrace(); - } - - AIcon.setIconImage(this); - - } // AAboutDialog() ----------------------------------------------------- - - - - private void createGUI() - { - // top panel - atlantis - a_panel1 = new JPanel(); - a_panel1.setLayout(new GridLayout(1,2)); - - // top left text panel (4 lines of text) - a_panel2 = new JPanel(); - a_label2 = new JTextPane(); - Font font = new Font(a_panel2.getFont().getName(), - Font.BOLD, - a_panel2.getFont().getSize() + 6); - a_label2.setFont(font); - a_label2.setEditable(false); - a_label2.setBackground(a_panel2.getBackground()); - a_label2.setText(AGlobals.instance().getVersion()); - a_panel2.add(a_label2); - - a_panel3 = new JPanel(); - a_label3 = new JLabel("Event display for ATLAS"); - a_panel3.add(a_label3); - - a_panel4 = new JPanel(); - a_label4 = new JTextPane(); - a_label4.setBackground(a_panel4.getBackground()); - a_label4.setForeground(Color.blue); - a_label4.setText("http://www.cern.ch/atlantis" + "\n" + - "hn-atlas-AtlantisDisplay@cern.ch"); - a_label4.setEditable(false); - a_panel4.add(a_label4); - - a_textPanel = new JPanel(); - a_textPanel.setLayout(new GridLayout(3,1)); - a_textPanel.add(a_panel2); - a_textPanel.add(a_panel3); - a_textPanel.add(a_panel4); - - a_panel1.add(a_textPanel); - - String FILE_SEPAR = System.getProperty("file.separator"); - String homeDirectory = AGlobals.instance().getHomeDirectory(); - - // top right atlantis image - String path = homeDirectory + "img" + FILE_SEPAR + - "atlantis_log.gif"; - a_label1 = new JLabel(AUtilities.getFileAsImageIcon(path)); - a_panel1.add(a_label1); - - // middle panel - minerva - m_panel1 = new JPanel(); - m_panel1.setLayout(new GridLayout(1,2)); - - // middle left minerva image - path = homeDirectory + "img" + FILE_SEPAR + - "minerva_log.gif"; - m_label1 = new JLabel(AUtilities.getFileAsImageIcon(path)); - m_panel1.add(m_label1); - - // middle right text panel - m_panel2 = new JPanel(); - m_label2 = new JTextPane(); - m_label2.setFont(font); - m_label2.setEditable(false); - m_label2.setBackground(m_panel2.getBackground()); - m_label2.setText("MINERVA"); - m_panel2.add(m_label2); - - m_panel3 = new JPanel(); - m_label3 = new JTextPane(); - m_label3.setBackground(m_panel3.getBackground()); - m_label3.setEditable(false); - m_label3.setText(" Masterclass INvolving Event \n Recognition Visualised with Atlantis"); - m_panel3.add(m_label3); - - m_panel4 = new JPanel(); - m_label4 = new JTextPane(); - m_label4.setBackground(m_panel4.getBackground()); - m_label4.setForeground(Color.blue); - m_label4.setText("http://www.cern.ch/atlas-minerva"); - m_label4.setEditable(false); - m_panel4.add(m_label4); - - m_textPanel = new JPanel(); - m_textPanel.setLayout(new GridLayout(3,1)); - m_textPanel.add(m_panel2); - m_textPanel.add(m_panel3); - m_textPanel.add(m_panel4); - - m_panel1.add(m_textPanel); - - // bottom panel - close button - c_panel1 = new JPanel(new BorderLayout()); - closeButton = new JButton("Close"); - closeButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AAboutDialog.getInstance().dispose(); - } - }); - c_panel1.add(closeButton, BorderLayout.EAST); - c_panel1.setBorder(BorderFactory.createEmptyBorder(15, 0, 15, 15)); - - - // main panel - mainPanel = new JPanel(); - mainPanel.setLayout(new BorderLayout()); - mainPanel.add(a_panel1, BorderLayout.NORTH); - mainPanel.add(m_panel1, BorderLayout.CENTER); - mainPanel.add(c_panel1, BorderLayout.SOUTH); - - this.getContentPane().add(mainPanel, BorderLayout.CENTER); - - this.setResizable(false); - - this.setLocation(globals.getGuiFrame().getLocation()); - - } // createGUI() -------------------------------------------------------- - - - public static AAboutDialog getInstance() - { - if(instance == null) - { - instance = new AAboutDialog("About Atlantis"); - } - return instance; - - } // getInstance() ------------------------------------------------------ - - - -} // class AAboutDialog ===================================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/ACheckBox.java b/graphics/AtlantisJava/src/atlantis/gui/ACheckBox.java deleted file mode 100755 index f4af0033a9fa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ACheckBox.java +++ /dev/null @@ -1,33 +0,0 @@ -package atlantis.gui; - -import java.awt.event.ActionListener; -import javax.swing.JCheckBox; - -/** - * This class does not generate an ActionEvent - * when the setSelected() method is called. - */ -public class ACheckBox extends JCheckBox { - ActionListener listener; - - public ACheckBox(String text) { - super(text); - } - - public ACheckBox() { - super(); - } - - public void addActionListener(ActionListener l) { - if(listener==null) { - super.addActionListener(listener); - listener=l; - } - } - - public void setSelected(boolean b) { - if(listener!=null) super.removeActionListener(listener); - super.setSelected(b); - if(listener!=null) super.addActionListener(listener); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ACheckNode.java b/graphics/AtlantisJava/src/atlantis/gui/ACheckNode.java deleted file mode 100755 index e2bac2cf8a3c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ACheckNode.java +++ /dev/null @@ -1,86 +0,0 @@ -package atlantis.gui; - -import java.util.Iterator; -import atlantis.parameters.AParameter; -import atlantis.parameters.AStatusParameter; -import atlantis.parameters.ACommandProcessor; -import hep.wired.util.DefaultTristateTreeNode; -import hep.wired.util.TristateCheckBox; - -/** - * - * @author Qiang - */ - -public class ACheckNode extends DefaultTristateTreeNode { - - public static final byte SINGLE_SELECTION = 0; - - public static final byte MULTI_SELECTION = 1; - - private byte selectionMode; - - private AParameter parameter; - - public ACheckNode(Object userObject, boolean selectionValue, byte selectionMode, AParameter parameter) { - super(userObject, selectionValue, true); - setSelectionMode(selectionMode); - this.parameter = parameter; - } - - public void setSelectionMode(byte selectionMode) { - this.selectionMode = selectionMode; - } - - public byte getSelectionMode() { - return this.selectionMode; - } - - public AParameter getParameter(){ - return this.parameter; - } - - public void updateState(){ - if(children!=null){ - int checkedNumber = 0; - for(Iterator it=children.iterator(); it.hasNext();){ - ACheckNode aChildNode = (ACheckNode)it.next(); - aChildNode.updateState(); - if(aChildNode.isSelected()) - checkedNumber++; - } - if(checkedNumber==0) - this.setSelected(false); - else - this.setSelected(true); - } else{ - ACheckBox cellComponent = (ACheckBox)getUserObject(); - cellComponent.setSelected(getParameter().getStatus()); - setSelected(cellComponent.isSelected()); - } - } - - public void getClicked(boolean selectionFlag, boolean statusChange) { - setSelected(selectionFlag); - if((parameter instanceof AStatusParameter) && statusChange){ - // a leaf node is found here - AStatusParameter theStatusParameter = (AStatusParameter)parameter; - ACommandProcessor.receive(theStatusParameter.getName()); - theStatusParameter.apply(); - } else{ - // parameter is either AStatusRootParameter or AStatusGroupParameter - if((selectionMode==MULTI_SELECTION) && (children!=null)){ - ((TristateCheckBox)this.getUserObject()).setSelected(selectionFlag); - for(Iterator it=children.iterator(); it.hasNext();){ - ACheckNode aChildNode = (ACheckNode)it.next(); - // either AStatusGrooupParameter node or AStatusParameter node - aChildNode.getClicked(selectionFlag, !(aChildNode.isSelected()==selectionFlag)); - } - } - } - if(parent!=null){ - ((ACheckNode)parent).updateState(); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AClosingConfirmationDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AClosingConfirmationDialog.java deleted file mode 100755 index 3872b0960e51..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AClosingConfirmationDialog.java +++ /dev/null @@ -1,63 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import javax.swing.JOptionPane; - -import atlantis.config.ADefaultValues; -import atlantis.utils.ALogger; - -/** - * - * Atlantis application closing confirmation dialog. - * All Atlantis closing actions can be added here and this - * class shall be used for closing the application. - * - */ -public class AClosingConfirmationDialog extends WindowAdapter -{ - private static ALogger logger = ALogger.getLogger(AClosingConfirmationDialog.class); - - private Frame adaptee; - - - public AClosingConfirmationDialog(Frame adaptee) - { - this.adaptee = adaptee; - - } // AClosingConfirmationDialog() --------------------------------------- - - - - public void windowClosing(WindowEvent e) - { - exitApp(); - - } // windowClosing() ---------------------------------------------------- - - - - public void exitApp() - { - - String msg = "Do you really want to quit Atlantis?"; - int i = JOptionPane.showConfirmDialog(adaptee, msg, "Exit Atlantis", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null); - if(i == JOptionPane.YES_OPTION) - { - logger.debug("Shutting down, going to save runtime values..."); - ADefaultValues.saveRuntimeValues(); - logger.warn("Shutting down, calling System.exit(0)"); - System.exit(0); - } - else - { - return; - } - - } // exitApp() ---------------------------------------------------------- - - - -} // class AClosingConfirmationDialog ======================================= diff --git a/graphics/AtlantisJava/src/atlantis/gui/AColorComboBoxRenderer.java b/graphics/AtlantisJava/src/atlantis/gui/AColorComboBoxRenderer.java deleted file mode 100755 index d0eed9427aaf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AColorComboBoxRenderer.java +++ /dev/null @@ -1,126 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import javax.swing.Icon; -import javax.swing.JLabel; -import javax.swing.ToolTipManager; -import javax.swing.BorderFactory; -import javax.swing.JList; -import javax.swing.ListCellRenderer; -import javax.swing.border.Border; - -import atlantis.graphics.colormap.AColorMap; - -/** - * The class used as a renderer when displaying the colors in the UI. - */ -public class AColorComboBoxRenderer extends JLabel - implements ListCellRenderer { - - private ColorIcon icon=new ColorIcon(); - private Border selectedBorder; - private Border deselectedBorder=BorderFactory.createEmptyBorder(2, 2, 2, 2); - - public Component getListCellRendererComponent( - JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - - int colorIndex=((Integer)value).intValue(); - Color[] colorMap=AColorMap.getColors(); - Color color=colorMap[colorIndex]; - - icon.setColor(color); - setIcon(icon); - setText(""+((Integer)value).intValue()); - - if(isSelected) { - selectedBorder=BorderFactory.createLineBorder(list.getSelectionBackground(), 2); - - setBorder(selectedBorder); - - ToolTipManager.sharedInstance().setInitialDelay(1); - ToolTipManager.sharedInstance().setReshowDelay(1); - - String message; - - if(color.equals(Color.black)) - message="Black: "; - else if(color.equals(Color.blue)) - message="Blue: "; - else if(color.equals(Color.cyan)) - message="Cyan: "; - else if(color.equals(Color.darkGray)) - message="DarkGray: "; - else if(color.equals(Color.gray)) - message="Gray: "; - else if(color.equals(Color.green)) - message="Green: "; - else if(color.equals(Color.lightGray)) - message="LightGray: "; - else if(color.equals(Color.magenta)) - message="Magenta: "; - else if(color.equals(Color.orange)) - message="Orange: "; - else if(color.equals(Color.pink)) - message="Pink: "; - else if(color.equals(Color.red)) - message="Red: "; - else if(color.equals(Color.white)) - message="White: "; - else if(color.equals(Color.yellow)) - message="Yellow: "; - else - message=""; - - list.setToolTipText(message+color.getRed()+", "+color.getGreen()+", "+color.getBlue()); - } else setBorder(deselectedBorder); - - return this; - } - - private static class ColorIcon implements Icon { - private int w, h; - private Color color; - - public ColorIcon() { - this(Color.gray, 50, 15); - } - - public ColorIcon(Dimension d) { - this.w=d.width; - this.h=d.height; - } - - public ColorIcon(Color color, int w, int h) { - this.color=color; - this.w=w; - this.h=h; - } - - public void paintIcon(Component c, Graphics g, int x, int y) { - g.setColor(Color.black); - g.drawRect(x, y, w-1, h-1); - g.setColor(color); - g.fillRect(x+1, y+1, w-2, h-2); - } - - public Color getColor() { - return color; - } - - public void setColor(Color color) { - this.color=color; - } - - public int getIconWidth() { - return w; - } - - public int getIconHeight() { - return h; - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AColorHelpDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AColorHelpDialog.java deleted file mode 100755 index 695a2814bd37..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AColorHelpDialog.java +++ /dev/null @@ -1,260 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; - -import javax.swing.JFrame; -import javax.swing.JTextField; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; - -/** - * The help dialog displays the current color of objects - * - * @author Mark Stockton - */ -public class AColorHelpDialog extends JFrame implements WindowListener -{ - private static JTextField[] textField; - public static Color[] colorMap = AColorMap.getColors(); - private static AColorHelpDialog instance = null; - - private static APar parameterStore = APar.instance(); - private static AEventManager eventManager = AEventManager.instance(); - - public static AColorHelpDialog getInstance() - { - if (AGlobals.isAtlantisHeadless()) { - return null; - } - if (instance == null) - instance = new AColorHelpDialog(); - return instance; - } - - public void update() - { - if(!this.isVisible()) - return; - getContentPane().removeAll(); - validate(); - - String[] dataObjectsToDisplay={"RVx", "TRT", "SiCluster", "SiClusterRDO", "S3D", "PixelCluster", "PixelRDO", "TrigS3D", - "MDT", "CSC", "RPC", "TGC", - "EmTauROI", "JetROI", "MuonROI", "LVL1TriggerTower", "LVL1JetElement", - "STr", "SNP", "SMTr", "SVx"}; - String[] dataObjectsWithCollectionsToDisplay={"InDetTrack", "InDetSegment", "Cluster", "MuonTrack", - "MuonSegment", "Jet", "ETMis", "BJet","Electron","Muon","Photon","TauJet","CompositeParticle"}; - String[] geometryObjectsToDisplay={"PIXFill", "SILFill", "TRTFill", "SolFill", "ECALFill", - "HCALFill", "RPCFill", "TGCFill", "MDTFill", "CSCFill", "BkgFill"}; - - int numObjects = Math.max(dataObjectsWithCollectionsToDisplay.length,dataObjectsToDisplay.length); - int numOfColumns = 4; - getContentPane().setLayout(new GridLayout(numObjects+1,numOfColumns)); - textField = new JTextField[(numObjects+1)*4]; - AEvent event = eventManager.getCurrentEvent(); - - //table column titles - fillTextField(0, Color.white, Color.black, " Geometry color"); - fillTextField(1, Color.white, Color.black, " Color of objects without collections"); - fillTextField(2, Color.white, Color.black, " Color of objects with collections"); - fillTextField(3, Color.white, Color.black, " Object Collection"); - - //loop over objects - for(int j=0; j<numObjects; j++) - { - int i=4*j + 4; - //display geometry color - if(j<geometryObjectsToDisplay.length) - { - String source = "Det"; - if(geometryObjectsToDisplay[j].equals("BkgFill")) - source = "Color"; - Color backgroundColor=colorMap[parameterStore.get(source, geometryObjectsToDisplay[j]).getI()]; - //display screen name - String text=parameterStore.get(source, geometryObjectsToDisplay[j]).getScreenName(); - fillTextField(i, backgroundColor, text); - }else{ - fillTextField(i);//nothing to display - } - - i++; - //display object without collection color - if(j<dataObjectsToDisplay.length){ - fillTextField(i,dataObjectsToDisplay[j]); - }else{ - fillTextField(i);//nothing to display - } - - i++; - //display object with collection color - if(j<dataObjectsWithCollectionsToDisplay.length){ - fillTextField(i,dataObjectsWithCollectionsToDisplay[j]); - }else{ - fillTextField(i);//nothing to display - } - - //display object collection - i++; - if(j<dataObjectsWithCollectionsToDisplay.length){ - //get collections - String[] collections=event.getActiveCollectionNames(dataObjectsWithCollectionsToDisplay[j]); - String text; - //check is on/has collectons/not all selected - if(!parameterStore.get("Data", dataObjectsWithCollectionsToDisplay[j]).getStatus() || - collections==null || collections.length==0) - text = "n/a"; - else if(collections.length>1) - text = ">1 selected"; - else - { - text = collections[0].substring(dataObjectsWithCollectionsToDisplay[j].length()); - } - fillTextField(i, Color.white, Color.black, text); - - }else{ - fillTextField(i);//nothing to display - } - } - - invalidate(); - pack(); - } - - /** - * Fills the text field with chosen colours and text - * foreground colour and text can be null to just fill background - * - * @param index - textfield index - * @param background - background colour - * @param foreground - foreground color - * @param text - text to display - */ - private void fillTextField(int index, Color background, Color foreground, String text) - { - if(textField[index]==null) - textField[index]=new JTextField(); - textField[index].setEditable(false); - textField[index].setBackground(background); - if(foreground!=null) - textField[index].setForeground(foreground); - if(text!=null) - textField[index].setText(text); - getContentPane().add(textField[index]); - } - - /** - * Will fill a blank text field - * - * @param index - textfield index - */ - private void fillTextField(int index) - { - //nothing to display so set color to be the - //same as the outline color of the text boxes - fillTextField(index, (new Color(184,207,229)), null, null); - } - - /** - * Automatically decides the forground text colour - * depending on the background color - * - * @param index - textfield index - * @param background - background colour - * @param text - text to display - */ - private void fillTextField(int index, Color background, String text) - { - //find out if too dark for black text - if( background.getBlue()==background.getRed() - && background.getBlue()==background.getGreen() - && background.getBlue()<=128) - fillTextField(index, background, Color.white, text); - else - fillTextField(index, background, Color.black, text); - } - - /** - * Get information from object for background - * colour and objedct name + status gives the text - * - * @param index - textfield index - * @param object - name of object - */ - private void fillTextField(int index, String object) - { - //if color by constant or has no colour option (e.g. vertex) - if(parameterStore.get(object, "ColorFunction")==null - || parameterStore.get(object, "ColorFunction").getI()==0) - { - Color backgroundColor=colorMap[parameterStore.get(object, "Constant").getI()]; - String text = object; - if(!parameterStore.get("Data", object).getStatus()) - text += " - data type not active"; - fillTextField(index, backgroundColor, text); - } - else - { - String text = object; - if(parameterStore.get("Data", object).getStatus()) - text += " is not being colored constant"; - else - text += " - data type not active"; - fillTextField(index, Color.white, Color.black, text); - } - } - - private AColorHelpDialog() - { - this.setTitle("Current window Geometry and Object colors and Object Collection"); - AIcon.setIconImage(this); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - - this.update(); - this.setResizable(false); - addWindowListener(this); - - // set the initial location - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - int screenHeight = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getHeight()); - this.setLocation((int) Math.max(0, 0.1*screenWidth), (int) Math.max(0, 0.1*screenHeight)); - } - - public void dispose() - { - instance = null; - super.dispose(); - } - - public void windowOpened(WindowEvent e) - { - this.update(); - } - - public void windowClosing(WindowEvent e) - {} - - public void windowClosed(WindowEvent e) - {} - - public void windowIconified(WindowEvent e) - {} - - public void windowDeiconified(WindowEvent e) - {} - - public void windowActivated(WindowEvent e) - {} - - public void windowDeactivated(WindowEvent e) - {} - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/gui/AColorMapDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AColorMapDialog.java deleted file mode 100755 index e0b91297e229..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AColorMapDialog.java +++ /dev/null @@ -1,109 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.Frame; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JRadioButton; - -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; -import atlantis.graphics.colormap.AColorMap; - -/** - * This dialog is displayed when the user wants to change the current color set. - */ -public class AColorMapDialog extends JDialog implements ActionListener -{ - private JPanel choosePanel; - private JPanel buttonsPanel; - private JButton okButton, cancelButton; - private JRadioButton selected; - - private static final AGlobals globals = AGlobals.instance(); - - public AColorMapDialog() - { - super(globals.getGuiFrame(), "Select Map Dialog", true); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - setResizable(false); - - choosePanel = new JPanel(); - choosePanel.setBorder(BorderFactory.createTitledBorder(" Select Color Map ")); - - ButtonGroup group = new ButtonGroup(); - - choosePanel.setLayout(new GridLayout(5, 1)); - for (int i = 0; i < AColorMap.getMapNames().length - 2; i++) - { // quick fix to not select hitcolor CT - JRadioButton r = new JRadioButton(AColorMap.getMapNames()[i]); - - r.addActionListener(this); - if (AColorMap.getColorMap() == i) - { - selected = r; - r.setSelected(true); - } - else - r.setSelected(false); - group.add(r); - choosePanel.add(r); - } - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(choosePanel, BorderLayout.CENTER); - - okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AColorMap.setColorMap(selected.getText()); - ACanvas.getCanvas().repaintAllFromScratch(); - dispose(); - } - }); - - cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - dispose(); - } - }); - - buttonsPanel = new JPanel(); - buttonsPanel.add(okButton); - buttonsPanel.add(cancelButton); - getContentPane().add(buttonsPanel, BorderLayout.SOUTH); - pack(); - - // set the initial location - Frame owner = globals.getGuiFrame(); - int guiWidth = owner.getWidth(); - int guiHeight = owner.getHeight(); - int guiX = owner.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if(guiX+guiWidth+(dialogWidth-guiWidth)/2>screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max(0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), Math.max(0, (guiHeight - dialogHeight) / 3)); - setVisible(true); - } - - public void actionPerformed(ActionEvent e) - { - selected = (JRadioButton) e.getSource(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AColorMapEditor.java b/graphics/AtlantisJava/src/atlantis/gui/AColorMapEditor.java deleted file mode 100755 index 1c534d129677..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AColorMapEditor.java +++ /dev/null @@ -1,281 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Font; -import java.awt.Frame; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JColorChooser; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; -import atlantis.graphics.colormap.AColorMap; -import atlantis.graphics.colormap.MappedColor; -import atlantis.graphics.layout.AFlowLayout; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.ADragListener; -import atlantis.utils.AUtilities; - -/** - * The dialog allows the user to edit the colors maps (at runtime). - */ -public class AColorMapEditor extends JDialog implements ADragListener -{ - private static AColorMapEditor instance; - private ADnDLabel[][] labels = new ADnDLabel[AColorMap.getNumMaps()][AColorMap.getNumColors()]; - private int colorMap; - private int index; - private MappedColor previousColor; - private ADnDLabel source; - - private JPanel colorPanel, buttonsPanel; - private JButton okButton, applyButton, cancelButton; - - private static final AGlobals globals = AGlobals.instance(); - - private AColorMapEditor() - { - super(globals.getGuiFrame(), "Color Map Editor", false); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - setResizable(false); - colorPanel = new JPanel(); - colorPanel.setLayout(new GridLayout(AColorMap.getNumColors() + 1, AColorMap.getNumMaps() + 1, 0, 0)); - - // creating the names row - JLabel padding = new JLabel(""); - colorPanel.add(padding); - for (int i = 0; i < AColorMap.getNumMaps(); i++) - { - JLabel label = new JLabel(" " + AColorMap.getMapNames()[i] + " ", JLabel.CENTER); - label.setFont(new Font("Dialog", Font.BOLD, 14)); - colorPanel.add(label); - } - - // creating the color table - Color[] col; - MouseListener labelMouseListener = new LabelMouseListener(); - - for (int j = 0; j < AColorMap.getNumColors(); j++) - { - JLabel label = new JLabel("" + j, JLabel.CENTER); - label.setFont(new Font("Dialog", Font.BOLD, 14)); - colorPanel.add(label); - for (int i = 0; i < AColorMap.getNumMaps(); i++) - { - col = AColorMap.getColors(i); - labels[i][j] = new ADnDLabel("text", false); - labels[i][j].addDragListener(this); - labels[i][j].setOpaque(true); - labels[i][j].setBackground(col[j]); - labels[i][j].setForeground(col[j]); - labels[i][j].setToolTipText(col[j].getRed() + ", " + col[j].getGreen() + ", " + col[j].getBlue()); - setLineBorder(labels[i][j]); - labels[i][j].addMouseListener(labelMouseListener); - colorPanel.add(labels[i][j]); - } - } - - buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new AFlowLayout(10, 10)); - - okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - applyColors(); - dispose(); - instance = null; - } - }); - buttonsPanel.add(okButton); - - applyButton = new JButton("Apply"); - applyButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - applyColors(); - } - }); - buttonsPanel.add(applyButton); - - cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - dispose(); - instance = null; - } - }); - buttonsPanel.add(cancelButton); - - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(colorPanel, BorderLayout.CENTER); - getContentPane().add(buttonsPanel, BorderLayout.SOUTH); - pack(); - - // set the initial location - Frame owner = globals.getGuiFrame(); - int guiWidth = owner.getWidth(); - int guiHeight = owner.getHeight(); - int guiX = owner.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if(guiX+guiWidth+(dialogWidth-guiWidth)/2>screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max(0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), Math.max(0, (guiHeight - dialogHeight) / 3)); - setVisible(true); - } - - public static AColorMapEditor getInstance() - { - if (instance == null) - { - instance = new AColorMapEditor(); - } - return instance; - } - - public void updateColors() - { - if (instance != null) - { - MappedColor[][] maps = AColorMap.getMaps(); - for (int i = 0; i < maps.length; i++) - for (int j = 0; j < maps[i].length; j++) - { - Color c = maps[i][j]; - - labels[i][j].setBackground(c); - labels[i][j].setForeground(c); - labels[i][j].setToolTipText(c.getRed() + ", " + c.getGreen() + ", " + c.getBlue()); - } - repaint(); - } - } - - public void dragPerformed(Object from, Object to, int action) - { - ADnDLabel fromLabel = (ADnDLabel) from; - ADnDLabel toLabel = (ADnDLabel) to; - - toLabel.setBackground(fromLabel.getBackground()); - } - - class LabelMouseListener extends MouseAdapter - { - public void mouseClicked(MouseEvent e) - { - if (SwingUtilities.isLeftMouseButton(e)) - { - source = (ADnDLabel) e.getSource(); - Color color = JColorChooser.showDialog(instance, "Color Map Editor - Chooser", source.getBackground()); - if (color != null) - { - source.setBackground(color); - source.setForeground(color); - setLineBorder(source); - source.setToolTipText(color.getRed() + ", " + color.getGreen() + ", " + color.getBlue()); - } - } - } - - public void mousePressed(MouseEvent e) - { - source = (ADnDLabel) e.getSource(); - getPosition(); - - if (AUtilities.isRightMouseButton(e)) - { - if (index < 8) - for (int j = 8; j < AColorMap.getNumColors(); j++) - labels[colorMap][j].setBackground(labels[colorMap][index].getBackground()); - else - for (int j = 0; j < 8; j++) - labels[colorMap][j].setForeground(labels[colorMap][index].getForeground()); - - } - else if (SwingUtilities.isMiddleMouseButton(e)) - { - MappedColor[][] maps = AColorMap.getMaps(); - previousColor = maps[colorMap][index]; - MappedColor c = maps[colorMap][index]; - - if (c.getGreen() > 128) - maps[colorMap][index] = maps[colorMap][AColorMap.BK]; - else - maps[colorMap][index] = maps[colorMap][AColorMap.WH]; - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - - public void mouseReleased(MouseEvent e) - { - if (AUtilities.isRightMouseButton(e)) - { - if (index < 8) - for (int j = 8; j < AColorMap.getNumColors(); j++) - labels[colorMap][j].setBackground(labels[colorMap][j].getForeground()); - else - for (int j = 0; j < 8; j++) - labels[colorMap][j].setForeground(labels[colorMap][j].getBackground()); - } - else if (SwingUtilities.isMiddleMouseButton(e)) - { - MappedColor[][] maps = AColorMap.getMaps(); - maps[colorMap][index] = previousColor; - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - } - - private void setLineBorder(JComponent comp) - { - comp.setBorder(BorderFactory.createLineBorder(new Color(207, 207, 207), 3)); - } - - private void getPosition() - { - for (int i = 0; i < AColorMap.getNumMaps(); i++) - for (int j = 0; j < AColorMap.getNumColors(); j++) - if (labels[i][j] == source) - { - colorMap = i; - index = j; - break; - } - } - - private void applyColors() - { - MappedColor[][] maps = AColorMap.getMaps(); - for (int i = 0; i < maps.length; i++) - for (int j = 0; j < maps[i].length; j++) - { - Color c = labels[i][j].getBackground(); - - maps[i][j] = new MappedColor(c.getRed(), c.getGreen(), c.getBlue(), j); - } - AGUI.getGUI().repaintTable(); - ACanvas.getCanvas().repaintAllFromScratch(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AComboBox.java b/graphics/AtlantisJava/src/atlantis/gui/AComboBox.java deleted file mode 100755 index d91a35879b6e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AComboBox.java +++ /dev/null @@ -1,51 +0,0 @@ -package atlantis.gui; - - -import java.awt.event.ItemListener; -import javax.swing.JComboBox; - - -/** - * This class does not generate an ItemEvent - * when the setSelectedItem() method is called. - */ - -public class AComboBox extends JComboBox { - private ItemListener listener; - - /** - * Just calls the superclass constructor. - */ - public AComboBox() { - super(); - } - - /** - * Set the GUIItemListener to be informed of ItemEvents. - * Only one listener is allowed. - * @param aListener - */ - public void setGUIItemListener(ItemListener aListener) { - // Remove any existing listeners. - for (ItemListener listener : this.getItemListeners()) this.removeItemListener(listener); - super.addItemListener(aListener); - listener=aListener; - } - - /** - * Check whether the GUIItemListener has already been set. - * @return true if this AComboBox has a GUIItemListener - */ - public boolean hasGUIItemListener() {return (listener!=null);} - - /** - * Set the selected item without telling any item listeners. - * @param item - */ - public void setGUISelectedItem(Object item) { - if(listener!=null) super.removeItemListener(listener); - super.setSelectedItem(item); - if(listener!=null) super.addItemListener(listener); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AConfigWriter.java b/graphics/AtlantisJava/src/atlantis/gui/AConfigWriter.java deleted file mode 100755 index a903e939ef44..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AConfigWriter.java +++ /dev/null @@ -1,417 +0,0 @@ -package atlantis.gui; - -import java.awt.geom.Point2D; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.util.Vector; - -import javax.swing.JOptionPane; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParametersGroup; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; - -/** - * - * <ul><li>Reads the configuration file (given file name) and makes the corrections - * according to the actual configuration which might have been changed by the - * user.</li> - * <li>Reads parameters differences (values from the parameters store).</li> - * <li>Reads canvas / window configuration.</li> - * <li>Creates XML config files from three above parts.</li></ul> - * - * <p>Writes out the current status. This is not a robust piece of code and make - * break if the format of config.xml is changed by hand. - * This class should throw an exception if there is a problem. - * </p> - * - * @author Gary Taylor, Zdenek Maxa - */ -public class AConfigWriter -{ - - private static ALogger logger = ALogger.getLogger(AConfigWriter.class); - - protected static APar parameterStore = APar.instance(); - - private AConfigWriter() - { - } - - /** - * Main method from the class - * @param sourceFile String - * @return String - */ - public static String getConfiguration(String sourceFile) - { - logger.trace("Trying to read the distribution configuration ..."); - String config = null; - StringBuffer output = new StringBuffer(""); - - config = readConfiguration(sourceFile); - - if(config != null) - { - logger.debug("Loading source configuration successful."); - output.append(config); - output.append(getParametersDifferences()); - output.append(getWindowCorners()); - output.append("\n</AtlantisConfiguration>\n"); - return output.toString(); - } - else - { - logger.error("Loading source configuration failed."); - return null; - } - } // getConfiguration() ------------------------------------------------- - - - - private static String getParametersDifferences() - { - StringBuffer output = new StringBuffer(""); - - output.append("\n\n"); - output.append("\t<ParameterDifferences>\n"); - - AParametersGroup[][] group = parameterStore.getUIGroups(); - for(int i = 0; i < group.length; i++) - { - for(int j = 0; j < group[i].length; j++) - { - Vector v = group[i][j].getParameters(999); - for(int k = 0; k < v.size(); ++k) - { - output.append(((AParameter)v.elementAt(k)).getDifferences(group[i][j].getGroupName())); - } - } - } - output.append("\t</ParameterDifferences>\n\n"); - - return output.toString(); - - } // getParametersDifferences() ----------------------------------------- - - - - private static String getWindowCorners() - { - StringBuffer output = new StringBuffer(""); - - output.append("\n\n"); - output.append("\t<WindowCorners>\n"); - - String[] windowNames = ACanvas.getCanvas().getKnownWindowNames(); - - for(int i = 0; i < windowNames.length; i++) - { - Point2D.Double[] corners = - ACanvas.getCanvas().getWindow(windowNames[i]).getUserCorners(); - if(corners != null) - { - output.append("\t\t<CORNERS windowName=\"" + - windowNames[i] + "\""); - for(int j = 0; j < corners.length; ++j) - { - output.append(" x" + j + "=\"" + corners[j].getX() + "\""); - output.append(" y" + j + "=\"" + corners[j].getY() + "\""); - } - output.append("/>\n"); - } - } - - output.append("\t</WindowCorners>\n\n\n"); - - return output.toString(); - } // getWindowCorners() ------------------------------------------------- - - - // Read one logic line from xml file - // contain <....> or <..../> - private static String readLogicLine(BufferedReader reader) throws IOException - { - String startLine = reader.readLine(); - if(startLine == null) - return null; - - StringBuffer logicLine = new StringBuffer(startLine); - - while(logicLine.indexOf("<") >= 0 && logicLine.indexOf(">") < 0) - { - logicLine.append("\n"); - logicLine.append(reader.readLine()); - } - return logicLine.toString(); - } - - - private static String readConfiguration(String fileName) - { - String groupName = ""; - String parameterName = ""; - AParameter aParam = null; - BufferedReader curr = null; - String str; - StringBuffer buffer = new StringBuffer(""); // working buffer - StringBuffer output = new StringBuffer(""); // final result - boolean inComment = false; - - try - { - logger.debug("Trying to open configuration file: " + fileName); - InputStream fis = AUtilities.getFileAsStream(fileName); - InputStreamReader isr = new InputStreamReader(fis); - curr = new BufferedReader(isr, 10000); - - while((str = readLogicLine(curr)) != null) - { - buffer = new StringBuffer(str); - // in a comment ? - if(buffer.indexOf("<!--") >= 0) - { - inComment = true; - } - if(buffer.indexOf("-->") >= 0) - { - inComment = false; - } - if(!inComment) - { - // nearly finished writing - if(buffer.indexOf("</Parameters>") >= 0) - { - output.append(buffer); - output.append("\n"); - break; - } - - // modification in the initialisation - if(buffer.indexOf("<Canvas") >= 0) { - buffer = replace(buffer, "startupLayout", ACanvas.getCanvas().getCurrentLayout().getName()); - String ar = Double.toString(ACanvas.getCanvas().getAspectRatio()); - buffer = replace(buffer, "aspectRatio", ar); - } - - if(buffer.indexOf("<UsedWindow") >= 0) - { - String name = get(buffer, "name"); - if(name != null) - { - AWindow w = ACanvas.getCanvas().getWindow(name); - if(w != null) - { - if(w.getProjection() != null) - { - buffer = replace(buffer, "projection", w.getProjection().getName()); - } - buffer = replace(buffer, "group", w.getGroupName()); - } - } - } - - if(buffer.indexOf("<Layout") >= 0) - { - String name = get(buffer, "name"); - if(name != null && name.equals(ACanvas.getCanvas().getCurrentLayout().getName())) - { - buffer = replace(buffer, "startupWindow", ACanvas.getCanvas().getCurrentWindowName()); - buffer = replace(buffer, "startup", ACanvas.getCanvas().getStartupString()); - } - } - - // new group encountered - if(buffer.indexOf("<Group") >= 0) - { - groupName = get(buffer, "name"); - } - - // new parameter encountered - aParam = null; - if(buffer.indexOf(" fn=\"") >= 0 && - buffer.indexOf("<StatusRoot") < 0 && - buffer.indexOf("<StatusGroup") < 0) - { - parameterName = removeSpaces(get(buffer, "fn")); - aParam = parameterStore.getUnknown(groupName, parameterName); - } - if(aParam != null) - { - // replacing status - if(buffer.indexOf(" st=\"") >= 0) - { - String status = "OFF"; - if(aParam.getStatus()) - { - status = "ON"; - } - buffer = replace(buffer, "st", status); - } - - // replacing value - if(buffer.indexOf(" va=\"") >= 0) - { - String value = aParam.getValue(); - - if(parameterName.equals("Area/Energy")) - { - value = "0.0"; - } - // for instance Track Collections listbox should - // always remain: - // sn="Track Collections" va="0" pv="none=0" - // current 'value' mustn't be put there - else if(parameterName.endsWith("Collections")) - { - value = "0"; - } - buffer = replace(buffer, "va", value); - - } - - // replacing operator - if(buffer.indexOf(" dop=\"") >= 0) - { - String dop = aParam.getOperator(); - if(dop.equals("<")) - { - dop = "<"; - } - if(dop.equals("<=")) - { - dop = "≤"; - } - if(dop.equals(">")) - { - dop = ">"; - } - if(dop.equals(">=")) - { - dop = "≥"; - } - buffer = replace(buffer, "dop", dop); - } - - // replacing scope - if(buffer.indexOf(" scope=\"") >= 0) - { - if(aParam.getScope() == AParameter.GLOBAL) - { - buffer = replace(buffer, "scope", "GLOBAL"); - } - else if(aParam.getScope() == AParameter.LOCAL) - { - buffer = replace(buffer, "scope", "LOCAL"); - } - } - else if(buffer.indexOf(" fn=\"") > 0) - { - // in a parameter - adding scope if needed - if(aParam.getScope() != parameterStore.getGroup(groupName).getScope()) - { - int index = buffer.indexOf("/>"); - if(index > 0) - { - if(aParam.getScope() == AParameter.GLOBAL) - { - buffer.insert(index, - " scope=\"GLOBAL\""); - } - else - { - buffer.insert(index, - " scope=\"LOCAL\""); - } - } - } - } - } // aParam != null - } // !inComment - output.append(buffer); - output.append("\n"); - } // while - curr.close(); - } // try - catch(IOException ex) - { - String m = "I/O error occured when reading the source " + - "configuration file: " + fileName; - logger.error(m); - logger.debug(m, ex); - output = null; - } - catch(AAtlantisException ae) - { - //throw ae; - } - - - return (output != null) ? output.toString() : null; - - } // readConfiguration() ------------------------------------------------ - - - - /** - * Removing spaces from the parameter name - * @param name String - * @return String - */ - private static String removeSpaces(String name) - { - StringBuffer strBuffer = new StringBuffer(name); - int i = 0; - while(i < strBuffer.length()) - { - if(Character.isWhitespace(strBuffer.charAt(i))) - { - strBuffer.deleteCharAt(i); - } - else - { - i++; - } - } - return new String(strBuffer); - } // removeSpaces() ----------------------------------------------------- - - - private static StringBuffer replace(StringBuffer s, String variable, String text) - { - int name = s.indexOf(variable + "=\""); - if(name >= 0) - { - int start = s.indexOf("\"", name); - int stop = s.indexOf("\"", start + 1); - s.delete(start + 1, stop); - s.insert(start + 1, text); - } - - return s; - } // replace() ---------------------------------------------------------- - - - private static String get(StringBuffer s, String variable) - { - // insert a space before the variable name to prevent from the variable - // name is a substring of another variable name - int name = s.indexOf(" " + variable + "=\""); - if(name >= 0) - { - int start = s.indexOf("\"", name); - int stop = s.indexOf("\"", start + 1); - return s.substring(start + 1, stop); - } - return null; - } // get() -------------------------------------------------------------- - -} // class AConfigWriter ==================================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/AControlButton.java b/graphics/AtlantisJava/src/atlantis/gui/AControlButton.java deleted file mode 100755 index 007cd0427571..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AControlButton.java +++ /dev/null @@ -1,84 +0,0 @@ -package atlantis.gui; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.Timer; -import javax.swing.JButton; - -/** - * This class is not used at the moment. - * Was used to control animation. - */ -public class AControlButton extends JButton { - - public static final int STANDARD_ACTION=0; - public static final int ACCELERATED_ACTION=1; - - private ActionListener controlListener; - private ActionEvent standardAction, acceleratedAction; - private long ticks; - private Timer timer; - private int initialDelay; - private int tickLength; - private int accelerationLimit; - private boolean ignoreClick=false; - - public AControlButton(String text, int initialDelay, int tickLength, int accelerationLimit) { - super(text); - this.initialDelay=initialDelay; - this.tickLength=tickLength; - this.accelerationLimit=accelerationLimit; - initialize(); - } - - private void initialize() { - standardAction=new ActionEvent(this, 0, "", STANDARD_ACTION); - acceleratedAction=new ActionEvent(this, 0, "", ACCELERATED_ACTION); - - timer=new Timer(tickLength, new ActionListener() { - public void actionPerformed(ActionEvent e) { - ticks++; - fireControlActionPerformed(); - ignoreClick=true; - } - }); - timer.setInitialDelay(initialDelay); - - addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - ticks=0; - timer.restart(); - } - - public void mouseReleased(MouseEvent e) { - timer.stop(); - } - - public void mouseClicked(MouseEvent e) { - if(ignoreClick) - ignoreClick=false; - else - fireControlActionPerformed(); - } - }); - - } - - private void fireControlActionPerformed() { - if(controlListener!=null) { - if(ticks>accelerationLimit) - controlListener.actionPerformed(acceleratedAction); - else - controlListener.actionPerformed(standardAction); - } - } - - public void addControlActionListener(ActionListener controlListener) { - if(this.controlListener!=null) - throw new Error("AControlButton supports only 1 listener"); - this.controlListener=controlListener; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ACrashReporter.java b/graphics/AtlantisJava/src/atlantis/gui/ACrashReporter.java deleted file mode 100644 index d47949481a8f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ACrashReporter.java +++ /dev/null @@ -1,232 +0,0 @@ -// NOTE: revert to previous version once support for Java 1.5 is dropped - -package atlantis.gui; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.globals.AGlobals; -import java.awt.Desktop; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStream; -import java.lang.Thread.UncaughtExceptionHandler; -import java.net.URI; -import java.net.URLEncoder; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; - -/** - * This class handles any unhandled exception (program crash). It asks the user for - * permission to submit a crash report by e-mail and pre-formats the message. It then - * fires the default system mail client with this message to allow the user to add - * additional commands and send it. - * - * @author Eric Jansen - */ -public class ACrashReporter implements UncaughtExceptionHandler { - - // Dialog asking for permission to report the crash - private static final String title = "An uncaught exception occured"; - private static final String msg = - "An uncaught exception occured!\n\n" - + "Please help us prevent this in the future by reporting this incident.\n" - + "If you click yes, Atlantis will try to open your mail client and create\n" - + "a preformatted crash report for you. You can review the information\n" - + "and add additional comments before it is sent.\n\n" - + "Do you want to report this crash?"; - - // Address that receives crash reports, chopped up in case spiders go through this code - private static final String address = "atlas-atlantis-developers" + "@" + "cern" + "." + "ch"; - - // Tag for easy filtering, prefix for the mail subject - private static final String tag = "[crash-report] "; - - // System properties included in the report - private static final String[] properties = { - "java.version", "java.vendor", "java.vm.specification.version", - "java.vm.specification.vendor", "java.vm.specification.name", "java.vm.version", - "java.vm.vendor", "java.vm.name", "java.specification.version", "java.specification.vendor", - "java.specification.name", "os.name", "os.arch", "os.version"}; - - /** Flag indicating whether CrashReporter has already been shown */ - private static boolean shownCrashReporter = false; - - /** - * Exception handler for uncaught exceptions in Atlantis. The only way to - * "handle" such an exception is to tell the developers that they failed. - * So that is what we will do. - * @param t thread - * @param e uncaught exception - */ - public void uncaughtException(Thread t, Throwable e) { - // Ensure this only happens once - if (shownCrashReporter) return; - shownCrashReporter = true; - - int confirm = JOptionPane.showConfirmDialog(null, msg, title, - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null); - - if (confirm == JOptionPane.YES_OPTION) { - String report = "### Please explain briefly what you did when the problem occured (optional)\n\n"; - - report += "\n### Exception information\n\n"; - report += getExceptionInformation(e); - - report += "\n### General information\n\n"; - report += getGeneralInformation(); - - report += "\n### Event information\n\n"; - report += getEventInformation(); - - // If possible, we open the mail client and create a new message - if (Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - - if (desktop.isSupported(Desktop.Action.MAIL)) { - String subject = getSubject(e); - try { - URI uri = new URI("mailto:" + address + "?SUBJECT=" - + encode(subject) + "&BODY=" + encode(report)); - desktop.mail(uri); - } catch (Throwable ex) { - // Something went wrong, save report to file instead - saveToFile(report); - } - } else { - // No mail support, save report to file instead - saveToFile(report); - } - } else { - // No desktop support, save report to file instead - saveToFile(report); - } - } - } - - /** - * Provides mail encoding of a string (URLEncoding but with %20 for space) - * @param s string to encode - * @return encoded string - */ - private static String encode(String s) { - try { - return URLEncoder.encode(s, "utf-8").replaceAll("\\+", "%20"); - } catch (Throwable ex) { - return s; - } - } - - /** - * This provides is the backup option if starting the mail client doesn't - * work. The report will be saved to a local file and we ask the user to - * send it. - * @param report crash report contents - */ - private void saveToFile(String report) { - String directory = AGlobals.instance().getHomeDirectory(); - JFileChooser chooser = new JFileChooser(directory); - chooser.setDialogTitle("Save crash report"); - chooser.setSelectedFile(new File("crash-report.txt")); - - // Remind people where this report should go at the top of the file - report = "### Atlantis crash report, please send to " + address + "\n\n" - + report; - - // Continue asking until the user chooses a valid file or cancels - while (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - try { - OutputStream out = new FileOutputStream(file.getAbsolutePath()); - out.write(report.getBytes()); - out.close(); - - JOptionPane.showMessageDialog(null, "The crash report has been saved successfully.\n" - + "Please send the file to " + address); - return; - } catch (Throwable ex) { - JOptionPane.showMessageDialog(null, "Cannot write file: " + ex.toString()); - } - } - } - - /** - * Takes the exception and finds the most helpful mail subject, in general - * the exact location of the crash should be helpful when dealing with a - * lot of reports. - * @param e uncaught exception - * @return subject string - */ - private static String getSubject(Throwable e) { - StackTraceElement[] st = e.getStackTrace(); - if (st.length > 0) { - return tag + st[0].toString(); - } else { - return tag + e.toString(); - } - } - - /** - * Formats general information about the system, Java and Atlantis - * @return information string - */ - private static String getGeneralInformation() { - StringBuilder s = new StringBuilder(); - s.append("Atlantis version = " + AGlobals.instance().getVersion() + "\n"); - - for (String property : properties) { - String value = System.getProperty(property); - if (value == null) { - value = "(not set)"; - } - s.append(property + " = " + value + "\n"); - } - - return s.toString(); - } - - /** - * Formats stack trace and exception information - * @param e unhandled exception - * @return information string - */ - private static String getExceptionInformation(Throwable e) { - StringBuilder s = new StringBuilder(); - String pad = ""; - - s.append(e.toString() + "\n\n"); - - StackTraceElement[] st = e.getStackTrace(); - for (StackTraceElement traceline : st) { - s.append(pad + traceline + "\n"); - pad = " "; - } - - return s.toString(); - } - - /** - * Formats event information, such as source, file, run/event and datatypes - * @return information string - */ - private static String getEventInformation() { - StringBuilder s = new StringBuilder(); - AEventManager eventManager = AEventManager.instance(); - AEvent event = eventManager.getCurrentEvent(); - if (event == null) { - return "(no current event)"; - } - - s.append("Source = " + event.getSourceName() + "\n"); - s.append("Run = " + event.getRunNumber() + "\n"); - s.append("Event = " + event.getEventNumber() + "\n"); - - s.append("\nData types present:\n"); - String[][] info = event.getInfo(); - for (String[] item : info) { - s.append(" " + item[0] + " (" + item[1] + ")\n"); - } - - return s.toString(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ADefaultCellAttribute.java b/graphics/AtlantisJava/src/atlantis/gui/ADefaultCellAttribute.java deleted file mode 100755 index 1a17ebd0ef97..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ADefaultCellAttribute.java +++ /dev/null @@ -1,129 +0,0 @@ -package atlantis.gui; - -import java.awt.Dimension; - -public class ADefaultCellAttribute -{ - public static final int ROW = 0; - public static final int COLUMN = 1; - - // - // !!!! CAUTION !!!!! - // these values must be synchronized to Table data - // - protected int rowSize; - protected int columnSize; - protected int[][][] span; - - public ADefaultCellAttribute() - { - this(1, 1); - } - - public ADefaultCellAttribute(int numRows, int numColumns) - { - setSize(new Dimension(numColumns, numRows)); - } - - protected void initValue() - { - for (int i = 0; i < span.length; i++) - { - for (int j = 0; j < span[i].length; j++) - { - span[i][j][COLUMN] = 1; - span[i][j][ROW] = 1; - } - } - } - - public int[] getSpan(int row, int column) - { - if (isOutOfBounds(row, column)) - { - int[] ret_code = { 1, 1 }; - return ret_code; - } - return span[row][column]; - } - - public boolean isVisible(int row, int column) - { - if (isOutOfBounds(row, column)) - return false; - if ((span[row][column][COLUMN] < 1) - || (span[row][column][ROW] < 1)) - return false; - return true; - } - - public void combine(int[] rows, int[] columns) - { - if (isOutOfBounds(rows, columns)) - return; - int rowSpan = rows.length; - int columnSpan = columns.length; - int startRow = rows[0]; - int startColumn = columns[0]; - for (int i = 0; i < rowSpan; i++) - { - for (int j = 0; j < columnSpan; j++) - { - if ((span[startRow + i][startColumn + j][COLUMN] != 1) - || (span[startRow + i][startColumn + j][ROW] != 1)) - { - return; - } - } - } - for (int i = 0, ii = 0; i < rowSpan; i++, ii--) - { - for (int j = 0, jj = 0; j < columnSpan; j++, jj--) - { - span[startRow + i][startColumn + j][COLUMN] = jj; - span[startRow + i][startColumn + j][ROW] = ii; - } - } - span[startRow][startColumn][COLUMN] = columnSpan; - span[startRow][startColumn][ROW] = rowSpan; - } - - public Dimension getSize() - { - return new Dimension(rowSize, columnSize); - } - - public void setSize(Dimension size) - { - columnSize = size.width; - rowSize = size.height; - span = new int[rowSize][columnSize][2]; // 2: COLUMN,ROW - initValue(); - } - - protected boolean isOutOfBounds(int row, int column) - { - if ((row < 0) || (rowSize <= row) || (column < 0) - || (columnSize <= column)) - { - return true; - } - return false; - } - - protected boolean isOutOfBounds(int[] rows, int[] columns) - { - for (int i = 0; i < rows.length; i++) - { - if ((rows[i] < 0) || (rowSize <= rows[i])) - return true; - } - for (int i = 0; i < columns.length; i++) - { - if ((columns[i] < 0) || (columnSize <= columns[i])) - return true; - } - return false; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ADemoDialog.java b/graphics/AtlantisJava/src/atlantis/gui/ADemoDialog.java deleted file mode 100755 index be69b6c21e26..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ADemoDialog.java +++ /dev/null @@ -1,434 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSeparator; -import javax.swing.JSpinner; -import javax.swing.JTextField; -import javax.swing.SpinnerNumberModel; -import javax.swing.SwingConstants; -import javax.swing.WindowConstants; -import javax.swing.border.Border; - -import java.util.Arrays; -import java.util.Vector; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.projection.AProjectionsManager; -import atlantis.parameters.ACommandProcessor; -import atlantis.utils.ALogger; - - - - - -/** - * A Dialog in which user can set parameters for demo mode, as well as start and - * stop the demo mode. This class holds and controls the demo loop thread. - * This is a singleton, but there is no point why it needs to be. - * - * @author Sebastian Boeser (with traces from Qiang Lu) - */ -public class ADemoDialog extends JFrame implements ActionListener -{ - //Get a logger - private final static ALogger logger = ALogger.getLogger(ADemoDialog.class); - - //Some GUI elements - private JSpinner timerSpinner; - private SpinnerNumberModel timerSpinnerModel; - private static final Integer TIMER_MIN = new Integer(1); - private static final Integer TIMER_MAX = new Integer(120); - private static final Integer TIMER_INIT = new Integer(3); - - //The text label showing the projection sequence - private JTextField sequenceTextField = null; - //And the panel housing these - private JPanel projControlPanel=null; - - //The action buttons - private JButton startButton = null; - private JButton stopButton = null; - private JButton closeButton = null; - - - //The thread that is runing the loop - private ADemoLoop demo = null; - - private static final AGlobals globals = AGlobals.instance(); - - //The singleton instance - private static ADemoDialog instance = null; - - /** - * Public access-instantiation accessor - * @return the singleton instance - */ - public static ADemoDialog getInstance(){ - //Create instance if needed - if (instance == null) instance = new ADemoDialog(); - //and return it - return instance; - } - - /** - * Private Constructor - */ - private ADemoDialog() { - super("Demo"); - createGUI(); - pack(); - } - - // initialize the GUI - private void createGUI() - { - JPanel timerControlPanel = createTimeControlPanel(); - projControlPanel = createProjControlPanel(); - JPanel buttonControlPanel = createButtonControlPanel(); - - JPanel contentPane = new JPanel(new GridBagLayout()); - contentPane.setOpaque(true); - GridBagConstraints c = new GridBagConstraints(); - c.weightx = 1; - c.weighty = 1; - c.gridwidth = GridBagConstraints.REMAINDER; - c.fill=GridBagConstraints.HORIZONTAL; - c.anchor = GridBagConstraints.CENTER; - contentPane.add(timerControlPanel, c); - contentPane.add(projControlPanel, c); - contentPane.add(buttonControlPanel, c); - this.setResizable(false); - this.setContentPane(contentPane); - this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - this.setAlwaysOnTop(true); - - // set the initial location - Frame gui = globals.getGuiFrame(); - int guiWidth = gui.getWidth(); - int guiHeight = gui.getHeight(); - int guiX = gui.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if(guiX + guiWidth + (dialogWidth - guiWidth) / 2 > screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), - Math.max(0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), - Math.max(0, (guiHeight - dialogHeight) / 3)); - AIcon.setIconImage(this); - } - - private JPanel createTimeControlPanel() - { - - JPanel aPanel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - aPanel.setOpaque(true); - //aPanel.setPreferredSize(new Dimension(FRAME_WIDTH, PANEL_HEIGHT)); - aPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); - - //Add timer label - JLabel timerLabel= new JLabel("Interval"); - c.gridwidth = 1; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx=1; - c.gridx=0; - aPanel.add(timerLabel,c); - //Add timer spinner - timerSpinner = new JSpinner(); - timerSpinner.setEnabled(true); - timerSpinnerModel = new SpinnerNumberModel(TIMER_INIT, TIMER_MIN, - TIMER_MAX, new Integer(1)); - timerSpinner.setModel(timerSpinnerModel); - c.gridwidth = 1; - c.weightx=1; - c.fill = GridBagConstraints.HORIZONTAL; - c.gridx=1; - aPanel.add(timerSpinner,c); - //Add units label - c.weightx = 0.5; - c.gridwidth = GridBagConstraints.REMAINDER; - c.gridx=2; - aPanel.add(new JLabel(" sec"),c); - - - //Add the labels for th selected projections - c.gridx=GridBagConstraints.RELATIVE; - c.weightx=1; - c.gridwidth=1; - aPanel.add(new JLabel("Sequence:"), c); - - //Now generate the sequence label and make it span the remaining columns - sequenceTextField = new JTextField(); - c.gridwidth=GridBagConstraints.REMAINDER; - c.fill=GridBagConstraints.HORIZONTAL; - aPanel.add(sequenceTextField,c); - - return aPanel; - } - - private JPanel createProjControlPanel() - { - - JPanel aPanel = new JPanel(new GridLayout(3,4)); - aPanel.setOpaque(true); - Border outerBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); - Border innerBorder = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY), - "Add Projection / Action"); - aPanel.setBorder(BorderFactory.createCompoundBorder(outerBorder, innerBorder)); - - //Create the list of check boxes - for (String projName : AProjectionsManager.getKnownProjectionNames()){ - - //Check wether this projection name should be used in the demo dialog - if (AProjectionsManager.useProjectionInDemoMode(projName)){ - - //Create the respective button with the screen name of the projection - String projScreenName = AProjectionsManager.getProjection(projName).getScreenName(); - JButton projButton = new JButton(projScreenName); - //Store the name of the projection as the name of the JCheckBox - //Where we can retrieve it once the demo dialog is started - projButton.setName(projName); - projButton.setFocusPainted(false); - - //Add ourselves as action listener of this button - projButton.addActionListener(this); - aPanel.add(projButton); - } - } - //Also add a "next event" button - JButton nextEvtBut = new JButton("Next event"); - nextEvtBut.setName("NE"); - nextEvtBut.addActionListener(this); - aPanel.add(nextEvtBut); - - return aPanel; - } - - private JPanel createButtonControlPanel() - { - //final int PANEL_HEIGHT = 40; - Dimension buttonDimension = new Dimension(100,25); - - JPanel aPanel = new JPanel(new GridBagLayout()); - aPanel.setOpaque(true); - //aPanel.setPreferredSize(new Dimension(FRAME_WIDTH, PANEL_HEIGHT)); - aPanel.setBorder(BorderFactory.createEmptyBorder(5,5,10,5)); - - GridBagConstraints c = new GridBagConstraints(); - startButton = new JButton("Start"); - //startButton.setFocusPainted(false); - startButton.setEnabled(true); - startButton.setPreferredSize(buttonDimension); - startButton.addActionListener(this); - c.weightx = 1; - c.weighty = 1; - c.anchor = GridBagConstraints.CENTER; - aPanel.add(startButton, c); - stopButton = new JButton("Stop"); - stopButton.setFocusPainted(false); - stopButton.setEnabled(false); - stopButton.setPreferredSize(buttonDimension); - stopButton.addActionListener(this); - aPanel.add(stopButton, c); - JSeparator aSeparator = new JSeparator(SwingConstants.VERTICAL); - //aSeparator.setPreferredSize(new Dimension(5, PANEL_HEIGHT)); - aPanel.add(aSeparator, c); - closeButton = new JButton("Close"); - closeButton.setFocusPainted(false); - closeButton.setEnabled(true); - closeButton.setPreferredSize(buttonDimension); - closeButton.addActionListener(this); - c.gridwidth = GridBagConstraints.REMAINDER; - aPanel.add(closeButton, c); - - return aPanel; - } - - /** - * @return true if demo thread is running, otherwise false - */ - boolean isRunning(){ - //no thread -> false - if (demo == null) return false; - //otherwise use thread status - return demo.isRunning(); - } - - - // return interval in millisecond - int getTimerInterval() - { - return 1000 * timerSpinnerModel.getNumber().intValue(); - } - - public void setTimerInterval(Integer intervalInSec) - { - try { - timerSpinnerModel.setValue(intervalInSec); - } catch (IllegalArgumentException iae){ - //Just ignore in case of illegal argument - } - } - - - /** - * Set the sequence of projections - * @param projNames colon seperated list of projection names - */ - public void setSequence(String projNames){ - //store this in our text entry - sequenceTextField.setText(projNames); - } - - /** - * Set the default sequence - */ - public void setDefaultSequence(){ - //Create default sequence - StringBuilder sequence = new StringBuilder(); - //Add all default projections - for (String projName : AProjectionsManager.getKnownProjectionNames()){ - if (AProjectionsManager.defaultProjectionInDemoMode(projName)) - sequence.append(projName+":"); - } - //End sequence with next event - sequence.append("NE"); - //And set this in the text field - sequenceTextField.setText(sequence.toString()); - } - - /** - * @return a vector with the names of the projections - */ - private Vector<String> getSequence() - { - return new Vector<String>(Arrays.asList(sequenceTextField.getText().split(":"))); - } - - /** - * Validate whether the given sequence is valid - * @return the number of selected projections - */ - private boolean validateSequence() - { - //Get the projections sequence - Vector<String> sequence = getSequence(); - - //Check on number of projections - if(sequence.size() < 1){ - JOptionPane.showMessageDialog(this, - "No projection/event is selected, please select at least select one", - "Warning", JOptionPane.WARNING_MESSAGE); - return false; - } - - //Now check each item of the sequence for validity - for (String projName : sequence){ - //The "new event" action is an exception here - if (projName.equals("NE")) continue; - //check wether this is a known and allowed projection - if ((! Arrays.asList(AProjectionsManager.getKnownProjectionNames()).contains(projName)) || - (! AProjectionsManager.useProjectionInDemoMode(projName))) - { - JOptionPane.showMessageDialog(this, - "Not a valid projection name: '"+projName+"'", - "Warning", JOptionPane.WARNING_MESSAGE); - return false; - } - - } - - //Seems all okay - return true; - } - - - - /** - * Start the demo thread - */ - public void startDemo() - { - - //First make sure some projections have been selected - if (!validateSequence()) return; - - //Set single full window mode - ACommandProcessor.receive("WW"); - - //Start the demo, setting "stopOnNoMoreEvents" to false - //TODO: make stopOnNoMoreEvents a checkbox in the Dialog - demo = new ADemoLoop(getTimerInterval(),getSequence(),false); - demo.startDemoLoop(); - //Now disable all GUI elements - timerSpinner.setEnabled(false); - sequenceTextField.setEnabled(false); - for (Component comp: projControlPanel.getComponents()) comp.setEnabled(false); - startButton.setEnabled(false); - stopButton.setEnabled(true); - closeButton.setEnabled(false); - //Do not allowe the user to close the window, so he doesn't loose access - this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - } - - /** - * Stop the demo thread - */ - synchronized void stopDemo() - { - //exit the demo - demo.stopDemoLoop(); - //Now reenable all GUI elements - timerSpinner.setEnabled(true); - sequenceTextField.setEnabled(true); - for (Component comp: projControlPanel.getComponents()) comp.setEnabled(true); - stopButton.setEnabled(false); - startButton.setEnabled(true); - closeButton.setEnabled(true); - - this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - } - - /** - * Implementation of the Action listener - * - gets called for every button that is pressed - * @param e the action event - */ - public void actionPerformed(ActionEvent e) { - //Check for action buttons first - if (e.getSource() == startButton ) startDemo(); - else if (e.getSource() == stopButton) stopDemo(); - else if (e.getSource() == closeButton ) dispose(); - //this should be one of the projection buttons - else { - //get the projectio name to append - String projName = ((JButton)e.getSource()).getName(); - //get the existing sequence - String sequence = sequenceTextField.getText(); - //append new projection - sequence += ((sequence.length()!=0) ? ":" : "") + projName; - //Set this as new sequence - sequenceTextField.setText(sequence); - } - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ADemoFileChooser.java b/graphics/AtlantisJava/src/atlantis/gui/ADemoFileChooser.java deleted file mode 100755 index c9768ef7aab8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ADemoFileChooser.java +++ /dev/null @@ -1,41 +0,0 @@ -package atlantis.gui; - -import java.awt.Component; -import java.io.File; - -import atlantis.config.ADefaultValues; - -/** -* A dialog which appears when a user asks to read a new event. -* -* @author Qiang Lu -*/ -public class ADemoFileChooser extends AXMLFileChooser -{ - private File fileSelected; - - public ADemoFileChooser(String path, Component parent) - { - super(path, parent); - } - - public boolean processSelectedFile(File file) - { - if (file.canRead()) - { - // save last visited location - ADefaultValues.set("LastEventFilesSourceDir", file.getParent() + - System.getProperty("file.separator")); - - fileSelected = file; - return true; - } - return false; - } - - public File getFileSelected() - { - return fileSelected; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ADemoLoop.java b/graphics/AtlantisJava/src/atlantis/gui/ADemoLoop.java deleted file mode 100755 index 85f387a97080..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ADemoLoop.java +++ /dev/null @@ -1,200 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.util.ArrayList; - -import atlantis.canvas.ACanvas; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionsManager; -import atlantis.parameters.ACommandProcessor; -import atlantis.utils.ALogger; -import java.awt.event.ActionListener; -import java.util.Iterator; -import java.util.Vector; -import javax.swing.JOptionPane; - -import javax.swing.Timer; - -/** - * A class to automatically loop over different projections given in a - * colon-seperated list. The special projection name "NE" stands for next event. - * This is also used in headless mode to generate an event loop. The stopOnNoMoreEvents - * allows to control wether the loop ends if no more events can be obtained. - * - * NOTE: The previous implementation of this was using java.awt.Thread - we are - * far from providing the standards of a thread-safe application. - * - * @author Sebastian Boeser - */ -public class ADemoLoop extends Timer implements ActionListener -{ - //The logger - private static ALogger logger = ALogger.getLogger(ADemoLoop.class); - - //whether to stop the loop if there are no more events - private boolean stopOnNoMoreEvents = false; - - //A list of projections to show - private final ArrayList<String> projectionList = new ArrayList<String>(); - - //An iterator that loops through the list above - private Iterator<String> projIter = null; - - private static final AGlobals globals = AGlobals.instance(); - - /** - * Fully specified Constructor - * @param sleepTime time to sleep inbetween projections in milliseconds - * @param projectionList list of projections to loop through - * @param stopOnNoMoreEvents wether to stop loop if there are no more events - */ - public ADemoLoop(int sleepTime, Vector<String> projectionList, boolean stopOnNoMoreEvents){ - - //Initialize the timer - super(sleepTime,null); - addActionListener(this); - - //Initialize the timer to start immediately only on first event - setInitialDelay(0); - - //Store the list of projections - for (String projName : projectionList) - this.projectionList.add(projName); - - //Set the stop on no more events flag - this.stopOnNoMoreEvents = stopOnNoMoreEvents; - - } - - - /*** - * prepare the demo loop and start the timer thread - */ - public void startDemoLoop(){ - AGlobals.instance().setDemoMode(true); - - //be verbose - logger.trace("Starting demo loop with interval "+Integer.toString(getDelay())+ - " ms and projections "+projectionList.toString()); - - //Generate the list iterator to point to the start of the list - projIter = projectionList.listIterator(0); - - //Finally start the loop - start(); - } - - /** - * stop the demo loop - */ - public void stopDemoLoop(){ - stop(); - globals.setDemoMode(true); - } - - /** - * This gets fired by the timer every time after it returns from sleep - * @param event the action event - */ - public void actionPerformed(ActionEvent event) { - - //If we have reached the end, start from beginning - if (! projIter.hasNext()) projIter = projectionList.listIterator(0); - - //proceed to next element in list - String projName = projIter.next(); - - //add debugging output - logger.trace("Next in demo loop: "+projName); - - //Check if this is a next event tag - if (projName.equals("NE")) { - //Change the event or stop loop if this did not succeed - if (!changeEvent()) { - //stop the loop - stop(); - //notify everyone that we are done (so the application can finish) - synchronized(this) { notifyAll(); } - } - - //Immediatly go to the next projection if this is not just a nextEvent again - Iterator<String> nextProjIter = projIter; - if (nextProjIter.hasNext() && (!nextProjIter.next().equals("NE"))) restart(); - //be verbose - logger.trace("Timer is"+(isRunning()?" running":" stopped")+" with "+getDelay()+" ms delay"); - } - //else just change the projection - else changeProjection(projName); - - } - - - /** - * Change the current projection to the one given by projName - * and select that as active projeciton in the GUI - * @param projName the name of the projection - */ - private void changeProjection(String projName) - { - //First get the projection object - AProjection p = AProjectionsManager.getProjection(projName); - //And set the projection - ACanvas.getCanvas().getCurrentWindow().setProjection(p); - //Make sure aspect ratio is always okay - if(projName.equals("YX")||projName.equals("RZ")||projName.equals("XZ")||projName.equals("YZ")) - ((AProjection2D) p).setAspectRatio1(ACanvas.getCanvas().getCurrentWindow()); - //Finally Change the current GUI selection by signaling the command processor - ACommandProcessor.receive(projName + "."); - } - - /** - * Switch to the next event - * @return if the return value is true, the loop will be continued, otherwise not - */ - private boolean changeEvent(){ - Frame gui = globals.getGuiFrame(); - //try reading the next event - try{ - //Then get next event - AEventManager eventManager = AEventManager.instance(); - eventManager.nextEvent(); - return true; - } catch (NoMoreEventsException ex) { - //Just wait for next event - logger.info("No next event for demo - "+((stopOnNoMoreEvents)?"stopping loop":"keeping same")); - //return wether loop shall be stopped due to this or not. - return (!stopOnNoMoreEvents); - } catch (InvalidEventSourceException ex) { - //log warning - logger.warn("Invalid event source for demo - " - +((stopOnNoMoreEvents)?"stopping loop":"will try again") - +"\n"+ex.getCauseMessages()); - //quit here in headless mode - if (AGlobals.isAtlantisHeadless()) return (!stopOnNoMoreEvents); - //Otherwise give a user warning - JOptionPane.showMessageDialog(gui, - "Invalid event source for demo - stopping loop", - "Warning", JOptionPane.WARNING_MESSAGE); - //Always quit the loop if not in headless mode - return false; - } catch (ReadEventException ex) { - //log warning - logger.warn("Received invalid event - stopping loop:\n"+ex.getCauseMessages()); - //and tell user unless we are in headless - if (AGlobals.isAtlantisHeadless()) return false; - //in headless mode, don't show a dialog - JOptionPane.showMessageDialog(gui, - "Received invalid event for demo - stopping loop", - "Warning", JOptionPane.WARNING_MESSAGE); - return false; - } - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/gui/AEventLoopDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AEventLoopDialog.java deleted file mode 100755 index 152bc9f5c2cd..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AEventLoopDialog.java +++ /dev/null @@ -1,346 +0,0 @@ -package atlantis.gui; - -import java.util.Date; - -import java.awt.Color; -import java.awt.Frame; -import java.awt.event.WindowListener; -import java.awt.event.WindowEvent; -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; -import java.awt.BorderLayout; -import java.awt.Dimension; - -import java.text.SimpleDateFormat; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.border.Border; -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSpinner; -import javax.swing.SpinnerNumberModel; -import javax.swing.Timer; - -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.output.ALogInterface; -import atlantis.utils.ALogger; - - -/** - * Read events in a loop using a given timer intervall - * This is a singleton class using the getInstance pattern. - * - * @author Sebastian Boeser - */ -public class AEventLoopDialog extends JFrame - implements WindowListener, ActionListener, ChangeListener -{ - // the logger - private static ALogger logger = ALogger.getLogger(AEventLoopDialog.class); - - private static final AGlobals globals = AGlobals.instance(); - - //create singleton instance - private static AEventLoopDialog instance; - - // some GUI attributes - private static final String TITLE = "Event loop"; - private static final Integer SPINNER_INIT = new Integer(4); - private static final Integer SPINNER_MIN = new Integer(1); - private static final Integer SPINNER_MAX = new Integer(120); - private static final Integer SPINNER_STEP = new Integer(2); - - // We don't need more than one button - private static JButton button = null; - - //The update time in seconds - private static JSpinner updateIntervalSpinner = null; - //A logging pane - private static ALogPane log = null; - - // The update timer - private static final Timer timer = new Timer(SPINNER_INIT*1000,null); - - - private AEventLoopDialog() - { - //Create dialog with title - super(TITLE); - - //Construct GUI - createGUI(); - - } // AReadEventFromServerDialog() --------------------------------------- - - /** - * @return the singleton instance - */ - public static AEventLoopDialog getInstance(){ - if (instance == null) instance = new AEventLoopDialog(); - return instance; - } // getInstance() ------------------------------------------------------ - - - /** - * Non-static set functions so user is forced to obtain an instance first - * @param UpdateInterval the update intervall - */ - public void setUpdateInterval(int UpdateInterval) { - try { - updateIntervalSpinner.setValue(UpdateInterval); - } catch (IllegalArgumentException iae){ - //Just ignore in case of an invalid argument - } - } - - /** - * Design of the dialog - panels, buttons, etc - */ - private void createGUI() { - - //Definde default component gap - final int defaultGap = 5; - final Border defaultBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10); - - /** - * Looping panel - */ - //Create a spinner for the update time - SpinnerNumberModel numberModel = new SpinnerNumberModel(SPINNER_INIT, SPINNER_MIN, SPINNER_MAX, SPINNER_STEP); - updateIntervalSpinner = new JSpinner(numberModel); - updateIntervalSpinner.addChangeListener(this); - - // looping panel - JPanel loopingPanel = new JPanel(); - loopingPanel.setLayout(new BorderLayout(defaultGap, 0)); - loopingPanel.setBorder(defaultBorder); - loopingPanel.add(updateIntervalSpinner, BorderLayout.CENTER); - loopingPanel.add(new JLabel("[secs]"), BorderLayout.EAST); - - - /** - * Main action buttons - */ - // action button panel - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new BorderLayout(0, 0)); - buttonsPanel.setBorder(defaultBorder); - button = new JButton("Start"); - //Set a preferred size so it doesn't change if we change its label - button.setPreferredSize(new Dimension(100,25)); - buttonsPanel.add(button, BorderLayout.CENTER); - //React when button is pressed - button.addActionListener(this); - - //the top row panel - JPanel topRowPanel = new JPanel(); - topRowPanel.setLayout(new BorderLayout(defaultGap, 0)); - topRowPanel.add(loopingPanel, BorderLayout.CENTER); - topRowPanel.add(buttonsPanel, BorderLayout.EAST); - - - - /** - * Logging panel - */ - // the logging panel at the bottom - JPanel logPanel = new JPanel(); - logPanel.setLayout(new BorderLayout(0, 0)); - logPanel.setBorder(defaultBorder); - //Add a logpane to it - log = new ALogPane(); - log.setEnabled(true); - log.setBorder(BorderFactory.createLineBorder(Color.black)); - log.setRequestFocusEnabled(false); - log.setPreferredSize(new Dimension(350, 200)); - logPanel.add(log, BorderLayout.CENTER); - - - // main panel - JPanel mainPanel = new JPanel(); - mainPanel.setLayout(new BorderLayout(0, 0)); - // logPanel must be CENTER to be resisable vertically (otherwise, - // it keeps its size), hence upper part must be extra panel for - // NORTH position to accommodate topRowPanel and loopingPanel - JPanel upperMainPanel = new JPanel(); - upperMainPanel.setLayout(new BorderLayout(0, 0)); - upperMainPanel.add(topRowPanel, BorderLayout.NORTH); - mainPanel.add(upperMainPanel, BorderLayout.NORTH); - mainPanel.add(logPanel, BorderLayout.CENTER); - - // Finally add this MainPanel - getContentPane().add(mainPanel, BorderLayout.CENTER); - - //arrange all GUI items - pack(); - - //Set location to top left GUI corner so it does not hide Canvas - setLocation(globals.getGuiFrame().getLocation()); - - //give it a nice icon when minimized - AIcon.setIconImage(this); - - - /** - * end of dialog design, set listeners and handlers - */ //add ourselfs as state listeners to catch closing - addWindowListener(this); - - //also set ourselfs as action handler for the timer - timer.addActionListener(this); - //And have the timer start immediately on the first event - timer.setInitialDelay(0); - - - - } // createGUI() -------------------------------------------------------- - - /** - * State change events are only generated by the updateIntervalSpinner - * @param e the Change event - */ - public void stateChanged(ChangeEvent e) { - //Set timer delay to new value - timer.setDelay((Integer)updateIntervalSpinner.getValue()*1000); - } - - /** - * Stop event loop when closing the window - * @param e the Window event - */ - public void windowClosing(WindowEvent e){ - - //Make sure the timer is not running anymore - if (timer.isRunning()) stopEventLoop(); - - } // closeActionsAndDispose() ------------------------------------------ - - /** - * Small helper to print a message with timestamp to the log - * @param msg the message - */ - private void timeStampedLog(String msg){ - - //Record the time of the incident - SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - log.append("\n"+dateForm.format(new Date())+" ",ALogInterface.NORMAL_BOLD); - log.append(msg); - } - - - /** - * Try to read the next event from the server, handle all exceptions - */ - private void getNextEvent() { - - //try reading the next event - try{ - //tell the user - timeStampedLog("Reading next event..."); - //Then get next event - AEventManager.instance().nextEvent(); - } catch (NoMoreEventsException ex) { - //Just wait for next event - log.append("\n -- No next event available"); - logger.info("No next event available:\n"+ex.getCauseMessages()); - } catch (InvalidEventSourceException ex) { - //Do not break loop on invalid event source -- good for ACR - log.append("\n -- Invalid event source"); - logger.warn("Invalid event source:\n"+ex.getCauseMessages()); - } catch (ReadEventException ex) { - //Don't break loop on invalid events - log.append("\n -- Received invalid event"); - logger.warn("Received invalid event:\n"+ex.getCauseMessages()); - } - } - - /** - * Stop the event loop, reenabling all GUI elements - */ - private void stopEventLoop(){ - - //Stop the timer loop - timer.stop(); - - //Reset button label and states - button.setText("Start"); - updateIntervalSpinner.setEnabled(true); - - //tell the user - timeStampedLog("Stopped event loop..."); - } - - /** - * Start the event loop, disable all GUI elements - is public to facilitate - * automated start of event loop (e.g with command-line options) - */ - public void startEventLoop(){ - - //tell the user - timeStampedLog("Starting event loop..."); - - //enable/disable buttons - updateIntervalSpinner.setEnabled(false); - button.setText("Stop"); - - //Stop the timer loop - timer.start(); - - } - - /** - * Called every time the button is hit or we get a callback from the timer - * @param e the action event - */ - public void actionPerformed(ActionEvent e) { - - //Check if we got called from the timer loop - if (e.getSource() == timer){ - //If so just read next event and return - getNextEvent(); - return; - } - - //Being called because button was hit. - //Check if event loop is running - stop it - if (timer.isRunning()) { - stopEventLoop(); - } else { - startEventLoop(); - } - } - - - /** - * Show the dialog - */ - public void showDialog() { - - // clear the iconified bit (no matter whether or not it is iconified) - setExtendedState(getExtendedState() & ~Frame.ICONIFIED); - setVisible(true); - - } // show() ---------------------------------------------------- - - - /** - * Empty default implementation of WindowListeners - * @param e - */ - public void windowOpened(WindowEvent e) {} - public void windowClosed(WindowEvent e) {} - public void windowIconified(WindowEvent e) {} - public void windowDeiconified(WindowEvent e) {} - public void windowActivated(WindowEvent e) {} - public void windowDeactivated(WindowEvent e) {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AEventPropertiesDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AEventPropertiesDialog.java deleted file mode 100755 index 8b7a7a332781..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AEventPropertiesDialog.java +++ /dev/null @@ -1,721 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.Font; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.util.List; -import java.util.Vector; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.JTable; -import javax.swing.JScrollPane; - -import com.Ostermiller.util.CSVParser; - -import atlantis.data.ACalorimeterData; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.data.ALVL1ResultData; -import atlantis.event.ANewEventListener; -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.graphics.layout.AFlowLayout; -import atlantis.data.ATriggerInfoData; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; - -/** - * The dialog which is used to display the current event properties. - */ -public class AEventPropertiesDialog extends JFrame implements ANewEventListener -{ - private static ALogger logger = ALogger.getLogger(AEventPropertiesDialog.class); - private static AEventManager eventManager = AEventManager.instance(); - - private JTable table, propertiesTable, level1Table, level2Table, - eventFilterTable, trigInfoItemsTable, trigInfoStreamTable, - userSelectedTable, mbtsTable; - private JPanel buttonsPanel; - private JTabbedPane tabbedPane; - private JButton okButton; - private JButton refreshButton; - private static AEventPropertiesDialog instance = null; - protected static String[] USER_ITEMS = null; - private static final String LOOKUP_FILENAME = "epusti.csv"; - private static final AGlobals globals = AGlobals.instance(); - private static final String LOOKUP_FILE = - globals.getHomeDirectory() + "configuration" + - System.getProperty("file.separator") + - LOOKUP_FILENAME; - - public static boolean isInUse() - { - if(instance ==null || !instance.isVisible()) - return false; - else - return true; - } - - public static AEventPropertiesDialog getInstance() - { - if (instance == null) - instance = new AEventPropertiesDialog(); - return instance; - } - - public AEventPropertiesDialog() - { - Frame gui = globals.getGuiFrame(); - eventManager.addNewEventListener(this); - this.setTitle("Event Properties Dialog"); - AIcon.setIconImage(this); - // setResizable(false); - - // From Java 1.5 we can tell the window to be always on top - this.setAlwaysOnTop(true); - - // check whether there is any event data are present - if (eventManager.getCurrentEvent() == null) - { - JOptionPane.showMessageDialog(gui, - "Current event is null\n" + "(no event data currently present)", - "Event null", JOptionPane.WARNING_MESSAGE); - return; - } - - try - { - readFromLookupFile(); - } - catch(AAtlantisException ex) - { - logger.warn(": reading " + LOOKUP_FILE + - " failed, user trigger items will not " + - "be available, reason: " + ex.getMessage(), ex); - } - - fillTabbedPane(0); - addButtonPane(); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - pack(); - - // set the initial location - int guiWidth = gui.getWidth(); - int guiHeight = gui.getHeight(); - int guiX = gui.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit() - .getScreenSize().getWidth()); - if (guiX + guiWidth + (dialogWidth - guiWidth) / 2 > screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max( - 0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), - Math.max(0, (guiHeight - dialogHeight) / 3)); - - setVisible(true); - } - - private void readFromLookupFile() throws AAtlantisException - { - if(USER_ITEMS==null) - { - try - { - InputStream is = AUtilities.getFileAsStream(LOOKUP_FILE); - CSVParser parser = new CSVParser(is); - parser.setCommentStart("#"); - String valueArray = parser.nextValue(); // shall now contain all values - CSVParser parserArray = new CSVParser(new StringReader(valueArray)); - String[][] s = parserArray.getAllValues(); - if(s!=null) - { - USER_ITEMS = s[0]; - } - } - catch (IOException e) - { - throw new AAtlantisException("exception while reading file: " + - LOOKUP_FILE); - } - catch (AAtlantisException e) - { - throw e; - } - } - } - - - public void dispose() - { - instance = null; - super.dispose(); - } - - public void updatePane() - { - - JTabbedPane currentTabbedPane = (JTabbedPane) getContentPane().getComponent(0); - int currentIndex = currentTabbedPane.getSelectedIndex(); - getContentPane().removeAll(); - validate(); - - fillTabbedPane(currentIndex); - addButtonPane(); - - pack(); - } - - private void addButtonPane() - { - okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - dispose(); - } - }); - - // Add button to refresh data after cuts have been applied - refreshButton = new JButton("Refresh Cuts"); - refreshButton.setToolTipText("Display data passing cuts for active window"); - refreshButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - updatePane(); - } - }); - - buttonsPanel = new JPanel(new AFlowLayout(10, 5)); - buttonsPanel.add(okButton); - buttonsPanel.add(refreshButton); - getContentPane().add(buttonsPanel, BorderLayout.SOUTH); - - - - } - - /** fills the tabbed pane with the event information - * @param index the currently selected index - */ - private void fillTabbedPane(int index) - { - fillTablePane(); - AEvent event = eventManager.getCurrentEvent(); - - //now need to loop over the lvl1result collections - Vector<String> keys = event.getCollections().get("LVL1Result"); - ALVL1ResultData lvl1ResultData[]=null; - if(keys!=null){ - lvl1ResultData = new ALVL1ResultData[keys.size()]; - for(int i=0; i<keys.size();i++) - { - String colLvl1= "LVL1Result" + (String)keys.elementAt(i); - lvl1ResultData[i] = (ALVL1ResultData) event.get(colLvl1); - } - } - - ATriggerInfoData triggerInfoData = event.getTriggerInfoData(); - fillPropertiesPane(lvl1ResultData, triggerInfoData); - String[][] L1_items = fillLevel1Pane(lvl1ResultData); - String[][] L2_items = fillLevel2Pane(lvl1ResultData); - String[][] EF_items = fillEventFilterPane(lvl1ResultData); - fillTrigInfoItemsPane(triggerInfoData); - fillTrigInfoStreamPane(triggerInfoData); - fillUserSelectedPane(L1_items, L2_items, EF_items); - fillmbtsPane(); - - tabbedPane = new JTabbedPane(); - tabbedPane.addTab("Number of Hits", new JScrollPane(table)); - tabbedPane.addTab("Properties", new JScrollPane(propertiesTable)); - tabbedPane.addTab("Level 1 Trigger Items", new JScrollPane(level1Table)); - tabbedPane.addTab("Level 2 Trigger Items", new JScrollPane(level2Table)); - tabbedPane.addTab("Event Filter Trigger Items", new JScrollPane(eventFilterTable)); - tabbedPane.addTab("Trigger Info Items", new JScrollPane(trigInfoItemsTable)); - tabbedPane.addTab("Trigger Info Stream Tag", new JScrollPane(trigInfoStreamTable)); - tabbedPane.addTab("User Selected Trigger Items", new JScrollPane(userSelectedTable)); - tabbedPane.addTab("All MBTS cell details", new JScrollPane(mbtsTable)); - tabbedPane.setSelectedIndex(index); - - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(tabbedPane, BorderLayout.CENTER); - } - - private void fillTablePane() - { - // For total data and data passing cuts, use .getInfoDraw() - // for total event data, use getInfo() - table = new JTable(eventManager.getCurrentEvent().getInfoDraw(), - new String[] { "detector / datatype", "data items", "passing cuts" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - table.setRowHeight(20); - table.setFont(new Font("Monospaced", Font.PLAIN, 16)); - table.getColumnModel().getColumn(0).setPreferredWidth(350); - table.getColumnModel().getColumn(1).setPreferredWidth(100); - table.getColumnModel().getColumn(2).setPreferredWidth(100); - } - - private void fillPropertiesPane(ALVL1ResultData lvl1ResultData[], ATriggerInfoData triggerInfoData) - { - double et = 0; - List<ACalorimeterData> calo = eventManager.getCurrentEvent().getCalorimeters(); - - for (int i = 0; i < calo.size(); i++) - et += calo.get(i).getTotalTransverseEnergy(); - - String[][] properties; - - if (lvl1ResultData == null) - { - if(triggerInfoData==null) - { - properties = new String[2][2]; - properties[1][0] = "Trigger Decision"; - properties[1][1] = "N/A"; - } - else - { - properties = new String[7][2]; - properties[1][0] = "Trigger Decision"; - properties[1][1] = "N/A"; - properties[2][0] = "Trigger Info: Level 1 EtMiss"; - properties[2][1] = String.valueOf(triggerInfoData.getEnergyEtMiss(0)); - properties[3][0] = "Trigger Info: Level 1 SumEt"; - properties[3][1] = String.valueOf(triggerInfoData.getEnergyEtMiss(0)); - properties[4][0] = "Trigger Info: ExtL1ID"; - properties[4][1] = triggerInfoData.getTrigInfoExtL1ID(0); - properties[5][0] = "Trigger Info: Lvl1Type"; - properties[5][1] = triggerInfoData.getTrigInfoLvl1Type(0); - properties[6][0] = "Trigger Info: Status"; - properties[6][1] = triggerInfoData.getTrigInfoStatus(0); - - } - } - else - { - properties = new String[5*lvl1ResultData.length+6][2]; - - //output the trigger info: - properties[1][0] = "Trigger Info: Level 1 EtMiss"; - properties[2][0] = "Trigger Info: Level 1 SumEt"; - properties[3][0] = "Trigger Info: ExtL1ID"; - properties[4][0] = "Trigger Info: Lvl1Type"; - properties[5][0] = "Trigger Info: Status"; - - if(triggerInfoData!=null) - { - properties[1][1] = String.valueOf(triggerInfoData.getEnergyEtMiss(0)); - properties[2][1] = String.valueOf(triggerInfoData.getEnergySumEt(0)); - properties[3][1] = triggerInfoData.getTrigInfoExtL1ID(0); - properties[4][1] = triggerInfoData.getTrigInfoLvl1Type(0); - properties[5][1] = triggerInfoData.getTrigInfoStatus(0); - }else{ - properties[1][1] = "N/A"; - properties[2][1] = "N/A"; - properties[3][1] = "N/A"; - properties[4][1] = "N/A"; - properties[5][1] = "N/A"; - } - - for(int j=0; j<lvl1ResultData.length;j++){ - int ref=j*5;//reference to allow >1 collection in the list - String name=lvl1ResultData[j].getStoreGateKey(); - - properties[6+ref][0] = name + ": Level 1 result"; - properties[7+ref][0] = name + ": Level 2 result"; - properties[8+ref][0] = name + ": Event Filter result"; - properties[9+ref][0] = name + ": Level 1 EtMiss"; - properties[10+ref][0] = name + ": Level 1 SumEt"; - - int[] temp=new int[3]; - temp[0]=lvl1ResultData[j].getPassedL1(0); - temp[1]=lvl1ResultData[j].getPassedL2(0); - temp[2]=lvl1ResultData[j].getPassedEF(0); - for(int i=0;i<3;i++) - { - switch(temp[i]) - { - case -1: - properties[i+6+ref][1]="N/C"; - break; - case 0: - properties[i+6+ref][1]="failed"; - break; - case 1: - properties[i+6+ref][1]="passed"; - break; - default: - properties[i+6+ref][1]="N/A"; - } - } - float LVL1EtMiss=lvl1ResultData[j].getEnergyEtMiss(0); - float LVL1SumEt=lvl1ResultData[j].getEnergySumEt(0); - if(LVL1EtMiss>0) - properties[9+ref][1] = String.valueOf(LVL1EtMiss); - else - properties[9+ref][1] = "N/A"; - if(LVL1SumEt>0) - properties[10+ref][1] = String.valueOf(LVL1SumEt); - else - properties[10+ref][1] = "N/A"; - } - } - - //first item always Transv. Energy - properties[0][0] = "Transv. Energy (GeV)"; - properties[0][1] = String.format("%.2f",et); - - propertiesTable = new JTable(properties, new String[] { "Name", "Value" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - propertiesTable.setRowHeight(20); - propertiesTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - propertiesTable.getColumnModel().getColumn(0).setPreferredWidth(350); - propertiesTable.getColumnModel().getColumn(1).setPreferredWidth(100); - } - - private String[][] fillLevel1Pane(ALVL1ResultData lvl1ResultData[]) - { - String[][] properties; - - if (lvl1ResultData == null) - { - properties = new String[1][2]; - properties[0][0] = "N/A"; - properties[0][1] = "N/A"; - } - else - { - String[][] items=new String[lvl1ResultData.length][]; - String[][] prescales=new String[lvl1ResultData.length][]; - int numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - items[j]=lvl1ResultData[j].getCtpItemListSplit(0,false); - prescales[j]=lvl1ResultData[j].getPrescaleListL1Split(0); - numItems+=items[j].length; - } - properties = new String[numItems][2]; - numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - String name=lvl1ResultData[j].getStoreGateKey(); - for(int i=0; i<items[j].length; i++) - { - properties[numItems][0]= name + ": " + items[j][i]; - properties[numItems][1]=(prescales[j] != null && i<prescales[j].length) ? prescales[j][i]: "N/A"; - numItems++; - } - } - } - level1Table = new JTable(properties, new String[] { "Item passed", "Prescale"}) { - public boolean isCellEditable(int row, int column) { return false; } - }; - level1Table.setRowHeight(20); - level1Table.setFont(new Font("Monospaced", Font.PLAIN, 16)); - level1Table.getColumnModel().getColumn(0).setPreferredWidth(350); - level1Table.getColumnModel().getColumn(1).setPreferredWidth(100); - - return properties; - } - - private String[][] fillLevel2Pane(ALVL1ResultData lvl1ResultData[]) - { - String[][] properties; - - if (lvl1ResultData == null) - { - properties = new String[1][2]; - properties[0][0] = "N/A"; - properties[0][1] = "N/A"; - } - else - { - String[][] items=new String[lvl1ResultData.length][]; - String[][] prescales=new String[lvl1ResultData.length][]; - int numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - items[j]=lvl1ResultData[j].getitemListL2Split(0,false); - prescales[j]=lvl1ResultData[j].getPrescaleListL2Split(0); - numItems+=items[j].length; - } - properties = new String[numItems][2]; - numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - String name=lvl1ResultData[j].getStoreGateKey(); - for(int i=0; i<items[j].length; i++) - { - properties[numItems][0]= name + ": " + items[j][i]; - properties[numItems][1]=(prescales[j] != null && i<prescales[j].length) ? prescales[j][i]: "N/A"; - numItems++; - } - } - } - level2Table = new JTable(properties, new String[] { "Item passed", "Prescale" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - level2Table.setRowHeight(20); - level2Table.setFont(new Font("Monospaced", Font.PLAIN, 16)); - level2Table.getColumnModel().getColumn(0).setPreferredWidth(350); - level2Table.getColumnModel().getColumn(1).setPreferredWidth(100); - - return properties; - } - - private String[][] fillEventFilterPane(ALVL1ResultData lvl1ResultData[]) - { - String[][] properties; - - if (lvl1ResultData == null) - { - properties = new String[1][2]; - properties[0][0] = "N/A"; - properties[0][1] = "N/A"; - } - else - { - String[][] items=new String[lvl1ResultData.length][]; - String[][] prescales=new String[lvl1ResultData.length][]; - int numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - items[j]=lvl1ResultData[j].getitemListEFSplit(0,false); - prescales[j]=lvl1ResultData[j].getPrescaleListEFSplit(0); - numItems+=items[j].length; - } - properties = new String[numItems][2]; - numItems=0; - for(int j=0; j<lvl1ResultData.length;j++){ - String name=lvl1ResultData[j].getStoreGateKey(); - for(int i=0; i<items[j].length; i++) - { - properties[numItems][0]= name + ": " + items[j][i]; - properties[numItems][1]=(prescales[j] != null && i<prescales[j].length) ? prescales[j][i]: "N/A"; - numItems++; - } - } - } - eventFilterTable = new JTable(properties, new String[] { "Item passed", "Prescale" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - eventFilterTable.setDefaultEditor(String.class, null); - eventFilterTable.setRowHeight(20); - eventFilterTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - eventFilterTable.getColumnModel().getColumn(0).setPreferredWidth(350); - eventFilterTable.getColumnModel().getColumn(1).setPreferredWidth(100); - - return properties; - } - - private void fillTrigInfoItemsPane(ATriggerInfoData triggerInfoData) - { - String[][] properties; - - if (triggerInfoData == null) - { - properties = new String[1][3]; - properties[0][0] = "N/A"; - properties[0][1] = "N/A"; - properties[0][2] = "N/A"; - } - else - { - String[] itemsL1=triggerInfoData.getTrigInfoL1SplitHex(0); - String[] itemsL2=triggerInfoData.getTrigInfoL2SplitHex(0); - String[] itemsEF=triggerInfoData.getTrigInfoEFSplitHex(0); - //find list with largest amount of items - int items = Math.max(Math.max(itemsL1.length, itemsL2.length),itemsEF.length); - properties = new String[items][3]; - for(int i=0; i<items; i++) - { - properties[i][0]= (i<itemsL1.length) ? itemsL1[i] : ""; - properties[i][1]= (i<itemsL2.length) ? itemsL2[i] : ""; - properties[i][2]= (i<itemsEF.length) ? itemsEF[i] : ""; - } - } - trigInfoItemsTable = new JTable(properties, new String[] { "L1", "L2", "EF" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - trigInfoItemsTable.setRowHeight(20); - trigInfoItemsTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - trigInfoItemsTable.getColumnModel().getColumn(0).setPreferredWidth(100); - trigInfoItemsTable.getColumnModel().getColumn(1).setPreferredWidth(100); - trigInfoItemsTable.getColumnModel().getColumn(1).setPreferredWidth(100); - - } - - private void fillTrigInfoStreamPane(ATriggerInfoData triggerInfoData) - { - String[][] properties; - - if (triggerInfoData == null) - { - properties = new String[1][1]; - properties[0][0] = "N/A"; - } - else - { - String[] items=triggerInfoData.getTrigInfoStreamTagSplit(0); - properties = new String[items.length][1]; - for(int i=0; i<items.length; i++) - { - properties[i][0]=items[i]; - } - } - trigInfoStreamTable = new JTable(properties, new String[] { "Stream Tag"}) { - public boolean isCellEditable(int row, int column) { return false; } - }; - trigInfoStreamTable.setRowHeight(20); - trigInfoStreamTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - trigInfoStreamTable.getColumnModel().getColumn(0).setPreferredWidth(450); - } - - private void fillUserSelectedPane(String[][] L1_items, String[][] L2_items, String[][] EF_items) - { - String[][] properties; - if (USER_ITEMS==null) - { - properties = new String[1][2]; - properties[0][0] = "Please add items to: " + LOOKUP_FILENAME; - properties[0][1] = "N/A"; - } - else - { - Vector<String> v_c1 = new Vector<String>();//column 1 - item - Vector<String> v_c2 = new Vector<String>();//column 2 - prescales - Vector<String> v_u = new Vector<String>();//user items - for(int i=0; i<USER_ITEMS.length; i++) - { - v_u.add(USER_ITEMS[i]); - } - //loop over L1 items - for(int j=0; j<L1_items.length; j++) - { - for(int i=0; i<v_u.size(); i++) - { - if(v_u.elementAt(i).equals(L1_items[j][0])) - { - v_c1.add(L1_items[j][0]); - v_c2.add(L1_items[j][1]); - v_u.remove(i); - } - } - } - //if still have user items left loop over L2 - if(v_u.size()>0) - { - for(int j=0; j<L2_items.length; j++) - { - for(int i=0; i<v_u.size(); i++) - { - if(v_u.elementAt(i).equals(L2_items[j][0])) - { - v_c1.add(L2_items[j][0]); - v_c2.add(L2_items[j][1]); - v_u.remove(i); - } - } - } - } - //if still have user items left loop over EF - if(v_u.size()>0) - { - for(int j=0; j<EF_items.length; j++) - { - for(int i=0; i<v_u.size(); i++) - { - if(v_u.elementAt(i).equals(EF_items[j][0])) - { - v_c1.add(EF_items[j][0]); - v_c2.add(EF_items[j][1]); - v_u.remove(i); - } - } - } - } - //now store items in String[][] - properties = new String[v_c1.size()][2]; - for(int i=0; i<v_c1.size(); i++) - { - properties[i][0]=v_c1.elementAt(i).toString(); - properties[i][1]=v_c2.elementAt(i).toString(); - } - } - userSelectedTable = new JTable(properties, new String[] { "Item passed", "Prescale" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - userSelectedTable.setRowHeight(20); - userSelectedTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - userSelectedTable.getColumnModel().getColumn(0).setPreferredWidth(350); - userSelectedTable.getColumnModel().getColumn(1).setPreferredWidth(100); - } - - private void fillmbtsPane() - { - ACalorimeterData calorimeter=null; - List<ACalorimeterData> detectors = eventManager.getCurrentEvent().getCalorimeters(); - for (int det = 0; det < detectors.size(); det++) - { - ACalorimeterData testcalorimeter = detectors.get(det); - if (!testcalorimeter.getName().equals("MBTS")) continue; - if(testcalorimeter.getNumData()>0) calorimeter=testcalorimeter; - } - - - String[][] properties; - if (calorimeter==null) - { - properties = new String[1][5]; - properties[0][0] = "N/A"; - properties[0][1] = "N/A"; - properties[0][2] = "N/A"; - properties[0][3] = "N/A"; - properties[0][4] = "N/A"; - } - else - { - properties = new String[calorimeter.getNumData()][5]; - //AMBTSData mbtsdata = calorimeter.eta[i]; - for (int i = 0; i < calorimeter.getNumData(); ++i) - { - properties[i][0] = "" + i; - properties[i][1] = "" + String.format("%.3f",(calorimeter.getET(i))); - properties[i][2] = "" + String.format("%.1f",calorimeter.getEta(i)); - properties[i][3] = "" + String.format("%.1f",calorimeter.getPhi(i)); - properties[i][4] = "" + calorimeter.getSampling(i); - } - } - mbtsTable = new JTable(properties, new String[] { "Index", "Energy (MeV)", "Type", "Module", "Channel" }) { - public boolean isCellEditable(int row, int column) { return false; } - }; - mbtsTable.setRowHeight(20); - mbtsTable.setFont(new Font("Monospaced", Font.PLAIN, 16)); - mbtsTable.getColumnModel().getColumn(0).setPreferredWidth(90); - mbtsTable.getColumnModel().getColumn(1).setPreferredWidth(90); - mbtsTable.getColumnModel().getColumn(2).setPreferredWidth(90); - mbtsTable.getColumnModel().getColumn(3).setPreferredWidth(90); - mbtsTable.getColumnModel().getColumn(4).setPreferredWidth(90); - } - - /** - * Implementing NewEvent listener - * @param event the new event - */ - public void newEvent(AEvent event) { - if (isInUse()) updatePane(); - } - - - - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AEventQueue.java b/graphics/AtlantisJava/src/atlantis/gui/AEventQueue.java deleted file mode 100755 index 081e214dd295..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AEventQueue.java +++ /dev/null @@ -1,165 +0,0 @@ -package atlantis.gui; - -import java.awt.EventQueue; -import java.awt.AWTEvent; -import java.awt.Frame; -import java.awt.event.KeyEvent; -import atlantis.parameters.APar; -import atlantis.canvas.ACanvas; -import atlantis.data.AG4StepData; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.interactions.AModifier; -import javax.swing.JOptionPane; -import atlantis.utils.ALogger; - -/** - * Because we use Mouse Actions and Keyboard Modifiers (letters) we need a way of - * getting all the keyboard events independent of the focussed compenent. This is - * done by catching them directly from the Event Queue. So, we just replace the - * default Java Queue by this one. - */ -public class AEventQueue extends EventQueue { - - /** - * Contains the code of the key (is some key is pressed) - * or KeyEvent.VK_UNDEFINED if no key is holded down. - */ - private static int keyboardState; - private static AModifier defInt = new AModifier(KeyEvent.VK_UNDEFINED, false, ""); - - private KeyEvent keyEvent; - - private final static ALogger logger = ALogger.getLogger(AEventQueue.class); - private static AEventManager eventManager = AEventManager.instance(); - - private static boolean isRightMouseButton; - - protected static APar parameterStore = APar.instance(); - - private static final AGlobals globals = AGlobals.instance(); - - public static int getKeyboardState() { - int ret = 0; - - if (keyboardState == KeyEvent.VK_UNDEFINED) { - ret = defInt.getKeyCode(); - } else { - ret = keyboardState; - } - - // Bit of a hack because fastzoom is handled differently from other - // interactions - if (ret == KeyEvent.VK_F) { - parameterStore.get("Projection", "SkipData").setStatus(true); - } else { - parameterStore.get("Projection", "SkipData").setStatus(false); - } - - return ret; - } - - public static AModifier getDefault() { - return defInt; - } - - public static void setDefault(AModifier mod) { - defInt = mod; - - } - - public static int getKeyboardDefault() { - return defInt.getKeyCode(); - } - - public static boolean getIntRightMouseButton() { - if (keyboardState == KeyEvent.VK_UNDEFINED) { - // Non-default action selected, use the right click option from it - return defInt.getRightClick() || isRightMouseButton; - } else { - return isRightMouseButton; - } - } - - // FIXME: isRightMouseButton sometimes has spurious true value: see Trac #488 - protected void dispatchEvent(AWTEvent event) { - Frame gui = globals.getGuiFrame(); - super.dispatchEvent(event); - - if(event instanceof KeyEvent) { - keyEvent=(KeyEvent)event; -// this is the right mouse click on single mouse button mac's - switch(keyEvent.getID()) { - case KeyEvent.KEY_PRESSED: - if(keyEvent.getKeyCode()==17) { - isRightMouseButton=true; - return; - } - keyboardState=keyEvent.getKeyCode(); - //atlantis.utils.AOutput.append(" key pressed :" + keyboardState + ":\n", atlantis.utils.ALogPane.NORMAL_BOLD); - - if (keyEvent.getKeyCode()==33){//page up - System.out.println("Go to previous event"); - try { - eventManager.previousEvent(); - } catch (NoMoreEventsException nme) { - String msg = "Already at first event from this source!"; - JOptionPane.showMessageDialog(gui, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies) { - String msg = "Not a valid event source - please select one!"; - JOptionPane.showMessageDialog(gui, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree) { - String msg = "Can not read event(s)!"; - JOptionPane.showMessageDialog(gui, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } - if (keyEvent.getKeyCode()==34) {//page down - System.out.println("Go to next event"); - try { - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "Already at last event from this source!"; - JOptionPane.showMessageDialog(gui, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies) { - String msg = "Not a valid event source - please select one!"; - JOptionPane.showMessageDialog(gui, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree) { - String msg = "Can not read event(s)!"; - JOptionPane.showMessageDialog(gui, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } - - if (keyEvent.getKeyCode()==47) {// "/" - AG4StepData.ReadG4Steps(); - }//key "/" - - if (keyEvent.getKeyCode() == KeyEvent.VK_F) { - parameterStore.get("Projection", "SkipData").setStatus(true); - } - break; - - case KeyEvent.KEY_RELEASED: - if (keyEvent.getKeyCode() == 17) { - isRightMouseButton = false; - return; - } - keyboardState = KeyEvent.VK_UNDEFINED; - if (keyEvent.getKeyCode() == KeyEvent.VK_F) { - parameterStore.get("Projection", "SkipData").setStatus(false); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - break; - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AEventSourceToolBar.java b/graphics/AtlantisJava/src/atlantis/gui/AEventSourceToolBar.java deleted file mode 100644 index 8f5534a6dd52..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AEventSourceToolBar.java +++ /dev/null @@ -1,523 +0,0 @@ - -package atlantis.gui; - -import atlantis.config.ADefaultValues; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource; -import atlantis.event.ANewEventSourceListener; -import atlantis.event.AURLEventSource; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NavigationMode; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.event.AStreamedEventSource; -import atlantis.event.AStreamedEventSource.InvalidStreamException; -import atlantis.globals.AGlobals; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Vector; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.DefaultComboBoxModel; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JRadioButton; -import javax.swing.JTextField; -import javax.swing.JToolBar; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; - -/** - * This toolbar contains all the elements to set a new event source or stream, - * browse through the events or set the event navigation mode - * @author maillard - * @author sboeser - */ -class AEventSourceToolBar extends JToolBar implements ANewEventSourceListener { - - /** The text field that allows us to enter a new event source */ - private JTextField addressBar; - - /** The event stream selection combo box */ - private JComboBox eventStreamComboBox; - - /** The radio buttons that allow to select the event navigation mode */ - private JRadioButton randomButton, sequentialButton, loopButton; - - /** The logger */ - private final static ALogger logger = ALogger.getLogger(AEventSourceToolBar.class); - - private static AEventManager eventManager = AEventManager.instance(); - - /** Spacing between components in the toolbar */ - private static int SPACE = 4; - - /** - * Constructor - */ - public AEventSourceToolBar() { - - //call parent constructor - super(); - - setFloatable(false); - - //Get the path to the icon files - String iconPath = AGlobals.instance().getHomeDirectory()+"img"+System.getProperty("file.separator"); - - // setting up the 'open file' button - ImageIcon openIcon = AUtilities.getFileAsImageIcon(iconPath+"toolbar_open.png"); - JButton openFile = new JButton(openIcon); - openFile.setVerticalTextPosition(JButton.BOTTOM); - openFile.setHorizontalTextPosition(JButton.CENTER); - openFile.setMargin(new Insets(2, 2, 2, 2)); - openFile.setToolTipText("Open local file"); - // And add an action listener for it - openFile.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - openFileButtonAction(); - } - }); - // adding the open file button to the toolbar - - add(Box.createHorizontalStrut(SPACE)); - add(openFile); - add(Box.createHorizontalStrut(SPACE)); - - // setting up the address bar - addressBar = new JTextField(30); - // and an action listener - addressBar.addActionListener( new ActionListener() { - public void actionPerformed(ActionEvent e) { - addressBarAction((JTextField)e.getSource()); - } - }); - // adding the address bar to the toolbar - add(addressBar); - - //Set up previous and next buttons - ImageIcon nextIcon = AUtilities.getFileAsImageIcon(iconPath+"toolbar_next.png"); - ImageIcon previousIcon = AUtilities.getFileAsImageIcon(iconPath+"toolbar_previous.png"); - - JButton nextButton = new JButton(nextIcon); - JButton previousButton = new JButton(previousIcon); - - //customize and add action listener for next - nextButton.setName("nextButton"); - nextButton.setVerticalTextPosition(JButton.BOTTOM); - nextButton.setHorizontalTextPosition(JButton.CENTER); - nextButton.setMargin(new Insets(2, 2, 2, 2)); - nextButton.setToolTipText("Next event (PageDown)"); - nextButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - nextButtonAction(); - } - }); - - //customize and add action listener for previous - previousButton.setName("previousButton"); - previousButton.setVerticalTextPosition(JButton.BOTTOM); - previousButton.setHorizontalTextPosition(JButton.CENTER); - previousButton.setMargin(new Insets(2, 2, 2, 2)); - previousButton.setToolTipText("Previous event (PageUp)"); - previousButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - previousButtonAction(); - } - }); - //Add both to toolbar - add(Box.createHorizontalStrut(SPACE)); - add(previousButton); - add(nextButton); - add(Box.createHorizontalStrut(SPACE)); - - //Next add a seperator - addSeparator(); - - //Add a combo box, but set it to invisble - String[] streamNames = { "--n/a--" }; - eventStreamComboBox = new JComboBox(streamNames); - eventStreamComboBox.setVisible(false); - add(eventStreamComboBox); - - // set up the navigation mode button icons - ImageIcon sequentialIcon = AUtilities.getFileAsImageIcon(iconPath+"mode_sequential.png"); - ImageIcon loopIcon = AUtilities.getFileAsImageIcon(iconPath+"mode_loop.png"); - ImageIcon randomIcon = AUtilities.getFileAsImageIcon(iconPath+"mode_random.png"); - ImageIcon sequentialIconOn = AUtilities.getFileAsImageIcon(iconPath+"mode_sequential_on.png"); - ImageIcon loopIconOn = AUtilities.getFileAsImageIcon(iconPath+"mode_loop_on.png"); - ImageIcon randomIconOn = AUtilities.getFileAsImageIcon(iconPath+"mode_random_on.png"); - - //put these buttons in a group - ButtonGroup group = new ButtonGroup(); - // sequential mode - sequentialButton = new JRadioButton(sequentialIcon); - sequentialButton.setOpaque(false); - sequentialButton.setSelectedIcon(sequentialIconOn); - sequentialButton.setToolTipText("Sequential mode"); - sequentialButton.setName("Sequential mode"); - // loop mode - loopButton = new JRadioButton(loopIcon); - loopButton.setSelectedIcon(loopIconOn); - loopButton.setOpaque(false); - loopButton.setToolTipText("Loop mode"); - loopButton.setName("Loop mode"); - // random mode - randomButton = new JRadioButton(randomIcon); - randomButton.setOpaque(false); - randomButton.setSelectedIcon(randomIconOn); - randomButton.setToolTipText("Random mode"); - randomButton.setName("Random mode"); - // the mode buttons are initially disabled, since we - // don't know which event source will be loaded first - sequentialButton.setEnabled(false); - loopButton.setEnabled(false); - randomButton.setEnabled(false); - - // when one of the buttons is pressed, set the required display mode - sequentialButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - navigationModeAction(NavigationMode.SEQUENTIAL); - } - }); - - loopButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - navigationModeAction(NavigationMode.LOOP); - } - }); - - randomButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - navigationModeAction(NavigationMode.RANDOM); - } - }); - //Add all buttons to the group - group.add(sequentialButton); - group.add(loopButton); - group.add(randomButton); - - add(sequentialButton); - add(loopButton); - add(randomButton); - } - - /** - * Called whenever the event text field changed - */ - private synchronized void addressBarAction(JTextField tf){ - - //Get the new text - String sourceName = tf.getText(); - - // if sourceName is a local path but doesn't provide an [type]://, - // prepend file:// as default - if(! sourceName.contains("://")) sourceName = "file://" + sourceName; - try { - eventManager.setEventSource(sourceName); - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - JOptionPane.showMessageDialog(this, "No more events found from this source!", "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies) { - JOptionPane.showMessageDialog(this, "Not a valid event source: "+sourceName, "Invalid event source", JOptionPane.ERROR_MESSAGE); - logger.error(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - JOptionPane.showMessageDialog(this, "Cannot read event(s).", "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } - - /** - * Called whenever the previous button is pressed - */ - private synchronized void previousButtonAction(){ - - try { - eventManager.previousEvent(); - } catch (NoMoreEventsException nme) { - String msg = "Already at first event from this source!"; - JOptionPane.showMessageDialog(this, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies ){ - String msg = "Not a valid event source - please select one!"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - String msg = "Can not read event(s)!"; - JOptionPane.showMessageDialog(this, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - refreshAddressBar(); - } - - /** - * Called whenever the next button is pressed - */ - private synchronized void nextButtonAction(){ - try { - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "Already at last event from this source!"; - JOptionPane.showMessageDialog(this, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies ){ - String msg = "Not a valid event source - please select one!"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - String msg = "Can not read event(s)!"; - JOptionPane.showMessageDialog(this, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - refreshAddressBar(); - } - - /** - * Update the address bar to show the current event source - */ - private synchronized void refreshAddressBar(){ - AEventSource source = eventManager.getEventSource(); - AEvent event = eventManager.getCurrentEvent(); - if (source != null && event != null) { - // if the source is a URL, we should always use '/' as the separator - // else we'll use the system file separator - if (source instanceof AURLEventSource) { - addressBar.setText(source.getSourceName() + "/" + event.getSourceName()); - } else { - addressBar.setText(source.getSourceName() + System.getProperty("file.separator") + event.getSourceName()); - } - } - } - - /** - * Open a file dialog and read the selected event or directory - */ - private synchronized void openFileButtonAction(){ - //get the last location from the default values - String lastLoc = ADefaultValues.get("LastEventFilesSourceDir"); - //Create a file chooser dialog - AReadFileChooser fileDialog = new AReadFileChooser(lastLoc); - //Check if the user pressed ok in the dialog - if ( fileDialog.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { - //Get the selected file path, prepend file:// - String fullFilePath = "file://" + fileDialog.getSelectedFile().getPath(); - - try { - //Now set this as a new event source - eventManager.setEventSource(fullFilePath); - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "No events found from this source!"; - JOptionPane.showMessageDialog(this, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies ){ - String msg = "Not a valid event source"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - String msg = "Can not read event(s)"; - JOptionPane.showMessageDialog(this, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } // okay pressed - otherwise do nothing - } // openFileButtonAction() ---------------------------------------------------- - - /** - * Called whenever the navigation mode is changed in the GUI - */ - private synchronized void navigationModeAction( NavigationMode mode ){ - try { - eventManager.setNavigationMode(mode); } - catch (InvalidEventSourceException ies) { - JOptionPane.showMessageDialog(this, ies.getCauseMessages(), "Invalid navigation mode", JOptionPane.ERROR_MESSAGE); - } - } - - /** - * Called whenever the event stream is changed in the GUI - */ - private synchronized void selectedStreamAction(AStreamedEventSource source){ - - //Get the newly selected stream - String stream = (String) eventStreamComboBox.getSelectedItem(); - - try { - //Try to set a new stream - source.setStream(stream); - //Also get a new event - eventManager.nextEvent(); - //And update the event source field - refreshAddressBar(); - - } catch (NoMoreEventsException nme){ - //In case we already have the latest event from this stream - ignore - } catch (InvalidStreamException ise) { - //This can happen if the stream list changes inbetween - //opening the popup and selecting an item - String msg = "Cannot set stream '"+stream+"' for event source"; - JOptionPane.showMessageDialog(this, msg, "Invalid stream", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+ise.getCauseMessages()); - //Also clear the stream list - eventStreamComboBox.removeAllItems(); - } catch (InvalidEventSourceException ies) { - //This can happen if the source turned invalid inbetween - //opening the popup and selecting an item - String msg = "Invalid event source when setting new stream"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+ies.getCauseMessages()); - //Also clear the stream list - eventStreamComboBox.removeAllItems(); - } catch (ReadEventException ree){ - //Do nothing special with stream list in this case - String msg = "Can not read event from new stream '"+stream+"'"; - JOptionPane.showMessageDialog(this, msg, "Invalid event", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+ree.getCauseMessages()); - } - - } - - /** - * This is called whenever the event stream combo is poped up - * Use this to update the event list every time - */ - private synchronized void updateEventStreamCombo(AStreamedEventSource eventSource){ - /** - * NOTE: We are NOT using "removeAllItems" + "addItems" to update the - * combo box as this will always fire a new ActionEvent with the first - * added Item. The proper way to do is to change the data model, as the - * new data model will only fire AFTER the user selected from the open - * ComboBox. - */ - - //Create an empty list - Vector<String> streamNames = new Vector<String>(); - - try { - //Get the stream names - streamNames = eventSource.getAvailableStreams(); - } catch (InvalidEventSourceException ies) { - //If we fail to update the list show some messages - //NOTE: we can not show dialog here, as this will steal the focus - // from the combo box, so it does not pop-down later on - String msg = "Invalid event source when getting stream list"; - //JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+ies.getCauseMessages()); - } - - //In any case update the stream list by setting a new data model - // -- even if it is empty - finally { - //Create a new data model - DefaultComboBoxModel newDataModel = new DefaultComboBoxModel(streamNames); - //Select the same stream we had before, if its still there - newDataModel.setSelectedItem(eventStreamComboBox.getSelectedItem()); - //Now install the new DataModel - eventStreamComboBox.setModel(newDataModel); - } - } - - /** - * This implementation of the ANewEventSourceListener gets called whenever - * the event source changes in AEventManager - * @param eventSource the new event source (final as being bound by combo action listener) - */ - public synchronized void newEventSource(final AEventSource eventSource) { - - //Stream selection is off by default - eventStreamComboBox.setVisible(false); - - //Check if this event source supports streams - if (eventSource instanceof AStreamedEventSource){ - - AStreamedEventSource streamedSource = (AStreamedEventSource) eventSource; - - //Update the list in the event stream combo box - updateEventStreamCombo(streamedSource); - - //Temporarily remove all the update handler - for (ActionListener al : eventStreamComboBox.getActionListeners()) - eventStreamComboBox.removeActionListener(al); - for (PopupMenuListener pml : eventStreamComboBox.getPopupMenuListeners()) - eventStreamComboBox.removePopupMenuListener(pml); - - try { - //Now right away select the stream given by the event source - eventStreamComboBox.setSelectedItem(((AStreamedEventSource) eventSource).getStream()); - } catch (InvalidEventSourceException ies) { - //If we fail to update the list show some messages - String msg = "Invalid event source when getting stream list"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+ies.getCauseMessages()); - } catch (NoMoreEventsException nme) { - //If we fail to update the list show some messages - String msg = "No streams (yet) available for this source"; - JOptionPane.showMessageDialog(this, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.error(msg+"\n"+nme.getCauseMessages()); - } - - //(Re-)set the update handler - eventStreamComboBox.addActionListener( new ActionListener () { - public void actionPerformed(ActionEvent e) { - selectedStreamAction((AStreamedEventSource)eventSource); - } - }); - - //Also have the combobox update its item list every time the - //popup is selected - eventStreamComboBox.addPopupMenuListener(new PopupMenuListener(){ - //update stream list when popup appears - public void popupMenuWillBecomeVisible(PopupMenuEvent e) { - updateEventStreamCombo((AStreamedEventSource)eventSource); - } - //Do nothing in other cases - public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {} - public void popupMenuCanceled(PopupMenuEvent e) {} - } - ); - - //Finally make it visible - eventStreamComboBox.setVisible(true); - } - - //And repaint to show/hide the combo box - repaint(); - - // disable all the mode buttons - sequentialButton.setEnabled(false); - loopButton.setEnabled(false); - randomButton.setEnabled(false); - - // enable the modes that are supported by the current event source - // and mark the current display mode as active - if(eventSource.supportsNavigationMode(NavigationMode.SEQUENTIAL)) { - if(eventSource.getNavigationMode() == NavigationMode.SEQUENTIAL) - sequentialButton.setSelected(true); - sequentialButton.setEnabled(true); - } - - if(eventSource.supportsNavigationMode(NavigationMode.LOOP)) { - if(eventSource.getNavigationMode() == NavigationMode.LOOP) - loopButton.setSelected(true); - loopButton.setEnabled(true); - } - - if(eventSource.supportsNavigationMode(NavigationMode.RANDOM)) { - if(eventSource.getNavigationMode() == NavigationMode.RANDOM) - randomButton.setSelected(true); - randomButton.setEnabled(true); - } - - // change the address in the address bar to the current event source - refreshAddressBar(); - - } // newEventSource() ----------------------------------------------------- -} - diff --git a/graphics/AtlantisJava/src/atlantis/gui/AFileControl.java b/graphics/AtlantisJava/src/atlantis/gui/AFileControl.java deleted file mode 100755 index 7cf12548f0ec..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AFileControl.java +++ /dev/null @@ -1,210 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JMenu; -import javax.swing.JOptionPane; -import javax.swing.JSeparator; - -import atlantis.config.ADefaultValues; -import atlantis.data.AG4StepData; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.utils.ALogger; -import javax.swing.JFileChooser; - - -/** - * The File menu in the GUI. - */ -public class AFileControl extends JMenu -{ - private static ALogger logger = ALogger.getLogger(AFileControl.class); - private static AEventManager eventManager = AEventManager.instance(); - private static final AGlobals globals = AGlobals.instance(); - - public AFileControl() - { - super("File"); - - add("Read Event Locally").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - readEventLocally(); - - } - }); // add("Read Event Locally") - - add("Read Event From URL (live)").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - readEventFromURL(); - } - }); // add("Read Event From URL") - - add(new JSeparator()); - - add("Loop over events").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AEventLoopDialog.getInstance().showDialog(); - } - }); - - add(new JSeparator()); - - add("Save Image of Canvas").addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - //Create a new dialog - ASaveCanvasDialog dialog = new ASaveCanvasDialog(); - //And show it - dialog.showDialog(); - } - }); - - add(new JSeparator()); - - add("Event Properties").addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - AEventPropertiesDialog.getInstance().setVisible(true); - } - }); // add("Event Properties") - - add(new JSeparator()); - - add("Read Geometry").addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - new AReadGeometryChooser(); - } - }); // add("Read Geometry") - - add("Read G4Steps").addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - AG4StepData.ReadG4Steps(); - } - }); // add ("Read G4Steps") - - int userLevel = APar.instance().getUserLevel(); - if(userLevel>=3) // TODO: Use name for "debug" instead of magic number - { - add("Memory information").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - System.gc(); - long total = Runtime.getRuntime().totalMemory(); - long free = Runtime.getRuntime().freeMemory(); - long max = Runtime.getRuntime().maxMemory(); - int fac = 1024 * 1024; // Mega factor - String newLine = System.getProperty("line.separator"); - AOutput.append("\nMemory information:"+newLine, ALogInterface.NORMAL); - AOutput.append(" total: " + total + " B " + total / fac + " MB"+newLine, ALogInterface.NORMAL); - AOutput.append(" free : " + free + " B " + free / fac + " MB"+newLine, ALogInterface.NORMAL); - AOutput.append(" max : " + max + " B " + max / fac + " MB"+newLine, ALogInterface.NORMAL); - } - }); - - } // if(logger.isDebugEnabled()) - - add(new JSeparator()); - - add("Exit").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - new AClosingConfirmationDialog(globals.getGuiFrame()).exitApp(); - } - }); - - } // AFileControl() ----------------------------------------------------- - - - /** - * Open a file dialog and read the selected event or directory - */ - private static void readEventLocally(){ - Frame gui = globals.getGuiFrame(); - //get the last location from the default values - String lastLoc = ADefaultValues.get("LastEventFilesSourceDir"); - //Create a file chooser dialog - AReadFileChooser fileDialog = new AReadFileChooser(lastLoc); - //Check if the user pressed ok in the dialog - if ( fileDialog.showOpenDialog(gui) == JFileChooser.APPROVE_OPTION) { - //Get the selected file path, prepend file:// - String fullFilePath = "file://" + fileDialog.getSelectedFile().getPath(); - - try { - //Now set this as a new event source - eventManager.setEventSource(fullFilePath); - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "No events found from this source!"; - JOptionPane.showMessageDialog(gui, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies ){ - String msg = "Not a valid event source"; - JOptionPane.showMessageDialog(gui, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - String msg = "Can not read event(s)"; - JOptionPane.showMessageDialog(gui, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } // okay pressed - otherwise do nothing - } - - - private static void readEventFromURL() - { - // URL may end with .zip - archive of event files, .xml - single - // XML event file (in this case Read Next, Previous works on the web - // directory starting from this single file) or URL only of a web - // directory (string input considered to end with whatever else) - - // in this case Atlantis gets the first event in the directory, - // Read Next, Previous work as expected - // this URL should always start with http:// - - Frame gui = globals.getGuiFrame(); - String urlString = JOptionPane.showInputDialog(gui, - "Enter URL:", AGlobals.instance().getLivePoint1EventsURL()); - - //Make sure this is a proper string - otherwise abort - if(urlString == null || urlString.trim().length()==0) return; - - // event manager further distinguishes the particular event - // reader whether URL ends with .zip or .xml - try { - //Now set this as a new event source - eventManager.setEventSource(urlString); - eventManager.nextEvent(); - } catch (NoMoreEventsException nme) { - String msg = "No events found from this source!"; - JOptionPane.showMessageDialog(gui, msg, "No more events", JOptionPane.ERROR_MESSAGE); - logger.warn(nme.getCauseMessages()); - } catch (InvalidEventSourceException ies ){ - String msg = "Not a valid event source"; - JOptionPane.showMessageDialog(gui, msg, "Invalid source", JOptionPane.ERROR_MESSAGE); - logger.warn(ies.getCauseMessages()); - } catch (ReadEventException ree ){ - String msg = "Can not read event(s)"; - JOptionPane.showMessageDialog(gui, msg, "Read error", JOptionPane.ERROR_MESSAGE); - logger.warn(ree.getCauseMessages()); - } - } // readEventFromURL() ------------------------------------------------- - -} // class AFileControl ===================================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/AGUI.java b/graphics/AtlantisJava/src/atlantis/gui/AGUI.java deleted file mode 100644 index a4327b379589..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AGUI.java +++ /dev/null @@ -1,572 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; - -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.JFrame; -import javax.swing.JMenuBar; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSplitPane; -import javax.swing.JTabbedPane; - -import java.net.Authenticator; -import java.util.List; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.ALayoutChangeListener; -import atlantis.canvas.AWindow; -import atlantis.event.AEventInfoPrinter; -import atlantis.event.AEventManager; -import atlantis.event.AEventSource.InvalidEventSourceException; -import atlantis.event.AEventSource.NoMoreEventsException; -import atlantis.event.AEventSource.ReadEventException; -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.ADragListener; -import atlantis.list.AListManager; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.ACommandProcessor; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParameterChangeListener; -import atlantis.parameters.AParameterSuperGroup; -import atlantis.parameters.AParametersGroup; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import javax.swing.*; - -/** - * The Atlantis Graphical User Interface - * This is a singleton class (and probably one of the few cases where this is - * justified!). By implementing the ALayoutChangeListener it adjusts its size to - * the canvas size. - */ -public class AGUI extends JFrame implements ChangeListener, -ALayoutChangeListener, -AParameterChangeListener -{ - private final static ALogger logger = ALogger.getLogger(AGUI.class); - private final static AGlobals globals = AGlobals.instance(); - public AEventManager eventManager = AEventManager.instance(); - - private static AGUI instance; - - private static APar parameterStore = APar.instance(); - - /** Limit the total width of Atlantis to this number of pixels (0 = screen width). */ - private int maxWidth = 0; - - private AItemTabbedPane[] tabbedPane; - private AParametersPage[][] pages; - private AParametersGroup[][] groups; - private ChangeListener[] tabChangeListener; - private ChangeListener outerTabChangeListener; - private JPanel panel; - private JSplitPane split; - private JTabbedPane outerTabbedPane; - private AInteractionToolBar interactionToolBar; - - /** - * Public singleton instantian-accessor - * @return the singleton instance - */ - public static AGUI getGUI() - { - //Don't create any GUI in headless mode - if (AGlobals.isAtlantisHeadless()) return null; - //Create the GUI if it does not exist - if (instance == null) { - instance = new AGUI(); - globals.setGuiFrame(instance); - } - //return the singleton instance - return instance; - } - - /** - * Private singleton constructor - */ - private AGUI() - { - //intialize parent - super("Atlantis GUI"); - - //be verbose - logger.debug("Creating GUI..."); - - // AClosingConfirmationDialog class handles closing Atlantis - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - this.addWindowListener(new AClosingConfirmationDialog(this)); - - getContentPane().setLayout(new BorderLayout()); - AIcon.setIconImage(this); - - // Creating all menu bar items - JMenuBar menuBar = constructAndGetMenuBar(); - setJMenuBar(menuBar); // set menubar to this frame - - // Create a new toolbar for the event sources - AEventSourceToolBar toolBar = new AEventSourceToolBar(); - toolBar.setName("Atlantis event source toolbar"); - //Does not go into main panel as it need BorderLayout - add(toolBar, BorderLayout.PAGE_START); - // register as an event source listener - eventManager.addNewEventSourceListener(toolBar); - - // building the panel with our own layout manager - // Why do we actually need it?? - panel = new JPanel(new AGUILayoutManager()); - - // setting the Window Control - AWindowControl windowControl = new AWindowControl(); - windowControl.setName("windowControl"); - panel.add(windowControl, AGUILayoutManager.AVAILABLExPREFERRED); - - // setting the Parameters Table - groups = parameterStore.getUIGroups(); - pages = new AParametersPage[groups.length][]; - tabbedPane = new AItemTabbedPane[groups.length]; - tabChangeListener = new TabChangeListener[groups.length]; - - for(int i = 0; i < groups.length; i++) - { - pages[i] = new AParametersPage[groups[i].length]; - tabbedPane[i] = new AItemTabbedPane(JTabbedPane.LEFT); - - for(int j = 0; j < groups[i].length; j++) - { - pages[i][j] = new AParametersPage(groups[i][j]); - String title = groups[i][j].getScreenName(); - tabbedPane[i].addTab(title, null, - pages[i][j], groups[i][j].getToolTip()); - pages[i][j].setName(title); - if(groups[i][j].getScreenName().equals("Residual") || - groups[i][j].getScreenName().equals("Physics") ) - tabbedPane[i].setEnabledAt(tabbedPane[i].getTabCount()-1, false); - } - tabbedPane[i].setSelectedIndex(-1); - tabChangeListener[i] = new TabChangeListener(); - tabbedPane[i].addChangeListener(tabChangeListener[i]); - tabbedPane[i].addMouseListener(new MouseAdapter() - { - public void mousePressed(MouseEvent e) - { - if(AUtilities.isRightMouseButton(e)) - { - JTabbedPane tabbedPane = (JTabbedPane) e.getSource(); - int tab = tabbedPane.getUI().tabForCoordinate(tabbedPane, e.getX(), e.getY()); - int parentTab = ((JTabbedPane) tabbedPane.getParent()).getSelectedIndex(); - if(tab != -1) - { - String helpName = groups[parentTab][tab]. - getGroupName(); - AHelpSystem.getInstance().showPage(helpName); - } - } - } - }); - } - // for loop - setting the outer Table - - outerTabbedPane = new AItemTabbedPane(JTabbedPane.TOP); - outerTabbedPane.setName("parameterGroups"); - List<AParameterSuperGroup> superGroups = parameterStore.getUISuperGroups(); - for(int i = 0; i < superGroups.size(); i++) { - AParameterSuperGroup superGroup = superGroups.get(i); - String title = superGroup.getName(); - String toolTip = superGroup.getToolTip(); - outerTabbedPane.addTab(title, null, tabbedPane[i], toolTip); - tabbedPane[i].setName(title); - } - outerTabChangeListener = new OuterTabChangeListener(); - outerTabbedPane.addChangeListener(outerTabChangeListener); - outerTabbedPane.addMouseListener(new MouseAdapter() - { - public void mousePressed(MouseEvent e) - { - if(AUtilities.isRightMouseButton(e)) - { - JTabbedPane tabbedPane = (JTabbedPane) e.getSource(); - int tab = tabbedPane.getUI().tabForCoordinate(tabbedPane, e.getX(), e.getY()); - if(tab != -1) - { - String helpName = tabbedPane.getTitleAt(tab); - AHelpSystem.getInstance().showPage(helpName); - } - } - } - }); - panel.add(outerTabbedPane, AGUILayoutManager.AVAILABLExAVAILABLE); - - // Set up the output (log) pane. - AMainLogPane outputDisplay = new AMainLogPane(); - // Make it available to all - AOutput.setOutput(outputDisplay); - // Display details of each new event - AEventInfoPrinter eventInfoPrinter = new AEventInfoPrinter(outputDisplay); - eventManager.addNewEventListener(eventInfoPrinter); - // Put it in the GUI - split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel, outputDisplay); - split.setOneTouchExpandable(true); - split.setResizeWeight(0.75); //Give 25% to the log pane by default - getContentPane().add(split); - - // setting the window, projection and group listeners - ACanvas.getCanvas().addWindowChangeListener(this); - String[] wName = ACanvas.getCanvas().getKnownWindowNames(); - for(int i = 0; i < wName.length; i++) { - AWindow w = ACanvas.getCanvas().getWindow(wName[i]); - w.addProjectionChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - AWindow window = (AWindow) e.getSource(); - if(window.equals(ACanvas.getCanvas().getCurrentWindow())) { - if(interactionToolBar != null) panel.remove(interactionToolBar); - interactionToolBar = window.getInteractionToolBar(); - if(interactionToolBar == null) - window.getInteractionManager().forgetContext(); - else { - // the interactions tabpanes are added here - panel.add(interactionToolBar, AGUILayoutManager.AVAILABLExPREFERRED, 0); - interactionToolBar.connect(); - validate(); - } - } - } - }); - - w.addGroupChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - AWindow window = (AWindow) e.getSource(); - if(window.equals(ACanvas.getCanvas().getCurrentWindow())) - setSelectedTab(window.getGroupName()); - } - }); - } - - // Set Authenticator for password-protected URL access to use - // APasswordDialog. - Authenticator.setDefault(APasswordDialog.getAuthenticator(this)); - - } // AGUI() ------------------------------------------------------------- - - - - /** - * Limit the total width of Atlantis to this number of pixels. - * - * @param maxWidth the maximum allowed width in pixels (0 = screen width) - */ - public void setMaxWidth(int maxWidth) { - this.maxWidth = maxWidth; - } - - /** - * Constructs all menu bar (master) items and returns its instance - * @return JMenuBar - */ - private JMenuBar constructAndGetMenuBar() - { - JMenuBar menuBar = new JMenuBar(); - menuBar.add(new AFileControl()); // File menu bar item - menuBar.add(new APreferencesControl()); // Preferences menu bar item - menuBar.add(new AListsControl()); // List manager - - // Spacing, remaining buttons are aligned to the right - menuBar.add(Box.createHorizontalGlue()); - - // Reset button - AMenuButton defaults = new AMenuButton("Reset"); - defaults.setToolTipText("Reload default settings"); - defaults.setBorder(null); - defaults.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - restoreDefaults(); - } - }); - menuBar.add(defaults); - - // Demo button - AMenuButton demoButton = new AMenuButton("Demo"); - demoButton.setToolTipText("Start Demo mode"); - demoButton.setBorder(null); - demoButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - ADemoDialog.getInstance().setVisible(true); - } - }); - menuBar.add(demoButton); - - // Help menu item - menuBar.add(new AHelpControl()); - - return menuBar; - - } // constructAndGetMenuBar() ------------------------------------------- - - - - /** - * This gets called when the current layout changes in ACanvas - */ - public void layoutChanged(ACanvas canvas) { - - // adapt the width of the GUI - Rectangle screenSize = canvas.getScreenSize(); - - int useWidth = screenSize.width; - if (maxWidth > 0 && useWidth > maxWidth) { - useWidth = maxWidth; - } - - Rectangle canvbound = canvas.getStartupCanvasSize(); - int guiHeight = canvbound.height; - if (canvas.getCurrentLayout().getName().equals("FULL SCREEN")) { - int guiWidth = useWidth / 4; - setBounds(useWidth * 3 / 4, 0, guiWidth, guiHeight); - // minimise the gui in fullscreen mode - int state = getExtendedState(); - state |= JFrame.ICONIFIED; - setExtendedState(state); - } else { - int guiWidth = useWidth - canvbound.width - canvbound.x; - setBounds(canvbound.x + canvbound.width, canvbound.y, guiWidth, guiHeight); - } - } // layoutChanged() ----------------------------------------------------- - - /** - * This gets called when the current window changes in ACanvas - * @param e The ChangeEvent from the Window - */ - public void stateChanged(ChangeEvent e) - { - setSelectedTab(ACanvas.getCanvas().getCurrentWindow().getGroupName()); - if(interactionToolBar != null) panel.remove(interactionToolBar); - interactionToolBar = ACanvas.getCanvas().getCurrentWindow().getInteractionToolBar(); - // if there is an InteractionToolBar for this window (and projection) - // add it to the GUI. - if(interactionToolBar != null) - { - interactionToolBar.setName("Atlantis interaction toolbar"); - panel.add(interactionToolBar, AGUILayoutManager.AVAILABLExPREFERRED, 0); - interactionToolBar.connect(); - } - validate(); - } // stateChanged() ----------------------------------------------------- - - - - private void setSelectedTab(String newTabName) - { - for(int i = 0; i < groups.length; i++) - for(int j = 0; j < groups[i].length; j++) - if(groups[i][j].getGroupName().equals(newTabName)) - { - for(int k = 0; k < groups.length; k++) - if(k != i) - { - if(tabbedPane[k].getSelectedIndex() != -1) - { - tabbedPane[k].removeChangeListener(tabChangeListener[k]); - tabbedPane[k].setSelectedIndex( -1); - tabbedPane[k].addChangeListener(tabChangeListener[k]); - } - } - tabbedPane[i].removeChangeListener(tabChangeListener[i]); - tabbedPane[i].setSelectedIndex(j); - tabbedPane[i].addChangeListener(tabChangeListener[i]); - outerTabbedPane.setSelectedIndex(i); - if(pages[i][j].pTable != null) - pages[i][j].pTable.refresh(); - break; - } - } // setSelectedTab() --------------------------------------------------- - - - - public String getCurrentGroup() - { - return ACanvas.getCanvas().getCurrentWindow().getGroupName(); - } // getCurrentGroup() -------------------------------------------------- - - - - public void refresh() - { - if(groups != null) - { - for(int i = 0; i < groups.length; i++) - for(int j = 0; j < groups[i].length; j++) - if(pages[i][j].pTable != null) - pages[i][j].pTable.refresh(); - } - } // refresh() ---------------------------------------------------------- - - - public void repaintTable() - { - if(tabbedPane != null) - for(int i = 0; i < tabbedPane.length; i++) - if(tabbedPane[i] != null) - tabbedPane[i].repaint(); - } // repaintTable() ----------------------------------------------------- - - - - /** - * Restore all the default configuration - */ - public void restoreDefaults() - { - //restore default parameters - parameterStore.restoreDefaults(); - //reset primary vertex in current event if there is one - if (eventManager.getCurrentEvent() != null) { - eventManager.getCurrentEvent().setPrimaryVertex(); - } - //reset all list - AListManager.getInstance().reset(); - //Finally refresh GUI and canvas - this.refresh(); - ACanvas.getCanvas().restoreDefaults(); - - } // restoreDefaults() -------------------------------------------------- - - - - class TabChangeListener implements ChangeListener - { - public void stateChanged(ChangeEvent e) - { - JTabbedPane tabbedPane = (JTabbedPane) e.getSource(); - int index = tabbedPane.getSelectedIndex(); - if(index > -1) - { - int parentIndex = ((JTabbedPane) tabbedPane.getParent()). - getSelectedIndex(); - String name = groups[parentIndex][index].getGroupName(); - ACommandProcessor.receive(name + "."); - pages[parentIndex][index].repaint(); - pages[parentIndex][index].pTable.refresh(); - if(groups[parentIndex][index].getUIUsage() == - AParametersGroup.PROJECTION) - { - AProjection p = AProjectionsManager.getProjection(name); - ACanvas.getCanvas().getCurrentWindow().setProjection(p); - } - } - - } // stateChanged() ------------------------------------------------- - - } // class TabChangeListener ============================================ - - - - class OuterTabChangeListener implements ChangeListener - { - public void stateChanged(ChangeEvent e) - { - JTabbedPane tabbedPane = (JTabbedPane) e.getSource(); - int parentIndex = tabbedPane.getSelectedIndex(); - if(parentIndex > -1) - { - JTabbedPane child = (JTabbedPane) tabbedPane.getSelectedComponent(); - if(child.getTabCount() == 0) - { - child.setSelectedIndex( -1); - } - else - { - int index = 0; - String name = groups[parentIndex][index].getGroupName(); - // for projections don't change the current one - if(groups[parentIndex][index].getUIUsage() == - AParametersGroup.PROJECTION) - { - name = ACanvas.getCanvas().getCurrentWindow().getProjection(). - getName(); - for(int i = 0; i < groups[parentIndex].length; ++i) - { - if(groups[parentIndex][i].getGroupName().equals(name)) - index = i; - } - } - ACommandProcessor.receive(name + "."); - pages[parentIndex][index].repaint(); - pages[parentIndex][index].pTable.refresh(); - if(groups[parentIndex][index].getUIUsage() == - AParametersGroup.PROJECTION) - { - AProjection p = AProjectionsManager.getProjection(name); - ACanvas.getCanvas().getCurrentWindow().setProjection(p); - } - } - } - - } // stateChanged() ------------------------------------------------- - - } // class OuterTabChangeListener ======================================= - - - - static class TabDragListener implements ADragListener - { - public void dragPerformed(Object from, Object to, int action) - { - String wName; - if(to instanceof ADnDLabel) - wName = ((ADnDLabel) to).getText(); - else if(to instanceof AWindow) - wName = ((AWindow) to).getName(); - else - wName = "???"; - JTabbedPane tp = (JTabbedPane) from; - String tabName = tp.getTitleAt(tp.getSelectedIndex()); - AOutput.append("Drag of " + tabName + " into window " + wName + "\n", - ALogInterface.COMMAND); - parameterStore.copyCurrentGroupLocalsTo(wName); - ACanvas.getCanvas().getWindow(wName).repaintFromScratch(); - - } // dragPerformed() ------------------------------------------------ - - } // class TabDragListener ============================================== - - @Override - public void parameterChanged(AParameter parameter) { - this.repaintTable(); - - if(parameter.getName().equals("Mode")){ - int calomode = parameterStore.get("LegoPlot", "Mode").getI(); - - //set different nphicells and netacells combinations depending on the <calo view> selection as it is used in the L1Calo configuration file - if (calomode== 0){ - parameterStore.get("LegoPlot", "nphicells").setI(128); - parameterStore.get("LegoPlot", "netacells").setI(200); - } - else if (calomode== 1){ - parameterStore.get("LegoPlot", "nphicells").setI(64); - parameterStore.get("LegoPlot", "netacells").setI(100); - } - else if (calomode== 2){ - parameterStore.get("LegoPlot", "nphicells").setI(32); - parameterStore.get("LegoPlot", "netacells").setI(50); - } - } - } - -} // class AGUI ============================================================= diff --git a/graphics/AtlantisJava/src/atlantis/gui/AGUILayoutManager.java b/graphics/AtlantisJava/src/atlantis/gui/AGUILayoutManager.java deleted file mode 100755 index f7959d5155e9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AGUILayoutManager.java +++ /dev/null @@ -1,131 +0,0 @@ -package atlantis.gui; - -import java.awt.Container; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.LayoutManager2; -import javax.swing.JComponent; -import javax.swing.JToolBar; - -/** - * The layout manager used by the GUI. It arranges the componets in a column. - * The width is set to that of the window. - * The height is set to the preffered height of the component. - * One of the components will take all the remaining space. - */ -public class AGUILayoutManager implements LayoutManager2 { - - private final static int PxP=0; - private final static int AxP=1; - private final static int AxA=2; - - public final static Integer PREFERREDxPREFERRED=new Integer(PxP); - public final static Integer AVAILABLExPREFERRED=new Integer(AxP); - public final static Integer AVAILABLExAVAILABLE=new Integer(AxA); - - private final static String AGUI_LAYOUT_CONSTRAINT="AGUILayoutManager.StringConstraint"; - - /** - * Get the constraints registered for given component. - */ - public Integer getConstraints(Component comp) { - JComponent jc=(JComponent)comp; - - Integer constraint=(Integer)jc.getClientProperty(AGUI_LAYOUT_CONSTRAINT); - - return constraint; - } - - public void addLayoutComponent(Component comp, Object constraint) { - if(!(comp instanceof JComponent)) - throw new Error("AGUILayoutManager: not a JComponent"); - - if(!(constraint instanceof Integer)) - throw new Error("AGUILayoutManager: not a Integer"); - - JComponent jc=(JComponent)comp; - - jc.putClientProperty(AGUI_LAYOUT_CONSTRAINT, constraint); - } - - public void layoutContainer(Container parent) { - int W=parent.getSize().width; - int H=parent.getSize().height; - - Component[] comp=parent.getComponents(); - int[] constraint=new int[comp.length]; - - int AxA_Index=comp.length; - - for(int i=0; i<comp.length; i++) { - constraint[i]=getConstraints(comp[i]).intValue(); - if(constraint[i]==AxA) AxA_Index=i; - } - - int hi=0; - - for(int i=0; i<AxA_Index; i++) { - comp[i].setSize(W, 0); - Dimension cSize=comp[i].getPreferredSize(); - - switch(constraint[i]) { - case PxP: - comp[i].setBounds((W-cSize.width)/2, hi, cSize.width, cSize.height); - break; - - case AxP: - comp[i].setBounds(0, hi, W, cSize.height); - break; - } - hi+=cSize.height; - } - - int hi2=H; - - for(int i=comp.length-1; i>AxA_Index; i--) { - comp[i].setSize(W, 0); - Dimension cSize=comp[i].getPreferredSize(); - - hi2-=cSize.height; - switch(constraint[i]) { - case PxP: - comp[i].setBounds((W-cSize.width)/2, hi2, cSize.width, cSize.height); - break; - - case AxP: - comp[i].setBounds(0, hi2, W, cSize.height); - break; - } - } - - if(AxA_Index!=comp.length) - comp[AxA_Index].setBounds(0, hi, W, hi2-hi); - } - - public Dimension minimumLayoutSize(Container parent) { - return new Dimension(0, 0); - } - - public Dimension preferredLayoutSize(Container parent) { - return new Dimension(0, 0); - } - - public float getLayoutAlignmentX(Container target) { - return 0.5f; - } - - public float getLayoutAlignmentY(Container target) { - return 0.5f; - } - - public Dimension maximumLayoutSize(Container target) { - return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); - } - - public void addLayoutComponent(String name, Component comp) {} - - public void removeLayoutComponent(Component comp) {} - - public void invalidateLayout(Container target) {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AGUIUtilities.java b/graphics/AtlantisJava/src/atlantis/gui/AGUIUtilities.java deleted file mode 100644 index e699def52ebc..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AGUIUtilities.java +++ /dev/null @@ -1,167 +0,0 @@ -package atlantis.gui; - -import java.awt.Component; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; - -import atlantis.globals.AGlobals; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AUtilities; - -/** - * Utility methods related to the GUI. Moved from utils.Utilities. - * - * @author waugh - */ -public class AGUIUtilities { - - private static final AGlobals globals = AGlobals.instance(); - - /** - * Save file dialog. Show the dialog with prepared name of the file in - * the directory. Returns the selected directory. - * - * @param component JDialog - * @param directory String - * @param fileName String - * @param data byte[] - * @param title String - * @param ext extension for file filter - * return selectedDirectory String - */ - public static String chooseFileAndWrite(Component component, String directory, - String fileName, byte[] data, String title, String ext) - throws AAtlantisException - { - String selectedDirectory = directory; - - if(directory == null) - { - directory = AGlobals.instance().getHomeDirectory(); - } - - JFileChooser chooser = new JFileChooser(directory); - chooser.setDialogTitle(title); - chooser.setSelectedFile(new File(fileName)); - SaveDialogFileFilter filter = new SaveDialogFileFilter(ext); - chooser.setFileFilter(filter); - - int returnVal = chooser.showSaveDialog(component); - - if(returnVal == JFileChooser.APPROVE_OPTION) - { - String absPath = chooser.getSelectedFile().getAbsolutePath(); - File f = new File(absPath); - if(f.exists()) - { - try - { - renameFile(absPath, title); - } - catch(Exception ex) - { - throw new AAtlantisException(ex.getMessage()); - } - } - // the selected file either existed and is now successfully - // renamed, or didn't exist so can proceed to store data - try - { - OutputStream s = - new BufferedOutputStream(new FileOutputStream(absPath)); - s.write(data); - s.close(); - selectedDirectory = chooser.getSelectedFile().getParent(); - } - catch(FileNotFoundException ex) - { - String msg = "Couldn't create the file.\nInsufficient permissions."; - throw new AAtlantisException(msg); - } - catch(IOException ex) - { - String msg = "IO Error when writing the\ndata into the file."; - throw new AAtlantisException(msg); - } - } - return selectedDirectory; - - } // chooseFileAndWrite() ----------------------------------------------- - - - /** - * renames file (backup when saving configuration, canvas plot, etc) - * to 'name' + backup suffix - */ - private static void renameFile(String name, String title) throws Exception - { - String backupSuffix = "-backup_on_" + AUtilities.getDateTimeString(); - String dstName = name + backupSuffix; - String errorMsg = "Renaming\n" + name + "\nto\n" + dstName + "\nfailed."; - String msg = name + "\nexists and was successfully renamed to\n" + dstName; - - try - { - AUtilities.logger.debug("Renaming file " + name + " to " + dstName + " ..."); - File f = new File(name); - if(! f.renameTo(new File(dstName))) - { - AUtilities.logger.error(errorMsg); - throw new Exception(errorMsg); - } - AUtilities.logger.debug(msg); - JOptionPane.showMessageDialog(globals.getGuiFrame(), msg, title, - JOptionPane.INFORMATION_MESSAGE); - } - catch(Exception ex) - { - AUtilities.logger.debug(ex.getMessage(), ex); - throw new Exception(errorMsg); - } - - } // renameFile() ------------------------------------------------------- - - - private static class SaveDialogFileFilter extends FileFilter - { - private String extension = null; - - public SaveDialogFileFilter(String acceptedExtension) - { - extension = acceptedExtension; - } - - // accept all directories and all files of "extension" - public boolean accept(File f) - { - if (f.isDirectory()) - { - return true; - } - - String s = f.getName(); - - if(s.toLowerCase().endsWith(extension)) - { - return true; - } - - return false; - } - - public String getDescription() - { - return extension; - } - - } // SaveDialogFileFilter =================================================== - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AHelpControl.java b/graphics/AtlantisJava/src/atlantis/gui/AHelpControl.java deleted file mode 100755 index 787c56609d76..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AHelpControl.java +++ /dev/null @@ -1,45 +0,0 @@ -package atlantis.gui; - -import javax.swing.JMenu; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -/** - * The Help menu in the GUI. - */ -public class AHelpControl extends JMenu -{ - public AHelpControl() - { - super("Help"); - add("Online Help System").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AHelpSystem.getInstance().showPage("HelpHowTo"); - } - }); - add("Modifier Keys").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AMouseHelpDialog.getInstance().setVisible(true); - } - }); - add("Current color and collection summary").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AColorHelpDialog.getInstance().setVisible(true); - } - }); - add("About...").addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - AAboutDialog.getInstance().setVisible(true); - } - }); - - } // AHelpControl() ----------------------------------------------------- -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AHelpSystem.java b/graphics/AtlantisJava/src/atlantis/gui/AHelpSystem.java deleted file mode 100755 index 43ee7551bd73..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AHelpSystem.java +++ /dev/null @@ -1,118 +0,0 @@ -package atlantis.gui; - -import atlantis.graphics.AIcon; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.ALogger; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.net.URL; - -import javax.help.BadIDException; -import javax.help.HelpSet; -import javax.help.JHelp; -import javax.swing.JFrame; - - - -public class AHelpSystem extends JFrame -{ - private static ALogger logger = ALogger.getLogger(AHelpSystem.class); - - private static AHelpSystem instance = null; - private static String hsPath = "jhelpset.hs"; - private static JHelp helpViewer = null; - - - static - { - HelpSet hs = getHelpSet(hsPath); - // HelpBroker hb = hs.createHelpBroker(); - helpViewer = new JHelp(hs); - helpViewer.setCurrentID("HelpHowTo"); - } - - - private AHelpSystem() - { - super("Atlantis Online Help"); - addWindowListener(new WindowAdapter() - { - public void windowClosing(WindowEvent e) - { - dispose(); - instance = null; - } - }); - this.getContentPane().add(helpViewer); - this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - AIcon.setIconImage(this); - this.setSize(900, 600); - - } // AHelpSystem() ------------------------------------------------------ - - - - public static AHelpSystem getInstance() - { - if(instance == null) - { - instance = new AHelpSystem(); - } - return instance; - - } // getInstance() ------------------------------------------------------ - - - - public void showPage(String pageName) - { - try - { - helpViewer.setCurrentID(pageName); - // clear the iconified bit (no matter whether or not it is - // current iconified) - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - this.setLocation((int)(Math.max(0, (screenSize.getWidth()-this.getWidth())/2)), (int)((screenSize.getHeight()-this.getHeight())/3)); - this.setExtendedState(this.getExtendedState() & ~Frame.ICONIFIED); - this.setVisible(true); - } - catch(BadIDException ex) - { - AOutput.alwaysAppend("\nNo help for \"" + pageName + "\", sorry.\n", - ALogInterface.BAD_COMMAND); - } - - } // showPage() --------------------------------------------------------- - - - - private static HelpSet getHelpSet(String helpSetFile) - { - HelpSet hs = null; - // ClassLoader cl = this.getClass().getClassLoader(); // if not static - ClassLoader cl = AHelpSystem.class.getClassLoader(); - try - { - // helpSetFile must contain just the name of HelpSet file (.hs), - // .jar file containing the whole help must be in the classpath - // then the file is successfully found. returns null if helpSetFile - // contains the whole absolute / relative path - URL hsURL = HelpSet.findHelpSet(cl, helpSetFile); - // hs = new HelpSet(null, hsURL); - hs = new HelpSet(cl, hsURL); - } - catch(Exception ee) - { - logger.error("AHelpSystem: " + ee.getMessage(), ee); - logger.error("AHelpSystem: " + helpSetFile + " not found"); - } - return hs; - - } // getHelpSet() ------------------------------------------------------- - - -} // class AHelpSystem ====================================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/AInteractionToolBar.java b/graphics/AtlantisJava/src/atlantis/gui/AInteractionToolBar.java deleted file mode 100755 index ff7e0e652344..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AInteractionToolBar.java +++ /dev/null @@ -1,429 +0,0 @@ -package atlantis.gui; - -import java.awt.FlowLayout; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import java.lang.reflect.Constructor; -import java.util.Hashtable; -import java.util.Vector; - -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JToggleButton; -import javax.swing.JToolBar; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.globals.AGlobals; -import atlantis.graphics.layout.AFlowLayout; -import atlantis.interactions.AInteractionGroup; -import atlantis.interactions.AInteractionsConfigReader; -import atlantis.interactions.AInteractionsManager; -import atlantis.output.AExceptionHandler; -import atlantis.projection.AProjectionsManager; -import atlantis.utils.AUtilities; -import javax.swing.*; - -/** - * The ToolBar that appears in the GUI and shows the set of interactions for a - * window. - * @author maillard - */ - -public class AInteractionToolBar extends JToolBar { - // the interactionsmanager this toolbar talks to - private AInteractionsManager iManager; - - // currently selected group - private AInteractionGroup currentGroup; - - /* previously selected group, needed for the history feature: - * when we select a global interaction (eg SyncCursors), then all windows will use it. - * If then we deselect it, all the windows will go back to their previous interactions */ - private AInteractionGroup previousGroup; - - // a panel that displays the additional controls needed by some interaction groups - private JPanel controls; - - // base path for all radio button icons - private final static String iconBasePath = - AGlobals.instance().getHomeDirectory()+"img"+System.getProperty("file.separator")+"interaction_"; - - // button group for all radio buttons - private ButtonGroup buttonGroup; - - // vector containing all interactionsgroups belonging to this toolbar - Vector<AInteractionGroup> groups; - - // make the pool for holding the Interactions Control and the projections Menus - private static Hashtable<String, Hashtable<String, AInteractionToolBar>> interactionControlsPool = - new Hashtable<String, Hashtable<String, AInteractionToolBar>>(20); - - public static Hashtable<String, Hashtable<String, JPopupMenu>> interactionMenusPool = - new Hashtable<String, Hashtable<String, JPopupMenu>>(20); - - /** - * Creates an InteractionToolBar to work with a particular - * InteractionsManager. - * - * @param iManager The InteractionsManager. - */ - public AInteractionToolBar(AInteractionsManager iManager) { - // call parent constructor - super(); - this.setLayout(new AFlowLayout(5, 5)); - - //make the toolbar non-detachable (can not be detachable - //as long as it does not sit inside an BorderLayout) - this.setFloatable(false); - this.setOpaque(false); - - this.iManager = iManager; - - groups = new Vector<AInteractionGroup>(); - controls = new JPanel(); - buttonGroup = new ButtonGroup(); - } - - /** - * Returns the InteractionsManager associated with this InteractionToolBar. - * - * @return The InteractionsManager - */ - public AInteractionsManager getInteractionsManager() { - return iManager; - } - - /** - * Called each time by the InteractionsManager when the ToolBar is connected - * to it. Should be used to perform some initializations. - */ - public void connect() { - iManager.setContext(getSelectedGroup()); - if (getSelectedGroup() != null) - AMouseHelpDialog.getInstance().processInteractionChange(getSelectedGroup().getInteractions()); - } - - /** - * Adds the group to the InteractionToolBar. The group can - * register some interactions. - * @param group the group to be added. - */ - public void addGroup(AInteractionGroup group, String toolTipText) { - groups.addElement(group); - final String groupName = group.getGroupName(); - - // set up a button for the interaction group - String iconPath = iconBasePath + groupName.toLowerCase() + ".png"; - - ImageIcon newIcon = AUtilities.getFileAsImageIcon(iconPath); - JToggleButton newButton = new JToggleButton(newIcon); - newButton.setName(group.getGroupName()); - newButton.setToolTipText(toolTipText); - - // add the action listener - newButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - buttonClicked(groupName); - } - }); - - // add the mouse listener for the help system - newButton.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - // if the user right clicks on a button - if (AUtilities.isRightMouseButton(e)) { - JToggleButton butt = (JToggleButton) e.getSource(); - // find the corresponding interactions group - if(findGroup(butt.getName()) != null) { - String className = findGroup(butt.getName()).getClass().getName(); - String temp = className.substring(className.lastIndexOf('.') + ".A".length()); - className = temp.substring(0, temp.length() - "Group".length()); - // show the help page for the group - AHelpSystem.getInstance().showPage(className); - } - } - } - }); - - // remove the controls panel so that the new button will - // not appear after it - this.remove(controls); - - // add the button to the ButtonGroup and to the ToolBar - buttonGroup.add(newButton); - this.add(newButton); - - // now we can put the controls panel back - this.add(controls,-1); - - // repaint the toolbar - this.validate(); - this.repaint(); - } - - /** - * Returns an array containing all the groups registered in this ToolBar. - * @return the groups - */ - public AInteractionGroup[] getGroups() { - return (AInteractionGroup[]) groups.toArray(new AInteractionGroup[0]); - } - - /** - * Returns the current interactionsgroup. - * @return the selected group. - */ - public AInteractionGroup getSelectedGroup() { - return currentGroup; - } - - /** - * Returns the name of the current interactionsgroup. - * - * @return the selected group name. - */ - public String getSelectedGroupName() { - return currentGroup.getGroupName(); - } - - /** - * Sets the interactionsgroup given its name, by - * performing a click on it. - * @param groupName the name of the group. - */ - public void setSelectedGroup(String groupName) { - // loop through the interaction groups - for(AInteractionGroup iG : groups) { - // find the one with the corresponding name - if(iG.getGroupName().equals(groupName)) { - // click the corresponding button - for(int i = 0; i < groups.size(); i++) { - if(this.getComponentAtIndex(i) instanceof JToggleButton - && this.getComponentAtIndex(i).getName().equals(groupName)) { - ((JToggleButton) this.getComponentAtIndex(i)).doClick(); - return; - } - } - } - } - } - - /** - * Returns a group based on its name - * @return the interactionsgroup (if found) or null - */ - public AInteractionGroup findGroup(String screenName) { - for(AInteractionGroup iG : groups) { - if(iG.getGroupName().equals(screenName)) return iG; - } - return null; - } - - /** - * Activate the default interactionsgroup (the first one) - */ - public void setDefaultGroup() { - // if there are any interaction groups - if (groups.size() > 0) { - // select the first one - setSelectedGroup(groups.elementAt(0).getGroupName()); - } - } - - /** - * Restore the previously selected group, if there was one. - */ - public void restorePreviousGroup() { - if (previousGroup != null) - this.setSelectedGroup(previousGroup.getGroupName()); - } - - /** - * This gets called when one of the buttons in the toolbar - * is clicked. It notifies the InteractionManager. - * @param groupName the name of the InteractionGroup to be activated - */ - public void buttonClicked(String groupName) { - AInteractionGroup deselectedGroup = currentGroup; - // loop through the groups - for(AInteractionGroup iG : groups) { - // find the one with the corresponding name - if(iG.getGroupName().equals(groupName)) { - // notify the interactionsmanager of the change - iManager.setContext(iG); - - // remove the old additional controls panel, add the new one - this.remove(controls); - if(iG.hasAdditionalControls()) controls = iG.getAdditionalControls(); - else controls = new JPanel(); - this.add(controls,-1); - if (this.getParent() != null) { - this.getParent().validate(); - } - - // take care of the history (previousGroup remembers the last non-global group) - AMouseHelpDialog.getInstance().processInteractionChange(iG.getInteractions()); - if (currentGroup != null && currentGroup.isWindowGroup()) { - previousGroup = currentGroup; - } - currentGroup = iG; - - if(ACanvas.getCanvas().getCurrentWindow() != null) - // if the interactionsgroup is global, update the other windows - if ((iG.isCanvasGroup()) && iManager.getWindow().isCurrent()) { - String[] wName = ACanvas.getCanvas().getCurrentLayout().getWindowNames(); - for (int i = 0; i < wName.length; i++) - if (!wName[i].equals(iManager.getWindow().getName())) { - ACanvas.getCanvas().getWindow(wName[i]) - .getInteractionToolBar().setSelectedGroup(iG.getGroupName()); - } - } - // if a global interactionsgroup was deselected, restore the - // previous groups in all the other windows - if(deselectedGroup != null && deselectedGroup.isCanvasGroup() - && iManager.getWindow().isCurrent()) { - String[] wName = ACanvas.getCanvas().getCurrentLayout().getWindowNames(); - for (int i = 0; i < wName.length; i++) - if (!wName[i].equals(iManager.getWindow().getName())) - ACanvas.getCanvas().getWindow(wName[i]) - .getInteractionToolBar().restorePreviousGroup(); - } - } - } - } - - /** - * Used to get the InteractionControl object for a specific window and projection. - * @param wName The name of the window - * @param pName The name of the projection - * @return The AInteractionToolBar for that window and projection - */ - public static AInteractionToolBar getInteractionToolBar(String wName, String pName) { - if(!ACanvas.getCanvas().isValidWindowName(wName)) - throw new Error("Invalid window name"); - - if(!AProjectionsManager.isValidProjection(pName)) - throw new Error("Invalid projection name"); - - Hashtable<String, AInteractionToolBar> list = interactionControlsPool.get(wName); - - if(list==null) { - list=new Hashtable<String, AInteractionToolBar>(10); - interactionControlsPool.put(wName, list); - } - - AInteractionToolBar control=list.get(pName); - - if(control==null) { - control=makeInteractionToolBar(ACanvas.getCanvas().getWindow(wName), - AInteractionsConfigReader.getNode(pName)); - // if there really existed an InteractionControl register it. - if(control!=null) - list.put(pName, control); - } - - return control; - } - - /** - * Returns the Interaction's PopupMenu. - * @param window - * @return the new popup menu object - */ - public static JPopupMenu getInteractionMenu(AWindow window) { - String wName=window.getName(); - String pName=window.getProjection().getName(); - - if(!ACanvas.getCanvas().isValidWindowName(wName)) - throw new Error("Invalid window name"); - - if(!AProjectionsManager.isValidProjection(pName)) - throw new Error("Invalid projection name"); - - Hashtable<String, JPopupMenu> list=interactionMenusPool.get(wName); - - if(list==null) { - list=new Hashtable<String, JPopupMenu>(10); - interactionMenusPool.put(wName, list); - } - - JPopupMenu menu=list.get(pName); - - if(menu==null) { - menu=makePopupMenu(getInteractionToolBar(wName, pName)); - list.put(pName, menu); - } - - return menu; - } - - /** Creates the AInteractionToolBar and returns a pointer to it - * - * @param window - * @param node - * @return the interaction tool bar - */ - public static AInteractionToolBar makeInteractionToolBar(AWindow window, Node node) { - // check whether we really got a Node with information. If not return null; - if(node==null) return null; - - AInteractionToolBar root=new AInteractionToolBar(window.getInteractionManager()); - - NodeList childs=node.getChildNodes(); - - for(int i=0; i<childs.getLength(); i++) { - Node child=childs.item(i); - - if(child.getNodeType()==Node.ELEMENT_NODE) { - String fileName=child.getAttributes().getNamedItem("fileName").getNodeValue(); - String screenName=child.getAttributes().getNamedItem("screenName").getNodeValue(); - String toolTip=child.getAttributes().getNamedItem("toolTip").getNodeValue(); - - if(child.getNodeName().equals("Panel")) - root.addGroup(makeInteractionGroup(window, fileName, screenName), toolTip); - } - } - - //Also select the default interaction group - root.setDefaultGroup(); - - return root; - } - - private static AInteractionGroup makeInteractionGroup( - AWindow window, String fileName, String screenName) { - Object group=null; - - try { - Constructor[] c=Class.forName("atlantis.interactions.A"+fileName+"Group").getDeclaredConstructors(); - - group=c[0].newInstance(new Object[] {window.getInteractionManager()}); - } catch(Exception e) { - e.printStackTrace(); - AExceptionHandler.processException("Cannot make interaction group "+"A"+fileName+"Group", e); - } - ((AInteractionGroup)group).setGroupName(screenName); - return(AInteractionGroup)group; - } - - private static JPopupMenu makePopupMenu(AInteractionToolBar root) { - JPopupMenu menu=new JPopupMenu(); - - AInteractionGroup[] panels=root.getGroups(); - - for(int i=0; i<panels.length; i++) - menu.add(panels[i].getPopupItem()); - - return menu; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AItemTabbedPane.java b/graphics/AtlantisJava/src/atlantis/gui/AItemTabbedPane.java deleted file mode 100755 index 901642ad4d73..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AItemTabbedPane.java +++ /dev/null @@ -1,144 +0,0 @@ -package atlantis.gui; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.event.*; - -// Gary- DnD facility commented out as it does not fully work -// ( Window control is left in funny state) -// and is not something i have ever used..... - -/** - * A TabbedPane which generates events when a tab is selected - * and when a tab is deselected. - * Provides DnD support. - */ -public class AItemTabbedPane extends JTabbedPane - implements // for Item Selectability - ItemSelectable, ChangeListener { -// // for drag and drop -// DragSourceListener, DragGestureListener, ACallBack { - - private Component current; - private Component previous; - private ItemListener itemListener; - private ItemEvent itemEvent; - -// private DragSource dragSource=null; -// private Vector dragListeners; - - public AItemTabbedPane(int tabPlacement) { - super(tabPlacement); - // tabs don't change on right click rather help appears. - setUI(new ATabbedPaneUI()); - - current=null; - previous=null; - this.addChangeListener(this); - -// // initializing drag and drop -// dragSource=new DragSource(); -// dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); - -// dragListeners=new Vector(); - } - - public Component getPreviousSelectedComponent() { - if(previous==null) - return getSelectedComponent(); - else - return previous; - } - - public void stateChanged(ChangeEvent e) { - previous=current; - - if((current!=null)&&(itemListener!=null)) { - itemEvent=new ItemEvent(this, 0, current, ItemEvent.DESELECTED); - itemListener.itemStateChanged(itemEvent); - } - - current=getSelectedComponent(); - - if(itemListener!=null) { - itemEvent=new ItemEvent(this, 0, current, ItemEvent.SELECTED); - itemListener.itemStateChanged(itemEvent); - } - } - - // Add a listener to recieve item events when the state of an tab changes. - public void addItemListener(ItemListener l) { - itemListener=l; - } - - // Returns the selected items or null if no items are selected. - public Object[] getSelectedObjects() { - return null; - } - - // Removes an item listener. - public void removeItemListener(ItemListener l) { - if(itemListener.equals(l)) - itemListener=null; - } - - public Dimension getPreferredSize() { - this.getLayout().layoutContainer(this); - return super.getPreferredSize(); - } - -/* - // implementation of DragSourceListener - - // This method is invoked to signify that the Drag and Drop operation is complete. - public void dragDropEnd(DragSourceDropEvent dsde) {} - - // Called as the hotspot enters a platform dependent drop site. - public void dragEnter(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_VALID); - } - - // Called as the hotspot exits a platform dependent drop site. - public void dragExit(DragSourceEvent dse) { - dse.getDragSourceContext().setCursor(ADnDLabel.DROP_INVALID); - } - - // Called as the hotspot moves over a platform dependent drop site. - public void dragOver(DragSourceDragEvent dsde) { - dsde.getDragSourceContext().setCursor(ADnDLabel.DROP_VALID); - } - - // Called when the user has modified the drop gesture. - public void dropActionChanged(DragSourceDragEvent dsde) {} - - // implementation of DragGestureListener - - public void dragGestureRecognized(DragGestureEvent dge) { - Point p=dge.getDragOrigin(); - - if(getSelectedIndex()==getUI().tabForCoordinate(this, p.x, p.y)) { - AObjectTransferable cbt=new AObjectTransferable(this); - - dragSource.startDrag(dge, ADnDLabel.DROP_INVALID, cbt, this); - } - } - - public void callBack(Object to) { - for(int i=0; i<dragListeners.size(); i++) - ((ADragListener)dragListeners.get(i)).dragPerformed(this, to, -1); - } - - public void addDragListener(ADragListener l) { - dragListeners.addElement(l); - } - - public void addChangeListener(ChangeListener l) { - super.addChangeListener(l); - } - - public void removeChangeListener(ChangeListener l) { - super.removeChangeListener(l); - } -*/ -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ALayoutDialog.java b/graphics/AtlantisJava/src/atlantis/gui/ALayoutDialog.java deleted file mode 100755 index 93e07f52794a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ALayoutDialog.java +++ /dev/null @@ -1,109 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JRadioButton; - -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; - -/** - * A dialog which lets the user to select between the different layouts of the - * canvas. - */ -public class ALayoutDialog extends JDialog implements ActionListener -{ - private JPanel choosePanel; - private JPanel buttonsPanel; - private JButton okButton, cancelButton; - private JRadioButton selected; - - private static final AGlobals globals = AGlobals.instance(); - - public ALayoutDialog() - { - super(globals.getGuiFrame(), "Layout Properties Dialog", true); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - setResizable(false); - - choosePanel = new JPanel(); - choosePanel.setBorder(BorderFactory.createTitledBorder(" Select Layout ")); - - String[] layoutNames = ACanvas.getCanvas().getLayoutNames(); - ButtonGroup group = new ButtonGroup(); - - choosePanel.setLayout(new GridLayout(layoutNames.length, 1)); - for (int i = 0; i < layoutNames.length; i++) - { - JRadioButton r = new JRadioButton(layoutNames[i]); - - r.addActionListener(this); - if (ACanvas.getCanvas().getCurrentLayout().getName().equals(layoutNames[i])) - { - selected = r; - r.setSelected(true); - } - else - r.setSelected(false); - group.add(r); - choosePanel.add(r); - } - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(choosePanel, BorderLayout.CENTER); - - okButton = new JButton("OK"); - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - ACanvas.getCanvas().setCurrentLayout(selected.getText()); - dispose(); - ACanvas.getCanvas().bringToFront(); - } - }); - - cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - dispose(); - } - }); - - buttonsPanel = new JPanel(); - buttonsPanel.add(okButton); - buttonsPanel.add(cancelButton); - getContentPane().add(buttonsPanel, BorderLayout.SOUTH); - pack(); - - // set the initial location - AGUI gui = AGUI.getGUI(); - int guiWidth = gui.getWidth(); - int guiHeight = gui.getHeight(); - int guiX = gui.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if(guiX+guiWidth+(dialogWidth-guiWidth)/2>screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max(0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), Math.max(0, (guiHeight - dialogHeight) / 3)); - setVisible(true); - } - - public void actionPerformed(ActionEvent e) - { - selected = (JRadioButton) e.getSource(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ALazyPanel.java b/graphics/AtlantisJava/src/atlantis/gui/ALazyPanel.java deleted file mode 100755 index d6caed6c259b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ALazyPanel.java +++ /dev/null @@ -1,109 +0,0 @@ -package atlantis.gui; - -import java.awt.Graphics; -import javax.swing.JPanel; - -/** - * LazyPanel is an abstract base class that provides functionality - * to defer populating a Panel object until it is actually viewed. - * This is extremely useful when using CardLayout and tab panel - * views because it allows the construction of the subviews to - * be done on a pay-as-you-go basis instead of absorbing all the cost - * of construction up front. - * - * If subclasses choose to override any of the following methods, - * it is their responsibility to ensure their overridden methods - * call the parent's method first. The methods are: - * - * public void paint (Graphics) - * public void paintComponents(Graphics) - * public void paintAll (Graphics) - * public void repaint () - * public void repaint (long) - * public void repaint (int, int, int, int) - * public void repaint (long, int, int, int, int) - * public void update (Graphics) - * - * Each of these methods ensures the panel is constructed - * and then simply forwards the call to the parent class. - * - * You use this class by extending it and moving as much of the - * constructor code as possible from the child class into the method - * lazyConstructor. - */ - -public abstract class ALazyPanel extends JPanel { - - // We want to call the lazyConstructor only once. - private boolean lazyConstructorCalled=false; - - public void paint(Graphics g) { - callLazyConstructor(); - super.paint(g); - } - - public void paintAll(Graphics g) { - callLazyConstructor(); - super.paintAll(g); - } - - public void paintComponents(Graphics g) { - callLazyConstructor(); - super.paintComponents(g); - } - - public void repaint() { - callLazyConstructor(); - super.repaint(); - } - - public void repaint(long l) { - callLazyConstructor(); - super.repaint(l); - } - - public void repaint(int i1, int i2, int i3, int i4) { - callLazyConstructor(); - super.repaint(i1, i2, i3, i4); - } - - public void repaint(long l, int i1, int i2, int i3, int i4) { - callLazyConstructor(); - super.repaint(l, i1, i2, i3, i4); - } - - public void update(Graphics g) { - callLazyConstructor(); - super.update(g); - } - - /** - * Force the lazyConstructor() method implemented in the child class - * to be called. If this method is called more than once on - * a given object, all calls but the first do nothing. - */ - public synchronized final void callLazyConstructor() { - // The general idea below is as follows: - // 1) See if this method has already been successfully called. - // If so, return without doing anything. - // - // 2) Otherwise ... call the lazy constructor. - // 3) Call validate so that any components added are visible. - // 4) Note that we have run. - - if((lazyConstructorCalled==false)&&(getParent()!=null)) { - lazyConstructor(); - lazyConstructorCalled=true; - validate(); - } - } - - /** - * This method must be implemented by any child class. Most of - * the component creation code that would have gone in the constructor - * of the child goes here instead. See the example - * at the top. - */ - abstract protected void lazyConstructor(); - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AListsControl.java b/graphics/AtlantisJava/src/atlantis/gui/AListsControl.java deleted file mode 100755 index 4e8810bc05c4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AListsControl.java +++ /dev/null @@ -1,28 +0,0 @@ -package atlantis.gui; - -import atlantis.list.AListManager; -import atlantis.utils.AUtilities; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -/** - * The preferences menu. - */ -public class AListsControl extends AMenuButton { - - public AListsControl() { - super("Lists"); - this.setToolTipText("List control dialog" ); - this.setBorder(null); - this.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (AUtilities.isRightMouseButton(e)) { - AHelpSystem.getInstance().showPage("Lists"); - } else { - AListManager.getInstance().showLists(); - } - } - }); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ALogPane.java b/graphics/AtlantisJava/src/atlantis/gui/ALogPane.java deleted file mode 100644 index 693c6f4be771..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ALogPane.java +++ /dev/null @@ -1,205 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.text.Style; -import javax.swing.text.StyleConstants; -import javax.swing.text.StyleContext; - -import atlantis.output.ALogInterface; -import atlantis.utils.ALogger; - -/** - * This class is a subclass of JTextPane which can be used for any kind of - * logging/text output window in Atlantis. It unifies the old AOutput and - * ALogOutput classes - * - * @author Adam Davison - */ -public class ALogPane extends JScrollPane implements ALogInterface { - - private static ALogger logger = ALogger.getLogger(ALogPane.class); - private Style m_systemDefaultStyle = null; - - private JTextPane m_textPane; - private JPopupMenu m_popupMenu; - private JMenuItem m_menuItemClearTextPane; - - public ALogPane() { - m_textPane = new JTextPane(); - m_textPane.setEditable(false); - m_textPane.setBackground(Color.white); - - setViewportView(m_textPane); - setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - - // popup menu at text pane (info output at the bottom of the GUI) - m_popupMenu = new JPopupMenu(); - m_menuItemClearTextPane = new JMenuItem("Erase info output"); - m_menuItemClearTextPane.addActionListener(new PopupMenuActionListener(this)); - m_popupMenu.add(m_menuItemClearTextPane); - - m_textPane.addMouseListener(new PopupMenuListener_textPane(m_popupMenu)); - - // create style which are used to add text to the document - StyleContext context = StyleContext.getDefaultStyleContext(); - Style defaultStyle = context.getStyle(StyleContext.DEFAULT_STYLE); - - Style newStyle = m_textPane.addStyle(NORMAL, defaultStyle); - - StyleConstants.setFontFamily(newStyle, "Courier"); - StyleConstants.setFontSize(newStyle, 14); - - newStyle = m_textPane.addStyle(NORMAL_BOLD, defaultStyle); - StyleConstants.setFontFamily(newStyle, "Courier"); - StyleConstants.setFontSize(newStyle, 14); - StyleConstants.setBold(newStyle, true); - - newStyle = m_textPane.addStyle(COMMAND, defaultStyle); - StyleConstants.setFontFamily(newStyle, "Courier"); - StyleConstants.setFontSize(newStyle, 14); - StyleConstants.setForeground(newStyle, Color.blue); - - newStyle = m_textPane.addStyle(BAD_COMMAND, defaultStyle); - StyleConstants.setFontFamily(newStyle, "Courier"); - StyleConstants.setFontSize(newStyle, 14); - StyleConstants.setForeground(newStyle, Color.red); - - newStyle = m_textPane.addStyle(WARNING, defaultStyle); - // was Courier - didn't print some greek letters under Linux - StyleConstants.setFontFamily(newStyle, "Arial"); - StyleConstants.setFontSize(newStyle, 15); - StyleConstants.setBold(newStyle, true); - StyleConstants.setForeground(newStyle, Color.red); - - newStyle = m_textPane.addStyle(TITLE, defaultStyle); - StyleConstants.setFontFamily(newStyle, "Courier"); - StyleConstants.setFontSize(newStyle, 16); - StyleConstants.setItalic(newStyle, true); - StyleConstants.setForeground(newStyle, Color.blue); - - newStyle = m_textPane.addStyle(PICK, defaultStyle); - // was Courier - didn't print some greek letters under Linux - StyleConstants.setFontFamily(newStyle, "Arial"); - - StyleConstants.setFontSize(newStyle, 13); - StyleConstants.setItalic(newStyle, true); - StyleConstants.setForeground(newStyle, Color.blue); - - // This is the way ALogOutput styled it's text, perhaps we should - // use NORMAL instead to unify the look of all the output boxes? - AD - m_systemDefaultStyle = context.getStyle(StyleContext.DEFAULT_STYLE); - } - - @Override - public synchronized void append(String s) { - append(s, m_systemDefaultStyle); - } - - @Override - public synchronized void append(String s, String style) { - append(s, m_textPane.getStyle(style)); - } - - private synchronized void append(String s, Style style) { - Document document = m_textPane.getDocument(); - try { - int size = document.getLength(); - - // if the string being appended gets too long, which happens in the - // demo mode runs and leads to OutOfMemory here, cut off the first - // half of the string in the information output - if (size > 51200) // 50kB - { - document.remove(0, size / 2); - - // another option of cutting the string would be - // (but it doesn't preserve styles): - // String text = textPane.getText(); - // textPane.setText(""); // clear all - // s = text.substring(size / 2, size - 1) + s; - - size = document.getLength(); - } - - document.insertString(size, s, style); - - // set the scrollbar to the bottom of the window - // previous solution: - // scrollPane.getViewport().setViewPosition(new Point(0, 9999999)); - // was sometimes crashing with IndexOutOfBoundException - m_textPane.setCaretPosition(document.getLength()); - - if (style.equals(ALogInterface.BAD_COMMAND) || style.equals(ALogInterface.WARNING)) { - Toolkit.getDefaultToolkit().beep(); - } - } catch (BadLocationException e) { - logger.error("Problem in ALogPane", e); - } - } - - @Override - public void clear() { - m_textPane.setText(""); - } - -} - -class PopupMenuListener_textPane extends MouseAdapter -{ - private JPopupMenu popupMenu; - - PopupMenuListener_textPane(JPopupMenu popupMenu) - { - this.popupMenu = popupMenu; - } - - public void mousePressed(MouseEvent evt) - { - showPopupMenu(evt); - } - - public void mouseReleased(MouseEvent evt) - { - showPopupMenu(evt); - } - - private void showPopupMenu(MouseEvent evt) - { - // decides whether right 'trigger' action was performed to show - // the popup menu (on the text pane - info output in GUI) - if (evt.isPopupTrigger()) - { - popupMenu.show(evt.getComponent(), evt.getX(), evt.getY()); - } - } - -} // class PopupMenuListener_textPane ======================================= - -class PopupMenuActionListener implements ActionListener -{ - ALogInterface adaptee; - - PopupMenuActionListener(ALogInterface adaptee) - { - this.adaptee = adaptee; - } - - // clear info output if the popup menu item was pressed - public void actionPerformed(ActionEvent e) - { - adaptee.clear(); - } - -} // class PopupMenuActionListener ========================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/AMainLogPane.java b/graphics/AtlantisJava/src/atlantis/gui/AMainLogPane.java deleted file mode 100644 index c493fad653f5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AMainLogPane.java +++ /dev/null @@ -1,13 +0,0 @@ -package atlantis.gui; - -/** - * The main logging pane showing user information - * @author Adam Davison - */ -public class AMainLogPane extends ALogPane { - - public AMainLogPane() { - super(); - append("Welcome to Atlantis !\n", TITLE); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AMenuButton.java b/graphics/AtlantisJava/src/atlantis/gui/AMenuButton.java deleted file mode 100644 index 3a939230f0dc..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AMenuButton.java +++ /dev/null @@ -1,46 +0,0 @@ -package atlantis.gui; - -import java.awt.Dimension; -import java.awt.FontMetrics; -import javax.swing.JMenuItem; - -/** - * AMenuButton is an object that acts like a JMenuItem but looks like a JMenu. - * This is for the buttons that we add directly to the menu bar. It does not - * allow the layout manager to change it size. - * - * @author Eric Jansen - */ -public class AMenuButton extends JMenuItem { - - /** Extra space needed to make JMenuItem and JMenu look the same */ - private static int EXTRA_SPACE = 6; - - /** Initial preferred size */ - private Dimension size; - - public AMenuButton(String title) { - super(title); - setOpaque(false); - - FontMetrics fm = getFontMetrics(getFont()); - size = super.getPreferredSize(); - size.width = getMargin().left + fm.stringWidth(title) - + getMargin().right + EXTRA_SPACE; - } - - @Override - public Dimension getMinimumSize() { - return size; - } - - @Override - public Dimension getMaximumSize() { - return size; - } - - @Override - public Dimension getPreferredSize() { - return size; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AMouseHelpDialog.java b/graphics/AtlantisJava/src/atlantis/gui/AMouseHelpDialog.java deleted file mode 100755 index c8c691abe24c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AMouseHelpDialog.java +++ /dev/null @@ -1,312 +0,0 @@ -package atlantis.gui; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Font; -import java.awt.Frame; -import java.awt.Toolkit; -import java.util.ArrayList; -import java.util.EventObject; -import java.util.Iterator; -import java.util.Vector; - -import javax.swing.JFrame; -import javax.swing.JTable; -import javax.swing.event.CellEditorListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.ButtonGroup; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableModel; -import javax.swing.table.TableCellRenderer; -import javax.swing.JRadioButton; - -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.interactions.AInteraction; -import atlantis.interactions.AModifier; - -import java.awt.event.*; - -/** - * This dialog is used to display the mouse modifiers which are currently active - * Once more a singleton, but at least a proper one (private constructor) - */ -public class AMouseHelpDialog extends JFrame { - - private static JTable table; - static Object[][] rowData; - static Object[] columnNames; - private static AMouseHelpDialog instance; - private static final AGlobals globals = AGlobals.instance(); - - /** - * Private singleton constructor - */ - private AMouseHelpDialog() { - super("Help - Modifier Keys"); - - AIcon.setIconImage(this); - - table = new JTable() { - public TableCellRenderer getCellRenderer(int row, int column) { - if (column == 0) { - return new RadioRenderer(); - } - // else... - return super.getCellRenderer(row, column); - } - - public TableCellEditor getCellEditor(int row, int column) { - if (column == 0) { - return new RadioEditor(); - } else { - return super.getCellEditor(row, column); - } - } - }; - - table.setRowHeight(20); - - table.setFont(new Font("Monospaced", Font.PLAIN, table.getFont().getSize())); - table.setRowSelectionAllowed(false); - - getContentPane().add(table.getTableHeader(), BorderLayout.NORTH); - getContentPane().add(table, BorderLayout.CENTER); - setResizable(false); - - // From Java 1.5 we can tell the window to be always on top - this.setAlwaysOnTop(true); - - this.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - // Reset key modifier when closing the window - AEventQueue.setDefault(AModifier.nothing); - } - }); - - pack(); - - } - - /** - * Get an instance of this singleton - * @return the AMouseHelpDialog instance - */ - public static AMouseHelpDialog getInstance() { - //Make sure no GUI object is created in headless mode - if (AGlobals.isAtlantisHeadless()) return null; - - //Create instance if it does not exist - if (instance == null) instance = new AMouseHelpDialog(); - return instance; - } - - - /** - * Overwrite setVisible to ensure proper placement of the dialog - * @param visible wether the dialog should be visible - */ - @Override - public void setVisible(boolean visible){ - - //Set the proper location on the screen - Frame gui = globals.getGuiFrame(); - int guiWidth = gui.getWidth(); - int guiX = gui.getX(); - int guiY = gui.getY(); - int dialogWidth = (int) instance.getPreferredSize().getWidth(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if (guiX + guiWidth + (dialogWidth - guiWidth) / 2 > screenWidth) - instance.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max(0, guiY)); - else - instance.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), Math.max(0, guiY)); - - //And finally do set it visible! - super.setVisible(visible); - } - - public static void processInteractionChange(Vector interactions) { - if (ACanvas.getCanvas().getCurrentWindow() == null) - return; - - AModifier[] modifiers = ACanvas.getCanvas().getCurrentWindow().getInteractionManager().getMouseModifiers(); - ArrayList<AModifier> m = new ArrayList<AModifier>(); - for (int i = 0; i < modifiers.length; ++i) - m.add(modifiers[i]); - for (int i = 0; i < interactions.size(); ++i) { - AModifier[] mod = ((AInteraction) interactions.get(i)).getModifiers(); - for (int j = 0; j < mod.length; ++j) - m.add(mod[j]); - } - - // remove duplicates - for (int i = 0; i < m.size(); ++i) - for (int j = i + 1; j < m.size(); ++j) - if (m.get(i) != null && m.get(j) != null && ((AModifier)m.get(i)).sameAs((AModifier)m.get(j))) { - m.set(i, null); - } - - Iterator<AModifier> it = m.iterator(); - while (it.hasNext()) - if (it.next() == null) - it.remove(); - - // sort - for (int i = 0; i < m.size(); ++i) - for (int j = i + 1; j < m.size(); ++j) { - String n = m.get(i).toKeyString(); - String o = m.get(j).toKeyString(); - if (o.length() > n.length() || (o.length() == n.length() && (o.length() > 0 && (o.charAt(0) < n.charAt(0))))) { - AModifier temp = m.get(i); - m.set(i, m.get(j)); - m.set(j, temp); - } - } - - int foundnull = -1; - for (int i = 0; i < m.size(); i++) { - AModifier mod = (AModifier)m.get(i); - if (mod.sameAs(AModifier.nothing)) { - foundnull = i; - } - } - - if (foundnull == -1) { - m.add(AModifier.nothing); - } - - ButtonGroup bgroup = new ButtonGroup(); - - rowData = new Object[m.size()][3]; - for (int i = 0; i < rowData.length; ++i) { - AModifier mod = (AModifier)m.get(i); - JRadioButton but = new MouseHelpRadio(mod); - - if (mod.sameAs(AEventQueue.getDefault())) { - but.setSelected(true); - } - - if (mod.sameAs(AModifier.nothing)) { - foundnull = i; - } - - bgroup.add(but); - - rowData[i][0] = but; - rowData[i][1] = mod.toKeyString(); - rowData[i][2] = mod.toDescString(); - } - - columnNames = new String[] { "", "Key", "Action" }; - TableModel model = new AbstractTableModel() { - public String getColumnName(int column) { - return columnNames[column].toString(); - } - - public int getRowCount() { - return rowData.length; - } - - public int getColumnCount() { - return columnNames.length; - } - - public Object getValueAt(int row, int col) { - return rowData[row][col]; - } - - public boolean isCellEditable(int row, int column) { - if (column == 0) { - return true; - } else { - return false; - } - } - - public void setValueAt(Object value, int row, int col) { - rowData[row][col] = value; - fireTableCellUpdated(row, col); - } - }; - - table.setModel(model); - table.getColumnModel().getColumn(0).setPreferredWidth(22); - table.getColumnModel().getColumn(1).setPreferredWidth(80); - table.getColumnModel().getColumn(2).setPreferredWidth(300); - instance.pack(); - } - - private static class MouseHelpRadio extends JRadioButton { - - AModifier m_mod; - - public MouseHelpRadio(AModifier mod) { - m_mod = mod; - - this.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (isSelected()) { - AEventQueue.setDefault(m_mod); - } - // Previously selected radio button doesn't always paint it's - // unselection if you aren't careful - getParent().repaint(); - } - }); - } - - } - - private static class RadioRenderer implements TableCellRenderer { - - public RadioRenderer() { - } - - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, int row, int column) { - - return (JRadioButton)value; - } - - } - - private static class RadioEditor implements TableCellEditor { - - private JRadioButton button; - - public RadioEditor() { - - } - - public Object getCellEditorValue() { - return button; - } - - public boolean shouldSelectCell(EventObject anEvent) { - return false; - } - - public boolean isCellEditable(EventObject anEvent) { - return true; - } - - public void removeCellEditorListener(CellEditorListener l) { - } - - public void addCellEditorListener(CellEditorListener l) { - } - - public boolean stopCellEditing() { - return true; - } - - public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - button = (JRadioButton)value; - return button; - } - - public void cancelCellEditing() { - } - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/gui/AMultiSpanCellTableUI.java b/graphics/AtlantisJava/src/atlantis/gui/AMultiSpanCellTableUI.java deleted file mode 100755 index cf0054cee6d7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AMultiSpanCellTableUI.java +++ /dev/null @@ -1,81 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Graphics; -import java.awt.Rectangle; - -import javax.swing.JComponent; -import javax.swing.plaf.basic.BasicTableUI; -import javax.swing.table.TableCellRenderer; - -public class AMultiSpanCellTableUI extends BasicTableUI -{ - public void paint(Graphics g, JComponent c) - { - for (int index = 0; index < table.getRowCount(); index++) - { - paintRow(g, index); - } - } - - private void paintRow(Graphics g, int row) - { - AParamGUIDataModel tableModel = (AParamGUIDataModel) table.getModel(); - ADefaultCellAttribute cellAtt = tableModel.getCellAttribute(); - int numColumns = table.getColumnCount(); - - for (int column = 0; column < numColumns; column++) - { - Rectangle cellRect = table.getCellRect(row, column, true); - int cellRow, cellColumn; - if (cellAtt.isVisible(row, column)) - { - cellRow = row; - cellColumn = column; - } - else - { - cellRow = row + cellAtt.getSpan(row, column)[ADefaultCellAttribute.ROW]; - cellColumn = column + cellAtt.getSpan(row, column)[ADefaultCellAttribute.COLUMN]; - } - paintCell(g, cellRect, cellRow, cellColumn); - } - } - - private void paintCell(Graphics g, Rectangle cellRect, int row, int column) - { - int spacingHeight = table.getRowMargin(); - int spacingWidth = table.getColumnModel().getColumnMargin(); - - Color c = g.getColor(); - g.setColor(table.getGridColor()); - g.drawRect(cellRect.x, cellRect.y, cellRect.width - 1, - cellRect.height - 1); - g.setColor(c); - - cellRect.setBounds(cellRect.x + spacingWidth / 2, cellRect.y - + spacingHeight / 2, cellRect.width - spacingWidth, - cellRect.height - spacingHeight); - - if (table.isEditing() && table.getEditingRow() == row - && table.getEditingColumn() == column) - { - Component component = table.getEditorComponent(); - component.setBounds(cellRect); - component.validate(); - } - else - { - TableCellRenderer renderer = table.getCellRenderer(row, column); - Component component = table.prepareRenderer(renderer, row, column); - - if (component.getParent() == null) - { - rendererPane.add(component); - } - rendererPane.paintComponent(g, component, table, cellRect.x, - cellRect.y, cellRect.width, cellRect.height, true); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AMutableCheckBox.java b/graphics/AtlantisJava/src/atlantis/gui/AMutableCheckBox.java deleted file mode 100755 index 92390995e52e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AMutableCheckBox.java +++ /dev/null @@ -1,183 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.LayoutManager; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.Vector; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.LookAndFeel; - -import atlantis.utils.AUtilities; - -/** - * Used to display the status and the operator(<,>,=..etc) of a Cut Parameter. - */ -public class AMutableCheckBox extends JPanel { - private JLabel label; - private ACheckBox checkBox; - private javax.swing.Timer timer; - private JPopupMenu popup; - private String selectedText; - private ActionListener statusActionListener, textActionListener; - private Vector oper=new Vector(); - - public AMutableCheckBox(String name) { - setLayout(new AMutableCheckBoxLayout()); - setBorder(null); - - checkBox=new ACheckBox(name); - checkBox.setBackground(new Color(204, 204, 204)); - checkBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if(statusActionListener!=null) - statusActionListener.actionPerformed(new ActionEvent(get(), 0, "")); - } - }); - add("CHECKBOX", checkBox); - - popup=new JPopupMenu(); - } - - // must be called after all the parameters whose added - public void finalizeConstruction() { - label=new JLabel("", JLabel.CENTER); - label.setBorder(BorderFactory.createLineBorder(new Color(153, 153, 153), 1)); - LookAndFeel.installColorsAndFont(label, "CheckBox.background", "CheckBox.foreground", - "CheckBox.font"); - add("LABEL", label); - - // setting the timmer and popup (if more than 2 supportedOperators) - if(oper.size()>2) { - timer=new javax.swing.Timer(50, new ActionListener() { - public void actionPerformed(ActionEvent e) { - Dimension d=label.getSize(); - - popup.show(label, 0, d.height); - } - }); - timer.setRepeats(false); - } - - // setting the mouse listeners - if(oper.size()<=2) - label.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if(AUtilities.isRightMouseButton(e)||oper.size()==1){ - return; - } - String text0=(String)oper.elementAt(0); - String text1=(String)oper.elementAt(1); - - if(selectedText.equals(text0)) setSelectedText(text1); - else if(selectedText.equals(text1)) setSelectedText(text0); - - if(textActionListener!=null) - textActionListener.actionPerformed(new ActionEvent(get(), 0, "")); - } - }); - else - label.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if(!AUtilities.isRightMouseButton(e)) - timer.start(); - } - - public void mouseReleased(MouseEvent e) { - if(!AUtilities.isRightMouseButton(e)) - timer.stop(); - } - }); - } - - private JPanel get() { - return this; - } - - public ACheckBox getCheckBox(){ - return checkBox; - } - - public void addItem(String s) { - oper.addElement(s); - - popup.add(s).addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JMenuItem item=(JMenuItem)e.getSource(); - - setSelectedText(item.getText()); - if(textActionListener!=null) - textActionListener.actionPerformed(new ActionEvent(get(), 0, "")); - } - }); - } - - public void setSelectedText(String text) { - selectedText=text; - label.setText(selectedText); - } - - public String getSelectedText() { - return selectedText; - } - - public boolean getStatus() { - return checkBox.isSelected(); - } - - public void setStatus(boolean status) { - checkBox.setSelected(status); - } - - public void addTextActionListener(ActionListener listener) { - textActionListener=listener; - } - - public void addStatusActionListener(ActionListener listener) { - statusActionListener=listener; - } - - public void setForeground(Color color) { - if(checkBox!=null) - checkBox.setForeground(color); - } -} - -class AMutableCheckBoxLayout implements LayoutManager { - private Component checkBox, label; - - public void addLayoutComponent(String name, Component comp) { - if(name.equals("CHECKBOX")) checkBox=comp; - else if(name.equals("LABEL")) label=comp; - } - - public void layoutContainer(Container parent) { - Dimension p=parent.getSize(); - Dimension l=label.getPreferredSize(); - Dimension c=checkBox.getPreferredSize(); - - checkBox.setBounds(0, (p.height-c.height)/2, p.width-l.width-10, c.height); - label.setBounds(p.width-l.width-10, -1, l.width+10+1, p.height+2); - } - - public Dimension minimumLayoutSize(Container parent) { - return new Dimension(10, 10); - } - - public Dimension preferredLayoutSize(Container parent) { - return new Dimension(100, 100); - } - - // Removes the specified component from the layout. - public void removeLayoutComponent(Component comp) {} -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AOpenGLControl.java b/graphics/AtlantisJava/src/atlantis/gui/AOpenGLControl.java deleted file mode 100644 index 3df9c139c016..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AOpenGLControl.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package atlantis.gui; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.canvas.AWindowGLView; -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JSeparator; -import javax.swing.event.MenuEvent; -import javax.swing.event.MenuListener; - -/** - * - * @author Adam - */ -public class AOpenGLControl extends JMenu implements MenuListener, ActionListener { - - private ButtonGroup m_bg = new ButtonGroup(); - private JRadioButtonMenuItem m_fsaa0 = new JRadioButtonMenuItem("No AA"); - private JRadioButtonMenuItem m_fsaa2 = new JRadioButtonMenuItem("2x FSAA"); - private JRadioButtonMenuItem m_fsaa4 = new JRadioButtonMenuItem("4x FSAA"); - private JRadioButtonMenuItem m_fsaa6 = new JRadioButtonMenuItem("6x FSAA"); - private JRadioButtonMenuItem m_fsaa8 = new JRadioButtonMenuItem("8x FSAA"); - private JCheckBoxMenuItem m_blendborder = new JCheckBoxMenuItem("Blend Border"); - private boolean m_updating = false; - - public AOpenGLControl() { - super("OpenGL"); - - m_bg.add(m_fsaa0); - m_bg.add(m_fsaa2); - m_bg.add(m_fsaa4); - m_bg.add(m_fsaa6); - m_bg.add(m_fsaa8); - - add(m_fsaa0); - add(m_fsaa2); - add(m_fsaa4); - add(m_fsaa6); - add(m_fsaa8); - add(new JSeparator()); - add(m_blendborder); - - m_fsaa0.addActionListener(this); - m_fsaa2.addActionListener(this); - m_fsaa4.addActionListener(this); - m_fsaa6.addActionListener(this); - m_fsaa8.addActionListener(this); - - m_blendborder.addActionListener(this); - - addMenuListener(this); - } - - public void menuSelected(MenuEvent e) { - m_updating = true; - - int maxFSAA = AWindowGLView.getMaxFSAA(); - - m_fsaa2.setEnabled(false); - m_fsaa4.setEnabled(false); - m_fsaa6.setEnabled(false); - m_fsaa8.setEnabled(false); - - if (maxFSAA >= 2) { - m_fsaa2.setEnabled(true); - - if (maxFSAA >= 4) { - m_fsaa4.setEnabled(true); - - if (maxFSAA >= 6) { - m_fsaa6.setEnabled(true); - - if (maxFSAA >= 8) { - m_fsaa8.setEnabled(true); - } - } - } - } - - int currentFSAA = AWindowGLView.getCurrentFSAA(); - - switch (currentFSAA) { - case 0: - m_fsaa0.setSelected(true); - break; - case 2: - m_fsaa2.setSelected(true); - break; - case 4: - m_fsaa4.setSelected(true); - break; - case 6: - m_fsaa6.setSelected(true); - break; - case 8: - m_fsaa8.setSelected(true); - break; - default: - break; - } - - m_updating = false; - } - - public void menuDeselected(MenuEvent e) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void menuCanceled(MenuEvent e) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void actionPerformed(ActionEvent e) { - if (m_updating) { - return; - } - - JMenuItem src = (JMenuItem) (e.getSource()); - - if (src == m_fsaa0) { - AWindowGLView.setCurrentFSAA(0); - } else if (src == m_fsaa2) { - AWindowGLView.setCurrentFSAA(2); - } else if (src == m_fsaa4) { - AWindowGLView.setCurrentFSAA(4); - } else if (src == m_fsaa6) { - AWindowGLView.setCurrentFSAA(6); - } else if (src == m_fsaa8) { - AWindowGLView.setCurrentFSAA(8); - } else if (src == m_blendborder) { - int oldr = AWindow.BORDER_BACKGROUND_COLOR.getRed(); - int oldg = AWindow.BORDER_BACKGROUND_COLOR.getGreen(); - int oldb = AWindow.BORDER_BACKGROUND_COLOR.getBlue(); - int oldselr = AWindow.BORDER_SELECTED_BACKGROUND_COLOR.getRed(); - int oldselg = AWindow.BORDER_SELECTED_BACKGROUND_COLOR.getGreen(); - int oldselb = AWindow.BORDER_SELECTED_BACKGROUND_COLOR.getBlue(); - if (m_blendborder.getState()) { - AWindow.BORDER_BACKGROUND_COLOR = new Color(oldr, oldg, oldb, 127); - AWindow.BORDER_SELECTED_BACKGROUND_COLOR = new Color( - oldselr, oldselg, oldselb, 127); - } else { - AWindow.BORDER_BACKGROUND_COLOR = new Color(oldr, oldg, oldb, 255); - AWindow.BORDER_SELECTED_BACKGROUND_COLOR = new Color( - oldselr, oldselg, oldselb, 255); - } - ACanvas.getCanvas().repaintAllFromScratch(); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AParamGUIDataModel.java b/graphics/AtlantisJava/src/atlantis/gui/AParamGUIDataModel.java deleted file mode 100755 index b1b03a9a1ebf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AParamGUIDataModel.java +++ /dev/null @@ -1,173 +0,0 @@ -package atlantis.gui; - -import java.awt.Component; -import java.util.EventObject; -import java.util.Vector; - -import javax.swing.JTable; -import javax.swing.JTree; -import javax.swing.event.CellEditorListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; - -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.parameters.AParametersGroup; -import atlantis.parameters.AStatusRootParameter; - -/** - * The data model used to create the custom tables which contain parameters. - */ -class AParamGUIDataModel extends AbstractTableModel implements - TableCellEditor, TableCellRenderer -{ - private Vector<AParameter> parametersList; - // if there is a tree in a cell, the height of the cell should be decided by the tree - private int[] rowHeight; - // indicate if there is a tree in this table - private boolean isTree = false; - private JTree tree = null; - private int treeRowNumber = -1; - private ADefaultCellAttribute cellAtt; - - AParamGUIDataModel(AParametersGroup group) - { - parametersList = group.getParameters(APar.instance().getUserLevel()); - rowHeight = new int[parametersList.size()]; - - cellAtt = new ADefaultCellAttribute(rowHeight.length, 2); - - for (int i = 0; i < parametersList.size(); i++) - { - AParameter p = (AParameter) parametersList.elementAt(i); - if (!p.isInitialized()) - p.initialize(); - if (p instanceof AStatusRootParameter) - { - isTree = true; - tree = (JTree) ((AStatusRootParameter) p).getNameComponent(); - treeRowNumber = i; - rowHeight[i] = tree.getRowCount() - * (int) (tree.getRowBounds(0).getHeight()); - int[] columns = { 0, 1 }; - int[] rows = { i }; - cellAtt.combine(rows, columns); - } - else - rowHeight[i] = 25; - } - } - - public ADefaultCellAttribute getCellAttribute() - { - return cellAtt; - } - - int getRowHeight(int rowIndex) - { - return rowHeight[rowIndex]; - } - - public int getTreeRow() - { - return treeRowNumber; - } - - public boolean hasTree() - { - return isTree; - } - - public JTree getTree() - { - return tree; - } - - public int getRowCount() - { - return parametersList.size(); - } - - public int getColumnCount() - { - return 2; - } - - public Object getValueAt(int rowIndex, int columnIndex) - { - return new Integer(0); - } - - public boolean isCellEditable(int rowIndex, int columnIndex) - { - return true; - } - - public void refresh() - { - for (int i = 0; i < parametersList.size(); i++) - { - AParameter p = (AParameter) parametersList.elementAt(i); - p.refresh(); - } - } - - // TableCellRenderer implementation - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, int row, int column) - { - return getTableCellEditorComponent(table, value, isSelected, row, - column); - } - - // TableCellEditor implementation - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, int row, int column) - { - AParameter p = (AParameter) parametersList.elementAt(row); - switch (column) - { - case 0: - return p.getNameComponent(); - case 1: - return p.getValueComponent(); - default: - return null; - } - } - - public AParameter getParameter(int row) - { - return (AParameter) parametersList.elementAt(row); - } - - public Object getCellEditorValue() - { - return new Integer(0); - } - - public boolean isCellEditable(EventObject anEvent) - { - return true; - } - - public boolean shouldSelectCell(EventObject anEvent) - { - return true; - } - - public boolean stopCellEditing() - { - return true; - } - - public void cancelCellEditing() - {} - - public void addCellEditorListener(CellEditorListener l) - {} - - public void removeCellEditorListener(CellEditorListener l) - {} -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AParametersPage.java b/graphics/AtlantisJava/src/atlantis/gui/AParametersPage.java deleted file mode 100755 index 6217ed42aa08..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AParametersPage.java +++ /dev/null @@ -1,44 +0,0 @@ -package atlantis.gui; - -import atlantis.graphics.layout.AFlowLayout; -import atlantis.parameters.ACommand; -import atlantis.parameters.AParametersGroup; -import javax.swing.JScrollPane; -import javax.swing.JPanel; - -/** - * Used to display a table of parameters together with their associated - * commands in the Parameters Control. - */ -public class AParametersPage extends ALazyPanel { - private AParametersGroup group; - AParametersTable pTable; - - public AParametersPage(AParametersGroup group) { - this.group=group; - } - - protected void lazyConstructor() { - setLayout(new AGUILayoutManager()); - setBorder(null); - - add(createCommandsPanel(group), AGUILayoutManager.AVAILABLExPREFERRED); - - pTable=new AParametersTable(group); - pTable.setName(group.getScreenName()); - add(new JScrollPane(pTable), AGUILayoutManager.AVAILABLExAVAILABLE); - } - - private JPanel createCommandsPanel(AParametersGroup group) { - JPanel commandPanel=new JPanel(new AFlowLayout(5, 5)); - - commandPanel.setBorder(null); - ACommand[] commands=group.getCommands(); - - for(int j=0; j<commands.length; j++) - commandPanel.add(commands[j]); - - return commandPanel; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AParametersTable.java b/graphics/AtlantisJava/src/atlantis/gui/AParametersTable.java deleted file mode 100755 index 869510eaf7ff..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AParametersTable.java +++ /dev/null @@ -1,253 +0,0 @@ -package atlantis.gui; - -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Enumeration; - -import javax.swing.JPopupMenu; -import javax.swing.JTable; -import javax.swing.JTree; -import javax.swing.event.ListSelectionEvent; -import javax.swing.table.TableColumn; - -import atlantis.parameters.AParameter; -import atlantis.parameters.AParametersGroup; -import atlantis.parameters.AStatusRootParameter; -import atlantis.utils.AUtilities; - -/** - * The graphical object which contains all the parameter of a single group. - * Appears in the GUI. - */ -public class AParametersTable extends JTable -{ - private TableColumn column; - private AParamGUIDataModel dataModel; - public final static String SET_GLOBAL = "Set Global"; - public final static String SET_LOCAL = "Set Local"; - public final static String SET_ALL_GLOBAL = "Set All Global"; - public final static String SET_ALL_LOCAL = "Set All Local"; - - public AParametersTable(AParametersGroup g) - { - super(); - dataModel = new AParamGUIDataModel(g); - setModel(dataModel); - for (int i = 0; i < dataModel.getRowCount(); i++) - this.setRowHeight(i, dataModel.getRowHeight(i)); - if (dataModel.hasTree()) - { - JTree theTree = dataModel.getTree(); - theTree.addTreeExpansionListener(new ATreeExpansionListener( - theTree, this, dataModel.getTreeRow())); - } - column = getColumnModel().getColumn(0); - column.setHeaderValue("Name"); - column.setCellEditor(dataModel); - column.setCellRenderer(dataModel); - column.setPreferredWidth(110); - column = getColumnModel().getColumn(1); - column.setHeaderValue("Value"); - column.setCellEditor(dataModel); - column.setCellRenderer(dataModel); - column.setPreferredWidth(100); - setUI(new AMultiSpanCellTableUI()); - setCellSelectionEnabled(true); - - addMouseListener(new MouseAdapter() { - private int pressedX; - private int pressedY; - - public void mousePressed(MouseEvent e) - { - int clickedRow = rowAtPoint(e.getPoint()); - int clickedCol = columnAtPoint(e.getPoint()); - final AParameter p = ((AParamGUIDataModel) getModel()) - .getParameter(clickedRow); - if ((p instanceof AStatusRootParameter) && (clickedCol == 0)) - { - MouseListener[] theMLs = ((JTree) p.getNameComponent()) - .getMouseListeners(); - for (int i = 0; i < theMLs.length; i++) - { - if (theMLs[i] instanceof AStatusRootParameter.NodeSelectionListener) - { - Rectangle clickedRec = getCellRect(clickedRow, - clickedCol, false); - ((AStatusRootParameter.NodeSelectionListener) theMLs[i]) - .setOffset(clickedRec.x, clickedRec.y); - e.translatePoint(-clickedRec.x, -clickedRec.y); - if (AUtilities.isRightMouseButton(e)) - theMLs[i].mousePressed(e); - else - { - pressedX = e.getX(); - pressedY = e.getY(); - } - } - } - return; - } - if (AUtilities.isRightMouseButton(e) && (clickedCol == 0)) - { - JPopupMenu popupMenu = new JPopupMenu(); - if (p.getScope() == AParameter.LOCAL) - { - popupMenu.add(SET_GLOBAL).addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) - { - p.changeScope(AParameter.GLOBAL); - refresh(); - } - }); - } - else - { - popupMenu.add(SET_LOCAL).addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) - { - p.changeScope(AParameter.LOCAL); - refresh(); - } - }); - } - popupMenu.show(AParametersTable.this, e.getX(), e.getY()); - } - } - - // have no idea why mouseClicked cannot be invoked when clicking the - // table - // only mousePressed & mouseReleased can be invoked - public void mouseReleased(MouseEvent e) - { - int clickedRow = rowAtPoint(e.getPoint()); - // when the position of mouse releasing is out of the table, - // clickedRow = -1 - // e.g. when you change a value of a combo box, and the list of - // this combo box is rather long - if (clickedRow < 0) - return; - int clickedCol = columnAtPoint(e.getPoint()); - final AParameter p = ((AParamGUIDataModel) getModel()) - .getParameter(clickedRow); - if ((p instanceof AStatusRootParameter) && (clickedCol == 0)) - { - MouseListener[] theMLs = ((JTree) p.getNameComponent()) - .getMouseListeners(); - for (int i = 0; i < theMLs.length; i++) - { - if (theMLs[i] instanceof AStatusRootParameter.NodeSelectionListener) - { - Rectangle clickedRec = getCellRect(clickedRow, - clickedCol, false); - ((AStatusRootParameter.NodeSelectionListener) theMLs[i]) - .setOffset(clickedRec.x, clickedRec.y); - e.translatePoint(-clickedRec.x, -clickedRec.y); - if ((pressedX == e.getX()) - && (pressedY == e.getY())) - theMLs[i].mouseClicked(e); - } - } - return; - } - } - }); - // needed but I don't know why gary 25/10/2002 - refresh(); - } - - public void refresh() - { - dataModel.refresh(); - setEditingColumn(2); - setEditingRow(0); - } - - public Rectangle getCellRect(int row, int column, boolean includeSpacing) - { - Rectangle sRect = super.getCellRect(row, column, includeSpacing); - if ((row < 0) || (column < 0) || (getRowCount() <= row) - || (getColumnCount() <= column)) - { - return sRect; - } - ADefaultCellAttribute cellAtt = ((AParamGUIDataModel) getModel()).getCellAttribute(); - if (!cellAtt.isVisible(row, column)) - { - int temp_row = row; - int temp_column = column; - row += cellAtt.getSpan(temp_row, temp_column)[ADefaultCellAttribute.ROW]; - column += cellAtt.getSpan(temp_row, temp_column)[ADefaultCellAttribute.COLUMN]; - } - int[] n = cellAtt.getSpan(row, column); - - int index = 0; - int columnMargin = getColumnModel().getColumnMargin(); - Rectangle cellFrame = new Rectangle(); - int aCellHeight = sRect.height + rowMargin; - cellFrame.y = sRect.y; - cellFrame.height = n[ADefaultCellAttribute.ROW] * aCellHeight; - - Enumeration enumeration = getColumnModel().getColumns(); - while (enumeration.hasMoreElements()) - { - TableColumn aColumn = (TableColumn) enumeration.nextElement(); - cellFrame.width = aColumn.getWidth() + columnMargin; - if (index == column) - break; - cellFrame.x += cellFrame.width; - index++; - } - for (int i = 0; i < n[ADefaultCellAttribute.COLUMN] - 1; i++) - { - TableColumn aColumn = (TableColumn) enumeration.nextElement(); - cellFrame.width += aColumn.getWidth() + columnMargin; - } - - if (!includeSpacing) - { - Dimension spacing = getIntercellSpacing(); - cellFrame.setBounds(cellFrame.x + spacing.width / 2, cellFrame.y - + spacing.height / 2, cellFrame.width - spacing.width, - cellFrame.height - spacing.height); - } - return cellFrame; - } - - public void columnSelectionChanged(ListSelectionEvent e) - { - repaint(); - } - - public void valueChanged(ListSelectionEvent e) - { - int firstIndex = e.getFirstIndex(); - int lastIndex = e.getLastIndex(); - if (firstIndex == -1 && lastIndex == -1) - { - repaint(); - } - Rectangle dirtyRegion = getCellRect(firstIndex, 0, false); - int numCoumns = getColumnCount(); - int index = firstIndex; - for (int i = 0; i < numCoumns; i++) - { - dirtyRegion.add(getCellRect(index, i, false)); - } - index = lastIndex; - for (int i = 0; i < numCoumns; i++) - { - dirtyRegion.add(getCellRect(index, i, false)); - } - repaint(dirtyRegion.x, dirtyRegion.y, dirtyRegion.width, - dirtyRegion.height); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/APasswordDialog.java b/graphics/AtlantisJava/src/atlantis/gui/APasswordDialog.java deleted file mode 100755 index eb54cbf2ec8c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/APasswordDialog.java +++ /dev/null @@ -1,203 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.awt.Container; -import java.awt.BorderLayout; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.JPasswordField; -import javax.swing.JLabel; -import javax.swing.BoxLayout; - -import java.net.PasswordAuthentication; -import java.net.Authenticator; - -import atlantis.utils.ALogger; - -/** - * Provides a dialogue to prompt the user for a username and password for - * reading events from a password-protected URL. - * - * @author waugh - */ -public class APasswordDialog extends JDialog -{ - private static final long serialVersionUID = 1L; - - private static ALogger logger = ALogger.getLogger(APasswordDialog.class); - // input fields - protected JTextField userField; - protected JPasswordField passwordField; - // authentication object containing username and password - protected PasswordAuthentication pwAuth; - - /** - * Create APasswordDialog belonging to given frame - * @param frame owner of dialogue - */ - protected APasswordDialog(Frame frame, String prompt) { - // There is almost certainly a better way to do the layout... - super(frame,"Password Dialogue",true); - Container contentPane = getContentPane(); - - // Create panels to place in content pane - JPanel mainPanel = new JPanel(); - JPanel labelPanel = new JPanel(); - JPanel inputPanel = new JPanel(); - JPanel buttonPanel = new JPanel(); - - // Create components (labels, inputs) to put in panels - JLabel label = new JLabel(prompt); - JLabel userLabel = new JLabel("User name"); - JLabel passwordLabel = new JLabel("Password"); - userField = new JTextField(15); - passwordField = new JPasswordField(15); - JButton okButton = new JButton("OK"); - JButton cancelButton = new JButton("Cancel"); - - // Associate labels with corresponding input fields - userLabel.setLabelFor(userField); - passwordLabel.setLabelFor(passwordField); - - // Specify layout of dialogue - contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.Y_AXIS)); - mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.X_AXIS)); - labelPanel.setLayout(new BoxLayout(labelPanel,BoxLayout.Y_AXIS)); - inputPanel.setLayout(new BoxLayout(inputPanel,BoxLayout.Y_AXIS)); - buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.X_AXIS)); - - // Put everything together: components in panels... - contentPane.add(label); - contentPane.add(mainPanel); - contentPane.add(buttonPanel); - - mainPanel.add(labelPanel); - mainPanel.add(inputPanel); - - labelPanel.add(userLabel); - labelPanel.add(passwordLabel); - - inputPanel.add(userField); - inputPanel.add(passwordField); - - buttonPanel.add(okButton); - buttonPanel.add(cancelButton); - - // click OK: construct authentication object from given name/password - okButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) { - String userName = userField.getText(); - char[] password = passwordField.getPassword(); - pwAuth = new PasswordAuthentication(userName,password); - dispose(); - } - } - ); - - // click cancel: dispose of dialogue with no authentication object - cancelButton.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) { - pwAuth = null; - dispose(); - } - } - ); - pack(); - - // set position on screen (otherwise defaults to top left) - int guiWidth = frame.getWidth(); - int guiHeight = frame.getHeight(); - int guiX = frame.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth()); - if(guiX+guiWidth+(dialogWidth-guiWidth)/2>screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max(0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), Math.max(0, (guiHeight - dialogHeight) / 3)); - - } - - /** - * Create APasswordDialog belonging to given frame, with default prompt - * @param frame owner of dialogue - */ - protected APasswordDialog(Frame frame) { - this(frame,"Authentication required"); - } - - /** Gets authentication object - * - * @return PasswordAuthentication object required by Authenticator - */ - protected PasswordAuthentication getPasswordAuthentication() { - return pwAuth; - } - - /** - * Displays username/password dialogue and returns authentication object. - * @param frame owner of dialogue, e.g. Atlantis GUI - * @prompt prompt to show user - * @return authentication object constructed from entered username/password, - * or null if dialogue cancelled - */ - public static PasswordAuthentication showDialog(Frame frame, String prompt) { - APasswordDialog d = new APasswordDialog(frame,prompt); - d.setVisible(true); - return d.getPasswordAuthentication(); - } - - /** - * Displays username/password dialogue with default prompt and returns authentication object. - * @param frame owner of dialogue, e.g. Atlantis GUI - * @return authentication object constructed from entered username/password, - * or null if dialogue cancelled - */ - public static PasswordAuthentication showDialog(Frame frame) { - APasswordDialog d = new APasswordDialog(frame); - d.setVisible(true); - return d.getPasswordAuthentication(); - } - - /** - * Constructs and returns Authenticator object as required by - * java.net.Authenticator.setDefault() - * @param f owner of dialogue, e.g. Atlantis GUI - * @return Authenticator that will create APasswordDialog when called - */ - public static Authenticator getAuthenticator(Frame f) { - return new PasswordAuthenticator(f); - } - - /** - * Private nested Authenticator subclass to be instantiated and returned - * by getAuthenticator(). - * @author waugh - */ - private static class PasswordAuthenticator extends Authenticator { - protected Frame f; - public PasswordAuthenticator(Frame frame) {f=frame;} - protected PasswordAuthentication getPasswordAuthentication() { - logger.info("Authentication required: requesting host:"+getRequestingHost()); - logger.info("Authentication required: requesting site:"+getRequestingSite()); - logger.info("Authentication required: requesting protocol:"+getRequestingProtocol()); - logger.info("Authentication required: requesting prompt:"+getRequestingPrompt()); - logger.info("Authentication required: requesting scheme:"+getRequestingScheme()); - // logger.info("Authentication required: requesting URL:"+getRequestingURL()); - String prompt = "Authentication required by host "+getRequestingHost()+ - " with prompt \""+getRequestingPrompt()+"\""; - return APasswordDialog.showDialog(f,prompt); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/APointerPositionWindow.java b/graphics/AtlantisJava/src/atlantis/gui/APointerPositionWindow.java deleted file mode 100755 index dffdc697ca1d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/APointerPositionWindow.java +++ /dev/null @@ -1,175 +0,0 @@ -package atlantis.gui; - -import java.awt.Color; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; - -import javax.swing.JFrame; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; - -import java.awt.BorderLayout; -import java.awt.event.MouseListener; -import javax.swing.JLabel; - - -/** - * The pointer postion window apears when selected in the preferences menu or - * by using o+right click. - * - * @author Sebastian Boeser - */ -public class APointerPositionWindow extends JFrame - implements WindowListener, ActionListener, MouseListener - -{ - private static JLabel infoLabel; - private static JPopupMenu popupMenu; - private static JMenuItem menuItemClearTextPane; - private static JTextPane textPane; - private static JScrollPane scrollPane; - private static APointerPositionWindow instance = null; - private static final AGlobals globals = AGlobals.instance(); - - public static APointerPositionWindow getInstance() - { - if (instance == null) - instance = new APointerPositionWindow(); - return instance; - } - - private APointerPositionWindow() - { - this.setTitle("Your Pointer Position"); - AIcon.setIconImage(this); - - //delete window if closed - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - addWindowListener(this); - - //Tell user how to use this - infoLabel = new JLabel(); - infoLabel.setText("To output your pointer position use: O + Right click\n"); - - // popup menu at text pane (info output at bottom half of window) - popupMenu = new JPopupMenu(); - menuItemClearTextPane = new JMenuItem("Erase output"); - menuItemClearTextPane.addActionListener(this); - popupMenu.add(menuItemClearTextPane); - - // Text panel to show coordinates - textPane = new JTextPane(); - textPane.setEditable(false); - textPane.setBackground(Color.white); - textPane.setText("Coordinates will be displayed here\n"); - textPane.addMouseListener(this); - - // Embedd in a scroll frame - scrollPane = new JScrollPane(textPane); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - - add(infoLabel,BorderLayout.NORTH); - add(scrollPane,BorderLayout.CENTER); - - // set the initial location - Frame gui = globals.getGuiFrame(); - int guiWidth = gui.getWidth(); - int guiHeight = gui.getHeight(); - int guiX = gui.getX(); - int dialogWidth = (int) this.getPreferredSize().getWidth(); - int dialogHeight = (int) this.getPreferredSize().getHeight(); - int screenWidth = Math.round((float) Toolkit.getDefaultToolkit() - .getScreenSize().getWidth()); - if (guiX + guiWidth + (dialogWidth - guiWidth) / 2 > screenWidth) - this.setLocation(Math.max(0, screenWidth - dialogWidth), Math.max( - 0, (guiHeight - dialogHeight) / 3)); - else - this.setLocation(Math.max(0, guiX + (guiWidth - dialogWidth) / 2), - Math.max(0, (guiHeight - dialogHeight) / 3)); - //Layout the window - pack(); - } - - public static void append(String s) - { - String text = textPane.getText(); - int size = text.length(); - //just as a precaution incase too many coordinates output - if(size > 51200) // 50kB - { - textPane.setText(""); // clear all - text = text.substring(size / 2, size - 1) + "\n"; - } - s = text + "\n" + s; - textPane.setText(s); - } - - void clearTextPane(ActionEvent e) - { - textPane.setText("Coordinates will be displayed here\n"); - } - - public void dispose() - { - instance = null; - super.dispose(); - } - - // clear info output if the popup menu item was pressed - public void actionPerformed(ActionEvent e) - { - clearTextPane(e); - } - - - public void windowClosed(WindowEvent e) - { - // when this window is disposed, the menu item is switched off - APreferencesControl.setPosMenuItem(false); - } - - public void mousePressed(MouseEvent evt) - { - showPopupMenu(evt); - } - - public void mouseReleased(MouseEvent evt) - { - showPopupMenu(evt); - } - - private void showPopupMenu(MouseEvent evt) - { - // decides whether right 'trigger' action was performed to show - // the popup menu (on the text pane - info output in GUI) - if (evt.isPopupTrigger()) - { - popupMenu.show(evt.getComponent(), evt.getX(), evt.getY()); - } - } - - // Empty implementations of unused windows events - public void windowOpened(WindowEvent e){} - public void windowClosing(WindowEvent e){} - public void windowIconified(WindowEvent e){} - public void windowDeiconified(WindowEvent e){} - public void windowActivated(WindowEvent e){} - public void windowDeactivated(WindowEvent e){} - - // Empty implementation of unused mouse events - public void mouseClicked(MouseEvent e) {} - public void mouseEntered(MouseEvent e) {} - public void mouseExited(MouseEvent e) {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/APopupHelper.java b/graphics/AtlantisJava/src/atlantis/gui/APopupHelper.java deleted file mode 100644 index ef1dd510ce04..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/APopupHelper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * APopupHelper.java - * - * Created on 24 October 2007, 09:12 - * - * @author Adam Davison - */ - -package atlantis.gui; - -import javax.swing.JPopupMenu; -import javax.swing.JMenuItem; -import java.awt.Point; -import java.awt.Component; - -/** - * - * @author Adam Davison - */ - -public class APopupHelper { - - public static void showPopupMenu(Point p, Component window, JMenuItem[] items) { - JPopupMenu pop = getPopupMenu(items); - - if (pop == null) { - return; - } - - pop.show(window, (int)p.getX(), (int)p.getY()); - } - - public static JPopupMenu getPopupMenu(JMenuItem[] items) { - - if (items == null) { - return null; - } - - JPopupMenu jp = new JPopupMenu(); - - for (int i = 0; i < items.length; i++) { - jp.add(items[i]); - } - - return jp; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/APreferencesControl.java b/graphics/AtlantisJava/src/atlantis/gui/APreferencesControl.java deleted file mode 100755 index f329c437e383..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/APreferencesControl.java +++ /dev/null @@ -1,429 +0,0 @@ -package atlantis.gui; - -import java.io.File; -import java.awt.Frame; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JMenu; -import javax.swing.JOptionPane; -import javax.swing.JSeparator; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.ALegendWindow; -import atlantis.globals.AGlobals; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.APar; -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; - - -/** - * Preferences menu item - * - * @author Gary Taylor, Zdenek Maxa - */ -public class APreferencesControl extends JMenu implements ActionListener, ItemListener -{ - private static ALogger logger = ALogger.getLogger(APreferencesControl.class); - - private static AGlobals globals = AGlobals.instance(); - - protected static APar parameterStore = APar.instance(); - - private static final String LAYOUT = "Change Canvas Layout"; - private static final String SELECT_COLOR_MAP = "Select Color Map"; - private static final String COLOR_MAP_EDITOR = "Color Map Editor"; - private static final String READ_COLOR_MAP = "Read Color Map"; - private static final String WRITE_COLOR_MAP = "Save Current Color Map"; - private static final String WRITE_CONFIG = "Save Current Configuration"; - private static final String POINTER_POSITION = "Show Pointer Position Window"; - private static final String LEGEND = "Show Legend Window"; - private static final String CANVAS_TITLE = "Show Canvas Title"; - private static final String WINDOW_TITLES = "Show Window Titles"; - private static final String FISHEYE_LOGO = "Show Fisheye Indicator"; - private static final String HIDE_SCALES = "Hide Scales"; - private static final String ATLAS_LOGO = "Show ATLAS logo on saved images"; - private static final String ANTI_ALIASING = "Use Anti-Aliasing"; - private static final String OPEN_GL = "Use OpenGL"; - - private static JCheckBoxMenuItem posMenuItem; - private static JCheckBoxMenuItem legMenuItem; - private static JCheckBoxMenuItem canvasTitleMenuItem; - private static JCheckBoxMenuItem windowTitleMenuItem; - private static JCheckBoxMenuItem fisheyeIndicatorMenuItem; - private static JCheckBoxMenuItem hideScalesMenuItem; - private static JCheckBoxMenuItem atlasLogoMenuItem; - private static JCheckBoxMenuItem aliasMenuItem; - private static JCheckBoxMenuItem openglMenuItem; - - // ---------------------------------------------------------------------- - - public APreferencesControl() - { - super("Preferences"); - this.setToolTipText("Preferences"); - - add(SELECT_COLOR_MAP).addActionListener(this); - add(COLOR_MAP_EDITOR).addActionListener(this); - add(READ_COLOR_MAP).addActionListener(this); - add(WRITE_COLOR_MAP).addActionListener(this); - - add(new JSeparator()); - - add(LAYOUT).addActionListener(this); - add(WRITE_CONFIG).addActionListener(this); - - add(new JSeparator()); - - posMenuItem = new JCheckBoxMenuItem(POINTER_POSITION, false); - posMenuItem.addItemListener(this); - add(posMenuItem); - - legMenuItem = new JCheckBoxMenuItem(LEGEND, false); - legMenuItem.addItemListener(this); - add(legMenuItem); - - add(new JSeparator()); - - canvasTitleMenuItem = new JCheckBoxMenuItem(CANVAS_TITLE, parameterStore.get("Prefs", "CanvasTitle").getStatus()); - canvasTitleMenuItem.addItemListener(this); - add(canvasTitleMenuItem); - - windowTitleMenuItem = new JCheckBoxMenuItem(WINDOW_TITLES, parameterStore.get("Prefs", "WindowTitle").getStatus()); - windowTitleMenuItem.addItemListener(this); - add(windowTitleMenuItem); - - fisheyeIndicatorMenuItem = new JCheckBoxMenuItem(FISHEYE_LOGO, parameterStore.get("Prefs", "FisheyeIndicator").getStatus()); - fisheyeIndicatorMenuItem.addItemListener(this); - add(fisheyeIndicatorMenuItem); - - hideScalesMenuItem = new JCheckBoxMenuItem(HIDE_SCALES, parameterStore.get("Prefs", "HideScales").getStatus()); - hideScalesMenuItem.addItemListener(this); - add(hideScalesMenuItem); - - atlasLogoMenuItem = new JCheckBoxMenuItem(ATLAS_LOGO, parameterStore.get("Prefs", "AtlasLogo").getStatus()); - atlasLogoMenuItem.addItemListener(this); - add(atlasLogoMenuItem); - - - add(new JSeparator()); - - aliasMenuItem = new JCheckBoxMenuItem(ANTI_ALIASING, parameterStore.get("Prefs", "AntiAlias").getStatus()); - aliasMenuItem.addItemListener(this); - add(aliasMenuItem); - - openglMenuItem = new JCheckBoxMenuItem(OPEN_GL, parameterStore.get("Prefs", "OpenGL").getStatus()); - openglMenuItem.addItemListener(this); - - if (globals.getUseOpenGL()) { - add(new JSeparator()); - add(new AOpenGLControl()); - } - } // APreferencesControl() ---------------------------------------------- - - - - public void itemStateChanged(ItemEvent e) - { - if(((JCheckBoxMenuItem)e.getSource()).getText().equals(CANVAS_TITLE)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - { - parameterStore.get("Prefs", "CanvasTitle").setStatus(true); - ACanvas.getCanvas().getTitleBar().setVisible(true); - } - else - { - parameterStore.get("Prefs", "CanvasTitle").setStatus(false); - ACanvas.getCanvas().getTitleBar().setVisible(false); - } - ACanvas.getCanvas().validate(); - ACanvas.getCanvas().repaint(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(POINTER_POSITION)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - APointerPositionWindow.getInstance().setVisible(true); - else - APointerPositionWindow.getInstance().dispose(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(LEGEND)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - { - ALegendWindow legendWindow = ALegendWindow.getInstance(); - // Want to deselect legend menu item if legend window is closed - legendWindow.addWindowListener(new WindowAdapter() { - @Override - public void windowClosed(WindowEvent e) { - setLegMenuItem(false); - } - }); - - legendWindow.setVisible(true); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - else - ALegendWindow.getInstance().dispose(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(WINDOW_TITLES)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "WindowTitle").setStatus(true); - else - parameterStore.get("Prefs", "WindowTitle").setStatus(false); - ACanvas.getCanvas().repaintAllFromScratch(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(FISHEYE_LOGO)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "FisheyeIndicator").setStatus(true); - else - parameterStore.get("Prefs", "FisheyeIndicator").setStatus(false); - ACanvas.getCanvas().repaintAllFromScratch(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(HIDE_SCALES)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "HideScales").setStatus(true); - else - parameterStore.get("Prefs", "HideScales").setStatus(false); - - ACanvas.getCanvas().repaintAllFromScratch(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(ATLAS_LOGO)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "AtlasLogo").setStatus(true); - else - parameterStore.get("Prefs", "AtlasLogo").setStatus(false); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(ANTI_ALIASING)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "AntiAlias").setStatus(true); - else - parameterStore.get("Prefs", "AntiAlias").setStatus(false); - ACanvas.getCanvas().repaintAllFromScratch(); - } - else if(((JCheckBoxMenuItem)e.getSource()).getText().equals(OPEN_GL)) - { - if(e.getStateChange() == ItemEvent.SELECTED) - parameterStore.get("Prefs", "OpenGL").setStatus(true); - else - parameterStore.get("Prefs", "OpenGL").setStatus(false); - System.out.println("No effect at present"); - } - } // itemStateChanged() ------------------------------------------------- - - - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - - if(LAYOUT.equals(action)) - { - new ALayoutDialog(); - } - else if(SELECT_COLOR_MAP.equals(action)) - { - new AColorMapDialog(); - } - else if(COLOR_MAP_EDITOR.equals(action)) - { - AColorMapEditor.getInstance().setVisible(true); - } - else if(READ_COLOR_MAP.equals(action)) - { - new AReadColorMapChooser().showMyDialog(); - } - else if(WRITE_COLOR_MAP.equals(action)) - { - writeColorMap(); - } - else if(WRITE_CONFIG.equals(action)) - { - writeConfiguration(); - } - - } // actionPerformed() -------------------------------------------------- - - - - private static void writeColorMap() - { - String fileName = ".Atlantis-colormap.xml"; - String title = "Saving current color map"; - Frame gui = globals.getGuiFrame(); - - logger.debug("Going to write customised color map file ..."); - String data = AColorMap.getColorMapXML(); - - // color map data should be ready and valid - store it into file - try - { - AGUIUtilities.chooseFileAndWrite(gui, System.getProperty("user.home"), - fileName, data.getBytes(), title, "xml"); - logger.debug("Current color map written (or cancelled by user)."); - } - catch(AAtlantisException ex) - { - JOptionPane.showMessageDialog(gui, ex.getMessage(), - title, JOptionPane.ERROR_MESSAGE); - logger.debug(ex.getMessage(), ex); - } - - } // writeColorMap() ---------------------------------------------------- - - - - private static void writeConfiguration() - { - String FILE_SEPAR = System.getProperty("file.separator"); - String fileName = globals.getUserConfigFile(); - String title = "Saving current configuration"; - String fileNameFull = System.getProperty("user.home") + FILE_SEPAR + fileName; - String sourceFileNameFull = ""; - Frame gui = globals.getGuiFrame(); - - logger.debug("Writing customised configuration ..."); - - // get currently used configuration file and data from it - File user = new File(fileNameFull); - if(user.canRead()) - { - sourceFileNameFull = fileNameFull; - logger.debug("User has already got " + fileNameFull + - " this will be used as source."); - } - else - { - sourceFileNameFull = globals.getHomeDirectory() + - "configuration" + FILE_SEPAR + - "config.xml"; - logger.debug(sourceFileNameFull + " will be used as source."); - - } - - String data = AConfigWriter.getConfiguration(sourceFileNameFull); - if(data == null) - { - String msg = "Error when reading source configuration from file\n" + - sourceFileNameFull; - logger.error(msg); - JOptionPane.showMessageDialog(gui, msg, title, - JOptionPane.INFORMATION_MESSAGE); - return; - } - - // configuration data should be ready and valid - store it into file - try - { - logger.debug("Current customised configuration made, going to save it ..."); - AGUIUtilities.chooseFileAndWrite(gui, System.getProperty("user.home"), - fileName, data.getBytes(), title, "xml"); - logger.debug("Saving customised configuration successful (or cancelled by user)."); - } - catch(AAtlantisException ex) - { - String m = ex.getMessage(); - JOptionPane.showMessageDialog(gui, m, title, - JOptionPane.ERROR_MESSAGE); - logger.error(m); - logger.debug(m, ex); - } - - } // writeConfiguration() ----------------------------------------------- - - public static void setPosMenuItem(boolean selected) - { - posMenuItem.setSelected(selected); - } - - public static void setLegMenuItem(boolean selected) - { - legMenuItem.setSelected(selected); - } - - public static void setWindowTitleMenuItem(boolean selected) - { - windowTitleMenuItem.setSelected(selected); - parameterStore.get("Prefs", "WindowTitle").setStatus(selected); - } - - public static void setFisheyeIndicatorMenuItem(boolean selected) - { - fisheyeIndicatorMenuItem.setSelected(selected); - parameterStore.get("Prefs", "FisheyeIndicator").setStatus(selected); - } - - public static void setHideScalesMenuItem(boolean selected) - { - hideScalesMenuItem.setSelected(selected); - parameterStore.get("Prefs", "HideScales").setStatus(selected); - } - - public static void setAtlasLogoMenuItem(boolean selected) - { - atlasLogoMenuItem.setSelected(selected); - parameterStore.get("Prefs", "AtlasLogo").setStatus(selected); - } - - public static void setAliasMenuItem(boolean selected) - { - if (!AGlobals.isAtlantisHeadless()) { - aliasMenuItem.setSelected(selected); - } - parameterStore.get("Prefs", "AntiAlias").setStatus(selected); - } - - public static boolean getWindowTitleMenuItem() - { - if(windowTitleMenuItem!=null) - return windowTitleMenuItem.isSelected(); - else - return parameterStore.get("Prefs", "WindowTitle").getStatus(); - } - - public static boolean getFisheyeIndicatorMenuItem() - { - if(fisheyeIndicatorMenuItem!=null) - return fisheyeIndicatorMenuItem.isSelected(); - else - return parameterStore.get("Prefs", "FisheyeIndicator").getStatus(); - } - - public static boolean getHideScalesMenuItem() - { - if(hideScalesMenuItem!=null) - return hideScalesMenuItem.isSelected(); - else - return parameterStore.get("Prefs", "HideScales").getStatus(); - } - - - public static boolean getAtlasLogoMenuItem() - { - if(atlasLogoMenuItem!=null) - return atlasLogoMenuItem.isSelected(); - else - return parameterStore.get("Prefs", "AtlasLogo").getStatus(); - } - - public static boolean getAliasMenuItem() - { - return parameterStore.get("Prefs", "AntiAlias").getStatus(); - /*if(aliasMenuItem!=null) - return aliasMenuItem.isSelected(); - else - return false;*/ - } - -} // class APreferencesControl ============================================== diff --git a/graphics/AtlantisJava/src/atlantis/gui/AReadColorMapChooser.java b/graphics/AtlantisJava/src/atlantis/gui/AReadColorMapChooser.java deleted file mode 100755 index 303935d5c1e8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AReadColorMapChooser.java +++ /dev/null @@ -1,35 +0,0 @@ -package atlantis.gui; - -import java.io.File; - -import atlantis.canvas.ACanvas; -import atlantis.globals.AGlobals; -import atlantis.graphics.colormap.AColorMap; - -/** - * The dialog which appears when a user asks to read a new colormap - */ -public class AReadColorMapChooser extends AXMLFileChooser -{ - private static final String FILE_SEPAR = System.getProperty("file.separator"); - private static final AGlobals globals = AGlobals.instance(); - - public AReadColorMapChooser() - { - super(System.getProperty("user.dir") + FILE_SEPAR - + "configuration" + FILE_SEPAR + "colormap.xml", globals.getGuiFrame()); - } - - public boolean processSelectedFile(File file) - { - if (file.canRead()) - { - AColorMap.readColorMap(file.getPath()); - AColorMapEditor.getInstance().updateColors(); - AGUI.getGUI().repaintTable(); - ACanvas.getCanvas().repaintAllFromScratch(); - return true; - } - return false; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AReadFileChooser.java b/graphics/AtlantisJava/src/atlantis/gui/AReadFileChooser.java deleted file mode 100755 index 48ff74726576..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AReadFileChooser.java +++ /dev/null @@ -1,103 +0,0 @@ -package atlantis.gui; - -import java.io.File; - -import javax.swing.JFileChooser; -import javax.swing.filechooser.FileFilter; -import javax.swing.JCheckBox; -import javax.swing.JPanel; - -import java.awt.Component; -import java.awt.BorderLayout; - -import atlantis.config.ADefaultValues; - -/** - * This dialog appears when a user asks to read events from a file - * @author sboeser - */ -public class AReadFileChooser extends JFileChooser { - //Check box indicating to set the new default location - private JCheckBox defaultLoc = null; - - /** - * Constructor with a default path - * @param path the default path - */ - public AReadFileChooser(String path) { - - //Create a file chooser pointing to path - //Use users default dir if null - super(path); - - //Create a new panel with the checkbox - JPanel p = new JPanel(); - defaultLoc = new JCheckBox("default location"); - p.setLayout(new BorderLayout()); - p.add(defaultLoc, BorderLayout.SOUTH); - setAccessory(p); - - - setFileFilter(new XMLFilter()); - } - - /** - * Show the dialog waiting for user input - */ - @Override - public int showOpenDialog(Component parent) { - - //Get the return state - int state = super.showOpenDialog(parent); - - //Store the default location if user pressed ok - if (state == APPROVE_OPTION) { - //Only if checkbox is ticked - if (defaultLoc.isSelected()) { - // save last visited location - ADefaultValues.set("LastEventFilesSourceDir", - getSelectedFile().getParent() + System.getProperty("file.separator")); - } - } - - //return the result state - return state; - } - - /** - * A filter for XML files - */ - private static class XMLFilter extends FileFilter { - - /** - * Acceptance algorithm for xml files and directories - * @param file the file to test - * @return true if accepted - */ - public boolean accept(File file) { - - //accept all directories - if (file.isDirectory()) return true; - - //check the file ending - String name = file.getName().toLowerCase(); - - if (name.endsWith(".xml")) return true; - if (name.endsWith(".zip")) return true; - if (name.endsWith(".gzip")) return true; - if (name.endsWith(".gz")) return true; - - //None of the requested criteria matched - return false; - } - - /** - * Gives a description of the files that are accepted by this filter - * @return string with list of file endings - */ - public String getDescription() { - return ".xml, .zip, .gzip, .gz"; - } - } -} - diff --git a/graphics/AtlantisJava/src/atlantis/gui/AReadGeometryChooser.java b/graphics/AtlantisJava/src/atlantis/gui/AReadGeometryChooser.java deleted file mode 100755 index ae77061aeeaf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AReadGeometryChooser.java +++ /dev/null @@ -1,79 +0,0 @@ -package atlantis.gui; - -import atlantis.geometry.AEndcapTRTDetector; - -import java.awt.Frame; -import java.io.File; -import javax.swing.JOptionPane; - -import atlantis.canvas.ACanvas; -import atlantis.data.ACalorimeterData; -import atlantis.geometry.AAtlasDetector; -import atlantis.geometry.ABarrelSiliconDetector; -import atlantis.geometry.ABarrelTRTDetector; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.geometry.AEndcapSiliconDetector; -import atlantis.globals.AGlobals; - - -/** - * The dialog which appears when a user asks to read in geometry XML file - */ -public class AReadGeometryChooser extends AXMLGeometryChooser { - - private static final AGlobals globals = AGlobals.instance(); - - public AReadGeometryChooser() { - super(); - } - - public void fileChosen(int state) { - Frame gui = globals.getGuiFrame(); - do { - if(state==APPROVE_OPTION) { - File file=getSelectedFile(); - - if(file!=null) - if(file.canRead()) { - processSelectedFile(file); - break; - } else { - JOptionPane.showMessageDialog(gui, - "Unable to open " + file, "IO Error", JOptionPane.ERROR_MESSAGE); - } - } else - break; - state=showOpenDialog(gui); - } while(true); - } - - public boolean processSelectedFile(File file) - { - if(file.canRead()) - { - // ACalorimterDetector keeps a list of its instances, clear this list. - ACalorimeterDetector.clear(); - ABarrelSiliconDetector.clear(); - AEndcapSiliconDetector.clear(); - ABarrelTRTDetector.clear(); - AEndcapTRTDetector.clear(); - - String muonname = file.getParent() + System.getProperty("file.separator") + - file.getName().substring(0, 1) + "Muon" + - file.getName().substring(1); - File mufile = new File(muonname); - if(mufile.canRead()) - { - AAtlasDetector.setDetector(new AAtlasDetector(file.getAbsolutePath(), muonname)); - } - else - { - AAtlasDetector.setDetector(new AAtlasDetector(file.getAbsolutePath())); - } - ACalorimeterData.remakeHitToGeometryMapping(); - ACanvas.getCanvas().repaintAllFromScratch(); - return true; - } - return false; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ASaveCanvasDialog.java b/graphics/AtlantisJava/src/atlantis/gui/ASaveCanvasDialog.java deleted file mode 100755 index 2f0d67a39820..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ASaveCanvasDialog.java +++ /dev/null @@ -1,477 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.image.RasterFormatException; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStream; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.filechooser.FileFilter; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.canvas.ACanvas; -import atlantis.utils.AAtlantisException; -import atlantis.utils.AUtilities; -import atlantis.config.ADefaultValues; -import atlantis.globals.AGlobals; -import atlantis.graphics.encoders.AImageEncoder; -import atlantis.utils.ALogger; - - -/** - * Dialog window for saving a picture of the current canvas. This dialog allows - * the user to pick the resolution and file type. - * - * @author Eric Jansen - * @author Sebastian Boeser - */ -public class ASaveCanvasDialog extends JFileChooser - implements PropertyChangeListener { - - private final ALogger logger = ALogger.getLogger(ASaveCanvasDialog.class); - private static AEventManager eventManager = AEventManager.instance(); - private static final AGlobals globals = AGlobals.instance(); - - // GUI component that contains the resolution selection panel. - private AResolutionChooser resolutionChooser; - - // Possible image widths shown to user. Heights are fixed by layout restrictions. - private final int[] IMAGE_WIDTHS = {800, 1024, 2400, 5000};//{512, 800, 1024, 2400}; - - // Default selected image width. Also the (fixed) width of the EPS images. - private final int DEFAULT_IMAGE_WIDTH = 1; - - // String holding the default file name, need to be reset after change of file type. - private String defaultFileName = null; - - // Private image encoder instance - private final AImageEncoder imageEncoder = new AImageEncoder(); - - - /** - * Constructor creating the dialog - */ - public ASaveCanvasDialog() - { - //Initialize the file chooser dialog - super(ADefaultValues.get("LastCanvasPlotSaveDir")); - setDialogTitle("Save Canvas"); - - //Add file filters - addChoosableFileFilter(new AFileFilter("eps", "Encapsulated Postscript (*.eps)")); - addChoosableFileFilter(new AFileFilter("png", "Portable Network Graphics (*.png)")); - addChoosableFileFilter(new AFileFilter("svg", "Scalable Vector Graphics (*.svg)")); - - //Set default values - setAcceptAllFileFilterUsed(false); - // In OpenJDK JRE filter is set to null by setAcceptAllFileFilterUsed, so - // have to set it to something: - setFileFilter(getChoosableFileFilters()[1]); - - //Add the resoluton chooser - resolutionChooser = new AResolutionChooser(); - setAccessory(resolutionChooser); - addPropertyChangeListener(this); - - //Set a default file name and extension - defaultFileName = makeEventFileName() + "-" + AUtilities.getDateTimeString(); - String ext = ((AFileFilter) getFileFilter()).getExtension(); - setSelectedFile(new File(defaultFileName + "." + ext)); - } - - /** - * Pops up the "Save Canvas" dialog. - */ - public void showDialog(){ - //Show dialog with GUI as parent - showSaveDialog(globals.getGuiFrame()); - } - - - /** - * @return the defualt file name - */ - public String getDefaultFileName() - { - return defaultFileName; - } - - /** - * Get the currently selected image width. - * @return selected image width - */ - public int getImageWidth() - { - return resolutionChooser.getImageWidth(); - } - - - - /** - * Gets the image height on this button. - * @return image height - */ - public int getImageHeight() - { - return resolutionChooser.getImageHeight(); - } - - - - /** - * Called when the user has selected a file and pushes the save button. - * This function will only - * approve the selection when the actual saving was successful. - */ - @Override - public void approveSelection() - { - Frame gui = globals.getGuiFrame(); - File file = new File(getSelectedFile().getAbsolutePath()); - - // If the file exists and the user does not want to overwrite it, cancel the save operation. - // The dialog is still on screen and the user can pick another file. - if (file.exists() && JOptionPane.showConfirmDialog(gui, "File exists, overwrite?", - "File exists", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) - return; - - // All exceptions are handled equally: the user is sent back to the save canvas dialog. - try { - String type = ((AFileFilter)getFileFilter()).getExtension(); - // Since EPS files can be pretty big, they're saved directly - if (type.equals("eps")){ - // Since vector images are scalable, the image size only determines the relative size of - // the data objects. To make the generated EPS independent of the canvas size, we always - // rescale the image to the default size. - int width = IMAGE_WIDTHS[DEFAULT_IMAGE_WIDTH]; - int height = ACanvas.getCanvas().getRespectiveHeight(width); - imageEncoder.saveEPS(width,height,file); - } else if (type.equals("png")) { - // Generate the canvas image in memory - byte[] data; - int width = resolutionChooser.getImageWidth(); - int height = resolutionChooser.getImageHeight(); - data = imageEncoder.getPNGData(width,height); - // And finally write the image to the selected file. - OutputStream stream = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath())); - stream.write(data); - stream.close(); - } else if (type.equals("svg")){ - // Since vector images are scalable, the image size only determines the relative size of - // the data objects. To make the generated EPS independent of the canvas size, we always - // rescale the image to the default size. - int width = IMAGE_WIDTHS[DEFAULT_IMAGE_WIDTH]; - int height = ACanvas.getCanvas().getRespectiveHeight(width); - imageEncoder.saveSVG(width,height,file); - } else{ - //Throw an exception if none of the above - throw new AAtlantisException("Unknown image type: '" + type + "'"); - } - } - catch(RasterFormatException e) - { - JOptionPane.showMessageDialog(gui, - "The chosen resolution for canvas is too high, try a lower option!", - "Error saving canvas", JOptionPane.INFORMATION_MESSAGE); - AGUI.getGUI().restoreDefaults(); - this.cancelSelection(); - } catch(Exception e) - { - // Show a dialog with the error message. - JOptionPane.showMessageDialog(AGUI.getGUI(), e.getMessage(), - "Error saving canvas", JOptionPane.ERROR_MESSAGE); - - // The selection is not approved, the user has to select another file or type. - return; - } - - // This approves the selection and ends the saving processs. - super.approveSelection(); - ADefaultValues.set("LastCanvasPlotSaveDir", file.getParent() + - System.getProperty("file.separator")); - - } - - - - /** - * Property change listener for the JFileChooser - * @param e property change event sent by JFileChooser - */ - public void propertyChange(PropertyChangeEvent e) - { - if (e.getPropertyName().equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) - { - String oldExt = ((AFileFilter)e.getOldValue()).getExtension(); - String newExt = ((AFileFilter)e.getNewValue()).getExtension(); - - if ((oldExt.equals("eps") || oldExt.equals("svg")) && !(newExt.equals("eps") || newExt.equals("svg"))) - { - for (int i=0; i<resolutionChooser.getComponentCount(); i++) - { - resolutionChooser.getComponent(i).setEnabled(true); - } - } - else if (!(oldExt.equals("eps") || oldExt.equals("svg")) && ((newExt.equals("eps")) || newExt.equals("svg"))) - { - for (int i=0; i<resolutionChooser.getComponentCount(); i++) - resolutionChooser.getComponent(i).setEnabled(false); - } - - // The behaviour of the JFileChooser is somewhat strange. Regardless of what the user has entered, - // the input text field will be emptied when the user selects another file type. It is impossible - // to retrieve the text that was in this field, so we just reset the default file name. - if (getSelectedFile() == null) - { - // Reset our default with the new extension - setSelectedFile(new File(defaultFileName + "." + newExt)); - updateUI(); - rescanCurrentDirectory(); - } - } - } - - - - /** - * Generates a file name based on the current event name and the visible projections. - * @return auto generated image file name - */ - private static String makeEventFileName() - { - String name = "Untitled"; - AEvent ev = eventManager.getCurrentEvent(); - if(ev != null) - { - name = ev.getSourceName(); - if(name.toLowerCase().endsWith(".xml")) - { - // current event comes from XML file, run and event number - // are probably already part of the current filename - name = name.substring(0, name.length() - 4); - } - else - { - // current event was probably retrieved online, add run and - // event numbers into the file name of the canvas plot - if(! ("n/a".equals(ev.getRunNumber()) && - "n/a".equals(ev.getEventNumber()))) - { - name += "_" + ev.getRunNumber() + "_" + ev.getEventNumber(); - } - } - } - - ACanvas canvas = ACanvas.getCanvas(); - String[] windows = canvas.getCurrentLayout().getWindowNames(); - StringBuilder listWindows = new StringBuilder(); - for(int i = 0; i < windows.length; i++) - { - if(canvas.isReallyOnScreen(canvas.getWindow(windows[i]))) - { - listWindows.append("-" + canvas.getWindow(windows[i]).getProjection().getName()); - } - } - name += listWindows.toString(); - - return name; - } - - - - /** - * GUI component for the resolution selection panel. - */ - class AResolutionChooser extends JPanel implements ActionListener - { - /** Currently selected button. */ - private AResolutionButton selectedButton; - - /** - * Constructor. - */ - public AResolutionChooser() - { - super(new GridLayout(IMAGE_WIDTHS.length+1, 1)); - setBorder(BorderFactory.createTitledBorder(" Resolution: ")); - - ButtonGroup group = new ButtonGroup(); - for (int i=0; i<IMAGE_WIDTHS.length; i++) - { - int width = IMAGE_WIDTHS[i]; - int height = ACanvas.getCanvas().getRespectiveHeight(IMAGE_WIDTHS[i]); - - AResolutionButton button = new AResolutionButton(width, height); - button.addActionListener(this); - if(i == DEFAULT_IMAGE_WIDTH) - { - selectedButton = button; - button.setSelected(true); - } - group.add(button); - add(button); - } - } - - /** - * Get the currently selected image width. - * @return selected image width - */ - public int getImageWidth() - { - return selectedButton.getImageWidth(); - } - - /** - * Gets the currently selected image height. - * @return selected image height - */ - public int getImageHeight() - { - return selectedButton.getImageHeight(); - } - - public void updateResolutions() - { - for (int i=0; i<getComponentCount(); i++) - { - if (getComponent(i) instanceof AResolutionButton) - { - AResolutionButton button = (AResolutionButton)getComponent(i); - int height = ACanvas.getCanvas().getRespectiveHeight(button.getImageWidth()); - button.setImageHeight(height); - } - } - } - - - - /** - * Action listener for the resolution panel. - * @param e performed action - */ - public void actionPerformed(ActionEvent e) - { - selectedButton = (AResolutionButton)e.getSource(); - } - - /** - * Radio button for the resolution chooser. - */ - public class AResolutionButton extends JRadioButton - { - /** Image width for this button. */ - int imageWidth; - /** Image height for this button. */ - int imageHeight; - - /** - * Constructor. - * @param targetWidth image width this button corresponds to - * @param targetHeight image height this button corresponds to - */ - public AResolutionButton(int imageWidth, int imageHeight) - { - super(imageWidth + "x" + imageHeight); - this.imageWidth = imageWidth; - this.imageHeight = imageHeight; - } - - /** - * Gets the image width on this button. - * @return image width - */ - public int getImageWidth() - { - return imageWidth; - } - - /** - * Gets the image height on this button. - * @return image height - */ - public int getImageHeight() - { - return imageHeight; - } - - public void setImageHeight(int imageHeight) - { - this.imageHeight = imageHeight; - setText(imageWidth + "x" + imageHeight); - } - } - } - - /** - * Simple filter class that filters files by extension. - */ - private static class AFileFilter extends FileFilter - { - /** File extension. */ - private String extension; - /** Description of the file type this filter shows. */ - private String description; - - /** - * Constructs a file filter. - * @param extension file extension that passes the filter - * @param description description of the file type this filter selects - */ - public AFileFilter(String extension, String description) - { - super(); - this.extension = extension; - this.description = description; - } - - /** - * Decides if the filter allows a file to pass or not - * @param f file under consideration - * @return decision of the filter - */ - public boolean accept(File f) - { - //Accept all directories - if (f.isDirectory()) return true; - - //Accept all files that end with given extension - if (f.getName().toLowerCase().endsWith(extension)) return true; - - //Nothing else - return false; - } - - /** - * Get the extension this filter filters on. - * @return file extension - */ - public String getExtension() - { - return extension; - } - - /** - * Get description of the filter. - * @return description - */ - public String getDescription() - { - return description; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AStartupWindow.java b/graphics/AtlantisJava/src/atlantis/gui/AStartupWindow.java deleted file mode 100755 index 4743e6d20814..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AStartupWindow.java +++ /dev/null @@ -1,86 +0,0 @@ -package atlantis.gui; - -import atlantis.globals.AGlobals; -import atlantis.graphics.AIcon; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import java.awt.*; -import javax.swing.*; - - -/** - * The startup window appears when the program starts up and displays the - * progress of the operation. No need for this to be a singleton at all. - */ -public class AStartupWindow { - - //add a logger - private final ALogger logger = ALogger.getLogger(AStartupWindow.class); - - //the frame showing the startup image and progress - private final JFrame frame = (AGlobals.isAtlantisHeadless()) ? null : new JFrame(); - - //how often we will update the progress bar - private final int progressUpdateDiff; - - //GUI items that will be updated - private JLabel text = null; - private JProgressBar progress = null; - - public AStartupWindow(int numUpdates) { - - //Store how often we will update the progress bar - progressUpdateDiff=(int)100./numUpdates; - - //Don't do anything in headless mode - if (AGlobals.isAtlantisHeadless()) return; - - frame.getContentPane().setLayout(new BorderLayout()); - - String fileName = AGlobals.instance().getHomeDirectory() + "img" + - System.getProperty("file.separator") + "atlas.jpg"; - ImageIcon icon = AUtilities.getFileAsImageIcon(fileName); - - frame.getContentPane().add(new JLabel(icon), BorderLayout.CENTER); - text = new JLabel("Welcome to Atlantis", JLabel.CENTER); - JPanel p = new JPanel(); - - p.setLayout(new GridLayout(2, 1)); - p.add(text); - progress = new JProgressBar(0, 100); - progress.setStringPainted(true); - p.add(progress); - frame.getContentPane().add(p, BorderLayout.SOUTH); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(screenSize.width / 4, screenSize.height / 3); - frame.setUndecorated(true); - AIcon.setIconImage(frame); - frame.setTitle("Atlantis starting up..."); - frame.pack(); - frame.setVisible(true); - } - - /** - * Update the frame and log to the logger - * @param newText the new text for the startup window - */ - public void updateText(String newText) { - //Also send this to the logger - logger.info(newText); - - //Don't do graphics update in headless mode - if (AGlobals.isAtlantisHeadless()) return; - - //Update text and progress bar - text.setText(newText); - progress.setValue(progress.getValue()+progressUpdateDiff); - } - - /** - * When dispsoing this object, also dispose of the frame - */ - public void dispose(){ - if (frame!=null) frame.dispose(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ATabbedPaneUI.java b/graphics/AtlantisJava/src/atlantis/gui/ATabbedPaneUI.java deleted file mode 100755 index ea5cf518a7d6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ATabbedPaneUI.java +++ /dev/null @@ -1,35 +0,0 @@ -package atlantis.gui; - -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.JComponent; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.metal.MetalTabbedPaneUI; - -import atlantis.utils.AUtilities; - -/** - * Once installed on a TabbedPane this UI will allow changing the tabs only with - * the left mouse button. By default this is possible with any button. - * In Atlantis the right mouse button provides help - */ - -public class ATabbedPaneUI extends MetalTabbedPaneUI { - - public static ComponentUI createUI(JComponent c) { - return new ATabbedPaneUI(); - } - - protected MouseListener createMouseListener() { - return new myMouseHandler(); - } - - public class myMouseHandler extends MouseHandler { - public void mousePressed(MouseEvent e) { - if(!AUtilities.isRightMouseButton(e)) - super.mousePressed(e); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ATextField.java b/graphics/AtlantisJava/src/atlantis/gui/ATextField.java deleted file mode 100755 index a7aae0b222b4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ATextField.java +++ /dev/null @@ -1,31 +0,0 @@ -package atlantis.gui; - - -import java.awt.event.ActionListener; -import javax.swing.JTextField; - - -/** - * This textfield will not generate an event when the setText() function is called. - */ - -public class ATextField extends JTextField { - ActionListener listener; - - public ATextField() { - super(); - } - - public void addActionListener(ActionListener l) { - if(listener==null) { - super.addActionListener(l); - listener=l; - } - } - - public void setText(String t) { - if(listener!=null) super.removeActionListener(listener); - super.setText(t); - if(listener!=null) super.addActionListener(listener); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ATreeCellRenderer.java b/graphics/AtlantisJava/src/atlantis/gui/ATreeCellRenderer.java deleted file mode 100755 index 3979507b6ff0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ATreeCellRenderer.java +++ /dev/null @@ -1,34 +0,0 @@ -package atlantis.gui; - -import java.awt.*; -import javax.swing.*; -import javax.swing.tree.*; -import atlantis.parameters.AStatusParameter; -import hep.wired.util.TristateCheckBox; - -public class ATreeCellRenderer implements TreeCellRenderer { - - public ATreeCellRenderer() { - } - - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, - boolean expanded, boolean leaf, int row, boolean hasFocus) { - if(value instanceof ACheckNode){ - ACheckNode cellNode = (ACheckNode)value; - cellNode.updateState(); - if (cellNode.getParameter() instanceof AStatusParameter){ - ACheckBox cellComponent = (ACheckBox)cellNode.getUserObject(); - cellComponent.setBorderPaintedFlat(true); - return cellComponent; - } else{ - TristateCheckBox cellComponent = (TristateCheckBox)cellNode.getUserObject(); - cellComponent.setState(cellNode.getState()); - cellComponent.setBorderPaintedFlat(true); - return cellComponent; - } - } - - return new JLabel("not a checkNode"); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/ATreeExpansionListener.java b/graphics/AtlantisJava/src/atlantis/gui/ATreeExpansionListener.java deleted file mode 100755 index cb7d0b791603..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/ATreeExpansionListener.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ATreeExpansionListener.java - * - * Created on 17 March 2005, 15:55 - */ - -package atlantis.gui; - -import javax.swing.event.TreeExpansionListener; -import javax.swing.event.TreeExpansionEvent; -import javax.swing.JTree; - -/** - * - * @author Qiang - */ -public class ATreeExpansionListener implements TreeExpansionListener { - - private JTree tree; - - private AParametersTable table; - - // the row number which the tree locates - private int treeRow; - - /** Creates a new instance of ATreeExpansionListener */ - public ATreeExpansionListener(JTree tree, AParametersTable table, int treeRow) { - this.tree = tree; - this.table = table; - this.treeRow = treeRow; - } - - public void treeExpanded(TreeExpansionEvent event) { - int newHeight = tree.getRowCount() * (int)(tree.getRowBounds(0).getHeight()); - table.setRowHeight(treeRow, newHeight); - } - - public void treeCollapsed(TreeExpansionEvent event) { - int newHeight = tree.getRowCount() * (int)(tree.getRowBounds(0).getHeight()); - table.setRowHeight(treeRow, newHeight); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AWindowControl.java b/graphics/AtlantisJava/src/atlantis/gui/AWindowControl.java deleted file mode 100755 index abac35788b16..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AWindowControl.java +++ /dev/null @@ -1,190 +0,0 @@ -package atlantis.gui; - -import atlantis.canvas.ALayoutChangeListener; -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.canvas.ALayout; -import atlantis.graphics.layout.AFlowLayout; -import atlantis.graphics.layout.AGridLayout; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.ADragListener; -import atlantis.parameters.ACommandProcessor; -import atlantis.utils.*; -import java.util.*; -import javax.swing.BorderFactory; -import javax.swing.SwingUtilities; -import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Rectangle; -import java.awt.Dimension; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.event.*; - -/** - * Allows user to select the current window and to - * copy between windows. - */ -public class AWindowControl extends JPanel - implements ALayoutChangeListener, ADragListener { - - private String selectedWindowName; - private Vector pages=new Vector(10); - - public AWindowControl getPanel() { - return this; - } - - public AWindowControl() { - super(); - setLayout(new AFlowLayout(10, 10)); - - addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if(AUtilities.isRightMouseButton(e)) - AHelpSystem.getInstance().showPage("WindowControl"); - } - }); - - // registering as a listener to of window lock changes - ACanvas.getCanvas().addLockChangeListener(new ChangeListener() { - - public void stateChanged(ChangeEvent e) { - for(int i=0; i<pages.size(); i++) { - Hashtable page=(Hashtable)pages.elementAt(i); - Enumeration labels=page.elements(); - while(labels.hasMoreElements()) { - ADnDLabel label=(ADnDLabel)labels.nextElement(); - if(ACanvas.getCanvas().getWindow(label.getName()).isLocked()) - label.setForeground(Color.red); - else - label.setForeground(Color.black); - } - } - } - }); - - // registering as a listener to APar - ACanvas.getCanvas().addLayoutChangeListener(this); - - ACanvas.getCanvas().addWindowChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - ADnDLabel label; - - if(selectedWindowName!=null) - for(int i=0; i<pages.size(); i++) { - Hashtable page=(Hashtable)pages.elementAt(i); - - label=(ADnDLabel)page.get(selectedWindowName); - if(label!=null) - label.setBackground(new Color(207, 207, 207)); - } - - selectedWindowName=ACanvas.getCanvas().getCurrentWindow().getName(); - for(int i=0; i<pages.size(); i++) { - Hashtable page=(Hashtable)pages.elementAt(i); - - label=(ADnDLabel)page.get(selectedWindowName); - if(label!=null) - label.setBackground(Color.white); - } - } - }); - } - - // function gets called when the current layout is changed in APar - public void layoutChanged(ACanvas c) { - removeAll(); - ALayout layout = c.getCurrentLayout(); - Dimension d=layout.getSize(); - WindowMouseListener windowMouseListener=new WindowMouseListener(); - - // adding new set of pages - pages.clear(); - String[] pageNames=layout.getPageNames(); - Hashtable pageHashtable; - - for(int i=0; i<pageNames.length; i++) { - String[] wNames=layout.getPageContent(pageNames[i]); - - JPanel page=new JPanel(new AGridLayout(d, 15)); - - pageHashtable=new Hashtable(); - for(int k=0; k<wNames.length; k++) { - Rectangle constraint=layout.getWindowConstraints(wNames[k]); - ADnDLabel w=new ADnDLabel(wNames[k], wNames, true); - - w.setBorder(BorderFactory.createLineBorder(new Color(150, 150, 150))); - pageHashtable.put(wNames[k], w); - page.add(w, constraint); - w.addMouseListener(windowMouseListener); - w.addDragListener(this); - } - - pages.addElement(pageHashtable); - add(page); - setToolTipText("Current Layout - "+layout.getName()); - revalidate(); - repaint(); - } - } - - public void dragPerformed(Object from, Object to, int action) { - if((from instanceof ADnDLabel)&&(to instanceof ADnDLabel)) - ACanvas.getCanvas().copyWindowSettings(((ADnDLabel)from).getText(), ((ADnDLabel)to).getText()); - } - - private Hashtable findPage(String[] wNames) - { - for (int i = 0; i < pages.size(); i++) - { - int matches = 0; - Hashtable page = (Hashtable)pages.get(i); - - for (int j = 0; j < wNames.length; j++) - { - if (page.containsKey(wNames[j])) - matches++; - else break; - } - if (matches == wNames.length) - return page; - } - return null; - } - - class WindowMouseListener extends MouseAdapter { - - public void mousePressed(MouseEvent e) { - ADnDLabel label = (ADnDLabel) e.getSource(); - - if (AUtilities.isRightMouseButton(e)) { - if (AEventQueue.getKeyboardState() == KeyEvent.VK_A) { - - String[] pageName = label.returnPageName(); - Hashtable page = findPage(pageName); - if(page==null) - return; - - for (Enumeration labels = page.elements(); labels.hasMoreElements(); ) { - label = (ADnDLabel) labels.nextElement(); - if (label != null) - ACommandProcessor.receive("W" + label.getName()); - } - } - else { - AWindow.getPopupMenu().show(label, e.getX(), e.getY()); - ACommandProcessor.receive("W" + label.getName()); - } - } - } - - public void mouseReleased(MouseEvent e) { - ADnDLabel label=(ADnDLabel)e.getSource(); - - if(SwingUtilities.isLeftMouseButton(e)) { - ACommandProcessor.receive("W"+label.getName()); - } - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AXMLFileChooser.java b/graphics/AtlantisJava/src/atlantis/gui/AXMLFileChooser.java deleted file mode 100755 index b5c2421bfcdd..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AXMLFileChooser.java +++ /dev/null @@ -1,108 +0,0 @@ -package atlantis.gui; - -import java.awt.Component; -import java.io.File; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; - - - -/** - * A GUI component used choose a specific XML file - */ -public abstract class AXMLFileChooser extends JFileChooser -{ - private Component parent = null; - - public abstract boolean processSelectedFile(File file); - - - public AXMLFileChooser(String fileName, Component parent) - { - super(); - this.parent = parent; - - setFileFilter(new XMLFilter()); - if (fileName == null) - { - setCurrentDirectory(new File(System.getProperty("user.dir"))); - } - else - { - File f = new File(fileName); - if (f.isFile()) - { - setCurrentDirectory(new File(f.getAbsolutePath())); - setSelectedFile(f); - } - else - { - setCurrentDirectory(f); - } - } - - } // AXMLFileChooser() -------------------------------------------------- - - - - public void showMyDialog() - { - do - { - int state = showOpenDialog(this.parent); - if(state == APPROVE_OPTION) - { - File file = getSelectedFile(); - if(file != null) - { - if(processSelectedFile(file)) - { - break; - } - else - { - JOptionPane.showMessageDialog(parent, - "Unable to open\n" + file, "IO Error", - JOptionPane.ERROR_MESSAGE); - } - } - } - else - { - break; - } - } - while(true); - - } // showMyDialog() ----------------------------------------------------- - - - - private static class XMLFilter extends FileFilter - { - // Accept all directories and all valid files. - public boolean accept(File f) - { - if(f.isDirectory()) - { - return true; - } - - String s = f.getName(); - - if(s.toLowerCase().endsWith(".xml") || s.toLowerCase().endsWith(".zip") - || s.toLowerCase().endsWith(".gzip") || s.toLowerCase().endsWith(".gz")) - return true; - - return false; - } - - - public String getDescription() - { - return ".xml, .zip, .gzip, .gz"; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/AXMLGeometryChooser.java b/graphics/AtlantisJava/src/atlantis/gui/AXMLGeometryChooser.java deleted file mode 100755 index c790d8aeee82..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/AXMLGeometryChooser.java +++ /dev/null @@ -1,73 +0,0 @@ -package atlantis.gui; - -import java.awt.Frame; -import java.io.File; -import javax.swing.*; -import javax.swing.filechooser.*; - -import atlantis.globals.AGlobals; - - -/** - * A GUI component used choose a specific XML file - */ -public abstract class AXMLGeometryChooser extends JFileChooser { - - private static final AGlobals globals = AGlobals.instance(); - - public AXMLGeometryChooser(String fileName) { - super(); - String FILE_SEPAR = System.getProperty("file.separator"); - Frame gui = globals.getGuiFrame(); - setFileFilter(new XMLFilter()); - setCurrentDirectory(new File(System.getProperty("user.dir")+FILE_SEPAR+ - "geometry")); - if(fileName!=null) - setSelectedFile(new File(System.getProperty("user.dir")+FILE_SEPAR - +fileName)); - do { - int state=showOpenDialog(gui); - if(state==APPROVE_OPTION) { - File file=getSelectedFile(); - if(file!=null) - if(processSelectedFile(file)) - break; - else { - JOptionPane.showMessageDialog(gui, - "Unable to open " + file, "IO Error", JOptionPane.ERROR_MESSAGE); - } - } else - break; - } while(true); - } - - - public AXMLGeometryChooser() { - this(null); - } - - - public abstract boolean processSelectedFile(File file); - - - private static class XMLFilter extends FileFilter { - // Accept all directories and all XML files. - - public boolean accept(File f) { - if(f.isDirectory()) - return true; - - String s=f.getName(); - if(s.startsWith("AMuon")) return false; - if(s.equals("config.xml")) return false; - if(s.equals("pdg.xml")) return false; - if(s.toLowerCase().lastIndexOf(".xml")==s.length()-".xml".length()) return true; - return false; - } - - public String getDescription() { - return ".xml"; - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/gui/package.html b/graphics/AtlantisJava/src/atlantis/gui/package.html deleted file mode 100644 index 67b415276a29..000000000000 --- a/graphics/AtlantisJava/src/atlantis/gui/package.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<p>Maintenance of GUI components (layouts, tabbed panes, etc). The -contents (not the structure) of the GUI is defined in config.xml. -</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxGroup.java deleted file mode 100755 index 88cb802db3d0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxGroup.java +++ /dev/null @@ -1,14 +0,0 @@ -package atlantis.interactions; - - -public class A3DBoxGroup extends AInteractionGroup { - - private A3DBoxInteraction transformInteraction; - - public A3DBoxGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - transformInteraction=new A3DBoxInteraction(); - this.addInteraction(transformInteraction); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxInteraction.java deleted file mode 100755 index 7d264df9cc7d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/A3DBoxInteraction.java +++ /dev/null @@ -1,202 +0,0 @@ -package atlantis.interactions; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.event.KeyEvent; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Point2D; - -import javax.swing.JMenuItem; - -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection3DBox; -import atlantis.graphics.ACursorFactory; - -/** - * The Zoom and Rotate interaction. - */ -public class A3DBoxInteraction extends AInteraction implements - ASleepMouseDragListener, AMousePressListener, AEnterExitListener -{ - private static final int ZOOM_MODE = 0; - private static final int HORIZONTAL_ZOOM_MODE = 1; - private static final int VERTICAL_ZOOM_MODE = 2; - private static final int ROTATE_MODE = 3; - - private int d = 10; - private Point2D.Double p0; - private int previousKey = KeyEvent.VK_UNDEFINED; - private int mode; - - public A3DBoxInteraction() - { - super(1, AUTOMATIC_REPAINT, SCREEN_COORDINATES, false); - - // The center of the ellipse is in (0, 0) in User Space - // dummy for now - hr[0] = new Ellipse2D.Double(-d / 2, -d / 2, d, d); - } - - public void connect(AInteractionsManager manager) - { - super.connect(manager); - } - - public int getPressButton() - { - return AInteractionsManager.LEFT; - } - - public int init(Point2D.Double p, int key) - { - keyChange(p, key); - return -1; - } - - public void pressed(Point2D.Double p, int button, int key) - {} - - public int getButton() - { - return AInteractionsManager.LEFT; - } - - public void start(Point2D.Double p, int region, int key) - {} - - private void keyChange(Point2D.Double p, int key) - { - p0 = p; - - switch (key) - { - case KeyEvent.VK_UNDEFINED: - mode = ZOOM_MODE; - break; - - case KeyEvent.VK_H: - mode = HORIZONTAL_ZOOM_MODE; - break; - - case KeyEvent.VK_V: - mode = VERTICAL_ZOOM_MODE; - break; - - case KeyEvent.VK_R: - mode = ROTATE_MODE; - break; - - case KeyEvent.VK_Z: - mode = ZOOM_MODE; - break; - } - } - - public void drag(Point2D.Double p, int region, int key) - { - if (key != previousKey) - { - keyChange(p, key); - previousKey = key; - } - - double zf; - AProjection proj = window.getProjection(); - Point2D.Double center = ((AProjection3DBox) proj).getCenter(window); - - switch (mode) - { - case ZOOM_MODE: - zf = p0.distance(center.getX(), center.getY()) - / p.distance(center.getX(), center.getY()); - ((AProjection3DBox) proj).zoom(zf); - p0 = p; - window.repaintFromScratch(); - break; - case HORIZONTAL_ZOOM_MODE: - zf = Math.abs((p0.getX() - center.getX()) - / (p.getX() - center.getX())); - ((AProjection3DBox) proj).zoomHorizontal(zf); - p0 = p; - window.repaintFromScratch(); - break; - case VERTICAL_ZOOM_MODE: - zf = Math.abs((p0.getY() - center.getY()) - / (p.getY() - center.getY())); - ((AProjection3DBox) proj).zoomVertical(zf); - p0 = p; - window.repaintFromScratch(); - break; - case ROTATE_MODE: - AParameter phiPar = parameterStore.get(proj.getName(), "Phi"); - double height = window.getCurrDisp().getHeight(); - double deltaV = p.getY() - p0.getY(); - phiPar.setD(adjustPhi(phiPar.getD() + 360. * deltaV / height)); - p0 = p; - window.repaintFromScratch(); - break; - } - } - - private double adjustPhi(double phi) - { - while (phi < 0) - phi += 360; - while (phi > 360) - phi -= 360; - return phi; - } - - public void stop() - {} - - public void cancel() - {} - - public void paint(Graphics2D g) - { - Point2D.Double p = ((AProjection3DBox) window.getProjection()).getCenter(window); - g.setColor(Color.red); - g.fillOval((int) (p.x - d / 2), (int) (p.y - d / 2), d, d); - } - - public void entered() - { -// if (region == 0) - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public void exited() - { - // if (region == 0) - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public int getPopupType() - { - return APopupListener.WINDOW_POPUP; - } - - /*public void showPopup(Point p, int region) - { - popupMenu.show(window, p.x, p.y); - }*/ - - public JMenuItem[] getPopupItems() { - return null; - } - - public AModifier[] getModifiers() - { - return new AModifier[] { - new AModifier(KeyEvent.VK_UNDEFINED, false, "Change the volume of the box"), - new AModifier(KeyEvent.VK_Z, false, "Change the volume of the box"), - new AModifier(KeyEvent.VK_H, false, "Change the length of the box"), - new AModifier(KeyEvent.VK_V, false, "Change the height of the box"), - new AModifier(KeyEvent.VK_R, false, "Rotate around axis of box") - }; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AClockGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AClockGroup.java deleted file mode 100755 index 8bfd75d8ffe4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AClockGroup.java +++ /dev/null @@ -1,62 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.ACanvas; -import atlantis.parameters.APar; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import javax.swing.JCheckBox; -import javax.swing.JPanel; - -public class AClockGroup extends AInteractionGroup { - - private AClockInteraction clockInteraction; - private JCheckBox checkbox; - // the panel that will contain the additional controls for the interactions - private JPanel additionalControls; - - public AClockGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - - clockInteraction=new AClockInteraction(); - addInteraction(clockInteraction); - - // create the additional controls panel - additionalControls = new JPanel(); - - checkbox=new JCheckBox("on/off", false); - checkbox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - switch(e.getStateChange()) { - case ItemEvent.SELECTED: - parameterStore.get("YX", "Clock").setStatus(true); - break; - - case ItemEvent.DESELECTED: - parameterStore.get("YX", "Clock").setStatus(false); - break; - } - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - }); - additionalControls.add(checkbox); - } - - public void connect() { - checkbox.setSelected(parameterStore.get("YX", "Clock").getStatus()); - } - - /** - * this interaction group has additional controls, so return true - */ - - public boolean hasAdditionalControls() { - return true; - } - /** - * returns the additional controls - */ - public JPanel getAdditionalControls() { - return additionalControls; - } - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AClockInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AClockInteraction.java deleted file mode 100755 index 13a44dbe9f5e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AClockInteraction.java +++ /dev/null @@ -1,103 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - -import atlantis.graphics.*; -import atlantis.parameters.*; -import atlantis.projection.*; -import atlantis.utils.*; - - -public class AClockInteraction extends AInteraction - implements ASleepMouseDragListener { - - private ALineSegment line; - private double phi; - - public AClockInteraction() { - super(1, WINDOW_TOTAL_REPAINT, WORLD_COORDINATES, false); - // double phi = APar.get("YX","Phi").getD()*AMath.DEGREES_TO_RADIANS+Math.PI; - double phi=Math.toRadians(parameterStore.get("YX", "Phi").getD()); - - line=new ALineSegment(0, 0, 1500*Math.cos(phi), 1500*Math.sin(phi), 10); - hr[0]=line; - } - - public RectangularShape getScreenHotRegion(int region) { - if(region==0) - return new ALineSegment(window.calculateDisplay(line.p1), window.calculateDisplay(line.p2), 10); - else - return null; - } - - public int init(Point2D.Double p, int key) { - return 1; - } - - public int getButton() { - return AInteractionsManager.LEFT; - } - - public void start(Point2D.Double p, int region, int key) { - // if(parameterStore.get("YX","Clock").getStatus()) - if(region==0) - parameterStore.get("YX", "Clock").setD(0.0000001); - else if(region==1) { - AProjection2D projection=(AProjection2D)window.getProjection(); - Point2D.Double p0=projection.inverseNonLinearTransform(p); - - this.phi=Math.atan2(p0.y, p0.x); - } - } - - public void drag(Point2D.Double p, int region, int key) { - if(region==0) { - double phi=Math.atan2(p.y, p.x); - - // phi+=Math.PI; - if(phi<0) phi+=2*Math.PI; - parameterStore.get("YX", "Phi").setD(Math.toDegrees(phi)); - } else if(region==1&¶meterStore.get("YX", "Clock").getStatus()) { - double phiPrime=Math.atan2(p.y, p.x); - double phi0=Math.toRadians(parameterStore.get("YX", "Phi").getD()); - double deltaPhiPrime=phiPrime-phi0; - - if(deltaPhiPrime<-Math.PI) deltaPhiPrime+=2*Math.PI; - if(deltaPhiPrime>Math.PI) deltaPhiPrime-=2*Math.PI; - double deltaPhi=this.phi-phi0; - - if(deltaPhi<-Math.PI) deltaPhi+=2*Math.PI; - if(deltaPhi>Math.PI) deltaPhi-=2*Math.PI; - - if((deltaPhi>0.&&deltaPhiPrime-deltaPhi>0.)||(deltaPhi<0.&&deltaPhiPrime-deltaPhi<0.)) { - double a=(deltaPhi*Math.PI-deltaPhiPrime*Math.abs(deltaPhi))/(deltaPhiPrime-deltaPhi); - - parameterStore.get("YX", "Clock").setD(Math.min(Math.max(Math.PI/a, 0.000001), 7.)); - } else { - parameterStore.get("YX", "Clock").setD(0.000001); - } - } - } - - public void stop() {} - - public void cancel() {} - - public void paint(Graphics2D g) { - // double phi = parameterStore.get("YX","Phi").getD()*AMath.DEGREES_TO_RADIANS+Math.PI; - double phi=Math.toRadians(parameterStore.get("YX", "Phi").getD()); - - line.p2.setLocation(1500*Math.cos(phi), 1500*Math.sin(phi)); - ALineSegment screenLine=(ALineSegment)getScreenHotRegion(0); - - AGraphics ag=AGraphics.makeAGraphics(g); - - ag.updateDrawParameters(frameDrawParameters); - ag.drawLine(screenLine.p1.x, screenLine.p1.y, screenLine.p2.x, screenLine.p2.y); - ag.updateDrawParameters(drawParameters); - ag.drawLine(screenLine.p1.x, screenLine.p1.y, screenLine.p2.x, screenLine.p2.y); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AEnterExitListener.java b/graphics/AtlantisJava/src/atlantis/interactions/AEnterExitListener.java deleted file mode 100755 index 7bc8fdb6fb48..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AEnterExitListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package atlantis.interactions; - - -/** - * The listener is supported by AInteractionsManager, - * it generated events when the mouse is entering or exiting a Hot Region. - */ -public interface AEnterExitListener { - - void entered(); - void exited(); -} - diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeChangeListener.java b/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeChangeListener.java deleted file mode 100644 index 5b6c091c3630..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeChangeListener.java +++ /dev/null @@ -1,17 +0,0 @@ -package atlantis.interactions; - -/** - * Interface for all FishEyeChangeListener classes. Each time the FishEye - * parameters are changed, all listeners are called with the new paremeters - * @author sboeser - */ -public interface AFishEyeChangeListener { - - /** - * This method gets called each time new fisheye parameters are set - * @param status the new fishEye status - * @param value the new fishEye value - */ - abstract public void fishEyeChange(boolean status, double value); - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeGroup.java deleted file mode 100755 index d2784b782666..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeGroup.java +++ /dev/null @@ -1,116 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.ACanvas; -import java.awt.event.*; -import javax.swing.JCheckBox; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.text.NumberFormat; - -public class AFishEyeGroup extends AInteractionGroup implements AFishEyeChangeListener { - - private final AFishEyeInteraction fishEyeInteraction; - private final JCheckBox checkbox; - private final JFormattedTextField valueField; - // the panel that will contain the additional controls for the interactions - private JPanel additionalControls; - -//Format, label and label string for value field - private NumberFormat valueFormat; - private JLabel valueLabel; - private static String valueString = "Value: "; - - public AFishEyeGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - - fishEyeInteraction=new AFishEyeInteraction(); - addInteraction(fishEyeInteraction); - - // create the additional controls panel - additionalControls = new JPanel(); - - checkbox=new JCheckBox("on/off", false); - checkbox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - switch(e.getStateChange()) { - case ItemEvent.SELECTED: - fishEyeInteraction.setStatus(true); - //fishEyeInteraction.getParameter("FishEye").setStatus(true); - break; - - case ItemEvent.DESELECTED: - fishEyeInteraction.setStatus(false); - //fishEyeInteraction.getParameter("FishEye").setStatus(false); - break; - } - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - }); - -//Create the label - valueLabel = new JLabel(valueString); - valueFormat = NumberFormat.getNumberInstance(); - valueFormat.setMaximumIntegerDigits(2); - valueField=new JFormattedTextField(valueFormat); - valueField.setToolTipText("Enter fish eye value between 0 and 25"); - valueField.setValue(new Double(0)); - valueField.setColumns(3); - valueField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - Number value =(Number)valueField.getValue(); - double dvalue = value.doubleValue(); - if(dvalue>0 && dvalue<25) - { - fishEyeInteraction.setValue(dvalue); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - else - { - Double val = new Double(fishEyeInteraction.getValue()); - valueField.setValue(val); - } - } - }); - - JPanel nestedPanel = new JPanel(); - nestedPanel.add(valueLabel); - nestedPanel.add(valueField); - - JPanel borderPanel = new JPanel(new BorderLayout()); - borderPanel.add(checkbox, BorderLayout.WEST); - borderPanel.add(nestedPanel, BorderLayout.EAST); - - additionalControls.add(borderPanel); - - } - - public void connect() { - super.connect(); - - //Only after we are connected to a window, add ourselves as update listener - fishEyeInteraction.addFishEyeChangeListener(this); - } - - public void fishEyeChange(boolean status, double value) { - valueField.setValue(value); - checkbox.setSelected(status); - } - - /** - * FishEye has additional controls, so return true - */ - public boolean hasAdditionalControls() { - return true; - } - - /** - * return the additional controls - */ - public JPanel getAdditionalControls() { - return additionalControls; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeInteraction.java deleted file mode 100755 index b1abf8608b4a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AFishEyeInteraction.java +++ /dev/null @@ -1,389 +0,0 @@ -package atlantis.interactions; - -import atlantis.graphics.ACursorFactory; -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.projection.*; -import java.awt.Graphics2D; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.awt.event.ActionListener; -import javax.swing.JMenuItem; -import java.awt.geom.*; -import java.util.Vector; - -/** - * The FishEye transformation will expand the central part of the display, - * while keeping the outer borders. This helps in e.g. expanding the inner detector region. - **/ - -public class AFishEyeInteraction extends AInteraction - implements ASleepMouseDragListener, ActionListener, AEnterExitListener { - - //A list of listeners for fishEye changes - private Vector<AFishEyeChangeListener> fishEyeChangeListeners = new Vector<AFishEyeChangeListener>(); - - private final int d=20; - private final int region = 0; - private Point2D.Double firstP; - private JMenuItem[] popupItems; - - private final static String TOGGLE_FISHEYE="Fish Eye On/Off"; - - /** - * Create a new FishEye interaction - */ - public AFishEyeInteraction() { - super(1, WINDOW_TOTAL_REPAINT, WORLD_COORDINATES, false); - - hr[0]=new Ellipse2D.Double(0, 0, d, d); - - popupItems = new JMenuItem[] { - new JMenuItem(TOGGLE_FISHEYE), - }; - - for (int i = 0; i < popupItems.length; i++) { - popupItems[i].addActionListener(this); - } - } - - - /** - * Initialize FishEye transformation using an inital point - */ - public int init(Point2D.Double p, int key) { - - AProjection2D projection=(AProjection2D)window.getProjection(); - - firstP=new Point2D.Double(Math.abs(p.x), Math.abs(p.y)); - firstP=projection.inverseNonLinearTransform(firstP); - - return region; - } - - /** - * Returns the button this interaction uses - **/ - public int getButton() { - return AInteractionsManager.LEFT; - } - - /** - * Get projection parameters using APar - **/ - private AParameter getParameter(String name) { - AProjection projection=window.getProjection(); - - if(projection instanceof AProjectionYX) - return parameterStore.get("YX", name); - else if(projection instanceof AProjectionRZ) - return parameterStore.get("RZ", name); - else if(projection instanceof AProjection3D) - return parameterStore.get("3D", name); - else if(projection instanceof AProjectionYZ||projection instanceof AProjectionXZ) - return parameterStore.get("XZ", name); - else if(projection instanceof AProjectionFR) - return parameterStore.get("FR", name); - else if(projection instanceof AProjectionFZ) - return parameterStore.get("FZ", name); - else - throw new Error("Fish Eye should be used ONLY in YX, RZ, FZ and FR"); - } - - /** - * Get new FishEye parameter if mouse has moved to p in YX projection - **/ - private void updateYX(Point2D.Double p, int key) { - double r1=Math.sqrt(firstP.x*firstP.x+firstP.y*firstP.y); - double r2=Math.sqrt(p.x*p.x+p.y*p.y); - double rTo=getParameter("rTo").getD(); - - if(r1<rTo&&r2>rTo) return; - if(r2<rTo&&r1>rTo) return; - - double newFishEyeValue=1000*(r2-r1)/(r1*rTo-r1*r2); - - if(newFishEyeValue<0||newFishEyeValue>25) return; - - setValue(newFishEyeValue); - fireFishEyeChange(getStatus(),getValue()); - } - - /** - * Get new FishEye parameter if mouse has moved to p in RZ projection - **/ - private void updateRZ(Point2D.Double p, int key) { - double newFishEyeValue=0; - - switch(key) { - case KeyEvent.VK_UNDEFINED: - case KeyEvent.VK_F: - case KeyEvent.VK_H: - double z1=firstP.x; - double z2=Math.abs(p.x); - double zTo=getParameter("zTo").getD(); - - if(z1<zTo&&z2>zTo) return; - if(z2<zTo&&z1>zTo) return; - - newFishEyeValue=1000*(z2-z1)/(z1*zTo-z1*z2); - break; - - case KeyEvent.VK_V: - double r1=Math.abs(firstP.y); - double r2=Math.abs(p.y); - double rTo=getParameter("rTo").getD(); - - if(r1<rTo&&r2>rTo) return; - if(r2<rTo&&r1>rTo) return; - - newFishEyeValue=1000*(r2-r1)/(r1*rTo-r1*r2); - break; - } - - if(newFishEyeValue<0||newFishEyeValue>25) return; - setValue(newFishEyeValue); - fireFishEyeChange(getStatus(),getValue()); - } - - /** - * Get new FishEye parameter if mouse has moved to p in XZ projection - **/ - private void updateXZ(Point2D.Double p, int key) { - double newFishEyeValue=0; - - switch(key) { - case KeyEvent.VK_UNDEFINED: - case KeyEvent.VK_F: - case KeyEvent.VK_H: - double z1=firstP.x; - double z2=Math.abs(p.x); - double zTo=getParameter("zTo").getD(); - - if(z1<zTo&&z2>zTo) return; - if(z2<zTo&&z1>zTo) return; - - newFishEyeValue=1000*(z2-z1)/(z1*zTo-z1*z2); - break; - - case KeyEvent.VK_V: - double r1=Math.abs(firstP.y); - double r2=Math.abs(p.y); - double rTo=getParameter("yTo").getD(); - - if(r1<rTo&&r2>rTo) return; - if(r2<rTo&&r1>rTo) return; - - newFishEyeValue=1000*(r2-r1)/(r1*rTo-r1*r2); - break; - } - - if(newFishEyeValue<0||newFishEyeValue>25) return; - setValue(newFishEyeValue); - fireFishEyeChange(getStatus(),getValue()); - } - - /** - * Get new FishEye parameter if mouse has moved to p in Phi-R projection - **/ - private void updateFR(Point2D.Double p, int key) { - double r1=firstP.x; - double r2=p.x; - double rTo=getParameter("rTo").getD(); - - if(r1<rTo&&r2>rTo) return; - if(r2<rTo&&r1>rTo) return; - - double newFishEyeValue=1000*(r2-r1)/(r1*rTo-r1*r2); - - if(newFishEyeValue<0||newFishEyeValue>25) return; - - setValue(newFishEyeValue); - fireFishEyeChange(getStatus(),getValue()); - } - - /** - * Get new FishEye parameter if mouse has moved to p in Phi-Z projection - **/ - private void updateFZ(Point2D.Double p, int key) { - double z1=Math.abs(firstP.x); - double z2=Math.abs(p.x); - double zTo=getParameter("zTo").getD(); - - if(z1<zTo&&z2>zTo) return; - if(z2<zTo&&z1>zTo) return; - - double newFishEyeValue=1000*(z2-z1)/(z1*zTo-z1*z2); - - if(newFishEyeValue<0||newFishEyeValue>25) return; - - setValue(newFishEyeValue); - fireFishEyeChange(getStatus(),getValue()); - } - - /** - * Change FishEye parameter for corresponding projection - * if mouse is draged - **/ - public void drag(Point2D.Double p, int region, int key) { - if(!getParameter("FishEye").getStatus()) return; - - AProjection proj=window.getProjection(); - - if(proj instanceof AProjectionYX) - updateYX(p, key); - else if(proj instanceof AProjectionRZ||proj instanceof AProjection3D) - updateRZ(p, key); - else if(proj instanceof AProjectionXZ||proj instanceof AProjectionYZ) - updateXZ(p, key); - else if(proj instanceof AProjectionFR) - updateFR(p, key); - else if(proj instanceof AProjectionFZ) - updateFZ(p, key); - } - - // Empty interface implementations - public void stop() {} - public void start(Point2D.Double p, int region, int key) {} - public void cancel() {} - public void paint(Graphics2D g) {} - - public int getPopupType() { - return APopupListener.WINDOW_POPUP; - } - - /*public void showPopup(Point p, int region) { - popupMenu.show(window, p.x, p.y); - }*/ - - public JMenuItem[] getPopupItems() { - return popupItems; - } - - - /** - * Implementaiton of the ActionListener - * @param e - */ - public void actionPerformed(ActionEvent e) { - String action=e.getActionCommand(); - - if(action.equals(TOGGLE_FISHEYE)) { - //toggle the fisheye status - setStatus(!getStatus()); - //Update the window - window.repaintFromScratch(); - //And the GUI - fireFishEyeChange(getStatus(),getValue()); - } - } - - /** - * Public method so it can be called from the AFishEyeGroup to change the - * fish eye amount to a fixed value - * @param value the new value - */ - public void setValue(double value){ - getParameter("FishEye").setD(value); - } - - /** - * Return FishEye value (e.g to update the FishEye panel) - * @return the fishEye value - */ - public double getValue(){ - return getParameter("FishEye").getD(); - } - - /** - * Public method so it can be called externally from the AFishEyeGroup - * @param status true or false - */ - public void setStatus(boolean status) { - getParameter("FishEye").setStatus(status); - } - - /** - * @return the current fishEye status(true or false) - */ - public boolean getStatus() { - return getParameter("FishEye").getStatus(); - } - - /** - * Gets called each time we enter a window in which this interaction is active - */ - public void entered(){ - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getFishEyeCursor()); - } - - /** - * Gets called each time we leave a window in which this interaction is active - */ - public void exited(){ - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - /** - * Return modifier keys for this projection - * - F for Fast (only detectors are update) - * - V for react only to Vertical mouse movement (only in RZ and XZ projection) - * - H for react only to Horizontal mouse movement (only in RZ and XZ projection, default) - **/ - public AModifier[] getModifiers(){ - if(window.getProjection() instanceof AProjectionRZ || - window.getProjection() instanceof AProjectionXZ) { - return new AModifier[] { - new AModifier(KeyEvent.VK_F, false, "Fast (data not drawn)"), - new AModifier(KeyEvent.VK_V, false, "Vertically defined FishEye"), - new AModifier(KeyEvent.VK_UNDEFINED, false, "Horizontally defined FishEye"), - new AModifier(KeyEvent.VK_H, false, "Horizontally defined FishEye") - }; - } else { - - return new AModifier[] { - new AModifier(KeyEvent.VK_F, false, "Fast (data not drawn)") - }; - } - } - - /** - * Add a new listener for FishEyeChange incidents - * @param listener to be added to list - */ - public void addFishEyeChangeListener(AFishEyeChangeListener listener) { - //Add this listener - fishEyeChangeListeners.addElement(listener); - //And bring it up to date - listener.fishEyeChange(getStatus(), getValue()); - - } - - /** - * Remove a listener from the liste - * @param listener to be removed from list - */ - public void removeFishEyeChangeListener(AFishEyeChangeListener listener) { - //Remove this listener - fishEyeChangeListeners.removeElement(listener); - } - - /** - * Call fishEyeChange method of all FishEyeChange listeners - * @param status the new fisheye status - * @param value the new fisheye value - */ - private void fireFishEyeChange(boolean status, double value) { - - // Loop over all listeners - for (AFishEyeChangeListener listener : fishEyeChangeListeners) - { - // give them the new status - listener.fishEyeChange(status,value); - } - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AInteraction.java deleted file mode 100755 index 446aedc3f93b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AInteraction.java +++ /dev/null @@ -1,323 +0,0 @@ -package atlantis.interactions; - -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.geom.Point2D; -import java.awt.geom.RectangularShape; -import java.awt.Point; -import javax.swing.JPopupMenu; -import javax.swing.JMenuItem; - -import atlantis.canvas.AWindow; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.gui.APopupHelper; -import atlantis.parameters.APar; -import atlantis.utils.APolygon; - -/** - * The abstract supperclass of all the Atlantis interactions. - */ -public abstract class AInteraction -{ - protected static APar parameterStore = APar.instance(); - - /** When the inteaction does'nt need repainting */ - public final static int NO_REPAINT = 0; - - /** - * When the inteaction needs an automatic repainting (acoording to its hot - * regions) - */ - public final static int AUTOMATIC_REPAINT = 1; - - /** When the inteaction needs an repaint of all windows */ - public final static int ALL_WINDOWS_REPAINT = 3; - - /** When the inteaction needs to reapint from scratch its window */ - public final static int WINDOW_TOTAL_REPAINT = 4; - - /** - * The constant used to specify that the interaction wants SCREEN - * COORDINATES - */ - public final static int SCREEN_COORDINATES = 0; - - /** The constant used to specify that the interaction wants WORLD COORDINATES */ - public final static int WORLD_COORDINATES = 1; - - protected final static ADrawParameters frameDrawParameters = new ADrawParameters(true, AColorMap.BK, 4, 1, 1, AGraphics.SYMBOL_FILLED_BOX); - - protected final static ADrawParameters drawParameters = new ADrawParameters(true, AColorMap.WH, 4, 1, 0, AGraphics.SYMBOL_FILLED_BOX); - - protected AWindow window; - protected static final int ctrlPtSize = 1; - protected RectangularShape[] hr; - protected Point2D.Double[] pt; - protected Rectangle oldAffectedRegion; - protected int hotRegionsCount; - protected int repaintMode; - protected int coordinatesType; - protected boolean isPrintable; - - /** - * Creates a new Interaction. - * - * @param hotRegionsCount The number of hot regions used be the interaction - * @param repaintMode The type of repaint wanted. Could be: NO_REPAINT, - * AUTOMATIC_REPAINT, WINDOW_REPAINT, ALL_WINDOWS_REPAINT, - * WINDOW_TOTAL_REPAINT, ALL_WINDOWS_TOTAL_REPAINT. - * @param coordinatesType Could be: SCREEN_COORDINATES, WORLD_COORDINATES. - * @param isPrintable A boolean which indicates whether or not this - * interaction should be printable. - */ - public AInteraction(int hotRegionsCount, int repaintMode, int coordinatesType, boolean isPrintable) - { - - this.hotRegionsCount = hotRegionsCount; - this.repaintMode = repaintMode; - this.coordinatesType = coordinatesType; - this.isPrintable = isPrintable; - - hr = new RectangularShape[hotRegionsCount]; - - /* - * pt = new Point2D.Double[getPointsToIncludeCount()]; for (int i = 0; i < - * pt.length; i++) pt[i] = new Point2D.Double(0, 0); - */ - } - - /** - * Called by the InteractionsManager when the interaction gets connected to - * it. - */ - public void connect(AInteractionsManager manager) - { - this.window = manager.getWindow(); - } - - /** - * Called by the InteractionsManager when the interaction gets disconnected - * from it. - */ - public void disconnect() - { - this.window = null; - } - - /** - * Called by the window on which this interaction works in order to allow - * the interaction to draw on it. - * - * @param g The graphical context on which to draw. - */ - public abstract void paint(Graphics2D g); - - /** - * This method should convert any hot region used by interaction from user - * coordinates to screen coordinates. - * - * @param region The number of the hot region which needs to be converted. - * @return The new RectangularShape object which contains the converted - * region. - */ - public RectangularShape getScreenHotRegion(int region) - { - switch (coordinatesType) - { - case AInteraction.SCREEN_COORDINATES: - return hr[region]; - - case AInteraction.WORLD_COORDINATES: - RectangularShape screenShape = (RectangularShape) hr[region].clone(); - Point2D.Double center = window.calculateDisplay(screenShape.getCenterX(), screenShape.getCenterY()); - double w = screenShape.getWidth(); - double h = screenShape.getHeight(); - - screenShape.setFrame(center.x - w / 2, center.y - w / 2, w, h); - return screenShape; - - default: - return null; - } - } - - /** - * Returns an APolygon made up of the first 4 Hot Regions. - * - * @return The APolygon. - */ - public APolygon getAPolygon() - { - APolygon p = new APolygon(); - - for (int i = 0; i < 4; i++) - p.addPoint(hr[i].getCenterX(), hr[i].getCenterY()); - - return p; - } - - /** - * Sets the x-coordinate of the center of a RectangularShape. - * - * @param shape The shape to set the center to. - * @param x The new x-coordinate of the center. - */ - protected void setCenterX(RectangularShape shape, double x) - { - double w = shape.getWidth(); - double h = shape.getHeight(); - - shape.setFrame(x - w / 2, shape.getY(), w, h); - } - - /** - * Sets the y-coordinate of the center of a RectangularShape. - * - * @param shape The shape to set the center to. - * @param y The new y-coordinate of the center. - */ - protected void setCenterY(RectangularShape shape, double y) - { - double w = shape.getWidth(); - double h = shape.getHeight(); - - shape.setFrame(shape.getX(), y - h / 2, w, h); - } - - /** - * Sets the center of a RectangularShape to (x, y). - * - * @param shape The shape to set the center to. - * @param x The new x-coordinate of the center. - * @param y The new y-coordinate of the center. - */ - protected void setCenter(RectangularShape shape, double x, double y) - { - double w = shape.getWidth(); - double h = shape.getHeight(); - - shape.setFrame(x - w / 2, y - h / 2, w, h); - } - - /** - * Returns the center of an arbitrary hot-region. - * - * @param s The RectangularShape object the center of which is required - * @return The center in double format - */ - public Point2D.Double getCenter(RectangularShape s) - { - return new Point2D.Double(s.getCenterX(), s.getCenterY()); - } - - /** - * Returns the distance between two hot-regions. The result depends on the - * coordinates type. - * - * @param region1 The first region - * @param region2 The second region - * @return The distance - */ - protected double getRadius(int region1, int region2) - { - double dx = hr[region1].getCenterX() - hr[region2].getCenterX(); - double dy = hr[region1].getCenterX() - hr[region2].getCenterY(); - - return Math.sqrt(dx * dx + dy * dy); - } - - /** - * Returns the distance between a point and a hot-regions. The result - * depends on the coordinates type. - * - * @param x The x coordinate of the point - * @param y The y coordinate of the point - * @param region The region index to be used to get the region itself - * @return The distance - */ - protected double getRadius(double x, double y, int region) - { - double dx = x - hr[region].getCenterX(); - double dy = y - hr[region].getCenterY(); - - return Math.sqrt(dx * dx + dy * dy); - } - - /** - * Returns the distance between the center (0, 0) and a hot-regions. The - * result depends on the coordinates type. - * - * @param s The hot-region - * @return The distance - */ - protected double getRadius(RectangularShape s) - { - return s.getCenterX() * s.getCenterX() + s.getCenterY() * s.getCenterY(); - } - - /** - * Retirns the angle made by the line connecting the two hot-regions and the - * horizontal axis. - * - * @param region1 The first region - * @param region2 The second region - * @return the angle in radians. - */ - protected double getAngle(int region1, int region2) - { - double dx = hr[region1].getCenterX() - hr[region2].getCenterX(); - double dy = hr[region1].getCenterY() - hr[region2].getCenterY(); - - if (dx != 0 || dy != 0) - // is this correct - return Math.atan2(dx, dy); - else - return 0.; - } - - protected void drawActivePoint(double x, double y, AGraphics g) - { - g.updateDrawParameters(frameDrawParameters); - g.drawSymbol(x, y); - g.updateDrawParameters(drawParameters); - g.drawSymbol(x, y); - } - - protected void drawActivePoint(int region, AGraphics g) - { - g.updateDrawParameters(frameDrawParameters); - g.drawSymbol(hr[region].getCenterX(), hr[region].getCenterY()); - g.updateDrawParameters(drawParameters); - g.drawSymbol(hr[region].getCenterX(), hr[region].getCenterY()); - } - - protected void drawLine(int region1, int region2, AGraphics g) - { - g.drawLine(hr[region1].getCenterX(), hr[region1].getCenterY(), hr[region2].getCenterX(), hr[region2].getCenterY()); - } - - public boolean isPrintable() - { - return isPrintable; - } - - public AModifier[] getModifiers() - { - return new AModifier[0]; - } - - public void showPopupMenu(Point p, int region) { - APopupHelper.showPopupMenu(p, window, getPopupItems()); - } - - public JPopupMenu getPopupMenu() { - return APopupHelper.getPopupMenu(getPopupItems()); - } - - public JMenuItem[] getPopupItems() { - return null; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AInteractionGroup.java deleted file mode 100755 index fece4376137f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionGroup.java +++ /dev/null @@ -1,143 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.ACanvas; -import atlantis.parameters.APar; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import java.util.Vector; - - -/** - * The InteractionGroup groups interactions of the same kind under a single - * object. The InteractionToolBar deals with the InteractionGroups instead - * of dealing with the interactions directly. - */ -public abstract class AInteractionGroup { - protected static APar parameterStore = APar.instance(); - - /** A group type which once made current affects only the window in which it works*/ - public static final int WINDOW_GROUP=0; - - /** A group type which once made current affects all the windows of the Canvas*/ - public static final int CANVAS_GROUP=1; - - protected String name; - protected String toolTip; - protected AInteractionsManager iManager; - private int groupType; - private boolean isCurrent=false; - private Vector<AInteraction> interactions; - - /** - * Creates an InteractionGroup of a specific type - * and connected to some InteractionsManager - * @param groupType The type of the interface. Can be: WINDOW_GROUP or CANVAS_GROUP - * @param iManager The InteractionsManager to which this group will be connected. - */ - public AInteractionGroup(int groupType, AInteractionsManager iManager) { - - this.groupType=groupType; - this.iManager=iManager; - - interactions=new Vector<AInteraction>(); - } - - public void setGroupName(String name) { - this.name=name; - } - - public String getGroupName() { - return name; - } - - public void setToolTip(String toolTip) { - this.toolTip=toolTip; - } - - public String getToolTip() { - return toolTip; - } - - public JMenuItem getPopupItem() { - JMenuItem item=new JMenuItem(name); - - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ACanvas.getCanvas().getCurrentWindow().getInteractionToolBar().setSelectedGroup(name); - } - }); - - return item; - } - - /** - * Called by the InteractionsManager when the group gets connected to it. - */ - public void connect() {} - - /** - * Called by the InteractionsManager when the group gets disconnected from it. - */ - public void disconnect() {} - - public boolean isWindowGroup() { - return(groupType==WINDOW_GROUP); - } - - public boolean isCanvasGroup() { - return(groupType==CANVAS_GROUP); - } - - /** - * Checks if any additional controls are provided by the current interaction group - * @return true if the interaction group has additional controls - */ - public boolean hasAdditionalControls() { return false; } - - /** - * Returns the additional controls for the current interaction group - * @return the panel containing the additional controls - */ - - public JPanel getAdditionalControls() { return new JPanel(); } - - /** - * Registers a new interaction which will be available with this group. - * @param i The Interaction to be registered. - */ - protected void addInteraction(AInteraction i) { - interactions.addElement(i); - if(isCurrent) - iManager.setContext(this); - } - - /** - * Removes a previously registered interaction from the group. - * @param i The Interaction to be removed. - */ - protected void removeInteraction(AInteraction i) { - interactions.remove(i); - } - - /** - * Removes all previously registered interactions from the group. - */ - protected void removeAllInteractions() { - interactions.clear(); - } - - public Vector<AInteraction> getInteractions() { - return interactions; - } - - /** - * Used to help copying of group. The group should set its internal state to be - * the same as the state of the given group. - * @param givenGroup The group to be copied. - */ - public void setGroupState(AInteractionGroup givenGroup) {} - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsConfigReader.java b/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsConfigReader.java deleted file mode 100644 index 8b4dcaeb95f3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsConfigReader.java +++ /dev/null @@ -1,69 +0,0 @@ -package atlantis.interactions; - -import java.util.Hashtable; -import java.util.Map.Entry; -import java.util.Set; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.projection.AProjectionsManager; - -/** - * Handles the "Interactions" node in the XML configuration file: - * <ul> - * <li>store the InteractionControl node for each projection</li> - * <li>process the lists of available/default projections in demo mode</li> - * </ul> - * - * @author waugh - */ -public class AInteractionsConfigReader { - - /** The set of XML nodes with projection information (name : node). */ - private final static Hashtable<String,Node> projectionNodes = new Hashtable<String, Node>(); - - /** - * Read and process the Interactions information from the XML configuration file. - * - * @param node The XML Node which contains the <bold>Interactions</bold> node. - */ - public static void readInteractions(Node node) { - initProjectionNodes(node); - setAvailableProjectionsInDemoMode(); - } - - /** - * Get the configuration XML node corresponding to a given projection. - * - * @param projectionName the name of the projection - * @return the corresponding InteractionControl node - */ - public static Node getNode(String projectionName) { - return projectionNodes.get(projectionName); - } - - private static void initProjectionNodes(Node node) { - NodeList childNodes=node.getChildNodes(); - for(int i=0; i<childNodes.getLength(); i++) { - Node child=childNodes.item(i); - - if(child.getNodeType()==Node.ELEMENT_NODE) { - String name=child.getAttributes().getNamedItem("projectionName").getNodeValue(); - projectionNodes.put(name, child); - } - } - } - - private static void setAvailableProjectionsInDemoMode() { - Set<Entry<String, Node>> entries = projectionNodes.entrySet(); - for (Entry<String,Node> entry : entries) { - String name = entry.getKey(); - Node node = entry.getValue(); - boolean availableInDemoMode = node.getAttributes().getNamedItem("availableInDemoMode").getNodeValue().equals("YES"); - boolean defaultInDemoMode = node.getAttributes().getNamedItem("defaultInDemoMode").getNodeValue().equals("YES"); - if (availableInDemoMode) AProjectionsManager.makeProjectionAvailableInDemoMode(name); - if (defaultInDemoMode) AProjectionsManager.makeProjectionDefaultInDemoMode(name); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsManager.java b/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsManager.java deleted file mode 100755 index 40b0a2d484fb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AInteractionsManager.java +++ /dev/null @@ -1,535 +0,0 @@ -package atlantis.interactions; - -import java.awt.Rectangle; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.event.WindowFocusListener; -import java.awt.event.WindowEvent; -import java.awt.geom.Point2D; -import java.awt.geom.RectangularShape; -import java.util.LinkedList; -import java.util.Vector; - -import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; -import javax.swing.JMenuItem; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.gui.AEventQueue; -import atlantis.gui.AInteractionToolBar; -import atlantis.gui.APointerPositionWindow; -import atlantis.gui.APreferencesControl; -import atlantis.projection.AProjectionTrackResidual; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjection2D; - -/** - * The InteractionsManager connects to the corresponding window in order to - * provide basic functionality to the interactions. - */ -public class AInteractionsManager -implements MouseListener, MouseMotionListener, WindowFocusListener { - - public final static int LEFT=0; - public final static int MIDDLE=1; - public final static int RIGHT=2; - public final static int ALL=3; - - private final static int safetySize=5; - - private AWindow window; //The window that is monitored by this interaction manager - private LinkedList<AInteraction> interactions; //A list of all the interactions linked to this manager - private AInteraction dragInter; - private int dragInterHotRegion; -// private AInteraction mcInteraction; //This one is set but not used by anything -// private int mcRegion; //This one is set but not used by anything - private RectangularShape[] old_hr; - private AInteractionGroup previousInterface; - private AModifier[] mouseModifiers; - private boolean origAlias=false; - - /** - * Creates an InteractionsManager to work with a specific window. - * @param _window The window with wich the InteractionsManager should work. - */ - public AInteractionsManager(AWindow _window) { - this.window=_window; - - interactions=new LinkedList<AInteraction>(); -// mcInteraction=null; -// mcRegion=-1; - - window.addMouseListener(this); - window.addMouseMotionListener(this); - - mouseModifiers=new AModifier[] { - new AModifier(KeyEvent.VK_O, true, "Output of pointer position"), - new AModifier(KeyEvent.VK_W, true, "Window Menu pops up"), - new AModifier(KeyEvent.VK_I, true, "Interaction Manager pops up"), - new AModifier(KeyEvent.VK_UNDEFINED, true, "Interaction Menu pops up") - }; - } - - public AModifier[] getMouseModifiers() { - return mouseModifiers; - } - - // Implementation of MouseListener - - public void mousePressed(MouseEvent e) { - - if(!ACanvas.getCanvas().getCurrentWindow().equals(window)) - ACanvas.getCanvas().setCurrentWindow(window.getName()); - - if(AInteractionsManager.isIntRightMouseButton(e)) - switch(AEventQueue.getKeyboardState()) { - - case KeyEvent.VK_W: - if(!(window.getProjection() instanceof AProjectionTrackResidual)) - AWindow.getPopupMenu().show(window, e.getX(), e.getY()); - return; - - case KeyEvent.VK_I: - JPopupMenu menu=AInteractionToolBar.getInteractionMenu(window); - - menu.show(window, e.getX(), e.getY()); - return; - - case KeyEvent.VK_O: - Point2D.Double position =window.calculateUser(e.getX(),e.getY()); - //If LegoPlot need to alter phi coord using reverse of the adjustPhi function - if( window.getProjection() instanceof AProjectionLegoPlot) - position.x=-AProjectionLegoPlot.adjustPhi(window,-position.x,position.y); - //Apply inverse non-linear transforms, if in 2D projection - if ( window.getProjection() instanceof AProjection2D) - position = ((AProjection2D)window.getProjection()).inverseNonLinearTransform(position); - //Add labels - String positionX = window.getProjection().getXLabel() + parseUnits(position.x, window.getProjection().getXUnits()); - String positionY = window.getProjection().getYLabel() + parseUnits(position.y, window.getProjection().getYUnits()); - APreferencesControl.setPosMenuItem(true);//shows window if not already visible - APointerPositionWindow.getInstance().toFront();//brings to front - APointerPositionWindow.append(positionX + ", " + positionY + "\n"); - return; - } - - processMousePressed(e); - - if(dragInter!=null) { - dragInter.hr=old_hr; - ((AMouseDragListener)dragInter).cancel(); -// if(dragInter instanceof AEnterExitListener) -// ((AEnterExitListener)dragInter).exited(dragInterHotRegion); - repaintInteraction(dragInter); - dragInter=null; - return; - } - - if(AInteractionsManager.isIntRightMouseButton(e)) - if(processPopupShow(e)) - return; - - if(setupDraggingByHotRegion(e)) return; - if(initializeSleepingInteraction(e)) return; - } - - private boolean processPopupShow(MouseEvent e) { - for(int i=interactions.size()-1; i>=0; i--) { - AInteraction interaction=(AInteraction)interactions.get(i); - - for(int region=0; region<interaction.hr.length; region++) { - if(interaction.getScreenHotRegion(region).contains(e.getPoint())) { - interaction.showPopupMenu(e.getPoint(), region); - return true; - } - } - } - - for(int i=interactions.size()-1; i>=0; i--) { - AInteraction interaction=(AInteraction)interactions.get(i); - - //Turn off right click menu for pick interaction - JMenuItem[] projmenu = (interaction instanceof APickInteraction) ? null : window.getProjection().getPopupItems(); - JMenuItem[] intmenu = (interaction instanceof APickInteraction) ? null : interaction.getPopupItems(); - - JPopupMenu finalmenu = new JPopupMenu(); - - // Combine projection and interaction menus - for (int it = 0; intmenu != null && it < intmenu.length; it++) { - finalmenu.add(intmenu[it]); - } - - if (projmenu != null && projmenu.length > 0 && - intmenu != null && intmenu.length > 0) { - - finalmenu.addSeparator(); - } - - for (int it = 0; projmenu != null && it < projmenu.length; it++) { - finalmenu.add(projmenu[it]); - } - - if (finalmenu.getComponentCount() != 0) { - finalmenu.show(window, (int)e.getPoint().getX(), (int)e.getPoint().getY()); - } - } - - return false; - } - - public void mouseReleased(MouseEvent e) { - if(dragInter!=null) { - ((AMouseDragListener)dragInter).stop(); -// if(dragInter instanceof AEnterExitListener) -// ((AEnterExitListener)dragInter).exited(dragInterHotRegion); - repaintInteraction(dragInter); - dragInter=null; - } - //reset anti-alias - if(origAlias && !(dragInter instanceof ASelection)) - APreferencesControl.setAliasMenuItem(true); - } - - public void mouseClicked(MouseEvent e) {} - - /** - * This function is called each time we enter the window this interaction manager is assigned to - */ - public void mouseEntered(MouseEvent e) { - - //Loop over interaction list from the end - for(int i=interactions.size()-1; i>=0; i--) { - - //get the interaction - AInteraction interaction=(AInteraction)interactions.get(i); - - //Check if this one listens to Enter/Exit events - if (interaction instanceof AEnterExitListener){ - ((AEnterExitListener)interaction).entered(); - } - } - } - - /** - * This function is called each time we exit the window this interaction manager is assigned to - */ - public void mouseExited(MouseEvent e) { - - //Loop over interaction list from the end - for(int i=interactions.size()-1; i>=0; i--) { - - //get the interaction - AInteraction interaction=(AInteraction)interactions.get(i); - - //Check if this one listens to Enter/Exit events - if (interaction instanceof AEnterExitListener) - ((AEnterExitListener)interaction).exited(); - } - } - - private void processMousePressed(MouseEvent e) { - //update if using anti-alias so can switch off during drag - if(!(dragInter instanceof ASelection)) - origAlias = APreferencesControl.getAliasMenuItem(); - for(int i=interactions.size()-1; i>=0; i--) { - AInteraction interaction=(AInteraction)interactions.get(i); - - if(!(interaction instanceof AMousePressListener)) continue; - AMousePressListener clickListener=(AMousePressListener)interaction; - - if(clickListener.getPressButton()!=AInteractionsManager.ALL) - if(clickListener.getPressButton()!=getButton(e)) continue; - Point2D.Double p=null; - - switch(interaction.coordinatesType) { - case AInteraction.SCREEN_COORDINATES: - p=new Point2D.Double(e.getX(), e.getY()); - break; - - case AInteraction.WORLD_COORDINATES: - // p = window.calculateUser(inverseNonLinearTransform(e.getPoint())); - p=window.calculateUser(e.getPoint()); - break; - } - clickListener.pressed(p, getButton(e), AEventQueue.getKeyboardState()); - setTopZOrder(interaction); - repaintInteraction(interaction); - } - } - - // Implementation of MouseMotionListener - - public void mouseDragged(MouseEvent e) { - if(dragInter==null) return; - - //switch off anti-alias - if(origAlias && !(dragInter instanceof ASelection)) - APreferencesControl.setAliasMenuItem(false); - Point2D.Double p=new Point2D.Double(e.getX(), e.getY()); - - if(dragInter.coordinatesType==AInteraction.WORLD_COORDINATES) - // p = dragInter.manager.getWindow().calculateUser(inverseNonLinearTransform(p)); - p=window.calculateUser(p); - - ((AMouseDragListener)dragInter).drag(p, dragInterHotRegion, AEventQueue.getKeyboardState()); - repaintInteraction(dragInter); - } - - //This function is called every time the mouse is moved on the window - public void mouseMoved(MouseEvent e) { - } - - // Implementation of WindowsFocusListener - - /** - * Get called each time the canvas has obtained a focus - */ - public void windowGainedFocus(WindowEvent e) { - //Check if the mouse is over this window (or any of its children) - if (getWindow().getMousePosition(true) != null){ - //raise a mouseEntered event, so the cursor gets updated - this.mouseEntered(null); - } - } - - /** - * Get called each time the canvas has lost a focus - */ - public void windowLostFocus(WindowEvent e) {} - - //Methods belonging to this class - - /** - * Returns all the interactions associated with this InteractionsManager. - * @return The LinkedList containing the interactions. - * DO NOT CHANGE THIS LINKEDLIST, JUST READ IT. - */ - public LinkedList<AInteraction> getInteractions() { - return interactions; - } - - public AWindow getWindow() { - return window; - } - - /** - * This function disconnects the current pannel and all it's - * interactions from the InteractionsManager. - */ - public void forgetContext() { - // Disconnect all the old interactions - if(previousInterface!=null) previousInterface.disconnect(); - for(int i=0; i<interactions.size(); i++) { - AInteraction inter=(AInteraction)interactions.get(i); - - inter.disconnect(); - } - - // Clear the list and repaint the window - interactions.clear(); - window.repaint(); - } - - /** - * Sets the current interaction interface and adds its interactions to the list - * (removing first the old interface and its interactions). - * @param iFace The new interface. - */ - public void setContext(AInteractionGroup iFace) { - forgetContext(); - - if(iFace!=null) - { - // add to the list, connect and repaint the new interactions - Vector<AInteraction> iFaceInter=iFace.getInteractions(); - - for(int i=0; i<iFaceInter.size(); i++) { - AInteraction inter=(AInteraction)iFaceInter.get(i); - interactions.addLast(inter); - inter.connect(this); - repaintInteraction(inter); - } - - iFace.connect(); - } - previousInterface=iFace; - } - - private void repaintInteraction(AInteraction interaction) { - switch(interaction.repaintMode) { - case AInteraction.NO_REPAINT: - return; - - case AInteraction.ALL_WINDOWS_REPAINT: - window.repaint(); - ACanvas.getCanvas().repaintOthers(window); - return; - - case AInteraction.WINDOW_TOTAL_REPAINT: - window.repaintFromScratch(); - return; - - case AInteraction.AUTOMATIC_REPAINT: - Rectangle regionToRedraw=interaction.getScreenHotRegion(0).getBounds(); - - for(int i=1; i<interaction.hr.length; i++) - regionToRedraw.add(interaction.getScreenHotRegion(i).getBounds()); - - if((interaction.pt!=null)&&(interaction.pt.length!=0)) - for(int i=0; i<interaction.pt.length; i++) - regionToRedraw.add(getScreenPointToInclude(interaction, i)); - - regionToRedraw.x-=safetySize; - regionToRedraw.y-=safetySize; - regionToRedraw.width+=2*safetySize; - regionToRedraw.height+=2*safetySize; - - if(interaction.oldAffectedRegion==null) - window.repaint(regionToRedraw); - else - window.repaint(SwingUtilities.computeUnion(interaction.oldAffectedRegion.x, - interaction.oldAffectedRegion.y, interaction.oldAffectedRegion.width, - interaction.oldAffectedRegion.height, new Rectangle(regionToRedraw))); - - interaction.oldAffectedRegion=regionToRedraw; - return; - } - } - - /** - * This method converts the specified "point to include" from user - * coordinates to screen coordinates. - * If the point is already in screen coordinates it just returns it. - */ - private Point2D.Double getScreenPointToInclude(AInteraction interaction, int n) { - switch(interaction.coordinatesType) { - case AInteraction.SCREEN_COORDINATES: - return interaction.pt[n]; - - case AInteraction.WORLD_COORDINATES: - return window.calculateDisplay(interaction.pt[n]); - - default: - return null; - } - } - - private boolean setupDraggingByHotRegion(MouseEvent e) { - for(int i=interactions.size()-1; i>=0; i--) { - AInteraction interaction=(AInteraction)interactions.get(i); - - if(!(interaction instanceof AMouseDragListener)) continue; - AMouseDragListener dInter=(AMouseDragListener)interaction; - - if(dInter.getButton()!=getButton(e)) continue; - - for(int j=0; j<interaction.hr.length; j++) { - if(interaction.getScreenHotRegion(j).contains(e.getPoint())) { - dragInter=interaction; - dragInterHotRegion=j; - - old_hr=new RectangularShape[dragInter.hr.length]; - for(int region=0; region<dragInter.hr.length; region++) - old_hr[region]=(RectangularShape)dragInter.hr[region].clone(); - - Point2D.Double p=new Point2D.Double(e.getX(), e.getY()); - - if(interaction.coordinatesType==AInteraction.WORLD_COORDINATES) - p=window.calculateUser(p); - - // add this statement to guarantee "p0" in AZMRInteraction is initialized - // maybe need more analysis here - if(dragInter instanceof AZMRInteraction) - ((ASleepMouseDragListener)dragInter).init(p, AEventQueue.getKeyboardState()); - - setTopZOrder(dragInter); - ((AMouseDragListener)dragInter).start(p, dragInterHotRegion, AEventQueue.getKeyboardState()); - repaintInteraction(dragInter); - return true; - } - } - } - return false; - } - - private boolean initializeSleepingInteraction(MouseEvent e) { - for(int i=interactions.size()-1; i>=0; i--) { - AInteraction interaction=(AInteraction)interactions.get(i); - - if(interaction instanceof ASleepMouseDragListener) { - ASleepMouseDragListener sdListener=(ASleepMouseDragListener)interaction; - - if(sdListener.getButton()==getButton(e)) { - dragInter=interaction; - - old_hr=new RectangularShape[dragInter.hr.length]; - for(int region=0; region<dragInter.hr.length; region++) - old_hr[region]=(RectangularShape)dragInter.hr[region].clone(); - - Point2D.Double p=new Point2D.Double(e.getX(), e.getY()); - - if(interaction.coordinatesType==AInteraction.WORLD_COORDINATES) - p=window.calculateUser(p); - - dragInterHotRegion=((ASleepMouseDragListener)dragInter).init(p, AEventQueue.getKeyboardState()); - - setTopZOrder(dragInter); - ((AMouseDragListener)dragInter).start(p, dragInterHotRegion, AEventQueue.getKeyboardState()); -// if(dragInter instanceof AEnterExitListener) -// ((AEnterExitListener)dragInter).entered(dragInterHotRegion); - - repaintInteraction(dragInter); - return true; - } - } - } - - return false; - } - - private void setTopZOrder(AInteraction ineraction) { - interactions.remove(ineraction); - interactions.addLast(ineraction); - repaintInteraction((AInteraction)interactions.getLast()); - } - - private int getButton(MouseEvent e) { - if(SwingUtilities.isLeftMouseButton(e)) - return LEFT; - else if(SwingUtilities.isMiddleMouseButton(e)) - return MIDDLE; - else if(AInteractionsManager.isIntRightMouseButton(e)) - return RIGHT; - else - return -1; - } - - private static boolean isIntRightMouseButton(MouseEvent e) - { - return SwingUtilities.isRightMouseButton(e) || - AEventQueue.getIntRightMouseButton(); - } - - private String parseUnits(double d, String units) - { - //covert units and value units shown are cm by default - double abs = Math.abs(d); - if(units.equals("(cm)")) - { - if (abs >= 100.) - return ": " + Math.rint(1000. * d / 100.) / 1000. + " m"; - else if (abs >= 1.) - return ": " + Math.rint(1000. * d / 1.) / 1000. + " cm"; - else if (abs >= 0.1) - return ": " + Math.rint(1000. * d / 0.1) / 1000. + " mm"; - else - return ": " + Math.rint(d / 0.0001) + " um"; - } - else - { - return ": " + Math.rint(1000. * d / 1.) / 1000. + units; - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ALineSegment.java b/graphics/AtlantisJava/src/atlantis/interactions/ALineSegment.java deleted file mode 100755 index 7fe3cfe1acf8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ALineSegment.java +++ /dev/null @@ -1,165 +0,0 @@ -package atlantis.interactions; - - -import atlantis.utils.AVector; -import java.awt.geom.*; - - -/** - * A implementation of the java.awt.RectangularShape which - * represents a segment of a line. - */ -public class ALineSegment extends RectangularShape implements PathIterator { - - Point2D.Double p1; - Point2D.Double p2; - double thickness; - - public ALineSegment(Point2D.Double p1, Point2D.Double p2, double thickness) { - this.p1=p1; - this.p2=p2; - this.thickness=thickness; - } - - public ALineSegment(double x1, double y1, double x2, double y2, double thickness) { - this.p1=new Point2D.Double(x1, y1); - this.p2=new Point2D.Double(x2, y2); - this.thickness=thickness; - } - - private Point2D.Double[] calculateNodes() { - AVector v1=new AVector(p1, p2).makeUnitary().scale(thickness/2).rotate(Math.PI/2); - AVector v2=new AVector(p1, p2).makeUnitary().scale(thickness/2).rotate(-Math.PI/2); - - Point2D.Double[] p=new Point2D.Double[4]; - - p[0]=new Point2D.Double(p1.x+v1.dx, p1.y+v1.dy); - p[1]=new Point2D.Double(p2.x+v1.dx, p2.y+v1.dy); - p[2]=new Point2D.Double(p2.x+v2.dx, p2.y+v2.dy); - p[3]=new Point2D.Double(p1.x+v2.dx, p1.y+v2.dy); - - return p; - } - - public Rectangle2D getBounds2D() { - Point2D.Double[] p=calculateNodes(); - - double minX, minY, maxX, maxY; - - minX=maxX=p[0].x; - minY=maxY=p[0].y; - - for(int i=1; i<p.length; i++) { - if(p[i].x<minX) minX=p[i].x; - if(p[i].x>maxX) maxX=p[i].x; - if(p[i].y<minY) minY=p[i].y; - if(p[i].y>maxY) maxY=p[i].y; - } - - return new Rectangle2D.Double(minX, minY, maxX-minX, maxY-minY); - } - - public boolean contains(double x, double y) { - boolean c=false; - Point2D.Double[] p=calculateNodes(); - - for(int i=0, j=p.length-1; i<p.length; j=i++) - if((((p[i].y<=y)&&(y<p[j].y))||((p[j].y<=y)&&(y<p[i].y))) - &&(x<(p[j].x-p[i].x)*(y-p[i].y)/(p[j].y-p[i].y)+p[i].x) - ) c=!c; - - return c; - } - - public boolean intersects(double x, double y, double w, double h) { - return false; - } - - public boolean contains(double x, double y, double w, double h) { - return false; - } - - public PathIterator getPathIterator(AffineTransform at) { - lineNumber=-1; - return this; - } - - public void setFrame(double x, double y, double w, double h) {} - - public boolean isEmpty() { - return false; - } - - public double getWidth() { - return getBounds2D().getWidth(); - } - - public double getHeight() { - return getBounds2D().getHeight(); - } - - public double getX() { - return getBounds2D().getX(); - } - - public double getY() { - return getBounds2D().getY(); - } - - // PathIterator implementation - int lineNumber; - - // Returns the coordinates and type of the current path segment in the iteration. - public int currentSegment(double[] coords) { - Point2D.Double[] p=calculateNodes(); - - if(lineNumber==-1) { - coords[0]=p[0].x; - coords[1]=p[0].y; - return PathIterator.SEG_MOVETO; - } - - if(lineNumber==4) return PathIterator.SEG_CLOSE; - - coords[0]=p[lineNumber].x; - coords[1]=p[lineNumber].y; - return PathIterator.SEG_LINETO; - } - - public int currentSegment(float[] coords) { - Point2D.Double[] p=calculateNodes(); - - if(lineNumber==-1) { - coords[0]=(float)p[0].x; - coords[1]=(float)p[0].y; - return PathIterator.SEG_MOVETO; - } - - if(lineNumber==4) return PathIterator.SEG_CLOSE; - - coords[0]=(float)p[lineNumber].x; - coords[1]=(float)p[lineNumber].y; - return PathIterator.SEG_LINETO; - } - - // Returns the winding rule for determining the interior of the path. - public int getWindingRule() { - return PathIterator.WIND_NON_ZERO; - } - - public boolean isDone() { - if(lineNumber>4) - return true; - else - return false; - } - - public void next() { - lineNumber++; - } - - public String toString() { - return "ALineSegment["+p1.x+", "+p1.y+", "+p2.x+", "+p2.y+"]"; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AModifier.java b/graphics/AtlantisJava/src/atlantis/interactions/AModifier.java deleted file mode 100644 index d1b57d65f839..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AModifier.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * AModifier.java - * - * Created on 16 July 2007, 12:17 by Adam Davison <adamd at hep.ucl.ac.uk> - */ - -package atlantis.interactions; - -import java.awt.event.KeyEvent; - -/** - * A structure for holding details of an interaction modifier key - * - * @author Adam Davison - */ -public class AModifier { - - public static AModifier nothing = new AModifier(KeyEvent.VK_UNDEFINED, false, "Default interaction"); - - private int m_keycode; - private char m_keychar; - - // Won't use mouse button id's from MouseEvent because i have some memory - // of this not being very platform independant, can fiddle this if we need - // middle click or something later. - private boolean m_right; - - private String m_desc; - - public AModifier(int keycode, boolean right, String desc) { - m_keycode = keycode; - m_keychar = (char)keycode; - m_right = right; - m_desc = desc; - } - - public int getKeyCode() { - return m_keycode; - } - - public char getKeyChar() { - return m_keychar; - } - - public boolean getRightClick() { - return m_right; - } - - public String toKeyString() { - String ret = ""; - if (m_keycode != KeyEvent.VK_UNDEFINED) { - ret = String.valueOf(m_keychar); - if (m_right) { - ret = ret.concat(" + "); - } - } - - if (m_right) { - ret = ret.concat("Right"); - } - - return ret; - } - - public String toDescString() { - return m_desc; - } - - // Two interactions are pretty much the same even if they have different - // descriptions, hence I won't override equals here and cause problems - // putting these things in containers or anything. - public boolean sameAs(AModifier acmp) { - if (acmp == null) { return false; } - - if (acmp.getKeyCode() != getKeyCode()) { - return false; - } - - if (acmp.getRightClick() != getRightClick()) { - return false; - } - - return true; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AMouseDragListener.java b/graphics/AtlantisJava/src/atlantis/interactions/AMouseDragListener.java deleted file mode 100755 index 155f9126f2e5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AMouseDragListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package atlantis.interactions; - - -import java.awt.geom.*; - - -/** - * Implemented by the interactions to get drag events - * from the InteractionsManager. - */ -public interface AMouseDragListener { - - // Should return one of the LEFT, MIDDLE or RIGHT constants from AWindow - int getButton(); - - void start(Point2D.Double p, int region, int key); - void drag(Point2D.Double p, int region, int key); - void stop(); - void cancel(); -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AMousePressListener.java b/graphics/AtlantisJava/src/atlantis/interactions/AMousePressListener.java deleted file mode 100755 index a71c7ca21871..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AMousePressListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package atlantis.interactions; - - -import java.awt.geom.*; - - -/** - * Implemented by the interactions to get press events - * from the InteractionsManager. - */ -public interface AMousePressListener { - - int getPressButton(); - void pressed(Point2D.Double p, int button, int key); -} - diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ANZMRGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/ANZMRGroup.java deleted file mode 100644 index 713743861be9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ANZMRGroup.java +++ /dev/null @@ -1,16 +0,0 @@ -package atlantis.interactions; - -/** - * - * @author Adam Davison - */ -public class ANZMRGroup extends AInteractionGroup { - - private ANZMRInteraction transformInteraction; - - public ANZMRGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - transformInteraction=new ANZMRInteraction(); - this.addInteraction(transformInteraction); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ANZMRInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/ANZMRInteraction.java deleted file mode 100644 index 99ac11f99f3e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ANZMRInteraction.java +++ /dev/null @@ -1,80 +0,0 @@ -package atlantis.interactions; - -import atlantis.nge.ANManager; -import atlantis.nge.ANPickDrawer; -import atlantis.nge.ANPickResultPrinter; -import atlantis.nge.ANProjection; -import atlantis.nge.ANProjection3D; -import atlantis.nge.ANProjectionPhysics; -import java.awt.Graphics2D; -import java.awt.geom.Point2D.Double; - -/** - * - * @author Adam Davison, Mark Stockton - */ -public class ANZMRInteraction extends AInteraction implements ASleepMouseDragListener, AMousePressListener { - - private Double m_last = null; - - public ANZMRInteraction() { - super(0, WINDOW_TOTAL_REPAINT, SCREEN_COORDINATES, false); - } - - @Override - public void paint(Graphics2D g) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void doRotation(double dx, double dy) { - ANProjection np = (ANManager.getManager().getFrameManager(window).getTargetProjection()); - if (np instanceof ANProjection3D) { - ((ANProjection3D) np).dPhi((float) (dx / 4.0)); - ((ANProjection3D) np).dElev((float) (dy / 4.0)); - }else if (np instanceof ANProjectionPhysics) { - ((ANProjectionPhysics) np).dPhi((float) (dx / 4.0)); - ((ANProjectionPhysics) np).dElev((float) (dy / 4.0)); - } - } - - public int getButton() { - return AInteractionsManager.LEFT; - } - - public void start(Double p, int region, int key) { - m_last = p; - } - - public void drag(Double p, int region, int key) { - double dx = (p.getX() - m_last.getX()); - double dy = (p.getY() - m_last.getY()); - - doRotation(dx,dy); - - m_last = p; - } - - public void stop() { - - } - - public void cancel() { - - } - - public int init(Double p, int key) { - return -1; - } - - public int getPressButton() { - return AInteractionsManager.ALL; - } - - public void pressed(Double p, int button, int key) { - System.out.println("ZMR PRESS: " + p.getX() + ":" + p.getY()); - ANPickDrawer pd = new ANPickDrawer(window, window.getWidth(), window.getHeight(), - (int)p.getX(), (int)p.getY(), new ANPickResultPrinter()); - pd.doPick(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AParallelogramSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/AParallelogramSelection.java deleted file mode 100755 index 75e3f512cbc0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AParallelogramSelection.java +++ /dev/null @@ -1,119 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -public class AParallelogramSelection extends ASelection { - final private static int STARTING_WIDTH=25; - - public AParallelogramSelection() { - super(6); - } - - public int init(Point2D.Double p, int key) { - isValid=false; - - setCenter(hr[0], p.x-STARTING_WIDTH, p.y); - setCenter(hr[1], p.x-STARTING_WIDTH, p.y); - setCenter(hr[2], p.x+STARTING_WIDTH, p.y); - setCenter(hr[3], p.x+STARTING_WIDTH, p.y); - setCenter(hr[4], p.x, p.y); - setCenter(hr[5], p.x, p.y); - - region=5; - return region; - } - - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - - double dx, dy; - - switch(region) { - case 4: - dx=hr[0].getCenterX()-hr[4].getCenterX(); - dy=hr[0].getCenterY()-hr[4].getCenterY(); - - setCenter(hr[region], p.x, p.y); - setCenter(hr[0], p.x+dx, p.y+dy); - setCenter(hr[3], p.x-dx, p.y-dy); - break; - - case 5: - dx=hr[1].getCenterX()-hr[5].getCenterX(); - dy=hr[1].getCenterY()-hr[5].getCenterY(); - - setCenter(hr[region], p.x, p.y); - setCenter(hr[1], p.x+dx, p.y+dy); - setCenter(hr[2], p.x-dx, p.y-dy); - break; - - case 0: - case 3: - setCenter(hr[region], p.x, p.y); - - dx=hr[region].getCenterX()-hr[4].getCenterX(); - dy=hr[region].getCenterY()-hr[4].getCenterY(); - - if(region==3) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[1], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - setCenter(hr[2], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - setCenter(hr[0], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[3], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - break; - - case 1: - case 2: - setCenter(hr[region], p.x, p.y); - - dx=hr[region].getCenterX()-hr[5].getCenterX(); - dy=hr[region].getCenterY()-hr[5].getCenterY(); - - if(region==2) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[1], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - setCenter(hr[2], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - setCenter(hr[0], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[3], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - break; - } - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - /** - * Make the affine transform which corresponds to this - * paralleogram-shaped selection. - */ - public Point2D.Double[] getCorners() { - int first=getUpperLeftRegion(); - - // Calculate the opposite index. - int third=(first+2)%4; - - // Now use the cross-product to determine which of the - // remaining points is the one which keep the path going - // clockwise. - int second=(first+1)%4; - double dx0=hr[third].getCenterX()-hr[first].getCenterX(); - double dy0=hr[third].getCenterY()-hr[first].getCenterY(); - double dx1=hr[second].getCenterX()-hr[first].getCenterX(); - double dy1=hr[second].getCenterY()-hr[first].getCenterY(); - - if(dx0*dy1-dy0*dx1>0) second=(first+3)%4; - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/APickGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/APickGroup.java deleted file mode 100755 index e45447479dd5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/APickGroup.java +++ /dev/null @@ -1,102 +0,0 @@ -package atlantis.interactions; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JComboBox; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPanel; - -import atlantis.canvas.ACanvas; -import atlantis.parameters.APar; - -public class APickGroup extends AInteractionGroup -{ - private APickInteraction pickInteraction; - private JComboBox mode; - // the panel that will contain the additional controls for the interactions - private JPanel additionalControls; - - private final static String HITS = "Event Data"; - private final static String DETECTORS = "Detectors"; - - public APickGroup(AInteractionsManager iManager) - { - super(AInteractionGroup.CANVAS_GROUP, iManager); - - // create the additional controls panel - additionalControls = new JPanel(); - - pickInteraction = new APickInteraction(); - addInteraction(pickInteraction); - mode = new JComboBox(); - mode.addItem(HITS); - mode.addItem(DETECTORS); - if (parameterStore.get("Event", "PickingMode").getI() == 0) - mode.setSelectedItem(HITS); - else - mode.setSelectedItem(DETECTORS); - mode.addActionListener(new ModeListener()); - additionalControls.add(mode); - } - - /** - * pick has additional controls, so return true - */ - public boolean hasAdditionalControls() { - return true; - } - - /** - * returns the additional controls - */ - public JPanel getAdditionalControls() { - return additionalControls; - } - - public JMenuItem getPopupItem() - { - // generating the menu - JMenu menu = new JMenu(name); - ActionListener l = new PopUpListener(); - - menu.add(HITS).addActionListener(l); - menu.add(DETECTORS).addActionListener(l); - return menu; - } - - public void connect() - { - super.connect(); - if (parameterStore.get("Event", "PickingMode").getI() == 0) - mode.setSelectedItem(HITS); - else - mode.setSelectedItem(DETECTORS); - } - - class PopUpListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - ACanvas.getCanvas().getCurrentWindow().getInteractionToolBar().setSelectedGroup(name); - mode.setSelectedItem(e.getActionCommand()); - if (e.getActionCommand().equals(HITS)) - parameterStore.get("Event", "PickingMode").setI(0); - else if (e.getActionCommand().equals(DETECTORS)) - parameterStore.get("Event", "PickingMode").setI(1); - } - } - - class ModeListener implements ActionListener - { - public void actionPerformed(ActionEvent e) - { - if (mode.getSelectedItem().equals(HITS)) - parameterStore.get("Event", "PickingMode").setI(0); - else if (mode.getSelectedItem().equals(DETECTORS)) - parameterStore.get("Event", "PickingMode").setI(1); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/APickInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/APickInteraction.java deleted file mode 100755 index a12cdce3ee14..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/APickInteraction.java +++ /dev/null @@ -1,419 +0,0 @@ -package atlantis.interactions; - -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.AWTException; -import java.awt.geom.Point2D; -import java.awt.event.KeyEvent; -import javax.swing.SwingUtilities; - -import atlantis.list.AList; -import atlantis.list.AListManager; -import atlantis.nge.ANManager; -import atlantis.nge.ANProjectionPhysics; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.ALVL1TriggerTowerData; -import atlantis.data.AMuonHitData; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionNPhysics; -import atlantis.projection.AProjectionTrackResidual; -import atlantis.projection.AProjectionsManager; -import atlantis.event.AData; -import atlantis.data.AJetData; -import atlantis.data.ACalorimeterData; -import atlantis.data.ALArData; -import atlantis.data.ASVxData; -import atlantis.data.ARVxData; -import atlantis.data.ATILEData; -import atlantis.data.ATrackData; -import atlantis.graphics.ACursorFactory; -import atlantis.graphics.APickingGraphics2D; -import atlantis.utils.AMath; - - - -public class APickInteraction extends AInteraction implements AMousePressListener, AEnterExitListener -{ - - public APickInteraction() - { - super(0, NO_REPAINT, SCREEN_COORDINATES, false); - } - - - - public int getPressButton() - { - return AInteractionsManager.ALL; - } - - - - private void showCaloPulseShapePlot(AList picked, boolean withcurve) - { - Integer i = APickingGraphics2D.getPickedHitIndex(); - if(i != null) - { - ACalorimeterData c = (ACalorimeterData) picked.getSource(); - c.plotPulseShapes(i.intValue(), withcurve); - } - } - - - - private void showTriggerPulseShapePlot(AList picked) - { - Integer i = APickingGraphics2D.getPickedHitIndex(); - if(i != null) - { - ALVL1TriggerTowerData t = (ALVL1TriggerTowerData) picked.getSource(); - t.plotPulseShapes(i.intValue()); - } - } - - - - private void ignorePickedItem(AList picked) - { - Integer i = APickingGraphics2D.getPickedHitIndex(); - if(i != null) - { - AData d = (AData) picked.getSource(); - String k = d.getStoreGateKey() != null ? ":" + d.getStoreGateKey() : ""; - String m = "\n\n" + d.getNameScreenName() + k + " ID " + - d.getIdFromIndex(i.intValue()) + " (index " + i.intValue() + - ") will be invisible and ignored " + - "(until removed from the Invisible list)"; - AOutput.alwaysAppend(m, ALogInterface.WARNING); - AListManager.getInstance().addInvisible(picked); - } - - } - - - - private void showMuonSector(AList picked) - { - if(picked.getSource() instanceof AMuonHitData) - { - int sector = ((AMuonHitData) picked.getSource()).getSector(picked.getItems()[0]); - int signRZ = ((AMuonHitData) picked.getSource()).getRZSign(picked.getItems()[0]); - if(signRZ == -1) - { - sector = (sector + 8) % 16; - } - parameterStore.get("YZ", "Phi").setD(sector * 22.5); - window.repaintFromScratch(); - } - } - - - - private void showTrackResidualPlot(AList picked) - { - AData pickedData = picked.getSource(); - if(pickedData instanceof ATrackData) - { - if(((ATrackData)pickedData).getResidualStatus()) - { - APickingGraphics2D.showTrackResiduals(window, - (int) APickingGraphics2D.getPickedH(), (int) APickingGraphics2D.getPickedV()); - } - else - { - AOutput.append("\nNo residual information available for this track\n", - ALogInterface.PICK); - } - } - } - - private void showJetView(AList picked) - { - AData pickedData = picked.getSource(); - if(pickedData instanceof AJetData){ - - // Use window "B" to show jets - String jetWindowName = "B"; - if(!ACanvas.getCanvas().isValidWindowName(jetWindowName)) - { - AOutput.append("\nWindow " + jetWindowName + " is not available in current layout" - + "\n", ALogInterface.WARNING); - } - else if(window.getName().equals(jetWindowName)){ - AOutput.append("\nPlease select jet view from a window other than window " + jetWindowName, ALogInterface.WARNING); - } - else{ - AWindow jetWindow = ACanvas.getCanvas().getWindow(jetWindowName); - - //set as NYX to get transition - AProjectionNPhysics jetProj = - (AProjectionNPhysics) AProjectionsManager.getProjection("NPhysics"); - - //setup the projection - ACanvas.getCanvas().moveToFrontWindow(jetWindowName); - jetWindow.setProjection(jetProj); - - //configure the projection - jetProj.configureFrame(ANManager.getManager().getFrameManager(jetWindow)); - ANProjectionPhysics finalProj = (ANProjectionPhysics) ANManager.getManager().getFrameManager(jetWindow).getTargetProjection(); - - AJetData jd = ((AJetData) pickedData); - int index=picked.getItems()[0]; - finalProj.lookAt(jd, index); - } - } - } - - - /** - * @param picked AList - * Check if picked data is SimVertex or RecVertex (RVx) and use the values - * as Atlantis primary vertex: Projection->eta/phi menu - */ - private void setAtlantisPrimaryVertex(AList picked) - { - Integer i = APickingGraphics2D.getPickedHitIndex(); - AData pickedData = picked.getSource(); - double[] vtx = null; - - if(i != null) - { - if(pickedData instanceof ARVxData) - { - vtx = ((ARVxData) pickedData).getVertex(i.intValue()); - } - if(pickedData instanceof ASVxData) - { - vtx = ((ASVxData) pickedData).getVertex(i.intValue()); - } - - if(vtx != null) - { - parameterStore.get("Event", "XVtx").setD(vtx[0]); - parameterStore.get("Event", "YVtx").setD(vtx[1]); - parameterStore.get("Event", "ZVtx").setD(vtx[2]); - AOutput.append("\n\nPrimary vertex set: Projection->" + - AMath.PHI + AMath.ETA + ":\n" + - " XVtx = " + String.format("%.5f",vtx[0]) + " cm\n" + - " YVtx = " + String.format("%.5f",vtx[1]) + " cm\n" + - " ZVtx = " + String.format("%.5f",vtx[2]) + " cm\n", - ALogInterface.WARNING); - } - } - - } // setAtlantisPrimaryVertex() ----------------------------------------- - - - - public void pressed(Point2D.Double p, int button, int key) - { - Point ps = null; - Point pw = null; - int pickingMode = parameterStore.get("Event", "PickingMode").getI(); - - if(button == AInteractionsManager.LEFT) - { - if(key == KeyEvent.VK_C) - { - AListManager.getInstance().clearHighlightAndMassCalculation(); - } - else - { - Rectangle bounds = window.getBounds(); - bounds.setLocation(0, 0); - window.paintWindowFromScratch(new APickingGraphics2D(bounds, - pickingMode, new Point((int) p.x, (int) p.y))); - - // this call prints pick information (calls datatype's getHitInfo()) - if(!(key == KeyEvent.VK_L)) - { - APickingGraphics2D.printPicked(); - } - AList picked = APickingGraphics2D.getPickedHit(); - - if(picked != null && pickingMode == APickingGraphics2D.PICK_HITS_AND_TRACKS) - { - - // highlight by default (not only when key==KeyEvent.VK_H) - AListManager.getInstance().highlight(picked); - - // try to always show calo pulse shapes plot by default - // if no key modifier is pressed - if(picked.getSource() instanceof ACalorimeterData && - key == KeyEvent.KEY_LOCATION_UNKNOWN) - { - showCaloPulseShapePlot(picked, true); - } - // 2009-01-19 for LAr only, see comment at - // the ALArData.plotADCCounts() method - if(picked.getSource() instanceof ACalorimeterData && - key == KeyEvent.VK_D) - { - showCaloPulseShapePlot(picked, false); - } - if(picked.getSource() instanceof ATILEData && - key == KeyEvent.VK_T) { - - Integer i = APickingGraphics2D.getPickedHitIndex(); - if (i != null) { - ATILEData c = (ATILEData) picked.getSource(); - c.plotPulseShapesWithTiming(i.intValue()); - } - } - if(picked.getSource() instanceof ALVL1TriggerTowerData && - key == KeyEvent.KEY_LOCATION_UNKNOWN) - { - showTriggerPulseShapePlot(picked); - } - - if(picked.getSource() instanceof AJetData) - { - double phi = ((AJetData) picked.getSource()).getPhi(picked.getItems()[0]); - parameterStore.get("XZ", "Phi").setD(Math.toDegrees(phi)); - } - - switch(key) - { - case KeyEvent.VK_A: - AListManager.getInstance().add(picked); - break; - case KeyEvent.VK_S: - showMuonSector(picked); - break; - case KeyEvent.VK_N: - APickingGraphics2D.navigatePicked(); - break; - case KeyEvent.VK_R: - showTrackResidualPlot(picked); - break; - case KeyEvent.VK_V: - setAtlantisPrimaryVertex(picked); - break; - case KeyEvent.VK_I: - ignorePickedItem(picked); - break; - case KeyEvent.VK_J: - if(parameterStore.get("Prefs", "OpenGL").getStatus()){ - showJetView(picked); - } - break; - case KeyEvent.VK_M: - AListManager.getInstance().massCalc(picked); - break; - case KeyEvent.VK_L: // Mass calculation for Neutral Decay scenarios - AListManager.getInstance().massCalcV0(picked); - break; - case KeyEvent.VK_P: // Calculate delta Phi for picked objects - AListManager.getInstance().deltaR(picked); - break; - - - } // switch - - } - else if(pickingMode == APickingGraphics2D.PICK_DETECTORS) - { - AListManager.getInstance().clearHighlight(); - } - } - - } // if(button == AInteractionsManager.LEFT) - - else if(button == AInteractionsManager.RIGHT) - { - Rectangle bounds = window.getBounds(); - bounds.setLocation(0, 0); - window.paintWindowFromScratch(new APickingGraphics2D(bounds, APickingGraphics2D.MOVE, - new Point((int) p.x, (int) p.y))); - } - - if(pickingMode != APickingGraphics2D.PICK_DETECTORS) - { - if(APickingGraphics2D.getPickedData() != null - || APickingGraphics2D.getPickedResidual() != null) - { - /* int numEvents = Atlantis.getEventManager().getNumberOfEvents(); - if(numEvents > 0) - { - AOutput.append("\n(" + ++numEvents + " events currently displayed)\n", ALogPane.PICK); - }*/ - - //TODO fix to avoid problems with nge - if(window==null) - return; - - pw = new Point(APickingGraphics2D.getPickedH(), APickingGraphics2D.getPickedV()); - if(pw.x != 0 && pw.y != 0) - try - { - ps = new Point(pw); - SwingUtilities.convertPointToScreen(ps, window); - new Robot().mouseMove(ps.x, ps.y); - } - catch(AWTException e) - {} - else - { - AOutput.alwaysAppend("\n\nYou must pick before you can move", ALogInterface.BAD_COMMAND); - } - } - else - { - if(!(window.getProjection() instanceof AProjectionTrackResidual)) - AOutput.alwaysAppend("\n\nNothing to pick", ALogInterface.BAD_COMMAND); - } - } - - } // pressed() ------------------------------------------------------------ - - - public void paint(Graphics2D g) - {} - - /** - * Gets called each time we enter a window in which this interaction is active - */ - public void entered() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getPickCursor()); - } - - /** - * Gets called each time we leave a window in which this interaction is active - */ - public void exited() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public AModifier[] getModifiers() - { - AModifier[] mods = new AModifier[] { - new AModifier(KeyEvent.VK_UNDEFINED, false, "Pick"), - new AModifier(KeyEvent.VK_UNDEFINED, true, "Move to last picked"), - new AModifier(KeyEvent.VK_A, false, "Add to the current (active) list"), - new AModifier(KeyEvent.VK_C, false, "Clear highlighted and calculation lists"), - new AModifier(KeyEvent.VK_D, false, "Plot ADC counts (digits) only"), - new AModifier(KeyEvent.VK_T, false, "Plot raw and cell time pulses (TILE only)"), - new AModifier(KeyEvent.VK_I, false, "Ignore (make invisible) picked hits/tracks"), - new AModifier(KeyEvent.VK_L, false, "Add to the V0 mass calculation list"), - new AModifier(KeyEvent.VK_M, false, "Add to the mass calculation list"), - new AModifier(KeyEvent.VK_P, false, "Calculate Delta R for 2 tracks"), - new AModifier(KeyEvent.VK_N, false, "Navigate (show data associations)"), - new AModifier(KeyEvent.VK_R, false, "Plot track residuals if available"), - new AModifier(KeyEvent.VK_S, false, "Select this muon Sector"), - new AModifier(KeyEvent.VK_V, false, "Set prim.vertex from picked rec/sim vertex"), - new AModifier(KeyEvent.VK_J, false, "Jet view (OpenGL only)") - }; - - return mods; - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/APopupListener.java b/graphics/AtlantisJava/src/atlantis/interactions/APopupListener.java deleted file mode 100755 index f7b462043d6c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/APopupListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package atlantis.interactions; - - -import java.awt.Point; - - -/** - * The interactions implement this listener to get popup trigger events. - */ -public interface APopupListener { - int REGION_POPUP=0; - int WINDOW_POPUP=1; - - int getPopupType(); - void showPopup(Point p, int region); -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ARectangleSelection.java deleted file mode 100755 index 818dd6120b24..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleSelection.java +++ /dev/null @@ -1,95 +0,0 @@ -package atlantis.interactions; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; - -import atlantis.graphics.ACursorFactory; -import atlantis.graphics.AGraphics; - -public class ARectangleSelection extends ASelection implements AEnterExitListener -{ - public ARectangleSelection() - { - super(4); - } - - public int init(Point2D.Double p, int key) - { - isValid = false; - - for (int i = 0; i < 4; i++) - setCenter(hr[i], p.x, p.y); - - this.region = 2; - return region; - } - - public void drag(Point2D.Double p, int region, int key) - { - isValid = true; - - // Update the active control point. - setCenter(hr[region], p.x, p.y); - - // Get the opposite control point. - int oppCtrlPt = (region + 2) % 4; - double xOpp = hr[oppCtrlPt].getCenterX(); - double yOpp = hr[oppCtrlPt].getCenterY(); - - // Now choose the next control point so that we maintain a - // clockwise order to the points. - int otherCtrlPt = ((p.x < xOpp && p.y > yOpp) || (p.x > xOpp && p.y < yOpp)) ? 1 : 3; - - otherCtrlPt = (region + otherCtrlPt) % 4; - - // Set the other two control points. - setCenter(hr[otherCtrlPt], p.x, yOpp); - otherCtrlPt = (otherCtrlPt + 2) % 4; - setCenter(hr[otherCtrlPt], xOpp, p.y); - } - - public void paint(Graphics2D g) - { - if (!isValid) - return; - - AGraphics ag = AGraphics.makeAGraphics(g); - - ag.updateDrawParameters(frameDrawParameters); - ag.drawPolygon(getAPolygon()); - ag.updateDrawParameters(drawParameters); - ag.drawPolygon(getAPolygon()); - drawActivePoint(region, ag); - } - - public Point2D.Double[] getCorners() - { - int first = getUpperLeftRegion(); - - // Calculate the adjacent partner and the opposite corner. - int second = (first + 1) % 4; - int third = (first + 2) % 4; - - return convert(first, second, third); - } - - /** - * Get called each time we enter a window in which this interaction is - * active - */ - public void entered() - { - // Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getRectSelectCursor()); - } - - /** - * Get called each time we leave a window in which this interaction is active - */ - public void exited() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleVPSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ARectangleVPSelection.java deleted file mode 100755 index 8d26e25ff33e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleVPSelection.java +++ /dev/null @@ -1,524 +0,0 @@ -package atlantis.interactions; - -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.Point2D; -import javax.swing.JMenuItem; -import java.util.List; -import java.util.ArrayList; - -import atlantis.event.AData; -import atlantis.event.AEventManager; -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.ACalorimeterData; -import atlantis.event.AEvent; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.ADragListener; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.utils.AMath; -import atlantis.utils.A3Vector; - -public class ARectangleVPSelection extends ARectangleSelection - implements ActionListener, ADragListener -{ - - public final static String RUBBERBAND_WHOLE_WINDOW = "Rubberband Whole Window"; - public final static String ZOOM_LAR = "Zoom LAr"; - public final static String ZOOM_CALORIMETERS = "Zoom Calorimeters"; - public final static String CUT_ETAPHI = "Cut ( " + AMath.ETA + AMath.PHI + " cut )"; - public final static String PRINT_CONTENTS = "Print Contents"; - public final static String SHOW_IN_3DBOX = "Show in 3DBox"; - public final static String TURN_OFF_ETAPHI_CUT = "Turn off " + CUT_ETAPHI; - - private static AEventManager eventManager = AEventManager.instance(); - - public ARectangleVPSelection() - { - super(); - - addActionButton(ZOOM_LAR, this, this); - addActionButton(ZOOM_CALORIMETERS, this, this); - addActionButton(CUT_ETAPHI, this, this); - addActionButton(RUBBERBAND_WHOLE_WINDOW, this, this); - addActionButton(PRINT_CONTENTS, this, this); - addActionButton(SHOW_IN_3DBOX, this, this); - - } - - - - @Override - public JMenuItem[] getPopupItems() - { - ArrayList al = new ArrayList(); - if (window.getUnzoomPossible()) - { - JMenuItem item = new JMenuItem("Unzoom"); - al.add(item); - item.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoom(); - } - }); - } - if(window.getUnzoomAllPossible(ZOOM_LAR)) - { - JMenuItem item = new JMenuItem("Unzoom LAr"); - al.add(item); - item.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) { - window.unzoom(ARectangleVPSelection.ZOOM_LAR); - } - }); - } - if(window.getUnzoomAllPossible(ZOOM_CALORIMETERS)) - { - JMenuItem item = new JMenuItem("Unzoom Calorimeters"); - al.add(item); - item.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) { - window.unzoom(ZOOM_CALORIMETERS); - } - }); - } - if (window.getUnzoomFullPossible()) - { - JMenuItem item = new JMenuItem("Unzoom Full"); - al.add(item); - item.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoomFull(); - } - }); - } - - JMenuItem rww = new JMenuItem(RUBBERBAND_WHOLE_WINDOW); - rww.addActionListener(this); - - JMenuItem toec = new JMenuItem(TURN_OFF_ETAPHI_CUT); - toec.addActionListener(this); - - al.add(rww); - al.add(toec); - - // Can't cast arrays very easily... - JMenuItem[] ret = new JMenuItem[al.size()]; - for (int i = 0; i < al.size(); i++) { - ret[i] = (JMenuItem)al.get(i); - } - - return ret; - } - - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - - if(ZOOM_LAR.equals(action)) - { - performZoom(ZOOM_LAR); - } - else if(ZOOM_CALORIMETERS.equals(action)) - { - performZoom(ZOOM_CALORIMETERS); - } - else if(CUT_ETAPHI.equals(action)) - { - applyCutIn(window.getName()); - } - else if(RUBBERBAND_WHOLE_WINDOW.equals(action)) - { - rubberbandWholeWindow(); - } - else if(PRINT_CONTENTS.equals(action)) - { - performOperationWithCuts(PRINT_CONTENTS); - } - else if(SHOW_IN_3DBOX.equals(action)) - { - tracksTo3DBox(); - } - else if(TURN_OFF_ETAPHI_CUT.equals(action)) - { - turnOffEtaPhiCuts(); - } - - } - - - private void turnOffEtaPhiCuts() - { - parameterStore.get("CutsATLAS", "CutPhi").setStatus(false); - parameterStore.get("CutsATLAS", "CutEta").setStatus(false); - String warning = "\n\nCuts -> ATLAS -> Cut " + AMath.ETA + " deactivated" + - "\nCuts -> ATLAS -> Cut " + AMath.PHI + " deactivated\n\n"; - AOutput.append(warning, ALogInterface.WARNING); - ACanvas.getCanvas().repaintAllFromScratch(); - - } - - - - private void tracksTo3DBox() { - Point2D.Double[] corners = getCorners(); - double eta = (corners[2].x + corners[0].x) / 2.; - double phi = Math.toRadians((corners[2].y + corners[0].y) / 2.); - - A3Vector ray = A3Vector.fromEtaPhiR(eta, phi, 1.0); - - // Need to make sure we change existing 3DBoxes - parameterStore.get("3D", "xAxis").changeScope(AParameter.GLOBAL); - parameterStore.get("3D", "yAxis").changeScope(AParameter.GLOBAL); - parameterStore.get("3D", "zAxis").changeScope(AParameter.GLOBAL); - parameterStore.get("3D", "xAxis").setD(ray.x); - parameterStore.get("3D", "yAxis").setD(ray.y); - parameterStore.get("3D", "zAxis").setD(ray.z); - - // 3DBoxes can be anywhere on the screen: - ACanvas.getCanvas().repaintAllFromScratch(); - } - - - public void dragPerformed(Object from, Object to, int action) - { - if (to instanceof ADnDLabel) - { - applyCutIn(((ADnDLabel) to).getText()); - } - else if (to instanceof AWindow) - { - applyCutIn(((AWindow) to).getName()); - } - } - - - - private boolean checkEtaPhiCutValues(double eta, double phi, - double cutPhi, double cutEta) - { - if (!(parameterStore.get("CutsATLAS", "PhiMiddle").validateValue(phi) && - parameterStore.get("CutsATLAS", "EtaMiddle").validateValue(eta) && - parameterStore.get("CutsATLAS", "CutPhi").validateValue(cutPhi) && - parameterStore.get("CutsATLAS", "CutEta").validateValue(cutEta))) - { - String etaphi = AMath.ETA + AMath.PHI; - AOutput.append("\nOperation cancelled: " + etaphi + - " cut values outside allowed range\n", ALogInterface.WARNING); - return false; - - } - else - { - return true; - } - - } - - - - public void applyCutIn(String zoomWindowName) - { - Point2D.Double[] corners = getCorners(); - double eta = (corners[2].x + corners[0].x) / 2.; - double cutEta = Math.abs((corners[2].x - corners[0].x)) / 2.; - double phi = (corners[2].y + corners[0].y) / 2.; - double cutPhi = Math.abs((corners[2].y - corners[0].y)) / 2.; - double rhoVPlot = AProjectionVP.getRhoZoomVPlot(); - double zVPlot = AProjectionVP.getZZoomVPlot(); - double zVtx = parameterStore.get("Event", "ZVtx").getD(); - double zLower = Math.max(Math.min(rhoVPlot * AMath.tanLambda(eta - cutEta) + zVtx, 0.), -zVPlot); - double zUpper = Math.min(Math.max(rhoVPlot * AMath.tanLambda(eta + cutEta) + zVtx, 0.), zVPlot); - - if(! checkEtaPhiCutValues(eta, phi, cutPhi, cutEta)) - { - return; - } - - String currentWindowName = window.getName(); - - parameterStore.selectWindowParameters(zoomWindowName); - parameterStore.get("CutsATLAS", "PhiMiddle").setD(phi); - parameterStore.get("CutsATLAS", "EtaMiddle").setD(eta); - parameterStore.get("CutsATLAS", "CutPhi").setD(cutPhi); - parameterStore.get("CutsATLAS", "CutPhi").setStatus(true); - parameterStore.get("CutsATLAS", "CutEta").setD(cutEta); - parameterStore.get("CutsATLAS", "CutEta").setStatus(true); - - String warning = "\n\nCuts -> ATLAS -> Cut " + AMath.ETA + " now active" + - "\nCuts -> ATLAS -> Cut " + AMath.PHI + " now active\n\n"; - AOutput.append(warning, ALogInterface.WARNING); - - AWindow zoomWindow = ACanvas.getCanvas().getWindow(zoomWindowName); - AProjection zoomProjection = zoomWindow.getProjection(); - - if (zoomProjection instanceof AProjectionFR) - { - zoomWindow.setUserCorners(0., rhoVPlot, phi - cutPhi, phi + cutPhi); - } - else if (zoomProjection instanceof AProjectionFZ) - { - zoomWindow.setUserCorners(zLower, zUpper, phi - cutPhi, phi + cutPhi); - } - else if (zoomProjection instanceof AProjectionVP) - { - if (!zoomWindowName.equals(currentWindowName)) - zoomWindow.setUserCorners(eta - cutEta, eta + cutEta, phi - cutPhi, phi + cutPhi); - } - else if (zoomProjection instanceof AProjectionYX) - { - zoomWindow.setUserCorners(-rhoVPlot, rhoVPlot, -rhoVPlot, rhoVPlot); - } - else if (zoomProjection instanceof AProjectionXZ) - { - double rhoZoom = Math.min(rhoVPlot, 110.); - - zoomWindow.setUserCorners(zLower, zUpper, 0., rhoZoom); - parameterStore.get("XZ", "Phi").setD(AMath.nearestPhiDegrees(phi)); - } - else if (zoomProjection instanceof AProjectionYZ) - { - double rhoZoom = Math.min(rhoVPlot, 110.); - - zoomWindow.setUserCorners(zLower, zUpper, -rhoZoom, rhoZoom); - parameterStore.get("YZ", "Phi").setD(AMath.nearestPhiDegrees(phi)); - } - else if (zoomProjection instanceof AProjectionRZ) - { - zoomWindow.setUserCorners(zLower, zUpper, 0., rhoVPlot); - parameterStore.get("RZ", "Phi").setD(AMath.nearestPhiDegrees(phi)); - } - parameterStore.restoreWindowParameters(); - - // don't repaint just the current window after cut(s) are applied, - // but repaint everything (all windows) - // zoomWindow.repaintFromScratch(); - ACanvas.getCanvas().repaintAllFromScratch(); - - } - - public void performZoom(String typeOfZoom) - { - int numberOfWindows=0; - - if(ZOOM_LAR.equals(typeOfZoom)) - { - numberOfWindows = 4; - } - else if(ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - numberOfWindows = 8; - } - - AWindow currentWindow = window; - String name = currentWindow.getName(); - currentWindow.saveLayout(); - boolean scaleStatus = currentWindow.getScaleStatus(); - Point2D.Double[] zoomedCorners = getCorners(); - layoutChange(typeOfZoom); - int nameIndex=-1; - for (int i = 0; i < numberOfWindows; i++) - { - String wName = Integer.toString(i + 1); - AWindow w = ACanvas.getCanvas().getWindow(wName); - //dont zoom current window as will not save corners correctly - if (w != null && !name.equals(wName)) - { - w.saveParameters(typeOfZoom); - ACanvas.getCanvas().copyWindowSettings(currentWindow.getName(), wName); - w.saveCorners(typeOfZoom); - w.setUserCorners(zoomedCorners); - w.setScaleStatus(scaleStatus); - parameterStore.selectWindowParameters(wName); - parameterStore.get("VP", "Mode").setI(AProjectionVP.MODE_ECAL_LAYER_0 + i); - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(w.getName()); - w.repaintFromScratch(); - } - else if(name.equals(wName)) - { - nameIndex=i; - } - } - //now do zoom of current window if needed - if(nameIndex>0) - { - currentWindow.saveParameters(typeOfZoom); - currentWindow.saveCorners(typeOfZoom); - currentWindow.setUserCorners(zoomedCorners); - currentWindow.setScaleStatus(scaleStatus); - parameterStore.selectWindowParameters(name); - parameterStore.get("VP", "Mode").setI(AProjectionVP.MODE_ECAL_LAYER_0 + nameIndex); - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(name); - currentWindow.repaintFromScratch(); - } - for (int i = 0; i < numberOfWindows; i++) - if (name.equals(Integer.toString(i + 1))) - invalidate(); - } - - public void layoutChange(String typeOfZoom) - { - // change layout - if(!ACanvas.getCanvas().getCurrentLayout().getName().equals("SQUARE")) - { - ACanvas.getCanvas().setCurrentLayout("SQUARE"); - } - - // print info message - AOutput.append("\nWindows changed to: \n",ALogInterface.TITLE); - AOutput.append("Window 1: ECAL sampling 0\n",ALogInterface.NORMAL); - AOutput.append("Window 2: ECAL sampling 1\n",ALogInterface.NORMAL); - AOutput.append("Window 3: ECAL sampling 2\n",ALogInterface.NORMAL); - AOutput.append("Window 4: ECAL sampling 3\n",ALogInterface.NORMAL); - - if(ZOOM_CALORIMETERS.equals(typeOfZoom)) - { - AOutput.append("Window 5: HCAL sampling 0\n",ALogInterface.NORMAL); - AOutput.append("Window 6: HCAL sampling 1\n",ALogInterface.NORMAL); - AOutput.append("Window 7: HCAL sampling 2\n",ALogInterface.NORMAL); - AOutput.append("Window 8: HCAL sampling 3\n",ALogInterface.NORMAL); - } - } - - - private void printContents() - { - // get all data within selection (eta/phi cut already applied) - AEvent event = eventManager.getCurrentEvent(); - StringBuffer output = new StringBuffer("Data inside Rubberband selection:"); - // hits and tracks first - List hitsAndTracks = event.getHitsAndTracks(window.getProjection()); - for(int i = 0; i < hitsAndTracks.size(); i++) - { - String info = ((AData) hitsAndTracks.get(i)).getVPHitInfo(); - if(! "".equals(info)) - { - output.append("\n" + info); - } - } - - // calorimeters (as they are handled differently) - List cal = event.getCalorimeters(); - for (int i = 0; i < cal.size(); i++) - { - ACalorimeterData calorimeter = (ACalorimeterData) cal.get(i); - calorimeter.makeDrawList(); - String info = calorimeter.getVPHitInfo(); - if(! "".equals(info)) - { - output.append("\n" + info); - } - } - - AOutput.alwaysAppend("\n" + output + "\n", ALogInterface.PICK); - - } - - - - /** - * Apply eta phi cuts based on the selected (rubberband region), then - * perform the desired operation with data in the selection and - * restore previous cuts settings. - */ - private void performOperationWithCuts(String operation) - { - // which corners fall into eta/phi rubberband selection - Point2D.Double[] corners = getCorners(); - double eta = (corners[2].x + corners[0].x) / 2.; - double cutEta = Math.abs((corners[2].x - corners[0].x)) / 2.; - double phi = (corners[2].y + corners[0].y) / 2.; - double cutPhi = Math.abs((corners[2].y - corners[0].y)) / 2.; - - if(! checkEtaPhiCutValues(eta, phi, cutPhi, cutEta)) - { - return; - } - - // need to temporarily apply eta/phi cut, but get the current - // eta/phi cut values first and save them - AParameter phiPar = parameterStore.get("CutsATLAS", "PhiMiddle"); - AParameter cutPhiPar = parameterStore.get("CutsATLAS", "CutPhi"); - AParameter etaPar = parameterStore.get("CutsATLAS", "EtaMiddle"); - AParameter cutEtaPar = parameterStore.get("CutsATLAS", "CutEta"); - double oldEta = etaPar.getD(); - double oldCutEta = cutEtaPar.getD(); - boolean oldCutEtaStatus = cutEtaPar.getStatus(); - double oldPhi = phiPar.getD(); - double oldCutPhi = cutPhiPar.getD(); - boolean oldCutPhiStatus = cutPhiPar.getStatus(); - - // set new (temporary) values of eta/phi cuts according to selection - phiPar.setD(phi); - etaPar.setD(eta); - cutPhiPar.setD(cutPhi); - cutPhiPar.setStatus(true); - cutEtaPar.setD(cutEta); - cutEtaPar.setStatus(true); - - if(PRINT_CONTENTS.equals(operation)) - { - printContents(); - } - - // set back the previous eta/phi cut values - phiPar.setD(oldPhi); - etaPar.setD(oldEta); - cutPhiPar.setD(oldCutPhi); - cutPhiPar.setStatus(oldCutPhiStatus); - cutEtaPar.setD(oldCutEta); - cutEtaPar.setStatus(oldCutEtaStatus); - - } // printContents() ---------------------------------------------------- - - - - public void rubberbandWholeWindow() - { - Rectangle curr = window.getCurrDisp(); - - double x = curr.getX(); - double y = curr.getY(); - double w = curr.getWidth(); - double h = curr.getHeight(); - - setCenter(hr[0], x, y); - setCenter(hr[1], x + w, y); - setCenter(hr[2], x + w, y + h); - setCenter(hr[3], x, y + h); - isValid = true; - region = 1; - stop(); - window.repaint(); - oldAffectedRegion = curr; - int safetySize = 5; - - oldAffectedRegion.x -= safetySize; - oldAffectedRegion.y -= safetySize; - oldAffectedRegion.width += 2 * safetySize; - oldAffectedRegion.height += 2 * safetySize; - - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleYXSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ARectangleYXSelection.java deleted file mode 100755 index 0a01c70592c8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARectangleYXSelection.java +++ /dev/null @@ -1,320 +0,0 @@ -package atlantis.interactions; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.Point2D; -import java.util.ArrayList; - -import javax.swing.JMenuItem; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.graphics.dnd.ADragListener; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionsManager; - -/** - * Contains the function for selecting zoom endcap layers and summed endcaps - * - * @author Mark Stockton - */ -public class ARectangleYXSelection extends ARectangleSelection implements ActionListener, ADragListener -{ - public final static String ZOOM_SUMMED = "summed"; - public final static String ZOOM_LAYERS = "layers"; - - public ARectangleYXSelection() - { - super(); - addActionButton("Zoom Summed Endcaps", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if (e.getActionCommand().equals("Zoom Summed Endcaps")) - performZoom(ZOOM_SUMMED); - } - }); - addActionButton("Zoom Endcap Layers -", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if (e.getActionCommand().equals("Zoom Endcap Layers -")) - zoomLayersMinus(); - } - }); - addActionButton("Zoom Endcap Layers +", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if (e.getActionCommand().equals("Zoom Endcap Layers +")) - zoomLayersPlus(); - } - }); - addActionButton("Zoom Both Endcap Layers", new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if (e.getActionCommand().equals("Zoom Both Endcap Layers")) - zoomLayersCombined(); - } - }); - } - - public void zoomLayersMinus() - { - parameterStore.get("CutsCalo", "FCAL").setI(0); - parameterStore.get("CutsCalo", "LAr").setI(0); - parameterStore.get("CutsCalo", "HEC").setI(-2); - performZoom(ZOOM_LAYERS); - } - - public void zoomLayersPlus() - { - parameterStore.get("CutsCalo", "FCAL").setI(1); - parameterStore.get("CutsCalo", "LAr").setI(1); - parameterStore.get("CutsCalo", "HEC").setI(2); - performZoom(ZOOM_LAYERS); - } - - public void zoomLayersCombined() - { - parameterStore.get("CutsCalo", "FCAL").setI(-1); - parameterStore.get("CutsCalo", "LAr").setI(-1); - parameterStore.get("CutsCalo", "HEC").setI(-1); - performZoom(ZOOM_LAYERS); - } - - public void performZoom(String typeOfZoom) - { - int numberOfWindows=0; - if(typeOfZoom.equals(ZOOM_SUMMED)) - numberOfWindows=4; - else if(typeOfZoom.equals(ZOOM_LAYERS)) - numberOfWindows=8; - - AWindow currentWindow = window; - String name = currentWindow.getName(); - currentWindow.saveLayout(); - boolean scaleStatus = currentWindow.getScaleStatus(); - Point2D.Double[] zoomedCorners = getCorners(); - //change layout and print info message - layoutChange(typeOfZoom); - int nameIndex=-1; - for (int i = numberOfWindows; i >=1; i--) - { - String wName = Integer.toString(i); - AWindow w = ACanvas.getCanvas().getWindow(wName); - //dont zoom current window as will not save corners correctly - if (w != null && !name.equals(wName)) - { - w.saveParameters(typeOfZoom); - ACanvas.getCanvas().copyWindowSettings(currentWindow.getName(), wName); - w.saveCorners(typeOfZoom); - w.setUserCorners(zoomedCorners); - w.setScaleStatus(scaleStatus); - parameterStore.selectWindowParameters(wName); - - if(typeOfZoom.equals(ZOOM_SUMMED)) - zoomSummedOptions(i-1); - else if(typeOfZoom.equals(ZOOM_LAYERS)) - parameterStore.get("YX", "Mode").setI(AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER + i -1); - - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(w.getName()); - w.repaintFromScratch(); - } - else if(name.equals(wName)) - { - nameIndex=i; - } - } - //now do zoom of current window if needed - if(nameIndex>0) - { - currentWindow.saveParameters(typeOfZoom); - currentWindow.saveCorners(typeOfZoom); - currentWindow.setUserCorners(zoomedCorners); - currentWindow.setScaleStatus(scaleStatus); - parameterStore.selectWindowParameters(name); - if(typeOfZoom.equals(ZOOM_SUMMED)) - zoomSummedOptions(nameIndex-1); - else if(typeOfZoom.equals(ZOOM_LAYERS)) - parameterStore.get("YX", "Mode").setI(AProjectionYX.MODE_LAR_ENDCAP_PRESAMPLER + nameIndex -1); - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(name); - currentWindow.repaintFromScratch(); - } - for (int i = 1; i <= numberOfWindows; i++) - if (name.equals(Integer.toString(i))) - invalidate(); - //if doing layers zoom last window shows rhoZ view - if(typeOfZoom.equals(ZOOM_LAYERS)) - zoomLastWindow(scaleStatus, name); - } - - public void layoutChange(String typeOfZoom) - { - if(typeOfZoom.equals(ZOOM_SUMMED)) - { - //change layout - if(!ACanvas.getCanvas().getCurrentLayout().getName().equals("FOUR SQUARES")) - ACanvas.getCanvas().setCurrentLayout("FOUR SQUARES"); - //print info message - AOutput.append("\nWindows changed to:\n",ALogInterface.TITLE); - AOutput.append("Window 1: LAr Endcap -\n",ALogInterface.NORMAL); - AOutput.append("Window 2: LAr Endcap +\n",ALogInterface.NORMAL); - AOutput.append("Window 3: HEC -\n",ALogInterface.NORMAL); - AOutput.append("Window 4: HEC +\n",ALogInterface.NORMAL); - } - else if(typeOfZoom.equals(ZOOM_LAYERS)) - { - //change layout - if(!ACanvas.getCanvas().getCurrentLayout().getName().equals("SQUARE")) - ACanvas.getCanvas().setCurrentLayout("SQUARE"); - //print info message - AOutput.append("\nWindows changed to:\n",ALogInterface.TITLE); - AOutput.append("Window 1: LAr Endcap Presampler\n",ALogInterface.NORMAL); - AOutput.append("Window 2: LAr Endcap 1\n",ALogInterface.NORMAL); - AOutput.append("Window 3: LAr Endcap 2\n",ALogInterface.NORMAL); - AOutput.append("Window 4: LAr Endcap 3\n",ALogInterface.NORMAL); - AOutput.append("Window 5: HEC 1\n",ALogInterface.NORMAL); - AOutput.append("Window 6: HEC 2\n",ALogInterface.NORMAL); - AOutput.append("Window 7: HEC 3\n",ALogInterface.NORMAL); - AOutput.append("Window 8: HEC 4\n",ALogInterface.NORMAL); - AOutput.append("Window 9: rhoZ view showing both endcaps\n",ALogInterface.NORMAL); - } - } - - public void zoomSummedOptions(int i) - { - parameterStore.get("CutsCalo", "LAr").changeScope(AParameter.LOCAL); - parameterStore.get("CutsCalo", "HEC").changeScope(AParameter.LOCAL); - switch (i) - { - case 0: - parameterStore.get("CutsCalo", "LAr").setI(0); - parameterStore.get("CutsCalo", "HEC").setI(-1); - break; - case 1: - parameterStore.get("CutsCalo", "LAr").setI(1); - parameterStore.get("CutsCalo", "HEC").setI(-1); - break; - case 2: - parameterStore.get("CutsCalo", "LAr").setI(-1); - parameterStore.get("CutsCalo", "HEC").setI(-2); - break; - case 3: - parameterStore.get("CutsCalo", "LAr").setI(-1); - parameterStore.get("CutsCalo", "HEC").setI(2); - break; - } - parameterStore.get("YX", "Mode").setI(AProjectionYX.MODE_LAR_ENDCAP_SUMMED + (int) Math.floor(i/2)); - } - - public void zoomLastWindow(boolean scaleStatus, String name) - { - String wName = Integer.toString(9); - AWindow w = ACanvas.getCanvas().getWindow(wName); - //want last window to be RZ view but won't change its zoom - AProjection p = AProjectionsManager.getProjection("RZ"); - w.setProjection(p); - Point2D.Double[] newCorners = new Point2D.Double[3]; - //FIXME hardcoded geometry of endcaps - //set region to be round the endcaps - newCorners[0]=new Point2D.Double(-650.0, 225); - newCorners[1]=new Point2D.Double(650.0, 225); - newCorners[2]=new Point2D.Double(650.0, -225); - - w.setUserCorners(newCorners); - w.setScaleStatus(scaleStatus); - parameterStore.selectWindowParameters(wName); - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(w.getName()); - w.repaintFromScratch(); - if (name.equals(wName)) - invalidate(); - } - - public void dragPerformed(Object from, Object to, int action) - {} - - public JMenuItem[] getPopupItems() { - ArrayList al = new ArrayList(); - if(window.getUnzoomPossible()) - { - JMenuItem it = new JMenuItem("Unzoom"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoom(); - } - }); - al.add(it); - } - if(window.getUnzoomAllPossible(ZOOM_LAYERS)) - { - JMenuItem it = new JMenuItem("Unzoom layers"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoom(ZOOM_LAYERS); - } - }); - al.add(it); - } - if(window.getUnzoomAllPossible(ZOOM_SUMMED)) - { - JMenuItem it = new JMenuItem("Unzoom summed"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoom(ZOOM_SUMMED); - } - }); - al.add(it); - } - if (window.getUnzoomFullPossible()) - { - JMenuItem it = new JMenuItem("Unzoom Full"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoomFull(); - } - }); - al.add(it); - } - // Can't cast arrays very easily... - JMenuItem[] ret = new JMenuItem[al.size()]; - for(int i = 0; i < al.size(); i++) - { - ret[i] = (JMenuItem) (al.get(i)); - } - return ret; - } - - public void actionPerformed(ActionEvent e) { - String action=e.getActionCommand(); - if(action.equals("Unzoom")) { - window.unzoom(); - } - if(action.equals("Unzoom layers")) { - window.unzoom(ZOOM_LAYERS); - } - if(action.equals("Unzoom summed")) { - window.unzoom(ZOOM_SUMMED); - } - if(action.equals("Unzoom Full")) { - window.unzoomFull(); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARotatedRectangleSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ARotatedRectangleSelection.java deleted file mode 100755 index 3cf0fd33bbe0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARotatedRectangleSelection.java +++ /dev/null @@ -1,211 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -public class ARotatedRectangleSelection extends ASelection { - - // The initial starting width of the first and last sides. - private final static int STARTING_WIDTH=25; - - public ARotatedRectangleSelection() { - super(6); - } - - // Initialize the control points given the starting point (x,y). - public int init(Point2D.Double p, int key) { - isValid=false; - - setCenter(hr[0], p.x-STARTING_WIDTH, p.y); - setCenter(hr[1], p.x-STARTING_WIDTH, p.y); - setCenter(hr[2], p.x+STARTING_WIDTH, p.y); - setCenter(hr[3], p.x+STARTING_WIDTH, p.y); - setCenter(hr[4], p.x, p.y); - setCenter(hr[5], p.x, p.y); - - region=5; - return region; - } - - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - double dx, dy, deltax, deltay, angle, radius; - - switch(region) { - case 0: - radius=getRadius(p.x, p.y, 4); - angle=getAngle(); - - deltax=p.x-hr[4].getCenterX(); - deltay=p.y-hr[4].getCenterY(); - - dx=-Math.round(radius*Math.sin(angle)); - dy=Math.round(radius*Math.cos(angle)); - - if(deltax*dx+deltay*dy<0) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[0], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[3], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - setCenter(hr[1], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - setCenter(hr[2], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - break; - - case 1: - radius=getRadius(p.x, p.y, 5); - angle=getAngle(); - - deltax=p.x-hr[5].getCenterX(); - deltay=p.y-hr[5].getCenterY(); - - dx=-Math.round(radius*Math.sin(angle)); - dy=Math.round(radius*Math.cos(angle)); - - if(deltax*dx+deltay*dy<0) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[0], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[3], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - setCenter(hr[1], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - setCenter(hr[2], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - break; - - case 2: - radius=getRadius(p.x, p.y, 5); - angle=getAngle(); - - deltax=p.x-hr[5].getCenterX(); - deltay=p.y-hr[5].getCenterX(); - - dx=-Math.round(radius*Math.sin(angle)); - dy=Math.round(radius*Math.cos(angle)); - - if(deltax*dx+deltay*dy<0) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[0], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - setCenter(hr[3], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[1], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - setCenter(hr[2], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - break; - - case 3: - radius=getRadius(p.x, p.y, 4); - angle=getAngle(); - - deltax=p.x-hr[4].getCenterX(); - deltay=p.y-hr[4].getCenterY(); - - dx=-Math.round(radius*Math.sin(angle)); - dy=Math.round(radius*Math.cos(angle)); - - if(deltax*dx+deltay*dy<0) { - dx=-dx; - dy=-dy; - } - - setCenter(hr[0], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - setCenter(hr[3], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[1], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - setCenter(hr[2], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - break; - - case 4: - case 5: - radius=getRadius(hr[0].getCenterX(), hr[0].getCenterY(), 4); - - // Update the active control point. - setCenter(hr[region], p.x, p.y); - angle=getAngle(); - - dx=-Math.round(radius*Math.sin(angle)); - dy=Math.round(radius*Math.cos(angle)); - - setCenter(hr[0], hr[4].getCenterX()+dx, hr[4].getCenterY()+dy); - setCenter(hr[3], hr[4].getCenterX()-dx, hr[4].getCenterY()-dy); - setCenter(hr[1], hr[5].getCenterX()+dx, hr[5].getCenterY()+dy); - setCenter(hr[2], hr[5].getCenterX()-dx, hr[5].getCenterY()-dy); - break; - } - } - - private double getAngle() { - double deltax=hr[5].getCenterX()-hr[4].getCenterX(); - double deltay=hr[5].getCenterY()-hr[4].getCenterY(); - - if(deltax!=0||deltay!=0) - return Math.atan2(deltay, deltax); - else - return 0.; - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - /** - * Make the affine transform which corresponds to this rectangular selection. - */ - public Point2D.Double[] getCorners() { - int first=getUpperLeftRegion(); - - // Calculate the index of the opposite corner. - int third=(first+2)%4; - - // Now use the cross-product to determine which of the - // remaining points is the one which keep the path going - // clockwise. - int second=(first+1)%4; - double dx0=hr[third].getCenterX()-hr[first].getCenterX(); - double dy0=hr[third].getCenterY()-hr[first].getCenterY(); - double dx1=hr[second].getCenterX()-hr[first].getCenterX(); - double dy1=hr[second].getCenterY()-hr[first].getCenterY(); - - if(dx0*dy1-dy0*dx1>0) - second=(first+3)%4; - // Get the appropriate radius. - int centerIndex=(first==0||first==3)?4:5; - double radius=getRadius(hr[first].getCenterX(), hr[first].getCenterY(), centerIndex); - double angle=getAngle(); - // Calculate the delta-x and delta-y for the points. - double dx=Math.abs(radius*Math.sin(angle)); - double dy=Math.abs(radius*Math.cos(angle)); - // Get the sign of the offsets from the control points. - double sdx; - double sdy; - - // The point closest to the origin. - centerIndex=(first==0||first==3)?4:5; - sdx=((hr[first].getCenterX()-hr[centerIndex].getCenterX())>0)?1.:-1.; - sdy=((hr[first].getCenterY()-hr[centerIndex].getCenterY())>0)?1.:-1.; - double x0=hr[centerIndex].getCenterX()+sdx*dx; - double y0=hr[centerIndex].getCenterY()+sdy*dy; - - // The next point clockwise. - centerIndex=(second==0||second==3)?4:5; - sdx=((hr[second].getCenterX()-hr[centerIndex].getCenterX())>0)?1.:-1.; - sdy=((hr[second].getCenterY()-hr[centerIndex].getCenterY())>0)?1.:-1.; - double x1=hr[centerIndex].getCenterX()+sdx*dx; - double y1=hr[centerIndex].getCenterY()+sdy*dy; - - // The next point clockwise. - centerIndex=(third==0||third==3)?4:5; - sdx=((hr[third].getCenterX()-hr[centerIndex].getCenterX())>0)?1.:-1.; - sdy=((hr[third].getCenterY()-hr[centerIndex].getCenterY())>0)?1.:-1.; - double x2=hr[centerIndex].getCenterX()+sdx*dx; - double y2=hr[centerIndex].getCenterY()+sdy*dy; - - // The control points are in the correct order, so we can just - // call the utility function of the parent. - return convert(x0, y0, x1, y1, x2, y2); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandGroup.java deleted file mode 100755 index fe8e54b62bde..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandGroup.java +++ /dev/null @@ -1,109 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.ACanvas; -import atlantis.output.AExceptionHandler; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JMenuItem; -import javax.swing.JMenu; -import javax.swing.JComboBox; -import javax.swing.JPanel; - -import java.lang.reflect.Constructor; -import java.util.HashMap; - -public class ARubberbandGroup extends AInteractionGroup { - - private final static String[] RUBBERBAND_NAMES= {"Rectangle", "RotatedRectangle", "Parallelogram", - "Square", "XSkew", "YSkew", "XSlice", "YSlice"}; - - private HashMap rubberbands; - private JComboBox rbComboBox; - // the panel that will contain the additional controls for the interactions - private JPanel additionalControls; - - public ARubberbandGroup(AInteractionsManager manager) { - super(AInteractionGroup.WINDOW_GROUP, manager); - - // create the additional controls panel - additionalControls = new JPanel(); - - rubberbands=new HashMap(); - rbComboBox=new JComboBox(); - - for(int i=0; i<RUBBERBAND_NAMES.length; i++) { - rbComboBox.addItem(RUBBERBAND_NAMES[i]); - try { - Constructor[] c=Class.forName("atlantis.interactions.A"+RUBBERBAND_NAMES[i]+"Selection").getDeclaredConstructors(); - - rubberbands.put(RUBBERBAND_NAMES[i], c[0].newInstance(new Object[] {})); - } catch(Exception e) { - AExceptionHandler.processException("Cannot make selection "+"A"+RUBBERBAND_NAMES[i] - +"Selection", - e); - } - } - - rbComboBox.addActionListener(new RuberbandListener()); - additionalControls.add(rbComboBox); - - changeRubberband(); - } - - /** - * rubberband has additional controls, so return true - */ - public boolean hasAdditionalControls() { - return true; - } - - /** - * returns the additional controls - */ - public JPanel getAdditionalControls() { - return additionalControls; - } - - private void changeRubberband() { - String item=(String)rbComboBox.getSelectedItem(); - - removeAllInteractions(); - addInteraction((AInteraction)rubberbands.get(item)); - iManager.setContext(this); - } - - // generating the menu - public JMenuItem getPopupItem() { - JMenu menu=new JMenu(name); - ActionListener l=new PopupListener(); - - for(int i=0; i<RUBBERBAND_NAMES.length; i++) - menu.add(RUBBERBAND_NAMES[i]).addActionListener(l); - - return menu; - } - - public void setGroupState(AInteractionGroup givenGroup) { - if(givenGroup instanceof ARubberbandGroup) { - ARubberbandGroup panel=(ARubberbandGroup)givenGroup; - - this.rbComboBox.setSelectedIndex(panel.rbComboBox.getSelectedIndex()); - } - } - - class RuberbandListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - changeRubberband(); - } - } - - - class PopupListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - ACanvas.getCanvas().getCurrentWindow().getInteractionToolBar().setSelectedGroup(name); - rbComboBox.setSelectedItem(e.getActionCommand()); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandYXGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandYXGroup.java deleted file mode 100755 index 705da5e8e137..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ARubberbandYXGroup.java +++ /dev/null @@ -1,109 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.ACanvas; -import atlantis.output.AExceptionHandler; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JMenuItem; -import javax.swing.JMenu; -import javax.swing.JComboBox; -import javax.swing.JPanel; - -import java.lang.reflect.Constructor; -import java.util.HashMap; - -public class ARubberbandYXGroup extends AInteractionGroup { - - private final static String[] RUBBERBAND_NAMES= {"RectangleYX", "RotatedRectangle", "Parallelogram", - "Square", "XSkew", "YSkew", "XSlice", "YSlice"}; - - private HashMap rubberbands; - private JComboBox rbComboBox; - // the panel that will contain the additional controls for the interactions - private JPanel additionalControls; - - public ARubberbandYXGroup(AInteractionsManager manager) { - super(AInteractionGroup.WINDOW_GROUP, manager); - - // create the additional controls panel - additionalControls = new JPanel(); - - rubberbands=new HashMap(); - rbComboBox=new JComboBox(); - - for(int i=0; i<RUBBERBAND_NAMES.length; i++) { - rbComboBox.addItem(RUBBERBAND_NAMES[i]); - try { - Constructor[] c=Class.forName("atlantis.interactions.A"+RUBBERBAND_NAMES[i]+"Selection").getDeclaredConstructors(); - - rubberbands.put(RUBBERBAND_NAMES[i], c[0].newInstance(new Object[] {})); - } catch(Exception e) { - AExceptionHandler.processException("Cannot make selection "+"A"+RUBBERBAND_NAMES[i] - +"Selection", - e); - } - } - - rbComboBox.addActionListener(new RuberbandListener()); - additionalControls.add(rbComboBox); - - changeRubberband(); - } - - /** - * rubberband has additional controls, so return true - */ - public boolean hasAdditionalControls() { - return true; - } - - /** - * returns the additional controls - */ - public JPanel getAdditionalControls() { - return additionalControls; - } - - private void changeRubberband() { - String item=(String)rbComboBox.getSelectedItem(); - - removeAllInteractions(); - addInteraction((AInteraction)rubberbands.get(item)); - iManager.setContext(this); - } - - // generating the menu - public JMenuItem getPopupItem() { - JMenu menu=new JMenu(name); - ActionListener l=new PopupListener(); - - for(int i=0; i<RUBBERBAND_NAMES.length; i++) - menu.add(RUBBERBAND_NAMES[i]).addActionListener(l); - - return menu; - } - - public void setGroupState(AInteractionGroup givenGroup) { - if(givenGroup instanceof ARubberbandYXGroup) { - ARubberbandYXGroup panel=(ARubberbandYXGroup)givenGroup; - - this.rbComboBox.setSelectedIndex(panel.rbComboBox.getSelectedIndex()); - } - } - - class RuberbandListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - changeRubberband(); - } - } - - - class PopupListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - ACanvas.getCanvas().getCurrentWindow().getInteractionToolBar().setSelectedGroup(name); - rbComboBox.setSelectedItem(e.getActionCommand()); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyGroup.java deleted file mode 100755 index 05a6d681437c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyGroup.java +++ /dev/null @@ -1,14 +0,0 @@ -package atlantis.interactions; - - -public class AScaleCopyGroup extends AInteractionGroup { - - AScaleCopyInteraction scaleCopyInteraction; - - public AScaleCopyGroup(AInteractionsManager iManager) { - super(AInteractionGroup.CANVAS_GROUP, iManager); - scaleCopyInteraction=new AScaleCopyInteraction(); - this.addInteraction(scaleCopyInteraction); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyInteraction.java deleted file mode 100755 index 6e4492014d79..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AScaleCopyInteraction.java +++ /dev/null @@ -1,24 +0,0 @@ -package atlantis.interactions; - -import java.awt.*; -import java.awt.geom.*; - -public class AScaleCopyInteraction extends AInteraction { - - public AScaleCopyInteraction() { - super(1, AUTOMATIC_REPAINT, SCREEN_COORDINATES, false); - hr[0]=new Rectangle2D.Double(0, 0, 0, 0); - } - - public void paint(Graphics2D g) {} - - public void connect(AInteractionsManager manager) { - super.connect(manager); - window.setScaleCopyStatus(true); - } - - public void disconnect() { - window.setScaleCopyStatus(false); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ASelection.java deleted file mode 100755 index 1a7b181aea5c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASelection.java +++ /dev/null @@ -1,455 +0,0 @@ -package atlantis.interactions; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - -import java.awt.GridLayout; -import java.awt.Point; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.Dimension; -import java.awt.Polygon; -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.awt.geom.Ellipse2D; - -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JMenuItem; -import javax.swing.JButton; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.graphics.ADrawnGraphics2D; -import atlantis.graphics.AGraphics; -import atlantis.graphics.ACoord; -import atlantis.graphics.dnd.ADnDButton; -import atlantis.graphics.dnd.ADnDLabel; -import atlantis.graphics.dnd.ADragListener; -import atlantis.gui.AGUI; -import atlantis.gui.ALogPane; -import atlantis.list.AListManager; -import atlantis.list.AList; -import atlantis.output.AExceptionHandler; -import atlantis.output.AOutput; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; - - - -/** - * The superclass of all the selection (rubberband) interactions. - */ -public abstract class ASelection extends AInteraction - implements ASleepMouseDragListener, ActionListener -{ - - private static ALogger logger = ALogger.getLogger(ASelection.class); - - private JPanel actionsPanel; - private GridLayout actionsPanelLayout; - private int d = 10; - private boolean[][] map; - protected final static int radius = 10; - protected int region; - protected boolean isValid = false; - - - public final static String ZOOM = "Zoom"; - public final static String NEW_LIST = "New List"; - public final static String SUMMARIZE = "Summarize"; - - - - public ASelection(int hotRegionsCount) - { - super(hotRegionsCount, AUTOMATIC_REPAINT, SCREEN_COORDINATES, true); - - for(int i = 0; i < hr.length; i++) - { - hr[i] = new Ellipse2D.Double(0, 0, radius, radius); - } - - actionsPanelLayout = new GridLayout(0, 1); - actionsPanel = new JPanel(actionsPanelLayout); - - - addActionButton(ZOOM, new ADragListener() - { - public void dragPerformed(Object from, Object to, int action) - { - if(to instanceof ADnDLabel) - { - zoomIn(((ADnDLabel) to).getText()); - } - else if(to instanceof AWindow) - { - zoomIn(((AWindow) to).getName()); - } - invalidate(); - } - }, - new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.saveCorners(); - window.setUserCorners(getCorners()); - invalidate(); - } - }); - - - addActionButton(NEW_LIST, new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if(e.getActionCommand().equals(NEW_LIST)) - { - Point2D.Double[] zoomedCorners = getCorners(); - Point2D.Double[] userCorners = window.getUserCorners(); - window.setUserCornersNoRepaint(zoomedCorners); - Rectangle bounds = window.getBounds(); - bounds.setLocation(0, 0); - window.paintWindowFromScratch(new ADrawnGraphics2D(bounds)); - ADrawnGraphics2D.updateLastDrawn(); - AListManager.getInstance().copyLastDrawn(); - AListManager.getInstance().showLists(); - window.setUserCornersNoRepaint(userCorners); - } - } - }); - - - addActionButton(SUMMARIZE, new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - if(e.getActionCommand().equals(SUMMARIZE)) - { - Point2D.Double[] zoomedCorners = getCorners(); - Point2D.Double[] userCorners = window.getUserCorners(); - window.setUserCornersNoRepaint(zoomedCorners); - Rectangle bounds = window.getBounds(); - bounds.setLocation(0, 0); - window.paintWindowFromScratch(new ADrawnGraphics2D(bounds)); - ADrawnGraphics2D.updateLastDrawn(); - AListManager.getInstance().summarize(); - window.setUserCornersNoRepaint(userCorners); - } - } - }); - - } // ASelection() --------------------------------------------------------- - - - - - public void invalidate() - { - isValid = false; - actionsPanel.setVisible(false); - } - - - public void addActionButton(String buttonName, ADragListener dragList, - ActionListener clickList) - { - ADnDButton b = new ADnDButton(buttonName); - b.setFocusPainted(false); - b.addActionListener(clickList); - b.addDragListener(dragList); - actionsPanelLayout.setRows(actionsPanelLayout.getRows() + 1); - actionsPanel.add(b); - actionsPanel.setSize(actionsPanel.getPreferredSize()); - } - - - public void addActionButton(String buttonName, ActionListener clickListener) - { - JButton b = new JButton(buttonName); - b.setFocusPainted(false); - b.addActionListener(clickListener); - actionsPanelLayout.setRows(actionsPanelLayout.getRows() + 1); - actionsPanel.add(b); - actionsPanel.setSize(actionsPanel.getPreferredSize()); - } - - - public JMenuItem[] getPopupItems() - { - ArrayList<JMenuItem> al = new ArrayList<JMenuItem>(); - if(window.getUnzoomPossible()) - { - JMenuItem it = new JMenuItem("Unzoom"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoom(); - } - }); - al.add(it); - } - if(window.getUnzoomFullPossible()) - { - JMenuItem it = new JMenuItem("Unzoom Full"); - it.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - window.unzoomFull(); - } - }); - al.add(it); - } - // Can't cast arrays very easily... - JMenuItem[] ret = new JMenuItem[al.size()]; - for(int i = 0; i < al.size(); i++) - { - ret[i] = al.get(i); - } - return ret; - - } - - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - if(action.equals("Unzoom")) - { - window.unzoom(); - } - } - - - public int getPopupType() - { - return APopupListener.WINDOW_POPUP; - } - - - public void connect(AInteractionsManager manager) - { - super.connect(manager); - window.getView().add(actionsPanel); - if(isValid) - { - actionsPanel.setVisible(true); - } - else - { - actionsPanel.setVisible(false); - } - window.validate(); - } - - - public void disconnect() - { - window.getView().remove(actionsPanel); - } - - - public int getButton() - { - return AInteractionsManager.LEFT; - } - - - public void start(Point2D.Double p, int region, int key) - { - this.region = region; - actionsPanel.setVisible(false); - } - - - public void cancel() {} - - - private boolean canLayout(int i0, int j0) - { - Dimension panelSize = actionsPanel.getSize(); - panelSize.width = (int) Math.ceil((panelSize.width + d) / (double) d); - panelSize.height = (int) Math.ceil((panelSize.height + d) / (double) d); - for(int j = 0; j < panelSize.height; j++) - { - for(int i = 0; i < panelSize.width; i++) - { - if(i0 + i > map[0].length - 1)return false; - if(j0 + j > map.length - 1)return false; - if(map[j0 + j][i0 + i] == false)return false; - } - } - return true; - - } - - - private Point calculateBestPosition() - { - AWindow w = window; - Dimension size = w.getView().getSize(); - int ny = (int) Math.ceil(size.height / (double) d); - int nx = (int) Math.ceil(size.width / (double) d); - map = new boolean[ny][nx]; - Polygon p = new Polygon(); - for(int i = 0; i < 4; i++) - { - p.addPoint((int) hr[i].getCenterX(), (int) hr[i].getCenterY()); - } - - for(int j = 0; j < map.length; j++) - { - for(int i = 0; i < map[0].length; i++) - { - if(p.intersects(i * d, j * d, d, d) || p.contains(i * d, j * d, d, d)) - { - map[j][i] = false; - } - else - { - map[j][i] = true; - } - } - } - - for(int j = 0; j < map.length; j++) - { - for(int i = 0; i < map[0].length; i++) - { - if(canLayout(i, j)) - { - map[j][i] = true; - } - else - { - map[j][i] = false; - } - } - } - - int x0 = (int) hr[region].getMaxX(); - int y0 = (int) hr[region].getMaxY(); - int i_min = 0, j_min = 0; - double dist, dist_min = 1e10; - for(int j = 0; j < map.length; j++) - { - for(int i = 0; i < map[0].length; i++) - { - if(map[j][i] == true) - { - dist = Math.hypot(x0 - i*d, y0 - j*d); - if(dist < dist_min) - { - i_min = i; - j_min = j; - dist_min = dist; - } - } - } - } - - return new Point(i_min * d + d / 2, j_min * d + d / 2); - } - - - public void stop() - { - if(isValid) - { - Point p = calculateBestPosition(); - actionsPanel.setLocation(p.x, p.y); - actionsPanel.setVisible(true); - window.revalidate(); - } - } - - - protected int getUpperLeftRegion() - { - int point = 0; - double savedValue = getRadius(hr[0]); - for(int i = 1; i < 4; i++) - { - double value = getRadius(hr[i]); - if(value < savedValue) - { - savedValue = value; - point = i; - } - } - return point; - } - - - protected Point2D.Double[] convert( - double x0, double y0, double x1, double y1, double x2, double y2) - { - if(!isValid) - { - return window.getUserCorners(); - } - if(Math.abs(getAPolygon().getArea()) == 0) - { - return window.getUserCorners(); - } - - double[][][] hv = new double[2][1][3]; - hv[0][0][0] = x0; - hv[1][0][0] = y0; - hv[0][0][1] = x1; - hv[1][0][1] = y1; - hv[0][0][2] = x2; - hv[1][0][2] = y2; - ACoord d = window.calculateUser(new ACoord(hv)); - Point2D.Double[] corners = new Point2D.Double[3]; - for(int i = 0; i < 3; i++) - { - corners[i] = new Point2D.Double(d.hv[0][0][i], d.hv[1][0][i]); - } - - return corners; - } - - - protected Point2D.Double[] convert(int region1, int region2, int region3) - { - return convert(hr[region1].getCenterX(), hr[region1].getCenterY(), - hr[region2].getCenterX(), - hr[region2].getCenterY(), hr[region3].getCenterX(), - hr[region3].getCenterY()); - } - - - public abstract Point2D.Double[] getCorners(); - - - protected void paintStandard(Graphics2D g) - { - if(isValid) - { - AGraphics ag = AGraphics.makeAGraphics(g); - ag.updateDrawParameters(frameDrawParameters); - ag.drawPolygon(getAPolygon()); - drawLine(4, 5, ag); - ag.updateDrawParameters(drawParameters); - ag.drawPolygon(getAPolygon()); - drawLine(4, 5, ag); - drawActivePoint(region, ag); - } - } - - - public void zoomIn(String zoomWindow) - { - String currentWindow = window.getName(); - ACanvas.getCanvas().copyWindowSettings(currentWindow, zoomWindow); - ACanvas.getCanvas().getWindow(zoomWindow).setUserCorners(getCorners()); - } - -} // class ASelection ======================================================= diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASkewGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/ASkewGroup.java deleted file mode 100755 index 70057212cca9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASkewGroup.java +++ /dev/null @@ -1,14 +0,0 @@ -package atlantis.interactions; - - -public class ASkewGroup extends AInteractionGroup { - - ASkewInteraction skewInteraction; - - public ASkewGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - skewInteraction=new ASkewInteraction(); - this.addInteraction(skewInteraction); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASkewInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/ASkewInteraction.java deleted file mode 100755 index a338f168638e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASkewInteraction.java +++ /dev/null @@ -1,123 +0,0 @@ -package atlantis.interactions; - -import atlantis.canvas.AWindow; -import atlantis.parameters.APar; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjection; -import atlantis.projection.AProjectionRZ; -import java.awt.*; -import java.awt.geom.*; -import java.awt.event.*; -import javax.swing.*; - -/** - * The interaction that performs a skew on the picture. - */ -public class ASkewInteraction extends AInteraction - implements ASleepMouseDragListener, ActionListener { - - private int d=20; - private Point2D.Double p0; - private JMenuItem[] popupItems; - private final static String NO_SKEW="Set No Skew"; - - public ASkewInteraction() { - super(1, WINDOW_TOTAL_REPAINT, WORLD_COORDINATES, false); - - popupItems = new JMenuItem[] { - new JMenuItem(NO_SKEW) - }; - - popupItems[0].addActionListener(this); - - // The center of the ellipse is in (0, 0) in User Space - hr[0]=new Ellipse2D.Double(-d/2, -d/2, d, d); - } - - public int init(Point2D.Double p, int key) { - p0=p; - return 0; - } - - public int getButton() { - return AInteractionsManager.LEFT; - } - - public void start(Point2D.Double p, int region, int key) {} - - public void drag(Point2D.Double p, int region, int key) { - AProjection proj=window.getProjection(); - - if(proj instanceof AProjectionFR) { - performFRSkew(-(p.y-p0.y)/p0.x, window); - } else if(proj instanceof AProjectionFZ) { - performFZSkew(-(p.y-p0.y)/p0.x, window); - } else if(proj instanceof AProjectionRZ) { - if(key==KeyEvent.VK_V) - performFZSkew(-(p.y-p0.y)/p0.x, window); - else - performRZSkew(-(p.x-p0.x)/p0.y, window); - } - } - - public static void performFRSkew(double f, AWindow window) { - Point2D.Double[] corners=window.getUserCorners(); - - for(int i=0; i<corners.length; i++) - corners[i].y+=f*corners[i].x; - - window.setUserCorners(corners); - } - - public static void performFZSkew(double f, AWindow window) { - Point2D.Double[] corners=window.getUserCorners(); - - double zVtx=parameterStore.get("Event", "ZVtx").getD(); - - for(int i=0; i<corners.length; i++) - corners[i].y+=f*(corners[i].x-zVtx); - - window.setUserCorners(corners); - } - - public static void performRZSkew(double f, AWindow window) { - Point2D.Double[] corners=window.getUserCorners(); - - for(int i=0; i<corners.length; i++) - corners[i].x+=f*corners[i].y; - - window.setUserCorners(corners); - } - - public void stop() {} - - public void cancel() {} - - public void paint(Graphics2D g) {} - - public int getPopupType() { - return APopupListener.WINDOW_POPUP; - } - - public JMenuItem[] getPopupItems() { - return popupItems; - } - - public void actionPerformed(ActionEvent e) { - - } - public AModifier[] getModifiers(){ - if(window.getProjection() instanceof AProjectionRZ) { - return new AModifier[] { - new AModifier(KeyEvent.VK_V, false, "Y Skew"), - new AModifier(KeyEvent.VK_H, false, "X Skew"), - new AModifier(KeyEvent.VK_UNDEFINED, false, "X Skew") - }; - } else { - return new AModifier[0]; - } - } - - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASleepMouseDragListener.java b/graphics/AtlantisJava/src/atlantis/interactions/ASleepMouseDragListener.java deleted file mode 100755 index 60b145d8b132..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASleepMouseDragListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package atlantis.interactions; - - -import java.awt.geom.*; - - -/** - * This listener extends AMouseDragListener in order to make it possible to - * get drag events even without any hot region. - */ -public interface ASleepMouseDragListener extends AMouseDragListener { - int init(Point2D.Double p, int key); -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASquareSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/ASquareSelection.java deleted file mode 100755 index 0f12dae04d57..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASquareSelection.java +++ /dev/null @@ -1,87 +0,0 @@ -package atlantis.interactions; - -import java.awt.Graphics2D; -import java.awt.geom.Point2D; - -import atlantis.graphics.AGraphics; -import atlantis.utils.AMath; - -public class ASquareSelection extends ASelection -{ - public ASquareSelection() - { - super(5); - } - - public int init(Point2D.Double p, int key) - { - isValid = false; - - for (int i = 0; i < 5; i++) - setCenter(hr[i], p.x, p.y); - - this.region = 2; - return region; - } - - public void drag(Point2D.Double p, int region, int key) - { - isValid = true; - - if (region == 4) - { - double dx = p.x - hr[4].getCenterX(); - double dy = p.y - hr[4].getCenterY(); - - for (int i = 0; i < 5; i++) - setCenter(hr[i], hr[i].getCenterX() + dx, hr[i].getCenterY() + dy); - } - else - { - double ratio = ((double) window.getSize().width) / ((double) window.getSize().height); - - double sx1 = AMath.getSign(p.x - hr[4].getCenterX()); - double sy1 = AMath.getSign(p.y - hr[4].getCenterY()); - double sx2 = sy1; - double sy2 = sx1; - double dy = getRadius(p.x, p.y, 4) / Math.sqrt(1 + ratio * ratio); - double dx = dy * ratio; - - setCenter(hr[region], hr[4].getCenterX() + dx * sx1, hr[4].getCenterY() + dy * sy1); - setCenter(hr[(region + 2) % 4], hr[4].getCenterX() - dx * sx1, hr[4].getCenterY() - dy * sy1); - - setCenter(hr[(region + 1) % 4], hr[4].getCenterX() - dx * sx2, hr[4].getCenterY() + dy * sy2); - setCenter(hr[(region + 3) % 4], hr[4].getCenterX() + dx * sx2, hr[4].getCenterY() - dy * sy2); - } - } - - public void paint(Graphics2D g) - { - if (isValid) - { - AGraphics ag = AGraphics.makeAGraphics(g); - - ag.updateDrawParameters(frameDrawParameters); - ag.drawPolygon(getAPolygon()); - drawLine(0, 2, ag); - drawLine(1, 3, ag); - ag.updateDrawParameters(drawParameters); - ag.drawPolygon(getAPolygon()); - drawLine(0, 2, ag); - drawLine(1, 3, ag); - drawActivePoint(region, ag); - } - } - - public Point2D.Double[] getCorners() - { - int first = getUpperLeftRegion(); - - // Calculate the adjacent partner and the opposite corner. - int second = (first + 1) % 4; - int third = (first + 2) % 4; - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsGroup.java deleted file mode 100755 index 4a74be687a74..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsGroup.java +++ /dev/null @@ -1,15 +0,0 @@ -package atlantis.interactions; - - -public class ASynchroCursorsGroup extends AInteractionGroup { - - private ASynchroCursorsInteraction mmSelection; - - public ASynchroCursorsGroup(AInteractionsManager iManager) { - super(AInteractionGroup.CANVAS_GROUP, iManager); - - mmSelection=new ASynchroCursorsInteraction(); - addInteraction(mmSelection); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsInteraction.java deleted file mode 100755 index 9f7915a17dc9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/ASynchroCursorsInteraction.java +++ /dev/null @@ -1,483 +0,0 @@ -package atlantis.interactions; - -import java.awt.Graphics2D; -import java.awt.event.KeyEvent; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Point2D; - -import atlantis.canvas.ACanvas; -import atlantis.graphics.ACoord; -import atlantis.graphics.ACursorFactory; -import atlantis.graphics.AGraphics; -import atlantis.parameters.APar; -import atlantis.parameters.AParameterUtilities; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.utils.AMath; - -public class ASynchroCursorsInteraction extends AInteraction - implements ASleepMouseDragListener, AEnterExitListener -{ - /** - * The position of the moving marker in 3D. Phi is in degrees. - * (Must be static) - */ - private static double rho, phi, z, sign_rho; - - private static final double NOT_DEFINED = 9999.0; - private static final double RHO_MAX = 3000.0; - private static final double PHI_MAX = 400.0; - private static final double Z_MAX = 3000.0; - private static final double ETA_MAX = 10.0; - - private static int key = 0; - protected int radius = 10; - - public ASynchroCursorsInteraction() - { - super(1, ALL_WINDOWS_REPAINT, WORLD_COORDINATES, true); - hr[0] = new Ellipse2D.Double(0, 0, radius, radius); - } - - public int getButton() - { - return AInteractionsManager.LEFT; - } - - /** - * Initialize the control points based on the starting point - */ - public int init(Point2D.Double p, int key) - { - this.key = key; - setCenter(hr[0], p.x, p.y); - // ACanvas.getCanvas().repaintOthers(window); - return 0; - } - - public void start(Point2D.Double p, int region, int key) - { - //call drag to update the cursor even if only a button is pressed - drag(p,region,key); - } - - /** - * Move the active control point to the point (x, y). - * - * @param pInput the input point - * @param region the region - * @param key the current key being pressed - */ - public void drag(Point2D.Double pInput, int region, int key) - { - this.key = key; - AProjection2D projection = (AProjection2D) window.getProjection(); - - Point2D.Double p = projection.inverseNonLinearTransform(pInput); - - setCenter(hr[0], p.x, p.y); - - rho = NOT_DEFINED; - z = NOT_DEFINED; - phi = NOT_DEFINED; - sign_rho = 1.; - - if (projection instanceof AProjectionYX) - { - phi = Math.toDegrees(Math.atan2(p.y, p.x)); - if (phi < 0.) - phi += 360.; - rho = AParameterUtilities.getRhoSign(p.x, p.y) * Math.sqrt(p.x * p.x + p.y * p.y); - } - else if (projection instanceof AProjectionFR) - { - phi = p.y; - rho = p.x; - } - else if (projection instanceof AProjectionFZ) - { - phi = p.y; - z = p.x; - } - else if (projection instanceof AProjectionRZ) - { - rho = Math.abs(p.y); - if (p.y < 0.) - sign_rho = -1.; - z = p.x; - } - else if (projection instanceof AProjectionYZ) - { - z = p.x; - } - else if (projection instanceof AProjectionXZ) - { - z = p.x; - } - else if (projection instanceof AProjectionVP) - { - phi = p.y; - rho = parameterStore.get("VP", "RMax").getD(); - double eta = p.x; - - z = parameterStore.get("Event", "ZVtx").getD() + 0.5 * rho * (Math.exp(eta) - 1. / Math.exp(eta)); - } - else if (projection instanceof AProjectionLegoPlot) - { - // added by Mark Stockton - // update parameters - AProjectionLegoPlot.update(); - //reverse the adjustPhi function - p.x=-(AProjectionLegoPlot.adjustPhi(window,-p.x,p.y)); - if(p.x>-1.0 && p.x<361.0 && p.y>-5.01 && p.y<5.01) - { - phi=p.x; - rho = parameterStore.get("VP", "RMax").getD(); - double eta=p.y; - if (AProjectionLegoPlot.reverse) - eta = -eta; - z = parameterStore.get("Event", "ZVtx").getD() + 0.5 * rho * (Math.exp(eta) - 1. / Math.exp(eta)); - } - } - if (key == KeyEvent.VK_P && phi != NOT_DEFINED) - { - double phiRZ = phi + 90.; - - if (phiRZ < 0.) - phiRZ += 360; - if (phiRZ > 360.) - phiRZ -= 360; - parameterStore.get("RZ", "Phi").setD(phiRZ); - parameterStore.get("RZ", "Phi").globalize(ACanvas.getCanvas().getCurrentWindow().getIndex()); - ACanvas.getCanvas().repaintAllFromScratch(); - } - else - ACanvas.getCanvas().repaintOthers(window); - } - - public void cancel() - {} - - public void stop() - {} - - public void paint(Graphics2D g) - { - // must use the window version of the parameters - parameterStore.selectWindowParameters(window.getName()); - AProjection2D projection = (AProjection2D) window.getProjection(); - AGraphics ag = AGraphics.makeAGraphics(g); - - for (int i = 0; i < 2; i++) - { - if (i == 0) - ag.updateDrawParameters(frameDrawParameters); - else - ag.updateDrawParameters(drawParameters); - - if (projection instanceof AProjectionYX) - { - if (phi != NOT_DEFINED) - { - double r = (rho == NOT_DEFINED) ? RHO_MAX : Math.abs(rho); - double cosPhi = Math.cos(Math.toRadians(phi)); - double sinPhi = Math.sin(Math.toRadians(phi)); - - Point2D.Double p = window.calculateDisplay(projection.nonLinearTransform(0, 0)); - Point2D.Double p1 = window.calculateDisplay(projection.nonLinearTransform(r * cosPhi, r * sinPhi)); - Point2D.Double p2 = window.calculateDisplay(projection.nonLinearTransform(RHO_MAX * cosPhi, RHO_MAX * sinPhi)); - Point2D.Double p3 = window.calculateDisplay(projection.nonLinearTransform(-RHO_MAX * cosPhi, -RHO_MAX * sinPhi)); - - if (key == KeyEvent.VK_P) - { - ag.drawLine(p2.x, p2.y, p3.x, p3.y); - } - else - { - ag.drawLine(p.x, p.y, p2.x, p2.y); - if (rho != NOT_DEFINED) - ag.drawSymbol(p1.x, p1.y); - } - - } - else if (rho != NOT_DEFINED) - { - int numPoints = 48; - double[][][] hv = new double[2][1][numPoints]; - - for (int j = 0; j < numPoints; j++) - { - hv[0][0][j] = rho * Math.cos(Math.PI * 2 * j / 48); - hv[1][0][j] = rho * Math.sin(Math.PI * 2 * j / 48); - } - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawPolygon(d.hv[0][0], d.hv[1][0], numPoints); - } - } - else if (projection instanceof AProjectionFR) - { - int numPoints = 5; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = Math.abs(rho); - hv[1][0][0] = phi; - hv[0][0][1] = Math.abs(rho); - hv[1][0][1] = 0.; - hv[0][0][2] = Math.abs(rho); - hv[1][0][2] = RHO_MAX; - hv[0][0][3] = 0.; - hv[1][0][3] = phi; - hv[0][0][4] = RHO_MAX; - hv[1][0][4] = phi; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - if (rho != NOT_DEFINED) - ag.drawLine(d.hv[0][0][1], d.hv[1][0][1], d.hv[0][0][2], d.hv[1][0][2]); - if (phi != NOT_DEFINED) - ag.drawLine(d.hv[0][0][3], d.hv[1][0][3], d.hv[0][0][4], d.hv[1][0][4]); - if (rho != NOT_DEFINED && phi != NOT_DEFINED) - ag.drawSymbol(d.hv[0][0][0], d.hv[1][0][0]); - } - else if (projection instanceof AProjectionFZ) - { - int numPoints = 5; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = z; - hv[1][0][0] = phi; - hv[0][0][1] = z; - hv[1][0][1] = 0.; - hv[0][0][2] = z; - hv[1][0][2] = PHI_MAX; - hv[0][0][3] = -Z_MAX; - hv[1][0][3] = phi; - hv[0][0][4] = Z_MAX; - hv[1][0][4] = phi; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - if (z != NOT_DEFINED) - ag.drawLine(d.hv[0][0][1], d.hv[1][0][1], d.hv[0][0][2], d.hv[1][0][2]); - if (phi != NOT_DEFINED) - ag.drawLine(d.hv[0][0][3], d.hv[1][0][3], d.hv[0][0][4], d.hv[1][0][4]); - if (z != NOT_DEFINED && phi != NOT_DEFINED) - ag.drawSymbol(d.hv[0][0][0], d.hv[1][0][0]); - } - else if (projection instanceof AProjectionRZ) - { - if (rho != NOT_DEFINED && phi != NOT_DEFINED && z != NOT_DEFINED && (rho != 0. || z != 0.)) - { - int numPoints = 15; - double[][][] hv = new double[2][1][numPoints]; - - double dr, dz; - if (Math.abs(rho/RHO_MAX) > Math.abs(z/Z_MAX)) { - dr = RHO_MAX / (numPoints-1); - dz = z * (RHO_MAX / ((numPoints-1)*rho)); - } else { - dz = AMath.getSign(z) * Z_MAX / (numPoints-1); - dr = rho * Math.abs(Z_MAX / ((numPoints-1)*z)); - } - - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - - if (phiMid > AMath.TWO_PI) - phiMid -= AMath.TWO_PI; - double phiDiff = Math.abs(Math.toRadians(phi) - phiMid); - - if (phiDiff > Math.PI / 2. && phiDiff < 3 * Math.PI / 2.) - dr *= -1; - - for (int j=0; j<numPoints; j++) { - hv[0][0][j] = j*dz; - hv[1][0][j] = j*dr; - } - - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawSmoothPolyline(d.hv[0][0], d.hv[1][0], numPoints); - } - else - { - int numPoints = 5; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = z; - hv[1][0][0] = rho * sign_rho; - hv[0][0][1] = z; - hv[1][0][1] = -RHO_MAX; - hv[0][0][2] = z; - hv[1][0][2] = RHO_MAX; - hv[0][0][3] = -Z_MAX; - hv[1][0][3] = rho * sign_rho; - hv[0][0][4] = Z_MAX; - hv[1][0][4] = rho * sign_rho; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - if (z != NOT_DEFINED) - ag.drawLine(d.hv[0][0][1], d.hv[1][0][1], d.hv[0][0][2], d.hv[1][0][2]); - if (rho != NOT_DEFINED) - ag.drawLine(d.hv[0][0][3], d.hv[1][0][3], d.hv[0][0][4], d.hv[1][0][4]); - if (z != NOT_DEFINED && rho != NOT_DEFINED) - ag.drawSymbol(d.hv[0][0][0], d.hv[1][0][0]); - } - } - else if (projection instanceof AProjectionYZ) - { - if (rho != NOT_DEFINED && phi != NOT_DEFINED && z != NOT_DEFINED) - { - int numPoints = 2; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = 0.; - hv[1][0][0] = 0.; - double phiRot = AProjectionXZ.getPhi(); - - hv[0][0][1] = z; - hv[1][0][1] = rho * Math.sin(phiRot); - - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawLine(d.hv[0][0][0], d.hv[1][0][0], d.hv[0][0][1], d.hv[1][0][1]); - ag.drawSymbol(d.hv[0][0][1], d.hv[1][0][1]); - } - else if (z != NOT_DEFINED) - { - int numPoints = 2; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = z; - hv[1][0][0] = -RHO_MAX; - hv[0][0][1] = z; - hv[1][0][1] = RHO_MAX; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawLine(d.hv[0][0][0], d.hv[1][0][0], d.hv[0][0][1], d.hv[1][0][1]); - } - } - else if (projection instanceof AProjectionXZ) - { - if (rho != NOT_DEFINED && phi != NOT_DEFINED && z != NOT_DEFINED) - { - int numPoints = 2; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = 0.; - hv[1][0][0] = 0.; - double phiRot = AProjectionXZ.getPhi(); - - hv[0][0][1] = z; - hv[1][0][1] = rho * Math.cos(phiRot); - - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawLine(d.hv[0][0][0], d.hv[1][0][0], d.hv[0][0][1], d.hv[1][0][1]); - ag.drawSymbol(d.hv[0][0][1], d.hv[1][0][1]); - } - else if (z != NOT_DEFINED) - { - int numPoints = 2; - double[][][] hv = new double[2][1][numPoints]; - - hv[0][0][0] = z; - hv[1][0][0] = -RHO_MAX; - hv[0][0][1] = z; - hv[1][0][1] = RHO_MAX; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - ag.drawLine(d.hv[0][0][0], d.hv[1][0][0], d.hv[0][0][1], d.hv[1][0][1]); - } - } - else if (projection instanceof AProjectionVP) - { - int numPoints = 5; - double[][][] hv = new double[2][1][numPoints]; - double eta = 1.; - - if (z != NOT_DEFINED && rho != NOT_DEFINED) - eta = AParameterUtilities.eta(z, rho); - hv[0][0][0] = eta; - hv[1][0][0] = phi; - hv[0][0][1] = eta; - hv[1][0][1] = 0.; - hv[0][0][2] = eta; - hv[1][0][2] = PHI_MAX; - hv[0][0][3] = -ETA_MAX; - hv[1][0][3] = phi; - hv[0][0][4] = ETA_MAX; - hv[1][0][4] = phi; - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - - if (z != NOT_DEFINED && rho != NOT_DEFINED) - ag.drawLine(d.hv[0][0][1], d.hv[1][0][1], d.hv[0][0][2], d.hv[1][0][2]); - if (phi != NOT_DEFINED) - ag.drawLine(d.hv[0][0][3], d.hv[1][0][3], d.hv[0][0][4], d.hv[1][0][4]); - - if (z != NOT_DEFINED && phi != NOT_DEFINED && rho != NOT_DEFINED) - ag.drawSymbol(d.hv[0][0][0], d.hv[1][0][0]); - } - else if (projection instanceof AProjectionLegoPlot) - { - //added by Mark Stockton - double eta = 1.; - double[][][] hv = new double[2][1][3]; - Point2D.Double[] userCorners = window.getUserCorners(); - Point2D.Double[] displayCorners = window.getDisplayCorners(); - //update parameters - AProjectionLegoPlot.update(); - if (z != NOT_DEFINED && rho != NOT_DEFINED) - eta = AParameterUtilities.eta(z, rho); - if (AProjectionLegoPlot.reverse) - eta = -eta; - hv[0][0][0] = AProjectionLegoPlot.adjustPhi(window,phi,eta); - hv[1][0][0] = eta; - //top of plot coordinate - hv[0][0][1] = AProjectionLegoPlot.adjustPhi(window,phi,userCorners[0].y); - hv[1][0][1] = userCorners[0].y; - //bottom of plot coordinate - hv[0][0][2] = AProjectionLegoPlot.adjustPhi(window,phi,userCorners[2].y); - hv[1][0][2] = userCorners[2].y; - //convert to screen positions - ACoord d = window.calculateDisplay(projection.nonLinearTransform(new ACoord(hv))); - if (z != NOT_DEFINED && rho != NOT_DEFINED) - ag.drawLine(0, d.hv[1][0][0], displayCorners[1].x, d.hv[1][0][0]);//eta line - if (phi != NOT_DEFINED) - ag.drawLine(d.hv[0][0][1], d.hv[1][0][1],d.hv[0][0][2], d.hv[1][0][2]);//phi line - if (z != NOT_DEFINED && phi != NOT_DEFINED && rho != NOT_DEFINED) - ag.drawSymbol(d.hv[0][0][0], d.hv[1][0][0]);//square where axis cross - } - } - parameterStore.restoreWindowParameters(); - } - - /** - * Gets called each time we enter a window in which this interaction is active - */ - public void entered() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getSyncCursor()); - } - - /** - * Gets called each time we leave a window in which this interaction is active - */ - public void exited() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getSyncCursor()); - } - - public AModifier[] getModifiers() - { - return new AModifier[] { new AModifier(KeyEvent.VK_P, false, "Copy phi to RZ projection" ) }; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AVPSelectionGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AVPSelectionGroup.java deleted file mode 100755 index c439d48ee422..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AVPSelectionGroup.java +++ /dev/null @@ -1,15 +0,0 @@ -package atlantis.interactions; - - -public class AVPSelectionGroup extends AInteractionGroup { - - private ARectangleVPSelection rectangleVPSelection; - - public AVPSelectionGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - - rectangleVPSelection=new ARectangleVPSelection(); - addInteraction(rectangleVPSelection); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AWindowInfoInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AWindowInfoInteraction.java deleted file mode 100755 index 80d439b8e5fa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AWindowInfoInteraction.java +++ /dev/null @@ -1,73 +0,0 @@ -package atlantis.interactions; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.geom.Point2D; - -import atlantis.graphics.ACursorFactory; - -public class AWindowInfoInteraction extends AInteraction implements AMouseDragListener, AEnterExitListener -{ - // private int width=64; - private Point pickedPoint; - private Color c; - - public AWindowInfoInteraction() - { - super(1, AUTOMATIC_REPAINT, SCREEN_COORDINATES, true); - - this.c = Color.white; - - // hr[0] = new Rectangle2D.Double(x, y, width, width); - pickedPoint = new Point(0, 0); - } - - public int getButton() - { - return AInteractionsManager.LEFT; - } - - public void paint(Graphics2D g) - { - g.setColor(c); - g.fill(hr[0]); - - /* - * g.fillRect(hr[0].getX(), hr[0].getY(), hr[0].getWidth(), - * hr[0].getHeight()); - */ - } - - public void start(Point2D.Double p, int region, int key) - { - pickedPoint.setLocation(p.x - hr[0].getX(), p.y - hr[0].getY()); - } - - public void drag(Point2D.Double p, int region, int key) - { - hr[0].setFrame(p.x - pickedPoint.x, p.y - pickedPoint.y, hr[0].getWidth(), hr[0].getHeight()); - } - - public void stop() - {} - - public void cancel() - {} - - public void entered() - { - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public void exited() - { - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public int getPopupType() - { - return APopupListener.REGION_POPUP; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AXSkewSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/AXSkewSelection.java deleted file mode 100755 index 1aac47fd38ed..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AXSkewSelection.java +++ /dev/null @@ -1,124 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -/** - * A panel which selects a parallogram-shaped region in which two - * sides are parallel to the y-axis and the other two are skewed with - * respect to the x-axis. - * - * @author Charles Loomis - **/ -public class AXSkewSelection extends ASelection { - - final private static int STARTING_WIDTH=25; - - public AXSkewSelection() { - super(6); - } - - /** - * Initialize the control points based in the starting point - */ - public int init(Point2D.Double p, int key) { - isValid=false; - - setCenter(hr[0], p.x-STARTING_WIDTH, p.y); - setCenter(hr[1], p.x-STARTING_WIDTH, p.y); - setCenter(hr[2], p.x+STARTING_WIDTH, p.y); - setCenter(hr[3], p.x+STARTING_WIDTH, p.y); - setCenter(hr[4], p.x, p.y); - setCenter(hr[5], p.x, p.y); - - region=5; - return region; - } - - /** - * Move the active control point to the point (x,y). - */ - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - - double width; - - // Change what is done depending on which control point is active. - switch(region) { - case 0: - width=p.x-hr[4].getCenterX(); - setCenterX(hr[0], hr[4].getCenterX()+width); - setCenterX(hr[1], hr[5].getCenterX()+width); - setCenterX(hr[2], hr[5].getCenterX()-width); - setCenterX(hr[3], hr[4].getCenterX()-width); - break; - - case 1: - width=p.x-hr[5].getCenterX(); - setCenterX(hr[0], hr[4].getCenterX()+width); - setCenterX(hr[1], hr[5].getCenterX()+width); - setCenterX(hr[2], hr[5].getCenterX()-width); - setCenterX(hr[3], hr[4].getCenterX()-width); - break; - - case 2: - width=p.x-hr[5].getCenterX(); - setCenterX(hr[0], hr[4].getCenterX()-width); - setCenterX(hr[1], hr[5].getCenterX()-width); - setCenterX(hr[2], hr[5].getCenterX()+width); - setCenterX(hr[3], hr[4].getCenterX()+width); - break; - - case 3: - width=p.x-hr[4].getCenterX(); - setCenterX(hr[0], hr[4].getCenterX()-width); - setCenterX(hr[1], hr[5].getCenterX()-width); - setCenterX(hr[2], hr[5].getCenterX()+width); - setCenterX(hr[3], hr[4].getCenterX()+width); - break; - - case 4: - width=hr[4].getCenterX()-hr[0].getCenterX(); - setCenter(hr[region], p.x, p.y); - setCenter(hr[0], p.x-width, p.y); - setCenter(hr[3], p.x+width, p.y); - break; - - case 5: - width=hr[4].getCenterX()-hr[0].getCenterX(); - setCenter(hr[region], p.x, p.y); - setCenter(hr[1], p.x-width, p.y); - setCenter(hr[2], p.x+width, p.y); - break; - } - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - /** - * Make the affine transform which corresponds to this skewed region. - */ - public Point2D.Double[] getCorners() { - int first=getUpperLeftRegion(); - - // Calculate which is the opposite corner. - int third=(first+2)%4; - - // Now use the cross-product to determine which of the - // remaining points is the one which keep the path going clockwise. - int second=(first+1)%4; - double dx0=hr[third].getCenterX()-hr[first].getCenterX(); - double dy0=hr[third].getCenterY()-hr[first].getCenterY(); - double dx1=hr[second].getCenterX()-hr[first].getCenterX(); - double dy1=hr[second].getCenterY()-hr[first].getCenterY(); - - if(dx0*dy1-dy0*dx1>0) second=(first+3)%4; - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AXSliceSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/AXSliceSelection.java deleted file mode 100755 index 596f81aa6e8e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AXSliceSelection.java +++ /dev/null @@ -1,79 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -/** - * A panel which selects a slice of the window in the x-direction. - * That is, it selects a rectangular region with a height equal to the - * full height of the window and with an adjustable width. - * - * @author Charles Loomis - **/ -public class AXSliceSelection extends ASelection { - - public AXSliceSelection() { - super(6); - } - - public int init(Point2D.Double p, int key) { - isValid=false; - - int ymax=window.getSize().height; - int ymid=ymax/2; - - setCenter(hr[0], p.x, 0); - setCenter(hr[1], p.x, 0); - setCenter(hr[2], p.x, ymax); - setCenter(hr[3], p.x, ymax); - setCenter(hr[4], p.x, ymid); - setCenter(hr[5], p.x, ymid); - - region=5; - return region; - } - - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - - switch(region) { - case 0: - case 3: - case 4: - setCenterX(hr[0], p.x); - setCenterX(hr[3], p.x); - setCenterX(hr[4], p.x); - break; - - case 1: - case 2: - case 5: - setCenterX(hr[1], p.x); - setCenterX(hr[2], p.x); - setCenterX(hr[5], p.x); - break; - } - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - public Point2D.Double[] getCorners() { - // Sort out which are the three control points. - int first=0; - int second=1; - int third=2; - - if(hr[1].getCenterX()<hr[0].getCenterX()) { - first=1; - second=0; - third=3; - } - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AYSkewSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/AYSkewSelection.java deleted file mode 100755 index 9e98bde0f403..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AYSkewSelection.java +++ /dev/null @@ -1,124 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -/** - * A panel which selects a parallogram-shaped region in which two - * sides are parallel to the y-axis and the other two are skewed with - * respect to the x-axis. - * - * @author Charles Loomis - **/ -public class AYSkewSelection extends ASelection { - - final private static int STARTING_WIDTH=25; - - public AYSkewSelection() { - super(6); - } - - /** - * Initialize the control points based in the starting point - */ - public int init(Point2D.Double p, int key) { - isValid=false; - - setCenter(hr[0], p.x, p.y-STARTING_WIDTH); - setCenter(hr[1], p.x, p.y-STARTING_WIDTH); - setCenter(hr[2], p.x, p.y+STARTING_WIDTH); - setCenter(hr[3], p.x, p.y+STARTING_WIDTH); - setCenter(hr[4], p.x, p.y); - setCenter(hr[5], p.x, p.y); - - region=5; - return region; - } - - /** - * Move the active control point to the point (x,y). - */ - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - - double width; - - // Change what is done depending on which control point is active. - switch(region) { - case 0: - width=p.y-hr[4].getCenterY(); - setCenterY(hr[0], hr[4].getCenterY()+width); - setCenterY(hr[1], hr[5].getCenterY()+width); - setCenterY(hr[2], hr[5].getCenterY()-width); - setCenterY(hr[3], hr[4].getCenterY()-width); - break; - - case 1: - width=p.y-hr[5].getCenterY(); - setCenterY(hr[0], hr[4].getCenterY()+width); - setCenterY(hr[1], hr[5].getCenterY()+width); - setCenterY(hr[2], hr[5].getCenterY()-width); - setCenterY(hr[3], hr[4].getCenterY()-width); - break; - - case 2: - width=p.y-hr[5].getCenterY(); - setCenterY(hr[0], hr[4].getCenterY()-width); - setCenterY(hr[1], hr[5].getCenterY()-width); - setCenterY(hr[2], hr[5].getCenterY()+width); - setCenterY(hr[3], hr[4].getCenterY()+width); - break; - - case 3: - width=p.y-hr[4].getCenterY(); - setCenterY(hr[0], hr[4].getCenterY()-width); - setCenterY(hr[1], hr[5].getCenterY()-width); - setCenterY(hr[2], hr[5].getCenterY()+width); - setCenterY(hr[3], hr[4].getCenterY()+width); - break; - - case 4: - width=hr[4].getCenterY()-hr[0].getCenterY(); - setCenter(hr[region], p.x, p.y); - setCenter(hr[0], p.x, p.y-width); - setCenter(hr[3], p.x, p.y+width); - break; - - case 5: - width=hr[4].getCenterY()-hr[0].getCenterY(); - setCenter(hr[region], p.x, p.y); - setCenter(hr[1], p.x, p.y-width); - setCenter(hr[2], p.x, p.y+width); - break; - } - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - /** - * Make the affine transform which corresponds to this skewed region. - */ - public Point2D.Double[] getCorners() { - int first=getUpperLeftRegion(); - - // Calculate which is the opposite corner. - int third=(first+2)%4; - - // Now use the cross-product to determine which of the - // remaining points is the one which keep the path going clockwise. - int second=(first+1)%4; - double dx0=hr[third].getCenterX()-hr[first].getCenterX(); - double dy0=hr[third].getCenterY()-hr[first].getCenterY(); - double dx1=hr[second].getCenterX()-hr[first].getCenterX(); - double dy1=hr[second].getCenterY()-hr[first].getCenterY(); - - if(dx0*dy1-dy0*dx1>0) second=(first+3)%4; - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AYSliceSelection.java b/graphics/AtlantisJava/src/atlantis/interactions/AYSliceSelection.java deleted file mode 100755 index 41c0a8293cdb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AYSliceSelection.java +++ /dev/null @@ -1,79 +0,0 @@ -package atlantis.interactions; - - -import java.awt.*; -import java.awt.geom.*; - - -/** - * A panel which selects a slice of the window in the x-direction. - * That is, it selects a rectangular region with a height equal to the - * full height of the window and with an adjustable width. - * - * @author Charles Loomis - **/ -public class AYSliceSelection extends ASelection { - - public AYSliceSelection() { - super(6); - } - - public int init(Point2D.Double p, int key) { - isValid=false; - - int xmax=window.getSize().width; - int xmid=xmax/2; - - setCenter(hr[0], 0, p.y); - setCenter(hr[1], 0, p.y); - setCenter(hr[2], xmax, p.y); - setCenter(hr[3], xmax, p.y); - setCenter(hr[4], xmid, p.y); - setCenter(hr[5], xmid, p.y); - - region=5; - return region; - } - - public void drag(Point2D.Double p, int region, int key) { - isValid=true; - - switch(region) { - case 0: - case 3: - case 4: - setCenterY(hr[0], p.y); - setCenterY(hr[3], p.y); - setCenterY(hr[4], p.y); - break; - - case 1: - case 2: - case 5: - setCenterY(hr[1], p.y); - setCenterY(hr[2], p.y); - setCenterY(hr[5], p.y); - break; - } - } - - public void paint(Graphics2D g) { - paintStandard(g); - } - - public Point2D.Double[] getCorners() { - // Sort out which are the three control points. - int first=1; - int second=2; - int third=3; - - if(hr[1].getCenterY()>hr[0].getCenterY()) { - first=0; - second=3; - third=2; - } - - return convert(first, second, third); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AZMRGroup.java b/graphics/AtlantisJava/src/atlantis/interactions/AZMRGroup.java deleted file mode 100755 index 9b6903d9fb4f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AZMRGroup.java +++ /dev/null @@ -1,14 +0,0 @@ -package atlantis.interactions; - - -public class AZMRGroup extends AInteractionGroup { - - private AZMRInteraction transformInteraction; - - public AZMRGroup(AInteractionsManager iManager) { - super(AInteractionGroup.WINDOW_GROUP, iManager); - transformInteraction=new AZMRInteraction(); - this.addInteraction(transformInteraction); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/AZMRInteraction.java b/graphics/AtlantisJava/src/atlantis/interactions/AZMRInteraction.java deleted file mode 100755 index db82da56f335..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/AZMRInteraction.java +++ /dev/null @@ -1,700 +0,0 @@ -package atlantis.interactions; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; - -import javax.swing.JMenuItem; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.event.AEventManager; -import atlantis.graphics.ACursorFactory; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.projection.AProjection; -import atlantis.projection.AProjection2D; -import atlantis.projection.AProjection3D; -import atlantis.projection.AProjectionFR; -import atlantis.projection.AProjectionFZ; -import atlantis.projection.AProjectionLegoPlot; -import atlantis.projection.AProjectionRZ; -import atlantis.projection.AProjectionVP; -import atlantis.projection.AProjectionXZ; -import atlantis.projection.AProjectionYX; -import atlantis.projection.AProjectionYZ; -import atlantis.utils.AMath; -import atlantis.utils.AVector; - -/** - * The Zoom, Move and Rotate interaction. - */ -public class AZMRInteraction extends AInteraction implements - ASleepMouseDragListener, AMousePressListener, AEnterExitListener, ActionListener -{ - // when these values are reached on any of the coordinates, zooming takes - // no longer any effect - private static final double MINIMAL_ZOOM_LIMIT = 0.001; // [cm] = 10 um - private static final double MAXIMAL_ZOOM_LIMIT = 100000; // [cm] = 1000 m - - private static final int ZOOM_MODE = 0; - private static final int HORIZONTAL_ZOOM_MODE = 1; - private static final int VERTICAL_ZOOM_MODE = 2; - private static final int ROTATE_MODE = 3; - private static final int MOVE_MODE = 5; - - private int centerMarkRadius = 6; - private Point2D.Double p0; - private int previousKey = KeyEvent.VK_UNDEFINED; - private int mode; - private JMenuItem[] popupItems; - private final static String TO_CENTER_OF_DETECTOR = "To Center Of Detector"; - private final static String CENTER_PICTURE = "Center The Picture"; - private final static String ASPECT_RATIO_1 = "Aspect Ratio 1"; - private final static String UNZOOM_FULL = "Unzoom Full"; - - // if false, none of the ZMR interactions will have the red central dot - // painted - private static boolean paintCenterDot = true; - - public AZMRInteraction() - { - super(1, AUTOMATIC_REPAINT, WORLD_COORDINATES, false); - - popupItems = new JMenuItem[] { - new JMenuItem(TO_CENTER_OF_DETECTOR), - new JMenuItem(CENTER_PICTURE), - new JMenuItem(UNZOOM_FULL)}; - - for (int i = 0; i < popupItems.length; i++) { - popupItems[i].addActionListener(this); - } - - // The center of the ellipse is in (0, 0) in User Space - hr[0] = new Ellipse2D.Double(-centerMarkRadius / 2, - -centerMarkRadius / 2, centerMarkRadius, centerMarkRadius); - - //By default we are in zoom mode - mode = ZOOM_MODE; - } - - public static void setPaintCenterDot(boolean state) - { - paintCenterDot = state; - } - - public void connect(AInteractionsManager manager) - { - super.connect(manager); - Point2D.Double c = ((AProjection2D) window.getProjection()).getCenter(); - - setCenter(hr[0], c.x, c.y); - } - - public int getPressButton() - { - return AInteractionsManager.LEFT; - } - - public int init(Point2D.Double p, int key) - { - keyChange(p, key); - return -1; - } - - public void pressed(Point2D.Double p, int button, int key) - { - if (key == KeyEvent.VK_C) - setCenter(hr[0], p.x, p.y); - if (key == KeyEvent.VK_0){ - double[] primaryVertex = AEventManager.instance().getCurrentEvent().getPrimaryVertex(); - if(window.getProjection().getName().equals("YX")) setCenter(hr[0], primaryVertex[0], primaryVertex[1]); - if(window.getProjection().getName().equals("RZ")) { - double phiMid2 = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(Math.atan2(primaryVertex[1], primaryVertex[0]) - phiMid2); - int s=-1; - if (phiDiff < Math.PI / 2. || phiDiff > 3 * Math.PI / 2.) s = 1; - setCenter(hr[0], primaryVertex[2], s*Math.sqrt(primaryVertex[0]*primaryVertex[0]+primaryVertex[1]*primaryVertex[1])); - } - } - } - - public int getButton() - { - return AInteractionsManager.LEFT; - } - - public void start(Point2D.Double p, int region, int key) - {} - - private double getHd0(Point2D.Double p) - { - Point2D.Double[] c = window.getUserCorners(); - AVector v21 = new AVector(c[2].x, c[2].y, c[1].x, c[1].y); - AVector v10 = new AVector(c[1].x, c[1].y, c[0].x, c[0].y); - Point2D.Double center = getCenter(hr[0]); - - return p.distance(AMath.intersectionPoint(center, v21, p, v10)); - } - - private double getVd0(Point2D.Double p) - { - Point2D.Double[] c = window.getUserCorners(); - AVector v01 = new AVector(c[0].x, c[0].y, c[1].x, c[1].y); - AVector v12 = new AVector(c[1].x, c[1].y, c[2].x, c[2].y); - Point2D.Double center = getCenter(hr[0]); - - return p.distance(AMath.intersectionPoint(center, v01, p, v12)); - } - - private void keyChange(Point2D.Double p, int key) - { - p0 = p; - - switch (key) - { - case KeyEvent.VK_UNDEFINED: - mode = ZOOM_MODE; - break; - - case KeyEvent.VK_H: - mode = HORIZONTAL_ZOOM_MODE; - break; - - case KeyEvent.VK_V: - mode = VERTICAL_ZOOM_MODE; - break; - - case KeyEvent.VK_R: - mode = ROTATE_MODE; - break; - - case KeyEvent.VK_M: - mode = MOVE_MODE; - break; - - case KeyEvent.VK_Z: - mode = ZOOM_MODE; - break; - } - - //Update cursor mode when key changes - setCursorMode(); - } - - public void drag(Point2D.Double p, int region, int key) - { - - if (key != previousKey) - { - keyChange(p, key); - previousKey = key; - } - - double zf; - Point2D.Double center = getCenter(hr[0]); - AProjection proj = window.getProjection(); - - switch (mode) - { - case ZOOM_MODE: - zf = p0.distance(center.x, center.y) - / p.distance(center.x, center.y); - performZoom(getCenter(hr[0]), zf, window); - break; - - case HORIZONTAL_ZOOM_MODE: - zf = getHd0(p0) / getHd0(p); - performHorizontalZoom(center, zf, window); - break; - - case VERTICAL_ZOOM_MODE: - zf = getVd0(p0) / getVd0(p); - performVerticalZoom(center, zf, window); - break; - - case ROTATE_MODE: - if ((proj instanceof AProjectionFR) - || (proj instanceof AProjectionFZ) - || (proj instanceof AProjectionVP)) - performPhiRotation(p.y - p0.y, window); - else if (proj instanceof AProjectionLegoPlot) - performLegoRotation(center, p.x - p0.x, p.y - p0.y, window); - else - { - if ((proj instanceof AProjectionRZ) - || (proj instanceof AProjectionXZ) - || (proj instanceof AProjectionYZ) - || (proj instanceof AProjection3D)) - { - AParameter phiPar = parameterStore.get(proj.getName(), "Phi"); - if (proj instanceof AProjection3D) - { - Point2D.Double pDisp = window.calculateDisplay(p); - Point2D.Double p0Disp = window.calculateDisplay(p0); - double height = window.getCurrDisp().getHeight(); - double deltaV = pDisp.getY() - p0Disp.getY(); - phiPar.setD(adjustPhi(phiPar.getD() + 360. * deltaV - / height)); - } - else - phiPar.setD(adjustPhi(phiPar.getD() + (p.y - p0.y))); - p0 = p; - ACanvas.getCanvas().repaintAllFromScratch(); - } - else - { - double alpha = AMath.getAngle(p0, center) - - AMath.getAngle(p, center); - - performRotation(alpha, center, window); - if (proj instanceof AProjectionYX) - { - AParameter phiPar = parameterStore.get(proj.getName(), "Phi"); - - phiPar.setD(adjustPhi(phiPar.getD() + Math.toDegrees(alpha))); - } - } - } - break; - - case MOVE_MODE: - if ((proj instanceof AProjectionFR) - || (proj instanceof AProjectionFZ) - || (proj instanceof AProjectionVP)) - { - performMove(p.x - p0.x, 0, window); - performPhiRotation(p.y - p0.y, window); - } - else - performMove(p.x - p0.x, p.y - p0.y, window); - break; - } - } // drag() - // --------------------------------------------------------------- - - private double adjustPhi(double phi) - { - while (phi < 0) - phi += 360; - while (phi > 360) - phi -= 360; - return phi; - } - - public void stop() - {} - - public void cancel() - {} - - public void paint(Graphics2D g) - { - Point2D.Double p = window.calculateDisplay(getCenter(hr[0])); - - //don't draw red dot if not drawing the lego plot - //(i.e. when just drawing the legend) - boolean paintingJustLegoLegend = false; - if(window.getProjection().getName().equals("LegoPlot")) - { - parameterStore.selectWindowParameters(window.getName()); - if(!parameterStore.get("LegoPlot","DrawPlot").getStatus()) - paintingJustLegoLegend=true; - parameterStore.restoreWindowParameters(); - } - - if (paintCenterDot && !paintingJustLegoLegend) - { - g.setColor(Color.red); - g.fillOval((int) (p.x - centerMarkRadius / 2), - (int) (p.y - centerMarkRadius / 2), centerMarkRadius, - centerMarkRadius); - } - } - - /** - * Check the coordinates of the corners. If any of the limits was already - * reached, zooming / unzooming takes no longer any effect. - * - * @param corners Double - * @return boolean - */ - private static boolean checkCornerLimits(Point2D.Double[] corners) - { - - for (int i = 0; i < corners.length; i++) - { - //Get the difference in x and y off this corner and the next - //There is at most 3 corners - this will give us all of the combinations - double dX=Math.abs(corners[i].x-corners[(i+1)%(corners.length-1)].x); - double dY=Math.abs(corners[i].y-corners[(i+1)%(corners.length-1)].y); - //Coordinates will differ in only x OR y, get the one that does - double dMax = Math.max(dX,dY); - //Check that corner coordinate difference is within limits - if ((dMax < MINIMAL_ZOOM_LIMIT) || (dMax > MAXIMAL_ZOOM_LIMIT)) - { - AOutput.alwaysAppend("zoom / unzoom limit reached\n", - ALogInterface.NORMAL); - return false; - } - } - return true; - } // checkTheCornerLimits() - - - public static void performZoom(Point2D.Double center, double zf, - AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - for (int i = 0; i < corners.length; i++) - { - corners[i].x = center.x + (corners[i].x - center.x) * zf; - corners[i].y = center.y + (corners[i].y - center.y) * zf; - } - - if (!checkCornerLimits(corners)) - { - return; // zooming has already reached its limit - } - - window.setUserCorners(corners); - } - - public static void performRotation(double angle, Point2D.Double center, - AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - double cos = Math.cos(angle); - double sin = Math.sin(angle); - - for (int i = 0; i < corners.length; i++) - { - double dx = corners[i].x - center.x; - double dy = corners[i].y - center.y; - - corners[i].x = center.x + dx * cos - dy * sin; - corners[i].y = center.y + dx * sin + dy * cos; - } - - window.setUserCorners(corners); - } - - public static void performMinus90Rotation(AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - AVector v12 = new AVector(corners[1], corners[2]); - double x3 = corners[0].x + v12.dx; - double y3 = corners[0].y + v12.dy; - - corners[0].setLocation(corners[1]); - corners[1].setLocation(corners[2]); - corners[2].setLocation(x3, y3); - - window.setUserCorners(corners); - } - - public static void performPlus90Rotation(AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - AVector v12 = new AVector(corners[1], corners[2]); - double x3 = corners[0].x + v12.dx; - double y3 = corners[0].y + v12.dy; - - corners[2].setLocation(corners[1].x, corners[1].y); - corners[1].setLocation(corners[0].x, corners[0].y); - corners[0].setLocation(x3, y3); - - window.setUserCorners(corners); - } - - public static void performPhiRotation(double dPhi, AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - for (int i = 0; i < corners.length; i++) - corners[i].y -= dPhi; - - window.setUserCorners(corners); - } - - public void performLegoRotation(Point2D.Double center, double dPhi, - double dEta, AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - if (dPhi != 0.0 || dEta != 0.0) - { - //get original phi coord in 0-360 range - double centerX = -AProjectionLegoPlot.adjustPhi(window, -center.x, center.y); - - corners[0].x -= (dPhi); - // x offset=xz*360 so xz=change/360 - AProjectionLegoPlot.setxz(window.getIndex(), AProjectionLegoPlot - .getxz(window.getIndex()) - + (dPhi) / 360); - - if (AProjectionLegoPlot.getyz(window.getIndex()) < 1.0 - || (dEta) > 0.0) - { - corners[0].y -= (dEta); - corners[1].y -= (dEta); - // y offset=yz*50 so yz=change/50 - AProjectionLegoPlot.setyz(window.getIndex(), - AProjectionLegoPlot.getyz(window.getIndex()) - (dEta) - / 50); - } - - //now have changed xz recalcuate phi coordinte - center.x = AProjectionLegoPlot.adjustPhi(window, centerX, center.y); - setCenter(hr[0], center.x, center.y); - - window.setUserCorners(corners); - } - } - - public static void performHorizontalZoom(Point2D.Double center, double f, - AWindow window) - { - Point2D.Double[] c = window.getUserCorners(); - AVector v21 = new AVector(c[2].x, c[2].y, c[1].x, c[1].y); - Point2D.Double center1 = new Point2D.Double(center.x + v21.dx, center.y - + v21.dy); - Point2D.Double p0 = AMath - .intersectionPoint(c[0], c[1], center, center1); - - AVector v0 = new AVector(p0, c[0]).scale(f); - AVector v1 = new AVector(p0, c[1]).scale(f); - - c[0].x = p0.x + v0.dx; - c[0].y = p0.y + v0.dy; - - c[1].x = p0.x + v1.dx; - c[1].y = p0.y + v1.dy; - - v21.invert(); - p0.setLocation(p0.x + v21.dx, p0.y + v21.dy); - c[2].x = p0.x + v1.dx; - c[2].y = p0.y + v1.dy; - - if (!checkCornerLimits(c)) - { - return; // zooming has already reached its limit - } - - window.setUserCorners(c); - - } - - public static void performVerticalZoom(Point2D.Double center, double f, - AWindow window) - { - Point2D.Double[] c = window.getUserCorners(); - AVector v01 = new AVector(c[0].x, c[0].y, c[1].x, c[1].y); - Point2D.Double center1 = new Point2D.Double(center.x + v01.dx, center.y - + v01.dy); - Point2D.Double p0 = AMath - .intersectionPoint(c[1], c[2], center, center1); - - AVector v1 = new AVector(p0, c[1]).scale(f); - AVector v2 = new AVector(p0, c[2]).scale(f); - - c[1].x = p0.x + v1.dx; - c[1].y = p0.y + v1.dy; - - c[2].x = p0.x + v2.dx; - c[2].y = p0.y + v2.dy; - - v01.invert(); - p0.setLocation(p0.x + v01.dx, p0.y + v01.dy); - c[0].x = p0.x + v1.dx; - c[0].y = p0.y + v1.dy; - - if (!checkCornerLimits(c)) - { - return; // zooming has already reached its limit - } - - window.setUserCorners(c); - - } - - public static void performMove(double dx, double dy, AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - - for (int i = 0; i < corners.length; i++) - { - corners[i].x -= dx; - corners[i].y -= dy; - } - - window.setUserCorners(corners); - } - - public static Line2D.Double getMiddleHorizontalLine(AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - AVector v12 = new AVector(corners[1], corners[2]).scale(0.5); - - return new Line2D.Double(corners[0].x + v12.dx, corners[0].y + v12.dy, - corners[1].x + v12.dx, corners[1].y + v12.dy); - } - - public static Line2D.Double getMiddleVerticalLine(AWindow window) - { - Point2D.Double[] corners = window.getUserCorners(); - AVector v10 = new AVector(corners[1], corners[0]).scale(0.5); - - return new Line2D.Double(corners[1].x + v10.dx, corners[1].y + v10.dy, - corners[2].x + v10.dx, corners[2].y + v10.dy); - } - - public static void performFlip(Line2D.Double line, AWindow window) - { - if (line == null) - return; - - Point2D.Double[] corners = window.getUserCorners(); - double dSquare = Point2D.distanceSq(line.x1, line.y1, line.x2, line.y2); - - for (int i = 0; i < corners.length; i++) - { - double u = (1 / dSquare) - * ((corners[i].x - line.x1) * (line.x2 - line.x1) + (corners[i].y - line.y1) - * (line.y2 - line.y1)); - - double x0 = line.x1 + u * (line.x2 - line.x1); - double y0 = line.y1 + u * (line.y2 - line.y1); - - corners[i].x = 2 * x0 - corners[i].x; - corners[i].y = 2 * y0 - corners[i].y; - } - - window.setUserCorners(corners); - } - - /** - * Set cursor acording to current mode - */ - public void setCursorMode(){ - //check which mode we have - switch (mode) - { - case ZOOM_MODE: - window.setCursor(ACursorFactory.getInstance().getZoomCursor()); - break; - - case HORIZONTAL_ZOOM_MODE: - window.setCursor(ACursorFactory.getInstance().getZoomCursor()); - break; - - case VERTICAL_ZOOM_MODE: - window.setCursor(ACursorFactory.getInstance().getZoomCursor()); - break; - - case ROTATE_MODE: - window.setCursor(ACursorFactory.getInstance().getRotateCursor()); - break; - - case MOVE_MODE: - window.setCursor(ACursorFactory.getInstance().getMoveCursor()); - break; - } - } - - /** - * Gets called each time we enter a window in which this interaction is active - */ - public void entered() - { - //Set mouse cursor according to current mode - setCursorMode(); - } - - /** - * Gets called each time we leave a window in which this interaction is active - */ - public void exited() - { - //Set mouse cursor - window.setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - public int getPopupType() - { - return APopupListener.WINDOW_POPUP; - } - - public JMenuItem[] getPopupItems() { - return popupItems; - } - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - - if (action.equals(TO_CENTER_OF_DETECTOR)) - { - Point2D.Double c = ((AProjection2D) window.getProjection()) - .getCenter(); - - setCenter(hr[0], c.x, c.y); - window.repaint(); - } - else if (action.equals(CENTER_PICTURE)) - { - Point2D.Double[] c = window.getUserCorners(); - AVector v02 = new AVector(c[0].x, c[0].y, c[2].x, c[2].y) - .scale(0.5); - double xc = c[0].x + v02.dx; - double yc = c[0].y + v02.dy; - AVector vC0 = new AVector(xc, yc, 0, 0); - AProjection proj = window.getProjection(); - if (proj instanceof AProjectionLegoPlot) - vC0 = new AVector(xc, yc, 180 * (1 - AProjectionLegoPlot - .getxz(window.getIndex())), -5); - // 180*(1-AProjectionLegoPlot.xz), -5 is different center as center - // of plot is not at 0,0 - - for (int i = 0; i < c.length; i++) - { - c[i].x += vC0.dx; - c[i].y += vC0.dy; - } - window.setUserCorners(c); - } else if (action.equals(ASPECT_RATIO_1)) { - ((AProjection2D) window.getProjection()).setAspectRatio1(window); - } - else if (action.equals(UNZOOM_FULL)) - { - window.setUserCorners(((AProjection2D) window.getProjection()). - calculateNoZoomCorners(window.getSize())); - } - } - - public AModifier[] getModifiers() - { - return new AModifier[] { - new AModifier(KeyEvent.VK_UNDEFINED, false, "Zoom"), - new AModifier(KeyEvent.VK_Z, false, "Zoom"), - new AModifier(KeyEvent.VK_H, false, "Horizonatal Zoom"), - new AModifier(KeyEvent.VK_V, false, "Vertical Zoom"), - new AModifier(KeyEvent.VK_R, false, "Rotate"), - new AModifier(KeyEvent.VK_F, false, "Fast Zoom"), - new AModifier(KeyEvent.VK_M, false, "Move (pan)"), - new AModifier(KeyEvent.VK_C, false, "Modify Central Point") - }; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/interactions/package.html b/graphics/AtlantisJava/src/atlantis/interactions/package.html deleted file mode 100644 index 85cfaaddcc87..000000000000 --- a/graphics/AtlantisJava/src/atlantis/interactions/package.html +++ /dev/null @@ -1,11 +0,0 @@ -<html> -<head></head> -<body> -<p>This package contains implementation of various interactions with -the application such as the main ZMR (1Zoom Move Rotation), Fisheye, -etc. Each AWindow has an AInteractionManager which tells the current -interaction, e.g. ZMR, about what is happening with the mouse on that -window. -</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/list/AColorIcon.java b/graphics/AtlantisJava/src/atlantis/list/AColorIcon.java deleted file mode 100755 index a77acc2917d3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/list/AColorIcon.java +++ /dev/null @@ -1,69 +0,0 @@ -package atlantis.list; - - -import javax.swing.Icon; -import java.awt.*; - -import atlantis.graphics.colormap.AColorMap; - - -// icon with size and color - -class AColorIcon implements Icon { - private int w, h; - private int colorIndex; - - public AColorIcon() { - this(AColorMap.WH, 50, 15); - } - - public AColorIcon(Dimension d) { - this.w=d.width; - this.h=d.height; - } - - public AColorIcon(int colorIndex, int w, int h) { - this.colorIndex=colorIndex; - this.w=w; - this.h=h; - } - - public void paintIcon(Component c, Graphics g, int x, int y) { - g.setColor(Color.black); - g.drawRect(x, y, w-1, h-1); - if(colorIndex==AColorMap.INVISIBLE) { - g.setColor(AColorMap.getColors()[AColorMap.WH]); - g.fillRect(x+1, y+1, w-2, h-2); - g.setColor(Color.black); - g.drawLine(x, y, x+w-1, y+h-1); - g.drawLine(x, y+h-1, x+w-1, y); - } else if(colorIndex==AColorMap.NO_COLOR) { - g.setColor(AColorMap.getColors()[AColorMap.WH]); - g.fillRect(x+1, y+1, w-2, h-2); - g.setColor(Color.black); - int xc=x+w/2; - int yc=y+h/2; - g.drawLine(xc, yc-2, xc, yc+2); - g.drawLine(xc-2, yc, xc+2, yc); - } else { - g.setColor(AColorMap.getColors()[colorIndex]); - g.fillRect(x+1, y+1, w-2, h-2); - } - } - - public int getColorIndex() { - return colorIndex; - } - - public void setColorIndex(int colorIndex) { - this.colorIndex=colorIndex; - } - - public int getIconWidth() { - return w; - } - - public int getIconHeight() { - return h; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/list/AList.java b/graphics/AtlantisJava/src/atlantis/list/AList.java deleted file mode 100755 index 7377bef99e9b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/list/AList.java +++ /dev/null @@ -1,128 +0,0 @@ -package atlantis.list; - -import atlantis.event.AData; - -/** - * Instance of AList as seen in AListManager (Lists) - * source references instance of the datatype in the list - * <ul> - * <li>itemsIndex is a list of indices (Atlantis internal datatitems indices) - * of the particular datape which are in the list</li> - * <li>itemsID is a list of dataitems IDs of the datatype in the list</li> - * </ul> - * - * <p>index and id is identical for Track for instance, but different for - * calo cells. When masking data on cross-event basis, IDs are necessary - * (e.g. masking hot calo cells based on their IDs)</p> - * - * <p>Copyright: Copyright (c) 2002</p> - * - * @author not attributable - * @version 1.0 - */ -public class AList -{ - private AData source; - private int[] itemsIndex; - private int[] itemsID; - - - /** - * - * @param data AData - * @param singleItem int - index of the dataitem to put in the list - */ - public AList(AData data, int singleItem) - { - source = data; - itemsIndex = new int[] { singleItem }; - itemsID = new int[] { source.getIdFromIndex(singleItem) }; - - } // AList() ------------------------------------------------------------ - - - - public AList(AData data, boolean[] drawn) - { - source = data; - int num = 0; - for(int i = 0; i < drawn.length; ++i) - { - if(drawn[i]) - { - num++; - } - } - - itemsIndex = new int[num]; - itemsID = new int[num]; - num = 0; - - for(int i = 0; i < drawn.length; ++i) - { - if(drawn[i]) - { - itemsIndex[num] = i; - itemsID[num] = source.getIdFromIndex(i); - num++; - } - } - - } // AList() ------------------------------------------------------------ - - - - /** - * String representation of the AList instance. Returns the datatype name, - * resp. screen name and if there one item in the only, then the item's - * ID. If there are more items, it says the number of dataitems. - * @return String - */ - public String toString() - { - String key = source.getStoreGateKey(); - String sn = source.getNameScreenName(); - String name = key != null ? sn + ":" + key : sn; - - if(itemsIndex.length == 1) - { - return name + " " + source.getIdFromIndex(itemsIndex[0]); - } - else - { - return name + " (" + itemsIndex.length + " items)"; - } - - } // toString() --------------------------------------------------------- - - - - public AData getSource() - { - return source; - - } // getSource() -------------------------------------------------------- - - - - /** - * Returns indices of the items in the list (internal Atlantis indices - * which are *sometimes* identical with IDs) - * @return int[] - */ - public int[] getItems() - { - return itemsIndex; - - } // getItems() --------------------------------------------------------- - - - - public int[] getItemsID() - { - return itemsID; - - } // getItemsID() ------------------------------------------------------- - - -} // class AList ============================================================ diff --git a/graphics/AtlantisJava/src/atlantis/list/AListManager.java b/graphics/AtlantisJava/src/atlantis/list/AListManager.java deleted file mode 100755 index 815d922e087b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/list/AListManager.java +++ /dev/null @@ -1,1765 +0,0 @@ -package atlantis.list; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.Point; -import java.awt.dnd.DragSource; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.Box; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; - -import atlantis.canvas.ACanvas; -import atlantis.data.AHelix; -import atlantis.data.ARVxData; -import atlantis.data.ATrackData; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACursorFactory; -import atlantis.graphics.AIcon; -import atlantis.graphics.APickingGraphics2D; -import atlantis.graphics.colormap.AColorMap; -import atlantis.gui.AGUI; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.APar; -import atlantis.utils.A4Vector; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; -import atlantis.utils.AUtilities; - -public class AListManager extends JTree implements MouseListener, MouseMotionListener -{ - private static ALogger logger = ALogger.getLogger(AListManager.class); - private static AEventManager eventManager = AEventManager.instance(); - - // used to display the tree - static private JFrame dialog; // rather than JDialog - // special nodes - static private final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Lists"); - static private final DefaultMutableTreeNode highlight = new DefaultMutableTreeNode("Highlight"); - static private final DefaultMutableTreeNode lastDrawn = new DefaultMutableTreeNode("Last Drawn"); - static private final DefaultMutableTreeNode others = new DefaultMutableTreeNode("Others"); - static private final DefaultMutableTreeNode invisible = new DefaultMutableTreeNode("Invisible"); - static private final DefaultMutableTreeNode mass = new DefaultMutableTreeNode("Calculation"); - // instance - static private final AListManager listManager = new AListManager(); - static private DefaultTreeModel dtm; - static private int numLists = 0; - // source and status of Drag and Drop - static private DefaultMutableTreeNode source = null; - static private boolean draging = false; - static private HashMapSet nodeColors; - - // counters for V0 mass calc - static private int V0vx=0; - static private int V0tracks=0; - static private int V0charge=0; - - // private static final Cursor DROP_VALID = DragSource.DefaultMoveDrop; - private static final Cursor DROP_VALID_COPY = DragSource.DefaultCopyDrop; - // private static final Cursor DROP_INVALID = DragSource.DefaultMoveNoDrop; - - - - private AListManager() - { - super(root, true); - dtm = (DefaultTreeModel) getModel(); - nodeColors = new HashMapSet(); - reset(); - - addMouseListener(this); - addMouseMotionListener(this); - setSelectionRow(1); - setPreferredSize(new Dimension(200, 300)); - setRootVisible(true); - setScrollsOnExpand(true); - setShowsRootHandles(false); - setCellRenderer(new ColorRenderer()); - - if (!AGlobals.isAtlantisHeadless()) { - // set up the visual representation - dialog = new JFrame("List manager"); - AIcon.setIconImage(dialog); - Box b = Box.createHorizontalBox(); - b.add(new JScrollPane(this)); - b.add(new ColorPanel()); - dialog.getContentPane().add(b); - dialog.pack(); - dialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - } - - } // AListManager() ----------------------------------------------------- - - - - public static AListManager getInstance() - { - return listManager; - - } // getInstance() ------------------------------------------------------ - - - - public void showLists() - { - Component gui = AGlobals.instance().getGuiFrame(); - if (gui != null) - { - dialog.setLocation(gui.getLocation()); - } - dialog.setVisible(true); - - } // showLists() -------------------------------------------------------- - - - - private boolean isAlreadyInTheList(AList list, - DefaultMutableTreeNode destination) - { - boolean already = false; - for(int i = 0; i < destination.getChildCount(); i++) - { - DefaultMutableTreeNode child = - (DefaultMutableTreeNode) destination.getChildAt(i); - if(!child.getAllowsChildren()) - { - AList a = (AList) child.getUserObject(); - if(a.getSource() == list.getSource()) - { - int[] items = a.getItems(); - int newItem = list.getItems()[0]; - for(int j = 0; j < items.length; ++j) - { - if(items[j] == newItem) - { - already = true; - } - } - } - } - } - - return already; - - } // isAlreadyInTheList() ----------------------------------------------- - - - - public void add(AList list) - { - if(!dialog.isVisible()) - { - dialog.setVisible(true); - } - - // default destination - DefaultMutableTreeNode destination = root; - TreePath tp = getSelectionPath(); - if(tp != null) - { - destination = (DefaultMutableTreeNode) tp.getLastPathComponent(); - } - - if(destination != null && destination.getAllowsChildren()) - { - if(destination == others || destination == lastDrawn || - destination == highlight || destination == invisible || - destination == mass) - { - AOutput.alwaysAppend("Can't add to " + destination, ALogInterface.WARNING); - return; - } - - // check if it's already in the list and if so, don't add - boolean already = this.isAlreadyInTheList(list, destination); - if(already) - { - logger.info(list + " is already in this list, not added"); - } - else - { - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), - destination, destination.getChildCount()); - expandPath(new TreePath(dtm.getPathToRoot(destination))); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - - } // add() ------------------------------------------------------------- - - - - /** - * Adds the selected item to the mass list and outputs the invariant mass in the output window - * Doesn't make the list visible as really only need to see output window - * @param list - */ - public void massCalc(AList list) - { - // default destination - DefaultMutableTreeNode destination = mass; - TreePath tp = getSelectionPath(); - - if(destination != null && destination.getAllowsChildren()) - { - // check if it's already in the list and if so, don't add - boolean already = this.isAlreadyInTheList(list, destination); - if(already) - { - logger.info(list + " is already in this list, not added"); - } - else - { - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), - destination, destination.getChildCount()); - expandPath(new TreePath(dtm.getPathToRoot(destination))); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - - if (tp != null) - { - setSelectionPath(tp); - } - - // added to list, now do summarise - Summarizer summ = new Summarizer(); - AOutput.alwaysAppend(summ.getHeader(), ALogInterface.NORMAL); - - AList[] children = getChildren(mass); - - int chiLength = children.length; - - for(int i = 0; i < chiLength; i++) - { - int num = children[i].getItems().length; - A4Vector v = children[i].getSource().get4Vector(num, - children[i].getItems(),0.14); //assume pion mass - - - if(v != null && num > 0) - { - String info = summ.addAndGetInfo(v, children[i].toString()); - AOutput.alwaysAppend(info, ALogInterface.NORMAL); - } - } - - String msg = summ.getTotalInfo(); - - AOutput.alwaysAppend(msg, ALogInterface.NORMAL_BOLD); // Print default summary (ie, assuming pi mass for all) - - summ = null; - - } // massCalc() ------------------------------------------------------------- - - /** - * Adds the selected item to the mass list and outputs the invariant mass in the output window - * Doesn't make the list visible as really only need to see output window - * This is the massCalc function for V0 decays. Check for up to 2 tracks and display 4 mass scenarios - * @param list - */ - public void massCalcV0(AList list) - { - // default destination - DefaultMutableTreeNode destination = mass; - TreePath tp = getSelectionPath(); - - if(getChildren(mass).length == 0) // if list is empty, make sure counters are reinitialised - { - V0vx=0; - V0tracks=0; - V0charge=0; - } - - if(destination != null && destination.getAllowsChildren()) - { - // check if it's already in the list and if so, don't add - boolean already = this.isAlreadyInTheList(list, destination); - - // check list for tracks and vertices (to a maximum of 2 tracks and 1 vertex) - if(getChildren(mass).length < 3) - { - if(already) - { - logger.info(list + " is already in this list, not added"); - } - else if(!(list.getSource() instanceof ARVxData || list.getSource() instanceof ATrackData)) - { - logger.info("not selected a track or vertex"); - AOutput.alwaysAppend("\n\n Not selected a track or vertex\n\n",ALogInterface.PICK); - return; - } - else if((list.getSource() instanceof ARVxData && V0vx>=1) || (list.getSource() instanceof ATrackData && V0tracks>=2)) - { - logger.info("already a vertex or two tracks selected"); - AOutput.alwaysAppend("\n\n Already a vertex or two tracks selected\n",ALogInterface.PICK); - return; - } - else - { - - // check the charges of the two tracks are opposite - // - if((list.getSource() instanceof ATrackData)) - { - ATrackData track = (ATrackData) list.getSource(); - AHelix h = track.getModifiableHelix(list.getItemsID()[0]); - if((V0charge != 0) && (V0charge * AMath.getSign(h.pT()) > 0)) - { - logger.info("2nd track is same charge as 1st track"); - AOutput.alwaysAppend("\n\nPlease pick an oppositely charged track\n", ALogInterface.PICK); - return; - } - } //end check charge - - // now increment the counters - // all tests passed, now can input into list. - - if(list.getSource() instanceof ATrackData) - { - V0tracks++; - logger.info("Selected a Track"); - } - else if(list.getSource() instanceof ARVxData) - { - V0vx++; - logger.info("Selected a Vertex"); - } - - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), - destination, destination.getChildCount()); - expandPath(new TreePath(dtm.getPathToRoot(destination))); - ACanvas.getCanvas().repaintAllFromScratch(); - } - - } - else - { - logger.info("list full (max 2 tracks + 1 vertex)"); - AOutput.alwaysAppend("\n\n List full (max 2 tracks + 1 vertex)\n",ALogInterface.PICK); - return; - } - } - if (tp != null) - { - setSelectionPath(tp); - } - - - // added to list, now do summarise - Summarizer summK = new Summarizer(); // K -> pi pi - Summarizer summL = new Summarizer(); // Lambda -> pi p - Summarizer summAL = new Summarizer(); // AntiLambda -> pi pbar - Summarizer summG = new Summarizer(); // gamma -> ee - - double[] secVx = new double[3]; // initialisation of secVx x,y,z array, if no vertex selected, use primary - double[] priVx = new double[3]; // primary vertex container (used to calculate decay length) - APar parameterStore = APar.instance(); - priVx[0]=parameterStore.get("Event", "XVtx").getD(); - priVx[1]=parameterStore.get("Event", "YVtx").getD(); - priVx[2]=parameterStore.get("Event", "ZVtx").getD(); - - secVx=priVx; - - AList[] children = getChildren(mass); - - - int chiLength = children.length; - - if(chiLength == 3) - { - boolean V0title = true; - for(int i = 0; i < chiLength; i++) - { - AData source = children[i].getSource(); - //ordering of the list is important. - //if vertex selected second, then the tracks selected before use primary vertex... - //need to get secVx first, THEN calculate tracks... - if(source instanceof ARVxData) - { - ARVxData rvx = (ARVxData) source; - secVx = rvx.getVertex(children[i].getItemsID()[0]); // gets x,y,z of the picked vertex. - } - } - - for(int i = 0; i < chiLength; i++) - { - - AData source = children[i].getSource(); - - if(source instanceof ATrackData) - { - ATrackData track = (ATrackData) source; - - // get helix of picked track - AHelix h = track.getModifiableHelix(children[i].getItemsID()[0]); - - // get charge for charge check - V0charge = (int) (Math.abs(h.pT())/h.pT()); - - int num = children[i].getItems().length; - - // initialise 4 vectors - A4Vector vK = source.get4Vector(num, - children[i].getItems(),0.0); - A4Vector vL = source.get4Vector(num, - children[i].getItems(),0.0); - A4Vector vAL = source.get4Vector(num, - children[i].getItems(),0.0); - A4Vector vG = source.get4Vector(num, - children[i].getItems(),0.0); - - - // now calculate the 4 vector - if(V0vx > 0) - { - double R = parameterStore.get("Event", "Curvature").getD() * Math.abs(h.pT()); - - // +1/-1 for a clockwise/anti-clockwise helix - double S = (int) (Math.abs(h.pT())/h.pT()); - - // Coordinates of the center point for the helix - double xC = (S * h.d0() - R) * Math.cos(Math.toRadians(h.phi0()) + S * Math.PI / 2.); - double yC = (S * h.d0() - R) * Math.sin(Math.toRadians(h.phi0()) + S * Math.PI / 2.); - - // calculate new phi from centre of curvature and secondary vertex - double phiPrime = Math.atan2(yC-secVx[1], xC-secVx[0]) + S*(Math.PI / 2.0); - - double px = Math.abs(h.pT()) * Math.cos(h.phi0()); - double py = Math.abs(h.pT()) * Math.sin(h.phi0()); - double pz = Math.abs(h.pT()) * Math.sinh(h.eta()); - - // recalculate px/py at secondary vertex - double pxPrime = Math.sqrt((px*px) + (py*py))*Math.cos(phiPrime); - double pyPrime = Math.sqrt((px*px) + (py*py))*Math.sin(phiPrime); - - px = pxPrime; - py = pyPrime; - - if(chiLength == 3 && !parameterStore.get("Minerva", "hideV0massoutput").getStatus()) - { - logger.info("recalculating tracks"); - AOutput.alwaysAppend("\n\nRecalculated track values:\n", ALogInterface.PICK); - AOutput.alwaysAppend(source.getNameScreenName()+" index: " + (children[i].getItemsID()[0]) + "\n" - +"PT="+String.format("%.3f",h.pT()) +" GeV\n" - +AMath.ETA+" = "+String.format("%.3f",h.eta())+"\n" - +AMath.PHI+" = "+String.format("%.3f",Math.toDegrees(phiPrime))+AMath.DEGREES+"\n" - +"Px=" + String.format("%.3f",px) +" GeV\n" - +"Py=" + String.format("%.3f",py) +" GeV\n" - +"Pz=" + String.format("%.3f",pz) +" GeV\n" - +"Charge = " + V0charge//Math.abs(V0charge) - ,ALogInterface.PICK); - } - else if(chiLength == 3) - { - if(V0title) - { - V0title = false; - - double decayLength = Math.sqrt(Math.pow(secVx[0]-priVx[0], 2.0)+Math.pow(secVx[1]-priVx[1], 2.0)+Math.pow(secVx[2]-priVx[2], 2.0)); - - AOutput.alwaysAppend("\n Decay length for selected vertex: "+String.format("%.2f",decayLength)+" cm\n\n", ALogInterface.PICK); - - - AOutput.alwaysAppend("\n Momentum for selected tracks: \n\n", ALogInterface.PICK); - } - if(V0charge>0) - AOutput.alwaysAppend("+ve track (px,py,pz): ("+String.format("%.3f",px)+", "+String.format("%.3f",py)+", "+String.format("%.3f",pz)+")\n", ALogInterface.PICK); - else if(V0charge <0) - AOutput.alwaysAppend("-ve track (px,py,pz): ("+String.format("%.3f",px)+", "+String.format("%.3f",py)+", "+String.format("%.3f",pz)+")\n", ALogInterface.PICK); - - } - - - /* now check charges of particles again and add to corresponding 4vectors - * - * scenarios: - * - * (K) Kaon -> pi+ pi- - * (L) Lambda -> proton pi- - * (AL)AntiLambda -> antiproton pi+ - * (G) Gamma -> e+ e- - * - * - * - */ - - // negative charge - if(V0charge < 0) - { - vK.set(px, py, pz, 0.1396); - vL.set(px, py, pz, 0.1396); - vAL.set(px, py, pz, 0.938); - vG.set(px, py, pz, 0.000511); - } - // positive charge - else if(V0charge > 0) - { - vK.set(px, py, pz, 0.1396); - vL.set(px, py, pz, 0.938); - vAL.set(px, py, pz, 0.1396); - vG.set(px, py, pz, 0.000511); - } - - - - // this is to display each track summary. - // currently off as too much summary crowds the output - if(vK != null && vL != null && vAL != null && vG != null && num > 0 && chiLength == 3) - { - String info = summK.addAndGetInfo(vK, children[i].toString()); - //AOutput.alwaysAppend(info, ALogPane.NORMAL); - info = summL.addAndGetInfo(vL, children[i].toString()); - //AOutput.alwaysAppend(info, ALogPane.NORMAL); - info = summAL.addAndGetInfo(vAL, children[i].toString()); - //AOutput.alwaysAppend(info, ALogPane.NORMAL); - info = summG.addAndGetInfo(vG, children[i].toString()); - //AOutput.alwaysAppend(info, ALogPane.NORMAL); - } - } - - } - } - - if(chiLength ==3 && !parameterStore.get("Minerva", "hideV0massoutput").getStatus()) - { - // Config switch to display either mass or px,py,pz. - String msgK = summK.getTotalInfo(); - String msgL = summL.getTotalInfo(); - String msgAL = summAL.getTotalInfo(); - String msgG = summG.getTotalInfo(); - - AOutput.alwaysAppend("\n V0 Decay Scenarios", ALogInterface.NORMAL_BOLD); - - AOutput.alwaysAppend(summK.getHeader(), ALogInterface.NORMAL); - - // print out the resultant mass calculation for each scenario - AOutput.alwaysAppend("K"+AMath.RARROW+AMath.PION+AMath.SUPPLUS+AMath.PION+AMath.SUPMINUS+"\n", ALogInterface.NORMAL); - AOutput.alwaysAppend(msgK, ALogInterface.NORMAL_BOLD); // Print kaon summary - AOutput.alwaysAppend("\n"+AMath.LAMBDACAP+AMath.RARROW+"p"+AMath.PION+AMath.SUPMINUS+"\n", ALogInterface.NORMAL); - AOutput.alwaysAppend(msgL, ALogInterface.NORMAL_BOLD); // Print lambda summary - AOutput.alwaysAppend("\n"+AMath.LAMBDACAP+AMath.OVERLINE+AMath.RARROW+"p"+AMath.OVERLINE+AMath.PION+AMath.SUPPLUS+"\n", ALogInterface.NORMAL); - AOutput.alwaysAppend(msgAL, ALogInterface.NORMAL_BOLD); // Print antilambda summary - AOutput.alwaysAppend("\n"+AMath.GAMMA+AMath.RARROW+"e"+AMath.SUPPLUS+"e"+AMath.SUPMINUS+"\n", ALogInterface.NORMAL); - AOutput.alwaysAppend(msgG, ALogInterface.NORMAL_BOLD); // Print gamma summary - AOutput.alwaysAppend("\n", ALogInterface.NORMAL); - } - } - summK = null; - summL = null; - summAL = null; - summG = null; - - } // massCalcV0() ------------------------------------------------------------- - - /** - * Takes two vectors from a list (added with the pick interaction and P key modifier) - * and prints the delta R and delta Phi of the vectors - * @param list - */ - public void deltaR(AList list) - { - // default destination - DefaultMutableTreeNode destination = mass; - TreePath tp = getSelectionPath(); - - if(destination != null && destination.getAllowsChildren()) - { - // check if it's already in the list and if so, don't add - boolean already = this.isAlreadyInTheList(list, destination); - - if(already) - { - logger.info(list + " is already in this list, not added"); - } - else - { - if(getChildren(mass).length >= 2){ - logger.info(list + " is full, maximum of 2 objects for delta phi calculation " + - "\n Clearing list"); - //AOutput.alwaysAppend("\n\n List full \n Clearing List \n",ALogPane.PICK); - mass.removeAllChildren(); - } - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), - destination, destination.getChildCount()); - expandPath(new TreePath(dtm.getPathToRoot(destination))); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - - if (tp != null) - { - setSelectionPath(tp); - } - - AList[] children = getChildren(mass); - - int chiLength = children.length; - if(chiLength == 2){ - A4Vector v1 = children[0].getSource().get4Vector(children[0].getItems().length, - children[0].getItems(),0.0); - A4Vector v2 = children[1].getSource().get4Vector(children[1].getItems().length, - children[1].getItems(),0.0); - - if(v1 != null && v2 != null) - { - double deltaPhi = Math.abs(v1.getPhi() - v2.getPhi()) > Math.PI ? (2*Math.PI) - Math.abs(v1.getPhi() - v2.getPhi()) : Math.abs(v1.getPhi() - v2.getPhi()); - double deltaEta = Math.abs(v1.getEta() - v2.getEta()); - double deltaR = Math.sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta); - - String info = "\n\n"+AMath.DELTA+AMath.PHI+" = "+String.format("%.1f",Math.toDegrees(deltaPhi))+AMath.DEGREES+" ("+String.format("%.3f",deltaPhi)+")" - + "\n"+AMath.DELTA+"R = "+String.format("%.3f",deltaR)+"\n"; - AOutput.alwaysAppend(info, ALogInterface.NORMAL_BOLD); - } - - } - } - - public void highlight(AList list) - { - highlight.removeAllChildren(); - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), highlight, 0); - dtm.reload(highlight); - expandPath(new TreePath(dtm.getPathToRoot(highlight))); - ACanvas.getCanvas().repaintAllFromScratch(); - - } // highlight() -------------------------------------------------------- - - - - public void addLastDrawn(AList list) - { - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), lastDrawn, 0); - dtm.reload(lastDrawn); - - } // addLastDrawn() ----------------------------------------------------- - - - - public void addInvisible(AList list) - { - if(!dialog.isVisible()) - { - dialog.setVisible(true); - } - - // check if it's already in the list and if so, don't add - boolean already = this.isAlreadyInTheList(list, invisible); - if(already) - { - logger.info(list + " is already in the Invisible list, not added"); - } - else - { - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), - invisible, invisible.getChildCount()); - expandPath(new TreePath(dtm.getPathToRoot(invisible))); - ACanvas.getCanvas().repaintAllFromScratch(); - } - - } // addInvisible() ----------------------------------------------------- - - - /** - * When adding items to the list using rubberband they are grouped by type - * and appear as "InDetTrack (5 items)". This method allows the user to expand - * these items so they can manipulate individual items. - * @param s Collection - * @return Action - */ - private Action expand(final Collection s) - { - // This is called when the user right-clicks, we first determine if this - // item can be expanded or not. - if (s.contains(root) || s.size() != 1) - { - return null; - } - - DefaultMutableTreeNode node = (DefaultMutableTreeNode) s.iterator().next(); - if (node.getUserObject() instanceof AList) - { - AList a = (AList) node.getUserObject(); - if (a.getItems().length < 1) - { - return null; - } - } - else - { - return null; - } - - // It can be expanded, so we add a menu item to the popup with the callback - // function as specified below. - return new AbstractAction("Expand items") - { - public void actionPerformed(ActionEvent e) - { - // We checked these casts before adding the callback - DefaultMutableTreeNode node = (DefaultMutableTreeNode) s.iterator().next(); - AList a = (AList) node.getUserObject(); - DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent(); - int index = parent.getIndex(node); - - // Now go through the list and add the items one by one to the parent. - for (int i=0; i<a.getItems().length; i++) - { - AList list = new AList(a.getSource(), a.getItems()[i]); - dtm.insertNodeInto(new DefaultMutableTreeNode(list, false), parent, index); - } - - // And remove the old list. - dtm.removeNodeFromParent(node); - } - }; - - } // expand() ----------------------------------------------------------- - - - private Action remove(final Collection s) - { - if(s.contains(root)) - { - return null; - } - - return new AbstractAction("Remove") - { - public void actionPerformed(ActionEvent e) - { - for (Iterator i = s.iterator(); i.hasNext();) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) i.next(); - if (node.getUserObject() instanceof AList) - { - AList a = (AList) node.getUserObject(); - a.getSource().remove(a.getItems()); - } - dtm.removeNodeFromParent(node); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - }; - - } // remove() ----------------------------------------------------------- - - - - /** - * This method is called after right-click -> summarize on the list-item in - * the list dialog - * @param s Collection - * @return Action - */ - private Action newSummarize(final Collection s) - { - if(s.contains(root) || s.size() != 1) - { - return null; - } - - return new AbstractAction("Summarize") - { - public void actionPerformed(ActionEvent e) - { - Summarizer summ = new Summarizer(); - AOutput.alwaysAppend(summ.getHeader(), ALogInterface.NORMAL); - - for(Iterator j = s.iterator(); j.hasNext();) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) j.next(); - AList[] children = getChildren(node); - - for(int i = 0; i < children.length; i++) - { - int num = children[i].getItems().length; - AList child = children[i]; - AData source = child.getSource(); - A4Vector v = source.get4Vector(num, child.getItems()); - - if(v != null && num > 0) - { - String info = summ.addAndGetInfo(v, children[i].toString()); - AOutput.alwaysAppend(info, ALogInterface.NORMAL); - } - } - } - - String msg = summ.getTotalInfo(); - AOutput.alwaysAppend(msg, ALogInterface.NORMAL_BOLD); - - summ = null; - - } // actionPerformed() - }; - - } // newSummarize() ----------------------------------------------------- - - - - /** - * This summarize method is called from rubberbanding menu - Summarize - * (from ASelection class) - */ - public void summarize() - { - if(lastDrawn == null) - { - return; - } - - Summarizer summ = new Summarizer(); - - AList[] children = getChildren(lastDrawn); - - AOutput.alwaysAppend(summ.getHeader(), ALogInterface.NORMAL); - - for(int i = 0; i < children.length; i++) - { - int num = children[i].getItems().length; - A4Vector v = children[i].getSource().get4Vector(num, children[i].getItems()); - - if(v != null && num > 0) - { - String msg = summ.addAndGetInfo(v, children[i].toString()); - AOutput.alwaysAppend(msg, ALogInterface.NORMAL); - } - } - - String msg = summ.getTotalInfo(); - AOutput.alwaysAppend(msg, ALogInterface.NORMAL_BOLD); - - summ = null; - - } // summarize() -------------------------------------------------------- - - - - private Action reset(final Collection s) - { - if(s.size() == 1 && s.contains(root)) - { - return new AbstractAction("Reset") - { - public void actionPerformed(ActionEvent e) - { - reset(); - ACanvas.getCanvas().repaintAllFromScratch(); - } - }; - } - else - { - return null; - } - - } // reset() ------------------------------------------------------------ - - - - public void clearHighlight() - { - highlight.removeAllChildren(); - dtm.reload(highlight); - ACanvas.getCanvas().repaintAllFromScratch(); - - } // clearHighlight() --------------------------------------------------- - - - - public void clearHighlightAndMassCalculation() - { - highlight.removeAllChildren(); - dtm.reload(highlight); - mass.removeAllChildren(); - dtm.reload(mass); - ACanvas.getCanvas().repaintAllFromScratch(); - - } // clearHighlightAndMassCalculation() --------------------------------------------------- - - - - public void clearLastDrawn() - { - lastDrawn.removeAllChildren(); - dtm.reload(lastDrawn); - - } // clearLastDrawn() --------------------------------------------------- - - - - /** - * Check if list (list of IDs id) of datatimes (toMask datatype) is present - * in the current event and if so, the items are added into the Invisible - * list, thus masked and igrored. - * - * @param toMask AData - * @param id int[] - * @param index int[] - */ - private boolean checkAndAddIntoInvisible(int[] id, int[] indexCheck, String key) - { - boolean result = false; - - // check if the datatype (key) exists in the new event - AEvent e = eventManager.getCurrentEvent(); - AData toMask = e.get(key); - - if(toMask != null) - { - // iterate over all data items in this list - for(int i = 0; i < id.length; i++) - { - // check if this ID is present in the current event - int index = toMask.getIndexFromId(id[i]); - if(index != -1) - { - // AList expects datatype and its index - AList l = new AList(toMask, index); - addInvisible(l); - AOutput.alwaysAppend(" " + l.toString() + "\n", ALogInterface.NORMAL); - result = true; - - // 2007-08-29: debugging check, remove after some time if the - // problem is not observed (then indexCheck param is not needed) - if(index != indexCheck[i]) - { - logger.warn("AListManager: problem, indices not equal!"); - } - // </debug> - } - } - } - - return result; - - } // checkAndAddIntoInvisible() ----------------------------------------- - - - - /** - * restore Invisible list, cross-event invisible - * @param backup AList[] - */ - private void restoreInvisible(AList[] backup) - { - if(backup.length > 0) - { - AOutput.alwaysAppend("\nPrevious Invisible list not empty, masked items:\n", - ALogInterface.WARNING); - - boolean somethingInvisible = false; - - for(int i = 0; i < backup.length; i++) - { - AData d = backup[i].getSource(); - String sg = d.getStoreGateKey(); - String accessKey = d.getName() + (sg != null ? sg : ""); - - if(backup[i].getItems().length > 1) - { - somethingInvisible = checkAndAddIntoInvisible(backup[i].getItemsID(), - backup[i].getItems(), accessKey); - } - else - { - int id = backup[i].getItemsID()[0]; - int index = backup[i].getItems()[0]; - somethingInvisible = checkAndAddIntoInvisible(new int[] { id }, - new int[] { index }, accessKey); - } - - } // for (overall items in the Invisible list) - - if(!somethingInvisible) - { - AOutput.alwaysAppend(" none\n", ALogInterface.NORMAL); - } - - } // if(backup.length > 0) - - } // restoreInvisible() ------------------------------------------------- - - - - public void resetAndPreserveInvisible() - { - AList[] invisibleBackup = getChildren(invisible); - reset(); - restoreInvisible(invisibleBackup); - - } // resetAndPreserveInvisible() ---------------------------------------- - - - - public void reset() - { - root.removeAllChildren(); - highlight.removeAllChildren(); - lastDrawn.removeAllChildren(); - invisible.removeAllChildren(); - mass.removeAllChildren(); - - root.add(highlight); - root.add(lastDrawn); - root.add(others); - root.add(invisible); - root.add(mass); - - numLists = 0; - root.add(new DefaultMutableTreeNode("List " + numLists++)); - - nodeColors.clear(); - nodeColors.put(highlight, new Integer(AColorMap.WH)); - nodeColors.put(invisible, new Integer(AColorMap.INVISIBLE)); - nodeColors.put(mass, new Integer(AColorMap.WH)); - dtm.reload(); - - } // reset() ------------------------------------------------------------ - - - - private Action rename(Collection s) - { - if(s.size() != 1) - { - return null; - } - - final DefaultMutableTreeNode selected = - (DefaultMutableTreeNode) (s.iterator().next()); - - if(!selected.getAllowsChildren() || selected == root || - selected == others || selected == highlight || - selected == lastDrawn || selected == invisible || - selected == mass) - { - return null; - } - - return new AbstractAction("Rename") - { - public void actionPerformed(ActionEvent h) - { - String name = JOptionPane.showInputDialog(listManager, - "Enter new name"); - selected.setUserObject(name); - } - }; - - } // rename() ----------------------------------------------------------- - - - - private Action newParent(final Collection s) - { - if(s.contains(root)) - { - return null; - } - - Set parents = new HashSet(); - - for(Iterator i = s.iterator(); i.hasNext();) - { - parents.add(((TreeNode) (i.next())).getParent()); - } - - if(parents.size() != 1) - { - return null; - } - - final DefaultMutableTreeNode oldParent = - (DefaultMutableTreeNode) (parents.iterator().next()); - - return new AbstractAction("New Parent") - { - public void actionPerformed(ActionEvent e) - { - DefaultMutableTreeNode newParent = - new DefaultMutableTreeNode("List " + numLists++); - int index = 0; - for(Iterator i = s.iterator(); i.hasNext();) - { - index = Math.min(oldParent.getIndex((TreeNode) (i.next())), - index); - } - - for(Iterator i = s.iterator(); i.hasNext();) - { - dtm.removeNodeFromParent((MutableTreeNode) (i.next())); - } - - dtm.insertNodeInto(newParent, oldParent, index); - - for(Iterator i = s.iterator(); i.hasNext();) - { - dtm.insertNodeInto((MutableTreeNode) (i.next()), newParent, 0); - } - - expandPath(new TreePath(dtm.getPathToRoot(newParent))); - } - }; - - } // newParent() -------------------------------------------------------- - - - - private Action newChild(final Collection s) - { - if(s.size() != 1) - { - return null; - } - - final DefaultMutableTreeNode selected = - (DefaultMutableTreeNode) (s.iterator().next()); - - if(!selected.getAllowsChildren()) - { - return null; - } - - return new AbstractAction("New Child") - { - public void actionPerformed(ActionEvent h) - { - dtm.insertNodeInto(new DefaultMutableTreeNode("List " + numLists++), - selected, 0); - expandPath(new TreePath(dtm.getPathToRoot(selected))); - } - }; - - } // newChild() --------------------------------------------------------- - - - - private DefaultMutableTreeNode getNode(Point m) - { - TreePath p = getPathForLocation(m.x, m.y); - if(p != null) - { - TreeNode tn = (TreeNode) p.getLastPathComponent(); - if(tn instanceof DefaultMutableTreeNode) - { - return (DefaultMutableTreeNode) tn; - } - } - return null; - - } // getNode() ---------------------------------------------------------- - - - - private static class HashMapSet extends HashMap - { - public Object put(Object key, Object value) - { - // don't allow duplicates - if(containsKey(key)) - { - this.remove(key); - } - - if(value != null) - { - return super.put(key, value); - } - - else - { - return null; - } - } - } - - - - class ColorRenderer extends DefaultTreeCellRenderer - { - AColorIcon folderIcon; - AColorIcon leafIcon; - - public ColorRenderer() - { - folderIcon = new AColorIcon(AColorMap.WH, 15, 11); - leafIcon = new AColorIcon(AColorMap.WH, 11, 11); - } - - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) - { - - super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); - - int c = getColor((TreeNode) value); - if (c == AColorMap.NO_COLOR) - setToolTipText("No Color"); - else if (c == AColorMap.INVISIBLE) - setToolTipText("Invisible"); - else - setToolTipText(""); - - if (leaf) - { - leafIcon.setColorIndex(c); - setIcon(leafIcon); - } - else - { - folderIcon.setColorIndex(c); - setIcon(folderIcon); - } - - return this; - } - - } - - private int getColor(TreeNode node) - { - TreeNode[] parents = dtm.getPathToRoot(node); - int color = AColorMap.NO_COLOR; - for (int i = 0; i < parents.length; ++i) - { - Object o = nodeColors.get(parents[i]); - if (o != null) - color = ((Integer) o).intValue(); - } - return color; - } - - private DefaultMutableTreeNode[] getLeafs() - { - java.util.List list = new ArrayList(); - for (int i = 0; i < root.getChildCount(); ++i) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i); - if (node != lastDrawn) - { - if (node.getAllowsChildren()) - { - Enumeration descendents = node.breadthFirstEnumeration(); - while (descendents.hasMoreElements()) - { - DefaultMutableTreeNode descendent = (DefaultMutableTreeNode) (descendents.nextElement()); - if (!descendent.getAllowsChildren()) - list.add(descendent); - } - } - else - { - list.add(node); - } - } - } - return (DefaultMutableTreeNode[]) list.toArray(new DefaultMutableTreeNode[list.size()]); - } - - public int[][] getColorMapping(AData data) - { - DefaultMutableTreeNode[] leafs = getLeafs(); - int num = 0; - for (int i = 0; i < leafs.length; ++i) - if (((AList) (leafs[i].getUserObject())).getSource() == data) - num += ((AList) (leafs[i].getUserObject())).getItems().length; - - int[] index = new int[num]; - int[] color = new int[num]; - num = 0; - for (int i = 0; i < leafs.length; ++i) - { - if (((AList) (leafs[i].getUserObject())).getSource() == data) - { - int[] items = ((AList) (leafs[i].getUserObject())).getItems(); - int c = getColor(leafs[i]); - for (int j = 0; j < items.length; ++j) - { - index[num] = items[j]; - color[num] = c; - num++; - } - } - } - int[][] temp = new int[2][]; - temp[0] = index; - temp[1] = color; - return temp; - } - - public int getColorOfOthers() - { - return getColor(others); - } - - public boolean[] getSelection(AData data) - { - boolean[] selected = new boolean[data.getNumData()]; - - TreePath[] paths = getSelectionPaths(); - if (paths != null) - { - for (int i = 0; i < paths.length; ++i) - { - Enumeration nodes = ((DefaultMutableTreeNode) (paths[i].getLastPathComponent())).breadthFirstEnumeration(); - while (nodes.hasMoreElements()) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) (nodes.nextElement()); - if (!node.getAllowsChildren()) - { - AList a = (AList) (node.getUserObject()); - if (a.getSource() == data) - { - int[] items = a.getItems(); - for (int j = 0; j < items.length; ++j) - selected[items[j]] = true; - } - } - } - } - } - return selected; - } - - public AList[] getChildren(DefaultMutableTreeNode node) - { - java.util.List children = new ArrayList(); - - Object o = node.getUserObject(); - if (o instanceof AList) - { - children.add(o); - } - else - { - // process the child nodes recursively - for (int i = 0; i < node.getChildCount(); ++i) - { - AList[] grandChildren = getChildren((DefaultMutableTreeNode) node.getChildAt(i)); - for (int j = 0; j < grandChildren.length; ++j) - { - children.add(grandChildren[j]); - } - } - } - return (AList[]) (children.toArray(new AList[children.size()])); - } - - public static Collection uniqueExpansion(Collection s) - { - Collection c = new HashSet(); - for (Iterator i = s.iterator(); i.hasNext();) - { - Enumeration en = ((DefaultMutableTreeNode) (i.next())).depthFirstEnumeration(); - while (en.hasMoreElements()) - { - c.add(en.nextElement()); - } - } - return c; - } - - class ColorPanel extends JPanel - { - ColorPanel() - { - Color[] colorMap = AColorMap.getColors(); - ActionListener a = new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int colorIndex = ((AColorIcon) (((JButton) (e.getSource())).getIcon())).getColorIndex(); - TreePath[] sel = getSelectionPaths(); - if (sel != null) - { - for (int i = 0; i < sel.length; ++i) - nodeColors.put(sel[i].getLastPathComponent(), new Integer(colorIndex)); - } - listManager.repaint(); - ACanvas.getCanvas().repaintAllFromScratch(); - } - }; - Box b = Box.createVerticalBox(); - for (int i = 0; i < colorMap.length; i++) - { - JButton l = new JButton(new AColorIcon(i, 13, 13)); - l.setMargin(new Insets(0, 0, 0, 0)); - l.setBorder(null); - b.add(l); - b.add(Box.createVerticalStrut(3)); - l.addActionListener(a); - } - b.add(Box.createVerticalStrut(6)); - JButton l = new JButton(new AColorIcon(AColorMap.NO_COLOR, 13, 13)); - l.setMargin(new Insets(0, 0, 0, 0)); - l.setBorder(null); - l.setToolTipText("No specified color"); - b.add(l); - b.add(Box.createVerticalStrut(3)); - l.addActionListener(a); - l = new JButton(new AColorIcon(AColorMap.INVISIBLE, 13, 13)); - l.setMargin(new Insets(0, 0, 0, 0)); - l.setBorder(null); - l.setToolTipText("Invisible"); - b.add(l); - l.addActionListener(a); - super.add(b); - } - } - - - - public ArrayList getLastDrawn() - { - ArrayList result = new ArrayList(); - - Enumeration myenum = lastDrawn.children(); - while(myenum.hasMoreElements()) - { - Object o = ((DefaultMutableTreeNode) (myenum.nextElement())).getUserObject(); - if(o instanceof AList) - { - if(((AList) o).getItems().length > 0) - { - result.add(o); - } - } - } - - return result; - } - - - - public void copyLastDrawn() - { - - DefaultMutableTreeNode copy = new DefaultMutableTreeNode("List " + numLists++); - Enumeration myenum = lastDrawn.children(); - while (myenum.hasMoreElements()) - { - Object o = ((DefaultMutableTreeNode) (myenum.nextElement())).getUserObject(); - if (o instanceof AList) - { - if (((AList) o).getItems().length > 0) - copy.add(new DefaultMutableTreeNode(o, false)); - } - } - dtm.insertNodeInto(copy, root, 0); - setSelectionPath(new TreePath(dtm.getPathToRoot(copy))); - // expandPath(getPathForLocation(e.getX(), e.getY())); - } - - public void mouseExited(MouseEvent e) - { - update(e); - } // DnD - - public void mouseClicked(MouseEvent e) - {} - - public void mouseEntered(MouseEvent e) - { - update(e); - } // DnD - - - public void mousePressed(MouseEvent e) - { - // source of DnD - source = getNode(e.getPoint()); - // set picked object to selection if possible - TreePath tp = getPathForLocation(e.getPoint().x, e.getPoint().y); - if (tp != null) - { - - DefaultMutableTreeNode node = (DefaultMutableTreeNode) (tp.getLastPathComponent()); - if (!node.getAllowsChildren()) - { - AList a = (AList) (node.getUserObject()); - if (a.getItems().length == 1) - APickingGraphics2D.setPicked(a.getSource(), a.getItems()[0]); - } - } - // special for right button - if (!AUtilities.isRightMouseButton(e)) - return; - // make right button act on selection just as left button does - if (tp != null) - { - if (e.isControlDown()) - { - addSelectionPath(tp); - } - else - { - setSelectionPath(tp); - } - } - // pop up menu on right click - TreePath[] sel = getSelectionPaths(); - Collection selection = new ArrayList(sel.length); - for (int i = 0; i < sel.length; ++i) - selection.add(sel[i].getLastPathComponent()); - - JPopupMenu popup = new JPopupMenu(); - Action temp; - temp = expand(selection); - if (temp != null) - popup.add(temp); - temp = remove(selection); - if (temp != null) - popup.add(temp); - temp = reset(selection); - if (temp != null) - popup.add(temp); - temp = rename(selection); - if (temp != null) - popup.add(temp); - temp = newParent(selection); - if (temp != null) - popup.add(temp); - temp = newChild(selection); - if (temp != null) - popup.add(temp); - temp = newSummarize(selection); - if (temp != null) - popup.add(temp); - // gary just remove this for now - - AListProcessor[] listProcessors = eventManager.getCurrentEvent().getData(); - - for (int i = 0; i < listProcessors.length; i++) - { - Action[] actions = listProcessors[i].getActions(selection); - for (int j = 0; j < actions.length; ++j) - { - popup.add(actions[j]); - } - } - - popup.show(e.getComponent(), e.getX(), e.getY()); - - } - - public void mouseMoved(MouseEvent e) - {} - - public void mouseDragged(MouseEvent e) - { - // start of drag - if (!draging) - { - if (source != null && isDragSource(source)) - draging = true; - } - update(e); - } - - public void mouseReleased(MouseEvent e) - { - // DnD event - if (draging && source != null) - { - DefaultMutableTreeNode destination = getNode(e.getPoint()); - if (destination != null && source != destination && destination.getAllowsChildren() && isValidDrag(source, destination)) - { - if (!e.isControlDown() && source != lastDrawn) - { - dtm.removeNodeFromParent(source); - } - if (source == lastDrawn) - { - DefaultMutableTreeNode copy = new DefaultMutableTreeNode("List " + numLists++); - Enumeration myenum = source.children(); - while (myenum.hasMoreElements()) - { - Object o = ((DefaultMutableTreeNode) (myenum.nextElement())).getUserObject(); - copy.add(new DefaultMutableTreeNode(o, false)); - } - dtm.insertNodeInto(copy, destination, 0); - } - else - dtm.insertNodeInto(source, destination, 0); - expandPath(getPathForLocation(e.getX(), e.getY())); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - draging = false; - source = null; - setCursor(ACursorFactory.getInstance().getDefaultCursor()); - } - - private boolean isDragSource(DefaultMutableTreeNode source) - { - if (source == null || source == root || source == highlight || source == others || source==mass) - return false; - else - return true; - } - - private boolean isValidDrag(DefaultMutableTreeNode source, DefaultMutableTreeNode destination) - { - if (source == null || destination == null) - return false; - if (source == root || source == highlight || source == others || source == mass) - return false; - if (destination == others) - return false; - if (destination == lastDrawn) - return false; - if (destination == highlight) - { - if (source.getAllowsChildren()) - return false; - if (((AList) (source.getUserObject())).getItems().length != 1) - return false; - if (highlight.getChildCount() != 0) - return false; - } - return true; - } - - private void update(MouseEvent e) - { - if (!draging) - return; - Point point = e.getPoint(); - DefaultMutableTreeNode current = getNode(point); - if (current != null && current.getAllowsChildren() && isValidDrag(source, current)) - { - TreePath p = getPathForLocation(point.x, point.y); - setSelectionPath(p); - if (e.isControlDown()) - { - setCursor(DROP_VALID_COPY); - } - else - { - setCursor(ACursorFactory.getInstance().getDragValidCursor()); - } - } - else - { - setCursor(ACursorFactory.getInstance().getDragInvalidCursor()); - } - } - -} - - -class Summarizer -{ - private A4Vector vector = null; - private double etSum = 0; - - - public Summarizer() - { - vector = new A4Vector(); - - } - - - public String getHeader() - { - StringBuffer sb = new StringBuffer(); - sb.append("\nSummary output:\n"); - sb.append(" "); // 18 spaces - sb.append(" PT "); - sb.append(" ET "); - sb.append(" E "); - sb.append(" M "); - sb.append(" MT "); - sb.append("\n"); - - return sb.toString(); - - } - - - public String addAndGetInfo(A4Vector item, String description) - { - vector.add(item); - etSum += item.getEt(); - StringBuffer sb = new StringBuffer(); - sb.append(description); - sb.append("\n"); - sb.append(" "); // 18 spaces - sb.append(String.format("%7.1f",item.getPt())); - sb.append(String.format("%8.1f",item.getEt())); - sb.append(String.format("%7.1f",item.getE())); - sb.append(String.format("%8.3f",item.getMass())); - sb.append(String.format("%8.1f",item.getMt())); - sb.append("\n"); - - return sb.toString(); - } - - public double getTotalEt() - { - return etSum; - } - - public double getTotalPt() - { - return vector.getPt(); - } - - public double getTotalMt() - { - double et = getTotalEt(); - double pt = getTotalPt(); - return Math.sqrt(et*et - pt*pt); - } - - public String getTotalInfo() - { - StringBuffer sb = new StringBuffer(); - sb.append(String.format("%-18s", "Total")); - sb.append(String.format("%7.1f",getTotalPt())); - sb.append(String.format("%8.1f",getTotalEt())); - sb.append(String.format("%7.1f",vector.getE())); - sb.append(String.format("%8.3f",vector.getMass())); - sb.append(String.format("%8.1f",getTotalMt())); - sb.append("\n"); - - return sb.toString(); - - } - -} - diff --git a/graphics/AtlantisJava/src/atlantis/list/AListProcessor.java b/graphics/AtlantisJava/src/atlantis/list/AListProcessor.java deleted file mode 100755 index 6c58995a4a5b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/list/AListProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package atlantis.list; - - -import javax.swing.Action; -import java.util.Collection; - - -public interface AListProcessor { - Action[] getActions(Collection nodes); -} diff --git a/graphics/AtlantisJava/src/atlantis/list/package.html b/graphics/AtlantisJava/src/atlantis/list/package.html deleted file mode 100644 index ca84b937bc77..000000000000 --- a/graphics/AtlantisJava/src/atlantis/list/package.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<p>Implementation of lists which are used to store event datatypes.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimInterpolate.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimInterpolate.java deleted file mode 100644 index 90e0284bc683..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimInterpolate.java +++ /dev/null @@ -1,47 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public class ANAnimInterpolate extends ANAnimSegment { - - private ANAnimVar m_var; - private double m_t1; - private double m_t2; - private double m_v1; - private double m_v2; - private int m_interp; - - public ANAnimInterpolate(ANAnimVar var, double t1, double t2, - double v1, double v2, int interp) { - m_var = var; - m_t1 = t1; - m_t2 = t2; - m_v1 = v1; - m_v2 = v2; - m_interp = interp; - } - - public void evaluate(double now) { - if (now < m_t1) { return; } - switch(m_interp) { - case (ANAnimationManager.INTERP_LINEAR): - //System.out.println("now: " + now + " m_t1: " + m_t1 + " m_t2: " + m_t2); - double t = (now - m_t1) / (m_t2 - m_t1); - //System.out.println("t: " + t); - m_var.setValue((t * (m_v2 - m_v1)) + m_v1); - break; - } - } - - @Override - public double getStart() { - return m_t1; - } - - @Override - public double getEnd() { - return m_t2; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimSegment.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimSegment.java deleted file mode 100644 index 6678cade19f6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimSegment.java +++ /dev/null @@ -1,13 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public abstract class ANAnimSegment { - - public abstract double getStart(); - public abstract double getEnd(); - - public abstract void evaluate(double now); -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimSetProjection.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimSetProjection.java deleted file mode 100644 index 6ca352555ac0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimSetProjection.java +++ /dev/null @@ -1,38 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public class ANAnimSetProjection extends ANAnimSegment { - private ANFrameManager m_fm; - private ANProjection m_p; - private double m_when; - - public ANAnimSetProjection(ANFrameManager fm, ANProjection p, double when) { - m_fm = fm; - m_p = p; - m_when = when; - } - - @Override - public void evaluate(double now) { - //System.out.println("Evaluate in SetProjection: " + now); - if (now > m_when) { - //System.out.println("CHANGE!"); - m_fm.setCurrentProjection(m_p); - } - } - - @Override - public double getStart() { - return m_when; - } - - @Override - public double getEnd() { - return m_when; - } - - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimThread.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimThread.java deleted file mode 100644 index 97185bb17cde..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimThread.java +++ /dev/null @@ -1,67 +0,0 @@ -package atlantis.nge; - -import atlantis.canvas.AWindow; -import atlantis.utils.ALogger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author Adam Davison - */ -public class ANAnimThread implements Runnable { - - private static ALogger logger = ALogger.getLogger(ANAnimThread.class); - private ANAnimationManager m_am; - private Object m_wait = new Object(); - private AWindow m_w; - - public ANAnimThread(ANAnimationManager am, AWindow w) { - m_am = am; - m_w = w; - } - - public void reschedule() { - //System.out.println("Rescheduling"); - synchronized (m_wait) { - m_wait.notifyAll(); - } - //System.out.println("Rescheduled"); - } - - public void run() { - while (true) { - double wait = m_am.timeToWait(); - - //System.out.println("Told to wait: " + wait); - - double mintime = 1.0 / 100.0; - - if (wait == -1.0) { - // wait forever - synchronized (m_wait) { - try { - m_wait.wait(); - } catch (InterruptedException ex) { - logger.error("Interrupted in sleep", ex); - } - } - } else if (wait > mintime) { - // wait until we're supposed to do something - synchronized (m_wait) { - try { - m_wait.wait((long) (wait * 1000)); - } catch (InterruptedException ex) { - logger.error("Interrupted in sleep", ex); - } - } - } else { - // do something now - //System.out.println("Forcing Repaint!"); - m_w.invalidateQuietly(); - //m_w.getView().paintImmediately(0, 0, m_w.getWidth(), m_w.getHeight()); - m_w.repaint(); - } - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimVar.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimVar.java deleted file mode 100644 index 2dd5c9c9b382..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimVar.java +++ /dev/null @@ -1,27 +0,0 @@ -package atlantis.nge; - -/** - * A variable which is animatable, pretty much a wrapper around a double... - * - * @author Adam Davison - */ -public class ANAnimVar { - - private double m_val; - - public ANAnimVar(double val) { - m_val = val; - } - - public ANAnimVar() { - m_val = 0.0; - } - - public double getValue() { - return m_val; - } - - public void setValue(double val) { - m_val = val; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANAnimationManager.java b/graphics/AtlantisJava/src/atlantis/nge/ANAnimationManager.java deleted file mode 100644 index a4d7e3fe0c88..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANAnimationManager.java +++ /dev/null @@ -1,92 +0,0 @@ -package atlantis.nge; - -import atlantis.canvas.AWindow; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * - * @author Adam Davison - */ -public class ANAnimationManager { - - public static final int INTERP_LINEAR = 1; - private ArrayList<ANAnimSegment> m_segs; - private double m_now; - - private ANAnimThread m_at; - - public ANAnimationManager(AWindow w) { - m_segs = new ArrayList<ANAnimSegment>(); - updateNow(); - m_at = new ANAnimThread(this, w); - new Thread(m_at).start(); - } - - public void updateNow() { - m_now = ((double) System.currentTimeMillis()) / 1000.0; - } - - public void scheduleAnimationAbsolute(ANAnimVar v, double t1, double t2, double v1, double v2) { - m_segs.add(new ANAnimInterpolate(v, t1, t2, v1, v2, INTERP_LINEAR)); - m_at.reschedule(); - } - - public void scheduleAnimation(ANAnimVar v, double t1, double t2, double v1, double v2) { - updateNow(); - scheduleAnimationAbsolute(v, t1 + m_now, t2 + m_now, v1, v2); - } - - public void scheduleProjectionChange(ANFrameManager fm, ANProjection p, double t) { - updateNow(); - m_segs.add(new ANAnimSetProjection(fm, p, t + m_now)); - m_at.reschedule(); - } - - public void animate() { - updateNow(); - - //System.out.println("Animating at: " + m_now); - - Iterator<ANAnimSegment> it = m_segs.listIterator(); - while (it.hasNext()) { - ANAnimSegment seg = it.next(); - //System.out.println("Seg: " + seg + " start: " + seg.getStart() + " end: " + seg.getEnd()); - if (seg.getStart() < m_now) { - seg.evaluate(m_now); - } - if (seg.getEnd() < m_now) { - it.remove(); - } - } - } - - public double timeToWait() { - double next = -1.0; - updateNow(); - - //System.out.println("Wait testing at: " + m_now); - - Iterator<ANAnimSegment> it = m_segs.listIterator(); - while (it.hasNext()) { - ANAnimSegment seg = it.next(); - //System.out.println("Seg: " + seg + " start: " + seg.getStart() + " end: " + seg.getEnd()); - if (seg.getStart() <= next && seg.getEnd() >= next) { - //System.out.println("In segment, returning 0.0"); - return 0.0; - } else if (seg.getStart() >= next) { - double wait = seg.getStart() - m_now; - if (wait < next || next == -1.0) { - if (wait < 0.0) { - wait = 0.0; - } - next = wait; - } - } - } - - return next; - } -} - - diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANCacheToken.java b/graphics/AtlantisJava/src/atlantis/nge/ANCacheToken.java deleted file mode 100644 index 3ec2fe065ac5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANCacheToken.java +++ /dev/null @@ -1,11 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public class ANCacheToken<T> { - - - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANColor.java b/graphics/AtlantisJava/src/atlantis/nge/ANColor.java deleted file mode 100644 index 87c01543c86a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANColor.java +++ /dev/null @@ -1,87 +0,0 @@ -package atlantis.nge; - -import atlantis.graphics.colormap.AColorMap; - -import java.awt.Color; - -/** - * A floating point colour class that enforces very little - * - * @author Adam Davison, Mark Stockton - */ -public class ANColor { - - public float r; - public float g; - public float b; - public float a; - - public ANColor(Color c) { - r = ((float) c.getRed()) / 255.0f; - g = ((float) c.getGreen()) / 255.0f; - b = ((float) c.getBlue()) / 255.0f; - a = ((float) c.getAlpha()) / 255.0f; - } - - public ANColor(float _r, float _g, float _b, float _a) { - r = _r; - g = _g; - b = _b; - a = _a; - } - - public ANColor(float _r, float _g, float _b) { - r = _r; - g = _g; - b = _b; - a = 1.0f; - } - - public static ANColor getBGColor() { - return getMapColor(AColorMap.BG); - } - - public static ANColor getMapColor(int index) { - Color bg = AColorMap.getColors()[index]; - - float r = ((float) bg.getRed()) / 255.0f; - float g = ((float) bg.getGreen()) / 255.0f; - float b = ((float) bg.getBlue()) / 255.0f; - - return new ANColor(r, g, b); - } - - public static ANColor getMapColor(int index, float trans) { - Color bg = AColorMap.getColors()[index]; - - float r = ((float) bg.getRed()) / 255.0f; - float g = ((float) bg.getGreen()) / 255.0f; - float b = ((float) bg.getBlue()) / 255.0f; - - return new ANColor(r, g, b, trans); - } - - public void mult(float c) { - r *= c; - g *= c; - b *= c; - if (r < 0.0f) { r = 0.0f; } - if (r > 1.0f) { r = 1.0f; } - if (g < 0.0f) { g = 0.0f; } - if (g > 1.0f) { g = 1.0f; } - if (b < 0.0f) { b = 0.0f; } - if (b > 1.0f) { b = 1.0f; } - } - - public void lighten(float c) { - r = 1.0f - ((1.0f - r)*c); - g = 1.0f - ((1.0f - g)*c); - b = 1.0f - ((1.0f - b)*c); - if (r < 0.0f) { r = 0.0f; } - if (r > 1.0f) { r = 1.0f; } - if (g < 0.0f) { g = 0.0f; } - if (g > 1.0f) { g = 1.0f; } - if (b < 0.0f) { b = 0.0f; } - if (b > 1.0f) { b = 1.0f; } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANFrameManager.java b/graphics/AtlantisJava/src/atlantis/nge/ANFrameManager.java deleted file mode 100644 index adb6cb778c01..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANFrameManager.java +++ /dev/null @@ -1,190 +0,0 @@ -package atlantis.nge; - -import atlantis.canvas.AWindow; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.IntBuffer; -import javax.media.opengl.DebugGL; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.glu.GLU; - -/** - * Decides which projection should be onscreen and in what state. - * Handles animation, performance and probably all sorts of other things. - * - * @author Adam Davison, Mark Stockton - */ -public class ANFrameManager { - - // Targ is what we're aiming to display but proj is what we're really - // displaying, could be the same but could also be some transition into - // targ - - private ANProjection m_targ; - private ANProjection m_proj; - - private ANAnimationManager m_am; - - public ANFrameManager(AWindow w) { - // Default, if not told anything else construct 3d projection - m_proj = null; - m_am = new ANAnimationManager(w); - - } - - public ANPickResult pick(GLAutoDrawable drawable, int w, int h, int x, int y) { - - if (m_proj == null) { return null; } - - long before = System.nanoTime(); - - GL gl = drawable.getGL(); - gl.glViewport(0, 0, w, h); - - GLU glu = new GLU(); - int maxsize = 100000; - - ByteBuffer bb = ByteBuffer.allocateDirect(4*maxsize); - bb.order(ByteOrder.nativeOrder()); - // FIXME: Reuse this object for performance - IntBuffer ib = bb.asIntBuffer(); - gl.glSelectBuffer(maxsize, ib); - gl.glRenderMode(GL.GL_SELECT); - gl.glMatrixMode(GL.GL_PROJECTION); - int[] viewport = new int[4]; - gl.glLoadIdentity(); - gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0); - y = h - y; - glu.gluPickMatrix(x - 1, y - 1, 3, 3, viewport, 0); - - ANRenderHints rh = new ANRenderHints(); - rh.setPick(true); - rh.setPickHelper(new ANPickHelper(gl)); - - //gl.glPushName(0); - m_proj.display(drawable, w, h, rh); - //gl.glPopName(); - - int hits = gl.glRenderMode(GL.GL_RENDER); - - System.out.println("HITS: " + hits); - ANSelectionList sl = new ANSelectionList(ib); - //System.out.println("FRONT: " + sl.getFrontID()); - int[] front = sl.getFrontID(); - - ANPickResult ret = null; - - if (front != null) { - int id = front[0]; - System.out.println(id); - int data = front[1]; - System.out.println(data); - ANPickHandler ph = rh.getPickHelper().getPickHandler(id); - System.out.println(ph); - if (ph != null) { - ret = ph.getHitInfo(data); - } - } - - long after = System.nanoTime(); - System.out.println("Pick took: " + (after - before) / 1000); - - System.out.println(ret); - return ret; - } - - public void display(GLAutoDrawable drawable, int w, int h) { - System.out.println("Asked to display!"); - - if (m_proj == null) { return; } - - long before = System.nanoTime(); - - GL gl = new DebugGL(drawable.getGL()); - gl.glViewport(0, 0, w, h); - - m_am.animate(); - - m_proj.display(drawable, w, h, new ANRenderHints()); - - long after = System.nanoTime(); - System.out.println("Frame took: " + (after - before) / 1000); - } - - public double timeToWait() { - return m_am.timeToWait(); - } - - public ANProjection getTargetProjection() { - return m_targ; - } - - public ANProjection getCurrentProjection() { - return m_proj; - } - - public void setCurrentProjection(ANProjection proj) { - m_proj = proj; - } - - public void scheduleTransition(ANProjection p) { - //(new Exception()).printStackTrace(); - - m_targ = p; - - if (m_proj == null || m_proj == p) { m_proj = p; return; } - - //System.out.println(m_proj); - //System.out.println(p); - - if (m_proj instanceof ANLinearProjection && - p instanceof ANLinearProjection) { - - //System.out.println("HERE!"); - - ANLinearTransition trans = new ANLinearTransition( - (ANLinearProjection) m_proj, - (ANLinearProjection) p); - - setCurrentProjection(trans); - - double length = 1.0; - - m_am.scheduleAnimation(trans.getTransformTimeVar(), 0.0, length, 0.0, 1.0); - m_am.scheduleAnimation(trans.getFadeTimeVar(), 0.0, length, 0.0, 1.0); - m_am.scheduleProjectionChange(this, p, length); - - } else { - m_proj = p; - } - } - - public void checkProjectionYX() { - //System.out.println("checkProjectionYX: m_proj: " + m_proj); - if (!(m_targ instanceof ANProjectionYX)) { - //System.out.println("RECREATING"); - scheduleTransition(new ANProjectionYX()); - } - } - - public void checkProjection3D() { - if (!(m_targ instanceof ANProjection3D)) { - scheduleTransition(new ANProjection3D()); - } - } - - public ANProjectionPhysics checkProjectionPhysics() { - if (!(m_targ instanceof ANProjectionPhysics)) { - ANProjectionPhysics pp = new ANProjectionPhysics(); - scheduleTransition(pp); - return pp; - } else { - return (ANProjectionPhysics)(m_targ); - } - } - - public ANAnimationManager getAnimationManager() { - return m_am; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANGlobalFlags.java b/graphics/AtlantisJava/src/atlantis/nge/ANGlobalFlags.java deleted file mode 100644 index 5a96788eafa1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANGlobalFlags.java +++ /dev/null @@ -1,17 +0,0 @@ -package atlantis.nge; - -/** - * This class contains some static final boolean flags that can be used to - * control behaviour such as debugging and sanity checking. - * - * The java compiler guarantees that code enclosed in an if(var) where var - * is a final and false boolean is entirely excluded from your class file - * - * This is better than just using logger.debug() here because we don't want - * to do the debug level testing inside the fast rendering path - * - * @author Adam Davison - */ -public class ANGlobalFlags { - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANLinearProjection.java b/graphics/AtlantisJava/src/atlantis/nge/ANLinearProjection.java deleted file mode 100644 index c3cda8cb6275..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANLinearProjection.java +++ /dev/null @@ -1,229 +0,0 @@ -package atlantis.nge; - -import atlantis.nge.object.data.ANObjectDataJet; -import atlantis.nge.object.geometry.ANObjectGeomMuon; -import atlantis.nge.object.geometry.ANObjectGeomCalo; -import atlantis.nge.object.data.ANObjectDataCell; -import atlantis.data.ACalorimeterData; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.data.AJetData; -import atlantis.data.ALArData; -import atlantis.geometry.AAtlasDetector; -import atlantis.geometry.ABarrelCalorimeterDetector; -import atlantis.geometry.ABoxDetector; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.geometry.ADetector; -import atlantis.geometry.ADetectors; -import atlantis.geometry.AEndcapCalorimeterDetector; -import atlantis.geometry.AEndcapCryostatDetector; -import atlantis.utils.AMath; - -import java.util.ArrayList; - -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; - -/** - * This class represents projections which are a linear transformation on - * 3d space. These are easy to handle for a variety of reasons - * - * @author Adam Davison, Mark Stockton - */ -public abstract class ANLinearProjection extends ANProjection { - - // DEPRECATED - public ANObjectGeomMuon m_ogm;//muon - public ANObjectGeomCalo m_ogc;//calo barrel - public ANObjectGeomCalo m_ogetp;//extended tile +z - public ANObjectGeomCalo m_ogtsp;//mbts +z - public ANObjectGeomCalo m_ogecp;//endcap +z - public ANObjectGeomCalo m_ogetm;//extended tile -z - public ANObjectGeomCalo m_ogtsm;//mbts -z - public ANObjectGeomCalo m_ogecm;//endcap -z - - public ANObjectDataJet m_jet;//jets - public ANObjectDataCell m_lar;//lar cells - - private static AEventManager eventManager = AEventManager.instance(); - - /** - * The contract of applyLinearTransform is that you can assume - * the matrix stack is in an identity state and you should always apply - * the transformation in a relative manner, ie glTransform, glRotate - * nothing like glLoadMatrix or glLoadIdentity - * - * @param drawable - */ - public abstract void applyLinearTransform(GLAutoDrawable drawable, int w, int h); - - public abstract void drawScene(GLAutoDrawable drawable, ANRenderHints hint); - - // TODO: A lot of this function should probably be broken up into more - // subclasses to allow this functionality to be selected more - // granularly - @Override - public final void display(GLAutoDrawable drawable, int w, int h, ANRenderHints hint) { - GL gl = drawable.getGL(); - gl.glMatrixMode(GL.GL_MODELVIEW); - gl.glLoadIdentity(); - - gl.glMatrixMode(GL.GL_PROJECTION); - - // This is a bit of a hack maybe... - if (!hint.getPick()) { - gl.glLoadIdentity(); - } - - gl.glEnable(gl.GL_BLEND); - gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA); - gl.glEnable(GL.GL_DEPTH_TEST); - - gl.glPolygonOffset(2.0f, 1.0f); - gl.glEnable(GL.GL_POLYGON_OFFSET_FILL); - - applyLinearTransform(drawable, w, h); - - ANColor bg = ANColor.getBGColor(); - - gl.glClearColor(bg.r, bg.g, bg.b, 1.0f); - gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); - - drawScene(drawable, hint); - } // Some function that calls applyLinearTransform and extracts the matrix - // is needed for the transitions but that can come later... - - - // DEPRECATED - to be replaced shortly by ANObjectGenerator - public final void createGeometry(){ - ArrayList<ABoxDetector> m_boxes = new ArrayList<ABoxDetector>(); - ArrayList<ACalorimeterDetector> m_calo = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_extt = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_mbts = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_endc = new ArrayList<ACalorimeterDetector>(); - - ADetectors[] ds = AAtlasDetector.getDetector().getDetectors(); - for (int i = 0; i < ds.length; i++) { - ADetector[] d = ds[i].getDetectors(); - for (int j = 0; j < d.length; j++) { - if (d[j] instanceof ABoxDetector) { - ABoxDetector bd = (ABoxDetector) d[j]; - //TODO temporary code to show cut away detector - //if((bd.getPhi()>1.2 && bd.getPhi()<5.1) || !ACanvas.getCanvas().getPaintingWindow().getProjection().getName().equals("N3D")) - m_boxes.add(bd); - }else if (d[j] instanceof ABarrelCalorimeterDetector) { - ACalorimeterDetector cd = (ACalorimeterDetector) d[j]; - //extended tile only has one end in geom file and not relicated like others - if(d[j].getName().equals("Extended TILE")){ - m_extt.add(cd); - }else{ - m_calo.add(cd); - } - - } else if (d[j] instanceof AEndcapCryostatDetector) { - //adds MBTS but only has one end in geom file - AEndcapCryostatDetector ecd = (AEndcapCryostatDetector) d[j]; - m_mbts.add(ecd); - } else if (d[j] instanceof AEndcapCalorimeterDetector) { - //adds LAr endcap + HEC but only has one end in geom file - AEndcapCalorimeterDetector ecd = (AEndcapCalorimeterDetector) d[j]; - m_endc.add(ecd); - - } - - } - } - - m_ogm = new ANObjectGeomMuon(m_boxes); - m_ogc = new ANObjectGeomCalo(m_calo, 4, false); - m_ogetp = new ANObjectGeomCalo(m_extt, 4, false); - m_ogtsp = new ANObjectGeomCalo(m_mbts, 1, false); - m_ogecp = new ANObjectGeomCalo(m_endc, 1, false); - m_ogetm = new ANObjectGeomCalo(m_extt, 4, true); - m_ogtsm = new ANObjectGeomCalo(m_mbts, 1, true); - m_ogecm = new ANObjectGeomCalo(m_endc, 1, true); - - - } - - // DEPRECATED - to be replaced shortly by ANObjectGenerator - public final void createData(){ - - AEvent ev = eventManager.getCurrentEvent(); - AJetData ajd = ev.getJetData(); - ajd.makeDrawList(); - m_jet = new ANObjectDataJet(ajd); - - ALArData ald = ev.getLArData(); - ald.makeDrawList(); - m_lar = new ANObjectDataCell(ald); - - } - - // DEPRECATED - to be replaced shortly by ANObjectGenerator - public final void createGeometry(float phi, float eta, float dr){ - ArrayList<ABoxDetector> m_boxes = new ArrayList<ABoxDetector>(); - ArrayList<ACalorimeterDetector> m_calo = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_extt = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_mbts = new ArrayList<ACalorimeterDetector>(); - ArrayList<ACalorimeterDetector> m_endc = new ArrayList<ACalorimeterDetector>(); - - - ADetectors[] ds = AAtlasDetector.getDetector().getDetectors(); - for (int i = 0; i < ds.length; i++) { - ADetector[] d = ds[i].getDetectors(); - for (int j = 0; j < d.length; j++) { - if (d[j] instanceof ABoxDetector) { - ABoxDetector bd = (ABoxDetector) d[j]; - //code to show cut away detector - float etabd = (float) AMath.etaAbs(bd.getZMin(), bd.getRMin()); - if(AMath.deltaR(phi,eta,(float)bd.getPhi(),etabd)<dr) - m_boxes.add(bd); - }else if (d[j] instanceof ABarrelCalorimeterDetector) { - ACalorimeterDetector cd = (ACalorimeterDetector) d[j]; - //extended tile only has one end in geom file and not relicated like others - if(d[j].getName().equals("Extended TILE")){ - m_extt.add(cd); - }else{ - m_calo.add(cd); - } - - } else if (d[j] instanceof AEndcapCryostatDetector) { - //adds MBTS but only has one end in geom file - AEndcapCryostatDetector ecd = (AEndcapCryostatDetector) d[j]; - m_mbts.add(ecd); - } else if (d[j] instanceof AEndcapCalorimeterDetector) { - //adds LAr endcap + HEC but only has one end in geom file - AEndcapCalorimeterDetector ecd = (AEndcapCalorimeterDetector) d[j]; - m_endc.add(ecd); - - } - - } - } - - m_ogm = new ANObjectGeomMuon(m_boxes); - m_ogc = new ANObjectGeomCalo(m_calo, 4, false); - m_ogetp = new ANObjectGeomCalo(m_extt, 4, false); - m_ogtsp = new ANObjectGeomCalo(m_mbts, 1, false); - m_ogecp = new ANObjectGeomCalo(m_endc, 1, false); - m_ogetm = new ANObjectGeomCalo(m_extt, 4, true); - m_ogtsm = new ANObjectGeomCalo(m_mbts, 1, true); - m_ogecm = new ANObjectGeomCalo(m_endc, 1, true); - - - } - - public final void createData(float phi, float eta, float dr){ - - AEvent ev = eventManager.getCurrentEvent(); - AJetData ajd = ev.getJetData(); - ajd.makeDrawList(); - m_jet = new ANObjectDataJet(ajd, phi, eta, dr); - - ALArData ald = ev.getLArData(); - ald.makeDrawList(); - m_lar = new ANObjectDataCell((ACalorimeterData)ald, phi, eta, dr); - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANLinearTransition.java b/graphics/AtlantisJava/src/atlantis/nge/ANLinearTransition.java deleted file mode 100644 index 918caf427d84..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANLinearTransition.java +++ /dev/null @@ -1,140 +0,0 @@ -package atlantis.nge; - -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; - -/** - * - * @author Adam Davison - */ -public class ANLinearTransition extends ANLinearProjection { - - private ANLinearProjection m_a; - private ANLinearProjection m_b; - private ANAnimVar m_vtttime = new ANAnimVar(); - private ANAnimVar m_fadetime = new ANAnimVar(); - - public ANLinearTransition(ANLinearProjection a, ANLinearProjection b) { - m_a = a; - m_b = b; - } - - public ANAnimVar getTransformTimeVar() { return m_vtttime; } - public ANAnimVar getFadeTimeVar() { return m_fadetime; } - - @Override - public void applyLinearTransform(GLAutoDrawable drawable, int w, int h) { - GL gl = drawable.getGL(); - - double vtttime = m_vtttime.getValue(); - - if (vtttime < 0.0) { vtttime = 0.0; } - - if (vtttime <= 0.0f) { - m_a.applyLinearTransform(drawable, w, h); - } else if (vtttime >= 1.0f) { - m_b.applyLinearTransform(drawable, w, h); - } else { - - float[] ma = new float[16]; - float[] mb = new float[16]; - - // TODO: Make this whole thing better - // Maybe this is ok. If getFloatv is problematic we may have trouble - // but generally this allows us to transform between moving projections! - gl.glMatrixMode(GL.GL_PROJECTION); - gl.glPushMatrix(); - gl.glLoadIdentity(); - m_a.applyLinearTransform(drawable, w, h); - gl.glGetFloatv(GL.GL_PROJECTION_MATRIX, ma, 0); - gl.glLoadIdentity(); - m_b.applyLinearTransform(drawable, w, h); - gl.glGetFloatv(GL.GL_PROJECTION_MATRIX, mb, 0); - gl.glPopMatrix(); - - float[] matrix = new float[16]; - - // Scaling the matrix linearly means that x/w moves in a highly - // non-linear way, especially where large scale changes in w are - // involved, try to compensate this by using a highly non-linear - // time coordinate - - // Final solution involves inverting the formula for the transformation - // to calculate what time coordinate should be applied to ensure - // linear motion of a test eye coordinate between it's clip - // coordinates under transformation by ma and mb - // Should document the maths at some point for sanity... - - // Operating on normalised time here, length 1 - double[] zerosums = new double[4]; - double[] gradsums = new double[4]; - - for (int y = 0; y < 4; y++) { - zerosums[y] = 0.0f; - gradsums[y] = 0.0f; - for (int x = 0; x < 4; x++) { - zerosums[y] += ma[(4 * x) + y]; - gradsums[y] += mb[(4 * x) + y] - ma[(4 * x) + y]; - } - } - - double w0 = ma[3] + ma[7] + ma[11] + ma[15]; - double wT = mb[3] + mb[7] + mb[11] + mb[15]; - - double[] timeest = new double[3]; - for (int i = 0; i < 3; i++) { - // Target value of coord/w - double c0w = (ma[0 + i] + ma[4 + i] + ma[8 + i] + ma[12 + i]) / w0; - double cTw = (mb[0 + i] + mb[4 + i] + mb[8 + i] + mb[12 + i]) / wT; - // Beta is the target value for this component, this could be - // a non-linear function for smoother transitions - // i.e. something with 0 first derivative at times 0 and 1 - double beta = (c0w + ((cTw - c0w) * vtttime)); - timeest[i] = (zerosums[i] - zerosums[3] * beta) / (gradsums[3] * beta - gradsums[i]); - } - - // They seem to tend to scale similarly at the moment but this - // may fall apart for some really wierd transformation matrix... - // ... just take the mean for now and look out for problems - double meantime = (timeest[0] + timeest[1] + timeest[2]) / 3.0; - - for (int i = 0; i < 16; i++) { - matrix[i] = (float) (ma[i] + ((mb[i] - ma[i]) * meantime)); - } - - gl.glMultMatrixf(matrix, 0); - } - } - - @Override - public void drawScene(GLAutoDrawable drawable, ANRenderHints hint) { - GL gl = drawable.getGL(); - - - - if (m_fadetime.getValue() > 0.0) { - m_a.drawScene(drawable, hint); - - gl.glMatrixMode(GL.GL_PROJECTION); - gl.glPushMatrix(); - gl.glLoadIdentity(); - gl.glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - ANColor bgc = ANColor.getBGColor(); - gl.glColor4f(bgc.r, bgc.g, bgc.b, (float)(m_fadetime.getValue())); - gl.glDisable(GL.GL_DEPTH_TEST); - gl.glBegin(GL.GL_QUADS); - gl.glVertex3f(-1.0f, -1.0f, 0.0f); - gl.glVertex3f(1.0f, -1.0f, 0.0f); - gl.glVertex3f(1.0f, 1.0f, 0.0f); - gl.glVertex3f(-1.0f, 1.0f, 0.0f); - gl.glEnd(); - // FIXME: Don't always want this back on here potentially - gl.glEnable(GL.GL_DEPTH_TEST); - gl.glPopMatrix(); - gl.glClear(GL.GL_DEPTH_BUFFER_BIT); - } - - m_b.drawScene(drawable, hint); - - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANManager.java b/graphics/AtlantisJava/src/atlantis/nge/ANManager.java deleted file mode 100644 index 0b7350c29e4e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANManager.java +++ /dev/null @@ -1,122 +0,0 @@ -package atlantis.nge; - -import atlantis.canvas.AWindow; -import atlantis.utils.ALogger; -import java.util.Hashtable; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLPbuffer; - -/** - * This class keeps handy resources for you... - * - * @author Adam Davison - */ -public class ANManager implements GLEventListener { - - private static ALogger logger = ALogger.getLogger(ANManager.class); - private static ANManager manager = new ANManager(); - - public static ANManager getManager() { - return manager; - } - private Hashtable<AWindow, ANFrameManager> m_fms = null; - private GLPbuffer m_buf = null; - private GLEventListener m_gll; - - public ANManager() { - m_fms = new Hashtable<AWindow, ANFrameManager>(); - } - - public ANFrameManager getFrameManager(AWindow w) { - if (w == null) { - return null; - } - ANFrameManager fm = m_fms.get(w); - if (fm == null) { - fm = new ANFrameManager(w); - m_fms.put(w, fm); - } - return fm; - } - - public static int getNextPower2(int v) { - int p = 1; - for (int i = 0; i < 16; i++) { - p *= 2; - if (p >= v) { - return p; - } - } - - logger.warn("Returning non power of 2 buffer size!"); - return v; - } - - public void requestBufferDraw(int w, int h, GLEventListener gll) { - - if (m_buf != null && m_buf.getWidth() >= w && m_buf.getHeight() >= h) { - //System.out.println("BUFFER OK"); - // Do nothing - } else { - //System.out.println("BUFFER CREATE/REPLACE"); - if (m_buf != null) { - m_buf.destroy(); - } - - GLCapabilities pbcap = new GLCapabilities(); - pbcap.setHardwareAccelerated(true); - pbcap.setSampleBuffers(true); - pbcap.setNumSamples(4); - //pbcap.setPbufferRenderToTexture(true); - //pbcap.setDoubleBuffered(false); - - //logger.info("w: " + m_w + " 2: " + getNextPower2(m_w)); - - m_buf = GLDrawableFactory.getFactory().createGLPbuffer(pbcap, null, - getNextPower2(w), getNextPower2(h), null); - - if (m_buf == null) { - logger.error("Got null when trying to create pbuffer!"); - return; - } - - m_buf.addGLEventListener(this); - - logger.info("Created pbuffer w: " + m_buf.getWidth() + " h: " + m_buf.getHeight()); - - if (m_buf.getChosenGLCapabilities() == null) { - logger.warn("Your implementation returns null for pbuffer capabilities..."); - } else { - logger.info("Pbuffer hardware accelleration: " + m_buf.getChosenGLCapabilities().getHardwareAccelerated()); - } - } - - // Set up events to go back to the projection - m_gll = gll; - - //System.out.println("CALLING DISPLAY"); - m_buf.display(); - } - - public void init(GLAutoDrawable arg0) { - m_gll.init(arg0); - } - - public void display(GLAutoDrawable arg0) { - //System.out.println("HIT DISPLAY CALLBACK"); - m_gll.display(arg0); - } - - public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) { - m_gll.reshape(arg0, arg1, arg2, arg3, arg4); - } - - public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { - m_gll.displayChanged(arg0, arg1, arg2); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANObjectGenerator.java b/graphics/AtlantisJava/src/atlantis/nge/ANObjectGenerator.java deleted file mode 100644 index 260518afd220..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANObjectGenerator.java +++ /dev/null @@ -1,151 +0,0 @@ -package atlantis.nge; - -import atlantis.event.AEventManager; -import atlantis.data.ACalorimeterData; -import atlantis.event.AEvent; -import atlantis.data.AJetData; -import atlantis.data.ATrackData; -import atlantis.geometry.ABoxDetector; -import atlantis.nge.object.ANObject; -import atlantis.nge.object.ANObjectList; -import atlantis.nge.object.data.ANObjectPointing; -import atlantis.nge.object.data.ANObjectTracks; -import atlantis.nge.object.geometry.ANObjectGeomMuon; -import atlantis.utils.ALogger; -import atlantis.utils.AMath; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.List; - -/** - * These things get arrays of ANObjects out of the Atlantis data store - * - * The general idea is to separate the selection of objects from the way - * they're represented in the projection. But I suspect that'll break down - * - * For now it's a static object but if we ever want to unstatic it then it's - * only accessible via getGenerator() so it should be easy to refactor - * - * A lot of the functionality should one day be pushed back into the detector - * objects themselves - * - * @author Adam Davison - */ -public class ANObjectGenerator { - - private static ALogger logger = ALogger.getLogger(ANObjectGenerator.class); - private static AEventManager eventManager = AEventManager.instance(); - - private static ANObjectGenerator thegenerator = new ANObjectGenerator(); - - private ANObjectGenerator() { - } - - public static ANObjectGenerator getGenerator() { - return thegenerator; - } - - public ANObject getGeometryMuon() { - return new ANObjectGeomMuon(ANTerribleHacks.getMuonDetectors()); - } - - // Ideally change layout of detector stuff so this can be more generic - // not like one search per type, since basically everything has eta/phi - public ANObject getGeometryMuon(float phi, float eta, float dr) { - ArrayList<ABoxDetector> boxes = ANTerribleHacks.getMuonDetectors(); - ArrayList<ABoxDetector> hits = new ArrayList<ABoxDetector>(); - - for (int i = 0; i < boxes.size(); i++) { - ABoxDetector bd = boxes.get(i); - // TODO - This formula is wrong, it's only checking one corner - float etabd = (float) AMath.etaAbs(bd.getZMin(), bd.getRMin()); - if (AMath.deltaR(phi, eta, (float) bd.getPhi(), etabd) < dr) { - hits.add(bd); - } - } - - return new ANObjectGeomMuon(hits); - } - - public ANObject getDataCaloForJet(int j, String key) { - - ANObjectList ol = new ANObjectList(); - - AEvent ev = eventManager.getCurrentEvent(); - AJetData jd = ev.getJetData(); - String assockey = jd.getFullName(); - int[][] assoc = ev.getAssociationManager().get(assockey, key); - if (assoc == null) { return ol; } - if (assoc[j] == null) { return ol; } - int[] dl = new int[assoc[j].length]; - List calolist = ev.getCalorimeters(); - ACalorimeterData calo = null; - for (int i = 0; i < calolist.size(); i++) { - ACalorimeterData tc = (ACalorimeterData)(calolist.get(i)); - if (tc.getName().equals(key)) { - calo = tc; - } - } - if (calo == null) { - logger.error("Requested unavailable calo key!"); - return ol; - } - - calo.makeDrawList(); - int[] calodl = calo.getDrawList(); - - IntBuffer ib = IntBuffer.allocate(assoc[j].length); - for (int i = 0; i < assoc[j].length; i++) { - int id = assoc[j][i]; - int index = calo.getIndexFromId(id); - boolean found = false; - for (int d = 0; d < calo.getNumDraw(); d++) { - if (calodl[d] == index) { - found = true; - } - } - if (found) { - ib.put(index); - } - } - - ol.addObject(new ANObjectPointing(calo, ib.array(), ib.position(), true)); - ol.addObject(new ANObjectPointing(calo, ib.array(), ib.position(), false)); - - return ol; - } - - public ANObject getInDetTracksForJet(int j) { - AEvent ev = eventManager.getCurrentEvent(); - AJetData jd = ev.getJetData(); - int jetid = jd.getIdFromIndex(j); - ATrackData tracks = ev.getTrackData("InDetTrack"); - int[] trackdl = tracks.getDrawList(); - String jetassockey = jd.getFullName(); - String trackassockey = tracks.getName() + tracks.getStoreGateKey(); - int[][] assoc = ev.getAssociationManager().get(trackassockey, jetassockey); - - IntBuffer ib = IntBuffer.allocate(assoc.length); - for (int i = 0; i < assoc.length; i++) { - for (int s = 0; s < assoc[i].length; s++) { - if (assoc[i][s] == jetid) { - boolean display = false; - for (int d = 0; d < trackdl.length; d++) { - if (trackdl[d] == i) { - display = true; - } - } - if (display) {ib.put(i);} - } - } - } - - return new ANObjectTracks(tracks, ib.array()); - } - - public ANObject getInDetTracks() { - AEvent ev = eventManager.getCurrentEvent(); - ATrackData td = ev.getTrackData("InDetTrack"); - return new ANObjectTracks(td); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickDrawer.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickDrawer.java deleted file mode 100644 index 938f0a4f3707..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickDrawer.java +++ /dev/null @@ -1,59 +0,0 @@ -package atlantis.nge; - -import atlantis.canvas.AWindow; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; - -/** - * - * @author Adam Davison - */ -public class ANPickDrawer implements GLEventListener { - - private AWindow m_window; - private int m_w; - private int m_h; - private int m_x; - private int m_y; - - private ANPickResult m_pr; - private boolean m_pickdone; - - private ANPickListener m_pl; - - public ANPickDrawer(AWindow window, int w, int h, int x, int y, ANPickListener pl) { - m_window = window; - m_w = w; - m_h = h; - m_x = x; - m_y = y; - m_pickdone = false; - m_pl = pl; - } - - public void doPick() { - ANManager.getManager().requestBufferDraw(m_w, m_h, this); - } - - public void init(GLAutoDrawable arg0) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void display(GLAutoDrawable arg0) { - m_pr = ANManager.getManager().getFrameManager(m_window).pick(arg0, m_w, m_h, m_x, m_y); - m_pickdone = true; - - if (m_pl != null) { - m_pl.pickCompleted(m_pr); - } - } - - public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { - //throw new UnsupportedOperationException("Not supported yet."); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickHandler.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickHandler.java deleted file mode 100644 index baaeb581efe6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public interface ANPickHandler { - - // Turn your 32 bits of data into a result somehow - public ANPickResult getHitInfo(int data); -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickHandlerSimple.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickHandlerSimple.java deleted file mode 100644 index 7b1f713e79eb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickHandlerSimple.java +++ /dev/null @@ -1,19 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public class ANPickHandlerSimple implements ANPickHandler { - - private String m_name; - - public ANPickHandlerSimple(String name) { - m_name = name; - } - - public ANPickResult getHitInfo(int data) { - return new ANPickResult(m_name); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickHelper.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickHelper.java deleted file mode 100644 index e8912acfdf97..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package atlantis.nge; - -import atlantis.nge.object.ANObject; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import javax.media.opengl.GL; - -/** - * - * @author Adam Davison - */ -public class ANPickHelper { - - private ArrayList<ANObject> m_all = new ArrayList<ANObject>(); - private GL m_gl; - - public ANPickHelper(GL gl) { - m_gl = gl; - } - - public ANPickHandler getPickHandler(int id) { - System.out.println(m_all.get(id)); - return m_all.get(id).getPickHandler(); - } - - public int getIndex(ANObject p) { - int id = m_all.indexOf(p); - - if (id == -1) { - m_all.add(p); - id = m_all.indexOf(p); - } - - return id; - } - - // Worry about it being fast much later... - public void startPick(ANObject p, int data) { - startPick(getIndex(p), data); - } - - public void startPick(int pickid, int data) { - m_gl.glPushName(pickid); - m_gl.glPushName(data); - } - - public void endPick() { - m_gl.glPopName(); - m_gl.glPopName(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickListener.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickListener.java deleted file mode 100644 index f7a118143faf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickListener.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package atlantis.nge; - -/** - * - * @author Adam - */ -public interface ANPickListener { - - public void pickCompleted(ANPickResult pr); -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickResult.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickResult.java deleted file mode 100644 index d1d05d7efcfa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickResult.java +++ /dev/null @@ -1,21 +0,0 @@ -package atlantis.nge; - -/** - * This class encapsulates all the information you might want to get out of a - * pick interaction and back into Atlantis - * - * @author Adam Davison - */ -public class ANPickResult { - - private String m_result; - - public ANPickResult(String result) { - m_result = result; - } - - public String getResult() { - return m_result; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANPickResultPrinter.java b/graphics/AtlantisJava/src/atlantis/nge/ANPickResultPrinter.java deleted file mode 100644 index 1b28bd2a45e8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANPickResultPrinter.java +++ /dev/null @@ -1,17 +0,0 @@ -package atlantis.nge; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; - -/** - * - * @author Adam Davison - */ -public class ANPickResultPrinter implements ANPickListener { - - public void pickCompleted(ANPickResult pr) { - if (pr != null) { - AOutput.append("Picked: " + pr.getResult() + "\n\n", ALogInterface.PICK); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANProjection.java b/graphics/AtlantisJava/src/atlantis/nge/ANProjection.java deleted file mode 100644 index f49fb76086be..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANProjection.java +++ /dev/null @@ -1,20 +0,0 @@ -package atlantis.nge; - -import javax.media.opengl.GLAutoDrawable; - -/** - * So this class represents a projection, which in this model is the class - * that decides what objects to draw and how to draw them - * - * It is controlled by the ANFrameManager which tells it what to do. - * - * It shouldn't touch the Atlantis core at all. It gets ANObjects from an - * ANObjectGenerator which is can then render in any order it chooses into a - * renderer it can configure in any way it likes. - * - * @author Adam Davison - */ -public abstract class ANProjection { - - public abstract void display(GLAutoDrawable drawable, int w, int h, ANRenderHints hint); -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANProjection3D.java b/graphics/AtlantisJava/src/atlantis/nge/ANProjection3D.java deleted file mode 100644 index 954f0ead4457..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANProjection3D.java +++ /dev/null @@ -1,90 +0,0 @@ -package atlantis.nge; - -import atlantis.nge.object.ANObjectTestAxes; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; - -import atlantis.parameters.APar; - -/** - * The plain 3d projection, simple for debugging - * - * @author Adam Davison, Mark Stockton - */ -public class ANProjection3D extends ANLinearProjection { - - - private float m_phi; - private float m_elev; - private float m_distance; - private float m_tx, m_ty, m_tz; - - public ANProjection3D() { - - m_phi = -45.0f; - m_elev = 20.0f; - m_distance = 3000.0f; - m_tx = 0.0f; - m_ty = 0.0f; - m_tz = 0.0f; - - // create the object generator here - } - - @Override - public void applyLinearTransform(GLAutoDrawable drawable, int width, int height) { - GL gl = drawable.getGL(); - - float w = 1000.0f; - float h = (w * drawable.getHeight()) / drawable.getWidth(); - - gl.glFrustum(-w, w, -h, h, 1000.0f, 10000.0f); - - // Remember, these are in reverse so essentially: - // 0. GL default, start at 0,0,-1 looking at 0,0,0 - // 1. Spin around y axis to give phi - // 2. Spin around x axis to give elevation - // 3. Pull back to give distance - gl.glTranslatef(0.0f, 0.0f, -m_distance); - gl.glRotatef(m_elev, 1.0f, 0.0f, 0.0f); - gl.glRotatef(m_phi, 0.0f, 1.0f, 0.0f); - gl.glTranslatef(-m_tx, -m_ty, -m_tz); - } - - @Override - public void drawScene(GLAutoDrawable drawable, ANRenderHints hint) { - ANRenderer r = new ANRendererBasic(drawable); - if(APar.instance().get("N3D","Axis").getStatus()){ - ANObjectTestAxes ota = new ANObjectTestAxes(); - ota.render(r, hint); - } - - if (m_ogm == null) { - //m_ogm = new ANObjectGeom(); - createGeometry(); - } - - m_ogm.render(r, hint); - m_ogc.render(r, hint); - m_ogetp.render(r, hint); - m_ogecp.render(r, hint); - m_ogtsp.render(r, hint); - m_ogetm.render(r, hint); - m_ogecm.render(r, hint); - m_ogtsm.render(r, hint); - - createData(); - m_jet.render(r, hint); - - } - - public void dPhi(float phi) { - m_phi += phi; - } - - public void dElev(float elev) { - m_elev += elev; - if (m_elev < -90.0f) { m_elev = -90.0f; } - if (m_elev > 90.0f) { m_elev = 90.0f; } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANProjectionPhysics.java b/graphics/AtlantisJava/src/atlantis/nge/ANProjectionPhysics.java deleted file mode 100644 index 47e95f65d9f9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANProjectionPhysics.java +++ /dev/null @@ -1,181 +0,0 @@ -package atlantis.nge; - -import atlantis.event.AData; -import atlantis.data.AJetData; -import atlantis.nge.object.ANObjectTestAxes; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; - -import atlantis.parameters.APar; -import atlantis.utils.A3Vector; -import atlantis.utils.AMath; -import javax.media.opengl.glu.GLU; - -/** - * The plain 3d projection, simple for debugging - * - * @author Adam Davison, Mark Stockton - */ -public class ANProjectionPhysics extends ANLinearProjection { - - private float m_focus_phi; - private float m_focus_eta; - private ANAnimVar m_phi; - private ANAnimVar m_elev; - private float m_distance; - private float m_tx, m_ty, m_tz; - private AData m_data; - private int m_data_index; - - public ANProjectionPhysics() { - - m_focus_phi = 0; - m_focus_eta = 0; - m_phi = new ANAnimVar(-45.0); - m_elev = new ANAnimVar(20.0); - m_distance = 2000.0f; - m_tx = 0.0f; - m_ty = 0.0f; - m_tz = 0.0f; - - - // create the object generator here - } - - @Override - public void applyLinearTransform(GLAutoDrawable drawable, int w, int h) { - GL gl = drawable.getGL(); - - //float w = 1000.0f; - //float h = (w * drawable.getHeight()) / drawable.getWidth(); - - //gl.glFrustum(-w, w, -h, h, 1000.0f, 10000.0f); - GLU glu = new GLU(); - glu.gluPerspective(7.0f, w / h, 200.0f, 10000.0f); - - /*gl.glTranslatef(0.0f, 0.0f, -2000.0f); - gl.glRotatef(m_elev, 1.0f, 0.0f, 0.0f); - gl.glRotatef(m_phi, 0.0f, 1.0f, 0.0f); - gl.glRotatef(m_focus_phi, 0.0f, 0.0f, 1.0f); - gl.glRotatef(-theta, 0.0f, 1.0f, 0.0f); - gl.glTranslatef(0.0f, 0.0f, 500.0f); - gl.glRotatef(theta, 0.0f, 1.0f, 0.0f); - gl.glRotatef(-m_focus_phi, 0.0f, 0.0f, 1.0f);*/ - // Remember, these are in reverse so essentially: - // 0. GL default, start at 0,0,-1 looking at 0,0,0 - // 1. Spin around y axis to give phi - // 2. Spin around x axis to give elevation - // 3. Pull back to give distance - gl.glTranslatef(0.0f, 0.0f, -m_distance); - gl.glRotatef((float) m_elev.getValue(), 1.0f, 0.0f, 0.0f); - gl.glRotatef((float) m_phi.getValue(), 0.0f, 1.0f, 0.0f); - gl.glTranslatef(-m_tx, -m_ty, -m_tz); - - - } - - @Override - public void drawScene(GLAutoDrawable drawable, ANRenderHints hint) { - ANRenderer r = new ANRendererBasic(drawable); - - GL gl = drawable.getGL(); - gl.glColor3f(1.0f, 0.0f, 0.0f); - gl.glPointSize(2.0f); - gl.glBegin(GL.GL_POINTS); - gl.glVertex3f(m_tx, m_ty, m_tz); - gl.glEnd(); - - if (APar.instance().get("NPhysics", "Axis").getStatus()) { - ANObjectTestAxes ota = new ANObjectTestAxes(); - ota.render(r, hint); - } - - //ANObjectGenerator.getGenerator() - // .getGeometryMuon(m_focus_phi, m_focus_eta, 1.0f).render(r, pick); - //.getGeometryMuon().render(r, pick); - - ANObjectGenerator.getGenerator().getDataCaloForJet(m_data_index, "LAr").render(r, hint); - ANObjectGenerator.getGenerator().getDataCaloForJet(m_data_index, "TILE").render(r, hint); - ANObjectGenerator.getGenerator().getDataCaloForJet(m_data_index, "HEC").render(r, hint); - //ANObjectGenerator.getGenerator().getDataCaloForJet(m_data_index, "FCAL").render(r, pick); - ANObjectGenerator.getGenerator().getInDetTracksForJet(m_data_index).render(r, hint); - - //createGeometry(m_focus_phi, m_focus_eta, 1.0f); - //m_ogm.render(r, pick); - /*m_ogc.render(r); - m_ogetp.render(r); - m_ogecp.render(r); - m_ogtsp.render(r); - m_ogetm.render(r); - m_ogecm.render(r); - m_ogtsm.render(r);*/ - - //createData(m_focus_phi, m_focus_eta, 2.0f); - //m_jet.render(r, pick); - //m_lar.render(r, pick); - - } - - public void dPhi(float phi) { - m_phi.setValue(m_phi.getValue() + phi); - } - - public void dElev(float elev) { - m_elev.setValue(m_elev.getValue() + elev); - if (m_elev.getValue() < -90.0) { - m_elev.setValue(-90.0); - } - if (m_elev.getValue() > 90.0) { - m_elev.setValue(90.0); - } - } - - public void lookAt(AJetData jd, int jet_index) { - - m_data = jd; - m_data_index = jet_index; - - A3Vector centre = ANTerribleHacks.getCellCentreLArForJet(jet_index); - m_tx = (float) centre.x; - m_ty = (float) centre.y; - m_tz = (float) centre.z; - - float phi = jd.getPhi(jet_index); - float eta = jd.getEta(jet_index); - - m_focus_phi = phi; - m_focus_eta = eta; - - // m_elev is Spin around y axis to give phi - // m_phi is Spin around x axis to give elevation - float theta = (float) (2.0f * Math.atan(Math.exp(eta))); - theta = (float) Math.toDegrees(theta); - phi = (float) Math.toDegrees(phi); - - //produce coords to try to look perpendicular to jet - //needs improving - if (eta < 0) { - eta = -1; - } else { - eta = 1; - } - float x = (float) (m_distance * Math.cos(phi) * Math.sin(theta)); - float z = (float) (m_distance * Math.cos(theta)); - - float rot = (float) Math.toDegrees(Math.atan(z / x)); - - if (theta < 90) { - m_elev.setValue(eta * -theta); - m_phi.setValue(rot); - } else { - m_elev.setValue(eta * (180. - theta)); - m_phi.setValue(rot - 45.); - } - //actually dont need to set melev - m_elev.setValue(0); - - } - - public ANAnimVar getElevVar() { return m_elev; } - public ANAnimVar getPhiVar() { return m_phi; } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANProjectionYX.java b/graphics/AtlantisJava/src/atlantis/nge/ANProjectionYX.java deleted file mode 100644 index 6ca68b65f10f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANProjectionYX.java +++ /dev/null @@ -1,46 +0,0 @@ -package atlantis.nge; - -import atlantis.nge.object.ANObjectTestAxes; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; - -import atlantis.parameters.APar; - -/** - * - * @author Adam Davison, Mark Stockton - */ -public class ANProjectionYX extends ANLinearProjection { - - - @Override - public void applyLinearTransform(GLAutoDrawable drawable, int w, int h) { - GL gl = drawable.getGL(); - - gl.glMatrixMode(GL.GL_PROJECTION); - float scale = ((float) drawable.getHeight()) / ((float) drawable.getWidth()); - gl.glOrtho(-1500.0f, 1500.0f, -1500.0f * scale, 1500.0f * scale, -100000.0f, 100000.0f); - } - - @Override - public void drawScene(GLAutoDrawable drawable, ANRenderHints hint) { - ANRenderer r = new ANRendererBasic(drawable); - if(APar.instance().get("NYX","Axis").getStatus()){ - ANObjectTestAxes ota = new ANObjectTestAxes(); - ota.render(r, hint); - } - - if (m_ogm == null) { - //m_ogm = new ANObjectGeomMuon(); - createGeometry(); - } - - m_ogm.render(r, hint); - - m_ogc.render(r, hint); - - createData(); - m_jet.render(r, hint); - m_lar.render(r, hint); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANRenderHints.java b/graphics/AtlantisJava/src/atlantis/nge/ANRenderHints.java deleted file mode 100644 index c370fdf3a98a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANRenderHints.java +++ /dev/null @@ -1,33 +0,0 @@ -package atlantis.nge; - -/** - * - * @author Adam Davison - */ -public class ANRenderHints { - - private boolean pick; - private ANPickHelper pickHelper; - - public ANRenderHints() { - pick = false; - pickHelper = null; - } - - public ANPickHelper getPickHelper() { - return pickHelper; - } - - public void setPickHelper(ANPickHelper pickHelper) { - this.pickHelper = pickHelper; - } - - public boolean getPick() { - return pick; - } - - public void setPick(boolean pick) { - this.pick = pick; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANRenderer.java b/graphics/AtlantisJava/src/atlantis/nge/ANRenderer.java deleted file mode 100644 index 918179874077..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANRenderer.java +++ /dev/null @@ -1,22 +0,0 @@ -package atlantis.nge; - -/** - * This class provides an interface for drawing into a context of some kind - * essentially it's a drawing API, much like java.awt.Graphics but rather - * tuned towards drawing 3-d objects via OpenGL - * - * @author Adam Davison - */ -public abstract class ANRenderer { - - public abstract void begin(int type); - public abstract void end(); - - public abstract void vertex3f(float x, float y, float z); - public abstract void color3f(float r, float g, float b); - public abstract void color4f(float r, float g, float b, float a); - public abstract void lineWidth(float w); - - public abstract void drawVertices(float[] vert); - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANRendererBasic.java b/graphics/AtlantisJava/src/atlantis/nge/ANRendererBasic.java deleted file mode 100644 index c0895accf383..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANRendererBasic.java +++ /dev/null @@ -1,88 +0,0 @@ -package atlantis.nge; - -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.glu.GLU; - -/** - * - * @author Adam Davison - */ -public class ANRendererBasic extends ANRenderer { - - private GLAutoDrawable m_drawable; - private GL m_gl; - - public ANRendererBasic(GLAutoDrawable drawable) { - m_drawable = drawable; - m_gl = drawable.getGL(); - } - - @Override - public void begin(int type) { - m_gl.glBegin(type); - } - - @Override - public void end() { - m_gl.glEnd(); - } - - @Override - public void drawVertices(float[] vert) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void vertex3f(float x, float y, float z) { - // if (m_btesting) { - // doBoundTest(x, y, z); - // } - - m_gl.glVertex3f(x, y, z); - } - - @Override - public void color3f(float r, float g, float b) { - m_gl.glColor3f(r, g, b); - } - - @Override - public void lineWidth(float w) { - m_gl.glLineWidth(w); - } - - @Override - public void color4f(float r, float g, float b, float a) { - m_gl.glColor4f(r, g, b, a); - } - -/* private float[] m_tmat = new float[16]; - private float m_minx; - private float m_maxx; - private float m_miny; - private float m_maxy; - - private boolean m_btesting = false; - - public void beginBoundsTest() { - // This function assumes no new transformations take place - // So bear that in mind... - - m_gl.glGetFloatv(GL.GL_MODELVIEW_MATRIX, m_tmat, 0); - m_minx = Float.MAX_VALUE; - m_maxx = Float.MIN_VALUE; - m_miny = Float.MAX_VALUE; - m_maxy = Float.MIN_VALUE; - - m_btesting = true; - } - - public void stopBoundsTest() { - m_btesting = false; - } - - private void doBoundTest(float x, float y, float z) { - - }*/ -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANSelectionList.java b/graphics/AtlantisJava/src/atlantis/nge/ANSelectionList.java deleted file mode 100644 index 52e404eda2a1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANSelectionList.java +++ /dev/null @@ -1,81 +0,0 @@ -package atlantis.nge; - -import java.nio.IntBuffer; - -/** - * - * @author Adam Davison - */ -public class ANSelectionList { - - private long[] m_zmax; - private long[] m_zmin; - private int[][] m_names; - private int m_ent; - - public ANSelectionList(IntBuffer ib) { - int s = ib.limit(); - // Shortest possible entry is 4 ints long, could two pass to get - // memory requirements right but better to just spend a few bytes - int maxent = s/4; - m_zmax = new long[maxent]; - m_zmin = new long[maxent]; - m_names = new int[maxent][]; - - /*for (int i = 0; i < 20; i++) { - System.out.print(":" + ib.get(i)); - } - System.out.println();*/ - - m_ent = 0; - int pos = 0; - while((pos = processEntry(ib, pos, m_ent)) != -1) { - m_ent++; - } - //System.out.println("Got " + m_ent + " entries in selection list"); - } - - private int processEntry(IntBuffer ib, int pos, int ent) { - //System.out.println("Processing at " + pos + " entry " + ent); - int nn = ib.get(pos); - //System.out.println("nn: " + nn); - if (nn == 0) { - // At the end - return -1; - } - m_zmin[ent] = getUnsigned(ib.get(pos+1)); - m_zmax[ent] = getUnsigned(ib.get(pos+2)); - m_names[ent] = new int[nn]; - for (int i = 0; i < nn; i++) { - m_names[ent][i] = ib.get(pos+3+i); - //System.out.println("Name " + i + " is " + m_names[ent][i]); - } - pos += 3 + nn; - return pos; - } - - public long getUnsigned(int a) { - long b = a; - if (b < 0) { b -= 2L*(long)Integer.MIN_VALUE; } - return b; - } - - public int[] getFrontID() { - int found = -1; - long max = Long.MIN_VALUE; - for (int i = 0; i < m_ent; i++) { - System.out.println(m_zmax[i] + ":" + max); - if (m_zmax[i] > max) { - max = m_zmax[i]; - found = i; - } - } - - System.out.println(found); - if (found == -1) { - return null; - } else { - return m_names[found]; - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANTerribleHacks.java b/graphics/AtlantisJava/src/atlantis/nge/ANTerribleHacks.java deleted file mode 100644 index 1fd1b1c106ab..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANTerribleHacks.java +++ /dev/null @@ -1,119 +0,0 @@ -package atlantis.nge; - -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.data.AJetData; -import atlantis.data.ALArData; -import atlantis.geometry.AAtlasDetector; -import atlantis.geometry.ABarrelCalorimeterDetector; -import atlantis.geometry.ABoxDetector; -import atlantis.geometry.ACalorimeterDetector; -import atlantis.geometry.ADetector; -import atlantis.geometry.ADetectors; -import atlantis.geometry.AEndcapCalorimeterDetector; -import atlantis.geometry.AEndcapCryostatDetector; -import atlantis.utils.A3Vector; -import java.util.ArrayList; - -/** - * This class encapsulates everything that we shouldn't have to do in one place - * - * Mainly it relates to the fact that there's no way to ask the detector - * store for something like the muon geometry only at the moment - * - * One day if we really use this code then we need to add sensible access - * methods like that to the detector store - * - * This class should definitely be deleted one day - * - * @author Adam Davison - */ -public class ANTerribleHacks { - - private static ArrayList<ABoxDetector> m_boxes = null; - private static ArrayList<ACalorimeterDetector> m_calo = null; - private static ArrayList<ACalorimeterDetector> m_extt = null; - private static ArrayList<ACalorimeterDetector> m_mbts = null; - private static ArrayList<ACalorimeterDetector> m_endc = null; - - public static ArrayList<ABoxDetector> getMuonDetectors() { - if (m_boxes == null) { - fillArrays(); - } - return m_boxes; - } - - private static void fillArrays() { - m_boxes = new ArrayList<ABoxDetector>(); - m_calo = new ArrayList<ACalorimeterDetector>(); - m_extt = new ArrayList<ACalorimeterDetector>(); - m_mbts = new ArrayList<ACalorimeterDetector>(); - m_endc = new ArrayList<ACalorimeterDetector>(); - - ADetectors[] ds = AAtlasDetector.getDetector().getDetectors(); - for (int i = 0; i < ds.length; i++) { - ADetector[] d = ds[i].getDetectors(); - for (int j = 0; j < d.length; j++) { - if (d[j] instanceof ABoxDetector) { - ABoxDetector bd = (ABoxDetector) d[j]; - //TODO temporary code to show cut away detector - //if((bd.getPhi()>1.2 && bd.getPhi()<5.1) || !ACanvas.getCanvas().getPaintingWindow().getProjection().getName().equals("N3D")) - m_boxes.add(bd); - } else if (d[j] instanceof ABarrelCalorimeterDetector) { - ACalorimeterDetector cd = (ACalorimeterDetector) d[j]; - //extended tile only has one end in geom file and not relicated like others - if (d[j].getName().equals("Extended TILE")) { - m_extt.add(cd); - } else { - m_calo.add(cd); - } - - } else if (d[j] instanceof AEndcapCryostatDetector) { - //adds MBTS but only has one end in geom file - AEndcapCryostatDetector ecd = (AEndcapCryostatDetector) d[j]; - m_mbts.add(ecd); - } else if (d[j] instanceof AEndcapCalorimeterDetector) { - //adds LAr endcap + HEC but only has one end in geom file - AEndcapCalorimeterDetector ecd = (AEndcapCalorimeterDetector) d[j]; - m_endc.add(ecd); - - } - - } - } - } - - public static A3Vector getCellCentreLArForJet(int j) { - float xsum = 0.0f; - float ysum = 0.0f; - float zsum = 0.0f; - int count = 0; - AEvent ev = AEventManager.instance().getCurrentEvent(); - AJetData jd = ev.getJetData(); - String assockey = jd.getFullName(); - int[][] assoc = ev.getAssociationManager().get(assockey, "LAr"); - int[] dl = new int[assoc[j].length]; - ALArData calo = ev.getLArData(); - for (int i = 0; i < assoc[j].length; i++) { - int index = calo.getIndexFromId(assoc[j][i]); - float eta = (float) (calo.getEta(index)); - - float theta = (float) (2.0f * Math.atan(Math.exp(-eta))); - - float phi = (float) (calo.getPhi(index)); - - float rmin = (float) calo.getDetector(index).getRMin(); - float rmax = (float) calo.getDetector(index).getRMax(); - float r = 0.5f * (rmin + rmax); - - xsum += (float) (r * Math.cos(phi)); - ysum += (float) (r * Math.sin(phi)); - zsum += (float) (r / Math.tan(theta)); - count++; - } - - - - return new A3Vector(xsum / count, ysum / count, zsum / count); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/ANTestWindow.java b/graphics/AtlantisJava/src/atlantis/nge/ANTestWindow.java deleted file mode 100644 index f4340ca844e6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/ANTestWindow.java +++ /dev/null @@ -1,119 +0,0 @@ -package atlantis.nge; - -import com.sun.opengl.util.Screenshot; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.util.Random; -import javax.media.opengl.GL; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLPbuffer; -import javax.swing.JComponent; -import javax.swing.JFrame; - -/** - * The ubiquitous test window class... - * - * @author Adam Davison - */ -public class ANTestWindow implements GLEventListener { - - private Random m_r = new Random(); - - private int m_h = 400; - private int m_w = 400; - - private JFrame m_f; - private BufferedImage m_img; - - private ANFrameManager m_fm; - - private GLPbuffer m_context; - - public ANTestWindow() { - m_f = new JFrame("Happy Time!"); - m_f.setBounds(100, 100, m_w, m_h); - - TestComponent tc = new TestComponent(this); - - m_f.add(tc); - - GLCapabilities pbcap = new GLCapabilities(); - pbcap.setSampleBuffers(true); - pbcap.setNumSamples(4); - //pbcap.setPbufferRenderToTexture(true); - //pbcap.setDoubleBuffered(false); - m_context = GLDrawableFactory.getFactory().createGLPbuffer(pbcap, null, m_w, m_h, null); - m_context.addGLEventListener(this); - - m_fm = new ANFrameManager(null); - - m_f.setVisible(true); - - //(new Thread(new TimingThread(tc))).start(); - } - - public void causeRepaint(Graphics g) { - m_context.display(); - g.drawImage(m_img, 0, 0, null); - } - - public void init(GLAutoDrawable arg0) { - } - - public void display(GLAutoDrawable arg0) { - //m_fm.display(arg0); - m_img = Screenshot.readToBufferedImage(m_w, m_h); - } - - public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) { - } - - public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { - throw new UnsupportedOperationException("Not supported yet."); - } - -} - -class TestComponent extends JComponent { - private ANTestWindow m_parent; - - public TestComponent(ANTestWindow parent) { - m_parent = parent; - } - - @Override - protected void paintComponent(Graphics g) { - m_parent.causeRepaint(g); - } - -} - -class TimingThread implements Runnable { - private JComponent m_parent; - - private long m_sum; - private int m_count; - - public TimingThread(JComponent parent) { - m_parent = parent; - } - - public void run() { - m_sum = 0; - m_count = 0; - try { - Thread.sleep(5000); - } catch (Exception e) {} - for (int i = 0; i < 100; i++) { - long before = System.nanoTime(); - m_parent.paintImmediately(0, 0, m_parent.getWidth(), m_parent.getHeight()); - long after = System.nanoTime(); - m_sum += after - before; - m_count++; - } - System.out.println("Mean time: " + m_sum/m_count + "ns"); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/ANObject.java b/graphics/AtlantisJava/src/atlantis/nge/object/ANObject.java deleted file mode 100644 index 944c3c461b9c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/ANObject.java +++ /dev/null @@ -1,27 +0,0 @@ -package atlantis.nge.object; - -import atlantis.nge.*; - -/** - * An ANObject is the superclass of anything which knows how to draw itself - * using an ANRenderer - * - * Specifically these will tend to represent some kind of visual onscreen - * element and will contain all the information required to draw the - * representation - * - * @author Adam Davison - */ -public abstract class ANObject { - - public abstract void render(ANRenderer r, ANRenderHints hint); - - private ANPickHandler m_ph = null; - protected void setPickHandler(ANPickHandler ph) { - m_ph = ph; - } - - public ANPickHandler getPickHandler() { - return m_ph; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectList.java b/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectList.java deleted file mode 100644 index 7e79f7f10e5d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectList.java +++ /dev/null @@ -1,30 +0,0 @@ -package atlantis.nge.object; - -import atlantis.nge.ANRenderHints; -import atlantis.nge.ANRenderer; -import java.util.ArrayList; - -/** - * A composite object, of course these can be nested to make trees of objects - * - * @author Adam Davison - */ -public class ANObjectList extends ANObject { - - private ArrayList<ANObject> m_list; - - public ANObjectList() { - m_list = new ArrayList<ANObject>(); - } - - public void addObject(ANObject o) { - m_list.add(o); - } - - public void render(ANRenderer r, ANRenderHints hint) { - for (int i = 0; i < m_list.size(); i++) { - m_list.get(i).render(r, hint); - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectTestAxes.java b/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectTestAxes.java deleted file mode 100644 index c32ad4e2fec9..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectTestAxes.java +++ /dev/null @@ -1,44 +0,0 @@ -package atlantis.nge.object; - -import atlantis.nge.*; -import javax.media.opengl.GL; - -/** - * A simple test object - * - * @author Adam Davison, Mark Stockton - */ -public class ANObjectTestAxes extends ANObject { - - public ANObjectTestAxes() { - - } - - @Override - public void render(ANRenderer r, ANRenderHints hint) { - - r.lineWidth(2.0f); - - // x - r.color3f(1.0f, 0.0f, 0.0f); - r.begin(GL.GL_LINES); - r.vertex3f(0.0f, 0.0f, 0.0f); - r.vertex3f(1500.0f, 0.0f, 0.0f); - r.end(); - - // y - r.color3f(0.0f, 1.0f, 0.0f); - r.begin(GL.GL_LINES); - r.vertex3f(0.0f, 0.0f, 0.0f); - r.vertex3f(0.0f, 1500.0f, 0.0f); - r.end(); - - // z - r.color3f(0.0f, 0.0f, 1.0f); - r.begin(GL.GL_LINES); - r.vertex3f(0.0f, 0.0f, 0.0f); - r.vertex3f(0.0f, 0.0f, 1500.0f); - r.end(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectVL.java b/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectVL.java deleted file mode 100644 index 091ac5ffb58a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/ANObjectVL.java +++ /dev/null @@ -1,66 +0,0 @@ -package atlantis.nge.object; - -import atlantis.nge.*; - -/** - * An object which draws from a vertex list - * - * @author Adam Davison - */ -public abstract class ANObjectVL extends ANObject { - - public abstract float[][] getVertices(); - - public abstract int[] getPrimTypes(); - - // What the hell is this? - public final int DRAW_LINE=-9; - - public ANColor getColor(int i) { - return new ANColor(1.0f, 0.0f, 0.0f, 1.0f); - } - - /** - * This function is like the software equivalent of just dumping a block - * of vertex information in GL 3.1... - * @param r - * @param hint - */ - @Override - public void render(ANRenderer r, ANRenderHints hint) { - r.lineWidth(1.5f); - - int pid = -1; - ANPickHelper ph = null; - if (hint.getPick()) { - ph = hint.getPickHelper(); - pid = ph.getIndex(this); - } - - int[] pt = getPrimTypes(); - float[][] v = getVertices(); - - if (pt == null) { - return; - } - - for (int i = 0; i < pt.length; i++) { - if (hint.getPick()) { - ph.startPick(pid, i); - } - - ANColor c = getColor(i); - r.color4f(c.r, c.g, c.b, c.a); - r.begin(pt[i]); - for (int j = 0; j < v[i].length; j+=3) { - r.vertex3f(v[i][j], v[i][j+1], v[i][j+2]); - } - r.end(); - - if (hint.getPick()) { - ph.endPick(); - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataCell.java b/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataCell.java deleted file mode 100644 index 410ea527370b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataCell.java +++ /dev/null @@ -1,170 +0,0 @@ -package atlantis.nge.object.data; - -import atlantis.nge.object.*; -import atlantis.nge.*; -import atlantis.data.ACalorimeterData; -import atlantis.geometry.AEndcapCalorimeterDetector; -import atlantis.utils.AMath; - -import javax.media.opengl.GL; - -/** - * Object that draws cells - * - * @author Adam Davison, Mark Stockton - */ -public class ANObjectDataCell extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - private int[] m_color; - - public ANObjectDataCell() { - } - - public ANObjectDataCell(ACalorimeterData ald) { - - m_pt = new int[ald.getNumDraw()]; - m_v = new float[ald.getNumDraw()][]; - m_color = new int[ald.getNumDraw()]; - - for (int j = 0; j < ald.getNumDraw(); j++) { - int i = ald.getDrawIndex(j); - - m_pt[j] = GL.GL_TRIANGLE_STRIP; - m_color[j] = ald.getColor(i); - m_v[j] = getVert(ald, i); - - } - } - - public ANObjectDataCell(ACalorimeterData ald, int dl[]) { - - m_pt = new int[dl.length]; - m_v = new float[dl.length][]; - m_color = new int[dl.length]; - - for (int j = 0; j < dl.length; j++) { - int i = dl[j]; - - m_pt[j] = GL.GL_TRIANGLE_STRIP; - m_color[j] = ald.getColor(i); - m_v[j] = getVert(ald, i); - - } - } - - // This logic should be in ANObjectGenerator - public ANObjectDataCell(ACalorimeterData ald, float phi, float eta, float dr) { - - int num = 0; - for (int j = 0; j < ald.getNumDraw(); j++) { - int i = ald.getDrawIndex(j); - if (AMath.deltaR(phi, eta, (float) ald.getPhi(i), (float) ald.getEta(i)) < dr) { - num++; - } - } - - m_pt = new int[num]; - m_v = new float[num][]; - m_color = new int[num]; - num = 0; - for (int j = 0; j < ald.getNumDraw(); j++) { - int i = ald.getDrawIndex(j); - if (AMath.deltaR(phi, eta, (float) ald.getPhi(i), (float) ald.getEta(i)) > dr) { - continue; - } - m_pt[num] = GL.GL_TRIANGLE_STRIP; - m_color[num] = ald.getColor(i); - m_v[num] = getVert(ald, i); - num++; - - } - } - - private float[] getVert(ACalorimeterData ald, int index) { - - float etamin = (float) (ald.getEta(index) - ald.getdEta(index)); - float etamax = (float) (ald.getEta(index) + ald.getdEta(index)); - - float thetamin = (float) (2.0f * Math.atan(Math.exp(-etamin))); - float thetamax = (float) (2.0f * Math.atan(Math.exp(-etamax))); - - float phimin = (float) (ald.getPhi(index) - ald.getdPhi(index)); - float phimax = (float) (ald.getPhi(index) + ald.getdPhi(index)); - - float rmin = (float) ald.getDetector(index).getRMin(); - float rmax = (float) ald.getDetector(index).getRMax(); - - // TODO: Push this up to the getZ??? functions in this detector - // class. - if (ald.getDetector(index) instanceof AEndcapCalorimeterDetector) { - //correction taken from AEndcapCalorimeterDetector - String name = ald.getDetector(index).getName(); - float zmin = (float) (ald.getDetector(index).getZMin()); - //This shouldn't be 0, but just to be on the safe side. - int side = ald.getSide(index); - if (side != 0) { - side /= Math.abs(side); - } - zmin *= side; - if (name.indexOf("Inner") >= 0 || name.indexOf("Outer") >= 0 || name.indexOf("Presampler") >= 0) { - rmax = (float) (zmin / Math.sinh(etamin)); - } - rmin = (float) (zmin / Math.sinh(etamax)); - } - - float[][] v = new float[8][3]; - - fillVert(v[0], rmin, thetamin, phimin); - fillVert(v[1], rmin, thetamax, phimin); - fillVert(v[2], rmax, thetamax, phimin); - fillVert(v[3], rmax, thetamin, phimin); - fillVert(v[4], rmin, thetamin, phimax); - fillVert(v[5], rmin, thetamax, phimax); - fillVert(v[6], rmax, thetamax, phimax); - fillVert(v[7], rmax, thetamin, phimax); - - float[] vert = new float[3 * 14]; - int[] wind = {6, 5, 7, 4, 0, 5, 1, 2, 0, 3, 7, 2, 6, 5}; - for (int i = 0; i < 14; i++) { - copyVert(v[wind[i]], vert, i); - } - - return vert; - } - - private void copyVert(float[] v, float[] t, int ti) { - t[(ti * 3) + 0] = v[0]; - t[(ti * 3) + 1] = v[1]; - t[(ti * 3) + 2] = v[2]; - - } - - private void fillVert(float[] v, float r, float theta, float phi) { - - v[0] = (float) (r * Math.cos(phi)); - v[1] = (float) (r * Math.sin(phi)); - v[2] = (float) (r / Math.tan(theta)); - } - - @Override - public float[][] getVertices() { - return m_v; - } - - @Override - public int[] getPrimTypes() { - return m_pt; - } - - @Override - public ANColor getColor(int i) { - - if (m_color[i] == DRAW_LINE) { - return new ANColor(0.0f, 0.0f, 0.0f, 1.0f); - } else { - return ANColor.getMapColor(m_color[i]); - } - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataJet.java b/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataJet.java deleted file mode 100644 index f97774fe95f3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectDataJet.java +++ /dev/null @@ -1,146 +0,0 @@ -package atlantis.nge.object.data; - -import atlantis.nge.object.*; -import atlantis.nge.*; -import atlantis.data.AJetData; -import atlantis.utils.AMath; - -import javax.media.opengl.GL; - -/** - * Object that draws geometry of the muon system - * - * @author Adam Davison, Mark Stockton - */ -public class ANObjectDataJet extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - private int[] m_color; - - public ANObjectDataJet() { - - } - -public ANObjectDataJet(AJetData ajd) { - - - m_pt = new int[2*ajd.getNumDraw()]; - m_v = new float[2*ajd.getNumDraw()][]; - m_color = new int[2*ajd.getNumDraw()]; - - for (int j = 0; j < ajd.getNumDraw(); j++) { - int i= ajd.getDrawIndex(j); - float theta = (float) (2.0f * Math.atan(Math.exp(-ajd.getEta(i)))); - - m_pt[2*j] = GL.GL_TRIANGLE_FAN; - //m_v[2*j] = getCone(ajd.getET(i), ajd.getPhi(i), theta); - m_v[2*j] = getCone(1300.0f, ajd.getPhi(i), theta); - m_color[2*j]=ajd.getColor(i); - m_pt[2*j+1] = GL.GL_LINES; - //m_v[2*i+1] = getCore(ajd.getET(i), ajd.getPhi(i), theta); - m_v[2*j+1] = getCore(1300.0f, ajd.getPhi(i), theta); - m_color[2*j+1]=DRAW_LINE; - } - } - - public ANObjectDataJet(AJetData ajd, float phi, float eta, float dr) { - - int num=0; - for (int j = 0; j < ajd.getNumDraw(); j++) { - int i= ajd.getDrawIndex(j); - if(AMath.deltaR(phi,eta,(float)ajd.getPhi(i),(float)ajd.getEta(i))<dr){ - num++; - } - } - - m_pt = new int[2*num]; - m_v = new float[2*num][]; - m_color = new int[2*num]; - num=0; - for (int j = 0; j < ajd.getNumDraw(); j++) { - int i= ajd.getDrawIndex(j); - if(AMath.deltaR(phi,eta,(float)ajd.getPhi(i),(float)ajd.getEta(i))>dr) - continue; - float theta = (float) (2.0f * Math.atan(Math.exp(-ajd.getEta(i)))); - - m_pt[2*num] = GL.GL_TRIANGLE_FAN; - //m_v[2*num] = getCone(ajd.getET(i), ajd.getPhi(i), theta); - m_v[2*num] = getCone(1300.0f, ajd.getPhi(i), theta); - m_color[2*num]=ajd.getColor(i); - m_pt[2*num+1] = GL.GL_LINES; - //m_v[2*num+1] = getCore(ajd.getET(i), ajd.getPhi(i), theta); - m_v[2*num+1] = getCore(1300.0f, ajd.getPhi(i), theta); - m_color[2*num+1]=DRAW_LINE; - num++; - } - } - - - - private float[] getCore(float len, float phi, float theta){ - - // Jets are in detector eta so primary vertex set to 0 is sensible for now - float[] core = {0.0f, 0.0f, 0.0f, - (float) (len * Math.cos(phi) * Math.sin(theta)), - (float) (len * Math.sin(phi) * Math.sin(theta)), - (float) (len * Math.cos(theta)) - }; - return core; - } - - private float[] getCone(float len, float phi, float theta){ - int segs = 8; - - float[] cone = new float[3 * (2 + segs)]; - cone[0] = 0.0f; - cone[1] = 0.0f; - cone[2] = 0.0f; - - //temporary jet radius - float jetr = 100.0f; - - for (int i = 0; i < segs; i++) { - float lphi = (float) (i * 2.0f * Math.PI / segs); - float ax = (float) (jetr * Math.cos(lphi)); - float ay = (float) (jetr * Math.sin(lphi)); - float az = len; - - float bx = (float) (ax * Math.cos(phi) * Math.cos(theta) + - az * Math.sin(theta) * Math.cos(phi) - ay * Math.sin(phi)); - float by = (float) (ax * Math.cos(theta) * Math.sin(phi) + - az * Math.sin(theta) * Math.sin(phi) + ay * Math.cos(phi)); - float bz = (float) (-ax * Math.sin(theta) + az * Math.cos(theta)); - - cone[i*3+3] = bx; - cone[i*3+4] = by; - cone[i*3+5] = bz; - } - - cone[(3*(2+segs)) - 3] = cone[3]; - cone[(3*(2+segs)) - 2] = cone[4]; - cone[(3*(2+segs)) - 1] = cone[5]; - - return cone; - } - - @Override - public float[][] getVertices() { - return m_v; - } - - @Override - public int[] getPrimTypes() { - return m_pt; - } - - @Override - public ANColor getColor(int i) { - - if(m_color[i]==DRAW_LINE) - return new ANColor(0.0f, 0.0f, 0.0f, 1.0f); - else - return ANColor.getMapColor(m_color[i], 0.5f); - - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectPointing.java b/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectPointing.java deleted file mode 100644 index 2fddcee1d372..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectPointing.java +++ /dev/null @@ -1,147 +0,0 @@ -package atlantis.nge.object.data; - -import atlantis.data.ACalorimeterData; -import atlantis.data.ATILEData; -import atlantis.geometry.AEndcapCalorimeterDetector; -import atlantis.nge.ANColor; -import atlantis.nge.object.ANObjectVL; -import atlantis.utils.AMath; -import javax.media.opengl.GL; - -/** - * - * @author Adam Davison - */ -public class ANObjectPointing extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - private ANColor[] m_c; - - public ANObjectPointing(ACalorimeterData ald, int dl[], int dllen, boolean outline) { - m_pt = new int[dllen]; - m_v = new float[dllen][]; - m_c = new ANColor[dllen]; - - double[] area = new double[dl.length]; - for (int i = 0; i < dllen; i++) { - area[i] = 1.0; - } - - ald.calibrateLocalDensity(dl, area); - double[] scale = ald.getScaleFactors(dl, area); - - if (outline) { - for (int j = 0; j < dllen; j++) { - int i = dl[j]; - m_pt[j] = GL.GL_LINES; - m_c[j] = ANColor.getMapColor(ald.getColor(i)); - m_c[j].mult(0.5f); - m_v[j] = getVert(ald, i, (float)scale[j], true); - //m_v[j] = getVert(ald, i, 1.0f, true); - } - } else { - - for (int j = 0; j < dllen; j++) { - int i = dl[j]; - m_pt[j] = GL.GL_TRIANGLE_STRIP; - m_c[j] = ANColor.getMapColor(ald.getColor(i)); - m_v[j] = getVert(ald, i, (float)scale[j], false); - } - } - - } - - @Override - public float[][] getVertices() { - return m_v; - } - - @Override - public int[] getPrimTypes() { - return m_pt; - } - - @Override - public ANColor getColor(int i) { - return m_c[i]; - } - - private float[] getVert(ACalorimeterData ald, int index, float scale, boolean outline) { - - // Possibly should apply scale to theta not eta? - float etamin = (float) (ald.getEta(index) - 0.5f*scale*ald.getdEta(index)); - float etamax = (float) (ald.getEta(index) + 0.5f*scale*ald.getdEta(index)); - - float thetamin = (float) (2.0f * Math.atan(Math.exp(-etamin))); - float thetamax = (float) (2.0f * Math.atan(Math.exp(-etamax))); - - float phimin = (float) (ald.getPhi(index) - 0.5f*scale*ald.getdPhi(index)); - float phimax = (float) (ald.getPhi(index) + 0.5f*scale*ald.getdPhi(index)); - - float rmin = (float) ald.getDetector(index).getRMin(); - float rmax = (float) ald.getDetector(index).getRMax(); - float dr = 0.5f*(rmax - rmin); - rmin += (1.0f - scale)*dr; - rmax -= (1.0f - scale)*dr; - - // TODO: Push this up to the getZ??? functions in this detector - // class. - if (ald.getDetector(index) instanceof AEndcapCalorimeterDetector) { - //correction taken from AEndcapCalorimeterDetector - String name = ald.getDetector(index).getName(); - float zmin = (float) (ald.getDetector(index).getZMin()); - //This shouldn't be 0, but just to be on the safe side. - int side = ald.getSide(index); - if (side != 0) { - side /= Math.abs(side); - } - zmin *= side; - if (name.indexOf("Inner") >= 0 || name.indexOf("Outer") >= 0 || name.indexOf("Presampler") >= 0) { - rmax = (float) (zmin / Math.sinh(etamin)); - } - rmin = (float) (zmin / Math.sinh(etamax)); - } - - float[][] v = new float[8][3]; - - fillVert(v[0], rmin, thetamin, phimin); - fillVert(v[1], rmin, thetamax, phimin); - fillVert(v[2], rmax, thetamax, phimin); - fillVert(v[3], rmax, thetamin, phimin); - fillVert(v[4], rmin, thetamin, phimax); - fillVert(v[5], rmin, thetamax, phimax); - fillVert(v[6], rmax, thetamax, phimax); - fillVert(v[7], rmax, thetamin, phimax); - - int[] wind = null; - if (!outline) { - int[] inwind = {6, 5, 7, 4, 0, 5, 1, 2, 0, 3, 7, 2, 6, 5}; - wind = inwind; - } else { - int[] outwind = {0, 3, 0, 1, 0, 4, 2, 1, 2, 3, 2, 6, - 7, 4, 7, 6, 7, 3, 5, 6, 5, 4, 5, 1}; - wind = outwind; - } - float[] vert = new float[3 * wind.length]; - for (int i = 0; i < wind.length; i++) { - copyVert(v[wind[i]], vert, i); - } - - return vert; - } - - private void copyVert(float[] v, float[] t, int ti) { - t[(ti * 3) + 0] = v[0]; - t[(ti * 3) + 1] = v[1]; - t[(ti * 3) + 2] = v[2]; - - } - - private void fillVert(float[] v, float r, float theta, float phi) { - - v[0] = (float) (r * Math.cos(phi)); - v[1] = (float) (r * Math.sin(phi)); - v[2] = (float) (r / Math.tan(theta)); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectTracks.java b/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectTracks.java deleted file mode 100644 index f8599c1f12a6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/data/ANObjectTracks.java +++ /dev/null @@ -1,82 +0,0 @@ -package atlantis.nge.object.data; - -import atlantis.data.ALArData; -import atlantis.data.ATrackData; -import atlantis.nge.ANColor; -import atlantis.nge.object.ANObjectVL; -import javax.media.opengl.GL; - -/** - * - * @author Adam Davison - */ -public class ANObjectTracks extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - private int[] m_color; - - public ANObjectTracks(ATrackData td) { - float[][] x = td.getX(); - float[][] y = td.getY(); - float[][] z = td.getZ(); - - m_pt = new int[x.length]; - m_v = new float[x.length][]; - m_color = new int[x.length]; - - for (int i = 0; i < x.length; i++) { - m_pt[i] = GL.GL_LINE_STRIP; - m_v[i] = new float[x[i].length * 3]; - m_color[i] = td.getColor(i); - for (int p = 0; p < x[i].length; p++) { - m_v[i][p * 3] = x[i][p]; - m_v[i][p * 3 + 1] = y[i][p]; - m_v[i][p * 3 + 2] = z[i][p]; - } - } - } - - public ANObjectTracks(ATrackData td, int[] dl) { - float[][] x = td.getX(); - if (x == null) { - System.out.println("ARGH!!"); - m_pt = null; - m_v = null; - m_color = null; - return; - } - float[][] y = td.getY(); - float[][] z = td.getZ(); - - m_pt = new int[dl.length]; - m_v = new float[dl.length][]; - m_color = new int[dl.length]; - - for (int i = 0; i < dl.length; i++) { - m_pt[i] = GL.GL_LINE_STRIP; - int index = td.getIndexFromId(dl[i]); - m_v[i] = new float[x[index].length * 3]; - m_color[i] = td.getColor(index); - for (int p = 0; p < x[index].length; p++) { - m_v[i][p * 3] = x[index][p]; - m_v[i][p * 3 + 1] = y[index][p]; - m_v[i][p * 3 + 2] = z[index][p]; - } - } - } - - @Override - public float[][] getVertices() { - return m_v; - } - - @Override - public int[] getPrimTypes() { - return m_pt; - } - - public ANColor getColor(int i) { - return ANColor.getMapColor(m_color[i]); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectBeamLine.java b/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectBeamLine.java deleted file mode 100644 index ad9d7da77b47..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectBeamLine.java +++ /dev/null @@ -1,21 +0,0 @@ -package atlantis.nge.object.geometry; - -import atlantis.nge.object.ANObjectVL; - -/** - * - * @author Adam Davison - */ -public class ANObjectBeamLine extends ANObjectVL { - - @Override - public float[][] getVertices() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public int[] getPrimTypes() { - throw new UnsupportedOperationException("Not supported yet."); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomCalo.java b/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomCalo.java deleted file mode 100644 index 5705182ecc6d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomCalo.java +++ /dev/null @@ -1,159 +0,0 @@ -package atlantis.nge.object.geometry; - -import atlantis.nge.object.*; -import atlantis.nge.*; -import atlantis.geometry.ACalorimeterDetector; - -import java.util.ArrayList; -import javax.media.opengl.GL; - -/** - * Object that draws geometry of the muon system - * - * @author Adam Davison, Mark Stockton - */ -public class ANObjectGeomCalo extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - - private int[] m_color; - - public ANObjectGeomCalo(ArrayList<ACalorimeterDetector> m_calo, int nv_scale, boolean duplicate) { - - m_pt = new int[7*m_calo.size()]; - m_v = new float[7*m_calo.size()][]; - m_color = new int[7*m_calo.size()]; - - //all endcaps and extended tile only has one end in geom file and not relicated like others - for (int j = 0; j < m_calo.size(); j++) { - int i=7*j; - ACalorimeterDetector cd = m_calo.get(j); - m_pt[i]=GL.GL_TRIANGLE_STRIP; - m_pt[i+1]=GL.GL_TRIANGLE_STRIP; - m_pt[i+2]=GL.GL_TRIANGLE_STRIP; - m_pt[i+3]=GL.GL_LINE_LOOP; - m_pt[i+4]=GL.GL_LINE_LOOP; - m_pt[i+5]=GL.GL_LINE_LOOP; - m_pt[i+6]=GL.GL_LINE_LOOP; - m_color[i]=cd.getFillColor(); - m_color[i+1]=cd.getFillColor(); - m_color[i+2]=cd.getFillColor(); - m_color[i+3]=DRAW_LINE; - m_color[i+4]=DRAW_LINE; - m_color[i+5]=DRAW_LINE; - m_color[i+6]=DRAW_LINE; - - float zMin=(float) cd.getZMin(); - float zMax=(float) cd.getZMax(); - if(duplicate){ - zMin*=-1.; - zMax*=-1.; - } - m_v[i] = getEndTris(zMin, (float) cd.getRMin(), (float) cd.getRMax(), cd.getNumPhi() / nv_scale); - m_v[i+1] = getEndTris(zMax, (float) cd.getRMin(), (float) cd.getRMax(), cd.getNumPhi() / nv_scale); - m_v[i+2] = getBarrelTris(zMin, zMax, (float) cd.getRMin(), (float) cd.getRMax(), cd.getNumPhi() / nv_scale); - m_v[i+3] = getEdges(zMin, (float) cd.getRMin(), cd.getNumPhi() / nv_scale, true); - m_v[i+4] = getEdges(zMax, (float) cd.getRMin(), cd.getNumPhi() / nv_scale, true); - m_v[i+5] = getEdges(zMin, (float) cd.getRMax(), cd.getNumPhi() / nv_scale, false); - m_v[i+6] = getEdges(zMax, (float) cd.getRMax(), cd.getNumPhi() / nv_scale, false); - } - } - - - private float[] getEdges(float z, float r, int nv, boolean inner) { - float[] v = new float[3 * nv]; - - float dphi = (2 * (float) Math.PI) / nv; - float hdphi = 0.5f * dphi; - //if (inner) { hdphi = 0.0f; } - - for (int i = 0; i < nv; i++) { - int ie = i * 3; - v[ie] = r * (float) Math.cos(i * dphi + hdphi); - v[ie + 1] = r * (float) Math.sin(i * dphi + hdphi); - v[ie + 2] = (float) z; - } - - return v; - } - - private float[] getBarrelTris(float zmin, float zmax, float rmin, float rmax, int nv) { - float[] v = new float[3 * (nv * 2 + 2)]; - - float dphi = (2 * (float) Math.PI) / nv; - float hdphi = 0.5f * dphi; - - float r = (float) rmax; - - for (int i = 0; i < nv; i++) { - int ie = i * 2 * 3; - int oe = (i * 2 + 1) * 3; - v[ie] = r * (float) Math.cos(i * dphi + hdphi); - v[ie + 1] = r * (float) Math.sin(i * dphi + hdphi); - v[ie + 2] = (float) zmin; - v[oe] = r * (float) Math.cos(i * dphi + hdphi); - v[oe + 1] = r * (float) Math.sin(i * dphi + hdphi); - v[oe + 2] = (float) zmax; - } - - // Close the strip - for (int i = 0; i < 6; i++) { - v[i + v.length - 6] = v[i]; - } - - return v; - } - - private float[] getEndTris(float z, float rmin, float rmax, int nv) { - float[] v = new float[3 * (nv * 2 + 2)]; - - float dphi = (2 * (float) Math.PI) / nv; - float hdphi = 0.5f * dphi; - - for (int i = 0; i < nv; i++) { - int ie = i * 2 * 3; - int oe = (i * 2 + 1) * 3; - v[ie] = (float) rmin * (float) Math.cos(i * dphi); - v[ie + 1] = (float) rmin * (float) Math.sin(i * dphi); - v[ie + 2] = z; - v[oe] = (float) rmax * (float) Math.cos(i * dphi + hdphi); - v[oe + 1] = (float) rmax * (float) Math.sin(i * dphi + hdphi); - v[oe + 2] = z; - } - - // Close the strip - for (int i = 0; i < 6; i++) { - v[i + v.length - 6] = v[i]; - } - - return v; - } - - - - public ANObjectGeomCalo() { - - } - - @Override - public int[] getPrimTypes() - { - return m_pt; - } - - @Override - public float[][] getVertices() - { - return m_v; - } - - @Override - public ANColor getColor(int i) { - - if(m_color[i]==DRAW_LINE) - return new ANColor(0.0f, 0.0f, 0.0f, 1.0f); - else - return ANColor.getMapColor(m_color[i], 1.0f); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomMuon.java b/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomMuon.java deleted file mode 100644 index dd115cb360ac..000000000000 --- a/graphics/AtlantisJava/src/atlantis/nge/object/geometry/ANObjectGeomMuon.java +++ /dev/null @@ -1,229 +0,0 @@ -package atlantis.nge.object.geometry; - -import atlantis.nge.object.*; -import atlantis.nge.*; -import atlantis.geometry.ABoxDetector; -import java.util.ArrayList; -import javax.media.opengl.GL; - -/** - * Object that draws geometry of the muon system - * - * @author Adam Davison, Mark Stockton - */ -public class ANObjectGeomMuon extends ANObjectVL { - - private float[][] m_v; - private int[] m_pt; - private int[] m_color; - - public ANObjectGeomMuon() { - setPickHandler(new ANPickHandlerSimple("Muon Spectrometer")); - } - - public ANObjectGeomMuon(ArrayList<ABoxDetector> m_boxes) { - setPickHandler(new ANPickHandlerSimple("Muon Spectrometer")); - - m_pt = new int[2*m_boxes.size()]; - m_v = new float[2*m_boxes.size()][]; - m_color = new int[2*m_boxes.size()]; - - for (int i = 0; i < m_boxes.size(); i++) { - ABoxDetector b = m_boxes.get(i); - m_pt[2*i] = GL.GL_TRIANGLE_STRIP; - m_v[2*i] = getBoxFaces((float)b.getZMin(), (float)b.getZMax(), - (float)b.getRMin(), (float)b.getRMax(), (float)b.getPhi(), - (float)b.getSize()); - m_color[2*i]=b.getFillColor(); - m_pt[2*i+1] = GL.GL_LINES; - m_v[2*i+1] = getBoxEdges((float)b.getZMin(), (float)b.getZMax(), - (float)b.getRMin(), (float)b.getRMax(), (float)b.getPhi(), - (float)b.getSize()); - m_color[2*i+1]=DRAW_LINE; - } - } - - // This code answers the question, how do you wrap a strip of 14 triangles - // to form a cube? - private float[] getBoxFaces(float zmin, float zmax, float rmin, float rmax, float phi, float w) { - float[] v = new float[3*14]; - - float sinPhi = (float)Math.sin(phi); - float cosPhi = (float)Math.cos(phi); - - float xmi = rmin*cosPhi; - float ymi = rmin*sinPhi; - float xmo = rmax*cosPhi; - float ymo = rmax*sinPhi; - float dx = -sinPhi*w/2.0f; - float dy = cosPhi*w/2.0f; - - v[0] = xmi + dx; - v[1] = ymi + dy; - v[2] = zmax; - - v[3] = xmi - dx; - v[4] = ymi - dy; - v[5] = zmax; - - v[6] = xmo + dx; - v[7] = ymo + dy; - v[8] = zmax; - - v[9] = xmo - dx; - v[10] = ymo - dy; - v[11] = zmax; - - v[12] = v[9]; - v[13] = v[10]; - v[14] = zmin; - - v[15] = v[3]; - v[16] = v[4]; - v[17] = v[5]; - - v[18] = v[3]; - v[19] = v[4]; - v[20] = zmin; - - v[21] = v[0]; - v[22] = v[1]; - v[23] = zmin; - - v[24] = v[12]; - v[25] = v[13]; - v[26] = v[14]; - - v[27] = v[6]; - v[28] = v[7]; - v[29] = zmin; - - v[30] = v[6]; - v[31] = v[7]; - v[32] = v[8]; - - v[33] = v[21]; - v[34] = v[22]; - v[35] = v[23]; - - v[36] = v[0]; - v[37] = v[1]; - v[38] = v[2]; - - v[39] = v[3]; - v[40] = v[4]; - v[41] = v[5]; - - return v; - } - - private float[] getBoxEdges(float zmin, float zmax, float rmin, float rmax, float phi, float w) { - float[] v = new float[3*12*2]; // 3d*12edges*2ends - - float sinPhi = (float)Math.sin(phi); - float cosPhi = (float)Math.cos(phi); - - float xmi = rmin*cosPhi; - float ymi = rmin*sinPhi; - float xmo = rmax*cosPhi; - float ymo = rmax*sinPhi; - float dx = -sinPhi*w/2.0f; - float dy = cosPhi*w/2.0f; - - v[0] = xmi + dx; - v[1] = ymi + dy; - v[2] = zmin; - - v[3] = xmi - dx; - v[4] = ymi - dy; - v[5] = zmin; - - v[6] = v[3]; - v[7] = v[4]; - v[8] = v[5]; - - v[9] = xmo - dx; - v[10] = ymo - dy; - v[11] = zmin; - - v[12] = v[9]; - v[13] = v[10]; - v[14] = v[11]; - - v[15] = xmo + dx; - v[16] = ymo + dy; - v[17] = zmin; - - v[18] = v[15]; - v[19] = v[16]; - v[20] = v[17]; - - v[21] = v[0]; - v[22] = v[1]; - v[23] = v[2]; - - for (int i = 24; i < 48; i++) { - if (i % 3 == 2) { - v[i] = zmax; - } else { - v[i] = v[i - 24]; - } - - } - - v[48] = v[0]; - v[49] = v[1]; - v[50] = v[2]; - - v[51] = v[0]; - v[52] = v[1]; - v[53] = zmax; - - v[54] = v[3]; - v[55] = v[4]; - v[56] = v[5]; - - v[57] = v[3]; - v[58] = v[4]; - v[59] = zmax; - - v[60] = v[9]; - v[61] = v[10]; - v[62] = v[11]; - - v[63] = v[9]; - v[64] = v[10]; - v[65] = zmax; - - v[66] = v[15]; - v[67] = v[16]; - v[68] = v[17]; - - v[69] = v[15]; - v[70] = v[16]; - v[71] = zmax; - - return v; - } - - @Override - public float[][] getVertices() { - return m_v; - } - - @Override - public int[] getPrimTypes() { - return m_pt; - } - - @Override - public ANColor getColor(int i) { - - if(m_color[i]==DRAW_LINE) - return new ANColor(0.0f, 0.0f, 0.0f, 1.0f); - else - return ANColor.getMapColor(m_color[i], 1.0f); - - } - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/output/AExceptionHandler.java b/graphics/AtlantisJava/src/atlantis/output/AExceptionHandler.java deleted file mode 100755 index 7be2501d9e74..000000000000 --- a/graphics/AtlantisJava/src/atlantis/output/AExceptionHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -package atlantis.output; - -import javax.swing.JOptionPane; - -import atlantis.globals.AGlobals; - -/** - * Handles an exception thrown in the AWT event-dispatch thread. If the system - * property "sun.awt.exception.handler" is defined then when an exception occurs - * in the AWT event-dispatch thread, the thread wii do the following: 1) Load - * the class named by the value of that property, using the current thread's - * context class loader, 2) Instantiate that class using its zero-argument - * constructor, 3) Find the resulting handler object's "public void handle" - * method, which should take a single argument of type "Throwable", and 4) - * Invoke the handler's "handle" method, passing it the exception as an - * argument. - * - * Note: The magic "sun.awt.exception.handler" property will be - * removed in a future release. - * - * Comment: No wonder - centrally handling all exceptions is not a good idea - * in the first place (S.B.) - */ - -public class AExceptionHandler { - private static final AGlobals globals = AGlobals.instance(); - - public void handle(Throwable exception) - { - processException("AWT Event Dispatch Thread Exception:", exception); - } - - public static void processException(String message, Throwable exception) - { - exception.printStackTrace(); - showMessageDialog(message); - } - - public static void processException(String type, String message) - { - - if (type.equals("fatal")){ - showMessageDialog(type + ": " + message + "\n"); - System.exit(1); - } - AOutput.append(type + ": " + message + "\n", ALogInterface.BAD_COMMAND); - } - - private static void showMessageDialog(String message) - { - //Do not show messages in headless mode - if(AGlobals.isAtlantisHeadless()) return; - - //Do not show messages in demo mode - if (AGlobals.instance().isDemoMode()) return; - - //Else show a message box with the exception - JOptionPane.showMessageDialog(globals.getGuiFrame(), message, "Atlantis", JOptionPane.ERROR_MESSAGE); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/output/ALogInterface.java b/graphics/AtlantisJava/src/atlantis/output/ALogInterface.java deleted file mode 100644 index 3a3f416a71f5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/output/ALogInterface.java +++ /dev/null @@ -1,25 +0,0 @@ -package atlantis.output; - -/** - * Non-GUI-dependent interface for ALogPane. - * - * @author waugh - * - */ -public interface ALogInterface { - - public static final String TITLE = "TITLE"; - public static final String NORMAL = "NORMAL"; - public static final String NORMAL_BOLD = "NORMAL_BOLD"; - public static final String COMMAND = "COMMAND"; - public static final String BAD_COMMAND = "BAD_COMMAND"; - public static final String PICK = "PICK"; - public static final String WARNING = "WARNING"; - - void append(String s); - - void append(String s, String style); - - void clear(); - -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/output/AOutput.java b/graphics/AtlantisJava/src/atlantis/output/AOutput.java deleted file mode 100755 index 4f5285cb5a55..000000000000 --- a/graphics/AtlantisJava/src/atlantis/output/AOutput.java +++ /dev/null @@ -1,54 +0,0 @@ -package atlantis.output; - -import atlantis.globals.AGlobals; -import atlantis.utils.ALogger; - -/** - * AOutput provides access to the specific static instance of AMainLogPane which - * is used for displaying general information within Atlantis - * @author Adam Davison - */ -public class AOutput -{ - //Handle to the main log pane - private static ALogInterface outputPane; - - /** Logger for when not outputting to the GUI (Minerva). */ - private final static ALogger logger = ALogger.getLogger(AOutput.class); - - /** Append text to output pane/logger depending on output level. */ - public static void append(String s, String style) { - if (outputPane==null) return; // in case not set yet, or no GUI - if(AGlobals.instance().getSimpleOutput()>0){ - if (style.equals(ALogInterface.BAD_COMMAND) || style.equals(ALogInterface.WARNING)) { - logger.warn(s); - }else{ - logger.info(s); - } - }else{ - outputPane.append(s, style); - } - } - - /** Append text to output pane - only for pick info (and select event/debug info). */ - public static void alwaysAppend(String s, String style) { - if (outputPane==null) return; // in case not set yet, or no GUI - outputPane.append(s, style); - } - - /** - * Provide interface to the log pane in the GUI. - * @param outputDisplay the log pane - */ - public static void setOutput(ALogInterface outputDisplay) { - AOutput.outputPane = outputDisplay; - } - - /** - * Get interface to the log pane in the GUI, if any. - * @param outputDisplay the log pane - */ - public static ALogInterface getOutput() { - return outputPane; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/package.html b/graphics/AtlantisJava/src/atlantis/package.html deleted file mode 100644 index 9d160b36ad3a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/package.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> - Root package of the Atlantis application. - Contains main class Atlantis, whose purpose is to parse the command line, - initialise the application's main components and provide access to them. -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AAbstractParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AAbstractParameter.java deleted file mode 100755 index 74401090c6e0..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AAbstractParameter.java +++ /dev/null @@ -1,913 +0,0 @@ -package atlantis.parameters; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPopupMenu; -import javax.swing.LookAndFeel; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.gui.ACheckBox; -import atlantis.gui.AParametersTable; -import atlantis.output.AExceptionHandler; -import atlantis.utils.AUtilities; - -/** - * The class is used as a default implementation of the AParameter interface. - * All parameters extend this class except ALinkParameter which implements - * AParameter directly. - */ -abstract class AAbstractParameter implements AParameter -{ - // range constants - protected final static int MIN = 0; - protected final static int MAX = 1; - protected final static int SVAL = 2; - - // unitsOf constants - protected final static int NOTHING = 0; - protected final static int LENGTH = 1; - protected final static int ENERGY = 2; - protected final static int ENERGYMEV = 3; - - /** - * List of listeners/observers to be informed of changes to parameters. - * Currently this is just the GUI, which repaints its tables when a parameter - * changes. - */ - private List<AParameterChangeListener> parameterChangeListeners = new ArrayList<AParameterChangeListener>(); - - /** The internal name of the parameter. */ - protected String name; - /** The name which is displayed in the user interface. */ - protected String screenName; - /** Tool tip, i.e. text that appears when mouse hovers over control. */ - protected String toolTip; - - protected boolean hasStatus; - protected int valueType; - protected int scope; - protected int defaultScope; - protected boolean isModulus; - protected int userLevel; - protected int unitsOf; - protected String[] operators; - /** Allowed values for this parameter: - * range[MIN][i] and range[MAX][i] are the limits of the i'th range; - * range[SVAL][j] is the j'th allowed single value. */ - protected double[][] range; - - private ACheckBox nameLabel; - private JLabel label; - private boolean isInitialized = false; - - /** The number of windows in the canvas. */ - protected int wCount = 0; // initialised later in constructor - - /** Contains the values for each window. */ - protected AParameterData data; - - @Override - public void addParameterChangeListener(AParameterChangeListener listener) { - parameterChangeListeners.add(listener); - } - - public AAbstractParameter(String name, String screenName, String toolTip, - int valueType, double value, String op, String dop, - boolean haseStatus, boolean status, boolean isMod, int userLevel, - int scope, int unitsOf) - { - // initialising wCount - // for running without Canvas (e.g. calling geometry methods from GraXML), - // this may run without Canvas initialised - // check if Canvas actually exists - // dependency of AAbstractParameter on ACanvas should be revised, this - // current solution is not very elegant - ACanvas canvas = ACanvas.getCanvas(); - this.wCount = canvas == null ? 0 : canvas.getWindowsCount(); - - this.isModulus = isMod; - this.unitsOf = unitsOf; - - if (!screenName.trim().equals("")) - this.screenName = screenName; - else - this.screenName = name; - - if (isMod) - this.screenName = "|" + this.screenName + "|"; - - // removing spaces from the parameter name - StringBuffer strBuffer = new StringBuffer(name); - int i = 0; - - while (i < strBuffer.length()) - { - if (Character.isWhitespace(strBuffer.charAt(i))) - strBuffer.deleteCharAt(i); - else - i++; - } - this.name = strBuffer.toString(); - - if ((toolTip == null) || (toolTip.trim().length() == 0)) - this.toolTip = this.screenName; - else - this.toolTip = toolTip; - - this.hasStatus = haseStatus; - this.valueType = valueType; - - // set up the local window copies - this.data = new AParameterData(wCount); - - for (i = 0; i < wCount; i++) - { - this.data.setValue(i, value); - this.data.setStatus(i, status); - } - - // decompose supportedOperators - if ((op == null) || (op.trim().equals(""))) - { - this.operators = new String[1]; - operators[0] = "="; - } - else - { - String[] tempOperators = new String[10]; - - int operatorsCount = 0; - StringTokenizer st = new StringTokenizer(op, ","); - - while (st.hasMoreTokens()) - { - String oper = st.nextToken().trim(); - - if (isKnownOperator(oper)) - { - tempOperators[operatorsCount] = oper; - operatorsCount++; - } - else - throw new Error("Unknown operator: " + oper); - } - - this.operators = new String[operatorsCount]; - for (i = 0; i < operatorsCount; i++) - this.operators[i] = tempOperators[i]; - } - - if ((dop == null) || (dop.trim().equals(""))) - for (i = 0; i < wCount; i++) - this.data.setOperator(i, operators[0]); - else - for (i = 0; i < wCount; i++) - this.data.setOperator(i, dop); - - this.userLevel = userLevel; - setScope(scope); - saveDefaults(); - } - - public void saveDefaults() - { - this.data.saveDefaults(); - this.defaultScope = this.scope; - } - - public void restoreDefaults() - { - this.data.restoreDefaults(); - changeScope(this.defaultScope); - } - - /** - * This method is called to apply the change in the value of the parameter - */ - public void apply() - { - if (getScope() == LOCAL) - ACommandProcessor.receive("DO"); - else - ACanvas.getCanvas().repaintAllFromScratch(); - } - - /** - * Called by the User Interface in order to initialize the graphics of the - * parameter (if it will be displayed in the UI). - */ - public void initialize() - { - if (hasStatus) - { - nameLabel = new ACheckBox(screenName); - nameLabel.setSelected(getStatus()); - nameLabel.setBackground(new Color(204, 204, 204)); - if (getScope() == LOCAL) - setForeground(Color.black); - else - setForeground(Color.blue); - - nameLabel.setToolTipText(toolTip); - nameLabel.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - ACommandProcessor.receive(name); - apply(); - } - }); - - // after the first left click at the table in the parameter tabbed - // pane, all the followingmouse mouse event will be catched by the - // mouselisteners of those components inside the table cells, not - // the table itself, so in order for the local/global - // switch (right click to change) to always work, have to add mouse - // listeners to these components as well. - nameLabel.addMouseListener(new MouseAdapter() - { - public void mousePressed(MouseEvent e) - { - if (AUtilities.isRightMouseButton(e)) - { - JPopupMenu popupMenu = new JPopupMenu(); - if (getScope() == AParameter.LOCAL) - { - popupMenu.add(AParametersTable.SET_GLOBAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeScope(AParameter.GLOBAL); - refresh(); - } - }); - } - else - { - popupMenu.add(AParametersTable.SET_LOCAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeScope(AParameter.LOCAL); - refresh(); - } - }); - } - popupMenu.show(nameLabel, e.getX(), e.getY()); - } - } - }); - } - else - { - label = new JLabel(screenName); - if (getScope() == LOCAL) - setForeground(Color.black); - else - setForeground(Color.blue); - - // after the first left click at the table in the parameter tabbed - // pane, all the followingmouse mouse event will be catched by the - // mouselisteners of those components inside the table cells, not - // the table itself, so in order for the local/global - // switch (right click to change) to always work, have to add mouse - // listeners to these components as well. - label.addMouseListener(new MouseAdapter() - { - public void mousePressed(MouseEvent e) - { - if (AUtilities.isRightMouseButton(e)) - { - JPopupMenu popupMenu = new JPopupMenu(); - if (getScope() == AParameter.LOCAL) - { - popupMenu.add(AParametersTable.SET_GLOBAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeScope(AParameter.GLOBAL); - refresh(); - } - }); - } - else - { - popupMenu.add(AParametersTable.SET_LOCAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeScope(AParameter.LOCAL); - refresh(); - } - }); - } - popupMenu.show(label, e.getX(), e.getY()); - } - } - }); - label.setOpaque(true); - label.setToolTipText(toolTip); - LookAndFeel.installColorsAndFont(label, "CheckBox.background", "CheckBox.foreground", "CheckBox.font"); - } - - isInitialized = true; - } - - public boolean isInitialized() - { - return this.isInitialized; - } - - /** - * Copies from one window to another the value of the parameter - */ - public void copy(int from, int to) - { - data.copy(from,to); - } - - /** - * This function is called for GLOBAL parameters to apply the value in all - * windows. - */ - public void globalize(int window) - { - data.globalize(window); - } - - public void setScope(int scope) - { - this.scope = scope; - if (scope == LOCAL) - setForeground(Color.black); - else - setForeground(Color.blue); - } - - public void changeScope(int scope) - { - if (scope != this.scope) - { - this.scope = scope; - if (scope == LOCAL) - setForeground(Color.black); - else - { - setForeground(Color.blue); - data.globalize(); - ACanvas.getCanvas().repaintAllFromScratch(); - } - } - } - - public int getScope() - { - return scope; - } - - public String getName() - { - return name; - } - - public String getScreenName() - { - return screenName; - } - - public String getToolTip() - { - return toolTip; - } - - // public String getOperator() { return operator; } - public boolean isModulus() - { - return isModulus; - } - - public int getValueType() - { - return valueType; - } - - public String getOperator() - { - return data.getOperator(); - } - - protected void _setOperator(String oper) - { - // if (!validateValue(v)) - // throw new Error("Value " + v + " for parameter " + screenName + " is - // out of range "); - data.setOperator(oper); - if (scope == GLOBAL) data.globalize(); - } - - protected void _setOperator(String windowName, String oper) - { - if (scope == GLOBAL || windowName.equals("*")) { - data.setOperator(oper); - data.globalize(); - } else { - data.setOperator(ACanvas.getCanvas().getWindow(windowName).getIndex(), oper); - } - } - - protected void _setValue(String windowName, double val) - { - if (scope == GLOBAL || windowName.equals("*")) { - data.setValue(val); - data.globalize(); - } else { - data.setValue(ACanvas.getCanvas().getWindow(windowName).getIndex(), val); - } - } - - protected void _setStatus(String windowName, boolean stat) - { - if (scope == GLOBAL || windowName.equals("*")) { - data.setStatus(stat); - data.globalize(); - } else { - data.setStatus(ACanvas.getCanvas().getWindow(windowName).getIndex(), stat); - } - } - - /** - * _setD and _setI are used by subclasses when changing the values of - * parameters. - */ - protected void _setD(double v) - { - if (!validateValue(v)) - throw new Error("Value " + v + " for parameter " + screenName + " is out of range "); - data.setValue(v); - if (scope == GLOBAL) data.globalize(); - } - - protected void _setI(int v) - { - if (!validateValue(v)) - throw new Error("Value " + v + " for parameter " + screenName + " is out of range "); - data.setValue(v); - if (scope == GLOBAL) data.globalize(); - } - - public double getD() - { - if (valueType != FLOAT) - throw new Error("getD acces on not FLOAT parameter"); - return data.getValue(); - } - - public int getI() - { - if (valueType != INT) - throw new Error("getI acces on not INT parameter"); - return (int) data.getValue(); - } - - public String getValue() - { - if (valueType == FLOAT) - return Double.toString(data.getValue()); - else - return Integer.toString((int) data.getValue()); - } - - public void setStatus(boolean st) - { - if (!hasStatus) - throw new Error("Parameter has no status"); - data.setStatus(st); - if (scope == GLOBAL) data.globalize(); - - refresh(); - fireParameterChanged(); - } - - public boolean getStatus() - { - if (!hasStatus) - throw new Error("Parameter hase no status"); - - return data.getStatus(); - } - - public JComponent getNameComponent() - { - if (hasStatus) - return nameLabel; - else - return label; - } - - public JComponent getValueComponent() - { - return new JLabel("error"); - } - - protected void _refresh() - { - if (hasStatus) - if (nameLabel != null) - nameLabel.setSelected(getStatus()); - } - - /** - * Parses the PossibleValues string and returns the double[][] containing - * the range of this parameter. - */ - protected static double[][] resolvePossibleValues(String possibleValues, int type) - { - double[][] range = new double[3][100]; - int valCount = 0; - int rangeCount = 0; - StringTokenizer st = new StringTokenizer(possibleValues, ","); - String sval; - double val = 0; - - while (st.hasMoreTokens()) - { - String token = st.nextToken().trim(); - StringTokenizer st1 = new StringTokenizer(token, ":"); - - switch (st1.countTokens()) - { - case 1: - sval = st1.nextToken().trim(); - try - { - if (type == FLOAT) - val = Double.parseDouble(sval); - else if (type == INT) - val = Integer.parseInt(sval); - range[SVAL][valCount] = val; - valCount++; - } - catch (NumberFormatException nfe) - { - AExceptionHandler.processException("Corrupt Possible Value: " + sval, nfe); - } - break; - - case 2: - for (int i = 0; i < 2; i++) - { - sval = st1.nextToken().trim(); - try - { - if (type == FLOAT) - val = Double.parseDouble(sval); - else if (type == INT) - val = Integer.parseInt(sval); - } - catch (NumberFormatException nfe) - { - if (sval.equals("inf")) - val = Double.POSITIVE_INFINITY; - else if (sval.equals("-inf")) - val = Double.NEGATIVE_INFINITY; - else - AExceptionHandler.processException("Corrupt Possible Range: (" + token + ")", nfe); - } - range[i][rangeCount] = val; - } - rangeCount++; - break; - - default: - AExceptionHandler.processException("fatal", "Corrupt \"pv\" definition: \"" + possibleValues + "\""); - break; - } - } - - double[] min = new double[rangeCount]; - double[] max = new double[rangeCount]; - - for (int i = 0; i < rangeCount; i++) - if (range[MIN][i] <= range[MAX][i]) - { - min[i] = range[MIN][i]; - max[i] = range[MAX][i]; - } - else - throw new Error("Bad range definiton: (" + range[0][i] + ":" + range[1][i] + ")"); - - double[] v = new double[valCount]; - - for (int i = 0; i < valCount; i++) - v[i] = range[SVAL][i]; - - range[MIN] = min; - range[MAX] = max; - range[SVAL] = v; - return range; - } - - protected static int[] getValues(String possibleValues) - { - int[] pVal = new int[100]; - int[] range = new int[2]; - int i, valCount = 0; - String token; - StringTokenizer st, st1; - - st = new StringTokenizer(possibleValues, ","); - while (st.hasMoreTokens()) - { - token = st.nextToken().trim(); - st1 = new StringTokenizer(token, ":"); - switch (st1.countTokens()) - { - case 1: - try - { - pVal[valCount++] = Integer.parseInt(st1.nextToken().trim()); - } - catch (NumberFormatException nfe) - { - AExceptionHandler.processException("Corrupt Possible Value", nfe); - } - break; - - case 2: - for (i = 0; i < 2; i++) - try - { - range[i] = Integer.parseInt(st1.nextToken().trim()); - } - catch (NumberFormatException nfe) - { - AExceptionHandler.processException("fatal", "error in range definition"); - } - - if (range[0] <= range[1]) - for (i = range[0]; i <= range[1]; i++) - pVal[valCount++] = i; - break; - - default: - AExceptionHandler.processException("fatal", "Corrupt range definition: \"" + possibleValues + "\""); - } - } - - int[] pValFinal = new int[valCount]; - - for (i = 0; i < valCount; i++) - pValFinal[i] = pVal[i]; - - return pValFinal; - } - - public boolean processCommand(String oper, double v) - { - // first I validate the operator and the value - if (!validateOperator(oper)) - return false; - if (!validateValue(v)) - return false; - - if (valueType == FLOAT) - _setD(v); - else - _setI((int) v); - - _setOperator(oper); - - refresh(); - fireParameterChanged(); - - return true; - } - - public boolean validateValue(double v) - { - if (range[SVAL] != null) - for (int i = 0; i < range[SVAL].length; i++) - if (v == range[SVAL][i]) - return true; - - if (range[MIN] != null) - for (int i = 0; i < range[MIN].length; i++) - if ((v >= range[MIN][i]) && (v <= range[MAX][i])) - return true; - - return false; - } - - public boolean validateOperator(String oper) - { - for (int i = 0; i < operators.length; i++) - if (oper.equals(operators[i])) - return true; - - return false; - } - - public int getUserLevel() - { - return userLevel; - } - - - public String toString() - { - StringBuilder s = new StringBuilder(screenName + ": "); - - if (scope == GLOBAL) - s.append("GLOBAL"); - else if (scope == LOCAL) - s.append("LOCAL"); - - s.append("["); - - // for running without Canvas (e.g. calling geometry methods from GraXML), - // this may run without Canvas initialised - // check if Canvas actually exists - // dependency of AAbstractParameter on ACanvas should be revised, this - // current solution is not very elegant - ACanvas canvas = ACanvas.getCanvas(); - String[] wName = canvas == null ? new String[0] : canvas.getKnownWindowNames(); - - for (int i = 0; i < wName.length; i++) - { - AWindow w = ACanvas.getCanvas().getWindow(wName[i]); - - s.append(wName[i] + ": " + data.getValue(w.getIndex()) + ": "); - } - - return s.toString() + "]" + " :" + toolTip + ":"; - } - - - private final void setForeground(Color color) - { - if (getNameComponent() != null) - getNameComponent().setForeground(color); - } - - public String getDifferences(String groupName) - { - StringBuffer b = new StringBuffer(); - String[] windowNames = ACanvas.getCanvas().getKnownWindowNames(); - int[] inverse = new int[windowNames.length]; - for (int i = 0; i < windowNames.length; i++) - inverse[ACanvas.getCanvas().getWindow(windowNames[i]).getIndex()] = i; - - for (int i = 0; i < wCount; ++i) - { - if (data.getStatus() != data.getStatus(i) || !data.getOperator().equals(data.getOperator(i)) || data.getValue() != data.getValue(i)) - { - - b.append("\t\t<DIFFERENCE group=\"" + groupName + "\" name=\"" + getName() + "\" windowName=\"" + windowNames[inverse[i]] + "\""); - - if (data.getValue() != data.getValue(i)) - b.append(" va=\"" + data.getValue(i) + "\""); - if (data.getStatus() != data.getStatus(i)) - { - if (data.getStatus(i)) - b.append(" st=\"ON\""); - else - b.append(" st=\"OFF\""); - } - if (!data.getOperator().equals(data.getOperator(i))) - b.append(" op=\"" + data.getOperator(i) + "\""); - b.append("/>\n"); - } - } - return b.toString(); - } - - protected double parseUnitsDouble(String text) - { - // units shown are cm - if (unitsOf == LENGTH) - { - if (text.endsWith("MM") || text.endsWith("mm")) - return 0.1 * Double.parseDouble(text.substring(0, text.length() - 2)); - if (text.endsWith("CM") || text.endsWith("cm")) - return Double.parseDouble(text.substring(0, text.length() - 2)); - if (text.endsWith("UM") || text.endsWith("um")) - return 0.0001 * Double.parseDouble(text.substring(0, text.length() - 2)); - else if (text.endsWith("M") || text.endsWith("m")) - return 100. * Double.parseDouble(text.substring(0, text.length() - 1)); - else - return Double.parseDouble(text.substring(0, text.length())); - } - else if (unitsOf == ENERGY) - { - if (text.endsWith("GeV") || text.endsWith("gev") || text.endsWith("GEV")) - return Double.parseDouble(text.substring(0, text.length() - 3)); - else if (text.endsWith("MeV") || text.endsWith("mev") || text.endsWith("MEV")) - return .001 * Double.parseDouble(text.substring(0, text.length() - 3)); - else - return Double.parseDouble(text); - } - else if (unitsOf == ENERGYMEV) - { - if (text.endsWith("MeV") || text.endsWith("mev") || text.endsWith("MEV")) - return Double.parseDouble(text.substring(0, text.length() - 3)); - else if (text.endsWith("KeV") || text.endsWith("kev") || text.endsWith("KEV")) - return .001 * Double.parseDouble(text.substring(0, text.length() - 3)); - else if (text.endsWith(" eV") || text.endsWith(" ev") || text.endsWith(" EV")) - return .000001 * Double.parseDouble(text.substring(0, text.length() - 3)); - else - return Double.parseDouble(text); - } - else - { - return Double.parseDouble(text); - } - } - - protected String parseUnits(double d) - { - // units shown are cm - double abs = Math.abs(d); - if (unitsOf == LENGTH) - { - if (abs >= 100.) - return "" + trim(d, 100.) + " m"; - else if (abs >= 1.) - return "" + trim(d, 1.) + " cm"; - else if (abs >= 0.1) - return "" + trim(d, 0.1) + " mm"; - else - return "" + trim(d, 0.0001) + " um"; - } - else if (unitsOf == ENERGY) - { - if (abs >= 1.) - return "" + trim(d, 1.) + " GeV"; - else - return "" + trim(d, 0.001) + " MeV"; - } - else if (unitsOf == ENERGYMEV) - { - if (abs >= 1.) - return "" + trim(d, 1.) + " MeV"; - else if(abs >=0.001) - return "" + trim(d, 0.001) + " KeV"; - else - return "" + trim(d, 0.000001) + " eV"; - } - else - { - return "" + trim(d, 1.); - } - } - - private String trim(double d, double factor) - { - // only display with 3 significant digits - if (unitsOf == LENGTH && Math.abs(d) < .1) - return "" + Math.rint(d / factor); - else if (unitsOf == ENERGY && Math.abs(d) < 1.) - return "" + Math.rint(d / factor); - else if (unitsOf == ENERGYMEV && Math.abs(d) < 1.) - return "" + Math.rint(d / factor); - else - return "" + Math.rint(1000. * d / factor) / 1000.; - } - - public ACheckBox getCheckBox() - { - return this.nameLabel; - } - - /** - * Check if a given operator is one of the allowed supportedOperators. - * @param oper the operator to check - * @return true if this is a known operator - */ - protected static boolean isKnownOperator(String oper) - { - for(int i=0; i<AParameter.supportedOperators.length; i++) - if(oper.equals(AParameter.supportedOperators[i])) - return true; - - return false; - } - - /** - * Tell the listeners that a parameter has changed. - */ - protected void fireParameterChanged() { - for (AParameterChangeListener listener : parameterChangeListeners) { - listener.parameterChanged(this); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AColorParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AColorParameter.java deleted file mode 100755 index 34972e6e1891..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AColorParameter.java +++ /dev/null @@ -1,92 +0,0 @@ -package atlantis.parameters; - -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import javax.swing.JComponent; - -import atlantis.gui.AColorComboBoxRenderer; -import atlantis.gui.AComboBox; - -/** - * A parameter representing a selectable colour. - */ -public class AColorParameter extends AAbstractParameter { - private AComboBox colorComboBox; - - public AColorParameter( - String name, String screenName, String toolTip, String pv, double value, - boolean haseStatus, boolean status, int userLevel, int scope) { - - super(name, screenName, toolTip, INT, value, null, null, haseStatus, status, false, userLevel, - scope, NOTHING); - - range=resolvePossibleValues(pv, INT); - if((range[SVAL]==null)&&(range[MIN]==null)) { - range[MIN]=new double[] {0}; - range[MAX]=new double[] {29}; - } - - } - - public void setD(double v) { - throw new IllegalArgumentException("is not allowed to use setD on ColorParameter"); - } - - public void setI(int v) { - if(colorComboBox!=null) - colorComboBox.setGUISelectedItem(new Integer(v)); - - _setI(v); - refresh(); - fireParameterChanged(); - } - - public void initialize() { - super.initialize(); - colorComboBox=new AComboBox(); - colorComboBox.setRenderer(new AColorComboBoxRenderer()); - colorComboBox.setToolTipText(toolTip); - - int i, j; - - for(i=0; i<range[SVAL].length; i++) { - int color=(int)range[SVAL][i]; - - if((color>=0)&&(color<=29)) - colorComboBox.addItem(new Integer(color)); - } - - for(i=0; i<range[MIN].length; i++) { - int color1=(int)range[MIN][i]; - int color2=(int)range[MAX][i]; - - if((color1>=0)&&(color1<=29)&&(color2>=0)&&(color2<=29)) - for(j=color1; j<=color2; j++) - colorComboBox.addItem(new Integer(j)); - } - - colorComboBox.setGUIItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if(e.getStateChange()==ItemEvent.SELECTED) { - int color=((Integer)colorComboBox.getSelectedItem()).intValue(); - - ACommandProcessor.receive(name+"="+color); - apply(); - } - } - }); - - colorComboBox.setGUISelectedItem(new Integer(getI())); - } - - public JComponent getValueComponent() { - return colorComboBox; - } - - public void refresh() { - _refresh(); - if(colorComboBox!=null) - colorComboBox.setGUISelectedItem(new Integer(getI())); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/ACommand.java b/graphics/AtlantisJava/src/atlantis/parameters/ACommand.java deleted file mode 100755 index 1ae57ad8ffcf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/ACommand.java +++ /dev/null @@ -1,31 +0,0 @@ -package atlantis.parameters; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JButton; - -/** - * This class is a GUI representation of a command button. - * It just generates the corresponding command when pressed. - */ -public class ACommand extends JButton { - private String command; - - ACommand(String name, String _command, String toolTip) { - super(name); - - this.command=_command; - - setToolTipText(toolTip); - addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ACommandProcessor.receive(command); - } - }); - } - - public String getName() { - return getText(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/ACommandProcessor.java b/graphics/AtlantisJava/src/atlantis/parameters/ACommandProcessor.java deleted file mode 100755 index 9c023708c66c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/ACommandProcessor.java +++ /dev/null @@ -1,451 +0,0 @@ -package atlantis.parameters; - -import java.util.Vector; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.event.AEventManager; -import atlantis.event.AFilter; -import atlantis.data.AS3DData; -import atlantis.data.ATrackData; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.projection.AProjection; -import atlantis.utils.ALogger; - -/** - * (almost?) All actions on the GUI generate a command (which is basically a - * text string) which is passed to the command processor which performs the - * actions associated with that command. This should allow a simple - * implementation of scripting and logging - * - * NOTE: This design has been dramatically neglected in the past and should - * probably be revised (Sebastian Boeser, 06.10.09) - */ - -public class ACommandProcessor -{ - private static ALogger logger = ALogger.getLogger(ACommandProcessor.class); - private static AEventManager eventManager = AEventManager.instance(); - - private static String legoLayoutName =""; - private static String[] legoWindowNames = {"current", "W", "1", "2", "3", "4"}; - private final static String[] legoStatusParameterNames = {"DrawPlot", "MainLegend", "L1EtLegend", "L1Items", "L2Items", "EFItems"}; - private final static String[] legoIntParameterNames = {"Mode", "nphicells", "netacells"}; - private final static String[] legoCaloParameterNames = {"LAr", "TILE", "FCAL", "MBTS"}; - private static boolean[][] legoStatusParameter = new boolean[6][6]; - private static int[][] legoIntParameter = new int[6][3]; - private static boolean[][] legoCaloParameter = new boolean[2][4]; - - private static APar parameterStore = APar.instance(); - - /** - * While this is called receive, it is actually just a small wrapper to - * processes a command and at the same time log it - * @param command the command to process - */ - public synchronized static void receive(String command) - { - //In debug mode show the command - logger.debug("ACommandProcessor.receive(): " + command); - //In trace mode show also who called this - logger.trace("Calling hierarchy",new Exception()); - - //Now process the command - boolean status = process(command); - - //And log the result - logger.debug( ((status)?" success: ":" bad command:") + command); - - } - - - - private synchronized static boolean process(String c) - { - - if (processGlobal(c)) - { - return true; - } - - AProjection p = ACanvas.getCanvas().getCurrentWindow().getProjection(); - // projection dependent command could be processed here - if (p.processLocalCommand(c)) - { - return true; - } - - if (parameterStore.processParameterChangeCommand(c)) - { - return true; - } - - return false; - } - - // used for checking all command are implemented - private synchronized static boolean found(int mode, String name, String command) - { - if (mode != 0) - { - logger.warn("Command not found: " + command); - return false; - } - if (name.equals(command)) - return true; - return false; - } - - private synchronized static boolean foundWindow(int mode, String name, String command) - { - if (mode != 0) - { - String[] windowNames = ACanvas.getCanvas().getKnownWindowNames(); - - for (int i = 0; i < windowNames.length; ++i) - logger.debug(command + windowNames[i]); - return false; - } - - if (name.substring(0, name.length() - 1).equals(command)) - if (ACanvas.getCanvas().isValidWindowName(name.substring(name.length() - 1))) - if (ACanvas.getCanvas().getWindow(name.substring(name.length() - 1)) != null) - return true; - return false; - } - - private synchronized static boolean processGlobal(String c) - { - return processGlobal(c, 0); - } - - private static void getGlobalCommands() - { - processGlobal("GARY", 1); - } - - private static boolean processZoomTrack(String name, int mode) - { - ATrackData tr = null; - - // check if STr (Simulated Track) Zoom Next Track was pressed - if(found(mode, name, "ZOOMNEXTSTR")) - { - tr = eventManager.getCurrentEvent().getSTrData(); - } - // check if Track (InDetTrack) Zoom Next Track was pressed - else if(found(mode, name, "ZOOMNEXTTRACK")) - { - AEnumeratorParameter listBox = null; - listBox = (AEnumeratorParameter) parameterStore.get("InDetTrack", "InDetTrackCollections"); - String col = listBox.getCurrentText(); - if("All".equals(col)) - { - String msg = "Choose a particular Track collection, " + - "can't zoom next track when 'All' is selected.\n"; - AOutput.alwaysAppend(msg, ALogInterface.WARNING); - return false; - } - else - { - tr = eventManager.getCurrentEvent().getTrackData("InDetTrack", col); - } - } - - if(tr == null) - { - // STr or Track of requested collection doesn't exits in this event - return false; - } - - // check if the datatype where Zoom Next Track was pressed is actually - // turned on and thus visible - if(! parameterStore.get("Data", tr.getName()).getStatus()) - { - AOutput.alwaysAppend("Can't zoom next track, " + tr.getNameScreenName() + - " is turned off.\n", ALogInterface.WARNING); - return false; - } - - AParameter nextTrPar = parameterStore.get(tr.getName(), "NextTrack"); - nextTrPar.setStatus(true); - nextTrPar.setI(nextTrPar.getI() + 1); - tr.zoomAroundTracks(); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - - AOutput.alwaysAppend(tr.getNameScreenName() + " -> Next Track cut active now.\n", - ALogInterface.WARNING); - - return true; - - } // processZoomTrack() - // --------------------------------------------------- - - private synchronized static boolean processGlobal(String name, int mode) - { - // is this a group in the parameter file ? - Vector<String> groups = parameterStore.getUIGroupNames(); - for (int i = 0; i < groups.size(); ++i) - { - String groupName = groups.elementAt(i); - if (found(mode, name, groupName + ".")) - { - ACanvas.getCanvas().getCurrentWindow().setGroup(groupName); - return true; - } - } - - if(found(mode, name, "SETORIGINALPRIMARYVERTEX")) - { - eventManager.getCurrentEvent().setPrimaryVertex(); - ACanvas.getCanvas().repaintAllFromScratch(); - } - - - if (found(mode, name, "LEGOTRIGGER")) - { - processLegoTrigger(); - return true; - } - - if (found(mode, name, "RETURNLEGOTRIGGER")) - { - if(legoLayoutName.equals("")) - { - AOutput.append("No trigger debugging to return from\n", ALogInterface.NORMAL); - return true; - } - - returnLegoTrigger(); - return true; - } - - if (found(mode, name, "PREVSECTOR")) - { - AParameter phi = parameterStore.get("YZ", "Phi"); - phi.setD(((Math.round(phi.getD()/22.5) + 15) % 16) * 22.5); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - return true; - } - - if (found(mode, name, "NEXTSECTOR")) - { - AParameter phi = parameterStore.get("YZ", "Phi"); - phi.setD(((Math.round(phi.getD()/22.5) + 1) % 16) * 22.5); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - return true; - } - - if (found(mode, name, "ZOOMNEXTSTR") || found(mode, name, "ZOOMNEXTTRACK")) - { - return processZoomTrack(name, mode); - } - - if (found(mode, name, "PC")) - { - getGlobalCommands(); - return true; - } - if (found(mode, name, "DO")) - { - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - return true; - } - - // turning all datatypes on/off command: - see code which was - // commented out in AtlantisJava-09-05-71 and before - - // Toggle: PT,D0,Z0,NU off:NG,NB,NS,NR,SH - if (found(mode, name, "CC")) - { - if (parameterStore.get("CutsInDet", "z0-zVtx").getStatus()) - { - parameterStore.get("CutsInDet", "z0-zVtx").setStatus(false); - parameterStore.get("CutsInDet", "d0").setStatus(false); - parameterStore.get("CutsInDet", "Pt").setStatus(false); - parameterStore.get("CutsInDet", "NumS3D").setStatus(false); - } - else - { - parameterStore.get("CutsInDet", "z0-zVtx").setStatus(true); - parameterStore.get("CutsInDet", "d0").setStatus(true); - parameterStore.get("CutsInDet", "Pt").setStatus(true); - parameterStore.get("CutsInDet", "NumS3D").setStatus(true); - } - parameterStore.get("CutsInDet", "RTrIndex").setStatus(false); - parameterStore.get("CutsInDet", "STr").setStatus(false); - parameterStore.get("CutsInDet", "Group").setStatus(false); - parameterStore.get("CutsATLAS", "Index").setStatus(false); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - return true; - } - if (found(mode, name, "FH")) - { - //Try to get SpacePoints - AS3DData spacePoints = (AS3DData) eventManager.getCurrentEvent().get("S3D"); - //Apply Hans Drevermanns hit filter - if (spacePoints != null){ - AFilter.filter(spacePoints); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - return true; - } - if (foundWindow(mode, name, "W")) - { - ACanvas.getCanvas().setCurrentWindow(name.substring(1, 2)); - return true; - } - if (foundWindow(mode, name, "C")) - { - return true; - } - if (foundWindow(mode, name, "Z")) - { - return true; - } - return false; - } // processGlobal() ------------------------------------------------------ - - private synchronized static void processLegoTrigger() - { - String currentWindowName = ACanvas.getCanvas().getCurrentWindowName(); - String currentLayoutName = ACanvas.getCanvas().getCurrentLayout().getName(); - - //save status of windows on first time button pressed - if(legoLayoutName.equals("")) - { - //output message to the user - AOutput.append("\nWindows changed to:\n",ALogInterface.TITLE); - AOutput.append("Window 1: LegoPlot with Calo View\n", ALogInterface.NORMAL); - AOutput.append("Window 2: LegoPlot with Trigger Tower View\n", ALogInterface.NORMAL); - AOutput.append("Window 3: LegoPlot with Jet Element View\n", ALogInterface.NORMAL); - AOutput.append("Window 4: LegoPlot Legend (may not be displayed if window too small)\n", ALogInterface.NORMAL); - //save current window name and layout to then parameters to restore later - legoWindowNames[0]=currentWindowName; - legoLayoutName=currentLayoutName; - for(int i=0; i<legoWindowNames.length; i++) - { - parameterStore.selectWindowParameters(legoWindowNames[i]); - if (ACanvas.getCanvas().getWindow(legoWindowNames[i]) != null) - { - //save lego status parameters - for(int j=0; j<legoStatusParameterNames.length; j++){ - legoStatusParameter[i][j]=parameterStore.get("LegoPlot", legoStatusParameterNames[j]).getStatus(); - } - //save lego int parameters - for(int j=0; j<legoIntParameterNames.length; j++){ - legoIntParameter[i][j]=parameterStore.get("LegoPlot", legoIntParameterNames[j]).getI(); - } - //save data parameters for windows 1 and 4 - if(legoWindowNames[i].equals("1")){ - for(int j=0; j<legoCaloParameterNames.length; j++){ - legoCaloParameter[0][j]=parameterStore.get("Data", legoCaloParameterNames[j]).getStatus(); - } - }else if(legoWindowNames[i].equals("4")){ - for(int j=0; j<legoCaloParameterNames.length; j++){ - legoCaloParameter[1][j]=parameterStore.get("Data", legoCaloParameterNames[j]).getStatus(); - } - } - } - parameterStore.restoreWindowParameters(); - } - } - //copy to W to make sure can switch layout to 4 squares - ACanvas.getCanvas().copyWindowSettings(currentWindowName, "W"); - if(!currentLayoutName.equals("FOUR SQUARES")) - ACanvas.getCanvas().setCurrentLayout("FOUR SQUARES"); - //for cell sizing take defaults values and then roughly scaled for different views - int nphicells = 128; - int netacells = 200; - //now copy to each window and set the display correctly - for (int i = 0; i < 4; i++) - { - String wName = Integer.toString(i + 1); - AWindow w = ACanvas.getCanvas().getWindow(wName); - parameterStore.selectWindowParameters(wName); - if (w != null) - { - ACanvas.getCanvas().copyWindowSettings("W", wName); - //first 3 windows show data items (calo, trigger towers, jet elements) - if(i<3) - { - parameterStore.get("LegoPlot", "Mode").setI(i); - parameterStore.get("LegoPlot", "DrawPlot").setStatus(true); - parameterStore.get("LegoPlot", "MainLegend").setStatus(false); - parameterStore.get("LegoPlot", "L1EtLegend").setStatus(false); - parameterStore.get("LegoPlot", "L1Items").setStatus(false); - parameterStore.get("LegoPlot", "L2Items").setStatus(false); - parameterStore.get("LegoPlot", "EFItems").setStatus(false); - parameterStore.get("LegoPlot", "nphicells").setI(nphicells/((int) Math.pow(2.0, i))); - parameterStore.get("LegoPlot", "netacells").setI(netacells/((int) Math.pow(2.0, i))); - } - else - { - //last window shows legend - parameterStore.get("LegoPlot", "DrawPlot").setStatus(false); - parameterStore.get("LegoPlot", "MainLegend").setStatus(true); - parameterStore.get("LegoPlot", "L1EtLegend").setStatus(true); - parameterStore.get("LegoPlot", "L1Items").setStatus(true); - parameterStore.get("LegoPlot", "L2Items").setStatus(true); - parameterStore.get("LegoPlot", "EFItems").setStatus(true); - } - //if first or last window it needs the data items turned on - if(i==0 || i==3) - { - for(int j=0; j<legoCaloParameterNames.length; j++){ - parameterStore.get("Data", legoCaloParameterNames[j]).setStatus(true); - } - } - } - parameterStore.restoreWindowParameters(); - ACanvas.getCanvas().moveToFrontWindow(w.getName()); - w.repaintFromScratch(); - - } - } - - private synchronized static void returnLegoTrigger() - { - //now will reset the parameters explictly set by trigger debug mode - //others may be changed as on doing trigger debug others might get changed - //when the current window is copied to W but these have been changed by the - //user so not so important to reset - - //loop backwards so can reset each window before reverting to previous layout - for(int i=legoWindowNames.length-1; i>=0; i--) - { - //reset the lego status parameters - parameterStore.selectWindowParameters(legoWindowNames[i]); - for(int j=0; j<legoStatusParameterNames.length; j++){ - parameterStore.get("LegoPlot", legoStatusParameterNames[j]).setStatus(legoStatusParameter[i][j]); - } - //reset the lego int parameters - for(int j=0; j<legoIntParameterNames.length; j++){ - parameterStore.get("LegoPlot", legoIntParameterNames[j]).setI(legoIntParameter[i][j]); - } - //reset the data ites for windows 1 and 4 - if(legoWindowNames[i].equals("1")){ - for(int j=0; j<legoCaloParameterNames.length; j++){ - parameterStore.get("Data", legoCaloParameterNames[j]).setStatus(legoCaloParameter[0][j]); - } - }else if(legoWindowNames[i].equals("4")){ - for(int j=0; j<legoCaloParameterNames.length; j++){ - parameterStore.get("Data", legoCaloParameterNames[j]).setStatus(legoCaloParameter[1][j]); - } - } - parameterStore.restoreWindowParameters(); - //finished altering window so repaint - ACanvas.getCanvas().getWindow(legoWindowNames[i]).repaintFromScratch(); - //have just finished W window so now can reset the layout - if(i==1){ - ACanvas.getCanvas().setCurrentLayout(legoLayoutName); - legoLayoutName=""; - } - } - //everything reset now make the original window where trigger debug - //was started the current window - ACanvas.getCanvas().setCurrentWindow(legoWindowNames[0]); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/ACutParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/ACutParameter.java deleted file mode 100755 index 490114e3e659..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/ACutParameter.java +++ /dev/null @@ -1,171 +0,0 @@ -package atlantis.parameters; - -import java.awt.Color; -import java.awt.event.*; -import javax.swing.*; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.AUtilities; -import atlantis.gui.AMutableCheckBox; -import atlantis.gui.AParametersTable; -import atlantis.gui.ATextField; - -/** - * A parameter representing a cut on a variable. - */ -public class ACutParameter extends AAbstractParameter { - // name component - private AMutableCheckBox checkBox; - - // value component - private ATextField textField; - - private ActionListener statusActionListener, valueActionListener; - - public ACutParameter( - String name, String screenName, String toolTip, String pv, int valueType, double value, - String operators, String defOperator, boolean haseStatus, boolean status, boolean isMod, - int userLevel, int scope, int unitsOf) { - - super(name, screenName, toolTip, valueType, value, operators, defOperator, haseStatus, status, - isMod, userLevel, scope, unitsOf); - - range=resolvePossibleValues(pv, valueType); - } - - public void setD(double v) { - if(valueType!=FLOAT) throw new IllegalArgumentException("setD acces on not FLOAT parameter"); - - if(textField!=null) textField.setText(""+v); - _setD(v); - - refresh(); - } - - public void setI(int v) { - if(valueType!=INT) throw new IllegalArgumentException("setI acces on not INT parameter"); - - if(textField!=null) textField.setText(""+v); - _setI(v); - - refresh(); - } - - public void initialize() { - checkBox=new AMutableCheckBox(screenName); - checkBox.setToolTipText(toolTip); - if(getScope()==LOCAL) - checkBox.setForeground(Color.black); - else - checkBox.setForeground(Color.blue); - - for(int i=0; i<operators.length; i++) - checkBox.addItem(operators[i]); - - checkBox.finalizeConstruction(); - checkBox.setSelectedText(getOperator()); - - statusActionListener=new ActionListener() { - public void actionPerformed(ActionEvent e) { - ACommandProcessor.receive(name); - apply(); - } - }; - - valueActionListener=new ActionListener() { - public void actionPerformed(ActionEvent e) { - applyInput(); - } - }; - - checkBox.addStatusActionListener(statusActionListener); - checkBox.addTextActionListener(valueActionListener); - - // after the first left click at the table in the parameter tabbed pane, - // all the followingmouse mouse event will be catched by the mouselisteners of those - // components inside the table cells, not the table itself, so in order for the local/global - // switch (right click to change) to always work, have to add mouse listeners to these components - // as well. - checkBox.getCheckBox().addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if(AUtilities.isRightMouseButton(e)) { - JPopupMenu popupMenu=new JPopupMenu(); - if(getScope()==AParameter.LOCAL) { - popupMenu.add(AParametersTable.SET_GLOBAL).addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - changeScope(AParameter.GLOBAL); - refresh(); - } - }); - } else { - popupMenu.add(AParametersTable.SET_LOCAL).addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - changeScope(AParameter.LOCAL); - refresh(); - } - }); - } - popupMenu.show(checkBox.getCheckBox(), e.getX(), e.getY()); - } - } - }); - - textField=new ATextField(); - textField.setToolTipText(toolTip); - - if(valueType==FLOAT) - textField.setText(""+getD()); - else - textField.setText(""+getI()); - - textField.addActionListener(valueActionListener); - - /* - textField.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - applyInput(); - } - }); - */ - } - - private void applyInput() { - try { - if(valueType==FLOAT) { - double v=parseUnitsDouble(textField.getText()); - - ACommandProcessor.receive(name+checkBox.getSelectedText()+v); - apply(); - } else { - int v=Integer.parseInt(textField.getText()); - - ACommandProcessor.receive(name+checkBox.getSelectedText()+v); - apply(); - } - } catch(NumberFormatException nfe) { - AOutput.append("value: "+textField.getText()+", is not correct!", ALogInterface.BAD_COMMAND); - } - } - - public JComponent getValueComponent() { - return textField; - } - - public JComponent getNameComponent() { - return checkBox; - } - - public void refresh() { - if(textField!=null) { - if(valueType==FLOAT) - textField.setText(parseUnits(getD())); - else - textField.setText(""+getI()); - } - if(checkBox!=null) checkBox.setStatus(getStatus()); - if(checkBox!=null) checkBox.setSelectedText(getOperator()); - fireParameterChanged(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AEnumeratorParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AEnumeratorParameter.java deleted file mode 100755 index 92cdc8019c75..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AEnumeratorParameter.java +++ /dev/null @@ -1,278 +0,0 @@ -package atlantis.parameters; - -import java.util.StringTokenizer; -import java.util.Hashtable; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import javax.swing.JComponent; - -import atlantis.output.AExceptionHandler; -import atlantis.gui.AComboBox; - - -/** - * A parameter that displays a finite list of possible values. - * Used to contain items in pTexts String[], reimplemented to contain items - * in Hash in order to be able to change the contents from event to event - * (because of the multiple collections cuts). - */ -public class AEnumeratorParameter extends AAbstractParameter -{ - private AComboBox comboBox; - private Hashtable<Integer, String> pTexts; - - - - public AEnumeratorParameter(String name, String screenName, String toolTip, - String possibleValues, double value, - boolean haseStatus, boolean status, - int userLevel, int scope) - { - super(name, screenName, toolTip, INT, value, null, null, haseStatus, - status, false, userLevel, scope, NOTHING); - - StringTokenizer st, tokenSt; - st = new StringTokenizer(possibleValues, ","); - int num = st.countTokens(); - if(num <= 0) - { - throw new Error("Empty \"pv\" attribute for ENUM: " + name); - } - pTexts = new Hashtable<Integer, String>(); - comboBox = new AComboBox(); - comboBox.setName(screenName); - - range = new double[3][]; - range[MIN] = null; - range[MAX] = null; - range[SVAL] = new double[num]; - - for(int i = 0; i < num; i++) - { - tokenSt = new StringTokenizer(st.nextToken(), "="); - if(tokenSt.countTokens() != 2) - { - throw new Error("Incomplete \"text = value\" declaration " + - "for ENUM: " + name); - } - pTexts.put(new Integer(i), tokenSt.nextToken().trim()); - - try - { - if(valueType == FLOAT) - { - range[SVAL][i] = - Double.parseDouble(tokenSt.nextToken().trim()); - } - else if(valueType == INT) - { - range[SVAL][i] = - Integer.parseInt(tokenSt.nextToken().trim()); - } - } - catch(NumberFormatException nfe) - { - String msg = "Number error for ENUM: " + name + possibleValues; - AExceptionHandler.processException(msg, nfe); - } - } - - } // AEnumeratorParameter() --------------------------------------------- - - - - public void setD(double v) - { - if(valueType != FLOAT) - { - throw new Error("setD access on not FLOAT parameter"); - } - if(comboBox != null) - { - comboBox.setGUISelectedItem(getText(v)); - } - _setD(v); - refresh(); - - } // setD() ------------------------------------------------------------- - - - - public void setI(int v) - { - if(valueType != INT) - { - throw new Error("setI access on not INT parameter"); - } - if(comboBox != null) - { - comboBox.setGUISelectedItem(getText(v)); - } - _setI(v); - refresh(); - - } // setI() ------------------------------------------------------------- - - - - public String getCurrentText() - { - return getText(getI()); - - } // getCurrentText() --------------------------------------------------- - - - - public void clear() - { - pTexts.clear(); - - } // clear() ------------------------------------------------------------ - - - - public Hashtable<Integer, String> getValuesHashtable() - { - return pTexts; - - } // getValuesHashtable() ----------------------------------------------- - - - - public int size() - { - return pTexts.size(); - - } // size() ------------------------------------------------------------- - - - - public String getText(double v) - { - for(int i = 0; i < pTexts.size(); i++) - { - if(range[SVAL][i] == v) - { - return pTexts.get(new Integer(i)); - } - } - return null; - - } // getText() ---------------------------------------------------------- - - - - public double getValue(String text) - { - for(int i = 0; i < pTexts.size(); i++) - { - if(text.equals(pTexts.get(new Integer(i)))) - { - return range[SVAL][i]; - } - } - return 0; - - } // getValue() --------------------------------------------------------- - - - - public void addItem(int key, String item) - { - pTexts.put(new Integer(key), item); - range[SVAL] = new double[pTexts.size()]; - for(int i = 0; i < pTexts.size(); i++) - { - range[SVAL][i] = i; - } - - } // addItem() ---------------------------------------------------------- - - - public void removeItem(String itemToRemove) - { - Hashtable<Integer, String> pTextsNew = new Hashtable<Integer, String>(); - for(int i = 0; i < pTexts.size(); i++) - { - String item = pTexts.get(new Integer(i)); - if(itemToRemove.equals(item)) - { - continue; - } - else - { - pTextsNew.put(new Integer(pTextsNew.size()), item); - } - } - pTexts = pTextsNew; - - range[SVAL] = new double[pTexts.size()]; - for(int i = 0; i < pTexts.size(); i++) - { - range[SVAL][i] = i; - } - - } // removeItem() ------------------------------------------------------- - - - - /** - * Initialize the contained AComboBox with the list of items stored in this AEnumeratorParameter. - * Also sets a listener to send the appropriate command when an item is selected. - */ - public void initialize() - { - super.initialize(); - // remove all existing items from, in the constructor created, comboBox - // rather than create a new instance here, because after the first - // call of this initialize() method is not possible to update items - // in the comboBox - comboBox.removeAllItems(); - comboBox.setToolTipText(toolTip); - for(int i = 0; i < pTexts.size(); i++) - { - String item = pTexts.get(new Integer(i)); - comboBox.addItem(item); - } - comboBox.setGUISelectedItem(getText(getI())); - if (!comboBox.hasGUIItemListener()) { - comboBox.setGUIItemListener(new ItemListener() - { - public void itemStateChanged(ItemEvent e) - { - if(e.getStateChange() == ItemEvent.SELECTED) - { - int index = comboBox.getSelectedIndex(); - String command = name + "=" + range[SVAL][index]; - ACommandProcessor.receive(command); - apply(); - } - } - }); - } - refresh(); - } // initialize() ------------------------------------------------------- - - - - public JComponent getValueComponent() - { - return comboBox; - - } // getValueComponent() ------------------------------------------------ - - - - public void refresh() - { - _refresh(); - if(comboBox != null) - { - comboBox.setGUISelectedItem(getText(getI())); - } - fireParameterChanged(); - } // refresh() ---------------------------------------------------------- - - - -} // class AEnumeratorParameter ============================================= diff --git a/graphics/AtlantisJava/src/atlantis/parameters/ALinkParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/ALinkParameter.java deleted file mode 100755 index c1c732e42e67..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/ALinkParameter.java +++ /dev/null @@ -1,151 +0,0 @@ -package atlantis.parameters; - - -import java.util.StringTokenizer; -import javax.swing.JComponent; - - -/** - * A parameter which represents a link to another parameter. - */ -public class ALinkParameter implements AParameter { - private String groupName, parameterName; - private AParameter parameter=null; - - public ALinkParameter(String linkTo) { - StringTokenizer st=new StringTokenizer(linkTo.trim(), "."); - - groupName=st.nextToken().trim(); - parameterName=st.nextToken().trim(); - } - - public void solveLink() { - parameter=APar.instance().get(groupName, parameterName); - } - - public void initialize() { - parameter.initialize(); - } - - public boolean isInitialized() { - return parameter.isInitialized(); - } - - public void copy(int from, int to) { - parameter.copy(from, to); - } - - public void globalize(int window) { - parameter.globalize(window); - } - - public boolean isModulus() { - return parameter.isModulus(); - } - - public int getValueType() { - return parameter.getValueType(); - } - - public void setScope(int scope) {} - - public void changeScope(int scope) { - parameter.changeScope(scope); - } - - public int getScope() { - return parameter.getScope(); - } - - public String getName() { - return parameter.getName(); - } - - public String getScreenName() { - return parameter.getScreenName(); - } - - public String getToolTip() { - return parameter.getToolTip(); - } - - public boolean validateOperator(String oper) { - return parameter.validateOperator(oper); - } - - public boolean validateValue(double v) { - return parameter.validateValue(v); - } - - public void setD(double v) { - parameter.setD(v); - } - - public void setI(int v) { - parameter.setI(v); - } - - public double getD() { - return parameter.getD(); - } - - public int getI() { - return parameter.getI(); - } - - public String getValue() { - return parameter.getValue(); - } - - public String getCurrentText(){ - if(parameter instanceof AEnumeratorParameter) - return ((AEnumeratorParameter) parameter).getCurrentText(); - else - return null; - } - - public void setStatus(boolean status) { - parameter.setStatus(status); - } - - public boolean getStatus() { - return parameter.getStatus(); - } - - public String toString() { - return parameter.toString(); - } - - public String getOperator() { - return parameter.getOperator(); - } - - public boolean processCommand(String oper, double value) { - return parameter.processCommand(oper, value); - } - - public JComponent getValueComponent() { - return parameter.getValueComponent(); - } - - public JComponent getNameComponent() { - return parameter.getNameComponent(); - } - - public void refresh() { - parameter.refresh(); - } - - public int getUserLevel() { - return parameter.getUserLevel(); - } - - public String getDifferences(String groupName) { - return ""; - } - - @Override - public void addParameterChangeListener(AParameterChangeListener listener) { - if (parameter!=null) parameter.addParameterChangeListener(listener); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AListIntegerParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AListIntegerParameter.java deleted file mode 100755 index 0f26c1588136..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AListIntegerParameter.java +++ /dev/null @@ -1,98 +0,0 @@ -package atlantis.parameters; - -import atlantis.utils.*; -import atlantis.gui.AComboBox; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import javax.swing.JComponent; - -/** - * A parameter which shows a list of possible integer values. - */ -public class AListIntegerParameter extends AAbstractParameter { - - private static ALogger logger = ALogger.getLogger(AListIntegerParameter.class); - - private AComboBox comboBox; - int[] displayableValues; - - public AListIntegerParameter( - String name, String screenName, String toolTip, String pv, int value, - boolean haseStatus, boolean status, int userLevel, int scope) { - - super(name, screenName, toolTip, INT, value, null, null, haseStatus, status, false, userLevel, - scope, NOTHING); - - range=resolvePossibleValues(pv, INT); - displayableValues=getValues(pv); - } - - public void setD(double v) { - throw new IllegalArgumentException("is not allowed to use setD on AListIntegerParameter"); - } - - public void setI(int v) { - if(comboBox!=null) comboBox.setGUISelectedItem(""+v); - _setI(v); - refresh(); - } - - public void initialize() { - super.initialize(); - comboBox=new AComboBox(); - comboBox.setEditable(true); - comboBox.setToolTipText(toolTip); - - for(int i=0; i<displayableValues.length; i++) - if(validateValue(displayableValues[i])) - comboBox.addItem(""+displayableValues[i]); - else throw new Error("Displayable Value: "+displayableValues[i]+" cannot be validated" - +toString()); - - comboBox.setGUISelectedItem(""+getI()); - - comboBox.setGUIItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if(e.getStateChange()==ItemEvent.SELECTED) - applyInput(); - } - }); - - /* - comboBox.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - applyInput(); - } - }); - */ - } - - private void applyInput() { - boolean error=false; - - try { - int val=Integer.parseInt((String)comboBox.getSelectedItem()); - - if(validateValue(val)) { - ACommandProcessor.receive(name+"="+val); - apply(); - } else - error=true; - } catch(NumberFormatException nfe) { - error=true; - } - if(error) - logger.error("value: "+comboBox.getSelectedItem()+", is not correct!"); - } - - public JComponent getValueComponent() { - return comboBox; - } - - public void refresh() { - _refresh(); - if(comboBox!=null) comboBox.setGUISelectedItem(""+getI()); - fireParameterChanged(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/ANumberParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/ANumberParameter.java deleted file mode 100755 index 403285e8648c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/ANumberParameter.java +++ /dev/null @@ -1,104 +0,0 @@ -package atlantis.parameters; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JComponent; - -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.gui.ATextField; - -public class ANumberParameter extends AAbstractParameter { - private ATextField textField; - - public ANumberParameter( - String name, String screenName, String toolTip, String pv, int valueType, double value, - boolean haseStatus, boolean status, boolean isMod, int userLevel, int scope, int unitsOf) { - - super(name, screenName, toolTip, valueType, value, null, null, haseStatus, status, isMod, - userLevel, scope, unitsOf); - range=resolvePossibleValues(pv, valueType); - } - - public void setD(double v) { - if(valueType!=FLOAT) - throw new IllegalArgumentException("setD acces on not FLOAT parameter"); - - _setD(v); - refresh(); - } - - public void setI(int v) { - if(valueType!=INT) - throw new IllegalArgumentException("setI acces on not INT parameter"); - - if(textField!=null) textField.setText(""+v); - _setI(v); - } - - public void initialize() { - super.initialize(); - - textField=new ATextField(); - textField.setEditable(true); - textField.setToolTipText(toolTip); - - if(valueType==FLOAT) - textField.setText(""+getD()); - else - textField.setText(""+getI()); - - textField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - applyInput(); - } - }); - - /* - textField.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - applyInput(); - } - }); - */ - } - - private void applyInput() { - boolean error=false; - - try { - double val=parseUnitsDouble(textField.getText()); - - if(validateValue(val)) { - if(valueType==FLOAT) { - ACommandProcessor.receive(name+getOperator()+val); - apply(); - } else { - ACommandProcessor.receive(name+getOperator()+(int)val); - apply(); - } - } else - error=true; - } catch(NumberFormatException nfe) { - error=true; - } - if(error) - AOutput.append("value: "+textField.getText()+", is not correct!", ALogInterface.BAD_COMMAND); - } - - public JComponent getValueComponent() { - return textField; - } - - public void refresh() { - _refresh(); - if(textField!=null) { - if(valueType==FLOAT) - textField.setText(parseUnits(getD())); - else - textField.setText(""+getI()); - } - fireParameterChanged(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/APar.java b/graphics/AtlantisJava/src/atlantis/parameters/APar.java deleted file mode 100644 index 1aefa78f03b7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/APar.java +++ /dev/null @@ -1,657 +0,0 @@ -package atlantis.parameters; - -import java.util.ArrayList; - -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Set; -import java.util.Vector; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.AJetData; -import atlantis.event.AEvent; -import atlantis.event.AEventManager; -import atlantis.event.ANewEventListener; -import atlantis.utils.ALogger; -import atlantis.utils.xml.AXMLUtils; - -/** - * The Atlantis parameters store. Contains a list of AParametersGroup - * groups of parameters. - * - * The class keeps a reference to a singleton instance, but this must initially be created using - * the method {@link #construct(Node)}. Attempting to access the instance before initialization will - * cause an Error to be thrown. - * - * Ideally the APar instance would be passed to the classes that need it when the application is - * initalized, but currently the instance is fetched where it is needed, in many different parts of - * the code. - */ -public final class APar implements ANewEventListener, AParameterChangeListener -{ - private static ALogger logger = ALogger.getLogger(APar.class); - - private final List<AParameterSuperGroup> superGroups = new ArrayList<AParameterSuperGroup>(); - - /** Index of the currently selected window */ - private int currentWindowIndex; - /** Index of the previously selected window. - * Used for obtaining temporary access to parameters of some window! - */ - private int previousIndex; - - /** Parameter change listeners: just the GUI for now. */ - private List<AParameterChangeListener> parameterChangeListeners = new ArrayList<AParameterChangeListener>(); - - /** The user level of the program */ - private int userLevel; - - /** The singleton instance */ - private static APar instance; - - /** - * Create and return the singleton instance. - * @param parameters - */ - public synchronized static APar construct(Node parameters) { - instance = new APar(); - instance.initialize(parameters); - return instance; - } - - /** - * Get the singleton instance. - * @return - */ - public synchronized static APar instance() { - if (instance==null) throw new Error("Attempted to access APar instance before initialization."); - return instance; - } - - /** - * For testing only: create instance without initializing. - * @return - */ - public static synchronized APar constructDummyForTesting() { - instance = new APar(); - return instance; - } - - /** - * Constructs dummy singleton instance for testing. - */ - private APar() {} - - /** - * Constructs the singleton instance by reading the config file. - */ - private void initialize(Node parameters) - { - String ul=parameters.getAttributes().getNamedItem("userLevel").getNodeValue(); - userLevel=Integer.parseInt(ul); - - NodeList superGroupNodes=parameters.getChildNodes(); - for(int s=0; s<superGroupNodes.getLength(); s++) - { - Node superGroupNode = superGroupNodes.item(s); - if (superGroupNode.getNodeType() == Node.ELEMENT_NODE) - { - // here we have a <SuperGroup> element - AParameterSuperGroup superGroup = AParameterSuperGroup.readSuperGroup(superGroupNode,userLevel); - superGroup.addParameterChangeListener(this); - - this.superGroups.add(superGroup); - } - } - // Can't resolve link parameters until all parameters configured. - for (AParameterSuperGroup superGroup : superGroups) { - superGroup.resolveLinkParameters(); - } - - previousIndex=-1; - } - - /** Used to take into account differences in local parameters. */ - public void update(Node differences) - { - if(differences==null) return; - NodeList children=differences.getChildNodes(); - int childrenCount=children.getLength(); - for(int i=0; i<childrenCount; i++) - { - Node diff=children.item(i); - if(diff.getNodeType()==Node.ELEMENT_NODE) - { - NamedNodeMap attributes=diff.getAttributes(); - String group=AXMLUtils.tryAttribut(attributes, "group"); - String name=AXMLUtils.tryAttribut(attributes, "name"); - String windowName=AXMLUtils.tryAttribut(attributes, "windowName"); - String va=AXMLUtils.tryAttribut(attributes, "va"); - String st=AXMLUtils.tryAttribut(attributes, "st"); - String op=AXMLUtils.tryAttribut(attributes, "op"); - AParameter p=get(group, name); - if(p instanceof AAbstractParameter) - { - // When setting a global variable for just one window, make it local first - if (((AAbstractParameter)p).getScope() == AAbstractParameter.GLOBAL && !windowName.equals("*")) { - System.out.println("Setting scope to local for "+p.getName()); - ((AAbstractParameter)p).setScope(AAbstractParameter.LOCAL); - } - if(va!=null&&!va.equals("")) - { - ((AAbstractParameter)p)._setValue(windowName, Double.parseDouble(va)); - } - if(st!=null&&!st.equals("")) - { - if(st.equals("ON")) - ((AAbstractParameter)p)._setStatus(windowName, true); - else if(st.equals("OFF")) - ((AAbstractParameter)p)._setStatus(windowName, false); - } - if(op!=null&&!op.equals("")) - { - ((AAbstractParameter)p)._setOperator(windowName, op); - } - ((AAbstractParameter)p).saveDefaults(); - } - } - } - } - - /** Restore default settings of all parameters. */ - public void restoreDefaults() - { - for (AParameterSuperGroup superGroup : superGroups) { - superGroup.restoreDefaults(); - } - } - - /** - * Get parameter supergroups corresponding to current user level. - * i.e. Those with a user level less than or equal to the current level. - * @return supergroups corresponding to current user level - */ - public List<AParameterSuperGroup> getUISuperGroups() { - List<AParameterSuperGroup> uiSuperGroups = new ArrayList<AParameterSuperGroup>(); - for (AParameterSuperGroup superGroup : superGroups) { - if (superGroup.getUserLevel()<=this.userLevel) uiSuperGroups.add(superGroup); - } - return uiSuperGroups; - } - - /** - * Get all the parameter groups used by the GUI, according to the user level. - * @return the parameter groups - */ - public AParametersGroup[][] getUIGroups() - { - List<AParametersGroup[]> uiSuperGroups = new ArrayList<AParametersGroup[]>(); - for (AParameterSuperGroup superGroup : superGroups) { - List<AParametersGroup> uiGroups = superGroup.getUIGroups(); - AParametersGroup[] uiGroupsArray = uiGroups.toArray(new AParametersGroup[uiGroups.size()]); - uiSuperGroups.add(uiGroupsArray); - } - AParametersGroup[][] groups = - uiSuperGroups.toArray(new AParametersGroup[uiSuperGroups.size()][]); - return groups; - } - - /** - * Get names of groups of given usage type to display in GUI. - * @param uiUsage UI usage type to select - * @return the group names - */ - public Vector<String> getUIGroupNames(int uiUsage) {return getUIGroupNames(false,uiUsage);} - - /** - * Get names of groups to display in GUI. - * @return the group names - */ - public Vector<String> getUIGroupNames() {return getUIGroupNames(true,0);} - - /** - * Get names of groups to display in GUI. - * @param selectAll true to select all regardless of UI usage - * @param uiUsage ignored if selectAll is true - * @return the group names - */ - private Vector<String> getUIGroupNames(boolean selectAll, int uiUsage) { - Vector<String> v=new Vector<String>(); - AParametersGroup[][] g=getUIGroups(); - for(int i=0;i<g.length;++i) - for(int j=0;j<g[i].length;++j) - if(selectAll || (g[i][j].getUIUsage()==uiUsage)) - v.addElement(g[i][j].getGroupName()); - return v; - } - - /** - * Find parameter group with given name. - * @param groupName name to look for - * @return the group, or null if not found - */ - public AParametersGroup getGroup(String groupName) - { - for (AParameterSuperGroup superGroup : superGroups) { - AParametersGroup group = superGroup.getGroup(groupName); - if (group!=null) return group; - } - return null; - } - - public int getUserLevel() - { - return userLevel; - } - - public AParameter get(String group, String name) - { - AParametersGroup g = getGroup(group); - if(g == null) - { - logger.debug("No group named \"" + group + "\""); - return null; - } - - AParameter p = g.getParameter(name); - if(p == null) - { - logger.debug("No parameter named \"" + group + ":" + name + "\""); - } - - return p; - } - - public AParameter getUnknown(String group, String name) - { - AParametersGroup grp = getGroup(group); - if(grp==null) - return null; - else - return grp.getParameter(name); - } - - /** - * Returns the values of an array of parameters - * (can be ANY order: C1, C2, C3 ...) - */ - public int[] getArray(String groupName, String name, int numEntries) - { - int[] array=new int[numEntries]; - - String baseName=name.substring(0, name.length()-1); - int baseNumber=Integer.parseInt(name.substring(name.length()-1, name.length())); - - for(int i=0; i<numEntries; i++) - array[i]=this.get(groupName, baseName+(baseNumber+i)).getI(); - - return array; - } - - boolean processParameterChangeCommand(String parameterChangeCommand) - { - String parameterName, sValue; - double value; - AParameter parameter=null; - String groupName = ACanvas.getCanvas().getCurrentWindow().getGroupName(); - - for(int i=0; i<AParameter.supportedOperators.length; i++) - { - int index=parameterChangeCommand.indexOf(AParameter.supportedOperators[i]); - - if(index!=-1) - { - parameterName=parameterChangeCommand.substring(0, index).trim(); - AParametersGroup pg = getGroup(groupName); - - parameter=pg.getParameter(parameterName); - - /* AEvent calls listbox initialize in order to change its values from - event to event basis - AEnumeratorParameter.initialize() -> - ACommandProcessor.receive() -> .process() -> - APar.processParameterChangeCommand() - - In case of ETMis - warning 'ETMisCollections=0.0 bad command' when - ATLAS->ETMis group wasn't the active one for a current window. - Following statement however continues if the group tab (ETMis) is - active, so it's not a bad command. - This will have to be dealt with when implementing the keyboard - commands mode of driving Atlantis, it would have to be possible to - change values, etc of group tabs which are not active. It should be - easy as local commands (like ETMisCollections) would say name of - parameter group they belong to. Proper groupName would the only problem. - */ - if(parameter==null) - { - logger.debug("APar: warning: parameter " + parameterName + - " doesn't exist " + "in active group tab " + groupName); - return true; // prevent printing warning 'bad command ...' - - // return false; - used to, hence raising 'bad command ... ' in - // ACommandProcessor.receive(). the same effect. - } - - sValue=parameterChangeCommand.substring(index+AParameter.supportedOperators[i].length(), parameterChangeCommand.length()).trim(); - - if(sValue.equals("")) break; - - try - { - value=Double.parseDouble(sValue); - } - catch(NumberFormatException e) - { - return false; - } - - return parameter.processCommand(AParameter.supportedOperators[i], value); - } - } - - AParametersGroup pg = getGroup(groupName); - - parameterName=parameterChangeCommand.trim(); - parameter=pg.getParameter(parameterName); - if(parameter!=null) - { - if(parameter.getStatus()==true) - parameter.setStatus(false); - else - parameter.setStatus(true); - return true; - } - else - return false; - } - - /** - * Copy parameters from one window to another. - * @param sourceName name of source window - * @param destName name of destination window - */ - public void copyParameters(String sourceName, String destName) - { - for (AParameterSuperGroup superGroup : superGroups) { - superGroup.copyParameters(sourceName, destName); - } - } - - public void copyCurrentGroupLocalsTo(String destinationWindow) - { - if(ACanvas.getCanvas().isValidWindowName(destinationWindow)) - { - AWindow w=ACanvas.getCanvas().getCurrentWindow(); - Vector<AParameter> params=(getGroup(w.getGroupName())).getParameters(userLevel); - - int from=w.getIndex(); - int to=ACanvas.getCanvas().getWindow(destinationWindow).getIndex(); - - for(int i=0; i<params.size(); i++) - { - AParameter p=(AParameter)params.elementAt(i); - - if(p.getScope()==AParameter.LOCAL) - p.copy(from, to); - } - } - else - throw new Error("copyCurrentGroupLocalsTo, unknown: "+destinationWindow); - } - - /** - * selectWindowParameters/restoreWindowParameters methods are used for - * obtaining temporary access to parameters of some window - */ - public void selectWindowParameters(String newWindow) - { - //ACH - this was getting thrown sometimes, and I don't know why... - //if(previousIndex!=-1) - //throw new Error("selectWindowParameters, Try to select twice !?"); - - if(ACanvas.getCanvas().isValidWindowName(newWindow)) - { - previousIndex=getCurrentWindowIndex(); - setCurrentWindowIndex(ACanvas.getCanvas().getWindow(newWindow).getIndex()); - } - else - throw new Error("selectWindowParameters, window: "+newWindow+" , doesn't exist !?"); - } - - /** - * selectWindowParameters/restoreWindowParameters methods are used for - * obtaining temporary access to parameters of some window - */ - public void restoreWindowParameters() - { - if(previousIndex!=-1) - { - setCurrentWindowIndex(previousIndex); - previousIndex=-1; - } - else - throw new Error("restoreWindowParameters: you have nothing to restore !?"); - } - - /** - * @param currentWindowIndex the currentWindowIndex to set - */ - public void setCurrentWindowIndex(int currentWindowIndex) { - this.currentWindowIndex = currentWindowIndex; - } - - /** - * @return the currentWindowIndex - */ - public int getCurrentWindowIndex() { - return currentWindowIndex; - } - - /** - * Add a listener to be informed of parameter changes. - * - * @param listener - */ - public void addParameterChangeListener(AParameterChangeListener listener) { - parameterChangeListeners.add(listener); - } - - /** - * Tell the listeners that a parameter has changed. - */ - @Override - public void parameterChanged(AParameter parameter) { - if(parameter.getName().equals("JetBTagger")){ - this.setDefaultBTaggerValue(parameter); - } - for (AParameterChangeListener listener : parameterChangeListeners) { - listener.parameterChanged(parameter); - } - } - - @Override - public void newEvent(AEvent event) { - // update collection cut listboxes for collection-aware datatypes - updateCollectionsListBoxes(event); - updateBTaggerListBox(event); - } - - /** - * Update collection cut listboxes for collection-aware datatypes. - */ - private void updateCollectionsListBoxes(AEvent event) - { - Hashtable<String,Vector<String>> collections = event.getCollections(); - String listBoxName = null; - Hashtable<Integer, String> listBoxPreviousContents = null; - Vector<String> keys = null; - String[] keysArray = null; - boolean contentsChanged = false; // contents of listbox change watchdog - Set<AEnumeratorParameter> updatedEnumeratorParameters = new HashSet<AEnumeratorParameter>(); - - // note - listBox.initialize() - // if tab containing this particular listbox was active, it didn't - // take effect to set different value by .setI() as default value - // was in this case always the first one added - .initialize() called - // automatically when tabpane is active - // if tabpane wasn't active it worked fine - for (String dataTypeName : collections.keySet()) - { - contentsChanged = false; - listBoxName = dataTypeName + "Collections"; - keys = collections.get(dataTypeName); - AEnumeratorParameter listBox = (AEnumeratorParameter) this.get(dataTypeName, listBoxName); - keysArray = keys.toArray(new String[keys.size()]); - - listBoxPreviousContents = listBox.getValuesHashtable(); - - for(int i = 0; i < listBoxPreviousContents.size(); i++) - { - String item = (String) listBoxPreviousContents.get(new Integer(i)); - if(keys.contains(item) || "All".equals(item)) - { - continue; - } - else - { - contentsChanged = true; - listBox.removeItem(item); - } - } - - for(int i = 0; i < keysArray.length; i++) - { - if(listBoxPreviousContents.containsValue(keysArray[i])) - { - continue; - } - else - { - contentsChanged = true; - listBox.addItem(listBox.size(), keysArray[i]); - } - } - - // if the previous event had completely different collections than - // the current one, 'all' item will be the only one which remained - // after removal (the first loop). then the current (new) collections - // were added in the secold loop and 'all' item was in this case the - // fist, hence the default one - not desired - // solution: if any changes were performed in these two loops - // (contentsChanged variable set to true), the listbox will - // get re-initialised anyway. by removing 'all' and subsequent - // adding it the first collection from the event will be the default - // one and 'all' would be the last item - as desired - if(contentsChanged && !dataTypeName.endsWith("Segment")) - { - listBox.removeItem("All"); - listBox.addItem(listBox.size(), "All"); - listBox.initialize(); - } - updatedEnumeratorParameters.add(listBox); - } // while - // Get the enumerator parameters so we can tell them about the new event. - List<AEnumeratorParameter> collectionParameters = new ArrayList<AEnumeratorParameter>(); - for (AParameterSuperGroup superGroup : superGroups) { - collectionParameters.addAll(superGroup.getCollectionParameters()); - } - for (AEnumeratorParameter listBox : collectionParameters) { - if (!updatedEnumeratorParameters.contains(listBox)) { - listBox.clear(); - listBox.addItem(0, "None"); - listBox.initialize(); - } - } - } // updateCollectionsCutListBoxes() ------------------------------------ - - /** - * Update btagging cut listboxes for available btaggers. - * - * @param event The current event - * - * TODO: Make this independent of context (ie. pass it the name of the listBox to update, plus the values it should use) ? - Tom - */ - private void updateBTaggerListBox(AEvent event) - { - AJetData currentjets = event.getJetData(); - if (currentjets==null) return; - List<String> taggers = currentjets.getBTaggers(); - Set<AEnumeratorParameter> updatedEnumeratorParameters = new HashSet<AEnumeratorParameter>(); - AEnumeratorParameter listBox = (AEnumeratorParameter) this.get("CutsObjects", "JetBTagger"); - - if(taggers.size() == 0) { - listBox.clear(); - listBox.addItem(0, "None"); - } - - for(int i=0; i<taggers.size(); i++) { - listBox.addItem(i, taggers.get(i)); - } - - listBox.initialize(); - updatedEnumeratorParameters.add(listBox); - - } // updateBTaggerListBox() ------------------------------------ - - /** - * Keep a list of popular 'default' values for various b-taggers - * If we don't know about the b-tagger, use a fallback default of 1.0 - * - * @param parameter The current BTagger parameter - */ - public void setDefaultBTaggerValue(AParameter parameter) { - AEventManager eventManager = AEventManager.instance(); - - //Necessary code to stop B-tagging listener when having no-jet-info xml file - AJetData Jetss = eventManager.getCurrentEvent().getJetData(); - if(Jetss == null) - return; - - // Grab the b-taggers from the current Jet Collection - List<String> taggers = eventManager.getCurrentEvent().getJetData().getBTaggers(); - if(taggers.size() == 0) - return; - - // Get the BTagName corresponding to the current selection (ordering!) - // String newTagger = taggers.get(parameter.getI()); - String newTagger = taggers.get(parameter.getI()); - - - if(newTagger.equals(new String("SV0"))){ - get("CutsObjects", "JetBTagweight").setD(5.25); - } - else if(newTagger.equals(new String("SV1"))){ - get("CutsObjects", "JetBTagweight").setD(1.00); - } - else if(newTagger.equals(new String("JetFitterCOMBNN"))){ - get("CutsObjects", "JetBTagweight").setD(2.4); - } - else if(newTagger.equals(new String("IP3D+SV1")) || newTagger.equals(new String("IP3DSV1"))){ - get("CutsObjects", "JetBTagweight").setD(1.55); - } - else if(newTagger.equals(new String("JetFitterTagNN"))){ - get("CutsObjects", "JetBTagweight").setD(1.55); - } - else if(newTagger.equals(new String("IP2D"))){ - get("CutsObjects", "JetBTagweight").setD(1.00); - } - else if(newTagger.equals(new String("IP3D"))){ - get("CutsObjects", "JetBTagweight").setD(1.00); - } - else if(newTagger.equals(new String("SV2"))){ - get("CutsObjects", "JetBTagweight").setD(1.00); - } - else if(newTagger.equals(new String("MV1"))){ - get("CutsObjects", "JetBTagweight").setD(0.601713); - } - else { - get("CutsObjects", "JetBTagweight").setD(1.00); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameter.java deleted file mode 100755 index 31b3ce329c6c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameter.java +++ /dev/null @@ -1,107 +0,0 @@ -package atlantis.parameters; - - -import javax.swing.JComponent; - - -/** - * This interface defines all the methods a parameter should have. - */ -public interface AParameter { - // scope constants - int LOCAL=1; - int GLOBAL=2; - - // value type constants - int NO_VALUE=0; - int INT=1; - int FLOAT=2; - - /** All supported supportedOperators */ - static final String[] supportedOperators= {"!=", ">=", ">", "<=", "<", "="}; - - /** Initializes graphics for this parameter. */ - void initialize(); - - /** Checks if the parameters graphics is initialized. */ - boolean isInitialized(); - - /** Copies the value and status from one window to the other. */ - void copy(int from, int to); - - /** Copies the value and status from "window" in all the others. */ - void globalize(int window); - - /** Returns true if parameter is modulus, i.e. sign is irrelevant. */ - boolean isModulus(); - - /** Return NO_VALUE, INT or FLOAT. */ - int getValueType(); - - /** sets the scope to LOCAL or GLOBAL. */ - void setScope(int scope); - - /** Returns the scope of the parameter. */ - int getScope(); - - /** Changes scope after it has originally been set. */ - void changeScope(int scope); - - /** Returns the name of the parameter. */ - String getName(); - - /** returns the screen name of the parameter. */ - String getScreenName(); - - /** Returns the tooltip text. */ - String getToolTip(); - - /** Returns the current operator assigned to parameter. */ - String getOperator(); - - /** Sets the double value for parameter. */ - void setD(double v); - void setI(int v); - - /** Returns the value of the parameter. */ - double getD(); - /** Returns the value of the parameter. */ - int getI(); - /** Returns the value of the parameter. */ - String getValue(); - - /** Sets the parameter's status. */ - void setStatus(boolean status); - - /** Returns the current status. */ - boolean getStatus(); - - /** Returns the graphical component used to display the Name and Status of this parameter. */ - JComponent getNameComponent(); - - /** Returns the graphical component used to display the value of this parameter. */ - JComponent getValueComponent(); - - /** Make synchronisation between the value and status and graphical components. */ - void refresh(); - - /** Returns true if "oper" represents an valid operator for this parameter. */ - boolean validateOperator(String oper); - - /** Returns true if "v" represents a valid value for this parameter. */ - boolean validateValue(double v); - - String getDifferences(String groupName); - - /** Validates and updates the current operator and value. */ - boolean processCommand(String oper, double v); - - /** Returns the user level associated with the parameter. */ - int getUserLevel(); - - /** Returns a String representation of the parameter. */ - String toString(); - - /** Add a parameter change listener. */ - void addParameterChangeListener(AParameterChangeListener listener); -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterChangeListener.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterChangeListener.java deleted file mode 100644 index b65e530b826d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterChangeListener.java +++ /dev/null @@ -1,11 +0,0 @@ -package atlantis.parameters; - -/** - * Used by GUI to listen for changed parameters. - * - * @author waugh - * - */ -public interface AParameterChangeListener { - void parameterChanged(AParameter parameter); -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterConfigReader.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterConfigReader.java deleted file mode 100644 index 8a2a88e9eae7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterConfigReader.java +++ /dev/null @@ -1,114 +0,0 @@ -package atlantis.parameters; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - -import atlantis.utils.xml.AXMLUtils; - -/** - * Construct AParameter objects from the XML configuration file. - * - * @author waugh - * - */ -public class AParameterConfigReader { - /** - * This function reads any type of parameters. - * @param parameter The Node containing the definition of the parameter. - * @return An AParameter object. - */ - static AParameter readParameter(Node parameter, int groupScope) - { - AParameter par=null; - - // the node name of the parameter decides its type - String type=parameter.getNodeName(); - - // read all the parameter atributes - NamedNodeMap attributes=parameter.getAttributes(); - String fn=AXMLUtils.tryAttribut(attributes, "fn"); - String sn=AXMLUtils.tryAttribut(attributes, "sn"); - String sst=AXMLUtils.tryAttribut(attributes, "st"); - String sisMod=AXMLUtils.tryAttribut(attributes, "isMod"); - String sva=AXMLUtils.tryAttribut(attributes, "va"); - String op=AXMLUtils.tryAttribut(attributes, "op"); - String dop=AXMLUtils.tryAttribut(attributes, "dop"); - String to=AXMLUtils.tryAttribut(attributes, "to"); - String pv=AXMLUtils.tryAttribut(attributes, "pv"); - String tip=AXMLUtils.tryAttribut(attributes, "tip"); - String scopeAtt=AXMLUtils.tryAttribut(attributes, "scope"); - String unitsOfAtt=AXMLUtils.tryAttribut(attributes, "u"); - - // set scope value for this parameter - int scope=groupScope; - if(scopeAtt!=null) - { - if(scopeAtt.equals("LOCAL")) - scope=AParameter.LOCAL; - else if(scopeAtt.equals("GLOBAL")) - scope=AParameter.GLOBAL; - } - - // set user level for this parameter - int ul=-1; - if(!type.equals("LINK")) - ul=Integer.parseInt(AXMLUtils.tryAttribut(attributes, "ul")); - - double va=0; - if(sva!=null) va=Double.parseDouble(sva); - - // set initial status of this parameter - boolean st=false; - if(sst!=null) - if(sst.equals("ON")) - st=true; - - boolean isMod=false; - if(sisMod!=null) - if(sisMod.equals("YES")) - isMod=true; - - int unitsOf=0; - if(unitsOfAtt!=null) - unitsOf=Integer.parseInt(unitsOfAtt); - - // create an AParameter object based on its type - if(type.equals("LINK")) - par=new ALinkParameter(to); - else if(type.equals("COLOR")) - par=new AColorParameter(fn, sn, tip, pv, va, false, st, ul, scope); - else if(type.equals("SCOLOR")) - par=new AColorParameter(fn, sn, tip, pv, va, true, st, ul, scope); - else if(type.equals("ENUM")) - par=new AEnumeratorParameter(fn, sn, tip, pv, va, false, st, ul, scope); - else if(type.equals("SENUM")) - par=new AEnumeratorParameter(fn, sn, tip, pv, va, true, st, ul, scope); - else if(type.equals("ICUT")) - par=new ACutParameter(fn, sn, tip, pv, AParameter.INT, va, op, dop, false, st, isMod, ul, scope, unitsOf); - else if(type.equals("SICUT")) - par=new ACutParameter(fn, sn, tip, pv, AParameter.INT, va, op, dop, true, st, isMod, ul, scope, unitsOf); - else if(type.equals("FCUT")) - par=new ACutParameter(fn, sn, tip, pv, AParameter.FLOAT, va, op, dop, false, st, isMod, ul, scope, unitsOf); - else if(type.equals("SFCUT")) - par=new ACutParameter(fn, sn, tip, pv, AParameter.FLOAT, va, op, dop, true, st, isMod, ul, scope, unitsOf); - else if(type.equals("FLOAT")) - par=new ANumberParameter(fn, sn, tip, pv, AParameter.FLOAT, va, false, st, isMod, ul, scope, unitsOf); - else if(type.equals("SFLOAT")) - par=new ANumberParameter(fn, sn, tip, pv, AParameter.FLOAT, va, true, st, isMod, ul, scope, unitsOf); - else if(type.equals("INT")) - par=new ANumberParameter(fn, sn, tip, pv, AParameter.INT, (int)va, false, st, isMod, ul, scope, unitsOf); - else if(type.equals("SINT")) - par=new ANumberParameter(fn, sn, tip, pv, AParameter.INT, (int)va, true, st, isMod, ul, scope, unitsOf); - else if(type.equals("LINT")) - par=new AListIntegerParameter(fn, sn, tip, pv, (int)va, false, st, ul, scope); - else if(type.equals("SLINT")) - par=new AListIntegerParameter(fn, sn, tip, pv, (int)va, true, st, ul, scope); - else if(type.equals("STATUS")) - par=new AStatusParameter(fn, sn, tip, st, ul, scope); - else if(type.equals("StatusRoot")) - par = new AStatusRootParameter(parameter, fn, sn, tip, ul, scope); - else if(type.equals("StatusGroup")) - par = new AStatusGroupParameter(parameter, fn, sn, tip, ul, scope); - return par; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterData.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterData.java deleted file mode 100644 index 0abcdf857995..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterData.java +++ /dev/null @@ -1,202 +0,0 @@ -package atlantis.parameters; - -/** - * Encapsulates the per-window data belonging to a parameter. - * - * @author waugh - * - */ -public class AParameterData { - private AParameterState[] state; - private AParameterState[] defaultState; - - protected final APar parameterStore = APar.instance(); - - /** - * Create AParameterData for given number of windows. - * @param numWindows number of windows in the canvas - */ - AParameterData(int numWindows) { - state = new AParameterState[numWindows]; - defaultState = new AParameterState[numWindows]; - initializeParameterState(state); - initializeParameterState(defaultState); - } - - /** - * Initialize arrays of AParameterState objects. - * @param state - */ - private static void initializeParameterState(AParameterState[] state) { - for (int i=0; i<state.length; ++i) { - state[i] = new AParameterState(); - } - } - - /** - * Return the state of this parameter for a given window. - * @param windowIndex index of window - * @return the state - */ - AParameterState getState(int windowIndex) { - return state[windowIndex]; - } - - /** - * Get value of parameter for current window. - * @return value - */ - public double getValue() { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - return getValue(currentWindowIndex); - } - - /** - * Get value of parameter for given window. - * @param windowIndex index of window - * @return value - */ - public double getValue(int windowIndex) { - return state[windowIndex].value; - } - - /** - * Set value of parameter for current window. - * @param value - */ - public void setValue(double value) { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - setValue(currentWindowIndex,value); - } - - /** - * Set value of parameter for given window. - * @param windowIndex index of window - * @param value - */ - public void setValue(int windowIndex, double value) { - this.state[windowIndex].value = value; - } - - /** - * Get status (whether parameter is enabled) for current window. - * @return true if enabled - */ - public boolean getStatus() { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - return getStatus(currentWindowIndex); - } - - /** - * Get status (whether parameter is enabled) for given window. - * @param windowIndex index of window - * @return true if enabled - */ - public boolean getStatus(int windowIndex) { - return state[windowIndex].status; - } - - /** - * Set status (whether parameter is enabled) for current window. - * @param status true to enable - */ - public void setStatus(boolean status) { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - setStatus(currentWindowIndex,status); - } - - /** - * Set status (whether parameter is enabled) for given window). - * @param windowIndex index of window - * @param status true to enable - */ - public void setStatus(int windowIndex, boolean status) { - this.state[windowIndex].status = status; - } - - /** - * Get operator for current window. - * @return operator - */ - public String getOperator() { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - return getOperator(currentWindowIndex); - } - - /** - * Get operator for given window. - * @param windowIndex index of window - * @return operator - */ - public String getOperator(int windowIndex) { - return state[windowIndex].operator; - } - - /** - * Set operator for current window. - * @param operator - */ - public void setOperator(String operator) { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - setOperator(currentWindowIndex,operator); - } - - /** - * Set operator for given window. - * @param windowIndex index of window - * @param operator - */ - public void setOperator(int windowIndex, String operator) { - this.state[windowIndex].operator = operator; - } - - /** - * Copy values from one window to another. - * @param from index of source window - * @param to index of destination window - */ - public void copy(int from, int to) { - if (to!=from) state[to] = state[from].copy(); - } - - /** - * Save current values for each window to be restored later. - */ - public void saveDefaults() { - int numWindows = state.length; - for (int iWindow = 0; iWindow<numWindows; ++iWindow) { - defaultState[iWindow] = state[iWindow].copy(); - } - } - - /** - * Restore values for each window from saved values. - */ - public void restoreDefaults() { - int numWindows = state.length; - for (int iWindow = 0; iWindow<numWindows; ++iWindow) { - state[iWindow] = defaultState[iWindow].copy(); - } - } - - /** - * This function is called for GLOBAL parameters to apply the value in all - * windows. - */ - public void globalize() - { - int currentWindowIndex = parameterStore.getCurrentWindowIndex(); - globalize(currentWindowIndex); - } - - /** - * This function is called for GLOBAL parameters to apply the value in all - * windows. - */ - public void globalize(int window) - { - int numWindows = state.length; - for (int i = 0; i < numWindows; i++) - copy(window, i); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterState.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterState.java deleted file mode 100644 index 0c93ee31a72b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterState.java +++ /dev/null @@ -1,38 +0,0 @@ -package atlantis.parameters; - -/** - * Encapsulate the state (value, status, operator) of a given parameter for a - * single window. - * - * @author waugh - * - */ -public class AParameterState implements Cloneable { - double value; - boolean status; - String operator = ""; - - /** - * Make a new AParameterState with default values. - */ - AParameterState() {} - - /** - * Make a new AParameterState that is a copy of another. - * Other classes should use the public copy() method. - * @param from the object to copy - */ - private AParameterState(AParameterState from) { - this.value = from.value; - this.status = from.status; - this.operator = from.operator; - } - - /** - * Make a new AParameterState that is a copy of this one. - * @return copy - */ - public AParameterState copy() { - return new AParameterState(this); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterSuperGroup.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterSuperGroup.java deleted file mode 100644 index fe01d3b3d7bf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterSuperGroup.java +++ /dev/null @@ -1,241 +0,0 @@ -package atlantis.parameters; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * A supergroup of parameters, i.e. a group of groups, corresponding to one of the - * top-level tabs in the GUI, e.g. "Projections" or "Data". - * - * @author waugh - * - */ -public class AParameterSuperGroup implements AParameterChangeListener { - private String name; - private String toolTip; - private int userLevel; - - private Map<String,AParametersGroup> parameterGroups = new HashMap<String,AParametersGroup>(); - private List<AParametersGroup> uiGroups = new ArrayList<AParametersGroup>(); - /** Keep track of enumerator parameters so we can tell them about new events. */ - private final List<AEnumeratorParameter> collectionParameters = new ArrayList<AEnumeratorParameter>(); - - private List<AParameterChangeListener> parameterChangeListeners = new ArrayList<AParameterChangeListener>(); - - private AParameterSuperGroup() {} - - static AParameterSuperGroup readSuperGroup(Node node, int applicationUserLevel) { - AParameterSuperGroup superGroup = new AParameterSuperGroup(); - superGroup.name = node.getAttributes().getNamedItem("name").getNodeValue(); - superGroup.toolTip = node.getAttributes().getNamedItem("toolTip").getNodeValue(); - String sUserLevel = node.getAttributes().getNamedItem("userLevel").getNodeValue(); - superGroup.userLevel = Integer.parseInt(sUserLevel); - superGroup.readGroups(node,applicationUserLevel); - return superGroup; - } - - /** - * Populate the lists of parameter groups and UI groups. - * @param superGroupNode - */ - private void readGroups(Node superGroupNode, int applicationUserLevel) { - NodeList groups = superGroupNode.getChildNodes(); - for (int i = 0; i < groups.getLength(); i++) - { - Node group = groups.item(i); - if (group.getNodeType() == Node.ELEMENT_NODE) - { - // here we have a <Group> element and create an AParametersGroup object from it - AParametersGroup g = readGroup(group); - - String gName = g.getGroupName(); - if (parameterGroups.containsKey(gName)) - throw new Error("Duplicate definition of group " + gName); - parameterGroups.put(gName, g); - int guiUsage = g.getUIUsage(); - - if ( ( (guiUsage == AParametersGroup.TABLE) || - (guiUsage == AParametersGroup.PROJECTION) - || (guiUsage == AParametersGroup.BRAIN_TEST) - ) && (g.getUserLevel() <= userLevel)) - uiGroups.add(g); - } - } - - } - - private AParametersGroup readGroup(Node group) - { - // first we read all the attributes - NamedNodeMap attributes=group.getAttributes(); - String groupName=attributes.getNamedItem("name").getNodeValue(); - String screenName=attributes.getNamedItem("sname").getNodeValue(); - String guiUsageAttribut=attributes.getNamedItem("guiUsage").getNodeValue(); - String scopeAttribut=attributes.getNamedItem("scope").getNodeValue(); - int ul=Integer.parseInt(attributes.getNamedItem("userLevel").getNodeValue()); - String groupToolTip=attributes.getNamedItem("toolTip").getNodeValue(); - - // set guiUsage value for this group - int guiUsage; - if(guiUsageAttribut.equals("TABLE")) - guiUsage=AParametersGroup.TABLE; - else if(guiUsageAttribut.equals("PROJECTION")) - guiUsage=AParametersGroup.PROJECTION; - else if(guiUsageAttribut.equals("BRAIN_TEST")) - guiUsage=AParametersGroup.BRAIN_TEST; - else - guiUsage=AParametersGroup.NO_USE; - - // set scope value for this group - int scope; - if(scopeAttribut.equals("LOCAL")) - scope=AParameter.LOCAL; - else if(scopeAttribut.equals("GLOBAL")) - scope=AParameter.GLOBAL; - else - scope=AParameter.GLOBAL; - - // create an AParametersGroup object based on the attributes - AParametersGroup thisGroup=new AParametersGroup(groupName, screenName, guiUsage, scope, ul, groupToolTip); - - // report error if no parameters in this group - NodeList childrens=group.getChildNodes(); - if(childrens==null) throw new Error("this group contains no parameters"); - int childrensCount=childrens.getLength(); - if(childrensCount==0) throw new Error("this group contains no parameters"); - - // read all the parameters of this group recursively - for(int i=0; i<childrensCount; i++) - { - Node child=childrens.item(i); - if(child.getNodeType()==Node.ELEMENT_NODE) - { - // for each parameter, create an object (either ACommnad or AParameter) - // and add it into the to be returned AParametersGroup object - String childName=child.getNodeName(); - if(childName.equals("Command")) { - ACommand c=readCommand(child); - if(c!=null) thisGroup.add(c); - } - else { - AParameter parameter = AParameterConfigReader.readParameter(child, scope); - parameter.addParameterChangeListener(this); - thisGroup.add(parameter); - if (parameter instanceof AEnumeratorParameter && - parameter.getScreenName().endsWith("Collections")) { - collectionParameters.add((AEnumeratorParameter)parameter); - } - } - } - } - - return thisGroup; - } - - - - private ACommand readCommand(Node commandNode) - { - NamedNodeMap attributes=commandNode.getAttributes(); - - String name=attributes.getNamedItem("name").getNodeValue(); - String command=attributes.getNamedItem("command").getNodeValue(); - String toolTip=attributes.getNamedItem("toolTip").getNodeValue(); - String userLevel=attributes.getNamedItem("ul").getNodeValue(); - if(Integer.parseInt(userLevel)<=this.userLevel) - return new ACommand(name, command, toolTip); - else - return null; - } - - /** - * Get the name of the supergroup. - * @return the name - */ - public String getName() {return name;} - - /** - * Get the tool tip for this supergroup. - * @return the tool tip - */ - public String getToolTip() {return toolTip;} - - /** - * Get the user level of this supergroup. - * @return the user level - */ - public int getUserLevel() {return userLevel;} - - /** - * Get parameter group with given name. - * @param name name of group - * @return parameter group - */ - public AParametersGroup getGroup(String name) {return parameterGroups.get(name);} - - /** - * Get the parameter groups that are displayed in the UI in the current user level. - * @return list of parameter groups - */ - public List<AParametersGroup> getUIGroups() {return uiGroups;} - - /** - * Tell the listeners that a parameter has changed. - */ - @Override - public void parameterChanged(AParameter parameter) { - for (AParameterChangeListener listener : parameterChangeListeners) { - listener.parameterChanged(parameter); - } - } - - public Map<? extends String, ? extends AParametersGroup> getParameterGroups() { - return parameterGroups; - } - - public Collection<? extends AEnumeratorParameter> getCollectionParameters() { - return collectionParameters; - } - - /** - * Add a listener to be informed of parameter changes. - * - * @param listener - */ - public void addParameterChangeListener(AParameterChangeListener listener) { - this.parameterChangeListeners.add(listener); - } - - /** - * Restore all groups in supergroup to defaults. - */ - public void restoreDefaults() { - for (AParametersGroup group : parameterGroups.values()) { - group.restoreDefaults(); - } - } - - /** - * Copy parameters from one window to another. - * @param sourceName name of source window - * @param destName name of destination window - */ - public void copyParameters(String sourceName, String destName) { - for (AParametersGroup group : parameterGroups.values()) { - group.copyParameters(sourceName, destName); - } - } - - public void resolveLinkParameters() { - for (AParametersGroup group : parameterGroups.values()) { - group.resolveLinkParameters(); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParameterUtilities.java b/graphics/AtlantisJava/src/atlantis/parameters/AParameterUtilities.java deleted file mode 100644 index 7dada86fe693..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParameterUtilities.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * - */ -package atlantis.parameters; - -import atlantis.utils.AMath; - -/** - * Mathematical utility methods that act on Parameters. - * Moved from atlantis.utils.AMath to reduce dependencies of utils on other packages. - * - * @author waugh - * - */ -public class AParameterUtilities { - - private final static APar parameterStore = APar.instance(); - private final static AParameter xVertexPar = parameterStore.get("Event", "XVtx"); - private final static AParameter yVertexPar = parameterStore.get("Event", "YVtx"); - private final static AParameter zVertexPar = parameterStore.get("Event", "ZVtx"); - - /** - * Get coordinates of event vertex. - * - * @return (x,y,z) of vertex - */ - public static double[] getPrimaryVertex() - { - double[] primaryVertex = new double[3]; - primaryVertex[0] = parameterStore.get("Event", "XVtx").getD(); - primaryVertex[1] = parameterStore.get("Event", "YVtx").getD(); - primaryVertex[2] = parameterStore.get("Event", "ZVtx").getD(); - return primaryVertex; - } - - /** - * Returns phi with respect to the primary vertex. - * @param x double x coordinate - * @param y double y coordinate - * @return double phi - */ - public static double phi(double x, double y) { - double phi = Math.atan2(y-yVertexPar.getD(), x-xVertexPar.getD()); - if (phi < 0) phi += 2.*Math.PI; - return Math.toDegrees(phi); - } - - /** - * Returns eta with respect to the primary vertex. - * @param z double z coordinate - * @param rho double rho coordinate - * @return double eta - */ - public static double eta(double z, double rho) - { - return AMath.etaAbs(z - zVertexPar.getD(), rho); - } - - public static double getPhiStereo(double rho, double phi, double z) - { - AParameter stereoAnglePar = parameterStore.get("SiCluster", "Stereo"); - if(!stereoAnglePar.getStatus()) - { - return phi; - } - double stereoAngle = stereoAnglePar.getI() * 0.04; - return phi + stereoAngle * (z-parameterStore.get("Event", "ZVtx").getD()) / rho; - } - - /** - * Get the sign of the rho coordinate based on the x and y coordinates and - * the phi value set by the user. - * @param x double x coordinate - * @param y double y coordinate - * @return int sign of rho (-1 or +1) - */ - public static int getRhoSign(double x, double y) { - return getRhoSign(Math.atan2(y, x)); - } - - /** - * Get the sign of the rho coordinate based on the phi coordinate and - * the phi value set by the user. - * @param phi double phi coordinate - * @return int sign of rho (-1 or +1) - */ - private static int getRhoSign(double phi) { - int sign; - if (phi < 0.) phi += 2.*Math.PI; - - double phiMid = Math.toRadians(parameterStore.get("RZ", "Phi").getD()); - double phiDiff = Math.abs(phi-phiMid); - - if(phiDiff <= Math.PI/2.|| phiDiff > 3*Math.PI/2.) { - sign = 1; - } else { - sign = -1; - } - return sign; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AParametersGroup.java b/graphics/AtlantisJava/src/atlantis/parameters/AParametersGroup.java deleted file mode 100755 index eeadb9d31839..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AParametersGroup.java +++ /dev/null @@ -1,157 +0,0 @@ -package atlantis.parameters; - -import atlantis.canvas.ACanvas; -import java.util.*; - -/** - * This class is used to store a set of parameters. Provides functions for - * fast searching of a parameter by its name. - */ -public class AParametersGroup { - public static final int NO_USE=0; - public static final int TABLE=1; - public static final int PROJECTION=2; - public static final int BRAIN_TEST=3; - - private String name; - private String screenName; - private String toolTip; - private int scope; - private int guiUsage; - private int userLevel; - - private Vector<AParameter> parametersVector = new Vector<AParameter>(); - private HashMap<String, AParameter> parametersMap = new HashMap<String, AParameter>(); - private Vector<ACommand> commandsVector = new Vector<ACommand>(); - - public AParametersGroup(String name, String screenName, int guiUsage, - int scope, int userLevel, String toolTip) { - - this.name=name; - - if(!screenName.trim().equals("")) - this.screenName=screenName; - else - this.screenName=name; - - this.guiUsage=guiUsage; - this.scope=scope; - this.userLevel=userLevel; - this.toolTip=toolTip; - } - - public void restoreDefaults() { - Enumeration<AParameter> parameters = parametersVector.elements(); - while(parameters.hasMoreElements()) { - AParameter p = parameters.nextElement(); - if(p instanceof AAbstractParameter) - ((AAbstractParameter)p).restoreDefaults(); - } - } - - - private void addToMap(AParameter p) { - if(parametersMap.containsKey(p.getName())) - throw new Error("Duplicate definition of parameter full name "+p.getName()); - - parametersMap.put(p.getName(), p); - } - - public void add(AParameter p) { - parametersVector.addElement(p); - if(!(p instanceof ALinkParameter)) - addToMap(p); - } - - public void add(ACommand c) { - for(int i=0; i<commandsVector.size(); i++) { - ACommand command = commandsVector.elementAt(i); - if(command.getName().equals(c.getName())) - throw new Error("Duplicate definition of command "+c.getName()); - } - commandsVector.addElement(c); - } - - public int getScope() { - return scope; - } - - public String getGroupName() { - return name; - } - - public String getScreenName() { - return screenName; - } - - public String getToolTip() { - return toolTip; - } - - public int getUIUsage() { - return guiUsage; - } - - public int getUserLevel() { - return userLevel; - } - - public ACommand[] getCommands() { - ACommand[] commands=new ACommand[commandsVector.size()]; - - for(int i=0; i<commands.length; i++) - commands[i]=commandsVector.elementAt(i); - - return commands; - } - - public Vector<AParameter> getParameters(int userLevel) { - Vector<AParameter> v=new Vector<AParameter>(parametersVector.size()); - - for(int i=0; i<parametersVector.size(); i++) { - AParameter p = parametersVector.elementAt(i); - if(p.getUserLevel()<=userLevel) - v.addElement(p); - } - - return v; - } - - public AParameter getParameter(String name) { - if(parametersMap.get(name)!=null) - return parametersMap.get(name); - // if under group "Data", should find the parameter in the whole tree - else if(parametersMap.get("Status")!=null){ - return ((AStatusRootParameter)parametersMap.get("Status")).getParameter(name); - } - else - return null; - } - - /** - * Copy parameters from one window to another. - * @param sourceName name of source window - * @param destName name of destination window - */ - public void copyParameters(String sourceName, String destName) { - int source=ACanvas.getCanvas().getWindow(sourceName).getIndex(); - int dest=ACanvas.getCanvas().getWindow(destName).getIndex(); - - for(int i=0; i<parametersVector.size(); i++) { - AParameter p = parametersVector.elementAt(i); - if(p.getScope()==AParameter.LOCAL) - p.copy(source, dest); - } - } - - public void resolveLinkParameters() { - for(int i=0; i<parametersVector.size(); i++) { - AParameter p = parametersVector.elementAt(i); - if(p instanceof ALinkParameter) { - ((ALinkParameter)p).solveLink(); - addToMap(p); - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AStatusGroupParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AStatusGroupParameter.java deleted file mode 100755 index 59bc40f1fc22..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AStatusGroupParameter.java +++ /dev/null @@ -1,213 +0,0 @@ -package atlantis.parameters; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import javax.swing.JComponent; -import java.util.ArrayList; -import java.awt.Color; -import hep.wired.util.TristateCheckBox; - -import atlantis.gui.ACheckNode; -import atlantis.gui.ACheckBox; - -/** - * Created on 16 March 2005, 16:15 - * - * @author Qiang Lu - */ -public class AStatusGroupParameter extends AAbstractParameter -{ - private ArrayList<AParameter> parameterNodeList; - - private ACheckNode statusGroupNode; - - /** Creates a new instance of AStatusGroupParameter */ - AStatusGroupParameter(Node statusGroup, String name, String screenName, String toolTip, int userLevel, int scope) - { - super(name, screenName, toolTip, AParameter.NO_VALUE, 0, null, null, false, false, - false, userLevel, scope, AAbstractParameter.NOTHING); - - // get child element of statusGroup - NodeList childrens = statusGroup.getChildNodes(); - // report error if no parameters - if (childrens == null) - throw new Error("StatusGroup element contains no parameters"); - int childrensCount = childrens.getLength(); - if (childrensCount == 0) - throw new Error("StatusGroup element contains no parameters"); - - // create an AParameter object for each node under statusGroup - // and add them into parameterNodeList - parameterNodeList = new ArrayList<AParameter>(); - for (int i = 0; i < childrensCount; i++) - { - Node child = childrens.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) - { - // here we have a <StatusGroup> or <Status> element - parameterNodeList.add(AParameterConfigReader.readParameter(child, scope)); - } - } - } - - public void initialize() - { - super.initialize(); - - // create the tree node using the <StatusGroup> element - TristateCheckBox groupCheckBox = new TristateCheckBox(screenName); - groupCheckBox.setBackground(new Color(204, 204, 204)); - if (getScope() == LOCAL) - groupCheckBox.setForeground(Color.black); - else - groupCheckBox.setForeground(Color.blue); - - groupCheckBox.setToolTipText(toolTip); - statusGroupNode = new ACheckNode(groupCheckBox, false, ACheckNode.MULTI_SELECTION, this); - - for (AParameter aNodeParameter : parameterNodeList) - { - aNodeParameter.initialize(); - if (aNodeParameter instanceof AStatusParameter) - { - if (aNodeParameter.getUserLevel() <= APar.instance().getUserLevel()) - { - ACheckBox statusCheckBox = ((AStatusParameter) aNodeParameter).getCheckBox(); - ACheckNode aNode = new ACheckNode(statusCheckBox, statusCheckBox.isSelected(), ACheckNode.SINGLE_SELECTION, aNodeParameter); - statusGroupNode.add(aNode); - } - } - else if (aNodeParameter instanceof AStatusGroupParameter) - { - statusGroupNode.add(((AStatusGroupParameter) aNodeParameter).getCheckNode()); - } - } - } - - public JComponent getValueComponent() - { - return null; - } - - public ACheckNode getCheckNode() - { - return statusGroupNode; - } - - ArrayList<AParameter> getParameterList() - { - return parameterNodeList; - } - - public AParameter getParameter(String name) - { - for (AParameter aNodeParameter : parameterNodeList) - { - if (aNodeParameter instanceof AStatusParameter) - { - if (aNodeParameter.getName().equals(name)) - return aNodeParameter; - } - else if (((AStatusGroupParameter) aNodeParameter).getParameter(name) != null) - { - return ((AStatusGroupParameter) aNodeParameter).getParameter(name); - } - } - return null; - } - - public AParameter getGroupParameter(String name) - { - if(getName().equals(name)) - return this; - for (AParameter aNodeParameter : parameterNodeList) - { - if (aNodeParameter instanceof AStatusGroupParameter) - { - if (((AStatusGroupParameter) aNodeParameter).getGroupParameter(name) != null) - { - return ((AStatusGroupParameter) aNodeParameter).getGroupParameter(name); - } - } - } - return null; - } - - public boolean getStatus() - { - return statusGroupNode.isSelected(); - } - - public void setStatus(boolean status) - { - for (AParameter aNodeParameter : parameterNodeList) - { - aNodeParameter.setStatus(status); - } - } - - public void refresh() - { - _refresh(); - fireParameterChanged(); - } - - public void setD(double v) - { - throw new IllegalArgumentException("StatusGroupParameter hase no value"); - } - - public void setI(int v) - { - throw new IllegalArgumentException("StatusGroupParameter hase no value"); - } - - public void saveChildrenDefaults() - { - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - if(aNodeAbstractParameter instanceof AStatusGroupParameter) - ((AStatusGroupParameter)aNodeAbstractParameter).saveChildrenDefaults(); - else - ((AStatusParameter)aNodeAbstractParameter).saveDefaults(); - } - } - - public void restoreDefaults() - { - super.restoreDefaults(); - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - aNodeAbstractParameter.restoreDefaults(); - } - } - - public void copy(int from, int to) - { - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - aNodeAbstractParameter.copy(from, to); - } - } - - public String getDifferences(String groupName) - { - StringBuffer ret = new StringBuffer(); - - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - if(aNodeAbstractParameter instanceof AStatusGroupParameter) - ret.append(((AStatusGroupParameter)aNodeAbstractParameter).getDifferences(groupName)); - else - ret.append(aNodeAbstractParameter.getDifferences(groupName)); - } - - return ret.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AStatusParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AStatusParameter.java deleted file mode 100755 index ad42a168db9f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AStatusParameter.java +++ /dev/null @@ -1,58 +0,0 @@ -package atlantis.parameters; - -import javax.swing.JLabel; -import javax.swing.LookAndFeel; -import javax.swing.JComponent; - -/** - * A parameter representing an on/off value. Corresponds to an ACheckBox in the GUI. - */ -public class AStatusParameter extends AAbstractParameter -{ - private JLabel valueLabel; - - public AStatusParameter(String name, String screenName, String toolTip, - boolean status, int userLevel, int scope) - { - super(name, screenName, toolTip, NO_VALUE, 0, null, null, true, - status, false, userLevel, scope, NOTHING); - } - - - public void setD(double v) - { - throw new IllegalArgumentException("StatusParameter has no value"); - } - - - public void setI(int v) - { - throw new IllegalArgumentException("StatusParameter has no value"); - } - - - public void initialize() - { - super.initialize(); - valueLabel = new JLabel(); - valueLabel.setOpaque(true); - valueLabel.setToolTipText(toolTip); - LookAndFeel.installColorsAndFont(valueLabel, "CheckBox.background", - "CheckBox.foreground", - "CheckBox.font"); - } - - - public JComponent getValueComponent() - { - return valueLabel; - } - - - public void refresh() - { - _refresh(); - fireParameterChanged(); - } - -} // class AStatusParameter ================================================= diff --git a/graphics/AtlantisJava/src/atlantis/parameters/AStatusRootParameter.java b/graphics/AtlantisJava/src/atlantis/parameters/AStatusRootParameter.java deleted file mode 100755 index fbbf4f40448e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/AStatusRootParameter.java +++ /dev/null @@ -1,435 +0,0 @@ -package atlantis.parameters; - -import hep.wired.util.TristateCheckBox; - -import java.awt.Color; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Iterator; - -import javax.swing.JComponent; -import javax.swing.JPopupMenu; -import javax.swing.JTree; -import javax.swing.ToolTipManager; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import atlantis.utils.AUtilities; -import atlantis.gui.ACheckBox; -import atlantis.gui.ACheckNode; -import atlantis.gui.AParametersTable; -import atlantis.gui.ATreeCellRenderer; - -/** - * AStatusRootParameter.java - * - * Created on 14 March 2005, 17:49 - * - * @author Qiang Lu - */ -public class AStatusRootParameter extends AAbstractParameter -{ - private ArrayList<AParameter> parameterNodeList; - - private JTree statusTree; - - private ACheckNode statusRootNode; - - /** Creates a new instance of AStatusGroupParameter */ - AStatusRootParameter(Node statusRoot, String name, String screenName, String toolTip, int userLevel, int scope) - { - super(name, screenName, toolTip, AParameter.NO_VALUE, 0, null, null, false, false, - false, userLevel, scope, AAbstractParameter.NOTHING); - // get child element of statusRoot - NodeList childrens = statusRoot.getChildNodes(); - // report error if no parameters - if (childrens == null) - throw new Error("this group contains no parameters"); - int childrensCount = childrens.getLength(); - if (childrensCount == 0) - throw new Error("this group contains no parameters"); - - // create an AParameter object for each node under statusRoot - // and add them into parameterNodeList - parameterNodeList = new ArrayList<AParameter>(); - for (int i = 0; i < childrensCount; i++) - { - Node child = childrens.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) - { - // here we have a <StatusGroup> or <Status> element - parameterNodeList.add(AParameterConfigReader.readParameter(child, scope)); - } - } - } - - public void initialize() - { - super.initialize(); - - // create the root node of the tree using the <StatusRoot> element - TristateCheckBox rootCheckBox = new TristateCheckBox(screenName); - rootCheckBox.setBackground(new Color(204, 204, 204)); - if (getScope() == LOCAL) - rootCheckBox.setForeground(Color.black); - else - rootCheckBox.setForeground(Color.blue); - - rootCheckBox.setToolTipText(toolTip); - statusRootNode = new ACheckNode(rootCheckBox, false, ACheckNode.MULTI_SELECTION, this); - for (AParameter aNodeParameter : parameterNodeList) - { - aNodeParameter.initialize(); - if (aNodeParameter instanceof AStatusParameter) - { - if (aNodeParameter.getUserLevel() <= APar.instance().getUserLevel()) - { - ACheckBox statusCheckBox = ((AStatusParameter) aNodeParameter).getCheckBox(); - ACheckNode aNode = new ACheckNode(statusCheckBox, statusCheckBox.isSelected(), ACheckNode.SINGLE_SELECTION, aNodeParameter); - statusRootNode.add(aNode); - } - } - else if (aNodeParameter instanceof AStatusGroupParameter) - { - statusRootNode.add(((AStatusGroupParameter) aNodeParameter).getCheckNode()); - } - } - - statusTree = new JTree(statusRootNode); - statusTree.setBackground(new Color(204, 204, 204)); - statusTree.setCellRenderer(new ATreeCellRenderer()); - statusTree.addMouseListener(new NodeSelectionListener(statusTree)); - ToolTipManager.sharedInstance().registerComponent(statusTree); - } - - public JComponent getValueComponent() - { - return null; - } - - public JComponent getNameComponent() - { - return statusTree; - } - - ArrayList<AParameter> getParameterList() - { - return parameterNodeList; - } - - public AParameter getParameter(String name) - { - for (AParameter aNodeParameter : parameterNodeList) - { - if (aNodeParameter instanceof AStatusParameter) - { - if (aNodeParameter.getName().equals(name)) - return aNodeParameter; - } - else if (((AStatusGroupParameter) aNodeParameter).getParameter(name) != null) - { - return ((AStatusGroupParameter) aNodeParameter).getParameter(name); - } - } - return null; - } - - public AParameter getGroupParameter(String name) - { - if(!isInitialized()) - initialize(); - - if(getName().equals(name)) - return this; - for (AParameter aNodeParameter : parameterNodeList) - { - if (aNodeParameter instanceof AStatusGroupParameter) - { - if (((AStatusGroupParameter) aNodeParameter).getGroupParameter(name) != null) - { - return ((AStatusGroupParameter) aNodeParameter).getGroupParameter(name); - } - } - } - return null; - } - - public boolean getStatus() - { - return statusRootNode.isSelected(); - } - - public void setStatus(boolean status) - { - for (AParameter aNodeParameter : parameterNodeList) - { - aNodeParameter.setStatus(status); - } - } - - public void refresh() - { - _refresh(); - fireParameterChanged(); - } - - public void setD(double v) - { - throw new IllegalArgumentException("StatusRootParameter hase no value"); - } - - public void setI(int v) - { - throw new IllegalArgumentException("StatusRootParameter hase no value"); - } - - public void saveChildrenDefaults() - { - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - if(aNodeAbstractParameter instanceof AStatusGroupParameter) - ((AStatusGroupParameter)aNodeAbstractParameter).saveChildrenDefaults(); - else - ((AStatusParameter)aNodeAbstractParameter).saveDefaults(); - } - } - - public void restoreDefaults() - { - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - aNodeAbstractParameter.restoreDefaults(); - } - if(statusTree != null) - { - for (int i = 1; i < statusTree.getRowCount(); i++) - statusTree.collapseRow(i); - } - } - - public void copy(int from, int to) - { - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - aNodeAbstractParameter.copy(from, to); - } - } - - public String getDifferences(String groupName) - { - StringBuffer ret = new StringBuffer(); - - for (AParameter aNodeParameter : parameterNodeList) - { - AAbstractParameter aNodeAbstractParameter = (AAbstractParameter) aNodeParameter; - if(aNodeAbstractParameter instanceof AStatusGroupParameter) - ret.append(((AStatusGroupParameter)aNodeAbstractParameter).getDifferences(groupName)); - else - ret.append(((AStatusParameter)aNodeAbstractParameter).getDifferences(groupName)); - } - - return ret.toString(); - } - - public class NodeSelectionListener extends MouseAdapter - { - private JTree tree; - - private int offsetX; - private int offsetY; - - NodeSelectionListener(JTree tree) - { - this.tree = tree; - offsetX = 0; - offsetY = 0; - } - - public void setOffset(int x, int y) - { - offsetX = x; - offsetY = y; - } - - public int getOffsetX() - { - return offsetX; - } - - public int getOffsetY() - { - return offsetY; - } - - public void mousePressed(MouseEvent e) - { - if (AUtilities.isRightMouseButton(e)) - { - AParameter clickedPar = null; - int x = e.getX(); - int y = e.getY(); - int row = tree.getRowForLocation(x, y); - TreePath path = tree.getPathForRow(row); - if (path != null) - { - Object clickedNode = path.getLastPathComponent(); - if (clickedNode instanceof ACheckNode) - { - ACheckNode node = (ACheckNode) clickedNode; - clickedPar = node.getParameter(); - } - - final AParameter effectPar = clickedPar; - if(effectPar instanceof AStatusParameter) - { - JPopupMenu popupMenu = new JPopupMenu(); - if (effectPar.getScope() == AParameter.LOCAL) - { - popupMenu.add(AParametersTable.SET_GLOBAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - effectPar.changeScope(AParameter.GLOBAL); - refresh(); - } - }); - } - else - { - popupMenu.add(AParametersTable.SET_LOCAL).addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - effectPar.changeScope(AParameter.LOCAL); - refresh(); - } - }); - } - if (tree.isShowing()) - popupMenu.show(tree, e.getX(), e.getY()); - else - // when e.getSource() is the table - popupMenu.show((Component) e.getSource(), e.getX() + getOffsetX(), e.getY() + getOffsetY()); - } - else - { - popupGroupScopeMenu(effectPar, e); - } - } - } - } - - // groupPar is either AStatusRootParameter or AStatusGroupParameter - private final void changeGroupScopes(AParameter groupPar, int scope) - { - Iterator<AParameter> it; - if(groupPar instanceof AStatusRootParameter) - it = ((AStatusRootParameter) groupPar).getParameterList().iterator(); - else - it = ((AStatusGroupParameter) groupPar).getParameterList().iterator(); - while (it.hasNext()) - { - AParameter aPar = it.next(); - // aPar is either AStatusGroupParameter or AStatusParameter - if(aPar instanceof AStatusGroupParameter) - changeGroupScopes(aPar, scope); - else - aPar.changeScope(scope); - } - } - - // groupPar is either AStatusRootParameter or AStatusGroupParameter - private void popupGroupScopeMenu(AParameter groupPar, MouseEvent e) - { - final AParameter tmpPar = groupPar; - JPopupMenu popupMenu = new JPopupMenu(); - popupMenu.add(AParametersTable.SET_ALL_LOCAL).addActionListener( - new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeGroupScopes(tmpPar, AParameter.LOCAL); - refresh(); - } - }); - popupMenu.add(AParametersTable.SET_ALL_GLOBAL).addActionListener( - new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - changeGroupScopes(tmpPar, AParameter.GLOBAL); - refresh(); - } - }); - if (tree.isShowing()) - popupMenu.show(tree, e.getX(), e.getY()); - else - // when e.getSource() is the table - popupMenu.show((Component) e.getSource(), e.getX() + getOffsetX(), e.getY() + getOffsetY()); - } - - public void mouseClicked(MouseEvent e) - { - if (AUtilities.isRightMouseButton(e)) - { - return; - } - int x = e.getX(); - int y = e.getY(); - int row = tree.getRowForLocation(x, y); - TreePath path = tree.getPathForRow(row); - if (path != null) - { - Object clickedNode = path.getLastPathComponent(); - if (clickedNode instanceof ACheckNode) - { - ACheckNode node = (ACheckNode) clickedNode; - boolean newSelectionFlag; - if (node.getParameter() instanceof AStatusParameter) - newSelectionFlag = !node.isSelected(); - else - { - TristateCheckBox.State currentState = ((TristateCheckBox) node.getUserObject()).getState(); - if (currentState == TristateCheckBox.NOT_SELECTED) - newSelectionFlag = true; - else - newSelectionFlag = false; - } - node.getClicked(newSelectionFlag, true); - - if ((node.getSelectionMode() == ACheckNode.MULTI_SELECTION)) - { - if (node.isSelected()) - { - tree.expandPath(path); - } - else - { - if (row != 0) - tree.collapsePath(path); - } - } - ((DefaultTreeModel) tree.getModel()).nodeChanged(node); - // I need revalidate if node is root. but why? - if (row == 0) - { - tree.revalidate(); - tree.repaint(); - } - } - } - } - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/parameters/package.html b/graphics/AtlantisJava/src/atlantis/parameters/package.html deleted file mode 100644 index 8572821c5f1e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/parameters/package.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<head></head> -<body> -<p>Application parameter store where APar and AParameter are the main - classes.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjection.java b/graphics/AtlantisJava/src/atlantis/projection/AProjection.java deleted file mode 100755 index 2cd72969cf86..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjection.java +++ /dev/null @@ -1,32 +0,0 @@ -package atlantis.projection; - - -import java.awt.event.ActionListener; -import atlantis.canvas.AWindow; -import atlantis.event.AEventManager; -import atlantis.parameters.APar; - -import javax.swing.*; -import java.awt.*; - - -public abstract class AProjection implements ActionListener { - - protected static APar parameterStore = APar.instance(); - protected static AEventManager eventManager = AEventManager.instance(); - - public abstract String getName(); - public abstract String getScreenName(); - public abstract void paint(AWindow window, Graphics g); - - public abstract JMenuItem[] getPopupItems(); - - // next 4/5 needed for normal 2d projections, not for others e.g. Braintests - // should be changed at some point..... - public abstract String getXLabel(); - public abstract String getYLabel(); - public abstract String getXUnits(); - public abstract String getYUnits(); - public abstract void setScales(); - public abstract boolean processLocalCommand(String name); -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjection2D.java b/graphics/AtlantisJava/src/atlantis/projection/AProjection2D.java deleted file mode 100755 index d7a12dd4ead1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjection2D.java +++ /dev/null @@ -1,348 +0,0 @@ -package atlantis.projection; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.util.List; -import java.util.ArrayList; - -import javax.swing.JMenuItem; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.ACalorimeterData; -import atlantis.data.ADHelix; -import atlantis.event.AData; -import atlantis.event.AEvent; -import atlantis.geometry.AAtlasDetector; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.parameters.AParameter; -import atlantis.utils.APolygon; -import atlantis.utils.AVector; - -/** - * Base class of Standard 2D projections handles the painting of a projection - * Handles non-linear transforms (linear transforms in AWindow) - */ -public abstract class AProjection2D extends AProjection -{ - private boolean debug = false; - protected ArrayList<JMenuItem> popupItems; - protected final static String ASPECT_RATIO_1 = "Aspect Ratio 1"; - - public AProjection2D() - { - popupItems = new ArrayList<JMenuItem>(); - } - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - - if (action.equals(ASPECT_RATIO_1)) - setAspectRatio1(ACanvas.getCanvas().getCurrentWindow()); - } - - public void setAspectRatio1(AWindow window) - { - //Get the extend of the shown projection (i.e. the corners in user coordinates) - Point2D.Double[] corners = window.getUserCorners(); - AVector v01 = new AVector(corners[0], corners[1]); - AVector v12 = new AVector(corners[1], corners[2]); - //Get the actual size of this window on the screen - Rectangle wSize = window.getBounds(); - - //Calculate new corner positions - //This seems a bit longish to me... CLEANUP - S.B. - - //Calculate stretch factor f such that we keep the larger one of the two extends in user coordinates - //"modulus" just means length of vector! - double f = Math.min(wSize.width / v01.modulus(), wSize.height / v12.modulus()); - - //Rescale new width and height - double w = wSize.width / f; - double h = wSize.height / f; - - //All this just to calculate the center and the new scale - //Maybe easier to split with an if-statement rather than using "Math.min" above - AVector down = v12.getUnitary().scale(h / 2); - AVector up = v12.getUnitary().invert().scale(h / 2); - - AVector v0 = v01.getUnitary().invert().scale(w / 2).add(up); - AVector v1 = v01.getUnitary().scale(w / 2).add(up); - AVector v2 = v01.getUnitary().scale(w / 2).add(down); - - AVector v02 = new AVector(corners[0], corners[2]).scale(0.5); - Point2D.Double center = new Point2D.Double(corners[0].x + v02.dx, corners[0].y + v02.dy); - - //Set the new corner positions - corners[0].setLocation(center.x + v0.dx, center.y + v0.dy); - corners[1].setLocation(center.x + v1.dx, center.y + v1.dy); - corners[2].setLocation(center.x + v2.dx, center.y + v2.dy); - - //Apply new user coordinates - window.setUserCorners(corners); - } - - public boolean processLocalCommand(String name) - { - return false; - } - - public abstract String getName(); - - public String getScreenName() - { - return getName(); - } - - protected Color getBackgroundFillColor(Color[] colorMap) - { - return colorMap[parameterStore.get("Color", "BkgFill").getI()]; - } - - // min rho for tracks - public double getMinRho() - { - return 0.; - } - - public void paint(AWindow window, Graphics g) - { - - AEvent event = null; - List hitsAndTracks = null; - AGraphics ag = AGraphics.makeAGraphics(g); - long time = 0; - - if (debug) - { - time = System.currentTimeMillis(); - } - fillBackground(window, ag); - if (debug) - { - System.out.println("fill " + (System.currentTimeMillis() - time)); - time = System.currentTimeMillis(); - } - - // draw detector geometry - AAtlasDetector.getDetector().draw(window, ag, this); - if (debug) - { - System.out.println("det " + (System.currentTimeMillis() - time)); - time = System.currentTimeMillis(); - } - - // is true when F key is pressed during ZMR operations (detector is - // zoomed for instance, but data are not drawn during the operation) - boolean fastZooming = parameterStore.get("Projection", "SkipData").getStatus(); - if (fastZooming) - { - return; - } - - // draw the current event - event = eventManager.getCurrentEvent(); - - //If there is no current event do nothing - if (event == null) return; - - ACalorimeterData.drawCalorimeters(window, ag, this, event); - - hitsAndTracks = event.getHitsAndTracks(this); - if (debug) - { - System.out.println("calo " + (System.currentTimeMillis() - time)); - time = System.currentTimeMillis(); - } - for (int h = 0; h < hitsAndTracks.size(); h++) - { - ((AData) hitsAndTracks.get(h)).draw(window, ag, this); - if (debug) - { - long delta = (System.currentTimeMillis() - time); - if (delta > 0) - { - System.out.println(((AData) hitsAndTracks.get(h)).getName() + " " + delta); - } - time = System.currentTimeMillis(); - } - } // for - - } // paint() - - protected void fillBackground(AWindow window, AGraphics ag) - { - ag.setColor(getBackgroundFillColor(AColorMap.getColors())); - ag.fillRect(0, 0, window.getWidth(), window.getHeight()); - } - - // this is here to make drawing of tracks fast enough - public abstract ACoord getUserPoint(ADHelix dH, double s); - - public ACoord nonLinearTransform(ACoord user) - { - return user; - } - - public ACoord[] nonLinearTransform(ACoord[] user) - { - if (user != null) - for (int i = 0; i < user.length; i++) - user[i] = nonLinearTransform(user[i]); - return user; - } - - public Point2D.Double nonLinearTransform(double x, double y) - { - ACoord c = nonLinearTransform(new ACoord(x, y)); - return new Point2D.Double(c.hv[0][0][0], c.hv[1][0][0]); - } - - public Point2D.Double nonLinearTransform(Point2D.Double user) - { - return nonLinearTransform(user.x, user.y); - } - - public ACoord inverseNonLinearTransform(ACoord user) - { - return user; - } - - public Point2D.Double inverseNonLinearTransform(double x, double y) - { - ACoord c = inverseNonLinearTransform(new ACoord(x, y)); - - return new Point2D.Double(c.hv[0][0][0], c.hv[1][0][0]); - } - - public Point2D.Double inverseNonLinearTransform(Point2D.Double user) - { - return inverseNonLinearTransform(user.x, user.y); - } - - protected static ACoord nonLinearTransform2D(ACoord user, String projectionName) - { - AParameter fishEyePar = parameterStore.get(projectionName, "FishEye"); - - if (fishEyePar.getStatus()) - { - double[] z, r; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(projectionName, "rTo").getD(); - double zTo = parameterStore.get(projectionName, "zTo").getD(); - - for (int j = 0; j < user.hv[0].length; ++j) - { - z = user.hv[0][j]; - r = user.hv[1][j]; - for (int i = 0; i < z.length; ++i) - { - z[i] *= (1 + fishEye * zTo) / (1 + fishEye * Math.abs(z[i])); - r[i] *= (1 + fishEye * rTo) / (1 + fishEye * Math.abs(r[i])); - } - } - } - return user; - } - - protected static ACoord inverseNonLinearTransform2D(ACoord user, String projectionName) - { - AParameter fishEyePar = parameterStore.get(projectionName, "FishEye"); - - if (fishEyePar.getStatus()) - { - double[] z, r; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(projectionName, "rTo").getD(); - double zTo = parameterStore.get(projectionName, "zTo").getD(); - - for (int j = 0; j < user.hv[0].length; ++j) - { - z = user.hv[0][j]; - r = user.hv[1][j]; - for (int i = 0; i < z.length; ++i) - { - z[i] *= 1 / (1 + fishEye * (zTo - Math.abs(z[i]))); - r[i] *= 1 / (1 + fishEye * (rTo - Math.abs(r[i]))); - } - } - } - return user; - } - - protected static Point2D.Double[] aspectRatioLayout(double width, double height, Dimension wSize) - { - double f = Math.min(wSize.width / width, wSize.height / height); - - width = wSize.width / f; - height = wSize.height / f; - - Point2D.Double[] corners = new Point2D.Double[3]; - - corners[0] = new Point2D.Double(-width, +height); - corners[1] = new Point2D.Double(+width, +height); - corners[2] = new Point2D.Double(+width, -height); - return corners; - } - - public void setScales() - {} - - public abstract Point2D.Double[] calculateNoZoomCorners(Dimension wSize); - - public abstract Point2D.Double getCenter(); - - public Point2D.Double[] validateCorners(Point2D.Double[] corners) - { - APolygon p = new APolygon(); - - for (int i = 0; i < corners.length; i++) - p.addPoint(corners[i].x, corners[i].y); - - if (p.getArea() == 0) - return null; - else - return corners; - } - - /** - * This function is called when the ACanvas configuration was written on - * a screen with one aspect ratio but the current screen has a different - * aspect ratio. Subclasses may re-implement this to behave however they - * like. At present (when this was written) only YX does anything. - * - * -- Adam Davison - * - * @param w AWindow object containing this - * @param oldaspect Aspect ratio of screen where current window corners were chosen - * @param newaspect Aspect ratio of screen now - */ - - public void aspectRatioChange(AWindow w, double oldaspect, double newaspect) { - // Do nothing by default - } - - public JMenuItem[] getPopupItems() - { - // Can't cast arrays very easily... - JMenuItem[] ret = new JMenuItem[popupItems.size()]; - for (int i = 0; i < popupItems.size(); i++) { - ret[i] = (JMenuItem)popupItems.get(i); - } - return ret; - } - - protected void addPopupItem(String str) { - JMenuItem it = new JMenuItem(str); - popupItems.add(it); - it.addActionListener(this); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjection3D.java b/graphics/AtlantisJava/src/atlantis/projection/AProjection3D.java deleted file mode 100755 index 28bf192814cf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjection3D.java +++ /dev/null @@ -1,167 +0,0 @@ -package atlantis.projection; - -import atlantis.data.ADHelix; -import atlantis.graphics.*; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import atlantis.event.*; -import java.awt.*; -import java.awt.geom.*; -import javax.swing.JMenuItem; - -public class AProjection3D extends AProjection2D { - - // axis about which the rotations take place - static private double phi; - static private double sinPhi, cosPhi; - // center of rotation in xyz frame - static private double rx, ry, rz; - // three axis abc in the xyz frame - static private double ax, ay, az; - static private double bx, by, bz; - static private double cx, cy, cz; - - static private double[][] abc=new double[3][3]; - - public AProjection3D() { - JMenuItem asp = new JMenuItem(ASPECT_RATIO_1); - asp.addActionListener(this); - popupItems.add(asp); - } - - public String getName() { - return "3D"; - } - - public String getXLabel() { - return "V"; - } - - public String getYLabel() { - return "H"; - } - - public String getXUnits() { - return "(cm)"; - } - - public String getYUnits() { - return "(cm)"; - } - - public Point2D.Double getCenter() { - return new Point2D.Double(0, 0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - double radius=parameterStore.get("Projection", "TrackingRadius").getD(); - double length=parameterStore.get("Projection", "TrackingLength").getD(); - return aspectRatioLayout(length, radius, wSize); - } - - public static double getPhi() { - return parameterStore.get("3D", "Phi").getD(); - } - - public static void updateParameters() { - phi=Math.toRadians(getPhi()); - sinPhi=Math.sin(phi); - cosPhi=Math.cos(phi); - ax=parameterStore.get("3D", "xAxis").getD(); - ay=parameterStore.get("3D", "yAxis").getD(); - az=parameterStore.get("3D", "zAxis").getD(); - rx=parameterStore.get("Event", "XVtx").getD(); - ry=parameterStore.get("Event", "YVtx").getD(); - rz=parameterStore.get("Event", "ZVtx").getD(); - double dx; - double dy; - double dz; - - if(ax==0.&&ay==0) { - // d is the y-axis - dx=0.; - dy=-1.; - dz=0.; - } else { - // d is the z-axis - dx=0.; - dy=0.; - dz=1.; - } - - bx=+ay*dz-az*dy; - by=-ax*dz+az*dx; - bz=+ax*dy-ay*dx; - - cx=+ay*bz-az*by; - cy=-ax*bz+az*bx; - cz=+ax*by-ay*bx; - } - - public static double[][] getRotationMatrix() { - updateParameters(); - abc[0][0]=ax; - abc[0][1]=ay; - abc[0][2]=az; - abc[1][0]=bx; - abc[1][1]=by; - abc[1][2]=bz; - abc[2][0]=cx; - abc[2][1]=cy; - abc[2][2]=cz; - return abc; - } - - public static double[] getRotated(double[] p) { - updateParameters(); - double x=p[0]-rx; - double y=p[1]-ry; - double z=p[2]-rz; - - double u=x*ax+y*ay+z*az; - double v=x*bx+y*by+z*bz; - double w=x*cx+y*cy+z*cz; - - p[0]=u; - p[1]=v*cosPhi-w*sinPhi; - p[2]=v*sinPhi+w*cosPhi; - return p; - } - - public static double[][] getRotated(int numDraw, int[] listdl, float[] x, float[] y, float[] z) { - updateParameters(); - - double[][] uvw=new double[3][numDraw]; - - for(int i=0; i<numDraw; i++) { - int list=listdl[i]; - double xx=x[list]-rx; - double yy=y[list]-ry; - double zz=z[list]-rz; - double u=xx*ax+yy*ay+zz*az; - double v=xx*bx+yy*by+zz*bz; - double w=xx*cx+yy*cy+zz*cz; - uvw[0][i]=u; - uvw[1][i]=v*cosPhi-w*sinPhi; - uvw[2][i]=v*sinPhi+w*cosPhi; - } - return uvw; - } - - public static int[] getAxisMapping() { - return new int[] {0, 1, 2}; - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return nonLinearTransform(dH.get3DPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) { - return nonLinearTransform2D(user, getName()); - } - - public ACoord inverseNonLinearTransform(ACoord user) { - return inverseNonLinearTransform2D(user, getName()); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjection3DBox.java b/graphics/AtlantisJava/src/atlantis/projection/AProjection3DBox.java deleted file mode 100755 index 62ae22b6913c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjection3DBox.java +++ /dev/null @@ -1,569 +0,0 @@ -package atlantis.projection; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.util.LinkedList; - -import javax.swing.JMenuItem; - -import Jama.Matrix; -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.A3DPointData; -import atlantis.data.ADHelix; -import atlantis.event.AEvent; -import atlantis.data.ATrackData; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.ADrawable; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; - -public class AProjection3DBox extends AProjection -{ - // angle of the rotation about the axis - static private double phi; - static private double sinPhi; - static private double cosPhi; - - static private double scale; - static private double zP; - static private double xz; - static private double yz; - - static private AVec3D centerDisplay; - static private AVec3D sizeDisplay; - - static private AVec3D sizeUser = new AVec3D(1.1, .5, .5); - - static final String RESTORE_DEFAULTS = "Default Box Volume"; - - static private LinkedList<AVec3D[]> planes = new LinkedList<AVec3D[]>(); - - static private JMenuItem[] popupItems; - - public AProjection3DBox() - { - popupItems = new JMenuItem[1]; - popupItems[0] = new JMenuItem(RESTORE_DEFAULTS); - popupItems[0].addActionListener(this); - } - - public String getName() - { - return "3DBox"; - } - - public String getScreenName() - { - return "3DBox"; - } - - public String getXLabel() - { - return "V"; - } - - public String getYLabel() - { - return "H"; - } - - public String getXUnits() - { - return "(cm)"; - } - - public String getYUnits() - { - return "(cm)"; - } - - public void setScales() - {} - - public boolean processLocalCommand(String name) - { - return false; - } - - public Point2D.Double getCenter(AWindow window) - { - updateParameters(window); - return new Point2D.Double(centerDisplay.x, centerDisplay.y); - } - - public void zoom(double factor) - { - if (factor != 0.) - { - sizeUser = sizeUser.scale(factor); - updateScale(); - } - } - - public static void setSizeUser(double size) - { - if (size != 0.) - { - sizeUser.x = size; - // updateScale(); - // ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - } - - public void zoomHorizontal(double factor) - { - if (factor != 0.) - { - sizeUser.x *= factor; - updateScale(); - } - } - - public void zoomVertical(double factor) - { - if (factor != 0. && !Double.isInfinite(factor)) - { - sizeUser.y *= factor; - sizeUser.z *= factor; - updateScale(); - } - } - - public static void updateScale() - { - scale = parameterStore.get("3DBox", "Scale").getD(); - ACanvas.getCanvas().getCurrentWindow().setUserCorners(0, 2. * sizeUser.x / scale, -sizeUser.y / scale, sizeUser.y / scale); - } - - public static void updateScale(AWindow window) - { - scale = parameterStore.get("3DBox", "Scale").getD(); - window.setUserCorners(0, 2. * sizeUser.x / scale, -sizeUser.y / scale, sizeUser.y / scale); - } - - public static double getPhi() - { - return parameterStore.get("3DBox", "Phi").getD(); - } - - public static void updateParameters(AWindow window) - { - phi = Math.toRadians(getPhi()); - sinPhi = Math.sin(phi); - cosPhi = Math.cos(phi); - scale = parameterStore.get("3DBox", "Scale").getD(); - zP = parameterStore.get("3DBox", "ZP").getD(); - xz = parameterStore.get("3DBox", "xz").getD(); - yz = parameterStore.get("3DBox", "yz").getD(); - - Rectangle bounds = window.getCurrDisp(); - centerDisplay = new AVec3D(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2, 0.); - sizeDisplay = new AVec3D(0.5 * bounds.width * scale, 0.5 * bounds.height * scale, 0.5 * bounds.height * scale); - centerDisplay.x -= sizeDisplay.x; - updateScale(window); - } - - protected void drawBox(AGraphics ag) - { - double x = sizeDisplay.x; - double y = sizeDisplay.y; - double z = sizeDisplay.z; - - AVec3D[] firstPlane = new AVec3D[] { new AVec3D(0, y, z), new AVec3D(0, y, -z), new AVec3D(0, -y, -z), new AVec3D(0, -y, z) }; - AVec3D[] middlePlane = new AVec3D[] { new AVec3D(x, y, z), new AVec3D(x, y, -z), new AVec3D(x, -y, -z), new AVec3D(x, -y, z) }; - AVec3D[] lastPlane = new AVec3D[] { new AVec3D(2 * x, y, z), new AVec3D(2 * x, y, -z), new AVec3D(2 * x, -y, -z), new AVec3D(2 * x, -y, z) }; - - planes = new LinkedList<AVec3D[]>(); - - planes.add(firstPlane); - planes.add(middlePlane); - planes.add(lastPlane); - - for (int i = 0; i < planes.size(); i++) - { - AVec3D[] plane = (AVec3D[]) (planes.get(i)); - for (int j = 0; j < plane.length; ++j) - plane[j] = applyViewPoint(plane[j]); - } - - double[] h = new double[4]; - double[] v = new double[4]; - - // back - AVec3D[] back = new AVec3D[] { firstPlane[3], firstPlane[1], lastPlane[1], lastPlane[3] }; - for (int j = 0; j < back.length; ++j) - { - h[j] = back[j].x; - v[j] = back[j].y; - } - - ag.updateDrawParameters(new ADrawParameters(true, 0, 0, 1, 0, 0)); - ag.setColor(Color.gray); - ag.fillPolygon(h, v, 4); - ag.setColor(Color.white); - ag.drawPolygon(h, v, 4); - // base - AVec3D[] base = new AVec3D[] { firstPlane[0], firstPlane[1], lastPlane[1], lastPlane[0] }; - for (int j = 0; j < base.length; ++j) - { - h[j] = base[j].x; - v[j] = base[j].y; - } - ag.setColor(Color.black); - ag.fillPolygon(h, v, 4); - ag.setColor(Color.white); - ag.drawPolygon(h, v, 4); - - for (int i = 0; i < planes.size(); i++) - { - AVec3D[] plane = (AVec3D[]) (planes.get(i)); - for (int j = 0; j < plane.length; ++j) - { - h[j] = plane[j].x; - v[j] = plane[j].y; - } - ag.setColor(Color.black); - ag.fillPolygon(h, v, 4); - ag.setColor(Color.white); - ag.drawPolygon(h, v, 4); - } - - // top - AVec3D[] top = new AVec3D[] { firstPlane[3], firstPlane[2], lastPlane[2], lastPlane[3] }; - for (int j = 0; j < top.length; ++j) - { - h[j] = top[j].x; - v[j] = top[j].y; - } - ag.setColor(Color.white); - ag.drawPolygon(h, v, 4); - } - - protected void touchupBox(AGraphics ag) - { - ag.updateDrawParameters(new ADrawParameters(true, 0, 0, 1, 0, 0)); - ag.setColor(Color.white); - for (int i = 0; i < planes.size(); i++) - { - AVec3D[] plane = (AVec3D[]) (planes.get(i)); - ag.drawLine(plane[1].x, plane[1].y, plane[2].x, plane[2].y); - } - } - - AVec3D scale(AVec3D v) - { - return v.mult(sizeDisplay).divide(sizeUser); - } - - AVec3D rotate(AVec3D v) - { - return new AVec3D(v.x, v.y * cosPhi - v.z * sinPhi, v.y * sinPhi + v.z * cosPhi); - } - - static AVec3D applyViewPoint(AVec3D v) - { - return new AVec3D((v.x + xz * v.z) * (1 - v.z * zP) + centerDisplay.x, (v.y + yz * v.z) * (1 - v.z * zP) + centerDisplay.y, v.z); - } - - public void paint(AWindow window, Graphics g) - { - updateParameters(window); - AGraphics ag = AGraphics.makeAGraphics(g); - fillBackground(window, ag); - drawBox(ag); - AEvent event = eventManager.getCurrentEvent(); - if (event == null) - return; - - java.util.List hitsAndTracks = event.getHitsAndTracks(this); - - for (int h = 0; h < hitsAndTracks.size(); h++) - { - Object o = hitsAndTracks.get(h); - if (o instanceof ATrackData) - drawTracks((ATrackData) o, window, ag); - else if (o instanceof A3DPointData) - drawPoints((A3DPointData) o, window, ag); - } - touchupBox(ag); - } - - protected void drawPoints(A3DPointData pointData, AWindow window, AGraphics ag) - { - double[][] points = pointData.get3DPoints(); - int[] index = pointData.get3DPointsIndex(); - - double[][][] hv = new double[2][1][index.length]; - - for (int i = 0; i < points.length; ++i) - { - AVec3D point = rotate(new AVec3D(AProjection3D.getRotated(points[i]))); - - if (point.x > 0 && point.x < 2 * sizeUser.x && point.y > -sizeUser.y && point.y < sizeUser.y && point.z > -sizeUser.z && point.z < sizeUser.z) - { - point = applyViewPoint(scale(point)); - hv[0][0][i] = point.x; - hv[1][0][i] = point.y; - } - else - { - // aaargh allow this to be clipped from picture for now - hv[0][0][i] = -1000.; - hv[1][0][i] = -1000.; - } - } - - ag.draw(new ACoord(hv, index, pointData, ACoord.SYMBOLS)); - } - - protected void drawTracks(ATrackData tracks, AWindow window, AGraphics ag) - { - ADHelix[] dhelix = tracks.getHelices(); - - int numPlanes = planes.size(); - int numSegments = numPlanes + 4; - AVec3D[][] intersection = new AVec3D[dhelix.length][numPlanes]; - - double[][][] hv = new double[2][dhelix.length * numSegments][0]; - int[] index = new int[dhelix.length * numSegments]; - int[] indexTemp = tracks.getDrawList(); - for (int i = 0; i < indexTemp.length; ++i) - for (int j = 0; j < numSegments; ++j) - index[i * numSegments + j] = indexTemp[i]; - - int numPointsOnEllipse = 24; - AVec3D[] ellipse = new AVec3D[numPointsOnEllipse + 1]; - double radius = 0.005; - for (int i = 0; i < ellipse.length; i++) - { - double phi = 2. * Math.PI * i / numPointsOnEllipse; - ellipse[i] = new AVec3D(0., radius * Math.sin(phi), radius * Math.cos(phi)); - } - - for (int j = 0; j < dhelix.length; ++j) - if (dhelix[j] != null) - { - // s always 0? I don't know why that is... - double s = 0.; - AVec3D start = new AVec3D(dhelix[j].get3DPointAsArray(s)); - AVec3D end = new AVec3D(dhelix[j].get3DPointAsArray(s + 0.01)); - - boolean backwards = false; - - // calculate intersections - for (int p = 0; p < planes.size(); ++p) - { - // position of plane - double xInt = p * sizeUser.x; - double m = (xInt - start.x) / (end.x - start.x); - - // While we're in here, can check if we're pointing in the right direction - if (p == 1 && m < 0.0) { backwards = true; } - - double yInt = start.y + m * (end.y - start.y); - double zInt = start.z + m * (end.z - start.z); - intersection[j][p] = new AVec3D(xInt, yInt, zInt); - } - - // Throw out anything that isn't pointing in the right direction... - if (backwards) { continue; } - - AVec3D first = rotate(intersection[j][0]); - AVec3D middle = rotate(intersection[j][1]); - AVec3D last = rotate(intersection[j][numPlanes - 1]); - - if (first.y > -sizeUser.y && first.y < sizeUser.y && first.z > -sizeUser.z && first.z < sizeUser.z && last.y > -sizeUser.y && last.y < sizeUser.y && last.z > -sizeUser.z && last.z < sizeUser.z) - { - - double[][] cov = dhelix[j].helix.getCovariance(); - if (cov != null) - { - double[][] c = new double[2][2]; - c[0][0] = cov[0][0]; - c[0][1] = cov[0][1]; - c[1][0] = cov[1][0]; - c[1][1] = cov[1][1]; - Matrix covM = new Matrix(c); - Matrix errM = covM.inverse(); - - double b1 = errM.get(0, 0); - double b2 = errM.get(1, 1); - - double b3 = 2. * errM.get(0, 1); - if (parameterStore.get("3DBox", "ellipses").getStatus()) - { - ellipse = new AVec3D[180]; - - for (int i = 0; i < 360; i += 2) - { - double thetat = Math.toRadians(i); - double tt = Math.tan(thetat); - double xx = Math.sqrt(1. / (b1 + b2 * tt * tt + b3 * tt)); - if (i > 90 && i <= 270) - xx *= -1.; - ellipse[i / 2] = new AVec3D(0., xx, xx * tt); - } - } - // add intersections to draw list - for (int p = 0; p < planes.size(); ++p) - { - double[] h = new double[ellipse.length]; - double[] v = new double[ellipse.length]; - - for (int i = 0; i < ellipse.length; i++) - { - AVec3D point = applyViewPoint(scale(rotate(intersection[j][p].add(ellipse[i])))); - h[i] = point.x; - v[i] = point.y; - } - - hv[0][numSegments * j + p] = h; - hv[1][numSegments * j + p] = v; - } - } - first = applyViewPoint(scale(first)); - middle = applyViewPoint(scale(middle)); - last = applyViewPoint(scale(last)); - - double[][] edge = new double[planes.size()][2]; - for (int i = 0; i < planes.size(); i++) - { - AVec3D[] plane = (AVec3D[]) (planes.get(i)); - double xInt = plane[1].x; - double m = (xInt - first.x) / (last.x - first.x); - double yInt = first.y + m * (last.y - first.y); - edge[i] = new double[] { xInt, yInt }; - } - - hv[0][numSegments * j + 3] = new double[] { first.x, edge[1][0] }; - hv[1][numSegments * j + 3] = new double[] { first.y, edge[1][1] }; - hv[0][numSegments * j + 4] = new double[] { middle.x, edge[2][0] }; - hv[1][numSegments * j + 4] = new double[] { middle.y, edge[2][1] }; - - drawDashed(ag, tracks, indexTemp[j], edge[1][0], edge[1][1], middle.x, middle.y); - drawDashed(ag, tracks, indexTemp[j], edge[2][0], edge[2][1], last.x, last.y); - } - } - ag.draw(new ACoord(hv, index, tracks, ACoord.POLYLINES)); - } - - protected void drawDashed(AGraphics ag, ADrawable source, int ind, double h0, double v0, double h1, double v1) - { - double dH = h1 - h0; - double dV = v1 - v0; - double dist = Math.sqrt(dH * dH + dV * dV); - double dashSize = 4; - int num = (int) (dist / dashSize); - int[] index = new int[num / 2 + 1]; - double[][][] hv = new double[2][num / 2 + 1][2]; - - for (int i = 0; i < num; ++i) - { - if (i % 2 == 1) - { - int n = i / 2; - index[n] = ind; - hv[0][n][0] = h0 + dH * i / num; - hv[0][n][1] = h0 + dH * (i + 1) / num; - hv[1][n][0] = v0 + dV * i / num; - hv[1][n][1] = v0 + dV * (i + 1) / num; - if (i >= num - 2) - { - hv[0][n][1] = h1; - hv[1][n][1] = v1; - } - } - } - ag.draw(new ACoord(hv, index, source, ACoord.POLYLINES)); - } - -protected void fillBackground(AWindow window, AGraphics ag) - { - Color[] colorMap = AColorMap.getColors(); - ag.setColor(colorMap[getBackgroundFillColor()]); - ag.fillRect(0, 0, window.getWidth(), window.getHeight()); - } - - protected int getBackgroundFillColor() - { - return parameterStore.get("Color", "BkgFill").getI(); - } - - public JMenuItem[] getPopupItems() - { - return popupItems; - } - - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - if (action.equals(RESTORE_DEFAULTS)) - { - sizeUser.x = 2.; - sizeUser.y = .1; - sizeUser.z = .1; - updateScale(); - ACanvas.getCanvas().getCurrentWindow().repaintFromScratch(); - } - } - -} - -class AVec3D -{ - double x, y, z; - - AVec3D(double x, double y, double z) - { - this.x = x; - this.y = y; - this.z = z; - } - - AVec3D(double[] v) - { - this.x = v[0]; - this.y = v[1]; - this.z = v[2]; - } - - AVec3D cross(AVec3D d) - { - return new AVec3D(+this.y * d.z - this.z * d.y, -this.x * d.z + this.z * d.x, +this.x * d.y - this.y * d.x); - } - - AVec3D add(AVec3D d) - { - return new AVec3D(x + d.x, y + d.y, z + d.z); - } - - AVec3D mult(AVec3D d) - { - return new AVec3D(x * d.x, y * d.y, z * d.z); - } - - AVec3D divide(AVec3D d) - { - return new AVec3D(x / d.x, y / d.y, z / d.z); - } - - AVec3D scale(double s) - { - return new AVec3D(s * x, s * y, s * z); - } - - public String toString() - { - return x + " " + y + " " + z; - } - - public double mag2() { - return x*x + y*y + z*z; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionEventInfo.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionEventInfo.java deleted file mode 100644 index 1735ec2a666b..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionEventInfo.java +++ /dev/null @@ -1,197 +0,0 @@ -package atlantis.projection; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import javax.swing.ImageIcon; -import javax.swing.JMenuItem; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.ADHelix; -import atlantis.event.AEvent; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.utils.AUtilities; - -/** Class used to display the ATLAS Experiment logo, along with - * Event Number, Run Number, and Date/Time - * - * @author Tom McLaughlan - */ -public class AProjectionEventInfo extends AProjectionInfo { - - private static long EventNumber; - private static long RunNumber; - private static String DateTime; - private static String Source; - private static Color textColor = Color.white, - backgroundColor = Color.black; - - public String getName() { - return "EventInfo"; - } - - public void paint(AWindow window, Graphics g) { - - AEvent event = eventManager.getCurrentEvent(); - - if (event != null) { - RunNumber = event.getRunNumber(); - EventNumber = event.getEventNumber(); - DateTime = event.getDateTime(); - Source = event.getSourceName(); - } - - // Begin drawing - AGraphics ag = AGraphics.makeAGraphics(g); - // Fill the background - ag.setColor(backgroundColor); - ag.fillRect(0, 0, window.getWidth(), window.getHeight()); - - String iconPath = AGlobals.instance().getHomeDirectory() + "img" + System.getProperty("file.separator"); - - ImageIcon i = AUtilities.getFileAsImageIcon(iconPath + "atlas_logo_shadow.png"); - - - // Determine height and width of current window, and width of ATLAS logo - // These are then used to determine a scaling factor which is used in the - // scale function. - // - int height = window.getSize().height; - int width = window.getSize().width; - int iwidth = i.getIconWidth(); - double factor = (double) width / (double) iwidth; - - // Call scale function to scale image to window size - ImageIcon iscale = AUtilities.scale(i.getImage(), factor, parameterStore.get("Prefs", "AntiAlias").getStatus()); - // x, y calculated to position image exactly centred - int x = (width / 2) - (iscale.getIconWidth() / 2); - int y = (height / 2) - ((3 * iscale.getIconHeight()) / 4); - - // get screen dpi for resolution independent scaling - // commented out 27/3 -- EJ - // without a screen you obviously do not have a screen resolution - int dpi = 72; //Toolkit.getDefaultToolkit().getScreenResolution(); - - // Set a scaling font size with window width - int fontSize = (int) Math.round(3.0 * width / (double) dpi); - - Font f = new Font("SansSerif", Font.PLAIN, fontSize); - - ag.drawImage(iscale.getImage(), x, y); - - ag.setColor(textColor); // Set colour for text - ag.updateColor(); // Update current colour for drawing - - String DateString = "", RunEventString = ""; - String DisclaimerString1 = "", DisclaimerString2 = ""; - if (event != null) { - DateString = "Date: " + DateTime; - RunEventString = "Run Number: " + RunNumber + ", Event Number: " + EventNumber; - DisclaimerString1 = "Snapshot of a proton collision"; - DisclaimerString2 = "directly from the ATLAS experiment"; - } else { - RunEventString = "No event data available"; - } - - FontMetrics fm = g.getFontMetrics(f); - int DateWidth = fm.stringWidth(DateString); - int RunEventWidth = fm.stringWidth(RunEventString); - int Disclaimer1Width = fm.stringWidth(DisclaimerString1); - int Disclaimer2Width = fm.stringWidth(DisclaimerString2); - - // This may need changing to be a bit more elegant - // -- currently under investigation by Tom - - // Check if font is wider than the window and scale down til it fits. - while ((RunEventWidth > width - 20) || (DateWidth > width - 20)) - { - - fontSize = fontSize - 1; - f = new Font("SansSerif", Font.PLAIN, fontSize); - fm = g.getFontMetrics(f); - RunEventWidth = fm.stringWidth(RunEventString); - DateWidth = fm.stringWidth(DateString); - Disclaimer1Width = fm.stringWidth(DisclaimerString1); - Disclaimer2Width = fm.stringWidth(DisclaimerString2); - } - - ag.setFont(f); // set font as defined above - - // For the streams at P1, we include a disclaimer - // Anything without .xml is considered a stream for now - if (Source != null && !Source.endsWith(".xml")) { - ag.drawString(DisclaimerString1, - (width / 2) - Disclaimer1Width / 2, 0.89 * height); - ag.drawString(DisclaimerString2, - (width / 2) - Disclaimer2Width / 2, 0.95 * height); - } - - if (event != null && !DateTime.equals("") && !DateTime.equals("n/a")) { - // If event contains Date/Time data, draw Run Number, Event Number and Date/Time - // and position text in centre of window - ag.drawString(RunEventString, - (width / 2) - RunEventWidth / 2, y + (1.1 * iscale.getIconHeight())); - - ag.drawString(DateString, - (width / 2) - DateWidth / 2, y + (1.3 * iscale.getIconHeight())); - } else { - // Draw text (No Date/Time, for MC events, etc) - ag.drawString(RunEventString, - (width / 2) - RunEventWidth / 2, y + (1.1 * iscale.getIconHeight())); - - } - - } - - public JMenuItem[] getPopupItems() { - return null; - } - - public String getXLabel() { - return ""; - } - - public String getXUnits() { - return ""; - } - - public String getYLabel() { - return ""; - } - - public String getYUnits() { - return ""; - } - - @Override - public void actionPerformed(ActionEvent e) { - assert false : "Did not expect AProjectionEventInfo to be used as ActionListener"; - } - - public void setScales() { - } - - public Point2D.Double getCenter() { - return new Point2D.Double(0.0, 0.0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - Point2D.Double[] corners = new Point2D.Double[3]; - - corners[0] = new Point2D.Double(0., 2.); - corners[1] = new Point2D.Double(100., 2.); - corners[2] = new Point2D.Double(100., -2.); - return corners; - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return ACoord.NO_DATA; - } -}//end of EventInfoProjection class diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionFR.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionFR.java deleted file mode 100755 index ddc52bdb54cf..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionFR.java +++ /dev/null @@ -1,127 +0,0 @@ -package atlantis.projection; - -import java.awt.Dimension; -import java.awt.geom.Point2D; - -import atlantis.canvas.ACanvas; -import atlantis.data.ADHelix; -import atlantis.graphics.ACoord; -import atlantis.interactions.AZMRInteraction; -import atlantis.parameters.APar; -import atlantis.parameters.AParameter; -import atlantis.utils.AMath; - -public class AProjectionFR extends AProjectionPhi -{ - public String getName() - { - return "FR"; - } - - public String getXLabel() - { - return AMath.RHO; - } - - public String getXUnits() - { - return "(cm)"; - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) - { - Point2D.Double[] corners = new Point2D.Double[3]; - int phiWrap = parameterStore.get(getName(), "PhiWrap").getI(); - - double radius = parameterStore.get("Projection", "Radius").getD(); - corners[0] = new Point2D.Double(0, 360 + phiWrap); - corners[1] = new Point2D.Double(radius, 360 + phiWrap); - corners[2] = new Point2D.Double(radius, 0); - return corners; - } - - public ACoord getUserPoint(ADHelix dH, double s) - { - return nonLinearTransform(dH.getFRPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) - { - AParameter fishEyePar = parameterStore.get(getName(), "FishEye"); - - // Fisheye of projection FR should not change phi - if (fishEyePar.getStatus()) - { - double[] r; - //double[] phi; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(getName(), "rTo").getD(); - //Point2D.Double[] corners = ACanvas.getCanvas().getCurrentWindow().getUserCorners(); - //double phiMid = (corners[0].getY() + corners[2].getY()) / 2.; - - for (int j = 0; j < user.hv[0].length; ++j) - { - r = user.hv[0][j]; - //phi = user.hv[1][j]; - for (int i = 0; i < r.length; ++i) - { - double fact = (1 + fishEye * rTo) / (1 + fishEye * r[i]); - - //phi[i] = phiMid + (phi[i] - phiMid) * fact; - r[i] *= fact; - } - } - } - - // Horizontal Zoom is applied in ZMR interaction - - // don't know what this has to do here? - // CLEANUP - S.B. - /* AParameter horZoomPar = APar.get(getName(), "HorizontalZoom"); - - if (horZoomPar.getStatus()) - { - // performe initial horizontal zoom - double hzf = APar.get("FR", "HorizontalZoom").getD(); - Point2D.Double[] corners = ACanvas.getCanvas().getCurrentWindow().getUserCorners(); - double centerRho = corners[0].getX(); - double centerPhi = (corners[0].getY() + corners[2].getY()) / 2.; - Point2D.Double center = new Point2D.Double(centerRho, centerPhi); - AZMRInteraction.performHorizontalZoom(center, hzf, ACanvas.getCanvas().getPaintingWindow()); - - horZoomPar.setStatus(false); - } - */ - return user; - } - - public ACoord inverseNonLinearTransform(ACoord user) - { - AParameter fishEyePar = parameterStore.get(getName(), "FishEye"); - - if (fishEyePar.getStatus()) - { - double[] r; - //double[] phi; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(getName(), "rTo").getD(); - //Point2D.Double[] corners = ACanvas.getCanvas().getCurrentWindow().getUserCorners(); - //double phiMid = (corners[0].getY() + corners[2].getY()) / 2.; - - for (int j = 0; j < user.hv[0].length; ++j) - { - r = user.hv[0][j]; - //phi = user.hv[1][j]; - for (int i = 0; i < r.length; ++i) - { - double fact = 1 / (1 + fishEye * (rTo - r[i])); - - //phi[i] = phiMid + (phi[i] - phiMid) * fact; - r[i] *= fact; - } - } - } - - return user; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionFZ.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionFZ.java deleted file mode 100755 index 32c092064bd5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionFZ.java +++ /dev/null @@ -1,76 +0,0 @@ -package atlantis.projection; - - -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import java.awt.geom.*; -import java.awt.*; -import atlantis.graphics.ACoord; -import atlantis.data.ADHelix; - - -public class AProjectionFZ extends AProjectionPhi { - - public String getName() { - return "FZ"; - } - - public String getXLabel() { - return "Z"; - } - - public String getXUnits() { - return "(cm)"; - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - Point2D.Double[] corners=new Point2D.Double[3]; - int phiWrap=parameterStore.get(getName(), "PhiWrap").getI(); - - double length=parameterStore.get("Projection", "Length").getD(); - - corners[0]=new Point2D.Double(-length, 360+phiWrap); - corners[1]=new Point2D.Double(length, 360+phiWrap); - corners[2]=new Point2D.Double(length, 0); - return corners; - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return nonLinearTransform(dH.getFZPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) { - AParameter fishEyePar=parameterStore.get(getName(), "FishEye"); - - if(fishEyePar.getStatus()) { - double[] z; - double fishEye=0.001*fishEyePar.getD(); - double zTo=parameterStore.get(getName(), "zTo").getD(); - - for(int j=0; j<user.hv[0].length; ++j) { - z=user.hv[0][j]; - for(int i=0; i<z.length; ++i) - z[i]*=(1+fishEye*zTo)/(1+fishEye*Math.abs(z[i])); - } - } - return user; - } - - public ACoord inverseNonLinearTransform(ACoord user) { - AParameter fishEyePar=parameterStore.get(getName(), "FishEye"); - - if(fishEyePar.getStatus()) { - double[] z; - double fishEye=0.001*fishEyePar.getD(); - double zTo=parameterStore.get(getName(), "zTo").getD(); - - for(int j=0; j<user.hv[0].length; ++j) { - z=user.hv[0][j]; - for(int i=0; i<z.length; ++i) - z[i]*=1/(1+fishEye*(zTo-Math.abs(z[i]))); - } - } - return user; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionInfo.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionInfo.java deleted file mode 100644 index b7428f177514..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -package atlantis.projection; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.geom.Point2D; -import java.awt.image.BufferedImage; - -import javax.swing.ImageIcon; - -import atlantis.canvas.AWindow; -import atlantis.event.AEvent; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; - -/** - * Stripped down clone of the 2D Projection class - * Used simply to display event data (as text) in a window - * with the ATLAS experiment logo, for publications and presentation purposes - * - * Also contains rudimentary image scaling code used to scale the ATLAS logo depending - * on window size - * - * @author Tom McLaughlan - */ -public abstract class AProjectionInfo extends AProjection -{ - private boolean debug = false; - - protected final static String ASPECT_RATIO_1 = "Aspect Ratio 1"; - - public AProjectionInfo() - {} - - public boolean processLocalCommand(String name) - { - return false; - } - - public abstract String getName(); - - public String getScreenName() - { - return getName(); - } - - protected Color getBackgroundFillColor(Color[] colorMap) - { - return colorMap[parameterStore.get("Color", "BkgFill").getI()]; - } - - public void paint(AWindow window, Graphics g) - { - - AEvent event = null; - AGraphics ag = AGraphics.makeAGraphics(g); - long time = 0; - - if (debug) - { - time = System.currentTimeMillis(); - } - fillBackground(window, ag); - if (debug) - { - System.out.println("fill " + (System.currentTimeMillis() - time)); - time = System.currentTimeMillis(); - } - - - // draw the current event - event = eventManager.getCurrentEvent(); - - //If there is no current event do nothing - if (event == null) return; - - } // paint() - - protected void fillBackground(AWindow window, AGraphics ag) - { - ag.setColor(getBackgroundFillColor(AColorMap.getColors())); - ag.fillRect(0, 0, window.getWidth(), window.getHeight()); - } - - protected static Point2D.Double[] aspectRatioLayout(double width, double height, Dimension wSize) - { - double f = Math.min(wSize.width / width, wSize.height / height); - - width = wSize.width / f; - height = wSize.height / f; - - Point2D.Double[] corners = new Point2D.Double[3]; - - corners[0] = new Point2D.Double(-width, +height); - corners[1] = new Point2D.Double(+width, +height); - corners[2] = new Point2D.Double(+width, -height); - return corners; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionLegoPlot.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionLegoPlot.java deleted file mode 100755 index 2179a2d7f2e2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionLegoPlot.java +++ /dev/null @@ -1,402 +0,0 @@ -package atlantis.projection; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.util.HashSet; -import java.util.Set; - -import atlantis.canvas.ACanvas; -import atlantis.canvas.AWindow; -import atlantis.data.ACalorimeterData; -import atlantis.data.ADHelix; -import atlantis.event.AEvent; -import atlantis.data.ALegoData; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.graphics.ALegoDraw; -import atlantis.graphics.colormap.AColorMap; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.utils.AMath; - -public class AProjectionLegoPlot extends AProjection2D -{ - public static byte nLayers = 29;//also used in ALegoData - //xz and yz are used to define the angle of the eta axis (altered in rotate interaction) - private static double[] xz; - private static double[] yz; - //Variables needed by ALegoDraw and ALegoData that are updated here from changes to the gui value - public static int defaultScale = parameterStore.get("LegoPlot", "Scale").getI();//set the axis scale (standard, log or sqrt) - public static int nPhiCells = parameterStore.get("LegoPlot", "nphicells").getI(); - public static int nEtaCells = parameterStore.get("LegoPlot", "netacells").getI(); - public static Color[] defaultColorMap = AColorMap.getColors(); - public static Color[] caloColorMap = AColorMap.getColors();//to allow colouring by energy - public static boolean reverse = false;//also used by ASynchroCursorsInteraction - public static int mode = parameterStore.get("LegoPlot", "Mode").getI(); - public static int colorEM, colorHad; - public static Set colorset = new HashSet();//not updated here - public static final int minimumofLogScale=(int) Math.round(Math.log10(0.01));// we set 10MeV to lego height 0 on log scale - protected final static String VIEW_DEFAULT = "View normal"; - protected final static String VIEW_FROM_ABOVE = "View from above"; - protected final static String VIEW_ET_ETA = "View Et v " + AMath.ETA; - protected final static String VIEW_ET_PHI = "View Et v " + AMath.PHI; - - //to select th right drawing options for AOD object towers - public final static int DRAW_MET = -21; - public final static int DRAW_MUON = -2; - public final static int DRAW_ELECTRON = -3; - public final static int DRAW_PHOTON = -4; - public final static int DRAW_CLUSTER = -5; - public final static int DRAW_COMPOSITEPARTICLE = -6; - public final static int DRAW_BJET = -7; - public final static int DRAW_TAUJET = -8; - public final static int DRAW_JET = -9; - - public AProjectionLegoPlot() { - addPopupItem(VIEW_DEFAULT); - addPopupItem(VIEW_FROM_ABOVE); - addPopupItem(VIEW_ET_ETA); - addPopupItem(VIEW_ET_PHI); - } - - @Override - public void actionPerformed(ActionEvent e) - { - String action = e.getActionCommand(); - int index=0; - AWindow currentWindow = ACanvas.getCanvas().getCurrentWindow(); - index=currentWindow.getIndex(); - Point2D.Double[] corners = currentWindow.getUserCorners(); - double dPhi=0,dEta=0,currentxz=xz[index],currentyz=yz[index]; - - if (action.equals(VIEW_DEFAULT)) - { - xz[index]=0.6; - yz[index]=0.5; - } - else if (action.equals(VIEW_FROM_ABOVE)) - { - xz[index]=0.8; - yz[index]=0.9; - } - else if (action.equals(VIEW_ET_PHI)) - { - xz[index]=0.0; - yz[index]=-50; - } - else if (action.equals(VIEW_ET_ETA)) - { - xz[index]=360.0; - yz[index]=-75; - } - dPhi=360*(xz[index]-currentxz); - dEta=50*(currentyz-yz[index]); - corners[0].x -= (dPhi); - corners[0].y -= (dEta); - corners[1].y -= (dEta); - currentWindow.setUserCorners(corners); - //reset the center of detector dot on ZMR - // TODO: Check if this really is superfluous. I can't find any situation where it - // sets the interaction group to anything other than its old value. - Ben Waugh 2011-11-09 -// currentWindow.getInteractionManager().setContext(currentWindow.getInteractionToolBar().getSelectedGroup()); - } - - @Override - public void setAspectRatio1(AWindow window) - { - AOutput.append("\nNot implemented for this projection\n", ALogInterface.WARNING); - } - - public String getName() - { - return "LegoPlot"; - } - - public String getXLabel() - { - return AMath.PHI; - } - - public String getYLabel() - { - return AMath.ETA; - } - - public String getXUnits() - { - return AMath.DEGREES; - } - - public String getYUnits() - { - return ""; - } - - public Point2D.Double getCenter() - { - /*in the lego plot the center changes if there is rotation - however the getCenter is also needed in initialization - which is before windows are indexed*/ - int index=0; - double temp=0; - //check to see if the windows are indexed - try - { - index=ACanvas.getCanvas().getCurrentWindow().getIndex(); - } - catch(Throwable t) - { - temp=0.6;//hasn't indexed windows yet - } - if(temp==0) - temp=xz[index]; - return new Point2D.Double(-360.0*temp,-5.0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) - { - if(xz==null) - { - xz=new double[ACanvas.getCanvas().getWindowsCount()]; - for(int i=0; i<ACanvas.getCanvas().getWindowsCount(); i++) - { - xz[i]=0.6; - } - } - if(yz==null) - { - yz=new double[ACanvas.getCanvas().getWindowsCount()]; - for(int i=0; i<ACanvas.getCanvas().getWindowsCount(); i++) - { - yz[i]=0.5; - } - } - if(ACanvas.getCanvas().getCurrentWindow()!=null) - { - int currentIndex =ACanvas.getCanvas().getCurrentWindow().getIndex(); - xz[currentIndex]=0.6; - yz[currentIndex]=0.5; - } - //called before have windows so xz=0.6 and yz=0.5 - Point2D.Double[] corners = new Point2D.Double[3]; - corners[0]=new Point2D.Double(-360.0*0.6,-5-0.5*50); - corners[1]=new Point2D.Double(360.0, -5-0.5*50); - corners[2]=new Point2D.Double(360.0, 5); - //add on an offset - corners[0].x-=25.0; - corners[1].x+=25.0; - corners[2].x+=25.0; - corners[2].y+=3.0; - return corners; - } - - public ACoord getUserPoint(ADHelix dH, double s) - { - return nonLinearTransform(dH.getLEGOPoint(s)); - } - - @Override - public void paint(AWindow window, Graphics g) - { - // update parameters - update(); - // Load the event - AEvent event = eventManager.getCurrentEvent(); - if (event == null) - return; - // Create and fill histograms - double[][][] lego = new double[nPhiCells][nEtaCells][nLayers]; - ALegoData.fillHistograms(event, lego); - // Find the maximum energy - double maxEt = 0.0, AODmaxEt = 0.0, LEGOmaxEt = 0.0; - // loop over histogram data to scale towers and find maxEt - LEGOmaxEt = ALegoData.findMaxEt(lego); - maxEt=LEGOmaxEt; - // loop over AOD data - AODmaxEt = ALegoData.findAODMaxEt(event); - //check if user wants to scale to AOD objects rather than cells - //but only if the AOD max is greater than 0 - if(AODmaxEt==0) - { - if(!parameterStore.get("LegoPlot", "ScaleToAOD").isInitialized()) - parameterStore.get("LegoPlot", "ScaleToAOD").initialize(); - parameterStore.get("LegoPlot", "ScaleToAOD").getNameComponent().setEnabled(false); - } - else - { - if(!parameterStore.get("LegoPlot", "ScaleToAOD").isInitialized()) - parameterStore.get("LegoPlot", "ScaleToAOD").initialize(); - parameterStore.get("LegoPlot", "ScaleToAOD").getNameComponent().setEnabled(true); - } - if(AODmaxEt>0 && parameterStore.get("LegoPlot", "ScaleToAOD").getStatus()) - { - maxEt=AODmaxEt; - //user can no longer set the scale manually - if(!parameterStore.get("LegoPlot", "ETAxisHeight").isInitialized()) - parameterStore.get("LegoPlot", "ETAxisHeight").initialize(); - parameterStore.get("LegoPlot", "ETAxisHeight").getNameComponent().setEnabled(false); - parameterStore.get("LegoPlot", "ETAxisHeight").getValueComponent().setEnabled(false); - } - else - { - //user can now set the scale maually - if(!parameterStore.get("LegoPlot", "ETAxisHeight").isInitialized()) - parameterStore.get("LegoPlot", "ETAxisHeight").initialize(); - parameterStore.get("LegoPlot", "ETAxisHeight").getNameComponent().setEnabled(true); - parameterStore.get("LegoPlot", "ETAxisHeight").getValueComponent().setEnabled(true); - //check if user has defined a scale - if (parameterStore.get("LegoPlot", "ETAxisHeight").getD() > 0.0) - { - // use the user defined scale - maxEt = parameterStore.get("LegoPlot", "ETAxisHeight").getD(); - } - } - // Find the missing ET - double met = ALegoData.findMissingEt(window,lego,event); - // Begin drawing - AGraphics ag = AGraphics.makeAGraphics(g); - // Fill the background - ALegoDraw.fillBackground(window, ag); - // Draw the legend - boolean drawLegend=false; - if(!drawLegend && parameterStore.get("LegoPlot", "MainLegend").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "L1EtLegend").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "L1Items").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "L2Items").getStatus())drawLegend=true; - if(!drawLegend && parameterStore.get("LegoPlot", "EFItems").getStatus())drawLegend=true; - if(drawLegend)ALegoDraw.drawLegend(window,ag,event,met,maxEt,AODmaxEt); - - // Scale the values for the axis type - maxEt=scaleMaxET(maxEt,AODmaxEt); - AODmaxEt=ALegoData.scaleValue(AODmaxEt); - met=ALegoData.scaleValue(met); - if(parameterStore.get("LegoPlot","DrawPlot").getStatus()) - { - // Draw the grid - //System.out.println("maxEt = "+maxEt+" and LEGOmaxEt = "+LEGOmaxEt); - ALegoDraw.drawGrid(window, ag, maxEt); - // Draw the histograms - ALegoData.drawHistograms(window, ag, event, lego, maxEt, met, AODmaxEt); - } - } // paintLego() - - /** - * MaxEt is rounded to get the axis height as well as being scaled - */ - private static double scaleMaxET(double maxEt, double AODmaxEt) - { - //for drawing if maxEt is 0 use AODmaxEt for scaling - if (maxEt == 0) - maxEt = AODmaxEt; - maxEt=ALegoData.scaleValue(maxEt); - //now round to get axis height - if (defaultScale ==1 ) - { - maxEt = Math.ceil(maxEt); - } - else if (maxEt > 10.0) - { - //set maximum to nearest 5 above maxEt - maxEt = 5 * (Math.ceil(maxEt / 5.0)); - } - else if (maxEt < 10.0) - { - maxEt = Math.ceil(maxEt); - } - return maxEt; - } - - /** Shifts the real value of phi to the screen coord to account for the slope of the eta axis. - * For reverse of operation use -adjustPhi(window,-phi,eta) - */ - public static double adjustPhi(AWindow window, double phi, double eta) - { - int index=window.getIndex(); - eta+=5;//scale to between 0 and 10 - eta/=10.0;//scale to between 0 and 1 - eta-=1;//scale to between -1 and 0 - eta*=(xz[index]*360.0);//fraction of full offset to take off - phi+=eta;//take off the fraction - return phi;//now adjusted from slant of eta axis - } - - public static double getxz(int index) - { - return xz[index]; - } - - public static double getyz(int index) - { - return yz[index]; - } - - public static void setxz(int index, double xznew) - { - xz[index]=xznew; - } - - public static void setyz(int index, double yznew) - { - yz[index]=yznew; - } - - /**check if colouring by EM/HAD - * - * @return boolean drawEMHAD - */ - public static boolean getDrawEMHAD() - { - boolean drawEMHAD=false; - if (mode == 0 && parameterStore.get("LAr", "ColorFunction").getI()==6) - { - //Calorimeter Lego - drawEMHAD=true; - } - else if (mode == 1 && parameterStore.get("LVL1TriggerTower", "ColorFunction").getI()==1) - { - //Trigger Tower Lego - drawEMHAD=true; - } - return drawEMHAD; - } - - public static void update() - { - defaultScale = parameterStore.get("LegoPlot", "Scale").getI(); - nPhiCells = parameterStore.get("LegoPlot", "nphicells").getI(); - nEtaCells = parameterStore.get("LegoPlot", "netacells").getI(); - defaultColorMap = AColorMap.getColors(); - caloColorMap = AColorMap.getColors(); - if (parameterStore.get("LAr", "ColorFunction").getI() == ACalorimeterData.COLOR_FUNC_ENERGY) - { - switch (AColorMap.getColorMap()) - { - case AColorMap.COLOR_MAP_DEFAULT1: - case AColorMap.COLOR_MAP_DEFAULT2: - case AColorMap.COLOR_MAP_M4M5: - case AColorMap.COLOR_MAP_GRAYDET: - case AColorMap.COLOR_MAP_ORIGINAL: - // Use colors. - caloColorMap = AColorMap.getColors(AColorMap.COLOR_MAP_HITCOL); - break; - case AColorMap.COLOR_MAP_GRAY: - case AColorMap.COLOR_MAP_BW: - // Use grayscale. - caloColorMap = AColorMap.getColors(AColorMap.COLOR_MAP_GRAY_HITCOL); - break; - } - } - else if (parameterStore.get("LAr", "ColorFunction").getI() == ACalorimeterData.COLOR_FUNC_TIME) - { - caloColorMap = AColorMap.getShades(nLayers+1); - } - reverse = parameterStore.get("LegoPlot", "Reverse").getStatus(); - mode = parameterStore.get("LegoPlot", "Mode").getI(); - //Use detector color but add on 12 to get different shade of same color - colorEM = parameterStore.get("Det", "ECAL" + "Fill").getI() + 12; - colorHad = parameterStore.get("Det", "HCAL" + "Fill").getI() + 12; - } -}//end of LegoProjection class diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionN3D.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionN3D.java deleted file mode 100644 index 1c57d9e8a719..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionN3D.java +++ /dev/null @@ -1,66 +0,0 @@ -package atlantis.projection; - -import atlantis.nge.ANFrameManager; -import java.awt.event.ActionEvent; -import javax.swing.JMenuItem; - -/** - * - * @author Adam Davison - */ -public class AProjectionN3D extends AProjectionNGE { - - @Override - public void configureFrame(ANFrameManager fm) { - fm.checkProjection3D(); - } - - @Override - public String getName() { - return "N3D"; - } - - @Override - public String getScreenName() { - return "N3D"; - } - - @Override - public JMenuItem[] getPopupItems() { - return null; - } - - @Override - public String getXLabel() { - return "X"; - } - - @Override - public String getYLabel() { - return "Y"; - } - - @Override - public String getXUnits() { - return "m"; - } - - @Override - public String getYUnits() { - return "m"; - } - - @Override - public void setScales() { - - } - - @Override - public boolean processLocalCommand(String name) { - return false; - } - - public void actionPerformed(ActionEvent e) { - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNGE.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionNGE.java deleted file mode 100644 index 3f9294ff858f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNGE.java +++ /dev/null @@ -1,143 +0,0 @@ -package atlantis.projection; - -import atlantis.canvas.AWindow; -import atlantis.nge.ANFrameManager; -import atlantis.nge.ANManager; -import atlantis.utils.ALogger; -import com.sun.opengl.util.Screenshot; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; - -/** - * This projection bridges between the traditional canvas and the new graphics - * engine code. Essentially it looks like an old style projection but when - * asked to paint it calls the new code and returns an image - * - * @author Adam Davison - */ -public abstract class AProjectionNGE extends AProjection implements GLEventListener { - - private static ALogger logger = ALogger.getLogger(AProjectionNGE.class); - - //private GLPbuffer m_buf = null; - private BufferedImage m_img = null; - private int m_h = 0; - private int m_w = 0; - - private AWindow m_currentWindow; - - public AProjectionNGE() { - - } - -/* @Override - public String getName() { - return "NGE"; - } - - @Override - public String getScreenName() { - return "NGE"; - }*/ - - public abstract void configureFrame(ANFrameManager fm); - - @Override - public void paint(AWindow window, Graphics g) { - - m_currentWindow = window; - - long before = System.nanoTime(); - - m_w = window.getWidth(); - m_h = window.getHeight(); - - //logger.info("Window w: " + m_w + " h: " + m_h); - - //System.out.println("TAG A"); - - configureFrame(ANManager.getManager().getFrameManager(window)); - - //System.out.println("TAG B"); - - ANManager.getManager().requestBufferDraw(m_w, m_h, this); - - //System.out.println("TAG C"); - - // TODO: Check m_img isn't null - //g.drawImage(m_img, 0, 0, m_w, m_h, null); - g.drawImage(m_img, 0, 0, m_w, m_h, 0, m_img.getHeight()-m_h, m_w, m_img.getHeight(), null); - - //System.out.println("TAG D copyback done"); - - long after = System.nanoTime(); - //System.out.println("Draw took: " + (after - before)/1000); - - //ANManager.getManager().requestReschedule(window); - } - -/* @Override - public JMenuItem[] getPopupItems() { - return null; - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getXLabel() { - return "XLABEL"; - } - - @Override - public String getYLabel() { - return "YLABEL"; - } - - @Override - public String getXUnits() { - return ""; - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public String getYUnits() { - return ""; - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void setScales() { - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean processLocalCommand(String name) { - return false; - //throw new UnsupportedOperationException("Not supported yet."); - } - - public void actionPerformed(ActionEvent e) { - System.out.println(e.toString()); - //throw new UnsupportedOperationException("Not supported yet."); - }*/ - - public void init(GLAutoDrawable arg0) { - } - - public void display(GLAutoDrawable arg0) { - - //System.out.println("DISPLAY IN NGE"); - ANManager.getManager().getFrameManager(m_currentWindow).display(arg0, m_w, m_h); - //System.out.println("PAINT DONE"); - m_img = Screenshot.readToBufferedImage(ANManager.getNextPower2(m_w), - ANManager.getNextPower2(m_h)); - //System.out.println("COPIED BACK"); - } - - public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) { - } - - public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { - } -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNPhysics.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionNPhysics.java deleted file mode 100644 index e608bd9e51cc..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNPhysics.java +++ /dev/null @@ -1,95 +0,0 @@ -package atlantis.projection; - -import atlantis.nge.ANAnimVar; -import atlantis.nge.ANFrameManager; -import atlantis.nge.ANProjectionPhysics; -import atlantis.utils.AMath; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.JMenuItem; - -/** - * - * @author Adam Davison, Mark Stockton - */ -public class AProjectionNPhysics extends AProjectionNGE { - - private ANProjectionPhysics m_p = null; - private ANFrameManager m_fm = null; - - @Override - public void configureFrame(ANFrameManager fm) { - m_fm = fm; - m_p = fm.checkProjectionPhysics(); - } - - @Override - public String getName() { - return "NPhysics"; - } - - @Override - public String getScreenName() { - return "NPhysics"; - } - - @Override - public JMenuItem[] getPopupItems() { - - JMenuItem phi = new JMenuItem(AMath.ETA + " view"); - phi.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - phiView(); - } - }); - - JMenuItem[] i = { - phi - }; - return i; - } - - @Override - public String getXLabel() { - return "X"; - } - - @Override - public String getYLabel() { - return "Y"; - } - - @Override - public String getXUnits() { - return "m"; - } - - @Override - public String getYUnits() { - return "m"; - } - - @Override - public void setScales() { - - } - - @Override - public boolean processLocalCommand(String name) { - return false; - } - - public void actionPerformed(ActionEvent e) { - } - - public void phiView() { - - ANAnimVar pelev = m_p.getElevVar(); - ANAnimVar pphi = m_p.getPhiVar(); - - m_fm.getAnimationManager().scheduleAnimation(pelev, 0.0, 1.0, pelev.getValue(), -90.0); - m_fm.getAnimationManager().scheduleAnimation(pphi, 0.0, 1.0, pphi.getValue(), 0.0); - - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNYX.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionNYX.java deleted file mode 100644 index fb95d8ff95aa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionNYX.java +++ /dev/null @@ -1,71 +0,0 @@ -package atlantis.projection; - -import atlantis.nge.ANFrameManager; -import java.awt.event.ActionEvent; -import javax.swing.JMenuItem; - -/** - * - * @author Adam Davison - */ -public class AProjectionNYX extends AProjectionNGE { - - public AProjectionNYX() { - - } - - @Override - public void configureFrame(ANFrameManager fm) { - fm.checkProjectionYX(); - } - - @Override - public String getName() { - return "NYX"; - } - - @Override - public String getScreenName() { - return "NYX"; - } - - @Override - public JMenuItem[] getPopupItems() { - return null; - } - - @Override - public String getXLabel() { - return "X"; - } - - @Override - public String getYLabel() { - return "Y"; - } - - @Override - public String getXUnits() { - return "m"; - } - - @Override - public String getYUnits() { - return "m"; - } - - @Override - public void setScales() { - - } - - @Override - public boolean processLocalCommand(String name) { - return false; - } - - public void actionPerformed(ActionEvent e) { - // - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionPhi.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionPhi.java deleted file mode 100755 index 92785454bb58..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionPhi.java +++ /dev/null @@ -1,73 +0,0 @@ -package atlantis.projection; - -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import atlantis.utils.AVector; -import java.awt.geom.*; - -/** - * Base class of all phi projections - */ - -public abstract class AProjectionPhi extends AProjection2D { - - public String getScreenName() - { - return AMath.PHI+ getXLabel(); - } - - public String getYLabel() { - return AMath.PHI; - } - - public String getYUnits() { - return AMath.DEGREES; - } - - public double getMinRho() { - return 2.; - } - - public Point2D.Double getCenter() { - int phiWrap=parameterStore.get(getName(), "PhiWrap").getI(); - - return new Point2D.Double(0, (360+phiWrap)/2); - } - - public Point2D.Double[] validateCorners(Point2D.Double[] corners) { - if(super.validateCorners(corners)==null) - return null; - int phiWrap=parameterStore.get(getName(), "PhiWrap").getI(); - AParameter initialFramePar=parameterStore.get(getName(), "InitialFrame"); - - if(Math.abs(getMaxPhi(corners)-getMinPhi(corners))>(360+phiWrap)) - return null; - if(getMaxPhi(corners)>(initialFramePar.getI()*360+2*360-90)) - initialFramePar.setI(initialFramePar.getI()+1); - if(getMinPhi(corners)<(initialFramePar.getI()*360+90)) - initialFramePar.setI(initialFramePar.getI()-1); - return corners; - } - - private static double getMinPhi(Point2D.Double[] corners) { - double phiMin=corners[0].y; - - for(int i=0; i<corners.length; i++) - if(corners[i].y<phiMin) phiMin=corners[i].y; - AVector v12=new AVector(corners[1], corners[2]); - - return Math.min(phiMin, corners[0].y+v12.dy); - } - - private static double getMaxPhi(Point2D.Double[] corners) { - double phiMax=corners[0].y; - - for(int i=0; i<corners.length; i++) - if(corners[i].y>phiMax) phiMax=corners[i].y; - AVector v12=new AVector(corners[1], corners[2]); - - return Math.max(phiMax, corners[0].y+v12.dy); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionRZ.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionRZ.java deleted file mode 100755 index a47d1e0f05ff..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionRZ.java +++ /dev/null @@ -1,68 +0,0 @@ -package atlantis.projection; - -import atlantis.data.ADHelix; -import atlantis.graphics.ACoord; -import atlantis.utils.AMath; -import java.awt.*; -import java.awt.geom.*; -import atlantis.event.*; -import atlantis.parameters.*; - -public class AProjectionRZ extends AProjection2D { - - public AProjectionRZ() { - addPopupItem(ASPECT_RATIO_1); - } - - public String getName() { - return "RZ"; - } - - public String getScreenName() - { - return AMath.RHO + "Z"; - } - - public String getXLabel() { - return "Z"; - } - - public String getYLabel() { - return AMath.RHO; - } - - public String getXUnits() { - return "(cm)"; - } - - public String getYUnits() { - return "(cm)"; - } - - public Point2D.Double getCenter() { - return new Point2D.Double(0, 0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - double radius=parameterStore.get("Projection", "Radius").getD(); - double length=parameterStore.get("Projection", "Length").getD(); - return aspectRatioLayout(length, radius, wSize); - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return nonLinearTransform(dH.getRZPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) { - return nonLinearTransform2D(user, getName()); - } - - public ACoord inverseNonLinearTransform(ACoord user) { - return inverseNonLinearTransform2D(user, getName()); - } - - public static int[] getAxisMapping() { - return new int[] {2, 1, 0}; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionTrackResidual.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionTrackResidual.java deleted file mode 100644 index fc07eddcbea4..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionTrackResidual.java +++ /dev/null @@ -1,167 +0,0 @@ -package atlantis.projection; - -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.geom.Point2D; - -import atlantis.canvas.AWindow; -import atlantis.data.ADHelix; -import atlantis.data.ATrackResidualData; -import atlantis.graphics.ACoord; -import atlantis.graphics.AGraphics; -import atlantis.parameters.APar; -import atlantis.utils.AMath; - -public class AProjectionTrackResidual extends AProjection2D -{ - private ATrackResidualData residual; - private String residualType; - private double xLength; - private double yLength = 1.0; - - /** - * @param residual The residual to set. - */ - public void setResidual(ATrackResidualData residual) - { - this.residual = residual; - } - - public ATrackResidualData getResidual() - { - return residual; - } - - public void setResidualType(String type) - { - residualType = type; - } - - public String getResidualType() - { - return residualType; - } - - public String getName() - { - return "TrackResidual"; - } - - public String getXLabel() - { - return "Index"; - } - - public String getYLabel() - { - return "Res"; - } - - public String getXUnits() - { - return ""; - } - - public String getYUnits() - { - return "(mm)"; - } - - public double getXLength() - { - return xLength; - } - - public double getYLength() - { - return yLength; - } - - public Point2D.Double getCenter() - { - return new Point2D.Double(0.0, 0.0); - } - - // not useful for this projection, only put here to be compatible with - // other code - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) - { - Point2D.Double[] corners=new Point2D.Double[3]; - - corners[0]=new Point2D.Double(0., 2.); - corners[1]=new Point2D.Double(100., 2.); - corners[2]=new Point2D.Double(100., -2.); - return corners; - } - - public Point2D.Double[] calculateNoZoomCorners() - { - float[] dataArray; - if(residualType.equals(ATrackResidualData.RESIDUAL_X)) - dataArray = residual.getResLoc1(); - else - dataArray = residual.getPullLoc1(); - - xLength = dataArray.length; - if(parameterStore.get(getName(), "Scale").getI() == 0) // linear - { - yLength = (AMath.maxAbsInArray(dataArray) + 0.1) * 2; - } - else // logarithmic - { - float[] dataArrayCopy = new float[dataArray.length]; - for(int i=0; i<dataArrayCopy.length; ++i) - { - if(dataArray[i] == -99.0f) - dataArrayCopy[i] = 0.0f; - else - dataArrayCopy[i] = dataArray[i]; - } - double minValue = (double) AMath.minAbsInArray(dataArrayCopy); - double maxValue = (double) AMath.maxAbsInArray(dataArrayCopy); - double magnitude; - - // all data is either invalid or 0 - if(maxValue == 0.0 && minValue == 0.0) - { - magnitude = 1; - residual.setLogMagnitudeMin(-1.0); - } - else if (minValue == 0.0) - { - double minNonZeroValue = (double) AMath.minNonZeroAbsInArray(dataArrayCopy); - magnitude = Math.floor(Math.log10(maxValue)) - - Math.floor(Math.log10(minNonZeroValue))+ 1.0; - residual.setLogMagnitudeMin(Math.floor(Math.log10(minNonZeroValue))); - } - else - { - magnitude = Math.floor(Math.log10(maxValue)) - - Math.floor(Math.log10(minValue))+ 1.0; - residual.setLogMagnitudeMin(Math.floor(Math.log10(minValue))); - } - yLength = magnitude * 2; - } - Point2D.Double[] corners = new Point2D.Double[3]; - - corners[0] = new Point2D.Double(0., yLength/2); - corners[1] = new Point2D.Double(xLength, yLength/2); - corners[2] = new Point2D.Double(xLength, -yLength/2); - return corners; - } - - public ACoord getUserPoint(ADHelix dH, double s) - { - return ACoord.NO_DATA; - } - - public void paint(AWindow window, Graphics g) - { - AGraphics ag = AGraphics.makeAGraphics(g); - - fillBackground(window, ag); - if(residual != null) - residual.draw(window, ag, this); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionVP.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionVP.java deleted file mode 100755 index 210d848d4472..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionVP.java +++ /dev/null @@ -1,169 +0,0 @@ -package atlantis.projection; - -import atlantis.graphics.ACoord; -import atlantis.graphics.colormap.AColorMap; -import atlantis.output.ALogInterface; -import atlantis.output.AOutput; -import atlantis.parameters.AParameter; -import atlantis.parameters.APar; -import atlantis.utils.AMath; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.geom.Point2D; - -import atlantis.canvas.AWindow; -import atlantis.data.ADHelix; - -public class AProjectionVP extends AProjectionPhi { - - // this should be moved ugly - // sign is which arm of the v is being drawn at this point in time - public static int sign; - - private static double qcp=0.00035936; - - // Display modes as defined in the configuration file. - public static final int MODE_STANDARD = 0; - public static final int MODE_SPACEPOINT = 1; - public static final int MODE_TRT_DRIFT_CIRCLE = 2; - public static final int MODE_ECAL_LAYER_0 = 3; - public static final int MODE_ECAL_LAYER_1 = 4; - public static final int MODE_ECAL_LAYER_2 = 5; - public static final int MODE_ECAL_LAYER_3 = 6; - public static final int MODE_HCAL_LAYER_0 = 7; - public static final int MODE_HCAL_LAYER_1 = 8; - public static final int MODE_HCAL_LAYER_2 = 9; - public static final int MODE_HCAL_LAYER_3 = 10; - - public static final double MAX_ETA = 5.; - - private static boolean first=true; - // draw V apex at this rho or Z - private static double[] rhoMode=new double[] - { 55., 55., 108., 138., 154., 173., 193., 244., 306., 368., 368.}; - private static double[] zMode=new double[] - {277., 277., 338., 360., 374., 394., 414., 441., 482., 561., 561.}; - // zoom in another projection to this rho and Z - private static double[] rhoZoomMode=new double[] - { 56., 56., 110., 200., 200., 200., 200., 400., 400., 400., 400.}; - private static double[] zZoomMode=new double[] - {280., 280., 340., 440., 440., 440., 440., 374., 374., 374., 374.}; - - private static AParameter modePar; - private static AParameter rMaxPar; - private static AParameter zMaxPar; - private static AParameter gradientPar; - private static AParameter zVtxPar; - - public AProjectionVP() {} - - public String getName() { - return "VP"; - } - - public String getXLabel() { - return AMath.ETA; - } - - public String getXUnits() { - return ""; - } - - public void setAspectRatio1(AWindow window) - { - AOutput.append("\nNot implemented for this projection\n", ALogInterface.WARNING); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - Point2D.Double[] corners=new Point2D.Double[3]; - - corners[0]=new Point2D.Double(-5.0, 360); - corners[1]=new Point2D.Double(5.0, 360); - corners[2]=new Point2D.Double(5.0, 0); - return corners; - } - - protected Color getBackgroundFillColor(Color[] colorMap) { - int mode=parameterStore.get("VP", "Mode").getI(); - - switch(mode) { - case MODE_SPACEPOINT: - return colorMap[parameterStore.get("Det", "SIL"+"Fill").getI()]; - case MODE_TRT_DRIFT_CIRCLE: - return colorMap[parameterStore.get("Det", "TRT"+"Fill").getI()]; - case MODE_ECAL_LAYER_0: - case MODE_ECAL_LAYER_1: - case MODE_ECAL_LAYER_2: - case MODE_ECAL_LAYER_3: - return colorMap[parameterStore.get("Det", "ECAL"+"Fill").getI()]; - case MODE_HCAL_LAYER_0: - case MODE_HCAL_LAYER_1: - case MODE_HCAL_LAYER_2: - case MODE_HCAL_LAYER_3: - return colorMap[parameterStore.get("Det", "HCAL"+"Fill").getI()]; - default: - return colorMap[parameterStore.get("Color", "Bkg"+"Fill").getI()]; - } - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return dH.getVPPoint(s, this.sign); - } - - public static double getDeltaEta(double rho, double z) { - if(first) { - modePar=parameterStore.get("VP", "Mode"); - rMaxPar=parameterStore.get("VP", "RMax"); - zMaxPar=parameterStore.get("VP", "ZMax"); - gradientPar=parameterStore.get("VP", "Gradient"); - zVtxPar=parameterStore.get("VP", "ZVtx"); - first=false; - } - double fact=qcp*gradientPar.getD(); - int mode=modePar.getI(); - double zLayer=zMode[mode]; - - if(zMaxPar.getStatus()) - zLayer=Math.min(zLayer, zMaxPar.getD()); - double rhoLayer=rhoMode[mode]; - - if(rMaxPar.getStatus()) - rhoLayer=Math.min(rhoLayer, rMaxPar.getD()); - double zVtx=zVtxPar.getD(); - double zsign=1.; - - if(z<0.) zsign=-1.; - if(Math.abs((z-zVtx)/rho)<(zLayer-zVtx)/rhoLayer) - return fact*(rhoLayer-rho); - else - return fact*rho*(zsign*zLayer-z)/(z-zVtx); - } - - public static double getRhoVPlot() { - double rhoLayer=rhoMode[parameterStore.get("VP", "Mode").getI()]; - AParameter rMaxPar=parameterStore.get("VP", "RMax"); - - if(rMaxPar.getStatus()) - rhoLayer=Math.min(rhoLayer, rMaxPar.getD()); - return rhoLayer; - } - - public static double getZVPlot() { - double zLayer=zMode[parameterStore.get("VP", "Mode").getI()]; - AParameter zMaxPar=parameterStore.get("VP", "ZMax"); - - if(zMaxPar.getStatus()) - zLayer=Math.min(zLayer, zMaxPar.getD()); - return zLayer; - } - - public static double getRhoZoomVPlot() { - return rhoZoomMode[parameterStore.get("VP", "Mode").getI()]; - } - - public static double getZZoomVPlot() { - return zZoomMode[parameterStore.get("VP", "Mode").getI()]; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionXZ.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionXZ.java deleted file mode 100755 index 24f2d9b17cc2..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionXZ.java +++ /dev/null @@ -1,81 +0,0 @@ -package atlantis.projection; - -import atlantis.data.ADHelix; -import atlantis.graphics.ACoord; -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import atlantis.event.*; -import java.awt.*; -import java.awt.geom.*; - -public class AProjectionXZ extends AProjection2D { - - public AProjectionXZ() { - addPopupItem(ASPECT_RATIO_1); - } - - public String getName() { - return "XZ"; - } - - public String getXLabel() { - return "Z"; - } - - public String getYLabel() { - return "X"+AMath.PRIME; - } - - public String getXUnits() { - return "(cm)"; - } - - public String getYUnits() { - return "(cm)"; - } - - public Point2D.Double getCenter() { - return new Point2D.Double(0, 0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - double radius=parameterStore.get("Projection", "TrackingRadius").getD(); - double length=parameterStore.get("Projection", "TrackingLength").getD(); - return aspectRatioLayout(length, radius, wSize); - } - - public static double getPhi() { - return parameterStore.get("XZ", "Phi").getD(); - } - - public static double[][] getRotationMatrix() { - double phi=Math.toRadians(getPhi()); - double cos=Math.cos(phi); - double sin=Math.sin(phi); - double[][] r=new double[3][3]; - - r[0][0]=cos; - r[1][1]=cos; - r[2][2]=1.; - r[0][1]=sin; - r[1][0]=-sin; - return r; - } - - public static int[] getAxisMapping() { - return new int[] {2, 0, 1}; - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return nonLinearTransform(dH.getXZPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) { - return nonLinearTransform2D(user, getName()); - } - - public ACoord inverseNonLinearTransform(ACoord user) { - return inverseNonLinearTransform2D(user, getName()); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionYX.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionYX.java deleted file mode 100755 index ef2a7d28db6e..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionYX.java +++ /dev/null @@ -1,307 +0,0 @@ -package atlantis.projection; - -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.geom.Point2D; - -import javax.swing.ImageIcon; - -import atlantis.canvas.AWindow; -import atlantis.data.ADHelix; -import atlantis.globals.AGlobals; -import atlantis.graphics.ACoord; -import atlantis.graphics.ADrawParameters; -import atlantis.graphics.AGraphics; -import atlantis.graphics.colormap.AColorMap; -import atlantis.interactions.AZMRInteraction; -import atlantis.parameters.AParameter; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; - -public class AProjectionYX extends AProjection2D -{ - private static ALogger logger = ALogger.getLogger(AProjectionYX.class); - - // Different display modes, as defined in the configuration file. - public static final int MODE_STANDARD = 0; - public static final int MODE_TGC_INNER = 1; - public static final int MODE_TGC_MIDDLE_1 = 2; - public static final int MODE_TGC_MIDDLE_2 = 3; - public static final int MODE_TGC_MIDDLE_3 = 4; - public static final int MODE_MDT_INNER = 5; - public static final int MODE_MDT_EXTENSION = 6; - public static final int MODE_MDT_MIDDLE = 7; - public static final int MODE_MDT_OUTER = 8; - public static final int MODE_FCAL_EM = 9; - public static final int MODE_FCAL_HAD_1 = 10; - public static final int MODE_FCAL_HAD_2 = 11; - public static final int MODE_LAR_ENDCAP_PRESAMPLER = 12; - public static final int MODE_LAR_ENDCAP_1 = 13; - public static final int MODE_LAR_ENDCAP_2 = 14; - public static final int MODE_LAR_ENDCAP_3 = 15; - public static final int MODE_HEC_1 = 16; - public static final int MODE_HEC_2 = 17; - public static final int MODE_HEC_3 = 18; - public static final int MODE_HEC_4 = 19; - public static final int MODE_LAR_ENDCAP_SUMMED = 20; - public static final int MODE_HEC_SUMMED = 21; - public static final int MODE_MBTS = 22; - - public AProjectionYX() - { - addPopupItem(ASPECT_RATIO_1); - } - - public String getName() - { - return "YX"; - } - - public String getXLabel() - { - return "X"; - } - - public String getYLabel() - { - return "Y"; - } - - public String getXUnits() - { - return "(cm)"; - } - - public String getYUnits() - { - return "(cm)"; - } - - public Point2D.Double getCenter() - { - return new Point2D.Double(0, 0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) - { - // should not be here - parameterStore.get(getName(), "Phi").setD(0.); - double radius = parameterStore.get("Projection", "Radius").getD(); - return aspectRatioLayout(radius, radius, wSize); - } - - public static double[][] getRotationMatrix() - { - double[][] r = new double[3][3]; - - r[0][0] = 1.; - r[1][1] = 1.; - r[2][2] = 1.; - return r; - } - - public static int[] getAxisMapping() - { - return new int[] { 0, 1, 2 }; - } - - public ACoord getUserPoint(ADHelix dH, double s) - { - return nonLinearTransform(dH.getYXPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) - { - AParameter fishEyePar = parameterStore.get(getName(), "FishEye"); - - if (fishEyePar.getStatus()) - { - double[] x, y; - double r, fact; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(getName(), "rTo").getD(); - - for (int j = 0; j < user.hv[0].length; ++j) - { - x = user.hv[0][j]; - y = user.hv[1][j]; - for (int i = 0; i < x.length; ++i) - { - r = Math.sqrt(x[i] * x[i] + y[i] * y[i]); - fact = (1 + fishEye * rTo) / (1 + fishEye * r); - x[i] *= fact; - y[i] *= fact; - } - } - } - AParameter clockPar = parameterStore.get(getName(), "Clock"); - - if (clockPar.getStatus()) - { - double clock = Math.PI / clockPar.getD(); - double phiClock = Math.toRadians(parameterStore.get(getName(), "Phi").getD()); - - for (int j = 0; j < user.hv[0].length; ++j) - { - double[] x = user.hv[0][j]; - double[] y = user.hv[1][j]; - - for (int i = 0; i < x.length; ++i) - { - double phi = Math.atan2(y[i], x[i]); - - if (phi < 0.) - phi += 2 * Math.PI; - double rho = Math.sqrt(x[i] * x[i] + y[i] * y[i]); - double dPhi = phi - phiClock; - - if (dPhi > Math.PI) - dPhi -= 2 * Math.PI; - else if (dPhi <= -Math.PI) - dPhi += 2 * Math.PI; - double fact = (clock + Math.PI) / (clock + Math.abs(dPhi)); - - phi = phiClock + fact * dPhi; - x[i] = rho * Math.cos(phi); - y[i] = rho * Math.sin(phi); - } - } - } - - return user; - } - - public ACoord inverseNonLinearTransform(ACoord user) - { - AParameter fishEyePar = parameterStore.get(getName(), "FishEye"); - - if (fishEyePar.getStatus()) - { - double[] x, y; - double r, fact; - double fishEye = 0.001 * fishEyePar.getD(); - double rTo = parameterStore.get(getName(), "rTo").getD(); - - for (int j = 0; j < user.hv[0].length; ++j) - { - x = user.hv[0][j]; - y = user.hv[1][j]; - for (int i = 0; i < x.length; ++i) - { - r = Math.sqrt(x[i] * x[i] + y[i] * y[i]); - fact = 1 / (1 + fishEye * (rTo - r)); - x[i] *= fact; - y[i] *= fact; - } - } - } - AParameter clockPar = parameterStore.get(getName(), "Clock"); - - if (clockPar.getStatus()) - { - double clock = Math.PI / clockPar.getD(); - double phiClock = Math.toRadians(parameterStore.get(getName(), "Phi").getD()); - - for (int j = 0; j < user.hv[0].length; ++j) - { - double[] x = user.hv[0][j]; - double[] y = user.hv[1][j]; - - for (int i = 0; i < x.length; ++i) - { - double phi = Math.atan2(y[i], x[i]); - - if (phi < 0.) - phi += 2 * Math.PI; - double dPhi = phi - phiClock; - - if (dPhi > Math.PI) - dPhi -= 2 * Math.PI; - else if (dPhi <= -Math.PI) - dPhi += 2 * Math.PI; - - double dPhiPrime = (clock * dPhi) / (clock + Math.PI - Math.abs(dPhi)); - - phi = phiClock + dPhiPrime; - - double rho = Math.sqrt(x[i] * x[i] + y[i] * y[i]); - - x[i] = rho * Math.cos(phi); - y[i] = rho * Math.sin(phi); - } - } - } - return user; - } - - public void paint(AWindow window, Graphics g) - { - super.paint(window, g); - - // draw RZ cutting plane - if (parameterStore.get("YX", "RZCuttingPlane").getStatus()) - { - AGraphics ag = AGraphics.makeAGraphics(g); - final ADrawParameters drawParameters = - new ADrawParameters(true, AColorMap.WH, 4, 1, 0, AGraphics.SYMBOL_FILLED_BOX); - ag.updateDrawParameters(drawParameters); - final double RHO_MAX = 3000.0; - - double phi = Math.toRadians(parameterStore.get("RZ", "Phi").getD()) - Math.PI / 2; - double cosPhi = Math.cos(phi); - double sinPhi = Math.sin(phi); - String iconPath = AGlobals.instance().getHomeDirectory() + "img" + System.getProperty("file.separator"); - - // draw the cutting plane - Point2D.Double p1 = window.calculateDisplay(nonLinearTransform(RHO_MAX * cosPhi, RHO_MAX * sinPhi)); - Point2D.Double p2 = window.calculateDisplay(nonLinearTransform(-RHO_MAX * cosPhi, -RHO_MAX * sinPhi)); - - ag.drawLine(p1.x, p1.y, p2.x, p2.y); - - // draw the arrows - Point2D.Double p3 = window.calculateDisplay(nonLinearTransform(1500 * Math.cos(phi+.07), 1500 * Math.sin(phi+.07))); - Point2D.Double p4 = window.calculateDisplay(nonLinearTransform(1500 * Math.cos(phi+3.21), 1500 * Math.sin(phi+3.21))); - - ImageIcon upArrow = AUtilities.getFileAsImageIcon(iconPath+"uparrow.png"); - ImageIcon downArrow = AUtilities.getFileAsImageIcon(iconPath+"downarrow.png"); - - Graphics2D g2d = (Graphics2D) g; - - g2d.drawImage(upArrow.getImage(),(int) p3.x,(int) p3.y,null); - g2d.drawImage(downArrow.getImage(),(int) p4.x,(int) p4.y,null); - - } - } - - /** This function ensures that when the aspect ratio of the display changes - * the aspect ratio of the contents of a YX projection remain at the same - * aspect ratio. - * - * It uses the (thankfully) static methods of AZMRInteraction to do the - * actual zooming, which can involve some non-trivial mathematics... - * -- Adam Davison - */ - @Override - public void aspectRatioChange(AWindow w, double oldaspect, double newaspect) { - logger.debug("ProjectionYX informed of aspect ratio change from " + oldaspect + " to " + newaspect); - - Point2D.Double[] corners = w.getUserCorners(); - - // Get center - Point2D.Double center = new Point2D.Double( - 0.5*(corners[0].x+corners[2].x), - 0.5*(corners[0].y+corners[2].y)); - - // If > 1, the new view is taller if < 1 it's wider - double fracchange = newaspect/oldaspect; - - if (fracchange > 1) { - // Need to vzoom "away" to restore aspect ratio - AZMRInteraction.performVerticalZoom(center, fracchange, w); - } else { - // Need to hzoom - AZMRInteraction.performHorizontalZoom(center, 1.0/fracchange, w); - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionYZ.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionYZ.java deleted file mode 100755 index 490afb72dfd8..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionYZ.java +++ /dev/null @@ -1,72 +0,0 @@ -package atlantis.projection; - - -import atlantis.graphics.ACoord; -import atlantis.utils.AMath; -import java.awt.*; -import java.awt.geom.*; -import atlantis.data.ADHelix; -import atlantis.parameters.*; - - -public class AProjectionYZ extends AProjection2D { - - public AProjectionYZ() { - addPopupItem(ASPECT_RATIO_1); - } - - public String getName() { - return "YZ"; - } - - public String getXLabel() { - return "Z"; - } - - public String getYLabel() { - return "Y"+AMath.PRIME; - } - - public String getXUnits() { - return "(cm)"; - } - - public String getYUnits() { - return "(cm)"; - } - - public Point2D.Double getCenter() { - return new Point2D.Double(0, 0); - } - - public Point2D.Double[] calculateNoZoomCorners(Dimension wSize) { - double radius=parameterStore.get("Projection", "TrackingRadius").getD(); - double length=parameterStore.get("Projection", "TrackingLength").getD(); - return aspectRatioLayout(length, radius, wSize); - } - - public static double getPhi() { - return AProjectionXZ.getPhi(); - } - - public static double[][] getRotationMatrix() { - return AProjectionXZ.getRotationMatrix(); - } - - public static int[] getAxisMapping() { - return new int[] {2, 1, 0}; - } - - public ACoord getUserPoint(ADHelix dH, double s) { - return nonLinearTransform(dH.getYZPoint(s)); - } - - public ACoord nonLinearTransform(ACoord user) { - return nonLinearTransform2D(user, getName()); - } - - public ACoord inverseNonLinearTransform(ACoord user) { - return inverseNonLinearTransform2D(user, getName()); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/AProjectionsManager.java b/graphics/AtlantisJava/src/atlantis/projection/AProjectionsManager.java deleted file mode 100755 index e9886ac1fefb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/AProjectionsManager.java +++ /dev/null @@ -1,110 +0,0 @@ -package atlantis.projection; - -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Set; -import java.util.Vector; - -import atlantis.output.AExceptionHandler; -import atlantis.parameters.APar; -import atlantis.parameters.AParametersGroup; - -/** - * This manager keeps references to all projections. - * - * The code keeping track of the list and states of interactions associated with each - * projection in each window, and creating the corresponding pop-up menus, has been - * moved to atlantis.gui.AInteractionToolBar and atlantis.interactions.AInteractionsByProjection. - */ -public class AProjectionsManager { - - // the set of projections (name : AProjection) - private static Hashtable<String,AProjection> projections = new Hashtable<String, AProjection>(); - private static Set<String> projectionsAvailableInDemoMode = new HashSet<String>(); - private static Set<String> defaultProjectionsInDemoMode = new HashSet<String>(); - - /** - * Creates projections using information from APar. - */ - public static void initialise() { - Vector<String> projVector=APar.instance().getUIGroupNames(AParametersGroup.PROJECTION); - - for (String projName : projVector) { - createProjection(projName); - } - } - - /** - * Used to request the projection with the given name - * @param projectionName The name of the projection - * @return The AProjection corespoinding to the projection name. - */ - public static AProjection getProjection(String projectionName) { - return projections.get(projectionName); - } - - /** - * Checks whether the given name is a valid projection name. - * @param name The name to be checked - * @return True/False - */ - public static boolean isValidProjection(String name) { - return projections.containsKey(name); - } - - /** - * Returns an array containing the names of all known projections - * @return The name array - */ - public static String[] getKnownProjectionNames() { - String[] names=new String[projections.size()]; - - Enumeration<String> myenum=projections.keys(); - - for(int i=0; i<projections.size(); i++) - names[i]=myenum.nextElement(); - - return names; - } - - /** - * Check whether the projection should be used in the demo dialog - * @return false if the projection should not be used or does not exist - */ - public static boolean useProjectionInDemoMode(String name){ - return projectionsAvailableInDemoMode.contains(name); - } - - /** - * @return true if the projection should be selected by default in the demo dialog - */ - public static boolean defaultProjectionInDemoMode(String name){ - return defaultProjectionsInDemoMode.contains(name); - } - - /** - * Creates an instance of a given projection and pushes it into the - * <code>projections</code> Hashtable. The name shold be for example: YX if you - * want to create a instance of AProjectionYX.java class. - * @param name The name of the projection. - */ - private static void createProjection(String name) { - try { - - AProjection p=(AProjection)Class.forName("atlantis.projection.AProjection"+name).newInstance(); - - projections.put(name, p); - } catch(Exception e) { - AExceptionHandler.processException("Cannot create AProjection"+name, e); - } - } - - public static void makeProjectionAvailableInDemoMode(String projection) { - projectionsAvailableInDemoMode.add(projection); - } - - public static void makeProjectionDefaultInDemoMode(String name) { - defaultProjectionsInDemoMode.add(name); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/projection/package.html b/graphics/AtlantisJava/src/atlantis/projection/package.html deleted file mode 100644 index 471774c48caa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/projection/package.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<p>Implementation of projections (XY, Rho Z, V plot, etc). Class - AProjectionManager changes the current projection and informs the - AEvent class instance of how to draw itself, e.g. in the XY - projection.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/utils/A3Vector.java b/graphics/AtlantisJava/src/atlantis/utils/A3Vector.java deleted file mode 100755 index 649a18dd317f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/A3Vector.java +++ /dev/null @@ -1,98 +0,0 @@ -package atlantis.utils; - - -/** - * Provides basic 3D vector operations. - */ - -public class A3Vector { - - public double x, y, z; - - /** - * Construct zero 3-vector. - */ - public A3Vector() {} - - /** - * Construct 3-vector from Cartesian coordinates. - * @param dx - * @param dy - * @param dz - */ - public A3Vector(double x, double y, double z) { - this.x=x; - this.y=y; - this.z=z; - } - - /** - * Create 3-vector from eta, phi and magnitude. - * @param eta pseudorapidity along z direction - * @param phi azimuthal angle [radians] - * @param r magnitude of vector - * @return new A3Vector - */ - public static A3Vector fromEtaPhiR(double eta, double phi, double r) { - double theta = 2.0 * Math.atan(Math.exp(-eta)); - return new A3Vector(r * Math.sin(theta) * Math.cos(phi), - r * Math.sin(theta) * Math.sin(phi), - r * Math.cos(theta)); - } - - /** - * Create 3-vector from cylindrical coordinates rho, phi, z. - * @param rho component perpendicular to z axis - * @param phi azimuthal angle [radians] - * @param z - * @return - */ - public static A3Vector fromRhoPhiZ(double rho, double phi, double z) { - double x=rho*Math.cos(phi); - double y=rho*Math.sin(phi); - return new A3Vector(x,y,z); - } - - public A3Vector getNormalized() { - double r=Math.sqrt(x*x+y*y+z*z); - return new A3Vector(x/r, y/r, z/r); - } - - public A3Vector normalize() { - double r=magnitude(); - x/=r; - y/=r; - z/=r; - return this; - } - - public double magnitude() { - return Math.sqrt(x*x+y*y+z*z); - } - - public A3Vector scale(double a) { - x*=a; - y*=a; - z*=a; - return this; - } - - public A3Vector add(A3Vector v) { - x+=v.x; - y+=v.y; - z+=v.z; - return this; - } - - public A3Vector subtract(A3Vector v) { - x-=v.x; - y-=v.y; - z-=v.z; - return this; - } - - public String toString() { - return "A3Vector[x="+x+", y="+y+", z="+z+"]"; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/A4Vector.java b/graphics/AtlantisJava/src/atlantis/utils/A4Vector.java deleted file mode 100755 index 5032250f170c..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/A4Vector.java +++ /dev/null @@ -1,127 +0,0 @@ -package atlantis.utils; - -/** - * Provides basic 4D vector operations. - */ -public class A4Vector -{ - public double px, py, pz, e; - - public A4Vector() - {} - - public A4Vector(double dx, double dy, double dz, double m) - { - set(dx, dy, dz, m); - } - - public A4Vector(A3Vector v, double m) - { - set(v.x, v.y, v.z, m); - } - - public void set(double dx, double dy, double dz, double m) - { - px = dx; - py = dy; - pz = dz; - e = Math.sqrt(px * px + py * py + pz * pz + m * m); - } - - public void setPtEtaPhiM(double pT, double eta, double phi, double mass) - { - double ptAbs = Math.abs(pT); - px = ptAbs*Math.cos(phi); - py = ptAbs*Math.sin(phi); - pz = ptAbs*Math.sinh(eta); - e = Math.sqrt(px * px + py * py + pz * pz + mass * mass); - } - - public double getP() - { - return Math.sqrt(px * px + py * py + pz * pz); - } - - public double getPt() - { - return Math.sqrt(px * px + py * py); - } - - public double getE() - { - return e; - } - - /** - * getEt() returns the transverse energy. - * The formula used to calculate it is: - * Et^2 = E^2 * Pt^2 / P^2. - */ - public double getEt() - { - double pt2 = px * px + py * py; - double p2 = pt2 + pz * pz; - return Math.sqrt(e * e * pt2/p2); - } - - public double getMass() - { - return Math.sqrt(e * e - px * px - py * py - pz * pz); - } - - /** - * getMt() returns the transverse mass. - * The formula used to calculate it is: - * Mt^2 = Et^2 - Pt^2. - * - * This is from the Particle Data Group (http://pdg.lbl.gov/) - * - * Note this is different to another definition in the PDG: - * Mt^2 = E^2 - Pz^2 = m^2 + Pt^2 - * - * [J. Beringer et al. (Particle Data Group), Phys. Rev. D86, 010001 (2012). - * (Kinematics, 43.6.1 and 43.5.2)] - */ - public double getMt() - { - double pt2 = px * px + py * py; - double Et = getEt(); - return Math.sqrt(Et * Et - pt2); - } - - public double getPhi() - { - return px == 0.0 && py == 0.0 ? 0.0 : Math.atan2(py,px); - } - - public double getEta() - { - double ptot = getP(); - double cosTheta = ptot == 0.0 ? 1.0 : pz/ptot; - if (cosTheta*cosTheta < 1) return -0.5* Math.log( (1.0-cosTheta)/(1.0+cosTheta) ); - if (pz > 0) return 10e10; - else return -10e10; - } - - public void add(double dx, double dy, double dz, double m) - { - px += dx; - py += dy; - pz += dz; - e += Math.sqrt(dx * dx + dy * dy + dz * dz + m * m); - } - - public void add(A4Vector v) - { - px += v.px; - py += v.py; - pz += v.pz; - e += v.e; - } - - public String toString() - { - return "A4Vector[px=" + px + ", py=" + py + ", pz=" + pz + ", E=" + e + ", m=" + getMass() + "]"; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AAtlantisException.java b/graphics/AtlantisJava/src/atlantis/utils/AAtlantisException.java deleted file mode 100755 index d8a4edc6d38f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AAtlantisException.java +++ /dev/null @@ -1,41 +0,0 @@ -package atlantis.utils; - -/** - * - * @author Zdenek Maxa - */ -public class AAtlantisException extends Exception -{ - private boolean isFatal = true; - - // private static ALogger logger = ALogger.getLogger(AAtlantisException.class); - - - public AAtlantisException(String msg) - { - super(msg); - // logger.debug(msg, this); - this.isFatal = true; - - } // AAtlantisException() ----------------------------------------------- - - - - public AAtlantisException(String msg, boolean isFatal) - { - super(msg); - // logger.debug(msg, this); - this.isFatal = isFatal; - - } // AAtlantisException() ----------------------------------------------- - - - - public boolean isFatal() - { - return this.isFatal; - - } // isFatal() ---------------------------------------------------------- - - -} // class AAtlantisException =============================================== diff --git a/graphics/AtlantisJava/src/atlantis/utils/AClipPolygon.java b/graphics/AtlantisJava/src/atlantis/utils/AClipPolygon.java deleted file mode 100755 index ad73aac1bfd1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AClipPolygon.java +++ /dev/null @@ -1,98 +0,0 @@ -package atlantis.utils; - -/** - * This class is used when clipping polygons. - */ -public class AClipPolygon extends APolygon { - - public AClipPolygon(double[] x, double[] y) { - super(x, y); - calc_hesse(); - } - - private double[][] normalized; - private double[] distances; - - public double[] get_normalized(int index) { - if(index>=0&&index<normalized.length&&normalized[index].length==3) - return normalized[index]; - else - return null; - } - - public double get_distance(int index) { - if(index>=0&&index<distances.length) - return distances[index]; - else - return Double.NaN; - } - - public void calc_hesse() { - int degree=nodes.size(); - - // Check if fields are already allocated - if(distances==null||distances.length!=degree) - distances=new double[nodes.size()]; // Generate array for distances - - if(normalized==null||normalized.length!=degree) - normalized=new double[nodes.size()][]; // array for normal vectors - - // Loop over all components and determine the normal vectors - for(int i=0; i<degree; i++) { - APoint r, next=null, current=null; - - if(nodes.elementAt(i) instanceof APoint) - current=(APoint)nodes.elementAt(i); - if(nodes.elementAt((i+1)%degree) instanceof APoint) - next=(APoint)nodes.elementAt((i+1)%degree); - - // If both APoints exist, calculate the normalized vector - if(next!=null&¤t!=null) { - - normalized[i]=new double[3]; - r=next.minus(current); - - // Check values and determine normalized vector. - if(r.x==0) - if(r.y>0) { - normalized[i][0]=1.0; - normalized[i][1]=0.0; - normalized[i][2]=1.0; - } else if(r.y<0) { // on the negative y-Axis - normalized[i][0]=-1.0; - normalized[i][1]=0.0; - normalized[i][2]=1.0; - } - - if(r.y==0) - if(r.x>0) { // on the positive x-Axis - normalized[i][0]=0.0; - normalized[i][1]=-1.0; - normalized[i][2]=1.0; - } else if(r.x<0) { // on the negative x-Axis - normalized[i][0]=0.0; - normalized[i][1]=1.0; - normalized[i][2]=1.0; - } - - if(r.y!=0) - if(r.x>0) { // right of the y-Axis - double x_val=r.y/r.x; - double length=Math.sqrt(x_val*x_val+1); - - normalized[i][0]=x_val/length; - normalized[i][1]=-1.0/length; - normalized[i][2]=1.0; - } else if(r.x<0) { // left of the y-Axis - double x_val=-r.y/r.x; - double length=Math.sqrt(x_val*x_val+1); - - normalized[i][0]=x_val/length; - normalized[i][1]=1.0/length; - normalized[i][2]=1.0; - } - distances[i]=-current.dot_product(normalized[i]); - } - } - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/ACommandHistory.java b/graphics/AtlantisJava/src/atlantis/utils/ACommandHistory.java deleted file mode 100755 index b226d78b0fac..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/ACommandHistory.java +++ /dev/null @@ -1,213 +0,0 @@ -package atlantis.utils; - -import java.util.Vector; -import javax.swing.text.JTextComponent; - - -/** - * Implementation of simple command history (up and down - * arrows) and tab completion based upon the already typed commands. - * No cross-sessions commands history so far. - * - * @author Zdenek Maxa - */ -public class ACommandHistory extends Vector -{ - // the component upon which the history operates - private JTextComponent comp = null; - // item on the size() position of the history (content of the text field) - private String tempItem = ""; - private int pointer = 0; - private int tabPointer = 0; // help pointer when doing tab completion - private String tabItem = null; - - - // ---------------------------------------------------------------------- - public ACommandHistory(JTextComponent compoment) - { - super(); - this.comp = compoment; - this.pointer = 0; - this.tabPointer = 0; - this.tempItem = ""; - this.nullTabItem(); - - } // ACommandHistory() -------------------------------------------------- - - - /** - * add the item into the history container, if it's already there it's - * removed first and then added (placed to the end) - * @param item String - */ - public void add(String item) - { - if(super.contains(item)) - { - super.remove(item); - } - super.add(item); - pointer = super.size(); - nullTabItem(); - - } // add() -------------------------------------------------------------- - - - /** - * erase the content of the tabItem string upon which the tab-completion - * searching is performed - */ - public void nullTabItem() - { - this.tabItem = null; - - } // nullTabItem() ------------------------------------------------------ - - - private String getItem() - { - if(pointer < super.size()) - { - return super.get(pointer).toString(); - } - else - { - return tempItem; - } - - } // getItem() ---------------------------------------------------------- - - - - private void desc() - { - if(pointer > 0) - { - pointer--; - } - - } // desc() ------------------------------------------------------------- - - - - private void inc() - { - if(pointer < super.size()) - { - pointer++; - } - - } // inc() -------------------------------------------------------------- - - - - /** - * compares the actual content of the text field with the history item - * on the matching position. if they differ (user changed the item in the - * text field) the item in the history (or the tempItem attribute - the - * last item, not yet added to the container) gets updated - */ - private void compareAndUpdate() - { - String currItem = comp.getText(); - if(pointer < super.size()) - { - String histItem = super.get(pointer).toString(); - if(! histItem.equals(currItem)) - { - super.remove(pointer); - super.add(pointer, currItem); - } - } - else - { - if(! tempItem.equals(currItem)) - { - tempItem = currItem; - } - } - - } // compareAndUpdate() ------------------------------------------------- - - - - /** - * up-arrow handler - it will decrease the pointer and return former - * command - */ - public void upArrow() - { - if(! super.isEmpty()) - { - compareAndUpdate(); - desc(); - comp.setText(getItem()); - } - nullTabItem(); - - } // upArrow() ---------------------------------------------------------- - - - - /** - * down-arrow handler - it will increase the pointer toward the more - * recent commands - */ - public void downArrow() - { - if(! super.isEmpty()) - { - compareAndUpdate(); - inc(); - comp.setText(getItem()); - } - nullTabItem(); - - } // downArrow() -------------------------------------------------------- - - - - /** - * tabulator handler, tab-completion - */ - public void tabulator() - { - // check tabItem - first or subsequent tab-key hit? - if(tabItem == null) - { - tabItem = comp.getText().trim(); - if("".equals(tabItem) || tabItem == null) - { - nullTabItem(); - return; - } - } - - if(! super.isEmpty()) - { - compareAndUpdate(); - - if(tabPointer >= super.size()) - { - tabPointer = 0; // rotate again from the beginning - } - - for( ; tabPointer < super.size(); tabPointer++) - { - String item = super.get(tabPointer).toString(); - if(item.startsWith(tabItem)) - { - pointer = tabPointer; - comp.setText(item); - tabPointer++; // for next iteration (next tab hit) - break; - } - } - - } // if(! super.isEmpty()) [container empty] - - } // tabulator() -------------------------------------------------------- - - - -} // class ACommandHistory ================================================== diff --git a/graphics/AtlantisJava/src/atlantis/utils/AHashMap.java b/graphics/AtlantisJava/src/atlantis/utils/AHashMap.java deleted file mode 100755 index 6e4f5f1c9d4a..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AHashMap.java +++ /dev/null @@ -1,201 +0,0 @@ -package atlantis.utils; - -import java.util.HashMap; -import atlantis.Atlantis; - -/** - * Based on a standard Hashmap with an modified interface - */ - -public class AHashMap extends HashMap -{ - - private static ALogger logger = ALogger.getLogger(AHashMap.class); - - private void printWarningMessage(String msg) - { - logger.warn("AHashMap: " + msg); - } - - - public AHashMap(int num) - { - super(num); - } - - public AHashMap put(String name, int i) - { - put(name, new Integer(i)); - return this; - } - - public float[] getFloatArray(String name) - { - Object temp = get(name); - if(temp == null) - { - printWarningMessage("getFloatArray(): can't find float array named " + - name); - return null; - } - else - { - return (float[]) temp; - } - } // getFloatArray() ------------------------------------------------------- - - public float[][][] getFloatArray3D(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getFloatArray3D(): can't find 3D float array named " - + name); - } - return (float[][][]) temp; - } - - public String[] getStringArray(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getStringArray(): can't find String array named " - + name); - } - return (String[]) temp; - } - - public String[][] getStringArray2D(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getStringArray2D(): can't find String array named " - + name); - } - return (String[][]) temp; - } - - - public int[] getIntArray(String name) - { - Object temp = get(name); - - if(temp == null && !name.equals("sub")) - { - printWarningMessage("getIntArray(): can't find int array named " + - name); - } - return (int[]) temp; - } - - - public int[][] getIntArray2D(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getIntArray2D(): can't find 2D int array named " + - name); - } - return (int[][]) temp; - } - - - public int getInt(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getInt(): can't find int named " + name); - } - return ((Integer) temp).intValue(); - } - - public long getLong(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getLong(): can't find int named " + name); - return -1; - } - return ((Long) temp).longValue(); - } - - public float getFloat(String name) - { - Object temp = get(name); - - if(temp == null) - { - printWarningMessage("getFloat(): can't find int named " + name); - return -1; - } - return ((Float) temp).floatValue(); - } - - - public float[] getUnknownFloatArray(String name) - { - Object temp = get(name); - - if(temp == null) - return new float[getInt("numData")]; - return (float[]) temp; - } - - public long[] getUnknownLongArray(String name) - { - Object temp = get(name); - - if(temp == null) - return new long[getInt("numData")]; - return (long[]) temp; - } - - - public int[] getUnknownIntArray(String name) - { - Object temp = get(name); - - if(temp == null) - return new int[getInt("numData")]; - return (int[]) temp; - } - - - public float[] getUnsureFloatArray(String name) - { - Object temp = get(name); - - if(temp == null) - return null; - return (float[]) temp; - } - - public int[] getUnsureIntArray(String name) - { - Object temp = get(name); - - if(temp == null) - return null; - return (int[]) temp; - } - - public String[] getUnsureStringArray(String name) - { - Object temp = get(name); - - if(temp == null) - return null; - return (String[]) temp; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AIdDictionary.java b/graphics/AtlantisJava/src/atlantis/utils/AIdDictionary.java deleted file mode 100644 index 9d04ec7239c5..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AIdDictionary.java +++ /dev/null @@ -1,152 +0,0 @@ -package atlantis.utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * Class representing an identifier dictionary, used for decoding of compact IDs. - * - * @author Eric Jansen - */ -class AIdDictionary extends AIdField { - - private HashMap<String, Node> subregions = null; - private HashMap<String, Node> labels = null; - private HashMap<String, List<AIdRange>> ranges = new HashMap<String, List<AIdRange>>(); - - /** - * Empty constructor, used to create a placeholder dictionary that - * can be initialized later. - */ - AIdDictionary() {} - - /** - * Construct and initialize dictionary from an <IdDictionary> XML node. - * @param dict dictionary XML node - * @throws AAtlantisException - */ - AIdDictionary(Node dict) throws AAtlantisException { - initialize(dict); - } - - /** - * Initializes a dictionary from an <IdDictionary> XML node. - * @param dict dictionary XML node - * @throws AAtlantisException - */ - final void initialize(Node dict) throws AAtlantisException { - - this.dictionary = this; - - NodeList nodes = dict.getChildNodes(); - - for (int i=0; i<nodes.getLength(); i++) { - Node node = nodes.item(i); - - if (node.getNodeType() == Node.ELEMENT_NODE) { - - if ("field".equals(node.getNodeName())) { - String fieldName = node.getAttributes().getNamedItem("name").getNodeValue(); - if (labels == null) { - labels = new HashMap<String, Node>(); - } - labels.put(fieldName, node); - - } else if ("subregion".equals(node.getNodeName())) { - String subregionName = node.getAttributes().getNamedItem("name").getNodeValue(); - if (subregions == null) { - subregions = new HashMap<String, Node>(); - } - subregions.put(subregionName, node); - - } else if ("region".equals(node.getNodeName())) { - parseRegion(node, null, 0); - - } else if ("alternate_regions".equals(node.getNodeName())) { - NodeList altnodes = node.getChildNodes(); - - for (int j=0; j<altnodes.getLength(); j++) { - Node altnode = altnodes.item(j); - if (altnode.getNodeType() == Node.ELEMENT_NODE - && "region".equals(altnode.getNodeName())) { - parseRegion(altnode, null, 0); - } - } - } - } - } - - // Clean up the HashMaps, they are only needed during initialization. - ranges = null; - labels = null; - subregions = null; - } - - /** - * Returns true if the dictionary contains labels for the named field. - * @param fieldName name of the field - * @return true if labels are present - */ - boolean hasLabels(String fieldName) { - return labels.containsKey(fieldName); - } - - /** - * Returns the <field> node containing the labels for the named field. - * @param fieldName name of the field - * @return <field> XML node - * @throws AAtlantisException - */ - Node getLabels(String fieldName) throws AAtlantisException { - if (labels.containsKey(fieldName)) { - return labels.get(fieldName); - } else { - throw new AAtlantisException("Labels for field '"+fieldName+"' not found"); - } - } - - /** - * Returns the <subregion> node containing the named subregion. - * @param subRegionName name of the subregion - * @return <subregion> XML node - * @throws AAtlantisException - */ - Node getSubRegion(String subRegionName) throws AAtlantisException { - if (subregions.containsKey(subRegionName)) { - return subregions.get(subRegionName); - } else { - throw new AAtlantisException("Subregion '"+subRegionName+"' not found"); - } - } - - /** - * One AIdRange object for every unique field range is kept inside the dictionary. - * It serves to collect all possible values for the named field. Due to the tree - * structure of the identifiers multiple AIdFields with the same name might be - * created, but they will always have the same range. The first AIdField with a - * certain name will be the parent of the range, but it is only used for decoding - * of labelled fields. The field name has to be set before creating the range in the - * dictionary. - * @param field named identifier field - * @return global range corresponding to the named field - */ - AIdRange getRange(String group, int level) throws AAtlantisException { - - List<AIdRange> range; - if (ranges.containsKey(group)) { - range = ranges.get(group); - } else { - range = new ArrayList<AIdRange>(); - ranges.put(group, range); - } - - while (range.size() <= level) { - range.add(new AIdRange()); - } - - return range.get(level); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AIdField.java b/graphics/AtlantisJava/src/atlantis/utils/AIdField.java deleted file mode 100644 index a1f9c7d8d8d7..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AIdField.java +++ /dev/null @@ -1,537 +0,0 @@ -package atlantis.utils; - -import java.util.HashMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * Class representing a single field in an identifier. Each field has a parent, - * a range of allowed values and child fields that may depend on the value of the - * current field. The possible values of a field will determine the number of bits - * needed to store it in the compact identifier. The AIdField tree is capable of - * encoding and decoding these compact identifiers. - * - * @author Eric Jsnsen - */ -class AIdField { - - /** - * Dictionary that this field belongs to. The dictionary is used to keep track - * of the possible values of a field, - */ - protected AIdDictionary dictionary = null; - - /** Parent field in the identifier tree. */ - private AIdField parent = null; - - /** Level of nesting this field is at. */ - private int level = 0; - - /** Field name. */ - private String name = null; - - /** All known values found for this field in the dictionary. */ - private AIdRange fieldRange = null; - - /** Map of value ranges to child AIdField objects, inverse of parent. */ - private HashMap<AIdRange, AIdField> children = new HashMap<AIdRange, AIdField>(); - - /** Map of string labels in case of an enumerated field. */ - private HashMap<Integer, String> labels = null; - - /** Reference to idHelper for retrieving dictionaries. */ - protected static ANewIdHelper idHelper = ANewIdHelper.instance(); - - /** - * Empty constructor. - */ - protected AIdField() {} - - /** - * Constructor, setting dictionary and parent field. - * @param dict dictionary the field belongs to - * @param parentField parent field - */ - protected AIdField(AIdDictionary dict, AIdField parentField) { - - dictionary = dict; - if (parentField != null) { - parent = parentField; - level = parent.getLevel()+1; - } - } - - /** - * Get the name of the field. - * @return field name - */ - String getName() { - return name; - } - - /** - * Get the nesting level of the field. - * @return nesting level - */ - int getLevel() { - return level; - } - - /** - * Obtain the value of the named field from a compact identifier. - * @param fieldName field name - * @param id compact identifier - * @return value of the given field in the identifier - * @throws AAtlantisException - */ - public int get(String fieldName, long id) throws AAtlantisException { - if (id > Integer.MAX_VALUE) { - return get(fieldName, id, 64); - } else { - return get(fieldName, id, 32); - } - } - - /** - * Obtain the string value of the named field from a compact identifier. - * @param fieldName field name - * @param id compact identifier - * @return value of the given field in the identifier - * @throws AAtlantisException - */ - public String getString(String fieldName, long id) throws AAtlantisException { - if (id > Integer.MAX_VALUE) { - return getString(fieldName, id, 64); - } else { - return getString(fieldName, id, 32); - } - } - - /** - * Internal version of get(String, long), propagating the bit offset in - * the compact identifier. - * @param fieldName field name - * @param id compact identifier - * @param offset bit offset accumulated from parent fields - * @return value of the given field in the identifier - * @throws AAtlantisException - */ - private int get(String fieldName, long id, int offset) throws AAtlantisException { - - if (fieldRange == null) { - throw new AAtlantisException("No range known for identifier field" - + " '" + name + "' while decoding '" + fieldName + "'"); - } - - // The following code is duplicated a few times in this class. This is - // necessary to extract the value but also update offset at the same time. - int bits = fieldRange.bits(); - offset -= bits; - int mask = (int)(Math.pow(2, bits)) - 1; - - int value; - try { - value = fieldRange.get((int)(id >> offset & mask)); - } catch (AAtlantisException e) { - throw new AAtlantisException("Unable to decode identifier field" - + " '" + name + "': " + e); - } - - if (fieldName.equals(name)) { - // This is me, return value - return value; - } else { - // Find the correct child to delegate this ID to - for(AIdRange range : children.keySet()) { - if (range.contains(value)) { - return children.get(range).get(fieldName, id, offset); - } - } - } - - throw new AAtlantisException("Invalid identifier '" + id + "'"); - } - - /** - * Internal version of get(String, long), propagating the bit offset in - * the compact identifier. - * @param fieldName field name - * @param id compact identifier - * @param offset bit offset accumulated from parent fields - * @return value of the given field in the identifier - * @throws AAtlantisException - */ - private String getString(String fieldName, long id, int offset) throws AAtlantisException { - - if (fieldRange == null) { - throw new AAtlantisException("No range known for identifier field" - + " '" + name + "' while decoding '" + fieldName + "'"); - } - - // The following code is duplicated a few times in this class. This is - // necessary to extract the value but also update offset at the same time. - int bits = fieldRange.bits(); - offset -= bits; - int mask = (int)(Math.pow(2, bits)) - 1; - - int value; - try { - value = fieldRange.get((int)(id >> offset & mask)); - } catch (AAtlantisException e) { - throw new AAtlantisException("Unable to decode identifier field" - + " '" + name + "': " + e); - } - - if (fieldName.equals(name)) { - // This is me, return value - return getLabel(value); - } else { - // Find the correct child to delegate this ID to - for(AIdRange range : children.keySet()) { - if (range.contains(value)) { - return children.get(range).getString(fieldName, id, offset); - } - } - } - - throw new AAtlantisException("Invalid identifier '" + id + "'"); - } - - /** - * Convert a compact identifier into a "/" delimited expanded identifier. - * @param id compact identifier - * @return expanded identifier, fields delimited by "/" - */ - public String getFullIdentifier(long id) throws AAtlantisException { - - StringBuilder s = new StringBuilder(); - if (id > Integer.MAX_VALUE) { - getFullIdentifier(id, 64, s); - } else { - getFullIdentifier(id, 32, s); - } - return s.toString(); - } - - /** - * Internal version of getFullIdentifier(long), passing the bit offset a - * StringBuilder object. The output is appended to the StringBuilder object. - * @param id compact identifier - */ - private void getFullIdentifier(long id, int offset, StringBuilder s) throws AAtlantisException { - - // The following code is duplicated a few times in this class. This is - // necessary to extract the value but also update offset at the same time. - int bits = fieldRange.bits(); - offset -= bits; - int mask = (int)(Math.pow(2, bits)) - 1; - - int value; - try { - value = fieldRange.get((int)(id >> offset & mask)); - } catch (AAtlantisException e) { - throw new AAtlantisException("Unable to decode identifier field" - + " '" + name + "': " + e.getMessage()); - } - - if (hasLabels()) { - s.append(getLabel(value));//.append("=").append(value); - } else { - s.append(value); - } - - if (children != null) { - for (AIdRange range : children.keySet()) { - if (range.contains(value)) { - AIdField child = children.get(range); - if (child != null && !child.isEmpty()) { - s.append("/"); - child.getFullIdentifier(id, offset, s); - } - return; - } - } - - throw new AAtlantisException("Invalid identifier '" + id + "', " - + "field '" + name +"' does not allow value " + value + " " - + "(partially decoded: '" + s.toString() + "')"); - } - } - - /** - * Parses a <region> element in the XML file. This method should be - * called on an AIdField instance that represents the first field in the - * region. Children will be added by recursively calling this method. - * @param region XML element to parse - * @param start Starting child element - * @return Last child parsed - * @throws AAtlantisException - */ - AIdField parseRegion(Node region, String group, int start) throws AAtlantisException { - NodeList nodes = region.getChildNodes(); - - if (start == 0) { - // In a new region, first set the group all parsed elements belong to (if any). - Node groupNode = region.getAttributes().getNamedItem("group"); - if (groupNode != null) { - group = groupNode.getNodeValue(); - } - } - - for (int i=start; i<nodes.getLength(); i++) { - Node node = nodes.item(i); - - /* Select only elements, not the text in between. */ - if (node.getNodeType() == Node.ELEMENT_NODE) { - - if ("range".equals(node.getNodeName())) { - - // The first <range> encountered is for the current AIdFied. For the - // given values of this field, the next will be a child. For example, - // when called with: - // - // <range field="subdet" value="2" /> - // <range field="part" value=1" /> - // ... - // - // This field will become "subdet". In case the value of this field - // in the identifier is "2", the next field in the chain is "part". - // More values of "part" will probably be added later, plus other - // values of "subdet" for which the next field is not "part" but - // something different. - if (name == null) { - name = node.getAttributes().getNamedItem("field").getNodeValue(); - if (dictionary.hasLabels(name)) { - parseLabels(dictionary.getLabels(name)); - } - - fieldRange = dictionary.getRange(group, level); - } - - AIdRange range = new AIdRange(this, group, node); - - // Fields are sometimes repeated without specifying any allowed values, - // in that case we allow all existing values (so we copy fieldRange). - if (range.isEmpty() && !fieldRange.isEmpty()) { - range.add(fieldRange); - } - - // If this particular range is already present, give the next - // node (i+1) to the correct child and tell it to parse it. - if (children.containsKey(range) && children.get(range) != null) { - - return children.get(range).parseRegion(region, group, i+1); - } - - // If there is another range that fully contains this range, we add the - // current node there. This is a reasonable shortcut, since we are not - // interested in fully validating IDs (i.e. raise an exception when an - // RPC identifier is presented for a muon station that should not contain - // RPCs), this is a reasonable shortcut. - for (AIdRange childRange : children.keySet()) { - if (childRange.contains(range)) { - return children.get(childRange).parseRegion(region, group, i+1); - } - } - - if (group != null && !group.equals("")) { - - // Two ranges within the same group means that they should be - // considered to lead to the same child. In that case expand - // the range using AIdRange.add(). - for (AIdRange childRange : children.keySet()) { - if (group.equals(childRange.group())) { - AIdField child = children.get(childRange); - - if (child != null) { - fieldRange.add(range); - children.remove(childRange); - childRange.add(range); - children.put(childRange, child); - return child.parseRegion(region, group, i+1); - } - } - } - } - - fieldRange.add(range); - - AIdField child = new AIdField(dictionary, this); - AIdField retfield = child.parseRegion(region, group, i+1); - if (retfield instanceof AIdDictionary) { - children.put(range, retfield); - } else { - children.put(range, child); - } - - return retfield; - - } else if ("dictionary".equals(node.getNodeName())) { - - // A dictionary is a reference to another file. The AIdDictionary class - // inherits from AIdField and can will act as the first field in the - // dictionary. Dictionaries are initialized one by one, so when a dictionary - // does not exist yet, it is created empty so that it can be initialized later. - String dictName = node.getAttributes().getNamedItem("name").getNodeValue(); - if (idHelper.hasDictionary(dictName)) { - return idHelper.getDictionary(dictName); - } else { - AIdDictionary dict = new AIdDictionary(); - idHelper.addDictionary(dictName, dict); - return dict; - } - - } else if ("reference".equals(node.getNodeName())) { - - // A reference is a link to a <subregion> element. The elements within the - // subregion are parsed as if they were present instead of the reference. - String reference = node.getAttributes().getNamedItem("subregion").getNodeValue(); - AIdField child = parseRegion(dictionary.getSubRegion(reference), group, 0); - - // After parsing the subregion, we need to continue with the current region. - AIdField retfield = child.parseRegion(region, group, i+1); - return retfield; - } - } - } - - // Reached the end of a region or subregion, - // return the last object parsed (which is us). - return this; - } - - /** - * Parse a <field> object in the XML file. - * @param field XML element to parse - * @throws AAtlantisException - */ - private void parseLabels(Node field) throws AAtlantisException { - - labels = new HashMap<Integer, String>(); - int lastValue = 0; - - NodeList nodes = field.getChildNodes(); - for (int i=0; i<nodes.getLength(); i++) { - Node node = nodes.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - - if (node.getNodeName().equals("label")) { - String label = node.getAttributes().getNamedItem("name").getNodeValue(); - Integer value; - - Node valueNode = node.getAttributes().getNamedItem("value"); - if (valueNode == null) { - value = lastValue+1; - } else { - value = Integer.parseInt(valueNode.getNodeValue().replaceAll("\\+", "")); - } - - labels.put(value, label); - lastValue = value.intValue(); - } - } - } - } - - /** - * Check if this field has string labels. - * @return true if string labels are present - */ - boolean hasLabels() { - return labels != null && labels.size() > 0; - } - - /** - * Check if this field is empty/uninitialized. Fields at the end of the tree - * will remain in this state, during construction all newly initialized fields - * will be in this state. - * @return - */ - boolean isEmpty() { - return name == null; - } - - /** - * Return label corresponding to an integer value. - * @param value field value - * @return label - */ - String getLabel(Integer value) { - if (labels.containsKey(value)) { - return labels.get(value); - } else { - return "?"; - } - } - - /** - * Convert a field value as it appears in the XML file into a true integer. - * For example "+2" is converted into 2 and labelled fields are converted - * into their integer equivalents. - * @param fieldName field name (for label lookup) - * @param value "raw" field value in the XML - * @return integer value - * @throws AAtlantisException - */ - protected int valueToInt(String fieldName, String value) throws AAtlantisException { - - try { - return Integer.parseInt(value.replaceAll("\\+", "")); - } catch (NumberFormatException e) { - return labelToInt(fieldName, value); - } - } - - /** - * Convert a field label into an integer value. - * @param fieldName field name - * @param label value of the labelled field - * @return integer label - * @throws AAtlantisException - */ - protected int labelToInt(String fieldName, String label) throws AAtlantisException { - if (labels != null) { - if (labels.containsValue(label)) { - for (Integer value : labels.keySet()) { - if (label.equals(labels.get(value))) { - return value; - } - } - } - } - - throw new AAtlantisException("Field/label not found in" - +" dictionary: " + fieldName + "/" + label); - } - - /** - * Convert the field structure into a printable form, starting from this node. - * @return string representation of the identifier tree - */ - @Override - public String toString() { - return toString(""); - } - - /** - * Private version of toString(), used recursively and passing an indentation - * string to print the entire tree structure. - * @param indent identation string, appended to all lines - * @return string representation of the identifier tree - */ - private String toString(String indent) { - StringBuilder s = new StringBuilder(); - - s.append(indent).append(name).append(" ").append(fieldRange).append("\n"); - - for (AIdRange range : children.keySet()) { - s.append(indent).append(range).append("\n"); - AIdField child = children.get(range); - if (child != null) { - s.append(child.toString(indent + " ")); - } - } - - return s.toString(); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AIdHelper.java b/graphics/AtlantisJava/src/atlantis/utils/AIdHelper.java deleted file mode 100755 index 48561f8232ea..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AIdHelper.java +++ /dev/null @@ -1,599 +0,0 @@ -package atlantis.utils; - -import java.util.ArrayList; - -/** - * This class contains methods for extracting various properties from the 32 bit - * identifiers used for hits. It works very similarly to the IdHelpers in Athena, - * hence its name. - * - * @author Eric Jansen - */ -public class AIdHelper { - - private static ANewIdHelper idHelper = null; - - /** - * Returns the decoded athena identifier (id) as a string, resp. an - * array of strings: first item is the full id expanded (decoded) and - * particular subparts are separated by "/" in one sting, further - * interesting subparts of the decoded id are provided in the following - * items of the array with an explanation given. - * So far (2009-01-20), this is implemented only for LAr and Tile, for - * other subsystems only first array item is returned with the expanded - * id. - * @param id int compact identifier - * @return String decoded identifier - */ - public static String[] getFullIdentifier(long id) - { - // more than 10 items should not be necessary - ArrayList<String> r = new ArrayList<String>(10); - String s = null; - - try - { - switch (subDetector(id)) - { - case 2: - switch (indetPart(id)) - { - case 1: - // Pixel identifiers are complicated and we don't use them anyway. - throw new AAtlantisException("Pixel identifiers not implemented: " + id); - case 2: - s = "2/2/" + sctBarrelEndcap(id) + "/" + - sctLayerDisk(id) + "/" + sctPhiModule(id) + "/" + - sctEtaModule(id) + "/" + sctPhiIndex(id) + "/" + - sctEtaIndex(id); - r.add(s); - return r.toArray(new String[r.size()]); - case 3: - - int part = 3; - int barrelEndcap = trtBarrelEndcap(id); - int layerWheel = trtLayerWheel(id); - int phiModule = trtPhiModule(id); - int strawLayer = trtStrawLayer(id); - int straw = trtStraw(id); - - s = "2" + "/" + part + "/" + barrelEndcap + "/" + - layerWheel + "/" + phiModule + "/" + strawLayer + - "/" + straw; - r.add(s); - r.add("barrel-endcap: " + barrelEndcap); - r.add("layer wheel: " + layerWheel); - r.add("phi module: " + phiModule); - r.add("straw layer: " + strawLayer); - r.add("straw: " + straw); - return r.toArray(new String[r.size()]); - - default: - throw new AAtlantisException("Invalid identifier: " + id); - } - case 4: - int part = larPart(id); - int sampling = part < 3 ? 0 : larSampling(id); - int eta = larEta(id); - int phi = larPhi(id); - - if(part == 1) // LAr barrel, LAr endcap - { - int barrelEndcap = larBarrelEndcap(id); - int region = larRegion(id); - s = "4/" + part + "/" + barrelEndcap + "/" + - sampling + "/" + region + "/" + eta + "/" + phi; - r.add(s); - if(barrelEndcap == 1) - { - //r.add("barrel A"); - r.add("EMBA"); - } - else if(barrelEndcap == -1) - { - //r.add("barrel C"); - r.add("EMBC"); - } - else if(barrelEndcap == 2 || barrelEndcap == 3) - { - //r.add("endcap A"); - r.add("EMECA"); - } - else if(barrelEndcap == -2 || barrelEndcap == -3) - { - //r.add("endcap C"); - r.add("EMECC"); - } - } - else if(part == 2) // HEC - { - int posNeg = larBarrelEndcap(id); - int region = larRegion(id); - s = "4/" + part + "/" + posNeg + "/" + sampling + "/" + - region + "/" + eta + "/" + phi; - r.add(s); - if(posNeg == 2) - { - //r.add("A"); - r.add("HECA"); - } - else if(posNeg == -2) - { - //r.add("C"); - r.add("HECC"); - } - } - else if(part == 3) // FCAL - { - int posNeg = larBarrelEndcap(id); - s = "4/" + part + "/" + posNeg + "/" + sampling + "/" + - eta + "/" + phi; - r.add(s); - if(posNeg == 2) - { - //r.add("A"); - r.add("FCALA"); - } - else if(posNeg == -2) - { - //r.add("C"); - r.add("FCALC"); - } - } - else - { - throw new AAtlantisException("Invalid identifier: " + id); - } - - r.add("sampling: " + sampling); // sampling remains - - return r.toArray(new String[r.size()]); - - case 5: - // tile calorimeter (first number of full id is 5) - int section = tileSection(id); - int side = tileSide(id); - int module = tileModule(id); - int tower = tileTower(id); - sampling = tileSampling(id); - int pmt = tilePmt(id); - int adc = tileAdc(id); - - s = "5/" + section + "/" + side + "/" + module + "/" + - tower + "/" + sampling + "/" + pmt + "/" + adc; - r.add(s); - - r.add("section: " + section); - r.add("side: " + side); - r.add("module: " + module); - r.add("tower: " + tower); - r.add("sampling: " + sampling); - r.add("PMT: " + pmt); - r.add("ADC: " + adc); - - return r.toArray(new String[r.size()]); - - case 7: - String technology = technology(id); - if (technology.equals("MDT")) - { - s = "7/" + stationName(id) + "/" + stationEta(id) + - "/" + stationPhi(id) + "/" + "MDT/" + - mdtMultiLayer(id) + "/" + mdtTubeLayer(id) + "/" + - mdtTube(id); - r.add(s); - return r.toArray(new String[r.size()]); - } - else if (technology.equals("RPC")) - { - s = "7/" + stationName(id) + "/" + stationEta(id) + "/" + - stationPhi(id) + "/" + "RPC/" + rpcDoubletR(id) + "/" + - rpcDoubletZ(id) + "/" + rpcDoubletPhi(id) + "/" + - rpcGasGap(id) + "/" + rpcMeasuresPhi(id) + "/" + - rpcStrip(id); - r.add(s); - return r.toArray(new String[r.size()]); - } - else if (technology == "TGC") - { - s = "7/" + stationName(id) + "/" + stationEta(id) + - "/" + stationPhi(id) + "/" + "TGC/" + tgcGasGap(id) + - "/" + tgcIsStrip(id) + "/" + tgcChannel(id); - r.add(s); - return r.toArray(new String[r.size()]); - } - else if (technology == "CSC") - { - s = "7/" + stationName(id) + "/" + stationEta(id) + "/" + - stationPhi(id) + "/" + "CSC/" + cscChamberLayer(id) + - "/" + cscWireLayer(id) + "/" + cscMeasuresPhi(id) + - "/" + cscStrip(id); - r.add(s); - return r.toArray(new String[r.size()]); - } - else - { - throw new AAtlantisException("Invalid identifier: " + id); - } - default: - throw new AAtlantisException("Not yet implemented for identifier: " + id); - } - } - catch (AAtlantisException e) - { - s = id + " (unable to decode: " + e.getMessage() + ")"; - r.add(s); - return r.toArray(new String[r.size()]); - } - - } // getFullIdentifier() ------------------------------------------------ - - - - /** @deprecated */ - public static int subDetector(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("subdet", id); - } - - /** @deprecated */ - public static int indetPart(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("part", id); - } - - /** @deprecated */ - public static int trtBarrelEndcap(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("barrel_endcap", id); - } - - - /** @deprecated */ - public static int trtLayerWheel(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("layer_or_wheel", id); - } - - /** @deprecated */ - public static int trtPhiModule(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("phi_sector", id); - } - - /** @deprecated */ - public static int trtStrawLayer(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("straw_layer", id); - } - - /** @deprecated */ - public static int trtStraw(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("straw", id); - } - - /** @deprecated */ - public static final int sctBarrelEndcap(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("barrel_endcap", id); - } - - /** @deprecated */ - public static int sctLayerDisk(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("layer", id); - } - - /** @deprecated */ - public static int sctPhiModule(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("phi_module", id); - } - - /** @deprecated */ - public static int sctEtaModule(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("eta_module", id); - } - - /** @deprecated */ - public static int sctPhiIndex(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("side", id); // This seems odd, phi_index <-> side? - } - - /** @deprecated */ - public static int sctEtaIndex(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("strip", id); - } - - /** @deprecated */ - public static int larPart(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("part", id); - } - - /** @deprecated */ - public static int larBarrelEndcap(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("barrel-endcap", id); - } - - /** @deprecated */ - public static int larPosNeg(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("pos_neg", id); - } - - /** @deprecated */ - public static int larSampling(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("sampling", id); - } - - /** @deprecated */ - public static int larRegion(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("region", id); - } - - /** @deprecated */ - public static int larEta(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - if (larPart(id) < 3) { - return idHelper.get("eta", id); - } else { - return idHelper.get("eta-fcal", id); - } - } - - /** @deprecated */ - public static int larPhi(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - if (larPart(id) < 3) { - return idHelper.get("phi", id); - } else { - return idHelper.get("phi-fcal", id); - } - } - - /** @deprecated */ - public static int larModule(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("module", id); - } - - - /** @deprecated */ - public static boolean larIsBarrel(long id) throws AAtlantisException - { - switch(Math.abs(larBarrelEndcap(id))) - { - case 1: - return true; // yes, it's barrel - case 2: - return false; // is endcap - case 3: - return false; // is endcap - default: - throw new AAtlantisException("Not a LAr identifier: " + id); - } - } - - /** @deprecated */ - public static int tileSection(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("section", id); - } - - /** @deprecated */ - public static int tileSide(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("side", id); - } - - /** @deprecated */ - public static int tileModule(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("module", id); - } - - /** @deprecated */ - public static int tileTower(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("tower", id); - } - - /** @deprecated */ - public static int tileSampling(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("sampling", id); - } - - /** @deprecated */ - public static int tilePmt(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("pmt", id); - } - - /** @deprecated */ - public static int tileAdc(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("adc", id); - } - - - /** - * Decodes Athena 32-bit ID to following form (5 is Tile): - * 5/section/side/module/tower/sampling/pmt/adc - official identifier - * - * Identifier used by TileCal collaboration, conversion is clear from the - * code and is explained in Sasha Solodkov's email on 2006-09-18 - * - * @param id int - * @return String - */ - public static String getDecodedTileIndentifier(long id) - { - try - { - int sec = tileSection(id); - int side = tileSide(id); - int mod = tileModule(id); - int tow = tileTower(id); - int samp = tileSampling(id); - - // section/side/module into decoded form - String secSideMod = "\n[could not work out section/side]"; - mod++; - if(sec == 1 && side == 1) secSideMod = "LBA" + mod; - if(sec == 1 && side == -1) secSideMod = "LBC" + mod; - if(sec == 2 && side == 1) secSideMod = "EBA" + mod; - if(sec == 3 && side == 1) secSideMod = "EBA" + mod; - if(sec == 2 && side == -1) secSideMod = "EBC" + mod; - if(sec == 3 && side == -1) secSideMod = "EBC" + mod; - - // sampling/tower into decoded form - String sampTow = "\n[could not work out sampling/tower]"; - if(samp == 0) sampTow = "A" + (int)(tow + 1); - if(samp == 1) sampTow = "B" + (int)(tow + 1); - if(samp == 2) sampTow = "D" + (int)(tow/2); - if(samp == 3) - { - if(tow == 10) sampTow = "E1"; - if(tow == 11) sampTow = "E2"; - if(tow == 13) sampTow = "E3"; - if(tow == 15) sampTow = "E4"; - } - - return secSideMod + " " + sampTow; - } - catch (AAtlantisException e) - { - return id + " (unable to decode: " + e.getMessage() + ")"; - } - } - - - /** @deprecated */ - public static String stationName(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.getString("stationName", id); - } - - /** @deprecated */ - public static String technology(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.getString("technology", id); - } - - /** @deprecated */ - public static int stationEta(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("stationEta", id); - } - - /** @deprecated */ - public static int stationPhi(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("stationPhi", id); - } - - /** @deprecated */ - public static int mdtMultiLayer(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("multiLayer", id); - } - - /** @deprecated */ - public static int mdtTubeLayer(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("tubeLayer", id); - } - - /** @deprecated */ - public static int mdtTube(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("tube", id); - } - - /** @deprecated */ - public static int rpcDoubletR(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("doubletR", id); - } - - /** @deprecated */ - public static int rpcDoubletZ(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("doubletZ", id); - } - - /** @deprecated */ - public static int rpcDoubletPhi(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("doubletPhi", id); - } - - /** @deprecated */ - public static int rpcGasGap(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("rpcGasGap", id); - } - - /** @deprecated */ - public static int rpcMeasuresPhi(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("rpcMeasuresPhi", id); - } - - /** @deprecated */ - public static int rpcStrip(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("rpcStrip", id); - } - - /** @deprecated */ - public static int tgcGasGap(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("tgcGasGap", id); - } - - /** @deprecated */ - public static int tgcIsStrip(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("isStrip", id); - } - - /** @deprecated */ - public static int tgcChannel(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("channel", id); - } - - /** @deprecated */ - public static int cscChamberLayer(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("chamberLayer", id); - } - - /** @deprecated */ - public static int cscWireLayer(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("wireLayer", id); - } - - /** @deprecated */ - public static int cscMeasuresPhi(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("cscMeasuresPhi", id); - } - - /** @deprecated */ - public static int cscStrip(long id) throws AAtlantisException { - if (idHelper == null) idHelper = ANewIdHelper.instance(); - return idHelper.get("cscStrip", id); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AIdRange.java b/graphics/AtlantisJava/src/atlantis/utils/AIdRange.java deleted file mode 100644 index b38d5523882f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AIdRange.java +++ /dev/null @@ -1,392 +0,0 @@ -package atlantis.utils; - -import java.util.Arrays; -import org.w3c.dom.Node; - - -/** - * Class representing a range of possible values for an identifier field. - * - * @author Eric Jansen - */ -class AIdRange { - - /** Group the field belongs to, ranges of the same group should be merged. */ - private String group = null; - - /** Parent field, needed only for printing of labelled fields. */ - AIdField parent = null; - - /** A discrete range with values specified in this array. */ - private int[] values = null; - - /** A continuous range from min to max (if values == null). */ - private int minValue, maxValue; - - /** - * Empty constructor, creates an empty range. - */ - AIdRange() { - this.values = new int[0]; - } - - /** - * Continuous range constructor, contains all values >= minValue <= maxValue. - * @param minValue first value in the range - * @param maxValue last value in the range - * @throws AAtlantisException - */ - AIdRange(int minValue, int maxValue) throws AAtlantisException { - - if (minValue > maxValue) { - throw new AAtlantisException("Invalid range: " + minValue + " -> " + maxValue); - } - - this.minValue = minValue; - this.maxValue = maxValue; - } - - /** - * Discrete range constructor, contains the values given in values[]. - * @param values ordered array of values - */ - AIdRange(int[] values) { - this.values = values; - } - - /** - * XML constructor, initialize the range from a <range> element. - * @param parent id field the values belong to - * @param group group this field belongs to - * @param node <range> XML element - * @throws AAtlantisException - */ - AIdRange(AIdField parent, String group, Node node) throws AAtlantisException { - - String fieldName = node.getAttributes().getNamedItem("field").getNodeValue(); - this.parent = parent; - this.group = group; - - Node minValueAttr = node.getAttributes().getNamedItem("minvalue"); - Node maxValueAttr = node.getAttributes().getNamedItem("maxvalue"); - - if (minValueAttr != null && maxValueAttr != null) { - - minValue = parent.valueToInt(fieldName, minValueAttr.getNodeValue()); - maxValue = parent.valueToInt(fieldName, maxValueAttr.getNodeValue()); - - if (minValue > maxValue) { - throw new AAtlantisException("Invalid range: " + minValue + " -> " + maxValue); - } - - } else { - Node valueAttr = node.getAttributes().getNamedItem("value"); - Node valuesAttr = node.getAttributes().getNamedItem("values"); - - if (valueAttr != null) { - values = new int[1]; - values[0] = parent.valueToInt(fieldName, valueAttr.getNodeValue()); - } else if (valuesAttr != null) { - String[] list = valuesAttr.getNodeValue().split(" "); - values = new int[list.length]; - for (int i=0; i<list.length; i++) { - values[i] = parent.valueToInt(fieldName, list[i]); - } - } else { - values = new int[0]; - } - } - } - - /** - * Get group name for this range. - * @return group name - */ - String group() { - return group; - } - - /** - * Check if the range contains value. - * @param value value to check - * @return true if value is part of this range - */ - boolean contains(int value) { - if (values == null) { - if (value >= minValue && value <= maxValue) { - return true; - } else { - return false; - } - } else { - for (int val : values) { - if (val == value) { - return true; - } - } - return false; - } - } - - /** - * Check if the range fully contains another range. - * @param range range to check - * @return true if all values in the argument are in this range - */ - boolean contains(AIdRange range) { - if (range.values == null) { - for (int value=range.minValue; value<=range.maxValue; value++) { - if (!this.contains(value)) return false; - } - } else { - for (int value : range.values) { - if (!this.contains(value)) return false; - } - } - - return true; - } - - /** - * Check if this range equals another. - * @param obj other range - * @return true if obj is an AIdRange object and its values match - */ - @Override - public boolean equals(Object obj) { - - if (!(obj instanceof AIdRange)) { - return false; - } - - AIdRange other = (AIdRange)obj; - - if (values == null && other.values == null) { - - // Continuous range, check boundaries - if (minValue == other.minValue && maxValue == other.maxValue) { - return true; - } else { - return false; - } - - } else if (values == null) { - - // Continuous and discrete range - if (other.values.length == maxValue - minValue + 1 - && other.values[other.values.length-1] == maxValue - && other.values[0] == minValue) { - return true; - } else { - return false; - } - - } else if (other.values == null) { - - // Discrete and continuous range - if (values.length == other.maxValue - other.minValue + 1 - && values[values.length-1] == other.maxValue - && values[0] == other.minValue) { - return true; - } else { - return false; - } - - } else { - - // Discrete range, check length and individual entries - if (values.length != other.values.length) { - return false; - } else { - for (int i=0; i<values.length; i++) { - if (values[i] != other.values[i]) { - return false; - } - } - - return true; - } - } - } - - /** - * Check if the range specifies any values or not. - * @return true if the range is empty, false if not - */ - public boolean isEmpty() { - return values != null && values.length == 0; - } - - /** - * Hash code to facilitate lookups. - * @return hash - */ - @Override - public int hashCode() { - int hash = 7; - hash = 89 * hash + Arrays.hashCode(this.values); - hash = 89 * hash + this.minValue; - hash = 89 * hash + this.maxValue; - return hash; - } - - /** - * Merge the given range with the current one. - * @param other range to be added to the current range - * @return current range after new range has been added - * @throws AAtlantisException - */ - AIdRange add(AIdRange other) throws AAtlantisException { - - if (values == null && other.values == null) { - - // Both are continuous ranges, find min and max values. - minValue = Math.min(minValue, other.minValue); - maxValue = Math.max(maxValue, other.maxValue); - - } else if (values == null || other.values == null) { - - // One is continous, the other is discrete. - if (values == null) { - - if (other.values.length > 0) { - // If the discrete range is not empty, find min and max values. - minValue = Math.min(minValue, other.values[0]); - maxValue = Math.max(maxValue, other.values[other.values.length-1]); - } - - // If we add an empty range, there is nothing to be done. - - } else { - - if (values.length > 0) { - // If the discrete range is not empty, find min and max values. - minValue = Math.min(values[0], other.minValue); - maxValue = Math.max(values[values.length-1], other.maxValue); - values = null; - } else { - // if this is an empty range, copy min and max from the other. - minValue = other.minValue; - maxValue = other.maxValue; - values = null; - } - } - - } else { - - // Both ranges are discrete, count how many unique elements. - int numValues = values.length; - for (int value : other.values) { - if (!this.contains(value)) { - numValues++; - } - } - - // Merge two arrays, skipping duplicates and keeping order. - int[] newValues = new int[numValues]; - for (int i=0, j=0, k=0; i<numValues; i++) { - if (j == values.length) { - - newValues[i] = other.values[k++]; - - } else if (k == other.values.length) { - - newValues[i] = values[j++]; - - } else { - - if (this.values[j] == other.values[k]) { - newValues[i] = values[j++]; - k++; - } else if (values[j] < other.values[k]) { - newValues[i] = values[j++]; - } else { - newValues[i] = other.values[k++]; - } - } - } - - values = newValues; - } - - return this; - } - - /** - * Check the allowed values and return the number of bits needed to encode them. - * @return number of bits - */ - int bits() { - - // Cound how many values this field can have. - int numValues; - if (values != null) { - numValues = values.length; - } else { - numValues = maxValue - minValue + 1; - } - - if (numValues <= 2) { - // A field takes at least 1 bit, so return 1. - return 1; - } else { - // The number of bits required to store numValues different values. - return (int)(Math.ceil(Math.log(numValues) / Math.log(2))); - } - } - - /** - * Get the field value corresponding to the given range index. For example - * for a field that has range [ -2, 0, +2 ], get(0) will return -2. - * @param index, decoded from compact identifier - * @return field value - * @throws AAtlantisException - */ - int get(int index) throws AAtlantisException { - if (values != null) { - if (index < values.length) { - return values[index]; - } else { - throw new AAtlantisException("Invalid field index: " + index); - } - } else { - if (minValue + index <= maxValue) { - return minValue + index; - } else { - throw new AAtlantisException("Invalid field value: " + index); - } - } - } - - /** - * Convert the range into a convenient form for printing. - * @return formatted string representing range - */ - @Override - public String toString() { - StringBuilder s = new StringBuilder(); - s.append("[ "); - - if (values == null) { - if (parent != null && parent.hasLabels()) { - String minLabel = parent.getLabel(minValue); - String maxLabel = parent.getLabel(maxValue); - s.append(minLabel).append("=").append(minValue); - s.append(" -> ").append(maxLabel).append("=").append(maxValue); - } else { - s.append(minValue).append(" -> ").append(maxValue).append(" "); - } - } else { - for (int value : values) { - if (parent != null && parent.hasLabels()) { - String label = parent.getLabel(value); - s.append(label).append("=").append(value).append(" "); - } else { - s.append(value).append(" "); - } - } - } - s.append("]"); - return s.toString(); - } -} \ No newline at end of file diff --git a/graphics/AtlantisJava/src/atlantis/utils/AIntHashtable.java b/graphics/AtlantisJava/src/atlantis/utils/AIntHashtable.java deleted file mode 100755 index 04b0adbcd5f1..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AIntHashtable.java +++ /dev/null @@ -1,79 +0,0 @@ -package atlantis.utils; - - -// does not copy input arrays for efficiency -// these arrays must not be modified ! - -public class AIntHashtable { - - int size; - int shift; - int[] key; - int[] value; - int[] next; - int[] first; - - /* - public AIntHashtable(int size) { - this.size=size; - shift=0; - count = 0; - key = new int[size]; - value = new int[size]; - next = new int[size]; - first = new int[size]; - for (int i = 0; i < size; ++i) - first[i] = -1; - } - */ - - public AIntHashtable(int[] key, int[] value) { - this.size=key.length; - this.key=key; - this.value=value; - // - int mask=0; - for(int i=0; i<size; ++i) { - mask=mask|key[i]; - if((mask&1)==1) break; - } - shift=0; - for(int i=0; i<size; ++i) { - if((mask>>i&1)==1) break; - shift++; - } - // - next=new int[size]; - first=new int[size]; - for(int i=0; i<size; ++i) - first[i]=-1; - for(int i=0; i<size; ++i) { - int index=(key[i]>>shift)%size; - if(index<0) index=-index; - this.next[i]=first[index]; - first[index]=i; - } - } - - public AIntHashtable(int[] key) { - this(key, makeIndexArray(key.length)); - } - - private static int[] makeIndexArray(int length) { - int[] temp=new int[length]; - for(int i=0; i<length; ++i) - temp[i]=i; - return temp; - } - - public int get(int key) { - if(size<=0) return -1; - int index=(key>>shift)%size; - if(index<0) index=-index; - for(int e=first[index]; e!=-1; e=next[e]) - if(this.key[e]==key) - return value[e]; - return -1; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/ALogger.java b/graphics/AtlantisJava/src/atlantis/utils/ALogger.java deleted file mode 100644 index 3079c1931739..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/ALogger.java +++ /dev/null @@ -1,213 +0,0 @@ -package atlantis.utils; - -import java.io.IOException; -import java.io.File; -import java.util.Properties; - -import org.apache.log4j.Logger; -import org.apache.log4j.Level; -import org.apache.log4j.PatternLayout; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.FileAppender; -import org.apache.log4j.ConsoleAppender; -import org.apache.log4j.Layout; - - - -/** - * The class is a common wrapper for logging facility, uses - * apache-logging library log4j (more complex and powerful than Java - * native java.util.logging (e.g. flushing is automated, allows customised - * message logs layout, different levels for different sources, etc). - * Because it is subclassing from Logger, it needs LoggerFactory mechanism - * to be in place. Reference to it is given via Properties, if more - * complex properties are to be defined, it will be put in a file (such - * properties file must be accessed generically so that it is load in - * correctly no matter whether Atlantis is run locally (and have distribution - * directories available) or from a .jar file (webstart execution). - * - * @author Zdenek Maxa - */ -public final class ALogger extends Logger -{ - // the class is a singleton, reference to itself - private static Logger root = null; - - // it's enough to instantiate a factory once and for all - private static ALoggerFactory loggerFactory = new ALoggerFactory(); - - // logging layouts definition (format characters explained at PatternLayout class) - private static final String CONSOLE_LOGGING_LAYOUT = - "%-5p %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n"; - // %c - cathegory (must be specified at .getLogger(Class.class)) - private static final String FILE_LOGGING_LAYOUT = - "%-5p %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n (%c thread:%t)%n"; - // contains some format characters which are slow - *only* for debugging - private static final String FILE_LOGGING_LAYOUT_FULL = - "%-5p %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n (%c.%M() [line %L], thread:%t)%n"; - - - - // logging levels as defined in org.apache.log4j.Level - // this variable is used via a getter method to print out command - // line options help - private static String stringLevels = - Level.TRACE.toString() + ", " + // int value: 10000 - Level.DEBUG.toString() + ", " + // int value: 10000 - Level.INFO.toString() + ", " + // int value: 20000 - Level.WARN.toString() + ", " + // int value: 30000 - Level.ERROR.toString() + ", " + // int value: 30000 - Level.FATAL.toString(); // int value: 50000 - - // default logging level (if it wasn't specified or was incorrect) - private static Level defaultLevel = Level.INFO; - - - /** - * The constructor must be protected so that it is visible - * from ALoggerFactory. Should not be instantiated directly, but via - * .getInstance() - * @param name - */ - protected ALogger(String name) - { - super(name); - - } // ALogger() ---------------------------------------------------------- - - - - /** - * initialize(String[] options) - * Initializes the logger - * @param level severity level as read from the command line option - * @param destination destination to write logs to, as read from the command line - */ - public static void initialize(String level, String destination) - { - - // set logging level, if level contains nonsense, set default - Level currentLevel = Level.toLevel(level, defaultLevel); - - - // set properties - LogggerFactory - // log4j.loggerFactory=atlantis.utils.ALoggerFactory - // this may also be done via properties file (if necessary for - // more complex logging configuration without necessity to - // recompile). properties file is contains pairs key=value - // caution: must be accessed generically (so that it also - // works when atlantis is packed in a .jar file) - // without setting LoggerFactory - ClassCastException when getting - // Logger via ALogger.getLogger("Atlantis"); - Properties up = new Properties(); - up.setProperty("log4j.loggerFactory", - "atlantis.utils.ALoggerFactory"); - PropertyConfigurator.configure(up); - - // if instantiated this way - // logger = new ALogger(); - // -> NullPointerException when adding appender - - // all loggers created afterwards will have properties of this root logger - root = Logger.getRootLogger(); - - root.setLevel(currentLevel); - - - // logging will always be done to console (System.out - stdout) - - Layout consoleLayout = new PatternLayout(CONSOLE_LOGGING_LAYOUT); - ConsoleAppender ca = new ConsoleAppender(consoleLayout, - ConsoleAppender.SYSTEM_OUT); - ca.setImmediateFlush(true); - root.addAppender(ca); - - root.info("Logging to console (System.out) initialised"); - - // if a file was specified as logging destination, then logs - // will be duplicated to that file as well - if(destination != null) - { - // check if the file already exists - File f = new File(destination); - boolean fileExists = false; - if(f.exists()) - { - fileExists = true; - } - try - { - // some file was specified on the command line - Layout fileLayout = new PatternLayout(FILE_LOGGING_LAYOUT); - // if the file exists, it will be appended to - FileAppender fa = new FileAppender(fileLayout, destination); - fa.setImmediateFlush(true); - root.addAppender(fa); - if(fileExists) - { - String msg = "================================== " + - "Log file " + destination + " exists, " + - "opening it for appending"; - root.warn(msg); - } - root.warn("Logging to " + destination + " initialised"); - } - catch(IOException ex) - { - root.warn("Can't write log messages to: "+ destination); - } - } - - } // initialize() ------------------------------------------------------- - - - - public static ALogger getLogger(String name) - { - if(root != null) - { - return (ALogger) Logger.getLogger(name, loggerFactory); - } - else - { - // logger hasn't been initialised yet, initialise with - // default values (i.e. logging only to console with INFO level) - try - { - initialize(defaultLevel.toString(),null); - } - catch(Exception ex) - { - // this exception should never occur - ex.printStackTrace(); - } - return (ALogger) Logger.getLogger(name, loggerFactory); - } - - } // getLogger() -------------------------------------------------------- - - - - public static ALogger getLogger(Class clazz) - { - return ALogger.getLogger(clazz.getName()); - - } // getLogger() -------------------------------------------------------- - - - - public void forcedLog(String fqcn, Object msg, Throwable t) - { - super.forcedLog(fqcn, Level.ALL, msg, t); - - } // forcedLog() -------------------------------------------------------- - - - - public static String getStringLevels() - { - return stringLevels; - - } // getStringLevels() -------------------------------------------------- - -} // class ALogger ========================================================== diff --git a/graphics/AtlantisJava/src/atlantis/utils/ALoggerFactory.java b/graphics/AtlantisJava/src/atlantis/utils/ALoggerFactory.java deleted file mode 100644 index f4b5a772b9fa..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/ALoggerFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package atlantis.utils; - -import org.apache.log4j.Logger; -import org.apache.log4j.spi.LoggerFactory; - -/** - * LoggerFactory as used by ALogger - necessary when subclassing Logger - * @author Zdenek Maxa - */ -public class ALoggerFactory implements LoggerFactory -{ - - /** - * The constructor should be public as it will be called by - * configurators in different packages. - */ - public ALoggerFactory() { } - - - public Logger makeNewLoggerInstance(String name) - { - return new ALogger(name); - } - -} // class ALoggerFactory =================================================== diff --git a/graphics/AtlantisJava/src/atlantis/utils/AMath.java b/graphics/AtlantisJava/src/atlantis/utils/AMath.java deleted file mode 100755 index f52b826ab653..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AMath.java +++ /dev/null @@ -1,328 +0,0 @@ -package atlantis.utils; - -import java.awt.geom.Point2D; - - -/** - * Contains generally useful constants and mathematical functions - * and functions for formatting - */ -public class AMath -{ - final public static double TWO_PI = 2. * Math.PI; - final public static double PI_BY_8 = Math.PI / 8.; - - // Constant giving the unicode value of a small Greek eta. - final static public String ETA = "\u03B7"; - // Constant giving the unicode value of a small Greek lambda. - final static public String LAMBDA = "\u03BB"; - // Unicode capital Lambda - final static public String LAMBDACAP = "\u039B"; - // Unicode lowercase gamma - final static public String GAMMA = "\u03B3"; - // Constant giving the unicode value of a small Greek rho. - final static public String RHO = "\u03C1"; - // Constant giving the unicode value of a small Greek phi. - // final static public String PHI = "\u03C6"; // small - final static public String PHI = "\u03A6"; // capital - // Constant giving the unicode value of degrees symbol. - final static public String DEGREES = "\u00B0"; - // Constant giving the unicode value of a capital Greek delta. - final static public String DELTA = "\u0394"; - // final static public String PRIME = "\u00b4"; - final static public String PRIME = "'"; - final static public String MICRO = "\u00b5"; - final static public String TIMES = "\u00d7"; - final static public String ASYMP = "\u2248"; - final static public String PROP = "\u221D"; - final static public String RADIC = "\u221A"; - - final static public String PLUSMINUS = "\u00b1"; - final static public String NOTEQUAL = "\u2260"; - final static public String LESSEQUAL = "\u2264"; - final static public String GREATEREQUAL = "\u2265"; - final static public String PION = "\u03C0"; - final static public String SIGMA = "\u03A3"; - final static public String TAU = "\u03C4"; - final static public String XI = "\u039E"; - final static public String OMEGA = "\u03A9"; - final static public String MU = "\u03BC"; - - final static public String RARROW = "\u279D"; // right arrow - final static public String DOT = "\u00b7"; // middle dot - - - /** - * Use the unicode overline diacritical mark to place an overline over the preceeding character - * - */ - final static public String OVERLINE = "\u0305"; - // superscript plus and minus - final static public String SUPPLUS = "\u207A"; - final static public String SUPMINUS = "\u207B"; - - - /** - * Returns eta with respect to z = 0. - * @param z double z coordinate - * @param rho double eta coordinate - * @return double eta - */ - public static double etaAbs(double z, double rho) { - double zrho = z / rho; - return Math.log(zrho + Math.sqrt(zrho * zrho + 1.)); - } - - public static double tanLambda(double eta) - { - double e = Math.exp(eta); - return 0.5 * (e-1./e); - } - - public static double lambda(double eta) - { - double e = Math.exp(eta); - return Math.atan(0.5 * (e-1./e)); - } - - public static double getPFromPttL(double pT, double tL) - { - return Math.abs(pT / Math.cos(Math.atan(tL))); - } - - public static double getPtFromPtL(double p, double tL) - { - return Math.abs(p * Math.cos(Math.atan(tL))); - } - - /** - * Force phi into range [0,360) degrees. - * @param phi angle in degrees - * @return equivalent angle in range [0,360) degrees - */ - public static double nearestPhiDegrees(double phi) - { - while(phi >= 360.) - { - phi -= 360; - } - while(phi < 0.) - { - phi += 360; - } - return phi; - } - - /** - * Force phi into range [0,2 pi) radians. - * @param phi angle in radians - * @return equivalent angle in range [0,2 pi) radians - */ - public static double nearestPhiRadians(double phi) - { - while(phi >= TWO_PI) - { - phi -= TWO_PI; - } - while(phi<0.) - { - phi += TWO_PI; - } - return phi; - } - - /** - * Force phi into range [phiMid-180,phiMid+360) degrees. - * @param phi angle in degrees - * @param phiMid mid-point of required phi range - * @return equivalent angle in range [phiMid-180,phiMid+360) degrees - */ - public static double nearestPhiDegrees(double phi, double phiMid) - { - while(phi-phiMid >= 180.) - { - phi -= 360; - } - while(phi-phiMid < -180.) - { - phi += 360; - } - return phi; - } - - /** - * Force phi into range [phiMid-pi,phiMid+pi) radians. - * @param phi angle in degrees - * @param phiMid phiMid mid-point of required phi range - * @return equivalent angle in range [phiMid-pi,phiMid+pi) radians - */ - public static double nearestPhiRadians(double phi, double phiMid) - { - while(phi - phiMid >= Math.PI) - { - phi -= TWO_PI; - } - while(phi - phiMid < -Math.PI) - { - phi += TWO_PI; - } - return phi; - } - - public static double[] splitLineIntoPieces(double[] input, int numPieces) - { - if(input.length != 2) - { - return input; - } - double[] output = new double[numPieces + 1]; - for(int p = 0; p < numPieces + 1; p++) - { - output[p] = input[0] + - (input[1] - input[0]) * (double) p / (double) numPieces; - } - return output; - } - -/** - * "Stretches" the values in the input array over a longer array. - * A number numPieces[i] of equally spaced values between input[i] and input[i+1] - * are put into the output array. So the numPieces array must have the same length - * as the input array, and the length of the output array is the sum of the - * elements of numPieces. For example: - * input = {0.0, 1.0, 5.0} numPieces = {2, 4, 1} - * output = {0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0} - * The output array must already exist and have the correct number of entries, - * otherwise this method will do nothin. - * Only used by ATGCData.getYXUser(). - * @param input array to stretch - * @param output stretched array - * @param numPieces number of output elements corresponding to each input element - */ - public static void splitArrayIntoPieces(double[] input, double[] output, int[] numPieces) - { - // Previously had "output = (double[]) input.clone();" but this is not - // passed back to the calling code so no point. - if(input.length != numPieces.length) return; - - int totalNumPieces = 0; - for (int num : numPieces) totalNumPieces += num; - if(totalNumPieces != output.length) return; - - int index = 0; - for(int i = 0; i < input.length; i++) { - int nextI = (i + 1) % input.length; // "loop back" to start of input - double start = input[i]; - double end = input[nextI]; - for(int p = 0; p < numPieces[i]; p++) - { - output[index++] = start + - (end - start) * (double) p / (double) numPieces[i]; - } - } - } - - /** - * Calculate angle between two 3-vectors represented by Point2D.Double - * objects. - * @param p1 - * @param p2 - * @return angle [radians] - */ - public static double getAngle(Point2D.Double p1, Point2D.Double p2) - { - double dx = p2.x - p1.x; - double dy = p2.y - p1.y; - return Math.atan2(dy, dx); - } - - public static Point2D.Double intersectionPoint( - Point2D.Double p1, Point2D.Double p2, Point2D.Double p3, Point2D.Double p4) - { - - double u = ((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x)) / - ((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)); - return new Point2D.Double(p1.x+u*(p2.x-p1.x), p1.y+u*(p2.y-p1.y)); - } - - public static Point2D.Double intersectionPoint( - Point2D.Double p1, AVector v1, Point2D.Double p3, AVector v3) - { - Point2D.Double p2 = new Point2D.Double(p1.x+v1.dx, p1.y+v1.dy); - Point2D.Double p4 = new Point2D.Double(p3.x+v3.dx, p3.y+v3.dy); - - return intersectionPoint(p1, p2, p3, p4); - } - - - public static double[] xBox(double x,double dx) - { - return new double[] {x-dx,x-dx,x+dx,x+dx}; - } - - public static double[] yBox(double y,double dy) - { - return new double[] {y-dy,y+dy,y+dy,y-dy}; - } - - /** - * Returns the sign of a double value. - * Unlike Math.signum() it never returns zero. - */ - public static double getSign(double value) { - return (value > 0) ? 1.0 : -1.0; - } - - /** - * Returns the sign of a int value. - * Unlike Math.signum() it never returns zero. - * - */ - public static int getSign(int value) { - return (value > 0) ? 1 : -1; - } - - public static float maxAbsInArray(float[] floatArray) - { - float maxAbs = Math.abs(floatArray[0]); - for(int i=1; i<floatArray.length; ++i) - { - maxAbs = Math.max(Math.abs(floatArray[i]), maxAbs); - } - return maxAbs; - } - - public static float minAbsInArray(float[] floatArray) - { - float minAbs = Math.abs(floatArray[0]); - for(int i=1; i<floatArray.length; ++i) - { - minAbs = Math.min(Math.abs(floatArray[i]), minAbs); - } - return minAbs; - } - - public static float minNonZeroAbsInArray(float[] floatArray) - { - float minAbs = Math.abs(floatArray[0]); - for(int i=1; i<floatArray.length; ++i) - { - if(minAbs == 0.0f && floatArray[i] != 0.0f) - minAbs = floatArray[i]; - else - minAbs = Math.min(Math.abs(floatArray[i]), minAbs); - } - return minAbs; - } - - public static float deltaR(float phi1, float eta1, float phi2, float eta2){ - - float deta=Math.abs(eta1-eta2); - float dphi=Math.abs(phi1-phi2); - if(dphi>Math.PI) - dphi=(float)(Math.PI*2.0f)-dphi; - float dr=(float)Math.sqrt(deta*deta+dphi*dphi); - return dr; - } - -} // class AMath ------------------------------------------------------------- diff --git a/graphics/AtlantisJava/src/atlantis/utils/ANewIdHelper.java b/graphics/AtlantisJava/src/atlantis/utils/ANewIdHelper.java deleted file mode 100644 index 5de597b66846..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/ANewIdHelper.java +++ /dev/null @@ -1,157 +0,0 @@ -package atlantis.utils; - -import java.util.HashMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -/** - * Helper tool for decoding compact readout channel identifiers. - * - * @author Eric Jansen - */ -public final class ANewIdHelper { - - /** Singleton instance. */ - private static ANewIdHelper instance = null; - - /** Link to ATLAS dictionary. */ - private AIdDictionary atlas = null; - - /** Collection of named (sub-)dictionaries. */ - private HashMap<String, AIdDictionary> dictionaries = null; - - /** Logging facility. */ - public static ALogger logger = ALogger.getLogger(ANewIdHelper.class); - - /** - * Static construct method, initializes ANewIdHelper from XML dictionaries. - * @param rootNode XML root node of type IdDict. - */ - public synchronized static void construct(Node rootNode) throws AAtlantisException { - if (instance == null) instance = new ANewIdHelper(); - try { - instance.initialize(rootNode); - } catch (AAtlantisException e) { - throw new AAtlantisException("Error initializing ANewIdHelper: " + e.getMessage()); - - } - } - - /** - * Obtain instance of ANewIdHelper. - * @return ANewIdHelper instance. - */ - public synchronized static ANewIdHelper instance() { - if (instance == null) { - throw new Error("Attempted to access ANewIdHelper instance before initialization."); - } - return instance; - } - - /** - * Private constructor. - */ - private ANewIdHelper() {}; - - /** - * Non-static, private initialization method. - * @param rootNode XML root node of type IdDict. - */ - private void initialize(Node rootNode) throws AAtlantisException { - NodeList nodes = rootNode.getChildNodes(); - for (int i=0; i<nodes.getLength(); i++) { - Node node = nodes.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - if ("IdDictionary".equals(node.getNodeName())) { - String name = node.getAttributes().getNamedItem("name").getNodeValue(); - try { - if (dictionaries != null && dictionaries.containsKey(name)) { - AIdDictionary dictionary = dictionaries.get(name); - dictionary.initialize(node); - } else { - if (dictionaries == null) { - dictionaries = new HashMap<String,AIdDictionary>(); - } - dictionaries.put(name, new AIdDictionary(node)); - } - } catch (AAtlantisException e) { - logger.error("Exception occurred while initializing IdHelper:" + e.getMessage()); - } - } - } - } - - if (dictionaries.containsKey("ATLAS")) { - atlas = dictionaries.get("ATLAS"); - } else { - throw new AAtlantisException("No 'ATLAS' dictionary found"); - } - } - - /** - * Check for presence of a named dictionary. - * @param dictName dictionary name. - * @return true if dictionary is present, false is not. - */ - boolean hasDictionary(String dictName) { - return dictionaries.containsKey(dictName); - } - - /** - * Return pointer to an existing named dictionary. - * @param dictName dictionary name - * @return dictionary object - */ - AIdDictionary getDictionary(String dictName) throws AAtlantisException { - if (dictionaries != null && dictionaries.containsKey(dictName)) { - return dictionaries.get(dictName); - } else { - throw new AAtlantisException("Dictionary " + dictName + " could not be found"); - } - } - - /** - * Add a named dictionary to the idHelper. - * @param dictName dictionary name - * @param dict dictionary - */ - void addDictionary(String dictName, AIdDictionary dict) { - if (dictionaries == null){ - dictionaries = new HashMap<String,AIdDictionary>(); - } - dictionaries.put(dictName, dict); - } - - /** - * Convert a compact identifier into a "/" delimited expanded identifier. - * @param id compact identifier - * @return expanded identifier, fields delimited by "/" - */ - public String getFullIdentifier(long id) throws AAtlantisException { - return atlas.getFullIdentifier(id); - } - - /** - * Extract named field from a compact identifier. - * @param field identifier field name - * @param id compact identifier - * @return value of named field - */ - public int get(String field, long id) throws AAtlantisException { - return atlas.get(field, id); - } - - /** - * Extract string value of a named field from a compact identifier. For - * example: - * get("stationName", id) = 49 - * getString("stationName", id) = "EIS" - * - * @param field identifier field name - * @param id compact identifier - * @return string value of named field - */ - public String getString(String field, long id) throws AAtlantisException { - return atlas.getString(field, id); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/APoint.java b/graphics/AtlantisJava/src/atlantis/utils/APoint.java deleted file mode 100755 index 38c9d1fd4adb..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/APoint.java +++ /dev/null @@ -1,72 +0,0 @@ -package atlantis.utils; - - -/** - * Used by APolygon and AClipPolygon in order to perform clipping. - */ -public class APoint { - - public double x, y; - - public APoint(APoint p) { - this.x=p.x; - this.y=p.y; - } - - public APoint(double x, double y) { - this.x=x; - this.y=y; - } - - public double dot_product(double[] normPoint) { - if(normPoint==null||normPoint.length!=3) - return 0.0; - else - return x*normPoint[0]+y*normPoint[1]; - } - - public APoint minus(APoint cgp) { - if(cgp==null) - return new APoint(this); - else - return new APoint(x-cgp.x, y-cgp.y); - } - - public APoint plus(APoint cgp) { - if(cgp==null) - return new APoint(this); - else - return new APoint(x+cgp.x, y+cgp.y); - } - - public void scalar_multiply(double d) { - x*=d; - y*=d; - } - - public boolean inside(double[] normalizedVector, double distance) { - if(normalizedVector==null||normalizedVector.length!=3) return false; - double k=dot_product(normalizedVector)+distance; - - return(k<=0); - } - - public double calculate_tls(APoint secondPoint, APoint clipNode, double[] normalized) { - APoint dv1, dv2; - - dv1=minus(clipNode); - dv2=secondPoint.minus(this); - return -(dv1.dot_product(normalized)/dv2.dot_product(normalized)); - } - - public APoint point_of_intersection(APoint second, double tls) { - if(second!=null) { - APoint v=second.minus(this); - - if(v!=null) v.scalar_multiply(tls); - return plus(v); - } else - return null; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/APolygon.java b/graphics/AtlantisJava/src/atlantis/utils/APolygon.java deleted file mode 100755 index 9a0c4e33bc3f..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/APolygon.java +++ /dev/null @@ -1,238 +0,0 @@ -package atlantis.utils; - - -import java.util.Vector; -import java.awt.geom.*; - - -/** - * Used in the process of clipping. - */ - -public class APolygon { - protected Vector nodes=new Vector(5, 10); - - public APolygon() {} - - public APolygon(double[] x, double[] y) { - for(int i=0; i<x.length; i++) - nodes.addElement(new APoint(x[i], y[i])); - - if(getSignedArea()<0) { - Vector newNodes=new Vector(5, 10); - - for(int i=nodes.size()-1; i>=0; i--) - newNodes.addElement(nodes.elementAt(i)); - nodes=newNodes; - } - } - - public void addPoint(double x, double y) { - nodes.addElement(new APoint(x, y)); - } - - public double getSignedArea() { - APoint p; - double[] x=new double[nodes.size()]; - double[] y=new double[nodes.size()]; - - for(int i=0; i<nodes.size(); i++) { - p=(APoint)nodes.elementAt(i); - x[i]=p.x; - y[i]=p.y; - } - - return getSignedArea(x, y); - } - - // this function returns the ABSOLUT VALUE of the area - public double getArea() { - return Math.abs(getSignedArea()); - } - - public static double getSignedArea(double[] x, double[] y) { - if(x.length!=y.length) - throw new Error("x.length != y.length"); - if(x.length==0) return 0; - - double s=0; - - for(int i=0; i<x.length-1; i++) - s+=x[i]*y[i+1]-x[i+1]*y[i]; - - s+=x[x.length-1]*y[0]-x[0]*y[x.length-1]; - return s/2; - } - - public static double getArea(double[] x, double[] y) { - return Math.abs(getSignedArea(x, y)); - } - - public static Point2D.Double getCenter(double[] x, double[] y, Point2D.Double p) { - if(x.length==0 || y.length==0) return null; - if(p==null) p=new Point2D.Double(0, 0); - - double s=0, v; - - for(int i=0; i<x.length-1; i++) { - v=x[i]*y[i+1]-x[i+1]*y[i]; - s+=v; - p.x+=(x[i]+x[i+1])*v; - p.y+=(y[i]+y[i+1])*v; - } - - v=x[x.length-1]*y[0]-x[0]*y[x.length-1]; - s+=v; - p.x+=(x[x.length-1]+x[0])*v; - p.y+=(y[x.length-1]+y[0])*v; - - double f=1/(6*s/2); - - p.setLocation(p.x*f, p.y*f); - return p; - } - - public static void scale(double[] x, double[] y, double factor) { - Point2D.Double center=APolygon.getCenter(x, y, null); - - for(int i=0; i<x.length; i++) { - x[i]=(x[i]-center.x)*factor+center.x; - y[i]=(y[i]-center.y)*factor+center.y; - } - } - - /* - public boolean isClockwise() { - if (getArea() < 0) - return true; - else - return false; - } - */ - - public APoint getNode(int index) { - if(index>=0&&index<nodes.size()) - return(APoint)(nodes.elementAt(index)); - else - return null; - } - - public int nrNodes() { - return nodes.size(); - } - - public boolean clip(AClipPolygon clipPolygon) { - int i=0; - int limit=clipPolygon.nrNodes(); - - APoint node=null; - double[] normalized=new double[3]; - double distance=0.0; - - for(i=0; i<limit; i++) { - normalized=clipPolygon.get_normalized(i); - node=clipPolygon.getNode(i); - distance=clipPolygon.get_distance(i); - if(normalized!=null&&node!=null&& !Double.isNaN(distance)) - s_h_clip_poly(normalized, node, distance); - } - - return(nodes.size()>0); - } - - public void s_h_clip_poly(double[] normalized, APoint node, double distance) { - int degree=nodes.size(); - APoint s=null, p=null, q=null; - boolean s_inside, p_inside; - double tls=0.0; - Vector keptNodes=new Vector(); - - if(degree>0&&nodes.elementAt(degree-1) instanceof APoint) - s=(APoint)nodes.elementAt(degree-1); - - for(int i=0; i<nodes.size(); i++) { - if(nodes.elementAt(i) instanceof APoint) { - p=(APoint)nodes.elementAt(i); - s_inside=s.inside(normalized, distance); - p_inside=p.inside(normalized, distance); - if(s_inside) - if(!p_inside) { - tls=s.calculate_tls(p, node, normalized); - q=s.point_of_intersection(p, tls); - keptNodes.addElement(q); - } else - keptNodes.addElement(p); - else if(p_inside) { - tls=s.calculate_tls(p, node, normalized); - q=s.point_of_intersection(p, tls); - keptNodes.addElement(q); - keptNodes.addElement(p); - } - } - s=p; - } - nodes=keptNodes; - } - - public double[][] getPolygon() { - int nrPoints=nodes.size(); - double[][] coord=new double[nrPoints][nrPoints]; - - if(nrPoints>0) - for(int i=0; i<nrPoints; i++) { - APoint aPoint=getNode(i); - - if(aPoint!=null) { - coord[0][i]=aPoint.x; - coord[1][i]=aPoint.y; - } - } - return coord; - } - - public double[] getX() { - int nrPoints=nodes.size(); - double[] coord=new double[nrPoints]; - - if(nrPoints>0) - for(int i=0; i<nrPoints; i++) { - APoint aPoint=getNode(i); - - if(aPoint!=null) - coord[i]=aPoint.x; - } - return coord; - } - - public double[] getY() { - int nrPoints=nodes.size(); - double[] coord=new double[nrPoints]; - - if(nrPoints>0) - for(int i=0; i<nrPoints; i++) { - APoint aPoint=getNode(i); - - if(aPoint!=null) - coord[i]=aPoint.y; - } - return coord; - } - - public String toString() { - StringBuilder s = new StringBuilder(); - int limit=nodes.size(); - - s.append("x:{ "); - for(int i=0; i<limit; i++) { - s.append(((APoint)nodes.elementAt(i)).x); - s.append(" :: "); - } - s.append(" }\ny:{ "); - for(int i=0; i<limit; i++) { - s.append(((APoint)nodes.elementAt(i)).y); - s.append(" :: "); - } - return s.toString(); - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/AUtilities.java b/graphics/AtlantisJava/src/atlantis/utils/AUtilities.java deleted file mode 100755 index 0c01e84f0994..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AUtilities.java +++ /dev/null @@ -1,243 +0,0 @@ -package atlantis.utils; - -import java.io.FileNotFoundException; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.File; -import java.util.Date; -import java.text.SimpleDateFormat; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.image.BufferedImage; -import javax.swing.SwingUtilities; -import javax.swing.ImageIcon; - - -/** - * - * @author Gary Taylor, Zdenek Maxa - */ -public class AUtilities -{ - public static ALogger logger = ALogger.getLogger(AUtilities.class); - - private static final String dateFormat = "yyyy-MM-dd-HH-mm-ss"; - - - private AUtilities() - { - } // AUtilities() ------------------------------------------------------- - - - /** - * Allow Ctrl+click as alternative to right-click so can use single-button - * mouse on the Mac computer - */ - public static boolean isRightMouseButton(MouseEvent e) - { - return SwingUtilities.isRightMouseButton(e) || - e.isControlDown(); - - } // isRightMouseButton() ----------------------------------------------- - - /** - * Returns string with current data and time formatted according to - * dateFomat attribute (currently: yyyy-MM-dd-HH-mm-ss) - * @return String - */ - public static String getDateTimeString() - { - String r = null; - Date d = new Date(System.currentTimeMillis()); - SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); - r = sdf.format(d); - return r; - - } // getDateTimeString() ------------------------------------------------ - - - /** - * Returns last directory and file name from fullPath which is assumed to be - * some path to a file. This method assumes it is used when a file is retrieved - * from a .jar file. - * @param fullPath - */ - private static String getLastDirectoryAndFileName(String fullPath) - { - // if running on Windows, Atlantis.fileSep is '\', but accessing a .jar - // file uses '/' as file separator - so replace all '\' occurrences - // '/' (troubles when running via webstart (from jar file (/ as file - // separator) on windows (uses \ as file separator)) - logger.debug("Trying to extract last directory and filename, input: " + fullPath); - char[] charArray = fullPath.replaceAll("\\\\", "/").toCharArray(); - int sepOccurence = 0; // file separator (e.g. '/') occurrence counter - int i; - for(i = fullPath.length() - 1; i > 0; i--) - { - // compare only to '/', even on Windows '\' was already replaced - // by '/' - if(charArray[i] == '/') - { - sepOccurence++; - } - if(sepOccurence == 2) - { - // i variable now holds second file separator occurrence from end - break; - } - } - - String relPath = null; - - if(sepOccurence == 0) - { - logger.warn("No file separator found in the file path: " + fullPath); - relPath = fullPath; - } - else if(i == 0) - { - logger.warn("The path looks like relative path already, using: " + - fullPath); - relPath = fullPath; - } - else - { - relPath = new String(charArray).substring(i + 1); - logger.debug("Last directory and filename result: " + relPath); - } - - return relPath; - - } // getLastDirectoryAndFileName() -------------------------------------- - - - - /** - * Reads either locally (full path in fileName) or from atlantis.jar. Using - * this method for reading files makes Atlantis running either with runtime - * distribution directories (e.g. img, geometry, etc) or from .jar file - * (everything including runtime directories packed in a jar file) - * transparent. Having everything in .jar files is a requirement for - * running as Java WebStart. - * This method is used for files (text, xml) as InputStream. - * @param fileName - full path - */ - public static InputStream getFileAsStream(String fileName) throws AAtlantisException - { - InputStream is = null; - - if(fileName == null || "".equals(fileName)) - { - String m = "Input parameter fileName is null or empty"; - logger.debug(m); - throw new AAtlantisException(m); - } - - try - { - logger.debug("Trying to access file: " + fileName + " ..."); - is = new FileInputStream(fileName); - logger.debug("Reading " + fileName + " successful."); - } - catch(FileNotFoundException fnfe) - { - logger.warn(fileName + " not found, trying atlantis.jar ... "); - - // need to get file name and the last directory from the full path - String relPath = getLastDirectoryAndFileName(fileName); - - ClassLoader cl = AUtilities.class.getClassLoader(); - is = cl.getResourceAsStream(relPath); - if(is == null) - { - String m = fileName + " doesn't exist, reading " + relPath + - " from atlantis.jar failed."; - logger.error(m); - throw new AAtlantisException(m); - } - logger.debug(fileName + " reading from atlantis.jar successful."); - } - - return is; - - } // getFileAsStream() -------------------------------------------------- - - - - /** - * Reads either locally (full path in fileName) or from atlantis.jar. Using - * this method for reading files makes Atlantis running either with runtime - * distribution directories (e.g. img, geometry, etc) or from .jar file - * (everything including runtime directories packed in a jar file) - * transparent. Having everything in .jar files is a requirement for - * running as Java WebStart. - * This method is used for reading images. - * @param fileName - full path - */ - public static ImageIcon getFileAsImageIcon(String fileName) - { - - ImageIcon ii = null; - - if(fileName == null || "".equals(fileName)) - { - String m = "Input parameter fileName is null or empty, can't get ImageIcon"; - logger.debug(m); - return null; - } - - File test = new File(fileName); - if(test.exists() && test.canRead()) - { - ii = new ImageIcon(fileName); - logger.debug("Reading " + fileName + " successful."); - } - else - { - logger.debug(fileName + " not found, trying atlantis.jar ... "); - - // need to get file name and the last directory from the full path - String relPath = getLastDirectoryAndFileName(fileName); - - ClassLoader cl = AUtilities.class.getClassLoader(); - try { - ii = new ImageIcon(cl.getResource(relPath)); - logger.debug(fileName + " reading from atlantis.jar successful."); - } - catch (Throwable e) { - String m = "Failed to read "+ fileName + " from " + relPath + - " in atlantis.jar"; - logger.debug(m); - } - } - - return ii; - - } // getFileAsImageIcon() ----------------------------------------------- - - // Function used to rescale an Image and return an ImageIcon - // - public static ImageIcon scale(Image src, double scale, boolean antiAlias) { - int w = (int)(scale*src.getWidth(null)); - int h = (int)(scale*src.getHeight(null)); - int type = BufferedImage.TYPE_INT_ARGB; - BufferedImage dst = new BufferedImage(w, h, type); - Graphics2D g2 = dst.createGraphics(); - if(antiAlias) // Render png High Quality when AntiAliasing selected - { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - } - else // else render it for speed. - { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); - } - g2.drawImage(src, 0, 0, w, h, null); - g2.dispose(); - return new ImageIcon(dst); - } // ------- scale() - -} // class AUtilities ======================================================= diff --git a/graphics/AtlantisJava/src/atlantis/utils/AVector.java b/graphics/AtlantisJava/src/atlantis/utils/AVector.java deleted file mode 100755 index 2d3f7b8c9769..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/AVector.java +++ /dev/null @@ -1,84 +0,0 @@ -package atlantis.utils; - - -import java.awt.geom.Point2D; - - -/** - * Provides basic 2D vector operations. - */ - -public class AVector { - - public double dx, dy; - - public AVector(double dx, double dy) { - set(dx, dy); - } - - public AVector(double x1, double y1, double x2, double y2) { - set(x2-x1, y2-y1); - } - - public AVector(Point2D p1, Point2D p2) { - this(p1.getX(), p1.getY(), p2.getX(), p2.getY()); - } - - public AVector set(double dx, double dy) { - this.dx=dx; - this.dy=dy; - return this; - } - - public AVector getUnitary() { - double r=Math.sqrt(dx*dx+dy*dy); - - return new AVector(dx/r, dy/r); - } - - public AVector makeUnitary() { - double r=Math.sqrt(dx*dx+dy*dy); - - dx/=r; - dy/=r; - return this; - } - - public AVector rotate(double alpha) { - double sin=Math.sin(alpha); - double cos=Math.cos(alpha); - double dx_prime=dx*cos-dy*sin; - double dy_prime=dx*sin+dy*cos; - - dx=dx_prime; - dy=dy_prime; - return this; - } - - public AVector scale(double factor) { - dx*=factor; - dy*=factor; - return this; - } - - public AVector invert() { - dx*=-1; - dy*=-1; - return this; - } - - public double modulus() { - return Math.sqrt(dx*dx+dy*dy); - } - - public AVector add(AVector v) { - dx+=v.dx; - dy+=v.dy; - return this; - } - - public String toString() { - return "AVector[dx="+dx+", dy="+dy+"]"; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/package.html b/graphics/AtlantisJava/src/atlantis/utils/package.html deleted file mode 100644 index ba4e3fa430d3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/package.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<p>Helper classes.</p> -</body> -</html> diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AArrayParser.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AArrayParser.java deleted file mode 100755 index 027bd7e0f74d..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AArrayParser.java +++ /dev/null @@ -1,36 +0,0 @@ -package atlantis.utils.xml; - -/** - * The superclass of Integer and Float array parsers used e.g. in parseing - * arrays stored in xml files - */ - -public abstract class AArrayParser -{ - protected int count; - protected int state; - protected int sign; - protected boolean finished; - - protected static final char space = ' '; - protected static final char cariage = '\n'; - protected static final char zero = '0'; - protected static final char nine = '9'; - protected static final char minus = '-'; - protected static final char plus = '+'; - protected static final char dot = '.'; - protected static final char smallExp = 'e'; - protected static final char bigExp = 'E'; - - public abstract void parse(char[] ch, int start, int end); - - public abstract Object getArray(); - - /** - * @return Returns the count. - */ - public int getCount() - { - return count; - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AFloatArrayParser.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AFloatArrayParser.java deleted file mode 100755 index 413eb6ccc877..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AFloatArrayParser.java +++ /dev/null @@ -1,255 +0,0 @@ -package atlantis.utils.xml; - -/** - * The parser used to generate arrays of float values. - */ - -public class AFloatArrayParser extends AArrayParser -{ - private final static int SKIPPING_BLANKS = 0; - private final static int CHECKING_MINUS = 1; - private final static int CHECKING_INF1 = 2; - private final static int CHECKING_INF2 = 3; - private final static int CHECKING_INF3 = 4; - private final static int READING_INT = 5; - private final static int CHECKING_DOT = 6; - private final static int READING_FLOAT = 7; - private final static int CHECKING_EXP = 8; - private final static int CHECKING_EXP_SIGN = 9; - private final static int READING_EXP = 10; - private final static int FINISHING = 11; - private final static int IGNORE = 12; - - private static double[] powers = new double[200 * 2]; - private float[] array; - private float number = 0; - private int floatDigits = 0; - private int exp = 0; - private int expSign = 1; - private boolean isInf = false; - - static - { - for(int i = 0; i < 2 * 200; i++) - powers[i] = Math.pow(10, i - 200); - } - - public AFloatArrayParser(int size) - { - array = new float[size]; - count = 0; - if(size == 0) - state = IGNORE; - else - state = SKIPPING_BLANKS; - sign = 1; - } - - public void parse(char[] ch, int start, int length) - { - if(state == IGNORE) - { - finished = true; - return; - } - - int end = start + length; - nextChar: for(int i = start; i < end; i++) - { - char c = ch[i]; - thisChar: while(true) - { - - switch(state) - { - - case SKIPPING_BLANKS: - if(c == space || c == cariage) - continue nextChar; - else - { - finished = false; - state++; - continue thisChar; - } - - case CHECKING_MINUS: - if(c == minus) - { - sign = -1; - state++; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case CHECKING_INF1: - if(c == 'i' || c == 'I') - { - state++; - continue nextChar; - } - else - { - state = READING_INT; - continue thisChar; - } - - case CHECKING_INF2: - if(c == 'n' || c == 'N') - { - state++; - continue nextChar; - } - else - { - state = FINISHING; - continue thisChar; - } - - case CHECKING_INF3: - if(c == 'f' || c == 'F') - { - state = FINISHING; - isInf = true; - continue nextChar; - } - else - { - state = FINISHING; - continue thisChar; - } - - case READING_INT: - if(c >= zero && c <= nine) - { - number = number * 10 + c - zero; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case CHECKING_DOT: - if(c == dot) - { - state++; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case READING_FLOAT: - if(c >= zero && c <= nine) - { - number = number * 10 + c - zero; - floatDigits++; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case CHECKING_EXP: - if(c == smallExp || c == bigExp) - { - state++; - continue nextChar; - } - else - { - state = FINISHING; - continue thisChar; - } - - case CHECKING_EXP_SIGN: - if(c == minus) - { - expSign = -1; - state++; - continue nextChar; - } - if(c == plus) - { - expSign = +1; - state++; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case READING_EXP: - if(c >= zero && c <= nine) - { - exp = exp * 10 + c - zero; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case FINISHING: - if(c == space || c == cariage) - { - try - { - if(isInf) - { - if(sign == 1) - array[count] = Float.POSITIVE_INFINITY; - else - array[count] = Float.NEGATIVE_INFINITY; - isInf = false; - } - else - array[count] = (float) (number * sign * powers[expSign * exp - floatDigits + 200]); - } - catch(IndexOutOfBoundsException e) - { - // the real number of data is more than the - // expected number of data - throw new IndexOutOfBoundsException("more"); - } - state = SKIPPING_BLANKS; - sign = 1; - exp = 0; - expSign = 1; - floatDigits = 0; - number = 0; - count++; - finished = true; - continue nextChar; - } - else - { - throw new NumberFormatException("" + c); - } - } - } // while true - } // for - } - - public Object getArray() - { - if(!finished) - array[count] = (float) (number * sign * powers[expSign * exp - - floatDigits + 200]); - return array; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AIntArrayParser.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AIntArrayParser.java deleted file mode 100755 index 74ed17a767f3..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AIntArrayParser.java +++ /dev/null @@ -1,126 +0,0 @@ -package atlantis.utils.xml; - -/** - * The parser used to generate arrays of integer values. - */ - -public class AIntArrayParser extends AArrayParser -{ - private final static int SKIPPING_BLANKS = 0; - private final static int CHECKING_MINUS = 1; - private final static int READING_INT = 2; - private final static int FINISHING = 3; - private final static int IGNORE = 4; - - private int[] array; - private long number = 0; - - public AIntArrayParser(int size) - { - array = new int[size]; - count = 0; - if(size == 0) - state = IGNORE; - else - state = SKIPPING_BLANKS; - sign = 1; - } - - public void parse(char[] ch, int start, int length) - { - if(state == IGNORE) - { - finished = true; - return; - } - - int end = start + length; - nextChar: for(int i = start; i < end; i++) - { - char c = ch[i]; - thisChar: while(true) - { - switch(state) - { - case READING_INT: - if(c >= zero && c <= nine) - { - number = number * 10 + c - zero; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - case SKIPPING_BLANKS: - if(c == space || c == cariage) - continue nextChar; - else - { - finished = false; - state++; - continue thisChar; - } - case CHECKING_MINUS: - if(c == minus) - { - sign = -1; - state++; - continue nextChar; - } - else - { - state++; - continue thisChar; - } - case FINISHING: - if(c == space || c == cariage) - { - try - { - // This is a hack to make 64-bit identifiers work without - // using long internally. It works because for most - // identifiers only the most significant 32 bits are - // actually used. Proper support for 64-bit integer - // identifiers needs to be implemented asap (#618). - // -- EJ 09/2012 - if (number > Integer.MAX_VALUE && number >> 32 != 0) { - number = number >> 32; - } - array[count] = (int)number * sign; - } - catch(IndexOutOfBoundsException e) - { - // the real number of data is more than the - // expected number of data - throw new IndexOutOfBoundsException("more"); - } - number = 0; - count++; - sign = 1; - state = SKIPPING_BLANKS; - finished = true; - continue nextChar; - } - else - { - throw new NumberFormatException("" + c); - } - } - } // while true - } // for - } - - public Object getArray() - { - if(!finished) { - if (number > Integer.MAX_VALUE) { - number = number >> 32; - } - array[count] = (int)number * sign; - } - return array; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AStringArrayParser.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AStringArrayParser.java deleted file mode 100755 index 1029bbb4a6c6..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AStringArrayParser.java +++ /dev/null @@ -1,103 +0,0 @@ -package atlantis.utils.xml; - -/** - * The parser used to generate arrays of integer values. - */ - -public class AStringArrayParser extends AArrayParser -{ - private final static int SKIPPING_BLANKS = 0; - private final static int READING_STRING = 1; - private final static int FINISHING = 2; - private final static int IGNORE = 3; - - StringBuffer buffer; - private String[] array; - - public AStringArrayParser(int size) - { - array = new String[size]; - buffer = new StringBuffer(20); - count = 0; - if(size == 0) - state = IGNORE; - else - state = SKIPPING_BLANKS; - } - - public void parse(char[] ch, int start, int length) - { - if(state == IGNORE) - { - finished = true; - return; - } - - int end = start + length; - nextChar: for(int i = start; i < end; i++) - { - char c = ch[i]; - thisChar: while(true) - { - - switch(state) - { - - case READING_STRING: - if(!(c == space || c == cariage)) - { - buffer.append(c); - continue nextChar; - } - else - { - state++; - continue thisChar; - } - - case SKIPPING_BLANKS: - if(c == space || c == cariage) - continue nextChar; - else - { - finished = false; - state++; - continue thisChar; - } - - case FINISHING: - if(c == space || c == cariage) - { - try - { - array[count++] = new String(buffer); - } - catch(IndexOutOfBoundsException e) - { - // the real number of data is more than the - // expected number of data - throw new IndexOutOfBoundsException("more"); - } - - buffer.setLength(0); - state = SKIPPING_BLANKS; - finished = true; - continue nextChar; - } - else - { - throw new NumberFormatException("" + c); - } - } - } // while true - } // for - } - - public Object getArray() - { - if(!finished && array.length > 0) - array[count] = new String(buffer); - return array; - } - -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLEntityResolver.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLEntityResolver.java deleted file mode 100644 index 0b7a7274a483..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLEntityResolver.java +++ /dev/null @@ -1,40 +0,0 @@ -package atlantis.utils.xml; - -import atlantis.utils.AAtlantisException; -import atlantis.utils.ALogger; -import atlantis.utils.AUtilities; -import java.io.IOException; -import java.io.InputStream; -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -/** - * Entity resolver, used for relaying XML file includes to AUtilities. - * AUtilities.getFileAsStream() handles including files that are located in - * the webstart jar file. - * - * @author Eric Jansen - */ -public class AXMLEntityResolver implements EntityResolver { - - public static ALogger logger = ALogger.getLogger(AXMLEntityResolver.class); - - @Override - public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { - - InputStream input = null; - try { - if (systemId.startsWith("file://")) { - systemId = systemId.substring(7); - } - input = AUtilities.getFileAsStream(systemId); - } catch (AAtlantisException e) { - - logger.error("Could not resolve external entity" - +" '"+systemId+"': " + e.getMessage()); - } - - return new InputSource(input); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLErrorHandler.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLErrorHandler.java deleted file mode 100755 index fddab8ec5dbd..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLErrorHandler.java +++ /dev/null @@ -1,127 +0,0 @@ -package atlantis.utils.xml; - -import org.xml.sax.ErrorHandler; -import org.xml.sax.SAXParseException; - -import atlantis.utils.ALogger; - -/** - * Used in the XML processing code to catch and store the possible exceptions and errors. - */ -public class AXMLErrorHandler implements ErrorHandler { - - //the logger - private final ALogger logger = ALogger.getLogger(AXMLErrorHandler.class); - /** - * Thee different error states encountered in XML parsing - */ - public enum ErrorState { - - NO_ERROR, // no error - IGNORED_DATA, // the given data will be ignored - UNKNOWN_TAG, // unknown tag - INVALID_DATA, // the given data is not valid (e.g. string instead of int) - OTHER_ERROR, // some other error - FATAL_ERROR // some fatal error - event has to be aborted - } - - //Store the current error state - private ErrorState errorState = ErrorState.NO_ERROR; - //Store the exception causing the error - private Throwable cause = null; - - /** - * @return the current error state of the parser - */ - public ErrorState getErrorState() { - return errorState; - } - - /** - * @return the cause of the last error - */ - public Throwable getErrorCause(){ - return cause; - } - - /** - * Set the error state of the parser - * @param errorState The errorState to set. - * @param cause the cause of the error - */ - public void setError(ErrorState errorState, Throwable cause) { - - //check that the user had actually given a cause for all errors - if (cause == null && (errorState != ErrorState.NO_ERROR )) - throw new IllegalArgumentException("Cause can not be NULL"); - - this.errorState = errorState; - - //force cause null for NO_ERROR - if (errorState == ErrorState.NO_ERROR) - this.cause = null; - else - this.cause = cause; - } - - /** - * Handles all errors occurding during parsing - * @param exception the SAXParseException causing the error - */ - public void error(SAXParseException exception) { - - //Only keep the first error, ignore subsequents - if ( getErrorState() != ErrorState.NO_ERROR ) return; - - //Decode error from exception message (is there no better way?! - String errorMessage = exception.getMessage(); - - //Check for undeclared elements - if ( errorMessage.startsWith("Element type") && - errorMessage.indexOf("must be declared") >= 0) { - // an undeclared element is found in event file - // errorMessage - Element type "elementName" must be declared. - setError(ErrorState.UNKNOWN_TAG,exception); - return; - - } else if (errorMessage.startsWith("The content of element type") && - errorMessage.indexOf("must match") >= 0) { - /* errorMessage - The content of element type "elementName" must - match ... - - this error will occur if any undeclared element is found. - */ - setError(ErrorState.INVALID_DATA,exception); - return; - } else { - // an untreated error (e.g. undeclared attributes, etc.) - // supposed to be corrected by modifying event.dtd or retrievers - logger.error("Parsing XML in line " + exception.getLineNumber() + ": " + errorMessage); - setError(ErrorState.OTHER_ERROR,exception); - return; - } - - } - - /** - * Handle warning exceptions - * @param exception the SAX exception - */ - public void warning(SAXParseException exception) { - //Write a warning output, otherwise ignore - logger.warn("Parsing XML at position " + exception.getLineNumber() + ", " + exception.getColumnNumber() + " :: " + exception.getMessage()); - } - - /** - * Handle fatal exceptions - * @param exception the SAX exception - */ - public void fatalError(SAXParseException exception) { - //Only fatal exceptions are handled by global exception handler - String m = "Fatal error while parsing XML, line: " + - exception.getLineNumber() + " column: " + - exception.getColumnNumber() + " reason: " + - exception.getMessage(); - logger.fatal(m); - System.exit(1); - } -} diff --git a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLUtils.java b/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLUtils.java deleted file mode 100755 index c745a4766903..000000000000 --- a/graphics/AtlantisJava/src/atlantis/utils/xml/AXMLUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package atlantis.utils.xml; - - -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - - -/** - * Provides some basic XML utilities which are not present in the XML library. - */ -public class AXMLUtils -{ - public static Node getChild(Node node, String name) - { - NodeList childs = node.getChildNodes(); - - for (int i = 0; i < childs.getLength(); i++) - { - Node child = childs.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) - { - if (child.getNodeName().equals(name)) - return child; - } - } - return null; - } - - public static String tryAttribut(NamedNodeMap attributes, String attName) - { - Node node = attributes.getNamedItem(attName); - - return (node != null) ? node.getNodeValue() : null; - } - -} diff --git a/graphics/AtlantisJava/src/overview.html b/graphics/AtlantisJava/src/overview.html deleted file mode 100644 index ebe0e3f52e9b..000000000000 --- a/graphics/AtlantisJava/src/overview.html +++ /dev/null @@ -1,25 +0,0 @@ -<html> -<head></head> -<body> - -<p>Atlantis is an event display for the ATLAS experiment at -CERN's Large Hadron Collider.</p> - -<p>The primary goals of the program are the visual investigation and - the understanding of the physics of complete events. Secondary goals - are to help develop reconstruction and analysis algorithms, to - facilitate debugging during commisioning and to provided a tool for - creating pictures and animations for publications, presentations and - exhibitions.</p> - -<p>Atlantis is based on the ALEPH event display DALI.</p> - -<p>Atlantis is written entirely in Java. JiveXML (event converter) is - a C++ interface between Atlantis and the Athena ATLAS offline SW - framework.</p> - -<p>Atlantis event visualisation is a fast, interactive and intuitive - application allowing study of complete ATLAS events.</p> - -</body> -</html> diff --git a/graphics/AtlantisJava/test/events/emptyEvent.xml b/graphics/AtlantisJava/test/events/emptyEvent.xml deleted file mode 100644 index 575abcaba0bf..000000000000 --- a/graphics/AtlantisJava/test/events/emptyEvent.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/xsl" href="JiveXML_event.xsl"?> -<?ATLAS Release: "dummy"?> -<!DOCTYPE Event SYSTEM "event.dtd"> -<Event version="dummy" runNumber="1" eventNumber="1" lumiBlock="1" dateTime="" eventProperty=""> -</Event> diff --git a/graphics/AtlantisJava/test/events/muonCollections.xml b/graphics/AtlantisJava/test/events/muonCollections.xml deleted file mode 100644 index c9281c94d4df..000000000000 --- a/graphics/AtlantisJava/test/events/muonCollections.xml +++ /dev/null @@ -1,240 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/xsl" href="JiveXML_event.xsl"?> -<?ATLAS Release: "dummy"?> -<!DOCTYPE Event SYSTEM "event.dtd"> -<Event version="dummy" runNumber="1" eventNumber="1" lumiBlock="1" dateTime="" eventProperty=""> - -<!-- Test event with two muon track collections, ConvertedMBoyMuonSpectroOnlyTracks and ConvertedMBoyTracks, - each containing two tracks. Edited down from JiveXML_105200_190249.xml. --> - -<Track count="2" storeGateKey="ConvertedMBoyMuonSpectroOnlyTracks"> - -<barcode> -0 0 -</barcode> -<chi2> -11.516 97.6254 -</chi2> -<cotTheta> --0.769442 1.26983 -</cotTheta> -<covMatrix multiple="15"> -19219.9 -213.586 22.2079 -47.5008 0.526573 0.135968 0.532181 -0.384001 -0.00148101 0.00808431 --0.0402467 0.104992 0.000158801 -0.00114179 0.00470875 54908.6 11775 4453.41 -220.818 -39.2807 -1.26332 -73.45 -46.6243 0.226787 0.609096 -77.0102 42.0205 0.986568 -0.892189 6.4339 - -</covMatrix> -<d0> -0 0 -</d0> -<driftSign multiple="36"> -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 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 0 0 0 0 0 0 -0 0 -</driftSign> -<hits multiple="36"> -2100232864 2100236992 2100241088 2100245216 2100249472 2100249504 2100253568 2100253600 2100257728 2100261824 -1730609632 1730613760 1730617856 1730621984 1730626336 1730626368 1730630432 1730630464 1730634592 1730638688 -1647284976 1647284336 1647286000 1647285364 1646731264 1646731296 1646739744 1646743840 1646747968 1646748000 -1646772976 1646772272 1646774000 1646773300 1680278368 1680282464 1680286592 1680295072 1680299168 1680303296 -1680315180 1680314384 1618215712 1618219840 1618219872 1618223968 1618228096 1618228128 2035453088 2035451984 -1802240896 1802245024 1802245056 1802249152 1802253280 1802257568 1802261664 1802261696 1802265824 1802269952 -1651803772 1651803200 1651769920 1651774016 1651778144 1651786592 1651790688 1651794816 1651823224 1651822616 -1651823644 1684836392 -</hits> -<id> -0 1 -</id> -<isOutlier multiple="36"> -0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 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 0 0 -0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 0 1 1 0 0 -0 0 -</isOutlier> -<nPixHits> -0 0 -</nPixHits> -<nSCTHits> -0 0 -</nSCTHits> -<nTRTHits> -0 0 -</nTRTHits> -<numDoF> -32 19 -</numDoF> -<numHits> -42 30 -</numHits> -<numPolyline> -42 30 -</numPolyline> -<phi0> --0.799777 2.98857 -</phi0> -<polylineX multiple="36"> -362.371 364.017 365.663 367.309 381.139 382.149 382.786 383.796 385.443 387.09 -415.16 416.809 418.457 420.106 433.955 434.965 435.605 436.614 438.264 439.914 -471.844 471.844 473.398 473.398 485.111 486.12 509.514 511.168 512.822 513.83 -519.096 519.096 520.65 520.65 646.788 648.447 650.105 674.583 676.242 677.902 -682.726 682.726 -477.38 -479.179 -480.655 -482.454 -484.254 -485.73 -578.526 -578.526 --594.877 -597.01 -598.693 -600.825 -602.958 -620.809 -622.98 -624.767 -626.938 -630.896 --683.109 -683.109 -690.955 -693.412 -695.868 -731.028 -733.561 -736.094 -744.69 -744.69 --746.92 -979.54 -</polylineX> -<polylineY multiple="36"> --372.719 -374.414 -376.108 -377.802 -392.037 -393.077 -393.732 -394.773 -396.468 -398.163 --427.056 -428.753 -430.451 -432.148 -446.404 -447.443 -448.102 -449.141 -450.839 -452.538 --485.408 -485.408 -487.007 -487.007 -499.066 -500.104 -524.189 -525.892 -527.594 -528.632 --534.054 -534.054 -535.654 -535.654 -665.539 -667.248 -668.956 -694.165 -695.875 -697.584 --702.553 -702.553 85.6237 85.754 85.8609 85.9913 86.1216 86.2285 88.9471 88.9471 -89.0356 89.0428 89.0486 89.0558 89.063 89.101 89.1036 89.1058 89.1083 89.1131 -89.1739 89.1739 89.1895 89.1953 89.2011 89.329 89.3419 89.3547 89.4028 89.4028 -89.4162 92.8672 -</polylineY> -<polylineZ multiple="36"> --392.694 -394.508 -396.321 -398.134 -413.36 -414.472 -415.172 -416.284 -418.096 -419.908 --450.754 -452.563 -454.373 -456.182 -471.371 -472.478 -473.179 -474.285 -476.093 -477.901 --512.838 -512.838 -514.536 -514.536 -527.329 -528.43 -553.946 -555.748 -557.549 -558.648 --564.384 -564.384 -566.076 -566.076 -702.92 -704.714 -706.508 -732.968 -734.761 -736.554 --741.766 -741.766 624.853 627.02 628.798 630.966 633.133 634.911 734.06 734.06 -749.096 750.985 752.476 754.365 756.254 771.538 773.328 774.802 776.592 779.856 -819.572 819.572 825.126 826.836 828.545 851.948 853.557 855.167 860.549 860.549 -861.929 979.729 -</polylineZ> -<pt> -55.8412 -1.03551 -</pt> -<trackAuthor> -9 9 -</trackAuthor> -<z0> --319.781 549.784 -</z0> -</Track> - -<Track count="2" storeGateKey="ConvertedMBoyTracks"> - -<barcode> -0 0 -</barcode> -<chi2> -11.516 97.6254 -</chi2> -<cotTheta> --0.770806 1.3117 -</cotTheta> -<covMatrix multiple="15"> -82352.8 -562.768 12126.3 -112.852 1.11282 0.199247 2.26463 -40.4407 -0.00427538 0.146613 --0.0227186 0.948083 0.00233271 -0.00250997 0.00411825 1.41767e+07 175813 5.07167e+07 -38589 17704.2 -133.741 5445.87 -130132 -66.2113 351.292 -4460.38 20560 25.2706 -57.2321 21.1558 - -</covMatrix> -<d0> -0.493352 11.5304 -</d0> -<driftSign multiple="36"> -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 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 0 0 0 0 0 0 -0 0 -</driftSign> -<hits multiple="36"> -2100232864 2100236992 2100241088 2100245216 2100249472 2100249504 2100253568 2100253600 2100257728 2100261824 -1730609632 1730613760 1730617856 1730621984 1730626336 1730626368 1730630432 1730630464 1730634592 1730638688 -1647284976 1647284336 1647286000 1647285364 1646731264 1646731296 1646739744 1646743840 1646747968 1646748000 -1646772976 1646772272 1646774000 1646773300 1680278368 1680282464 1680286592 1680295072 1680299168 1680303296 -1680315180 1680314384 1618215712 1618219840 1618219872 1618223968 1618228096 1618228128 2035453088 2035451984 -1802240896 1802245024 1802245056 1802249152 1802253280 1802257568 1802261664 1802261696 1802265824 1802269952 -1651803772 1651803200 1651769920 1651774016 1651778144 1651786592 1651790688 1651794816 1651823224 1651822616 -1651823644 1684836392 -</hits> -<id> -0 1 -</id> -<isOutlier multiple="36"> -0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 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 0 0 -0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 0 1 1 0 0 -0 0 -</isOutlier> -<nPixHits> -0 0 -</nPixHits> -<nSCTHits> -0 0 -</nSCTHits> -<nTRTHits> -0 0 -</nTRTHits> -<numDoF> -32 19 -</numDoF> -<numHits> -42 30 -</numHits> -<numPolyline> -42 30 -</numPolyline> -<phi0> --0.790721 2.76041 -</phi0> -<polylineX multiple="36"> -362.371 364.017 365.663 367.309 381.139 382.149 382.786 383.796 385.443 387.09 -415.16 416.809 418.457 420.106 433.955 434.965 435.605 436.614 438.264 439.914 -471.844 471.844 473.398 473.398 485.111 486.12 509.514 511.168 512.822 513.83 -519.096 519.096 520.65 520.65 646.788 648.447 650.105 674.583 676.242 677.902 -682.726 682.726 -477.38 -479.179 -480.655 -482.454 -484.254 -485.73 -578.526 -578.526 --594.877 -597.01 -598.693 -600.825 -602.958 -620.809 -622.98 -624.767 -626.938 -630.896 --683.109 -683.109 -690.955 -693.412 -695.868 -731.028 -733.561 -736.094 -744.69 -744.69 --746.92 -979.54 -</polylineX> -<polylineY multiple="36"> --372.719 -374.414 -376.108 -377.802 -392.037 -393.077 -393.732 -394.773 -396.468 -398.163 --427.056 -428.753 -430.451 -432.148 -446.404 -447.443 -448.102 -449.141 -450.839 -452.538 --485.408 -485.408 -487.007 -487.007 -499.066 -500.104 -524.189 -525.892 -527.594 -528.632 --534.054 -534.054 -535.654 -535.654 -665.539 -667.248 -668.956 -694.165 -695.875 -697.584 --702.553 -702.553 85.6237 85.754 85.8609 85.9913 86.1216 86.2285 88.9471 88.9471 -89.0356 89.0428 89.0486 89.0558 89.063 89.101 89.1036 89.1058 89.1083 89.1131 -89.1739 89.1739 89.1895 89.1953 89.2011 89.329 89.3419 89.3547 89.4028 89.4028 -89.4162 92.8672 -</polylineY> -<polylineZ multiple="36"> --392.694 -394.508 -396.321 -398.134 -413.36 -414.472 -415.172 -416.284 -418.096 -419.908 --450.754 -452.563 -454.373 -456.182 -471.371 -472.478 -473.179 -474.285 -476.093 -477.901 --512.838 -512.838 -514.536 -514.536 -527.329 -528.43 -553.946 -555.748 -557.549 -558.648 --564.384 -564.384 -566.076 -566.076 -702.92 -704.714 -706.508 -732.968 -734.761 -736.554 --741.766 -741.766 624.853 627.02 628.798 630.966 633.133 634.911 734.06 734.06 -749.096 750.985 752.476 754.365 756.254 771.538 773.328 774.802 776.592 779.856 -819.572 819.572 825.126 826.836 828.545 851.948 853.557 855.167 860.549 860.549 -861.929 979.729 -</polylineZ> -<pt> -58.6356 -3.08337 -</pt> -<trackAuthor> -9 9 -</trackAuthor> -<z0> -7.67828 -4.26881 -</z0> -</Track> -</Event> - diff --git a/graphics/AtlantisJava/test/events/muonCollections2.xml b/graphics/AtlantisJava/test/events/muonCollections2.xml deleted file mode 100644 index 36c046de320d..000000000000 --- a/graphics/AtlantisJava/test/events/muonCollections2.xml +++ /dev/null @@ -1,291 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/xsl" href="JiveXML_event.xsl"?> -<?ATLAS Release: "dummy"?> -<!DOCTYPE Event SYSTEM "event.dtd"> - -<Event version="dummy" runNumber="2" eventNumber="2" lumiBlock="2" dateTime="" eventProperty=""> - -<!-- Test event with two muon track collections, ConvertedMBoyTracks and - ConvertedMuIdCBTracks, each containing 2 tracks. - Edited down from JiveXML_105200_190249.xml. ---> - -<Track count="2" storeGateKey="ConvertedMBoyTracks"> -<barcode> -0 0 -</barcode> -<chi2> -11.516 97.6254 -</chi2> -<cotTheta> --0.770806 1.3117 -</cotTheta> -<covMatrix multiple="15"> -82352.8 -562.768 12126.3 -112.852 1.11282 0.199247 2.26463 -40.4407 -0.00427538 0.146613 --0.0227186 0.948083 0.00233271 -0.00250997 0.00411825 1.41767e+07 175813 5.07167e+07 -38589 17704.2 -133.741 5445.87 -130132 -66.2113 351.292 -4460.38 20560 25.2706 -57.2321 21.1558 - -</covMatrix> -<d0> -0.493352 11.5304 -</d0> -<driftSign multiple="36"> -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 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 0 0 0 0 0 0 -0 0 -</driftSign> -<hits multiple="36"> -2100232864 2100236992 2100241088 2100245216 2100249472 2100249504 2100253568 2100253600 2100257728 2100261824 -1730609632 1730613760 1730617856 1730621984 1730626336 1730626368 1730630432 1730630464 1730634592 1730638688 -1647284976 1647284336 1647286000 1647285364 1646731264 1646731296 1646739744 1646743840 1646747968 1646748000 -1646772976 1646772272 1646774000 1646773300 1680278368 1680282464 1680286592 1680295072 1680299168 1680303296 -1680315180 1680314384 1618215712 1618219840 1618219872 1618223968 1618228096 1618228128 2035453088 2035451984 -1802240896 1802245024 1802245056 1802249152 1802253280 1802257568 1802261664 1802261696 1802265824 1802269952 -1651803772 1651803200 1651769920 1651774016 1651778144 1651786592 1651790688 1651794816 1651823224 1651822616 -1651823644 1684836392 -</hits> -<id> -0 1 -</id> -<isOutlier multiple="36"> -0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 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 0 0 -0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 0 1 1 0 0 -0 0 -</isOutlier> -<nPixHits> -0 0 -</nPixHits> -<nSCTHits> -0 0 -</nSCTHits> -<nTRTHits> -0 0 -</nTRTHits> -<numDoF> -32 19 -</numDoF> -<numHits> -42 30 -</numHits> -<numPolyline> -42 30 -</numPolyline> -<phi0> --0.790721 2.76041 -</phi0> -<polylineX multiple="36"> -362.371 364.017 365.663 367.309 381.139 382.149 382.786 383.796 385.443 387.09 -415.16 416.809 418.457 420.106 433.955 434.965 435.605 436.614 438.264 439.914 -471.844 471.844 473.398 473.398 485.111 486.12 509.514 511.168 512.822 513.83 -519.096 519.096 520.65 520.65 646.788 648.447 650.105 674.583 676.242 677.902 -682.726 682.726 -477.38 -479.179 -480.655 -482.454 -484.254 -485.73 -578.526 -578.526 --594.877 -597.01 -598.693 -600.825 -602.958 -620.809 -622.98 -624.767 -626.938 -630.896 --683.109 -683.109 -690.955 -693.412 -695.868 -731.028 -733.561 -736.094 -744.69 -744.69 --746.92 -979.54 -</polylineX> -<polylineY multiple="36"> --372.719 -374.414 -376.108 -377.802 -392.037 -393.077 -393.732 -394.773 -396.468 -398.163 --427.056 -428.753 -430.451 -432.148 -446.404 -447.443 -448.102 -449.141 -450.839 -452.538 --485.408 -485.408 -487.007 -487.007 -499.066 -500.104 -524.189 -525.892 -527.594 -528.632 --534.054 -534.054 -535.654 -535.654 -665.539 -667.248 -668.956 -694.165 -695.875 -697.584 --702.553 -702.553 85.6237 85.754 85.8609 85.9913 86.1216 86.2285 88.9471 88.9471 -89.0356 89.0428 89.0486 89.0558 89.063 89.101 89.1036 89.1058 89.1083 89.1131 -89.1739 89.1739 89.1895 89.1953 89.2011 89.329 89.3419 89.3547 89.4028 89.4028 -89.4162 92.8672 -</polylineY> -<polylineZ multiple="36"> --392.694 -394.508 -396.321 -398.134 -413.36 -414.472 -415.172 -416.284 -418.096 -419.908 --450.754 -452.563 -454.373 -456.182 -471.371 -472.478 -473.179 -474.285 -476.093 -477.901 --512.838 -512.838 -514.536 -514.536 -527.329 -528.43 -553.946 -555.748 -557.549 -558.648 --564.384 -564.384 -566.076 -566.076 -702.92 -704.714 -706.508 -732.968 -734.761 -736.554 --741.766 -741.766 624.853 627.02 628.798 630.966 633.133 634.911 734.06 734.06 -749.096 750.985 752.476 754.365 756.254 771.538 773.328 774.802 776.592 779.856 -819.572 819.572 825.126 826.836 828.545 851.948 853.557 855.167 860.549 860.549 -861.929 979.729 -</polylineZ> -<pt> -58.6356 -3.08337 -</pt> -<trackAuthor> -9 9 -</trackAuthor> -<z0> -7.67828 -4.26881 -</z0> -</Track> - - -<Track count="2" storeGateKey="ConvertedMuIdCBTracks"> - -<barcode> -0 0 -</barcode> -<chi2> -42.814 49.7505 -</chi2> -<cotTheta> --0.771556 1.27815 -</cotTheta> -<covMatrix multiple="15"> -0.00826928 0.00161205 0.524101 -0.000787796 -0.000158775 9.16577e-05 -9.49e-05 -0.0391607 1.23985e-05 0.00336271 --0.00155346 -0.000959667 0.000188491 8.20954e-05 0.00144041 0.169634 -0.0124204 0.789371 -0.0337235 0.00136704 -0.00730118 0.0015583 -0.128944 -0.000194753 0.02396 -0.0501037 0.0144917 0.0149698 -0.00297823 0.352475 - -</covMatrix> -<d0> -0.089879 -0.11419 -</d0> -<driftSign multiple="75.5"> -0 0 0 0 0 0 0 0 0 0 -0 1 1 -1 1 -1 -1 -1 -1 -1 --1 1 -1 -1 1 1 -1 1 -1 -1 --1 -1 1 1 -1 1 -1 1 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 -0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 -1 -1 -1 -1 --1 -1 -1 1 1 1 -1 -1 -1 1 --1 1 -1 -1 -1 -1 -1 1 1 1 --1 -1 -1 1 -1 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 0 0 0 -0 -</driftSign> -<hits multiple="75.5"> -2725184265 2888627033 3047989021 168699032 168697991 171025537 171024522 173350018 173348972 175676530 -175675510 331359616 331360672 331361728 331362752 331364832 331384384 331386400 331388416 331390464 -331392480 331395520 331396544 331398560 331399584 331401600 331405664 331416928 331419008 331422144 -331424224 331427360 331428384 331430464 331432576 331433600 331435680 331436736 2100232864 2100236992 -2100241088 2100245216 2100249472 2100249504 2100253568 2100253600 2100257728 2100261824 1730609632 1730613760 -1730617856 1730621984 1730626336 1730630432 1730630464 1730634592 1730638688 1647286000 1647285364 1646731264 -1646731296 1646739744 1646743840 1646747968 1646748000 1646773300 1646774000 1680278368 1680282464 1680286592 -1680295072 1680299168 1680303296 1680314384 1680315180 2706406253 2855456339 3002378023 168253015 168251976 -170483061 170482036 172713122 172712111 174909133 174908084 383784512 383786592 383788640 383789664 -383790720 383791680 383792736 383793760 383812192 383814272 383816288 383818368 383820416 383821440 -383822496 383823520 383825536 383827616 383846048 383848128 383850144 383851168 383853216 383855296 -383857312 383859392 383877824 383882944 383885024 1618215712 1618219840 1618219872 1618223968 1618228096 -1618228128 2035453096 2035451984 1802240896 1802245024 1802245056 1802249152 1802253280 1802257568 1802261664 -1802261696 1802265824 1802269952 1651803772 1651803200 1651769920 1651774016 1651778144 1651786592 1651790688 -1651794816 1651823224 1651823644 1684800672 1684804768 1684808896 1684817248 1684821312 1684825440 1684838064 -1684837408 -</hits> -<id> -0 1 -</id> -<isOutlier multiple="75.5"> -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 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 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 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 -0 0 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 -0 -</isOutlier> -<nPixHits> -3 3 -</nPixHits> -<nSCTHits> -8 8 -</nSCTHits> -<nTRTHits> -27 29 -</nTRTHits> -<numDoF> -73 67 -</numDoF> -<numHits> -75 76 -</numHits> -<numPolyline> -75 76 -</numPolyline> -<phi0> --0.792403 2.83724 -</phi0> -<polylineX multiple="75.5"> -3.76812 6.33631 8.61433 21.2214 21.2854 26.2311 26.295 31.4707 31.5345 36.4392 -36.5029 44.1987 44.685 45.1907 45.675 46.6756 49.9041 50.7914 51.6869 52.5953 -53.5071 54.8868 55.3573 56.2911 56.7603 57.7053 59.6133 61.3182 62.2339 63.6216 -64.5559 65.9688 66.4364 67.3895 68.3545 68.8261 69.7947 70.2729 361.985 363.632 -365.28 366.928 380.774 381.786 382.423 383.434 385.083 386.732 414.834 416.484 -418.135 419.786 433.65 435.302 436.313 437.964 439.616 471.581 472.359 484.864 -485.874 509.294 510.949 512.605 513.614 519.664 519.664 646.717 648.378 650.038 -674.541 676.203 677.864 682.699 682.699 -4.69928 -8.49491 -11.7275 -28.6103 -28.6966 --35.5786 -35.6658 -43.2266 -43.3145 -49.3888 -49.4759 -62.7019 -63.94 -65.41 -66.0181 --66.6494 -67.4119 -68.0438 -68.6522 -70.5337 -71.7754 -73.1723 -74.4154 -75.8909 -76.4981 --77.1352 -77.7425 -79.1421 -80.3877 -82.3188 -83.5658 -84.9682 -85.5738 -87.0543 -88.3031 --89.7074 -90.9573 -92.824 -96.0854 -97.3375 -477.031 -478.837 -480.315 -482.129 -483.948 --485.428 -578.457 -578.457 -594.879 -597.008 -598.688 -600.823 -602.96 -620.821 -622.986 --624.768 -626.94 -630.918 -683.109 -683.109 -691.068 -693.535 -696.015 -731.403 -733.952 --736.508 -744.69 -745.805 -927.496 -930.236 -932.976 -967.838 -969.536 -972.29 -979.54 --980.655 -</polylineX> -<polylineY multiple="75.5"> --3.69527 -6.30342 -8.61847 -21.4575 -21.5229 -26.5724 -26.6377 -31.9298 -31.995 -37.0174 --37.0826 -44.9778 -45.4772 -45.9968 -46.4943 -47.5225 -50.8422 -51.7552 -52.6767 -53.6118 --54.5506 -55.9717 -56.4564 -57.4187 -57.9022 -58.8765 -60.8442 -62.6033 -63.5486 -64.9814 --65.9465 -67.4063 -67.8896 -68.8748 -69.8726 -70.3604 -71.3623 -71.8571 -373.106 -374.798 --376.49 -378.183 -392.402 -393.442 -394.096 -395.135 -396.828 -398.522 -427.384 -429.079 --430.774 -432.47 -446.71 -448.406 -449.444 -451.141 -452.837 -485.67 -486.469 -499.314 --500.351 -524.41 -526.11 -527.811 -528.848 -535.063 -535.063 -665.602 -667.309 -669.015 --694.196 -695.903 -697.61 -702.579 -702.579 1.57025 2.70537 3.64723 8.20767 8.22939 -9.91078 9.93148 11.6655 11.6851 12.9935 13.0117 15.5953 15.8191 16.081 16.1881 -16.2985 16.4308 16.5395 16.6435 16.9605 17.1658 17.3931 17.5922 17.8246 17.9191 -18.0174 18.1104 18.3221 18.5071 18.7879 18.9655 19.1617 19.2453 19.4468 19.6134 -19.7969 19.9571 20.1911 20.5846 20.7305 72.212 72.4473 72.6375 72.8677 73.0952 -73.2777 81.2266 81.2266 82.1853 82.3048 82.3986 82.5175 82.6355 83.5933 83.7065 -83.7992 83.9127 84.1196 86.7554 86.7554 87.1596 87.2851 87.4124 89.2493 89.3834 -89.5192 89.9559 90.0156 100.839 101.018 101.197 103.504 103.618 103.802 104.29 -104.366 -</polylineY> -<polylineZ multiple="75.5"> -3.50153 0.677387 -1.82855 -15.7119 -15.7825 -21.2359 -21.3064 -27.0176 -27.088 -32.5043 --32.5746 -41.0812 -41.619 -42.1784 -42.7141 -43.821 -47.3938 -48.3761 -49.3675 -50.3733 --51.383 -52.9113 -53.4324 -54.4669 -54.9867 -56.034 -58.1486 -60.0387 -61.0541 -62.5931 --63.6294 -65.1968 -65.7157 -66.7733 -67.8442 -68.3677 -69.4429 -69.9738 -392.695 -394.508 --396.321 -398.134 -413.359 -414.471 -415.172 -416.284 -418.095 -419.907 -450.752 -452.562 --454.371 -456.181 -471.369 -473.178 -474.284 -476.092 -477.9 -512.837 -513.686 -527.328 --528.429 -553.945 -555.747 -557.549 -558.648 -565.23 -565.23 -702.927 -704.721 -706.516 --732.978 -734.772 -736.565 -741.784 -741.784 13.9188 18.9826 23.283 45.5935 45.7069 -54.7381 54.8523 64.7366 64.8514 72.7677 72.881 90.0479 91.6506 93.5526 94.3391 -95.1555 96.1413 96.9581 97.7443 100.175 101.778 103.581 105.185 107.087 107.87 -108.691 109.474 111.277 112.881 115.367 116.972 118.776 119.555 121.458 123.063 -124.868 126.473 128.87 133.055 134.661 625.142 627.308 629.076 631.238 633.399 -635.154 734.06 734.06 749.091 750.989 752.48 754.369 756.247 771.525 773.326 -774.801 776.589 779.835 819.417 819.417 824.967 826.666 828.354 851.354 852.938 -854.512 859.492 860.163 951.515 952.693 953.866 968.469 969.167 970.296 973.262 -973.717 -</polylineZ> -<pt> -59.5287 -3.02081 -</pt> -<trackAuthor> -1 1 -</trackAuthor> -<z0> -7.57297 7.58689 -</z0> -</Track> - -</Event> diff --git a/graphics/AtlantisJava/test/events/rvxEvent.xml b/graphics/AtlantisJava/test/events/rvxEvent.xml deleted file mode 100644 index 21c7b7ca07e5..000000000000 --- a/graphics/AtlantisJava/test/events/rvxEvent.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/xsl" href="JiveXML_event.xsl"?> -<?ATLAS Release: "dummy"?> -<!DOCTYPE Event SYSTEM "event.dtd"> -<Event version="dummy" runNumber="1" eventNumber="1" lumiBlock="1" dateTime="" eventProperty=""> - -<RVx count="4" storeGateKey=""> - -<chi2> -13.3549 13.3549 0.979663 0.979663 -</chi2> -<covMatrix multiple="6"> -3145 1516.27 739.31 230.495 111.531 34.7901 3145 1516.27 739.31 230.495 -111.531 34.7901 0.0057955 0.00580698 0.0161258 0.00385126 0.0066793 0.172986 0.0057955 0.00580698 -0.0161258 0.00385126 0.0066793 0.172986 -</covMatrix> -<numTracks> -2 2 29 0 -</numTracks> -<primVxCand> -2 2 1 0 -</primVxCand> -<sgkey> -TrackParticleCandidate TrackParticleCandidate TrackParticleCandidate TrackParticleCandidate -</sgkey> -<tracks multiple="8.25"> -41 33 41 33 0 1 2 3 4 5 -6 7 8 9 10 11 12 13 14 15 -16 17 18 19 20 21 22 23 24 25 -26 27 28 -</tracks> -<x> -35.1249 35.1249 -0.0114638 -0.0114638 -</x> -<y> -18.3795 18.3795 0.0945006 0.0945006 -</y> -<z> -7.44812 7.44812 5.03257 5.03257 -</z> -</RVx> - - -</Event> diff --git a/graphics/AtlantisJava/test/events/rvxInconsistentEvent.xml b/graphics/AtlantisJava/test/events/rvxInconsistentEvent.xml deleted file mode 100644 index 3c745253f7ce..000000000000 --- a/graphics/AtlantisJava/test/events/rvxInconsistentEvent.xml +++ /dev/null @@ -1,258 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/xsl" href="JiveXML_event.xsl"?> -<?ATLAS Release: "dummy"?> -<!DOCTYPE Event SYSTEM "event.dtd"> -<Event version="dummy" runNumber="1" eventNumber="1" lumiBlock="1" dateTime="" eventProperty=""> - -<RVx count="4" storeGateKey=""> - -<chi2> -13.3549 13.3549 0.979663 0.979663 -</chi2> -<covMatrix multiple="6"> -3145 1516.27 739.31 230.495 111.531 34.7901 3145 1516.27 739.31 230.495 -111.531 34.7901 0.0057955 0.00580698 0.0161258 0.00385126 0.0066793 0.172986 0.0057955 0.00580698 -0.0161258 0.00385126 0.0066793 0.172986 -</covMatrix> -<numTracks> -2 2 29 0 -</numTracks> -<primVxCand> -2 2 1 0 -</primVxCand> -<sgkey> -TrackParticleCandidate TrackParticleCandidate TrackParticleCandidate TrackParticleCandidate -</sgkey> -<tracks multiple="544.5"> --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 41 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 33 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 41 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 33 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 0 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 2 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 3 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 4 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 5 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 6 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 7 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -8 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 9 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 10 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 11 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 12 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 13 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 14 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 15 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 16 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 17 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -18 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 19 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 20 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 21 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 22 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 23 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 24 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 25 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 26 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 27 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -28 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --1 -1 -1 -1 -1 -1 -1 -1 -</tracks> -<x> -35.1249 35.1249 -0.0114638 -0.0114638 -</x> -<y> -18.3795 18.3795 0.0945006 0.0945006 -</y> -<z> -7.44812 7.44812 5.03257 5.03257 -</z> -</RVx> - - -</Event> diff --git a/graphics/AtlantisJava/test/src/atlantis/AtlantisHeadlessTestCase.java b/graphics/AtlantisJava/test/src/atlantis/AtlantisHeadlessTestCase.java deleted file mode 100644 index 25f0a50137d3..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/AtlantisHeadlessTestCase.java +++ /dev/null @@ -1,38 +0,0 @@ -package atlantis; - - -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - -import testutils.TeeOutputStream; -import testutils.TestUtils; - -public class AtlantisHeadlessTestCase { - ByteArrayOutputStream stdOutCopy = new ByteArrayOutputStream(); - protected String eventFileName = null; // Event file to give on the command line - - /** Start Atlantis in headless mode. - */ - protected void startHeadlessMode() { - // Redirect standard output to ByteArrayOutputStream as well as normal System.out - TeeOutputStream teeOut = new TeeOutputStream(System.out,stdOutCopy); - System.setOut(new PrintStream(teeOut)); - - String atlantisHomeDir = Atlantis.getHomeDirectory(); - String testEventsDir = atlantisHomeDir+"/test/events"; - TestUtils.setPropertyIfNotSet("atlantis.test.events",testEventsDir); - - System.setProperty("java.awt.headless", "true"); - String[] args = {"--debug","DEBUG"}; - if (eventFileName!=null) { - String[] newArgs = new String[args.length+1]; - for (int i=0; i<args.length; ++i) { - newArgs[i] = args[i]; - } - String eventsDirectory = System.getProperty("atlantis.test.events"); - newArgs[args.length] = eventsDirectory+"/"+eventFileName; - args = newArgs; - } - Atlantis.main(args); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/HeadlessTest.java b/graphics/AtlantisJava/test/src/atlantis/HeadlessTest.java deleted file mode 100644 index 759ea917c954..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/HeadlessTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package atlantis; - -import org.fest.swing.timing.Condition; -import org.junit.Test; -import static org.fest.swing.timing.Pause.pause; -import static org.fest.swing.timing.Timeout.timeout; - -public class HeadlessTest extends AtlantisHeadlessTestCase { - - @Test - /** Start Atlantis in headless mode and make sure it doesn't crash part-way through. - * Atlantis.initAtlantis catches all Exceptions so we check for "Atlantis Ready" in - * the output console. - */ - public void testHeadlessMode() { - startHeadlessMode(); - pause(new Condition("output to contain \"Atlantis Ready\"") { - public boolean test() {return stdOutCopy.toString().contains("Atlantis Ready");} - },timeout(10000)); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/InconsistentEventTest.java b/graphics/AtlantisJava/test/src/atlantis/InconsistentEventTest.java deleted file mode 100644 index 5dbfffcd532b..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/InconsistentEventTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package atlantis; - -import static org.fest.swing.timing.Pause.pause; -import static org.fest.swing.timing.Timeout.timeout; -import static org.junit.Assert.*; - -import org.fest.swing.timing.Condition; -import org.junit.Before; -import org.junit.Test; - -/** - * Test for bug#556, where a JiveXML file from Atlas release 17 causes an error - * on startup when the file is given on the command line, though not when it is - * opened after Atlantis has started. - * - * @author waugh - * - */ -public class InconsistentEventTest extends AtlantisHeadlessTestCase { - @Before - public void setUp() { - eventFileName = "rel17vtxEvent.xml"; - System.setProperty("java.awt.headless", "true"); - startHeadlessMode(); - } - - @Test - public void loadEvent() { - pause(new Condition("output to contain \"Atlantis Ready\"") { - public boolean test() {return stdOutCopy.toString().contains("Atlantis Ready");} - },timeout(10000)); - String output = stdOutCopy.toString(); - assertTrue("Could not find or parse event ",output.contains("Parsing event")); - assertFalse("Error reading event",output.contains("Can not read events")); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/NoTracksElementTest.java b/graphics/AtlantisJava/test/src/atlantis/NoTracksElementTest.java deleted file mode 100644 index e761ec038c14..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/NoTracksElementTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package atlantis; - -import static org.fest.swing.timing.Pause.pause; -import static org.fest.swing.timing.Timeout.timeout; -import static org.junit.Assert.*; - -import org.fest.swing.timing.Condition; -import org.junit.Before; -import org.junit.Test; - -/** - * Test for bug#552, where a JiveXML file contains a "numTracks" element but - * not a corresponding "tracks" element in the "RVx" section, as in some - * of the events from the Hypatia masterclass. - * - * @author waugh - * - */ -public class NoTracksElementTest extends AtlantisHeadlessTestCase { - @Before - public void setUp() { - eventFileName = "masterclassMuonEvents.zip"; - System.setProperty("java.awt.headless", "true"); - startHeadlessMode(); - } - - @Test - public void loadEvent() { - pause(new Condition("output to contain \"Atlantis Ready\"") { - public boolean test() {return stdOutCopy.toString().contains("Atlantis Ready");} - },timeout(10000)); - String output = stdOutCopy.toString(); - assertTrue("Could not find or parse event ",output.contains("Parsing event")); - assertFalse("Error when constructing RVx",output.contains("Error when constructing RVx")); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleBorderTest.java b/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleBorderTest.java deleted file mode 100644 index 9ec8b4504a83..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleBorderTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package atlantis.canvas; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class AScaleBorderTest { - - @Test - public void testGetNumDecimalPlaces() { - assertEquals("Wrong number of decimal places",0,AScaleBorder.getNumDecimalPlaces(1.0)); - assertEquals("Wrong number of decimal places",0,AScaleBorder.getNumDecimalPlaces(10.0)); - assertEquals("Wrong number of decimal places",1,AScaleBorder.getNumDecimalPlaces(0.5)); - assertEquals("Wrong number of decimal places",2,AScaleBorder.getNumDecimalPlaces(0.02)); - assertEquals("Wrong number of decimal places",0,AScaleBorder.getNumDecimalPlaces(-2.0)); - assertEquals("Wrong number of decimal places",1,AScaleBorder.getNumDecimalPlaces(-0.5)); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleTest.java b/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleTest.java deleted file mode 100644 index 75b0e7c58827..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/canvas/AScaleTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package atlantis.canvas; - -import static org.junit.Assert.*; - -import java.awt.geom.GeneralPath; -import java.awt.geom.PathIterator; - -import org.junit.Assert; -import org.junit.Test; - -public class AScaleTest { - - private static final double TOLERANCE = 0.00001; - - @Test - public void testCalculateScale() { - AScale scale = AScale.calculateScale(0, 10, 100, 3, 7, 0, 0, null); - for (double label : scale.labelValues) { - System.out.println("label = "+label); - } - for (double pos : scale.labelPositions) { - System.out.println("position: "+pos); - } - System.out.println("Primary tick marks = " + scale.primaryTicks); - GeneralPath primaryTicks = scale.primaryTicks; - PathIterator iterPTicks = primaryTicks.getPathIterator(null); - double[] coords = new double[2]; - int i = 0; - while (!iterPTicks.isDone()) { - int type = iterPTicks.currentSegment(coords); - System.out.format("point %d has type %d%n",i,type); - System.out.print("Coords: "); - for (int j=0; j<2; ++j) { - System.out.format(" %f", coords[j]); - } - System.out.println(); - i++; - iterPTicks.next(); - } - } - - @Test - public void testRoundNumbers() { - assertEquals("Wrong rounding", 5.0, AScale.getRoundNumber(9.0), TOLERANCE); - assertEquals("Wrong rounding", -5.0, AScale.getRoundNumber(-9.0), TOLERANCE); - assertEquals("Wrong rounding", 1.0, AScale.getRoundNumber(1.01), TOLERANCE); - assertEquals("Wrong rounding", 500.0, AScale.getRoundNumber(999.0), TOLERANCE); - } - - @Test - public void testGetScaleIntervals() { - double[] intervals, expectedValues; - intervals = AScale.getScaleIntervals(-11.0,11.0); - expectedValues = new double[] {10.0, 5.0, 1.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-110.0,110.0); - expectedValues = new double[] {100.0, 50.0, 10.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-51.0,51.0); - expectedValues = new double[] {50.0, 10.0, 5.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-50.0,50.0); - expectedValues = new double[] {50.0, 10.0, 5.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-49.0,49.0); - expectedValues = new double[] {40.0, 20.0, 5.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(1.0,49.0); - expectedValues = new double[] {20.0, 10.0, 2.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(1.0,101.0); - expectedValues = new double[] {50.0, 10.0, 5.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-101.0,-1.0); - expectedValues = new double[] {50.0, 10.0, 5.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(-9.5,9.5); - expectedValues = new double[] {5.0, 1.0, 0.5}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(19.0,61.0); - expectedValues = new double[] {20.0, 10.0, 2.0}; - assertArrayEquals("Wrong intervals", expectedValues, intervals, TOLERANCE); - intervals = AScale.getScaleIntervals(0.0,0.0); - assertNull("Intervals should be null for invalid input",intervals); - } - - @Test - public void testGetScaleValues() { - double[] values; - double[] expectedValues; - values = AScale.getScaleValues(0.0, 1.0, 1.0); - expectedValues = new double[] {0.0, 1.0}; - assertArrayEquals("Wrong scale values", expectedValues, values, TOLERANCE); - values = AScale.getScaleValues(-0.1, 1.1, 1.0); - expectedValues = new double[] {0.0, 1.0}; - assertArrayEquals("Wrong scale values", expectedValues, values, TOLERANCE); - } - - @Test - public void testInterpolate() { - float result = AScale.interpolate(0.5, 10.0, 0.0, 1.0); - assertEquals("Wrong interpolated value",5.0,result,TOLERANCE); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/canvas/AWindowTest.java b/graphics/AtlantisJava/test/src/atlantis/canvas/AWindowTest.java deleted file mode 100644 index 076249c99931..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/canvas/AWindowTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package atlantis.canvas; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class AWindowTest { - - @Test - public void test() { - AWindow window = new AWindow("dummyName","dummyProjection","dummyGroup",1); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/data/AHelixTest.java b/graphics/AtlantisJava/test/src/atlantis/data/AHelixTest.java deleted file mode 100644 index b55aecf4db0d..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/data/AHelixTest.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -package atlantis.data; - -import atlantis.parameters.APar; -import atlantis.utils.AMath; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -/** - * - * @author ejansen - */ - -@RunWith(Parameterized.class) -public class AHelixTest { - - private static final double TOLERANCE = 0.001; - private static final double CURVATURE = 100/0.6; - - private float d0, z0, phi0, cotanTheta, pt; - private AHelix helix; - - public AHelixTest(float d0, float z0, float phi0, float cotanTheta, float pt) { - this.d0 = d0; - this.z0 = z0; - this.phi0 = phi0; - this.cotanTheta = cotanTheta; - this.pt = pt; - } - - @Parameters - public static Collection helices() { - Collection data = new ArrayList<Object[]>(); - - for (int charge=-1; charge<=1; charge+=2) { - for (float d0=-1.f; d0<=1.f; d0+=1.f) { - for (float phi0=-(float)Math.PI; phi0<Math.PI; phi0+=Math.PI/4) { - float pt = 20.f; - - data.add(new Object[] {d0, 0.0f, phi0, 0.5f, charge*pt}); - } - } - } - - return data; - } - - @Before - public void setUp() { - APar.constructDummyForTesting(); - helix = new AHelix(d0, z0, (float)Math.toDegrees(phi0), cotanTheta, pt); - } - - @Test - public void testBackwardsCompatibility() { - AOldHelix oldHelix = new AOldHelix(d0, z0, (float)Math.toDegrees(phi0), cotanTheta, pt); - - assertArrayEquals(oldHelix.getPar(), helix.getPar(), TOLERANCE); - assertEquals(oldHelix.eta, helix.eta(), TOLERANCE); - assertEquals(oldHelix.startPhi, helix.getAlphaMin(), TOLERANCE); - assertEquals(oldHelix.rhoVertex, helix.getRhoVtx(), TOLERANCE); - } - - @Test - public void testD0() { - // The alpha=0 point should be at distance d0 - double rho = helix.getRho(0); - assertEquals(Math.abs(d0), rho, TOLERANCE); - } - - @Test - public void testCenterCoordinates() { - // Check the center of the circle against a separate calculation - double charge = Math.signum(pt); - double rC = CURVATURE * Math.abs(pt); - double xC = (rC - charge * d0) * Math.cos(phi0 - charge * Math.PI / 2); - double yC = (rC - charge * d0) * Math.sin(phi0 - charge * Math.PI / 2); - assertEquals(xC, helix.getXc(), TOLERANCE); - assertEquals(yC, helix.getYc(), TOLERANCE); - } - - @Test - public void testEndPoint() { - // End the helix at 1m from the beam pipe and check that the last point is at 1m - double alphaMax = helix.getAlphaCylinder(100., 250.); - assertEquals(100., helix.getRho(alphaMax), TOLERANCE); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/data/AOldHelixTest.java b/graphics/AtlantisJava/test/src/atlantis/data/AOldHelixTest.java deleted file mode 100644 index 39b5077be338..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/data/AOldHelixTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package atlantis.data; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import atlantis.parameters.APar; - -import static java.lang.Math.PI; - -public class AOldHelixTest { - /** Arbitrary tolerance for floating-point comparisons */ - private static final double TOLERANCE = 0.00001; - - @Before - public void setUp() throws Exception { - APar.constructDummyForTesting(); - } - - @Test - public void helixFromNominalVertex() { - // Input: rhoVtx,phiVtx,zVtx,pt,phi,eta,charge - // Start at (0,0,0), pt=2, eta=0 so perp to z axis - // phi = 0 (arbitrary), positive charge (+1) - // Expect all params 0 except ptInverse = 0.5 - AOldHelix helix = new AOldHelix(0,0,0,2,0,0,1); - assertHelixParametersEqual("Wrong helix parameters.",0,0,0,0,0.5,helix.getPar()); - // charge = -1 so ptInverse changes sign - helix = new AOldHelix(0,0,0,2,0,0,-1); - assertHelixParametersEqual("Wrong helix parameters.",0,0,0,0,-0.5,helix.getPar()); - } - - @Test - public void helixStartingAtPCA() { - /* Input: rhoVtx,phiVtx,zVtx,pt,phi,eta,charge - * Circular track (pz=0) starting at point closest to beam, at non-zero z. - * Perpendicular to line from beam to starting vertex: phi = phiVtx + PI/2 - * Start in upwards direction, from point to the right of the beam axis, */ - AOldHelix helix = new AOldHelix(0.1f,0,0.25f,1,(float)(PI/2),0,1); - double[] actualParameters = helix.getPar(); - /* Closest approach is where we started so phi at PCA is same as phi at start. - * Note that d0 is negative. */ - assertHelixParametersEqual("",-0.1,0.25,PI/2,0,1,actualParameters); - /* Same starting position and direction, but negative particle. - * No change to d0, which is still negative. */ - helix = new AOldHelix(0.1f,0,0.25f,1,(float)(PI/2),0,-1); - actualParameters = helix.getPar(); - assertHelixParametersEqual("",-0.1,0.25,PI/2,0,-1,actualParameters); - /* - * Positive and negative particles, now starting in same direction (upwards) - * but from a starting position to the left of the beam. - * This time d0 is positive. - */ - helix = new AOldHelix(0.1f,(float)PI,0.25f,1,(float)(PI/2),0,1); - actualParameters = helix.getPar(); - assertHelixParametersEqual("",0.1,0.25,PI/2,0,1,actualParameters); - helix = new AOldHelix(0.1f,(float)PI,0.25f,1,(float)(PI/2),0,-1); - actualParameters = helix.getPar(); - assertHelixParametersEqual("",0.1,0.25,PI/2,0,-1,actualParameters); - } - - protected void assertHelixParametersEqual(String message, double d0, double z0, - double phi0, double tL, double ptInverse, double[] actualParameters) { - assertD0Equals(message,d0,actualParameters); - assertZ0Equals(message,z0,actualParameters); - assertPhi0Equals(message,phi0,actualParameters); - assertTLEquals(message,tL,actualParameters); - assertPtInverseEquals(message,ptInverse,actualParameters); - } - - protected void assertD0Equals(String message, double expected, double[] actualParameters) { - assertEquals(message+" Wrong d0.",expected,actualParameters[0],TOLERANCE); - } - - protected void assertZ0Equals(String message, double expected, double[] actualParameters) { - assertEquals(message+" Wrong z0.",expected,actualParameters[1],TOLERANCE); - } - - protected void assertPhi0Equals(String message, double expected, double[] actualParameters) { - assertEquals(message+" Wrong phi0.",expected,actualParameters[2],TOLERANCE); - } - - protected void assertTLEquals(String message, double expected, double[] actualParameters) { - assertEquals(message+" Wrong tL.",expected,actualParameters[3],TOLERANCE); - } - - protected void assertPtInverseEquals(String message, double expected, double[] actualParameters) { - assertEquals(message+" Wrong ptInverse.",expected,actualParameters[4],TOLERANCE); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/event/AEventInfoTest.java b/graphics/AtlantisJava/test/src/atlantis/event/AEventInfoTest.java deleted file mode 100644 index 8c541eecb5e7..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/event/AEventInfoTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package atlantis.event; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class AEventInfoTest { - private static final long eventNumber=12345; - private static final long runNumber=123; - - @Test - public void testAEventInfoCreation() { - AEventInfo e = new AEventInfo(eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - assertAEventInfo(e,eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - } - - /** - * Create AEventInfo object with null or other special values for parameters. - */ - @Test - public void testAEventInfoCreationChecks() { - AEventInfo e1 = new AEventInfo(eventNumber,runNumber,null,null,null,null); - assertAEventInfo(e1,eventNumber,runNumber,"n/a","n/a","default","default"); - AEventInfo e2 = new AEventInfo(eventNumber,runNumber,null,null,"blah-1","blah-1"); - assertAEventInfo(e2,eventNumber,runNumber,"n/a","n/a","default","default"); - } - - @Test - public void testAEventCopyConstructor() { - AEventInfo e0 = new AEventInfo(eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - AEventInfo e = new AEventInfo(e0); - assertAEventInfo(e,eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - } - - @Test - public void testHashCode() { - // Check different run/event numbers give different hash codes - AEventInfo e1 = new AEventInfo(eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - AEventInfo e2 = new AEventInfo(eventNumber+1,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - AEventInfo e3 = new AEventInfo(eventNumber,runNumber+1,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - int h1 = e1.hashCode(); - int h2 = e2.hashCode(); - int h3 = e3.hashCode(); - assertTrue("hash codes should be different for e1,e2",h2!=h1); - assertTrue("hash codes should be different for e1,e3",h1!=h3); - assertTrue("hash codes should be different for e2,e3",h2!=h3); - } - - @Test - public void testEqualsAEventInfo() { - AEventInfo e1a = new AEventInfo(eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - AEventInfo e1b = new AEventInfo(eventNumber,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - AEventInfo e2 = new AEventInfo(eventNumber+1,runNumber,"TIME","SOURCE","LUMIBLOCK","EVENTPROPERTIES"); - assertTrue("equals should return true for e1a,e1b",e1a.equals(e1b)); - assertFalse("equals should return false for e1a,e2",e1a.equals(e2)); - } - - /** Check values in AEventInfo object */ - private void assertAEventInfo(AEventInfo eventInfo, long event, long run, String time, String source, String lumiBlock, String eventProperties) { - assertEquals("event number not set correctly",event,eventInfo.getEventNumber()); - assertEquals("run number not set correctly",run,eventInfo.getRunNumber()); - assertEquals("time not set correctly",time,eventInfo.getDateTime()); - assertEquals("source not set correctly",source,eventInfo.getSourceName()); - assertEquals("source not set correctly",lumiBlock,eventInfo.getLumiBlock()); - assertEquals("event properties not set correctly",eventProperties,eventInfo.getEventProperties()); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/graphics/ACoordTest.java b/graphics/AtlantisJava/test/src/atlantis/graphics/ACoordTest.java deleted file mode 100644 index 24f5de94ef37..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/graphics/ACoordTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package atlantis.graphics; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import atlantis.parameters.APar; -import static org.junit.Assert.*; - -public class ACoordTest { - private static final double TOLERANCE = 0.001; - - @BeforeClass - public static void setUpOnce() throws Exception { - APar.constructDummyForTesting(); - } - - @Test - public void constructACoordWithOnePoint() { - ACoord coord = new ACoord(0.0, 0.0, 0); - Point2D.Double point = new Point2D.Double(0.0,0.0); - assertContainsPoints(coord,point); - } - - @Test - public void constructACoordWithOneArrayOfPoints() { - double[] h = {0.0, 1.0, -1.0, 2.5}; - double[] v = {0.0, 0.0, 1.0, -2.5}; - ACoord coord = new ACoord(h,v); - Point2D.Double[] expectedPoints = createPointsArray(h,v); - assertContainsPoints(coord,expectedPoints); - } - - /** - * Currently just checks first set of points, i.e. x = hv[0][0][i], y = [1][0][i] - * @param coord - * @param points - */ - protected static void assertContainsPoints(ACoord coord, Point2D.Double... points) { - double[] x = coord.hv[0][0]; - double[] y = coord.hv[1][0]; - int xLen = x.length; - int yLen = y.length; - assertTrue(String.format( - "Numbers of x and y coordinates are not equal: %d, %d",xLen,yLen), - xLen==yLen); - assertTrue(String.format( - "Wrong number of points: expected %d, found %d",points.length,xLen), - points.length==xLen); - int i=0; - for (Point2D.Double point : points) { - Point2D.Double hvPoint = new Point2D.Double(x[i],y[i]); - double distance = hvPoint.distance(point); - if (distance>TOLERANCE) { - fail(String.format("Didn't find expected points. First difference is point %d: expected (%f,%f), found (%f,%f)", - i,point.x,point.y,hvPoint.x,hvPoint.y)); - } - i++; - } - } - - private Point2D.Double[] createPointsArray(double[] x, double[] y) { - Point2D.Double[] points = new Point2D.Double[x.length]; - for (int i=0; i<x.length; i++) { - points[i] = new Point2D.Double(x[i], y[i]); - } - return points; - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/list/AListManagerTest.java b/graphics/AtlantisJava/test/src/atlantis/list/AListManagerTest.java deleted file mode 100644 index 3b2e70bd5bff..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/list/AListManagerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package atlantis.list; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import atlantis.utils.A4Vector; - -public class AListManagerTest { - private static final double TOLERANCE = 0.00001; - - @Test - public void testTotalEt() { - Summarizer summ = new Summarizer(); - A4Vector pos = new A4Vector(3.0,0,0,4.0); - String posDescription = "A positive 4vector"; - A4Vector neg = new A4Vector(-3.0,0,0,4.0); - String negDescription = "A negative 4vector"; - summ.addAndGetInfo(pos, posDescription); - summ.addAndGetInfo(neg, negDescription); - double totalEt = summ.getTotalEt(); - assertEquals(totalEt,10.0,TOLERANCE); - } - - @Test - public void testTotalPt() { - Summarizer summ = new Summarizer(); - A4Vector pos = new A4Vector(3.0,0,0,4.0); - String posDescription = "A positive 4vector"; - A4Vector neg = new A4Vector(-3.0,0,0,4.0); - String negDescription = "A negative 4vector"; - summ.addAndGetInfo(pos, posDescription); - summ.addAndGetInfo(neg, negDescription); - double totalPt = summ.getTotalPt(); - assertEquals(totalPt,0.0,TOLERANCE); - } - - @Test - public void testTotalMt() { - Summarizer summ = new Summarizer(); - A4Vector pos = new A4Vector(3.0,0,0,4.0); - String posDescription = "A positive 4vector"; - A4Vector neg = new A4Vector(-3.0,0,0,4.0); - String negDescription = "A negative 4vector"; - summ.addAndGetInfo(pos, posDescription); - summ.addAndGetInfo(neg, negDescription); - double totalMt = summ.getTotalMt(); - assertEquals(totalMt,10.0,TOLERANCE); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/parameters/AAbstractParameterTest.java b/graphics/AtlantisJava/test/src/atlantis/parameters/AAbstractParameterTest.java deleted file mode 100644 index c2df08a2a554..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/parameters/AAbstractParameterTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package atlantis.parameters; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import testutils.AtlantisInit; - -import atlantis.canvas.ACanvas; - -/** - * Tests for AAbstractParameter. - * @author waugh - * - */ -public class AAbstractParameterTest { - /** Arbitrary tolerance for floating-point comparisons */ - private static final double TOLERANCE = 0.00001; - - private AAbstractParameter parameter; - - @Before - public void setUp() throws Exception { - AtlantisInit.init(); - APar.constructDummyForTesting(); - ACanvas.constructDummyForTesting(); - parameter = new AAbstractParameter("name", "screen name", null, 0, 0, null, null, false, false, false, 0, 0, 0) { - {wCount = 1; data = new AParameterData(wCount);} - public void setD(double v) {} - public void setI(int v) {} - public void refresh() {} - }; - } - - @Test - public void testAAbstractParameter() { - assertNotNull(parameter); - } - - @Test - public void testSaveAndRestoreDefaults() { - // Access member variables directly since set and other methods rely on - // information about existing windows. Rely on uninitialized - // APar.currentIndex being zero. - - // Set value, status etc. - parameter.valueType = AAbstractParameter.FLOAT; - parameter.data.setValue(1.0); - parameter.data.setStatus(false); - parameter.data.setOperator(""); - parameter.range = AAbstractParameter.resolvePossibleValues("0:10", AAbstractParameter.FLOAT); - parameter._setD(1.0); - parameter.hasStatus = true; - parameter.setStatus(true); - parameter._setOperator("A"); // no restriction on value of operator? - parameter.setScope(AAbstractParameter.LOCAL); - // Save current settings as defaults then change them - parameter.saveDefaults(); - parameter._setD(2.0); - parameter.setStatus(false); - parameter._setOperator("B"); - parameter.setScope(AAbstractParameter.GLOBAL); - // Make sure the current settings have changed - double value = parameter.getD(); - boolean status = parameter.getStatus(); - String operator = parameter.getOperator(); - int scope = parameter.getScope(); - assertEquals("parameter value not changed from default",2.0,value,TOLERANCE); - assertEquals("parameter status not changed from default",false,status); - assertEquals("parameter operator not changed from default","B",operator); - assertEquals("parameter scope not changed from default",AAbstractParameter.GLOBAL,scope); - // Then restore defaults and verify the original settings are back - parameter.restoreDefaults(); - double restoredValue = parameter.getD(); - boolean restoredStatus = parameter.getStatus(); - String restoredOperator = parameter.getOperator(); - int restoredScope = parameter.getScope(); - assertEquals("parameter value not set to default",1.0,restoredValue,TOLERANCE); - assertEquals("parameter status not set to default",true,restoredStatus); - assertEquals("parameter operator not set to default","A",restoredOperator); - assertEquals("parameter scope not set to default",AAbstractParameter.LOCAL,restoredScope); - } - - @Test - public void testPossibleValuesFloat() { - parameter.valueType = AAbstractParameter.FLOAT; - String possibleValues = "1.0:2.0,3.0:4.5"; - parameter.range = AAbstractParameter.resolvePossibleValues(possibleValues, AAbstractParameter.FLOAT); - assertValidValue(parameter,possibleValues,1.2); - assertValidValue(parameter,possibleValues,4.4); - assertInvalidValue(parameter,possibleValues,0.9); - assertInvalidValue(parameter,possibleValues,2.1); - assertInvalidValue(parameter,possibleValues,9.9); - assertInvalidValue(parameter,possibleValues,-1.2); - } - - @Test - public void testPossibleValuesInt() { - parameter.valueType = AAbstractParameter.INT; - String possibleValues = "1,2,4"; - parameter.range = AAbstractParameter.resolvePossibleValues(possibleValues, AAbstractParameter.FLOAT); - assertValidValue(parameter,possibleValues,1); - assertValidValue(parameter,possibleValues,2); - assertValidValue(parameter,possibleValues,4); - assertInvalidValue(parameter,possibleValues,3); - assertInvalidValue(parameter,possibleValues,-1); - } - - private static void assertValidValue(AAbstractParameter parameter, String possibleValues, double value) { - boolean validated = parameter.validateValue(value); - assertTrue(String.format("Value %f incorrectly fails validation with possible values %s",value,possibleValues),validated); - } - - private static void assertInvalidValue(AAbstractParameter parameter, String possibleValues, double value) { - boolean validated = parameter.validateValue(value); - assertFalse(String.format("Value %f incorrectly passes validation with possible values %s",value,possibleValues),validated); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/parameters/AParameterDataTest.java b/graphics/AtlantisJava/test/src/atlantis/parameters/AParameterDataTest.java deleted file mode 100644 index afab7d5293af..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/parameters/AParameterDataTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package atlantis.parameters; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * We don't test the methods that call APar to find out the current window, - * which is not defined in unit tests. - * - * @author waugh - * - */ -public class AParameterDataTest { - private static final int numWindows = 3; - private static final double TOLERANCE = 0.001; - - private AParameterData paramData; - - @Before - public void setUp() { - APar.constructDummyForTesting(); - paramData = new AParameterData(numWindows); - } - - @Test - /** - * Check default values for all windows. - */ - public void constructDefault() { - for (int iWindow=0; iWindow<numWindows; ++iWindow) { - AParameterState state = paramData.getState(iWindow); - assertValuesEqual("Default state is wrong.",0.0,false,"",state); - } - } - - @Test - /** - * Copy values from window 1 to window 2. - */ - public void copyValues() { - paramData.setValue(1, 1.0); - paramData.setStatus(1, true); - paramData.setOperator(1, "+"); - paramData.copy(1, 2); - AParameterState state = paramData.getState(2); - assertValuesEqual("Copied state is wrong.",1.0,true,"+",state); - } - - @Test - public void saveAndRestoreValues() { - paramData.setValue(1, 1.0); - paramData.setStatus(1, true); - paramData.setOperator(1, "+"); - paramData.saveDefaults(); - paramData.setValue(1, 2.0); - paramData.setStatus(1, false); - paramData.setOperator(1, "-"); - AParameterState state = paramData.getState(1); - assertValuesEqual("Set state is wrong.",2.0,false,"-",state); - paramData.restoreDefaults(); - state = paramData.getState(1); - assertValuesEqual("Restored state is wrong.",1.0,true,"+",state); - } - - @Test - public void testGlobalize() { - paramData.setValue(1, 1.0); - paramData.setStatus(1, true); - paramData.setOperator(1, "+"); - paramData.globalize(1); - for (int iWindow=0; iWindow<numWindows; ++iWindow) { - AParameterState state = paramData.getState(iWindow); - assertValuesEqual("State wrong after globalization.",1.0,true,"+",state); - } - } - - private static void assertValuesEqual(String message, double value, boolean status, String operator, AParameterState actual) { - assertEquals(message+" Wrong value.",value,actual.value,TOLERANCE); - assertEquals(message+" Wrong status.",status,actual.status); - assertEquals(message+" Wrong operator.",operator,actual.operator); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/utils/A3VectorTest.java b/graphics/AtlantisJava/test/src/atlantis/utils/A3VectorTest.java deleted file mode 100644 index 0b88546b31d6..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/utils/A3VectorTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package atlantis.utils; - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Tests for A3Vector class. Initial rather clumsy implementation just to get started. - * @author waugh - * - */ -public class A3VectorTest { - /** Arbitrary tolerance for floating-point comparisons */ - private static final double TOLERANCE = 0.00001; - - @Test - public void testA3Vector() { - A3Vector v = new A3Vector(); - assertA3VectorEquals("three-vector",0.0,0.0,0.0,v,TOLERANCE); - } - - @Test - public void testA3VectorDoubleDoubleDouble() { - A3Vector v = new A3Vector(1.0,-2.5,3.3); - assertA3VectorEquals("three-vector",1.0,-2.5,3.3,v,TOLERANCE); - } - - @Test - public void testFromEtaPhiR() { - A3Vector v = A3Vector.fromEtaPhiR(0.0, Math.PI, 2.0); - assertA3VectorEquals("three-vector",-2.0,0.0,0.0,v,TOLERANCE); - } - - @Test - public void testFromRhoPhiZ() { - A3Vector v = A3Vector.fromRhoPhiZ(1.0, Math.PI, 1.0); - assertA3VectorEquals("three-vector",-1.0,0.0,1.0,v,TOLERANCE); - } - - @Test - public void testGetNormalized() { - A3Vector v0 = new A3Vector(1.0,1.0,1.0); - double a = 1 / Math.sqrt(3); - A3Vector v = v0.getNormalized(); - assertA3VectorEquals("three-vector",a,a,a,v,TOLERANCE); - } - - @Test - public void testNormalize() { - A3Vector v = new A3Vector(1.0,1.0,1.0); - v.normalize(); - double a = 1 / Math.sqrt(3); - assertA3VectorEquals("three-vector",a,a,a,v,TOLERANCE); - } - - @Test - public void testMagnitude() { - A3Vector v = new A3Vector(1.0,1.0,1.0); - double r = v.magnitude(); - double rExpected = Math.sqrt(3); - assertEquals("magnitude calculation",rExpected,r,TOLERANCE); - } - - @Test - public void testScale() { - A3Vector v = new A3Vector(1.0,1.0,1.0); - v.scale(0.5); - assertA3VectorEquals("three-vector",0.5,0.5,0.5,v,TOLERANCE); - } - - @Test - public void testAdd() { - A3Vector v = new A3Vector(1.0,2.0,3.0); - A3Vector v0 = new A3Vector(0.0,1.0,-0.5); - v.add(v0); - assertA3VectorEquals("three-vector",1.0,3.0,2.5,v,TOLERANCE); - } - - @Test - public void testSubtract() { - A3Vector v = new A3Vector(1.0,2.0,3.0); - A3Vector v0 = new A3Vector(0.0,1.0,-0.5); - v.subtract(v0); - assertA3VectorEquals("three-vector",1.0,1.0,3.5,v,TOLERANCE); - } - - /** - * Check given A3Vector has expected components - */ - private static void assertA3VectorEquals(String message, double x, double y, double z, - A3Vector v, double delta) { - if (Math.abs(v.x-x)>delta || Math.abs(v.y-y)>delta || - Math.abs(v.z-z)>delta) { - String vExpected = String.format("<%f,%f,%f>", x,y,z); - String vActual = String.format("<%f,%f,%f>", v.x,v.y,v.z); - String summary = message+" "+ - "expected:"+vExpected+" but was:"+vActual; - fail(summary); - } - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/utils/A4VectorTest.java b/graphics/AtlantisJava/test/src/atlantis/utils/A4VectorTest.java deleted file mode 100644 index 03fb94f20012..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/utils/A4VectorTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package atlantis.utils; - - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Tests for A4Vector class. - */ -public class A4VectorTest { - /** Arbitrary tolerance for floating-point comparisons */ - private static final double TOLERANCE = 0.00001; - - @Test - public void testA4Vector() { - A4Vector v = new A4Vector(); - assertA4VectorEquals("construct zero 4-vector",0.0,0.0,0.0,0.0,v,TOLERANCE); - } - - @Test - public void testA4VectorDoubleDoubleDoubleDouble() { - // fourth argument is mass, not energy - // use 3-4-5 numbers for simple arithmetic - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - assertA4VectorEquals("construct 4-vector",2.0,2.0,-1.0,5.0,v,TOLERANCE); - } - - @Test - public void testA4VectorA3VectorDouble() { - A3Vector v3 = new A3Vector(2.0,2.0,-1.0); - A4Vector v = new A4Vector(v3,4.0); - assertA4VectorEquals("construct 4-vector",2.0,2.0,-1.0,5.0,v,TOLERANCE); - } - - @Test - public void testSet() { - A4Vector v = new A4Vector(); - v.set(2.0,2.0,-1.0,4.0); - assertA4VectorEquals("set 4-vector",2.0,2.0,-1.0,5.0,v,TOLERANCE); - } - - @Test - public void testSetPtEtaPhiM() { - A4Vector v1 = new A4Vector(); - v1.setPtEtaPhiM(1.0, 0.0, 0.0, 0.0); - assertA4VectorEquals("set 4-vector",1.0,0.0,0.0,1.0,v1,TOLERANCE); - // test with negative pT - A4Vector v2 = new A4Vector(); - v2.setPtEtaPhiM(-1.0, 0.0, 0.0, 0.0); - assertA4VectorEquals("set 4-vector",1.0,0.0,0.0,1.0,v2,TOLERANCE); - } - - @Test - public void testGetP() { - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - double p = v.getP(); - assertEquals(3.0,p,TOLERANCE); - } - - @Test - public void testGetPt() { - A4Vector v = new A4Vector(0.3,0.4,-1.0,4.0); - double pt = v.getPt(); - assertEquals(0.5,pt,TOLERANCE); - } - - @Test - public void testGetE() { - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - double e = v.getE(); - assertEquals(5.0,e,TOLERANCE); - } - - @Test - public void testgetEt() { - A4Vector v = new A4Vector(1.0,1.0,2.0,3.0); - double et = v.getEt(); - double x = Math.sqrt(5.0); - assertEquals(x,et,TOLERANCE); - } - - @Test - public void testGetMass() { - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - double m = v.getMass(); - assertEquals(4.0,m,TOLERANCE); - } - - @Test - public void testGetMt() { - A4Vector v = new A4Vector(1.0,1.0,2.0,3.0); - double mt = v.getMt(); - double x = Math.sqrt(3.0); - assertEquals(x,mt,TOLERANCE); - } - - @Test - public void testAddDoubleDoubleDoubleDouble() { - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - v.add(2.2,2.2,-1.1,4.4); - assertA4VectorEquals("add 4-vectors",4.2,4.2,-2.1,10.5,v,TOLERANCE); - } - - @Test - public void testAddA4Vector() { - A4Vector v = new A4Vector(2.0,2.0,-1.0,4.0); - A4Vector v2 = new A4Vector(2.2,2.2,-1.1,4.4); - v.add(v2); - assertA4VectorEquals("add 4-vectors",4.2,4.2,-2.1,10.5,v,TOLERANCE); - } - - /** - * Check given A4Vector has expected components - */ - private static void assertA4VectorEquals(String message, double px, double py, double pz, double e, - A4Vector v, double delta) { - if (Math.abs(v.px-px)>delta || Math.abs(v.py-py)>delta || - Math.abs(v.pz-pz)>delta || Math.abs(v.e-e)>delta) { - String vExpected = String.format("<%f,%f,%f,%f>", px,py,pz,e); - String vActual = String.format("<%f,%f,%f,%f>", v.px,v.py,v.pz,v.e); - String summary = message+" "+ - "expected:"+vExpected+" but was:"+vActual; - fail(summary); - } - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/utils/AIdRangeTest.java b/graphics/AtlantisJava/test/src/atlantis/utils/AIdRangeTest.java deleted file mode 100644 index cae60427953a..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/utils/AIdRangeTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package atlantis.utils; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -/** - * Test for the IdHelper range class used to represent - * possible values of an identifier field. - * - * @author Eric Jansen - */ -public class AIdRangeTest { - - public AIdRangeTest() {} - - @Test - public void testEmptyRange() throws Exception { - AIdRange a = new AIdRange(); - AIdRange b = new AIdRange(new int[] {1, 2}); - - a.add(b); - assertEquals(a, b); - - b.add(a); - assertEquals(a, b); - } - - @Test - public void testContainsRange() throws Exception { - AIdRange a = new AIdRange(1, 3); - AIdRange b = new AIdRange(new int[] {1, 2, 4}); - AIdRange c = new AIdRange(1, 2); - - assert(a.contains(c)); - assert(b.contains(c)); - assert(!a.contains(b)); - assert(!b.contains(a)); - } - - @Test - public void testContainsValue() throws Exception { - AIdRange a = new AIdRange(-5, 5); - AIdRange b = new AIdRange(new int[] {-1, 3, 9}); - - assert(!a.contains(-6)); - assert(a.contains(-5)); - assert(a.contains(2)); - assert(a.contains(5)); - assert(!a.contains(6)); - - assert(b.contains(-1)); - assert(!b.contains(2)); - assert(b.contains(3)); - assert(b.contains(9)); - } - - @Test - public void testAddRange() throws Exception { - AIdRange a = new AIdRange(new int[] {-1, 0, 1, 2, 5, 6}); - AIdRange b = new AIdRange(new int[] {-1, 1, 2, 6}); - AIdRange c = new AIdRange(new int[] {0, 1, 2, 5}); - - b.add(c); - assert(a.equals(b)); - - AIdRange d = new AIdRange(-5, 5); - AIdRange e = new AIdRange(new int[] {-5, -4}); - AIdRange f = new AIdRange(-3, 5); - - e.add(f); - assert(d.equals(e)); - - AIdRange g = new AIdRange(0, 2); - AIdRange h = new AIdRange(new int[] {0, 1}); - AIdRange i = new AIdRange(new int[] {1, 2}); - - h.add(i); - assert(g.equals(h)); // comparing [ 0 -> 2 ] to [ 0 1 2 ] - } - - @Test - public void testToString() throws Exception { - AIdRange a = new AIdRange(-2, 15); - AIdRange b = new AIdRange(new int[] {2, 3, 5}); - AIdRange c = new AIdRange(); - assertEquals("[ -2 -> 15 ]", a.toString()); - assertEquals("[ 2 3 5 ]", b.toString()); - assertEquals("[ ]", c.toString()); - } -} diff --git a/graphics/AtlantisJava/test/src/atlantis/utils/AMathTest.java b/graphics/AtlantisJava/test/src/atlantis/utils/AMathTest.java deleted file mode 100644 index 8bb888866ac9..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/utils/AMathTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * - */ -package atlantis.utils; - -import static org.junit.Assert.*; -import org.junit.Test; - -import static java.lang.Math.PI; - -/** - * @author waugh - * - */ -public class AMathTest { - /** Arbitrary tolerance for floating-point comparisons */ - private static final double TOLERANCE = 0.00001; - - /** - * Test method for {@link atlantis.utils.AMath#nearestPhiDegrees(double)}. - */ - @Test - public void testNearestPhiDegreesDouble() { - assertEquals("Wrong value for phi",0.,AMath.nearestPhiDegrees(0.),TOLERANCE); - assertEquals("Wrong value for phi",0.,AMath.nearestPhiDegrees(360.),TOLERANCE); - assertEquals("Wrong value for phi",180.,AMath.nearestPhiDegrees(180.),TOLERANCE); - assertEquals("Wrong value for phi",1.,AMath.nearestPhiDegrees(1.),TOLERANCE); - assertEquals("Wrong value for phi",359.,AMath.nearestPhiDegrees(-1.),TOLERANCE); - } - - /** - * Test method for {@link atlantis.utils.AMath#nearestPhiRadians(double)}. - */ - @Test - public void testNearestPhiRadiansDouble() { - assertEquals("Wrong value for phi",0.,AMath.nearestPhiRadians(0.),TOLERANCE); - assertEquals("Wrong value for phi",0.,AMath.nearestPhiRadians(2*PI),TOLERANCE); - assertEquals("Wrong value for phi",PI,AMath.nearestPhiRadians(PI),TOLERANCE); - assertEquals("Wrong value for phi",0.1,AMath.nearestPhiRadians(0.1),TOLERANCE); - assertEquals("Wrong value for phi",2*PI-0.1,AMath.nearestPhiRadians(-0.1),TOLERANCE); - } - - /** - * Test method for {@link atlantis.utils.AMath#nearestPhiDegrees(double, double)}. - */ - @Test - public void testNearestPhiDegreesDoubleDouble() { - double phiMid = 360; // range [180,540) - assertEquals("Wrong value for phi",180.,AMath.nearestPhiDegrees(180.0,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",180.,AMath.nearestPhiDegrees(540.0,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",360.,AMath.nearestPhiDegrees(360.0,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",361.,AMath.nearestPhiDegrees(1.0,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",539.,AMath.nearestPhiDegrees(179.0,phiMid),TOLERANCE); - } - - /** - * Test method for {@link atlantis.utils.AMath#nearestPhiRadians(double, double)}. - */ - @Test - public void testNearestPhiRadiansDoubleDouble() { - double phiMid = 2*PI; // range [180,540) - assertEquals("Wrong value for phi",PI,AMath.nearestPhiRadians(PI,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",PI,AMath.nearestPhiRadians(PI,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",2*PI,AMath.nearestPhiRadians(2*PI,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",2*PI+0.1,AMath.nearestPhiRadians(0.1,phiMid),TOLERANCE); - assertEquals("Wrong value for phi",3*PI-0.1,AMath.nearestPhiRadians(PI-0.1,phiMid),TOLERANCE); - } - -} diff --git a/graphics/AtlantisJava/test/src/atlantis/utils/ANewIdHelperTest.java b/graphics/AtlantisJava/test/src/atlantis/utils/ANewIdHelperTest.java deleted file mode 100644 index bad4515a8e3e..000000000000 --- a/graphics/AtlantisJava/test/src/atlantis/utils/ANewIdHelperTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package atlantis.utils; - -import atlantis.globals.AGlobals; -import atlantis.utils.xml.AXMLErrorHandler; -import java.io.InputStream; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import org.junit.BeforeClass; -import org.junit.Test; -import org.w3c.dom.Document; -import testutils.AtlantisInit; - -/** - * Tests for the ANewIdHelper class. Tests are performed by fully - * decoding compact identifiers of several subsystems. - * - * @author Eric Jansen - */ -public class ANewIdHelperTest { - - public ANewIdHelperTest() {} - - @BeforeClass - public static void setUpClass() throws Exception { - AtlantisInit.init(); - String geometryBase = AGlobals.instance().getHomeDirectory() + "geometry/"; - InputStream isIdDict = AUtilities.getFileAsStream(geometryBase + "ATLAS_IDS.xml"); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(true); - DocumentBuilder parser = factory.newDocumentBuilder(); - parser.setErrorHandler(new AXMLErrorHandler()); - - Document xmlDictDoc = parser.parse(isIdDict, geometryBase); - ANewIdHelper.construct(xmlDictDoc.getDocumentElement()); - - System.out.println("The loaded identifier structure is:\n" - + ANewIdHelper.instance().getDictionary("ATLAS")); - } - - @Test - public void testPixel() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("InnerDetector/Pixel/negative_endcap/0/15/0/86/76", idHelper.getFullIdentifier(8661285809946624l)); - } - - @Test - public void testSCT() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("InnerDetector/SCT/negative_endcap/1/23/2/0/683", idHelper.getFullIdentifier(137085611)); - assertEquals("InnerDetector/SCT/positive_endcap/8/50/0/1/609", idHelper.getFullIdentifier(219756129)); - } - - @Test - public void testTRT() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("InnerDetector/TRT/negative_endcap/2/2/6/7", idHelper.getFullIdentifier(270604512)); - assertEquals("InnerDetector/TRT/negative_endcap/11/1/7/9", idHelper.getFullIdentifier(280010016)); - assertEquals("InnerDetector/TRT/negative_barrel/9/0/18/7", idHelper.getFullIdentifier(311445728)); - assertEquals("InnerDetector/TRT/positive_barrel/5/2/22/10", idHelper.getFullIdentifier(340875584)); - assertEquals("InnerDetector/TRT/positive_endcap/7/10/1/13", idHelper.getFullIdentifier(376767904)); - assertEquals("InnerDetector/TRT/positive_endcap/31/13/7/18", idHelper.getFullIdentifier(402038336)); - } - - @Test - public void testLAr() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("LArCalorimeter/LArEM/negative-endcap-outer-wheel/2/1/37/72", idHelper.getFullIdentifier(3225785215439863808l)); - assertEquals("LArCalorimeter/LArEM/positive-barrel/1/0/167/15", idHelper.getFullIdentifier(765546014)); - assertEquals("LArCalorimeter/LArEM/negative-barrel/2/0/4/113", idHelper.getFullIdentifier(759171298)); - } - - @Test - public void testTILE() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("TileCalorimeter/Barrel/positive/28/0/1/0/0", idHelper.getFullIdentifier(1149698064)); - assertEquals("TileCalorimeter/Extended-barrel/negative/0/14/0/0/0", idHelper.getFullIdentifier(1207963136)); - } - - @Test - public void testHEC() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("LArCalorimeter/LArHEC/negative-endcap-outer-wheel/1/0/5/22", idHelper.getFullIdentifier(815095808)); - assertEquals("LArCalorimeter/LArHEC/negative-endcap-outer-wheel/2/0/6/22", idHelper.getFullIdentifier(823746560)); - assertEquals("LArCalorimeter/LArHEC/positive-endcap-outer-wheel/2/1/2/20", idHelper.getFullIdentifier(860438528)); - assertEquals("LArCalorimeter/LArHEC/positive-endcap-outer-wheel/3/0/8/0", idHelper.getFullIdentifier(866123776)); - assertEquals("LArCalorimeter/LArHEC/positive-endcap-outer-wheel/3/1/3/29", idHelper.getFullIdentifier(869126144)); - } - - @Test - public void testFCAL() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("LArCalorimeter/LArFCAL/negative-endcap-outer-wheel/1/4/13", idHelper.getFullIdentifier(873046016)); - assertEquals("LArCalorimeter/LArFCAL/negative-endcap-outer-wheel/1/45/0", idHelper.getFullIdentifier(878313472)); - assertEquals("LArCalorimeter/LArFCAL/positive-endcap-outer-wheel/1/3/0", idHelper.getFullIdentifier(906362880)); - assertEquals("LArCalorimeter/LArFCAL/positive-endcap-outer-wheel/2/23/14", idHelper.getFullIdentifier(917487616)); - assertEquals("LArCalorimeter/LArFCAL/positive-endcap-outer-wheel/3/15/15", idHelper.getFullIdentifier(924835840)); - } - - @Test - public void testMDT() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("MuonSpectrometer/BIL/-6/1/MDT/1/3/1", idHelper.getFullIdentifier(6922067811640541184l)); - assertEquals("MuonSpectrometer/BIL/-6/2/MDT/2/2/34", idHelper.getFullIdentifier(1611748384)); - assertEquals("MuonSpectrometer/BIL/1/5/MDT/1/2/3", idHelper.getFullIdentifier(1615597632)); - assertEquals("MuonSpectrometer/BOL/1/5/MDT/1/2/7", idHelper.getFullIdentifier(1682706624)); - assertEquals("MuonSpectrometer/EOL/2/3/MDT/2/1/6", idHelper.getFullIdentifier(1884438688)); - assertEquals("MuonSpectrometer/EIS/-1/6/MDT/2/3/36", idHelper.getFullIdentifier(2050843744)); - } - - @Test - public void testRPC() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("MuonSpectrometer/BML/-6/6/RPC/1/2/2/2/0/4", idHelper.getFullIdentifier(1645583372)); - } - - @Test - public void testCSC() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("MuonSpectrometer/CSS/-1/1/CSC/2/4/0/6", idHelper.getFullIdentifier(2064056960)); - } - - @Test - public void testTGC() throws Exception { - ANewIdHelper idHelper = ANewIdHelper.instance(); - assertEquals("MuonSpectrometer/T4E/1/10/TGC/2/1/15", idHelper.getFullIdentifier(2035436656)); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/AAssert.java b/graphics/AtlantisJava/test/src/guitest/AAssert.java deleted file mode 100644 index 0010a9594878..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/AAssert.java +++ /dev/null @@ -1,28 +0,0 @@ -package guitest; - -import static org.junit.Assert.*; - -import java.util.Arrays; - -/** - * Useful assertion methods for tests. - * @author waugh - * - */ -public class AAssert { - public static void assertArrayEqualsIgnoreOrder(String message, - Object[] expecteds, Object[] actuals) { - int lengthExp = expecteds.length; - int lengthAct = actuals.length; - if (lengthAct!=lengthExp) fail(message+ - ": array lengths differed, "+ - String.format("expected.length=%d,actual.length=%d",lengthExp,lengthAct)); - Object[] copyExpecteds = new Object[lengthExp]; - System.arraycopy(expecteds,0,copyExpecteds,0,lengthExp); - Object[] copyActuals = new Object[lengthAct]; - System.arraycopy(actuals,0,copyActuals,0,lengthAct); - Arrays.sort(copyExpecteds); - Arrays.sort(copyActuals); - assertArrayEquals(message,copyExpecteds,copyActuals); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/AtlantisGUIFixture.java b/graphics/AtlantisJava/test/src/guitest/AtlantisGUIFixture.java deleted file mode 100644 index 5d49d4fae4e9..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/AtlantisGUIFixture.java +++ /dev/null @@ -1,141 +0,0 @@ -package guitest; - -import java.awt.Dialog; -import java.io.File; - -import org.fest.swing.core.BasicComponentFinder; -import org.fest.swing.core.ComponentFinder; -import org.fest.swing.core.ComponentFoundCondition; -import org.fest.swing.core.Robot; -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.core.matcher.FrameMatcher; -import org.fest.swing.core.matcher.JButtonMatcher; -import org.fest.swing.data.TableCell; -import org.fest.swing.data.TableCellByColumnId; -import org.fest.swing.exception.ComponentLookupException; -import org.fest.swing.fixture.DialogFixture; -import org.fest.swing.fixture.FrameFixture; -import org.fest.swing.fixture.JButtonFixture; -import org.fest.swing.fixture.JFileChooserFixture; -import org.fest.swing.fixture.JTabbedPaneFixture; -import org.fest.swing.fixture.JTableCellFixture; -import org.fest.swing.fixture.JTableFixture; -import org.fest.swing.fixture.JToolBarFixture; -import org.fest.swing.timing.Pause; - -import static org.junit.Assert.*; - -import atlantis.gui.AGUI; - -/** - * Fixture for testing the Atlantis GUI (class AGUI). - * @author waugh - * - */ -public class AtlantisGUIFixture extends FrameFixture { - private Robot robot; - private ComponentFinder finder; - private FrameFixture guiFixture; - - /** - * Construct and return AtlantisGUIFixture using specified robot. - * @param robot the robot to use - * @return fixture for the Atlantis GUI - */ - public static AtlantisGUIFixture getFixture(Robot robot) { - ComponentFinder finder = BasicComponentFinder.finderWithCurrentAwtHierarchy(); - FrameMatcher matcherGuiTitle = FrameMatcher.withTitle("Atlantis GUI"); - ComponentFoundCondition guiFound = new ComponentFoundCondition("Atlantis GUI found", - finder, matcherGuiTitle); - Pause.pause(guiFound,30000); - AGUI gui = (AGUI) guiFound.found(); - return new AtlantisGUIFixture(robot,gui); - } - - /** - * Construct AtlantisGUIFixture. - * @param robot - */ - public AtlantisGUIFixture(Robot robot, AGUI gui) { - super(robot,gui); - this.robot = robot; - this.finder = BasicComponentFinder.finderWithCurrentAwtHierarchy(); - this.guiFixture = new FrameFixture(robot,gui); - } - - /** Find AParametersTable for given supergroup and group */ - protected JTableFixture findParametersTable(String superGroup, String group) { - JTabbedPaneFixture tabs = guiFixture.tabbedPane("parameterGroups"); - tabs.selectTab(superGroup); - JTabbedPaneFixture subTabs = guiFixture.tabbedPane(superGroup); - subTabs.selectTab(group); - JTableFixture parametersTable = guiFixture.table(group); - return parametersTable; - } - - /** - * Find table cell containing given parameter. - * @param superGroup - * @param group - * @param parameter - * @return - */ - protected JTableCellFixture findParameterCell(String superGroup, String group, String parameter) { - JTableFixture table = findParametersTable(superGroup,group); - TableCell cellName = table.cell(parameter); - int row = cellName.row; // Row containing cell with specified name - JTableCellFixture cellValue = table.cell(TableCellByColumnId.row(row).columnId("Value")); - return cellValue; - } - - /** Find button in GUI with given text */ - protected JButtonFixture findGuiButton(String text) { - JButtonMatcher matcher = JButtonMatcher.withText(text); - return guiFixture.button(matcher); - } - - /** - * Open file using GUI - * @param file event file - */ - protected void openEventFile(File file) { - guiFixture.menuItemWithPath("File", "Read Event Locally").click(); - // Sometimes we have more than one "Open" dialog, but should be only one showing - Dialog dialogOpen = finder.find(DialogMatcher.withTitle("Open").andShowing()); - DialogFixture fixtureDialogOpen = new DialogFixture(robot,dialogOpen); - JFileChooserFixture fileChooser = fixtureDialogOpen.fileChooser(); - fileChooser.selectFile(file); - fileChooser.approve(); - } - - /** - * Open file using GUI and fail if there is a problem - * @param file event file - */ - protected void openEventFileAndCheck(File file) { - openEventFile(file); - try { - Dialog dialogInvalid = finder.find(DialogMatcher.withTitle("Invalid source")); - fail("Failed to open event: found invalid source dialog"); - } - catch (ComponentLookupException e) { - // OK: no warning dialog! - } - } - - /** - * Get a fixture for the event source tool bar. - * @return - */ - public JToolBarFixture findEventSourceToolBar() { - return new JToolBarFixture(robot,"Atlantis event source toolbar"); - } - - /** - * Get a fixture for the interactions tool bar. - * @return - */ - public JToolBarFixture findInteractionToolBar() { - return new JToolBarFixture(robot,"Atlantis interaction toolbar"); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/AtlantisGuiTestCase.java b/graphics/AtlantisJava/test/src/guitest/AtlantisGuiTestCase.java deleted file mode 100644 index 6c69d170207a..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/AtlantisGuiTestCase.java +++ /dev/null @@ -1,100 +0,0 @@ -package guitest; - -import java.awt.Frame; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - -import org.fest.swing.core.BasicComponentFinder; -import org.fest.swing.core.BasicRobot; -import org.fest.swing.core.ComponentFinder; -import org.fest.swing.core.Robot; -import org.fest.swing.core.matcher.FrameMatcher; -import org.fest.swing.edt.FailOnThreadViolationRepaintManager; -import org.fest.swing.fixture.FrameFixture; -import org.fest.swing.security.NoExitSecurityManagerInstaller; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; - -import testutils.AtlantisInit; -import testutils.TeeOutputStream; -import testutils.TestUtils; - -import atlantis.Atlantis; -import atlantis.globals.AGlobals; - -public class AtlantisGuiTestCase { - protected Robot robot; - protected ComponentFinder finder; - protected FrameFixture canvasFixture; - protected AtlantisGUIFixture guiFixture; - ByteArrayOutputStream stdOutCopy = new ByteArrayOutputStream(); - private static NoExitSecurityManagerInstaller noExitSecurityManagerInstaller; - - /** Time [ms] to pause at end of test for easier viewing */ - protected long pauseLength = 0; - - /** - * Install NoExitSecurityManager because JUnit gets upset if the forked JVM exits - */ - @BeforeClass - public static void setUpOnce() { - noExitSecurityManagerInstaller = NoExitSecurityManagerInstaller.installNoExitSecurityManager(); - } - - @AfterClass - public static void tearDownOnce() { - noExitSecurityManagerInstaller.uninstall(); - } - - @Before - public void setUp() { - startAtlantis(); - } - - protected void startAtlantis() { - AtlantisInit.init(); - String atlantisHomeDir=AGlobals.instance().getHomeDirectory(); - String testEventsDir = atlantisHomeDir+"/test/events"; - TestUtils.setPropertyIfNotSet("atlantis.test.events",testEventsDir); - - // Omit this for now since Atlantis main does not do set-up on EDT - // FailOnThreadViolationRepaintManager.install(); - - finder = BasicComponentFinder.finderWithCurrentAwtHierarchy(); - robot = BasicRobot.robotWithCurrentAwtHierarchy(); - - // Redirect standard output to ByteArrayOutputStream as well as normal System.out - TeeOutputStream teeOut = new TeeOutputStream(System.out,stdOutCopy); - System.setOut(new PrintStream(teeOut)); - - // Launch Atlantis application - String[] args = {"--debug","DEBUG"}; - Atlantis.main(args); - // Don't use ACrashReporter to handle uncaught exceptions - Thread.setDefaultUncaughtExceptionHandler(null); - - // Get fixtures for the GUI and Canvas - guiFixture = AtlantisGUIFixture.getFixture(robot); - FrameMatcher matcherCanvasTitle = FrameMatcher.withTitle("Atlantis Canvas"); - // Cannot cast to ACanvas because the ACanvas is actually a JPanel that creates its own - // parent JFrame. - Frame canvas = finder.find(matcherCanvasTitle); - canvasFixture = new FrameFixture(robot,canvas); - } - - @After - public void tearDown() { - pause(pauseLength); - } - - /** Pause for a second so can see end result on screen */ - protected static void pause(long duration) { - try { - Thread.sleep(duration); - } catch (InterruptedException e) { - // allow to return if interrupted - } - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/EnumeratorParameterTest.java b/graphics/AtlantisJava/test/src/guitest/EnumeratorParameterTest.java deleted file mode 100644 index 5b9c2fb1c649..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/EnumeratorParameterTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package guitest; - -import org.junit.Test; -import org.fest.swing.fixture.JComboBoxFixture; -import org.fest.swing.fixture.JTableCellFixture; - -public class EnumeratorParameterTest extends AtlantisGuiTestCase { - - @Test - public void test() { - JTableCellFixture cell = guiFixture.findParameterCell("MuonDet","Track","Track Collections"); - cell.click(); - JComboBoxFixture comboBox = guiFixture.comboBox("Track Collections"); - String[] contents = comboBox.contents(); - comboBox.selectItem("All"); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/EventSourceToolBarTest.java b/graphics/AtlantisJava/test/src/guitest/EventSourceToolBarTest.java deleted file mode 100644 index 15bb2f5481a3..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/EventSourceToolBarTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package guitest; - -import org.fest.swing.fixture.JToolBarFixture; -import org.junit.Test; - -public class EventSourceToolBarTest extends AtlantisGuiTestCase { - @Test - public void testEventSourceToolBar() { - JToolBarFixture toolBarFixture = guiFixture.findEventSourceToolBar(); - toolBarFixture.radioButton("Sequential mode").click(); - toolBarFixture.radioButton("Loop mode").click(); - toolBarFixture.radioButton("Random mode").click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/InteractionToolBarTest.java b/graphics/AtlantisJava/test/src/guitest/InteractionToolBarTest.java deleted file mode 100644 index ffe8a982a409..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/InteractionToolBarTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package guitest; - -import java.awt.event.KeyEvent; - -import org.fest.swing.fixture.JComboBoxFixture; -import org.fest.swing.fixture.JTextComponentFixture; -import org.fest.swing.fixture.JToolBarFixture; -import org.junit.Test; - -import static guitest.AAssert.*; - -public class InteractionToolBarTest extends AtlantisGuiTestCase { - @Test - public void testInteractionToolBar() { - JToolBarFixture toolBarFixture = guiFixture.findInteractionToolBar(); - - toolBarFixture.toggleButton("ZMR").click(); - - toolBarFixture.toggleButton("RubberBand").click(); - JComboBoxFixture rubberBandComboBox = toolBarFixture.comboBox(); - String[] listRubberBand = rubberBandComboBox.contents(); - String[] expectedRubberBand = {"RectangleYX","RotatedRectangle","Parallelogram", - "Square","XSkew","YSkew","XSlice","YSlice"}; - assertArrayEqualsIgnoreOrder("Didn't find expected rubberband list",expectedRubberBand,listRubberBand); - - toolBarFixture.toggleButton("Pick").click(); - JComboBoxFixture pickComboBox = toolBarFixture.comboBox(); - String[] listPick = pickComboBox.contents(); - String[] expectedPick = {"Event Data","Detectors"}; - assertArrayEqualsIgnoreOrder("Didn't find expected pick list",expectedPick,listPick); - - toolBarFixture.toggleButton("SyncCursors").click(); - - toolBarFixture.toggleButton("FishEye").click(); - JTextComponentFixture textBox = toolBarFixture.textBox(); - textBox.setText(""); // deleteText() does not work - textBox.enterText("5.0"); // this does not press "enter", so... - textBox.pressAndReleaseKeys(KeyEvent.VK_ENTER); // we do it here - toolBarFixture.checkBox().click(); // turn off fish-eye - toolBarFixture.checkBox().click(); // turn it on again - - toolBarFixture.toggleButton("Clock").click(); - toolBarFixture.checkBox().click(); // turn on clock transformation - toolBarFixture.checkBox().click(); // turn it on again - - toolBarFixture.toggleButton("Scale").click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/LoadEventFailureTest.java b/graphics/AtlantisJava/test/src/guitest/LoadEventFailureTest.java deleted file mode 100644 index 48e2cabb35b8..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/LoadEventFailureTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package guitest; - -import java.awt.Dialog; -import java.io.File; -import org.junit.Test; -import static org.junit.Assert.*; -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.exception.ComponentLookupException; - -public class LoadEventFailureTest extends AtlantisGuiTestCase { - @Test - public void loadEvent() { - guiFixture.openEventFile(new File("/nosuchfile")); - try { - Dialog dialogInvalid = finder.find(DialogMatcher.withTitle("Invalid source")); - // OK, correctly failed to open file - } - catch (ComponentLookupException e) { - fail("Did not find invalid source dialog when opening non-existent event file"); - } - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/LoadEventTest.java b/graphics/AtlantisJava/test/src/guitest/LoadEventTest.java deleted file mode 100644 index 7bfcaef27e66..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/LoadEventTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package guitest; - -import static org.junit.Assert.*; - -import java.awt.Dialog; -import java.io.File; - -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.exception.ComponentLookupException; -import org.junit.Test; - -public class LoadEventTest extends AtlantisGuiTestCase { - @Test - public void loadEvent() { - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFile(new File(eventsDirectory,"muonCollections.xml")); - try { - Dialog dialogInvalid = finder.find(DialogMatcher.withTitle("Invalid source")); - fail("Failed to open event: found invalid source dialog"); - } - catch (ComponentLookupException e) { - // OK - } - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/LoadEventWithInvalidRecVertexDataTest.java b/graphics/AtlantisJava/test/src/guitest/LoadEventWithInvalidRecVertexDataTest.java deleted file mode 100644 index 7cb70d7e2c55..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/LoadEventWithInvalidRecVertexDataTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package guitest; - -import static org.junit.Assert.*; - -import java.awt.Dialog; -import java.io.File; - -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.exception.ComponentLookupException; -import org.junit.Test; - -public class LoadEventWithInvalidRecVertexDataTest extends AtlantisGuiTestCase { - @Test - public void loadEvent() { - String output = stdOutCopy.toString(); - assertTrue("Output does not contain \"Atlantis Ready\"",output.contains("Atlantis Ready")); - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFile(new File(eventsDirectory,"rvxInconsistentEvent.xml")); - try { - Dialog dialogInvalid = finder.find(DialogMatcher.withTitle("Invalid source")); - fail("Failed to open event: found invalid source dialog"); - } - catch (ComponentLookupException e) { - // OK - } - output = stdOutCopy.toString(); - assertTrue("Failed to detect inconsistent track numbers",output.contains("RVx: numbers of tracks are inconsistent.")); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/LoadEventWithValidRecVertexDataTest.java b/graphics/AtlantisJava/test/src/guitest/LoadEventWithValidRecVertexDataTest.java deleted file mode 100644 index 846af19bf93d..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/LoadEventWithValidRecVertexDataTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package guitest; - -import static org.junit.Assert.*; - -import java.awt.Dialog; -import java.io.File; - -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.exception.ComponentLookupException; -import org.junit.Test; - -public class LoadEventWithValidRecVertexDataTest extends AtlantisGuiTestCase { - @Test - public void loadEvent() { - String output = stdOutCopy.toString(); - assertTrue("Output does not contain \"Atlantis Ready\"",output.contains("Atlantis Ready")); - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFile(new File(eventsDirectory,"rvxEvent.xml")); - try { - Dialog dialogInvalid = finder.find(DialogMatcher.withTitle("Invalid source")); - fail("Failed to open event: found invalid source dialog"); - } - catch (ComponentLookupException e) { - // OK - } - output = stdOutCopy.toString(); - assertFalse("Inconsistent data incorrectly detected",output.contains("RVx: numbers of tracks are inconsistent.")); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/LoadEventsManyTimesTest.java b/graphics/AtlantisJava/test/src/guitest/LoadEventsManyTimesTest.java deleted file mode 100644 index d395260b2f4a..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/LoadEventsManyTimesTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package guitest; - -import java.io.File; -import org.junit.Test; -import org.fest.swing.fixture.JButtonFixture; -import org.fest.swing.fixture.JToolBarFixture; - -public class LoadEventsManyTimesTest extends AtlantisGuiTestCase { - - private static final int numEvents = 9; - private static final int numRepeats = 3; - - @Test(timeout=45000) - public void readEvents() { - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFileAndCheck(new File(eventsDirectory,"masterclassMuonEvents.zip")); - JToolBarFixture toolBarFixture = guiFixture.findEventSourceToolBar(); - JButtonFixture nextButton = toolBarFixture.button("nextButton"); - JButtonFixture previousButton = toolBarFixture.button("previousButton"); - for (int i=0; i<numRepeats; i++) { - for (int iEvent=0; iEvent<(numEvents-1); iEvent++) { - System.out.println("Click number "+iEvent); - nextButton.click(); - } - for (int iEvent=0; iEvent<(numEvents-1); iEvent++) { - System.out.println("Click number "+iEvent); - previousButton.click(); - } - } - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsEmptyTest.java b/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsEmptyTest.java deleted file mode 100644 index dddeb873b61f..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsEmptyTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package guitest; - -import java.io.File; -import org.junit.Test; -import org.fest.swing.fixture.JComboBoxFixture; -import org.fest.swing.fixture.JTableCellFixture; -import static guitest.AAssert.*; - -/** - * Check list of muon track collections for Trac bug #507 - * Should be empty in empty event! - * @author waugh - * - */ -public class MuonTrackCollectionsEmptyTest extends AtlantisGuiTestCase { - @Test - public void loadEvents() { - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFileAndCheck(new File(eventsDirectory,"muonCollections.xml")); - checkMuonTrackCollections("ConvertedMBoyTracks", - "ConvertedMBoyMuonSpectroOnlyTracks", - "All"); - guiFixture.openEventFileAndCheck(new File(eventsDirectory,"emptyEvent.xml")); - checkMuonTrackCollections("None"); - } - - private void checkMuonTrackCollections(String... expected) { - String[] contents = getMuonTrackCollections(); - assertArrayEqualsIgnoreOrder("Didn't find expected collections",expected,contents); - } - - private String[] getMuonTrackCollections() { - JTableCellFixture cell = guiFixture.findParameterCell("MuonDet","Track","Track Collections"); - cell.click(); - JComboBoxFixture comboBox = guiFixture.comboBox("Track Collections"); - String[] contents = comboBox.contents(); - return contents; - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsTest.java b/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsTest.java deleted file mode 100644 index 8ee5814913a4..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/MuonTrackCollectionsTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package guitest; - -import java.io.File; -import org.junit.Test; -import org.fest.swing.fixture.JComboBoxFixture; -import org.fest.swing.fixture.JTableCellFixture; -import static guitest.AAssert.*; - -/** - * Check list of muon track collections for Trac bug #507 - * @author waugh - * - */ -public class MuonTrackCollectionsTest extends AtlantisGuiTestCase { - @Test - public void loadEvents() { - String eventsDirectory = System.getProperty("atlantis.test.events"); - guiFixture.openEventFileAndCheck(new File(eventsDirectory,"muonCollections.xml")); - checkMuonTrackCollections("ConvertedMBoyTracks", - "ConvertedMBoyMuonSpectroOnlyTracks", - "All"); - guiFixture.openEventFileAndCheck(new File(eventsDirectory,"muonCollections2.xml")); - checkMuonTrackCollections("ConvertedMBoyTracks", - "ConvertedMuIdCBTracks", - "All"); - } - - private void checkMuonTrackCollections(String... expected) { - String[] contents = getMuonTrackCollections(); - assertArrayEqualsIgnoreOrder("Didn't find expected collections",expected,contents); - } - - private String[] getMuonTrackCollections() { - JTableCellFixture cell = guiFixture.findParameterCell("MuonDet","Track","Track Collections"); - cell.click(); - JComboBoxFixture comboBox = guiFixture.comboBox("Track Collections"); - String[] contents = comboBox.contents(); - return contents; - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/OverlayTest.java b/graphics/AtlantisJava/test/src/guitest/OverlayTest.java deleted file mode 100644 index d35ca958746d..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/OverlayTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package guitest; - -import org.junit.Test; -import org.fest.swing.data.TableCellByColumnId; -import org.fest.swing.fixture.JTableCellFixture; -import org.fest.swing.fixture.JTableFixture; - -public class OverlayTest extends AtlantisGuiTestCase { - - @Test - public void testOverlay() { - JTableFixture table = guiFixture.findParametersTable("Appearance","Logo"); - int row = 0; - JTableCellFixture check = table.cell(TableCellByColumnId.row(row).columnId("Name")); - //check the box to show logo - check.click(); - //change the x position - JTableCellFixture logox = guiFixture.findParameterCell("Appearance","Logo", "Logo X"); - logox.enterValue("0.5\n"); - //resize - JTableCellFixture size = guiFixture.findParameterCell("Appearance","Logo", "Logo Size"); - size.enterValue("0.7\n"); - size.click(); - //now uncheck the box - check.click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/ProjectionsTest.java b/graphics/AtlantisJava/test/src/guitest/ProjectionsTest.java deleted file mode 100644 index 3b32476ab894..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/ProjectionsTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package guitest; - -import org.fest.swing.fixture.JPanelFixture; -import org.junit.Test; - -import static atlantis.utils.AMath.*; // for Greek letters - -public class ProjectionsTest extends AtlantisGuiTestCase { - @Test - public void testWindowControls() { - JPanelFixture windowControls = guiFixture.panel("windowControl"); - windowControls.label("W").click(); - guiFixture.findParametersTable("Projection","YX").click(); - guiFixture.findParametersTable("Projection",PHI+ETA).click(); - guiFixture.findParametersTable("Projection",RHO+"Z").click(); - guiFixture.findParametersTable("Projection",PHI+RHO).click(); - guiFixture.findParametersTable("Projection",PHI+"Z").click(); - guiFixture.findParametersTable("Projection","X'Z").click(); - guiFixture.findParametersTable("Projection","Y'Z").click(); - guiFixture.findParametersTable("Projection","3DBox").click(); - guiFixture.findParametersTable("Projection","LegoPlot").click(); - guiFixture.findParametersTable("Projection","Event Info").click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/ReadNextAndPreviousEventTest.java b/graphics/AtlantisJava/test/src/guitest/ReadNextAndPreviousEventTest.java deleted file mode 100644 index 4849224a4a49..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/ReadNextAndPreviousEventTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package guitest; - -import java.awt.Dialog; - -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.core.matcher.JButtonMatcher; -import org.fest.swing.fixture.DialogFixture; -import org.fest.swing.fixture.JButtonFixture; -import org.fest.swing.fixture.JToolBarFixture; -import org.junit.Test; - -public class ReadNextAndPreviousEventTest extends AtlantisGuiTestCase { - - @Test - public void readNextThenPreviousEvent() { - JToolBarFixture toolBarFixture = guiFixture.findEventSourceToolBar(); - JButtonFixture nextButton = toolBarFixture.button("nextButton"); - JButtonFixture previousButton = toolBarFixture.button("previousButton"); - nextButton.click(); - previousButton.click(); - guiFixture.menuItemWithPath("File", "Exit").click(); - DialogMatcher matcherConfirmExit = DialogMatcher.withTitle("Exit Atlantis"); - Dialog dialogConfirmExit = finder.find(matcherConfirmExit); - DialogFixture fixtureDialogConfirmExit = new DialogFixture(robot,dialogConfirmExit); - // fixtureDialogConfirmExit.button(JButtonMatcher.withText("Yes")).click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/StartAndExitTest.java b/graphics/AtlantisJava/test/src/guitest/StartAndExitTest.java deleted file mode 100644 index ec93dce67c43..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/StartAndExitTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package guitest; - -import java.awt.Dialog; -import org.junit.Test; -import org.fest.swing.core.matcher.DialogMatcher; -import org.fest.swing.core.matcher.JButtonMatcher; -import org.fest.swing.fixture.DialogFixture; - -public class StartAndExitTest extends AtlantisGuiTestCase { - - @Test - public void atlantisStarts() { - guiFixture.menuItemWithPath("File", "Exit").click(); - DialogMatcher matcherConfirmExit = DialogMatcher.withTitle("Exit Atlantis"); - Dialog dialogConfirmExit = finder.find(matcherConfirmExit); - DialogFixture fixtureDialogConfirmExit = new DialogFixture(robot,dialogConfirmExit); - fixtureDialogConfirmExit.button(JButtonMatcher.withText("Yes")).click(); - } -} diff --git a/graphics/AtlantisJava/test/src/guitest/TabsTest.java b/graphics/AtlantisJava/test/src/guitest/TabsTest.java deleted file mode 100644 index 11ba9148e3b5..000000000000 --- a/graphics/AtlantisJava/test/src/guitest/TabsTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package guitest; - -import org.junit.Test; -import org.fest.swing.fixture.JTableFixture; - -public class TabsTest extends AtlantisGuiTestCase { - - @Test - public void testTabs() { - JTableFixture table = guiFixture.findParametersTable("MuonDet","Segment"); - // Click on cell: does nothing but checks we have found required cell - table.cell(table.cell("Segment Collections")).click(); - guiFixture.findParametersTable("Projection","YX"); - guiFixture.findParametersTable("Data","Data"); - guiFixture.findParametersTable("Cuts","Calo"); - guiFixture.findParametersTable("InDet","SpacePoint"); - guiFixture.findParametersTable("Calo","HEC"); - guiFixture.findParametersTable("MuonDet","MDT"); - guiFixture.findParametersTable("Objects","Muon"); - guiFixture.findParametersTable("Detector","Geo"); - guiFixture.findParametersTable("Appearance","Logo"); - } -} diff --git a/graphics/AtlantisJava/test/src/testutils/AtlantisInit.java b/graphics/AtlantisJava/test/src/testutils/AtlantisInit.java deleted file mode 100644 index d1732aec9f84..000000000000 --- a/graphics/AtlantisJava/test/src/testutils/AtlantisInit.java +++ /dev/null @@ -1,20 +0,0 @@ -package testutils; - -import atlantis.Atlantis; -import atlantis.globals.AGlobals; - -/** - * Do Atlantis initialization for tests: things that would be set up by main() in the - * full application, and require access to protected Atlantis members. - * - * @author waugh - * - */ -public class AtlantisInit extends Atlantis { - - public static void init() { - String homeDirectory = Atlantis.getHomeDirectory(); - AGlobals.instance().setHomeDirectory(homeDirectory); - } - -} diff --git a/graphics/AtlantisJava/test/src/testutils/TeeOutputStream.java b/graphics/AtlantisJava/test/src/testutils/TeeOutputStream.java deleted file mode 100644 index e490cc19821d..000000000000 --- a/graphics/AtlantisJava/test/src/testutils/TeeOutputStream.java +++ /dev/null @@ -1,34 +0,0 @@ -package testutils; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -/** - * Wraps any number of OutputStreams and directs input to all of them. - * @author waugh - * - */ -public class TeeOutputStream extends OutputStream { - private List<OutputStream> streams; - - /** - * Create a TeeOutputStream that writes to the given OutputStreams. - * @param outputStreams the OutputStreams to be wrapped - */ - public TeeOutputStream(OutputStream... outputStreams) { - streams = new ArrayList<OutputStream>(); - for (OutputStream stream : outputStreams) { - streams.add(stream); - } - } - - @Override - public void write(int b) throws IOException { - for (OutputStream stream : streams) { - stream.write(b); - } - } - -} diff --git a/graphics/AtlantisJava/test/src/testutils/TestUtils.java b/graphics/AtlantisJava/test/src/testutils/TestUtils.java deleted file mode 100644 index d9b580329146..000000000000 --- a/graphics/AtlantisJava/test/src/testutils/TestUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package testutils; - -public class TestUtils { - - /** - * Set system property if it doesn't already have a value. - * Useful in providing sensible defaults for properties set in build file when - * using Ant. - * @param key - * @param value - */ - public static void setPropertyIfNotSet(String key, String value) { - String old = System.getProperty(key); - if (old==null) System.setProperty(key,value); - } - -} -- GitLab From c469690c7da9a12b824b9056ef230c57c0eb7404 Mon Sep 17 00:00:00 2001 From: Ben Nachman <benjamin.philip.nachman@cern.ch> Date: Fri, 15 Feb 2019 14:44:49 -0800 Subject: [PATCH 002/163] init --- .../RadDamage/HamburgModel/README.md | 33 + .../HamburgModel/data_processing.cpp | 770 ++++++++++++++++++ .../RadDamage/HamburgModel/output | Bin 0 -> 211600 bytes .../HamburgModel/temp_rad_data/converter | Bin 0 -> 78624 bytes .../temp_rad_data/profile_combiner.cpp | 380 +++++++++ .../temp_rad_data/temp_IBL_2015-jan2018.txt | 0 6 files changed, 1183 insertions(+) create mode 100644 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/README.md create mode 100644 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/data_processing.cpp create mode 100755 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/output create mode 100755 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/converter create mode 100644 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/profile_combiner.cpp create mode 100644 InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/temp_IBL_2015-jan2018.txt diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/README.md b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/README.md new file mode 100644 index 000000000000..6271ead6172e --- /dev/null +++ b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/README.md @@ -0,0 +1,33 @@ +Original author: Julien Beyer, 2019 (https://gitlab.cern.ch/jbeyer/RadDamSim) + +The code in data_processing.cpp is a c++ implementation of the Hamburg model of radiation damage. It calculates the effective doping concentration based on an introduction of stable/decaying acceptors and the removal of donors due to irradiation. Moreover, it handles the annealing processes depending in the temperature. According to the effective doping concentration, the depletion voltage is calculated. +Besides the depletion voltage, the leakage current (inclusive alpha parameter) is calculated based on the Hamburg model. Again, leakage current increase due to irradiation and decrease due to annealing is handled. Two different options for the temperature averaging are available (use_CMS_paper_alpha0). + +In order to simulate all of these properties, a profile of irradiation dose and temperature is necessary. The profile has to have the following format: + +duration (in seconds!!!!!!!!!, integer) / temperature in K (float) / dose rate in neq/cm2s (integer !) + +Different examples are available in the temp_rad_data folder. Besides that, a program to create new profiles from two given temperature and irradiation profiles is available in this folder (help included in the cpp file). + +As a prerequisite make sure that Root (for plotting, tested with version 6.06) and Boost (for Date handling, tested with version 1.62) as well as a c++ 11 compatible compiler are installed. Now, the program can be compiled with: + +g++ data_processing.cpp -I /path/to/boost/boost_1_62_0 -Wall -std=c++11 -o output `root-config --cflags` `root-config --libs` + +After compilation the program can be called with: + +./output temp_rad_data/my_profile.txt + +By default, a variety of pdf files is generated and all corresponding root histograms are stored in a single root file. Furthermore, by default, the pdf files will be overwritten and the histograms will be added to the existing root file - this can be changed in the first lines of the code, a unique naming scheme based on the system clock is available! + +Some variables might be changed in the first part of the code, apart from that, no adaptions should be necessary. + +Attention: +1.duration in the profile file HAS to be dividable by global timestep (parameter in the code, default=1) ->Integer result required for the ratio of duration and global time step + +2.profile file may not have additional (even/especially empty) lines after the last line or in the beginning + +3.the value for the global_layer_conversion has to be changed in order to fit to another layer (parameter transforms luminosity in neq) eg: B-Layer: 2.5e12, IBL 6e12 + +4.due to some computational reasons the final luminosity might not be correct. The fluence (in neq/cm2) however, should be exact. + +5. to change from one detector type to another (e.g. for a different layer in the detector), change mainly 3 things: thickness (200 for IBL and 250 for PIXEL) and global_layer_conversion (global values) and Ndonor (different for PIXEL and IBL) diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/data_processing.cpp b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/data_processing.cpp new file mode 100644 index 000000000000..80abb6405a80 --- /dev/null +++ b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/data_processing.cpp @@ -0,0 +1,770 @@ +/* +Compile Code with: g++ data_processing.cpp -I /path/to/boost/boost_1_62_0 -Wall -std=c++11 -o output `root-config --cflags` `root-config --libs` + +Requirements: Root (for plotting) and Boost (for Date handling) have to be installed + +Call program with 1 Arguments: 1. name of the file with the temperature/radiation profile (you may want to uncomment the gA,Y,C to be read in again as additional parameters, around line 686) + +Radiation and temperature profile have to fulfil the following scheme: duration (in seconds!!!!!!!!!) / temperature in K / irradiation in neq/cm2s (ALL have to be integer !) + +Attention: timesteps in the profile file HAVE to be devideable by global timestep ->Integer result required + profile files may not have additional (even/especially empty) lines after the last line + +Attention 2: the value for the global_layer_conversion has to be changed in order to fit to another layer (parameter transforms luminosity in neq) eg: B-Layer: 2.5e12, IBL 6e12 + +Attention 3: to change from one detector type to another, change mainly 3 things: thickness and global_layer_conversion (global values) and Ndonor +*/ + + +#include <iostream> // Basic IO +#include <fstream> // Read and write files +#include <cstdlib> // convert arguments of function call into int, float,... +#include <string> +#include <vector> +#include <math.h> // for fabs() +#include <sstream> // to get string into stream +//#include <TH2F.h> // root stuff for file reading +#include <TFile.h> // more root stuff +//#include <TH2D.h> // root stuff for file reading +#include <TCanvas.h> +#include <TROOT.h> +#include <TGraphErrors.h> +#include <TVector.h> +#include <TStyle.h> +#include <TAxis.h> +#include <TF1.h> +#include <TMath.h> +#include <TLine.h> +#include <TH1.h> +#include <cmath> +#include "TDatime.h" +#include <time.h> +#include <ctime> +#include <boost/date_time/gregorian/gregorian.hpp> + +using namespace std; +using namespace boost::gregorian; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +bool use_CMS_paper_alpha0 = false; //if false: temperature averaging for leakage current calculation a la Moll (theta function for time scale change), if true: use CMS approach of temperature average (attention: constants can only be changed directly in the code in this case) + +bool debug=false; // additional debugging console outputs +bool plot_pdf=true; // plots are by default saved as root file, but can also be directly exported as pdf +bool overwrite_files=true; // false = append internal clock identifier to file name, false = overwrite pdfs, append root files // files are by default created with a unique name depending on the internal clock and you can switch it of here such that pdf files are overwritten and the root file is extended (old plots will stay in the root file as well) +double timestep=1; // step size is 1 second, do not change this! +double donorremovalfraction=0.99; // fraction of donors which can be removed by donor removal +double userTref=273.15; // set a reference temperature for the volume corrected leakage current plot (it will only effect this one plot!) Now: implemented! +double bandGap=1.21; // eV used for scaling temperatures + +string output_file_name = "simulation_results"; // set unique file name for each simulation + +date d(2015,May,1); // IBL //set a date for the plots to begin (to be correct it has to be equal to the beginning of your (!) temp/irr profile) +//date d(2011,Feb,11); // PIXEL + + +const double Ndonor_0 = 1.7e12; // IBL // initial donor concentration (right now the code only works for originally n-type bulk material!) +//const double Ndonor_0 = 1.4e12; // B-Layer Layer1/2 Disks + +double thickness=200; // IBL // sensor thickness +//double thickness=250; // B-Layer Layer1/2 Disks + +//double global_layer_conversion=0.92e12; // Layer 1 //conversion factor from luminosity to neq (1fb-1=2.3e12neq/cm2) - is used only for computation of total luminosity, will be wrong if there are multiple conversion factor in the original profiles as for example due to different center of mass energies +//double global_layer_conversion=1.1e12; // L1 average +//double global_layer_conversion=0.571e12; // Layer 2 +//double global_layer_conversion=0.7e12; // Layer 2 average +//double global_layer_conversion=0.582e12; // Disks +double global_layer_conversion=6.262e12; // IBL +//double global_layer_conversion=2.8e12;//2.929e12; // B-Layer + +int limit_file_size_input = 0; // how many lines should be read from the profile, 0 for everything + +float DoseRateScaling=1.; // this parameter is multiplied to all fluence rates from the input profile + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Do not change things below this line without thinking carefully! + +//Definition of Hamburg model depletion voltage functions + +TF1 *Naccept_rev_TF1 = new TF1("Naccept_rev_TF1","[0]*[1]*(1-TMath::Exp(-[2]*x))/[2] + [3]*TMath::Exp(-[2]*x)",0,10000000); +TF1 *Naccept_const_TF1 = new TF1("Naccept_const_TF1","[0] * [1]*x",0,10000000); +TF1 *Nneutrals_rev_TF1 = new TF1("Ndonor_rev_TF1","[0]*[1]*(1-TMath::Exp(-[2]*x))/[2] + [3]*TMath::Exp(-[2]*x)",0,10000000); +TF1 *Ndonor_const_TF1 = new TF1("Ndonor_const_TF1","-[0]*(1-TMath::Exp(-[1]*[2]*x))",0,10000000); + +TF1 *Naccept_rev_TF1_approx = new TF1("Naccept_rev_TF1","[0]*[1]*x + [3]*TMath::Exp(-[2]*x)",0,10000000); +TF1 *Ndonor_neutrals_rev_TF1_approx = new TF1("Ndonor_rev_TF1","[0]*[1]*x + [3]*TMath::Exp(-[2]*x)",0,10000000); + +TF1 *Ndonor_TF1 = new TF1("Ndonor_TF1","[0]*[1]/[2] * ([2]*x+TMath::Exp(-[2]*x)-1) +[3]*(1-TMath::Exp(-[2]*x)) ",0,10000000); + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct DataElement +{ + int duration; + float temperature; + long int dose_rate; +}; + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//calculate depletion voltage from given effective doping concentration + +double NtoV_function(double doping_conc) +{ + return 1.6021766208e-13/(2*11.68*8.854187817)*fabs(doping_conc)*thickness*thickness; // q/2*epsilon*epsilon_0 * Neff*D^2 +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +class Annealing_constants { // Class to store a set of annealing specific constants and compute temperature dependent values +private: + double gA; + double gY; + double gC; + double ka; + double ky1; + double Ea; + double Ey; + double cc; + +public: + Annealing_constants(double,double,double,double,double,double,double,double); + double get_gA(int) const; + double get_gY(int) const; + double get_gC(int) const; + double get_ka(int) const; + double get_ky1(int) const; + double get_Ea() const; + double get_Ey() const; + double get_cc() const; +}; + +Annealing_constants::Annealing_constants(double a ,double b ,double c ,double d ,double e ,double f ,double g , double h) +{ + gA=a ; + gY=b ; + gC=c ; + ka=d ; + ky1=e ; + Ea=f ; + Ey=g ; + cc=h ; +} + +double Annealing_constants::get_gA(int T) const +{ + return gA; +} + +double Annealing_constants::get_gY(int T) const +{ + return gY; +} + +double Annealing_constants::get_gC(int T) const +{ + return gC; +} + +double Annealing_constants::get_ka(int T) const +{ + return ka*exp(-Ea/(8.6173303e-5*(double)T)); + //return ka; +} + +double Annealing_constants::get_ky1(int T) const +{ + return ky1*exp(-Ey/(8.6173303e-5*(double)T)); + //return ky1; +} + +double Annealing_constants::get_Ea() const +{ + return Ea; +} + +double Annealing_constants::get_Ey() const +{ + return Ey; +} + +double Annealing_constants::get_cc() const +{ + return cc; +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// leakage current constants will be stored in this struct + +struct leakage_current_consts +{ + double alpha_1; + double alpha_0_star; + double beta; + double k01; + double E1; + double E1_star; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// all atributes of a sensor (like irradiation, doping concentration, leakage currents, etc) will be stored in this class + +class Sensor //Class to handle Sensors +{ +private: //Content of a sensor + double Nacceptor; + double Ndonor; + double Ndonor_const; + double Nacceptor_reversible; + double Nneutral_reversible; + double Nacceptor_stable_constdamage; + double Ndonor_stable_donorremoval; + double Nacceptor_stable_reverseannealing; + + int Temperature; + vector<vector<double>> leakage_current_alpha; + vector<vector<double>> time_history; + vector<double> G_i; + vector<double> leakage_current; + double volume; + vector<double> alpha_vec; + vector<double> powerconsumption; + vector<double> inverse_weighted_temp; + + +public: + Sensor(double, double, int, double, double); //Constructor + Sensor(); + double get_Neff() const; + void set_Nacceptor(double); + void set_Ndonor(double); + double get_Nacceptor() const; + double get_Ndonor() const; + void set_temp(int); + double get_temp() const; + void irradiate(leakage_current_consts,Annealing_constants, long int, float, long double); + vector<double> get_G_i() const; + vector<double> get_leakage_current() const; + vector<double> get_alpha_vec() const; + vector<double> get_powerconsumption() const; +}; + +Sensor::Sensor( double a, double b, int c, double d, double e) //Constructordefinition +{ + Nacceptor=a; + Ndonor=b; + Temperature=c; + Nacceptor_reversible=d; + Nneutral_reversible=e; +} + +Sensor::Sensor() //Constructordefinition +{ + Nacceptor=0; + Ndonor=Ndonor_0; + Temperature=0; + Nneutral_reversible=0; + Nacceptor_reversible=0; + Nneutral_reversible=0; + volume= 0.135; + Nacceptor_stable_constdamage=0; + Ndonor_stable_donorremoval=donorremovalfraction*fabs(Nacceptor-Ndonor); + Ndonor_const=Ndonor-Ndonor_stable_donorremoval; + Nacceptor_stable_reverseannealing=0; +} + +double Sensor::get_Neff() const +{ + return Nacceptor-Ndonor; +} + +double Sensor::get_temp() const +{ + return Temperature; +} + +void Sensor::set_temp(int value) +{ + Temperature=value; + return; +} + +double Sensor::get_Nacceptor() const +{ + return Nacceptor; +} + +double Sensor::get_Ndonor() const +{ + return Ndonor; +} + +void Sensor::set_Nacceptor(double new_value) +{ + Nacceptor=new_value; + return; +} + +void Sensor::set_Ndonor(double new_value) +{ + Ndonor=new_value; + return; +} + +vector<double> Sensor::get_G_i() const +{ + return G_i; +} + +vector<double> Sensor::get_leakage_current() const +{ + return leakage_current; +} + +vector<double> Sensor::get_alpha_vec() const +{ + return alpha_vec; +} + +vector<double> Sensor::get_powerconsumption() const +{ + return powerconsumption; +} + +void Sensor::irradiate(leakage_current_consts leconsts, Annealing_constants constants,long int phi, float t, long double totalDose) +{ + //t=t*3600; //conversion from hours to seconds + double a=1e-30; +//calculating the effective doping concentration + +if(debug) cout << t<<" "<< constants.get_gA(Temperature)<<" "<<phi<<" "<<constants.get_ka(Temperature)<<" "<<Nacceptor<<" "<< constants.get_gC(Temperature)<<" "<< constants.get_gY(Temperature)<<" "<< constants.get_ky1(Temperature) <<" "<<Ndonor <<endl; + + Naccept_rev_TF1->SetParameter(0,constants.get_gA(Temperature)); + Naccept_rev_TF1->SetParameter(1,phi); + Naccept_rev_TF1->SetParameter(2,constants.get_ka(Temperature)); + Naccept_rev_TF1->SetParameter(3,Nacceptor_reversible); + + Naccept_rev_TF1_approx->SetParameter(0,constants.get_gA(Temperature)); + Naccept_rev_TF1_approx->SetParameter(1,phi); + Naccept_rev_TF1_approx->SetParameter(2,constants.get_ka(Temperature)); + Naccept_rev_TF1_approx->SetParameter(3,Nacceptor_reversible); + + Naccept_const_TF1->SetParameter(0,constants.get_gC(Temperature)); + Naccept_const_TF1->SetParameter(1,phi); + + Nneutrals_rev_TF1->SetParameter(0,constants.get_gY(Temperature)); + Nneutrals_rev_TF1->SetParameter(1,phi); + Nneutrals_rev_TF1->SetParameter(2,constants.get_ky1(Temperature)); + Nneutrals_rev_TF1->SetParameter(3,Nneutral_reversible); + + Ndonor_neutrals_rev_TF1_approx->SetParameter(0,constants.get_gY(Temperature)); + Ndonor_neutrals_rev_TF1_approx->SetParameter(1,phi); + Ndonor_neutrals_rev_TF1_approx->SetParameter(2,constants.get_ky1(Temperature)); + Ndonor_neutrals_rev_TF1_approx->SetParameter(3,Nneutral_reversible); + + Ndonor_const_TF1->SetParameter(0,Ndonor_stable_donorremoval); + Ndonor_const_TF1->SetParameter(1,constants.get_cc()); + Ndonor_const_TF1->SetParameter(2,phi); + + Ndonor_TF1->SetParameter(0,constants.get_gY(Temperature)); + Ndonor_TF1->SetParameter(1,phi); + Ndonor_TF1->SetParameter(2,constants.get_ky1(Temperature)); + Ndonor_TF1->SetParameter(3,Nneutral_reversible); + + if(constants.get_ka(Temperature)>a && constants.get_ky1(Temperature)>a) + { + Nacceptor_reversible = Naccept_rev_TF1->Eval(t); + Nacceptor_stable_constdamage += Naccept_const_TF1->Eval(t); + Nneutral_reversible = Nneutrals_rev_TF1->Eval(t); + Ndonor_stable_donorremoval += Ndonor_const_TF1->Eval(t); + Nacceptor_stable_reverseannealing += Ndonor_TF1->Eval(t); + } + else + { + cout << "Potential numerical problem due to ultra low temp and therby caused very small ky1 and ka values. Using approach in order to perform calculation. In general, no problem!"<<endl; + + Nacceptor_reversible = Naccept_rev_TF1_approx->Eval(t); + Nacceptor_stable_constdamage += Naccept_const_TF1->Eval(t); + Nneutral_reversible = Ndonor_neutrals_rev_TF1_approx->Eval(t); + Ndonor_stable_donorremoval += Ndonor_const_TF1->Eval(t); + Nacceptor_stable_reverseannealing += Ndonor_TF1->Eval(t); + } + + Nacceptor = Nacceptor_reversible + Nacceptor_stable_constdamage + Nacceptor_stable_reverseannealing; + Ndonor = Ndonor_const + Ndonor_stable_donorremoval; + +//calculating the leackage current in the following part + + vector<double> tmp(3); + vector<double> tmp2(2); + vector<double> tmp3(2); + + tmp3.at(0)=0; + tmp3.at(1)=0; + +////////////////////////////// + + double G_i_tmp=0; // G_i_tmp needs to be outside of the if clause to be existend also afterwards when it is pushed back in the G_i vector, can be put back to pos1 after finished with the if clauses + + if(use_CMS_paper_alpha0) + { + double CMS_alpha0_c1=-8.9e-17; + double CMS_alpha0_c2=4.6e-14; + double CMS_beta=2.9e-18; + + double inverse_weighted_temp_tmp=0; + inverse_weighted_temp_tmp = t/(double)Temperature; + inverse_weighted_temp.push_back(inverse_weighted_temp_tmp); + + tmp.at(0)=phi*t*leconsts.alpha_1; + tmp.at(1)=phi*t; //needs to be updated at every itaration in the while loop since the averaged temperature needs to be recalculated + tmp.at(2)=phi*t*CMS_beta; + + leakage_current_alpha.push_back(tmp); + + tmp2.at(0)=t*leconsts.k01*exp(-leconsts.E1/(8.6173303e-5*(double)Temperature)); // time comes in seconds and k01 is seconds-1 so units are fine here + tmp2.at(1)=t / 60.0; // t/60 to convert time from seconds to minutes since this is the proposed unit here + + if(time_history.size() > 0.1) tmp3=time_history.at(time_history.size()-1); + + tmp2.at(0)+=tmp3.at(0); + tmp2.at(1)+=tmp3.at(1); + + time_history.push_back(tmp2); + + + int i=0; + double temperature_average_i=0; + + while(i<leakage_current_alpha.size()) + { + temperature_average_i=0; + + for(int j=i; j<leakage_current_alpha.size(); j++) //calculate the average inverse temperature weighted with the individual time from the moment of irradiation (i) to now (leakage_current_alpha.size()) + { + temperature_average_i += inverse_weighted_temp.at(j); + } + + if(i>=1) //for i=0 the time is not the difference but just the total time + { + temperature_average_i /= (double)(time_history.back().at(1)*60.0-time_history.at(i-1).at(1)*60.0); + G_i_tmp += leakage_current_alpha.at(i).at(0) * exp(-(time_history.back().at(0)-time_history.at(i-1).at(0))) + leakage_current_alpha.at(i).at(1)*(CMS_alpha0_c1+CMS_alpha0_c2*temperature_average_i) - leakage_current_alpha.at(i).at(2) * log(time_history.back().at(1)-time_history.at(i-1).at(1) ) ; + } + else + { + temperature_average_i /= (double)(time_history.back().at(1)*60.0); + G_i_tmp += leakage_current_alpha.at(i).at(0) * exp(-time_history.back().at(0)) + leakage_current_alpha.at(i).at(1)*(CMS_alpha0_c1+CMS_alpha0_c2*temperature_average_i) - leakage_current_alpha.at(i).at(2) * log(time_history.back().at(1)) ; + } + + i++; + } + } + + else + { + tmp.at(0)=phi*t*leconsts.alpha_1; + tmp.at(1)=phi*t*leconsts.alpha_0_star; //temperature dependence of alpha0 is in the theta function of the time calculation - high temp = longer times and vice versa + tmp.at(2)=phi*t*leconsts.beta; + + leakage_current_alpha.push_back(tmp); + + tmp2.at(0)=t*leconsts.k01*exp(-leconsts.E1/(8.6173303e-5*(double)Temperature)); // time comes in seconds and k01 is seconds-1 so units are fine here + tmp2.at(1)=t / 60. * exp(-leconsts.E1_star*(1.0/(double)Temperature-1.0/294.15)/(8.6173303e-5)); //T-ref is hardcoded and fixed, it cannot be changed in a trivial way since the other parameters, especially alpha 0 star were evaluated at this reference temperature!!! // t/60 to convert time from seconds to minutes since this is the proposed unit here + + if(time_history.size() > 0.1) tmp3=time_history.at(time_history.size()-1); + + tmp2.at(0)+=tmp3.at(0); + tmp2.at(1)+=tmp3.at(1); + + time_history.push_back(tmp2); + + //pos1 + int i=0; + + while(i<leakage_current_alpha.size()) + { + if(i>=1) G_i_tmp += leakage_current_alpha.at(i).at(0) * exp(-(time_history.back().at(0)-time_history.at(i-1).at(0))) + leakage_current_alpha.at(i).at(1) - leakage_current_alpha.at(i).at(2) * log(time_history.back().at(1)-time_history.at(i-1).at(1)) ; + else G_i_tmp += leakage_current_alpha.at(i).at(0) * exp(-time_history.back().at(0)) + leakage_current_alpha.at(i).at(1) - leakage_current_alpha.at(i).at(2) * log(time_history.back().at(1)) ; + i++; + } + } + +////////////////////////////// + + + G_i.push_back(G_i_tmp); + if(G_i_tmp/(totalDose*1.0e6+(double)phi+0.001)>5e-16)alpha_vec.push_back(1e-17); //totalDose was devided by 1e6 to fit into a long double + else alpha_vec.push_back(G_i_tmp/(totalDose*1.0e6+(double)phi+0.001)); + leakage_current.push_back(G_i_tmp*1000.0*thickness*1.e-4); //insert volume here for current per module + powerconsumption.push_back(leakage_current.back()*NtoV_function(get_Neff())); + + return; +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//function to read in the temp/rad profile + +vector<DataElement> get_Profile(string filename) // reads in a file of format (timestep/temperature/radiation_dose_rate) and gives back a vector of DataElements containing each the timestep/temperature/dose_rate information of one line of the input file +{ + ifstream input_file(filename.c_str()); // open stream to data file + vector<DataElement> Temperature_Profile_vector; + DataElement tmp_data; + + if (input_file.is_open()) // check whether file opening was succesfull + { + if(debug) cout<< "Reading temperature/radiation file: " << filename << endl; + + int timestep; + float temp1; + long int rad1; + + while(true) + { + input_file >> timestep >> temp1 >> rad1; + + //if(temp1<294 && temp1>290) //TODO: remove! + //{ + // cout << "modifying temperature from: " << temp1 << endl; + // //temp1=temp1+5; + //} + //else //temp1=temp1+5; + //if (rad1!=0)temp1=temp1+5; + + tmp_data.duration=timestep; + tmp_data.temperature=temp1; + tmp_data.dose_rate=rad1*DoseRateScaling; + Temperature_Profile_vector.push_back(tmp_data); + + if(debug) cout << "Line read: " << timestep << " " << temp1 << " " << rad1 << endl; + + if(input_file.eof())break; // if end of file is reached: brake the loop + + limit_file_size_input--; + if(limit_file_size_input==0)break; + } + } + + else + { + if(debug) cout << "Error opening the temperature/radiation file!"<<endl; + return Temperature_Profile_vector; + } + + input_file.close(); + + return Temperature_Profile_vector; +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//function to plot different informations in root and pdf files + +void plot_vectors(vector<double> vecx, vector<double> vecy, string yName, string xName, long double totalDose, string plotname, int mode) +{ + string output_file_name_pdf=output_file_name; + output_file_name_pdf.insert(output_file_name_pdf.size(),"_"); + output_file_name_pdf.insert(output_file_name_pdf.size(),plotname); + output_file_name_pdf.insert(output_file_name_pdf.size(),".pdf"); + + string output_file_name_root=output_file_name; + output_file_name_root.insert(output_file_name_root.size(),".root"); + + + TFile *file = new TFile(output_file_name_root.c_str(),"UPDATE"); + //file->cd(); + + if(mode==1 || mode==2 || mode==66 || mode==8) //in case of plot as a function of time, convert the days from simulation into a more handy date + { + for(int k=0; k<vecx.size();k++) + { + int day=vecx.at(k); + + date d2 = d + days(day); + + TDatime da (d2.year(), d2.month(), d2.day(),0,0,0); + + vecx.at(k)=da.Convert(); + } + } + else //otherwise the axis is fluence and we need to reconvert it since for safty reasons it was stored devided by 1e6 in order not to overflow the long double + { + //for(int k=0; k<vecx.size();k++) + //{ + // vecx.at(k)*=1.0e6; + //} + } + + if(mode==8 || mode==9) //in case of 8, change from unit area to unit surface for the leakage current (IMPLEMENT USER TREF HERE) + { + for(int k=0; k<vecy.size();k++) + { + vecy.at(k)/=thickness*1.0e-4; //convert from surface to volume normalisation + //vecy.at(k)*=(userTref*userTref/(294.15*294.15)*exp(-6500*(1/userTref - 1/294.15))); //scale to user defined temperature + vecy.at(k)*=(userTref*userTref/(294.15*294.15)*exp(-(bandGap/(2*8.6173303e-5))*(1/userTref - 1/294.15))); //scale to user defined temperature + } + } + + const TVectorD t_timevector(vecx.size(),&vecx[0]); + const TVectorD t_vdepvector(vecy.size(),&vecy[0]); + const TVectorD t_time_error(vecx.size()); + const TVectorD t_vdep_error(vecy.size()); + + TCanvas * c1 = new TCanvas("TCanvas_name","Title",0,0,1024,668); + gStyle->SetOptTitle(0); + + TGraphErrors *gr = new TGraphErrors(t_timevector,t_vdepvector,t_time_error,t_vdep_error); + + if(mode==1 || mode==2 || mode==66 || mode==8) //in case of plot as a function of time, convert the days from simulation into a more handy date + { + gr->GetXaxis()->SetTimeDisplay(1); + gr->GetXaxis()->SetNdivisions(6,2,0); + gr->GetXaxis()->SetTimeFormat("%d/%m/%Y"); + gr->GetXaxis()->SetTimeOffset(0,"gmt"); + } + + gr->GetXaxis()->SetTitle(xName.c_str()); + gr->GetYaxis()->SetTitle(yName.c_str()); + + if(mode!=66) + { + gr->SetName(plotname.c_str()); + gr->Draw("AP"); + if(plot_pdf) c1->Print(output_file_name_pdf.c_str()); + gr->Write(); + } + + if(mode==1) + { + cout << "Final " << plotname << " is: " << vecy.at(vecy.size()-1)<< yName <<endl; + cout << "Total collected fluence is: " << totalDose*1.0e6/global_layer_conversion << "fb-1 (only one conversion factor supported - if more than one was used for the profile, this value will be wrong)" << endl; + cout << "Total collected dose is: " << totalDose*1.0e6 << "neq/cm2" << endl; + } + else + { + cout << "Final " << plotname << " is: " << vecy.at(vecy.size()-1)<<endl; + } + + file->Close(); + delete c1; +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int main(int argc, char *argv[]) { + + if(argc!=2) // Check for correct number of arguments + { + cout << "Wrong number of arguments! There are: " << argc << " arguments." << endl; + return -1; + } + + if(!overwrite_files) + { + time_t current_time = time(nullptr); + output_file_name.insert(output_file_name.size(),to_string(current_time)); + } + + string profilinput_file_name = argv[1]; + + leakage_current_consts LeCo = { 1.23e-17, //alpha_1 + 7.07e-17, //alpha_0_star + 3.3e-18, //beta + 1.2e13, //k01 + 1.11, //E1 + 1.3}; //E1_star + + Annealing_constants AnCo( 1.0e-2, //atof(argv[2]), //gA + 1.6e-2, //atof(argv[3]), //gY + 1.0e-2, //atof(argv[4]), //gC + 2.4e13, //ka + 7.4e14, //ky + 1.09, //Ea + 1.325, //Ey + 6.4118e-14); //cc + + //DoseRateScaling = atof(argv[5]) ; + + + vector<DataElement> temp_rad_profile = get_Profile(profilinput_file_name); //read in the input data profile, a vector containing the individual data elements (duration, temperature, dose rate) is returned + + int max_steps=temp_rad_profile.size(); + + vector<double> V_dep_vector; + vector<double> Neff_vector; + vector<double> Ndonor_vector; + vector<double> Nacceptor_vector; + vector<double> Temperature_vector; + + vector<double> time_vector; + vector<double> fluence_vector; + + Sensor *sensor = new Sensor(); + + long double time=0.0; + long double totalDose=0; + + // main loop where all irradiation steps happen + + cout << "Profile succesfully read. Length of the profile is: " << max_steps << endl; + + for (int t=0; t<max_steps; t++) // iterate through the profile and irradiate the sensor at each step + { + sensor->set_temp(temp_rad_profile.at(t).temperature); + sensor->irradiate(LeCo,AnCo,temp_rad_profile.at(t).dose_rate,temp_rad_profile.at(t).duration,totalDose); + + Temperature_vector.push_back(temp_rad_profile.at(t).temperature); + + Neff_vector.push_back(sensor->get_Neff()); + V_dep_vector.push_back(NtoV_function(sensor->get_Neff())); + Ndonor_vector.push_back(sensor->get_Ndonor()); + Nacceptor_vector.push_back(sensor->get_Nacceptor()); + + totalDose+=temp_rad_profile.at(t).dose_rate/1.0e3*temp_rad_profile.at(t).duration/1.0e3; // time (seconds) * dose rate (neq/cm2/s) + + time+=temp_rad_profile.at(t).duration; + time_vector.push_back(time/(24.0*3600.0)); // time vector in days + fluence_vector.push_back(totalDose*1.0e6); + + if(t%(int)(max_steps/100.)==0) cout << (int)((int)t*100./max_steps) << " percent done..." << endl; + } + + // data output, plotting and visualisation + + cout << "Processing finished, writing data..." << endl; + + // plots as function of time + plot_vectors(time_vector,Neff_vector,"N_{eff} [1/cm^{3}]","Date [days]",totalDose,"Neff",1); + plot_vectors(time_vector,Ndonor_vector,"N_{donor} [1/cm^{3}]","Date [days]",totalDose,"Ndonors",2); + plot_vectors(time_vector,Nacceptor_vector,"N_{acceptor} [1/cm^{3}]","Date [days]",totalDose,"Nacceptors",2); + plot_vectors(time_vector,V_dep_vector,"U_{dep} [V]","Date [days]",totalDose,"U_dep",66); + plot_vectors(time_vector,sensor->get_alpha_vec(),"#alpha [A/cm]","Date [days]",totalDose,"alpha",2); + plot_vectors(time_vector,sensor->get_leakage_current(),"I_{leak} (@21C) [mA/cm^{2}]","Date [days]",totalDose,"I_leak",2); + plot_vectors(time_vector,sensor->get_leakage_current(),"I_{leak} (@userTref) [mA/cm^{3}]","Date [days]",totalDose,"I_leak_volume",8); + plot_vectors(time_vector,sensor->get_G_i(),"G_{i} [A/cm^{3}]","Date [days]",totalDose,"G_i",2); + plot_vectors(time_vector,sensor->get_powerconsumption(),"P [mW/cm^{2}]","Date [days]",totalDose,"powerconsumption",2); + plot_vectors(time_vector,Temperature_vector,"Temperature [K]","Date [days]",totalDose,"temperature",2); + plot_vectors(time_vector,fluence_vector,"Fluence [n_{eq}/cm^{2}]","Date [days]",totalDose,"fluence",2); + + // plots as function of dose + plot_vectors(fluence_vector,Neff_vector,"N_{eff} [1/cm^{3}]","Fluence [n_{eq}/cm^{2}]",totalDose,"Neff_vs_fluence",3); + plot_vectors(fluence_vector,Ndonor_vector,"N_{donor} [1/cm^{3}]","Fluence [n_{eq}/cm^{2}]",totalDose,"Ndonors_vs_fluence",4); + plot_vectors(fluence_vector,Nacceptor_vector,"N_{acceptor} [1/cm^{3}]","Fluence [n_{eq}/cm^{2}]",totalDose,"Nacceptors_vs_fluence",4); + plot_vectors(fluence_vector,V_dep_vector,"U_{dep} [V]","Fluence [n_{eq}/cm^{2}]",totalDose,"U_dep_vs_fluence",4); + plot_vectors(fluence_vector,sensor->get_alpha_vec(),"#alpha [A/cm]","Fluence [n_{eq}/cm^{2}]",totalDose,"alpha_vs_fluence",4); + plot_vectors(fluence_vector,sensor->get_leakage_current(),"I_{leak} [mA/cm^{2}]","Fluence [n_{eq}/cm^{2}]",totalDose,"I_leak_vs_fluence",4); + plot_vectors(fluence_vector,sensor->get_leakage_current(),"I_{leak} (@userTref) [mA/cm^{3}]","Fluence [n_{eq}/cm^{2}]",totalDose,"I_leak_volume_vs_fluence",9); + plot_vectors(fluence_vector,sensor->get_G_i(),"G_{i} [A/cm^{3}]","Fluence [n_{eq}/cm^{2}]",totalDose,"G_i_vs_fluence",4); + plot_vectors(fluence_vector,sensor->get_powerconsumption(),"P [mW/cm^{2}]","Fluence [n_{eq}/cm^{2}]",totalDose,"powerconsumption_vs_fluence",4); + plot_vectors(fluence_vector,Temperature_vector,"Temperature [K]","Fluence [n_{eq}/cm^{2}",totalDose,"temperature_vs_fluence",4); + + return 0; +} diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/output b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/output new file mode 100755 index 0000000000000000000000000000000000000000..748d625712c48f0ff9381005ac7784701d7010d7 GIT binary patch literal 211600 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�PJK=JZ6*&r6y0g~KUyae2)4UGtx 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%0D|%{#zJ-Bh(++ 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 literal 0 HcmV?d00001 diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/converter b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/converter new file mode 100755 index 0000000000000000000000000000000000000000..8ff05b1700dc24f730ab6ebb9564f47dad1185a1 GIT binary patch literal 78624 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 T&6pgm<ppIptXd13Ao~3u7`gUj literal 0 HcmV?d00001 diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/profile_combiner.cpp b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/profile_combiner.cpp new file mode 100644 index 000000000000..411eacd59027 --- /dev/null +++ b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/profile_combiner.cpp @@ -0,0 +1,380 @@ +/* +Compile Code with: g++ profile_combiner.cpp -Wall -std=c++11 -o converter + +Program reads two files (see pattern below) in and orders them and prints out a file with at least 'time_spacing' hours spacing between the data points in the format time temperature(in K) delta_radiation(in neq/cm2/sec) + +temperature file: +21-11-2011 15:45:40:838 +01.99 +21-11-2011 19:45:40:838 +02.99 + +radiation file: +2011-11-21 15:45:40.538 00001.234 +2011-11-21 22:48:52.330 00010.142 + +with luminosity in pb-1 + +both files have to start at a date later than 1.1.2011 01:01:01.001 and should start at the same date!!! + +what needs to be changed before starting: + 1. change conversion factor (from pb-1 to neq/cm2) before usage (two conversion factors are supported for 7/8 and 13 TeV) + 2. change output name + 3. call program after compiling with ./converter temperature_file_name irradiation_file_name +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include <iostream> // Basic IO +#include <fstream> // Read and write files +#include <cstdlib> // convert arguments of function call into int, float,... +#include <string> +#include <sstream> // to get string into stream +#include <vector> +#include <cmath> + +using namespace std; + +/////////////////////////////////////////////////////// + +string define_output_file_name = "profile_output.txt"; +long int conversion_factor1 = 0.582e9; //conversion factor from pb-1 to neq/cm2 for 7TeV +long int conversion_factor2 = 0.839e9; //for 13TeV +long int changeinenergy = 2014; //year< since which there is 13TeV instead of 7TeV +int time_spacing = 4; //minimal required spacing between two data points in hours +int replacement88 = 2200; //replace no temperature reading from DCS (eg during shutdown) (=-88 C) with this temperature + +bool debug = false; //switch debugging information on/off + +/////////////////////////////////////////////////////// + +struct newData +{ + unsigned long long int timestamp; + int temperature; + int luminosity; +}; + +/////////////////////////////////////////////////////// + +struct data +{ + int year; + int month; + int day; + int hour; + int minute; + int second; + int milisecond; + unsigned long long int timestamp; + int payload; +}; + +/////////////////////////////////////////////////////// + +unsigned long long int diffintime(int time1, int time2, int offset, bool uberold, unsigned long long int conversion) +{ + long long int diff=0; + bool uber = false; + + diff = time1 - time2; + + if(diff<0) + { + diff+=offset; + uber = true; + } + + unsigned long long diff_long=abs(diff); + + if(uberold)diff_long-=1; + + diff_long*=conversion; + + return diff_long; +} + +/////////////////////////////////////////////////////// + +unsigned long long int BuildTimeStamp(data newpoint, data oldpoint) +{ + bool next_uber=false; + long long int difference_milisecond = diffintime(newpoint.milisecond, oldpoint.milisecond, 1000, false, 1); + if(newpoint.milisecond-oldpoint.milisecond<0) next_uber = true; + + unsigned long long int difference_second = diffintime(newpoint.second, oldpoint.second, 60, next_uber, 1000); + next_uber=false; + if(newpoint.second-oldpoint.second<0) next_uber = true; + + unsigned long long int difference_minute = diffintime(newpoint.minute, oldpoint.minute, 60, next_uber, 60*1000); + next_uber=false; + if(newpoint.minute-oldpoint.minute<0) next_uber = true; + + unsigned long long int difference_hour = diffintime(newpoint.hour, oldpoint.hour, 24, next_uber, 60*60*1000); + next_uber=false; + if(newpoint.hour-oldpoint.hour<0) next_uber = true; + + unsigned long long int dayoffset=0; + if(oldpoint.month == 0) dayoffset=0; + else if(oldpoint.month == 2 ) + { + dayoffset=28; + if(oldpoint.year==2008 || oldpoint.year==2012 || oldpoint.year==2016 || oldpoint.year==2020) dayoffset=29; + } + else if(oldpoint.month == 4 || oldpoint.month == 6 || oldpoint.month == 9 || oldpoint.month == 11)dayoffset=30; + else if(oldpoint.month == 1 || oldpoint.month == 3 || oldpoint.month == 5 || oldpoint.month == 7 || oldpoint.month == 8 || oldpoint.month == 10 || oldpoint.month == 12)dayoffset=31; + else + { + cout<<"Strange month, aborting..."<<oldpoint.month<<endl; + return -1; + } + + + unsigned long long int difference_day = diffintime(newpoint.day, oldpoint.day, dayoffset, next_uber, 24*60*60*1000); + //cout<<"difference in days is: "<<difference_day<< " "<<next_uber<<endl; + next_uber=false; + if(newpoint.day-oldpoint.day<0) next_uber = true; + //cout<<difference_day<< "ddd"<<endl; + + unsigned long long int difference_month = diffintime(newpoint.month, oldpoint.month, 12, next_uber, dayoffset*24*60*60*1000); + next_uber=false; + if(newpoint.month-oldpoint.month<0) next_uber = true; + + unsigned long long int difference_year = diffintime(newpoint.year, oldpoint.year, 100000, next_uber, 365.25*24*60*60*1000); + + + unsigned long long int newtimestamp = oldpoint.timestamp + difference_milisecond + difference_second + difference_minute + difference_hour + difference_day + difference_month + difference_year; + + if(debug)cout<<"Timestamp calculation: "<<oldpoint.timestamp<<" "<<newtimestamp<<" "<<difference_milisecond<<" "<<difference_second<<" "<<difference_minute<<" "<<difference_hour<<" "<<difference_day<<" "<<difference_month<<" "<<difference_year<<endl; + + return newtimestamp; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int main(int argc, char *argv[]) { + + string temp_file_name = argv[1]; + string irr_file_name = argv[2]; + + ofstream output_file; + output_file.open(define_output_file_name.c_str()); + ifstream temp_file(temp_file_name.c_str()); + ifstream irr_file(irr_file_name.c_str()); + + + if (!temp_file.is_open()) + { + cout<<"Temp file not found"<<endl; + return -1; + } + if (!irr_file.is_open()) + { + cout<<"Irr file not found"<<endl; + return -1; + } + + + cout<<"Temperature File: " << temp_file_name << endl; + cout<<"Irradiation File: " << irr_file_name << endl; + + + char column_dump_temp[100]; // max 100 charachters per line!!! + char column_dump_irr[100]; // max 100 charachters per line!!! + + vector<data> temp_data_vec; + vector<data> irr_data_vec; + + data temp_data_element; + data irr_data_element; + + int year_irr, year_temp; + int month_irr, month_temp; + int day_irr, day_temp; + int hour_irr, hour_temp; + int minute_irr, minute_temp; + int second_irr, second_temp; + int miliseconds_irr, miliseconds_temp; + unsigned long long int timestamp_irr=0; + unsigned long long int timestamp_temp=0; + int irr_i, temp_i; + + irr_data_element={2011,1,1,1,1,1,1,0,0}; + temp_data_element={2011,1,1,1,1,1,1,0,0}; + + irr_data_vec.push_back(irr_data_element); + temp_data_vec.push_back(temp_data_element); + + +//read in the two files (the two while loops) and put them into a vector each, calculate a unique timestamp for each point (in ms) + + cout<<"Start to read in irr file..."<<endl; + + int counter=0; + + while(true) + { + irr_file.getline(column_dump_irr,100); + + if(debug) cout << "Originally read line is: " << column_dump_irr << endl; + + + year_irr = (static_cast<int>(column_dump_irr[0])-48)*1000+(static_cast<int>(column_dump_irr[1])-48)*100+(static_cast<int>(column_dump_irr[2])-48)*10+static_cast<int>(column_dump_irr[3])-48; + month_irr = (static_cast<int>(column_dump_irr[5])-48)*10+static_cast<int>(column_dump_irr[6])-48; + day_irr = (static_cast<int>(column_dump_irr[8])-48)*10+static_cast<int>(column_dump_irr[9])-48; + hour_irr = (static_cast<int>(column_dump_irr[11])-48)*10+static_cast<int>(column_dump_irr[12])-48; + minute_irr = (static_cast<int>(column_dump_irr[14])-48)*10+static_cast<int>(column_dump_irr[15])-48; + second_irr = (static_cast<int>(column_dump_irr[17])-48)*10+static_cast<int>(column_dump_irr[18])-48; + miliseconds_irr = (static_cast<int>(column_dump_irr[20])-48)*100+(static_cast<int>(column_dump_irr[21])-48)*10+(static_cast<int>(column_dump_irr[22])-48); + irr_i = (static_cast<int>(column_dump_irr[24])-48)*10000000+(static_cast<int>(column_dump_irr[25])-48)*1000000+(static_cast<int>(column_dump_irr[26])-48)*100000+(static_cast<int>(column_dump_irr[27])-48)*10000+(static_cast<int>(column_dump_irr[28])-48)*1000+(static_cast<int>(column_dump_irr[30])-48)*100+(static_cast<int>(column_dump_irr[31])-48)*10+(static_cast<int>(column_dump_irr[32])-48); + + if(debug) cout<<"Datapoint irr read: "<<irr_i<<" "<<miliseconds_irr<<" "<<second_irr<<" "<<minute_irr<<" "<<hour_irr<<" "<<day_irr<<" "<<month_irr<<" "<<year_irr<<endl; + + if(year_irr>changeinenergy)irr_i=(int)round((double)irr_i*(double)conversion_factor2/(double)conversion_factor1); + + irr_data_element={year_irr,month_irr,day_irr,hour_irr,minute_irr,second_irr,miliseconds_irr,timestamp_irr,irr_i}; + timestamp_irr = BuildTimeStamp(irr_data_element, irr_data_vec.back()); + irr_data_element={year_irr,month_irr,day_irr,hour_irr,minute_irr,second_irr,miliseconds_irr,timestamp_irr,irr_i}; + + if(timestamp_irr == -1) return -1; + + irr_data_vec.push_back(irr_data_element); + + if(irr_file.eof()) break; + + counter++; + if(counter%200 == 0) cout << counter << " lines read. Year: " << irr_data_element.year << " Month:" << irr_data_element.month << " Day:" << irr_data_element.day << endl; + if(debug && (counter == 1 || counter ==2))system("read"); + } + + cout<<"Irr file completed! Starting with temperature file..."<<endl; + + counter=0; + system("read"); + + int numberofreplacements=0; + + while(true) + { + temp_file.getline(column_dump_temp,100); + + if(debug) cout << "Originally read line is: " << column_dump_temp << endl; + + + year_temp = (static_cast<int>(column_dump_temp[6])-48)*1000+(static_cast<int>(column_dump_temp[7])-48)*100+(static_cast<int>(column_dump_temp[8])-48)*10+static_cast<int>(column_dump_temp[9])-48; + month_temp = (static_cast<int>(column_dump_temp[3])-48)*10+static_cast<int>(column_dump_temp[4])-48; + day_temp = (static_cast<int>(column_dump_temp[0])-48)*10+static_cast<int>(column_dump_temp[1])-48; + hour_temp = (static_cast<int>(column_dump_temp[11])-48)*10+static_cast<int>(column_dump_temp[12])-48; + minute_temp = (static_cast<int>(column_dump_temp[14])-48)*10+static_cast<int>(column_dump_temp[15])-48; + second_temp = (static_cast<int>(column_dump_temp[17])-48)*10+static_cast<int>(column_dump_temp[18])-48; + miliseconds_temp = (static_cast<int>(column_dump_temp[20])-48)*100+(static_cast<int>(column_dump_temp[21])-48)*10+(static_cast<int>(column_dump_irr[22])-48); + temp_i =(static_cast<int>(column_dump_temp[25])-48)*1000+(static_cast<int>(column_dump_temp[26])-48)*100+(static_cast<int>(column_dump_temp[28])-48)*10+(static_cast<int>(column_dump_temp[29])-48); + + if(column_dump_temp[24]=='-') + { + temp_i*=-1; + if(debug)cout<<"negative temp"<<temp_i<<endl; + } + + if(temp_i+8800<1) + { + numberofreplacements++; + temp_i=replacement88; + if(debug)cout << "temperature replaced! " << temp_i<< " "<< numberofreplacements<<"/"<<counter<<endl; + } + if(debug) cout<<"Datapoint temp read: "<<temp_i<<" "<<miliseconds_temp<<" "<<second_temp<<" "<<minute_temp<<" "<<hour_temp<<" "<<day_temp<<" "<<month_temp<<" "<<year_temp<<endl; + + temp_data_element={year_temp,month_temp,day_temp,hour_temp,minute_temp,second_temp,miliseconds_temp,timestamp_temp,temp_i}; + timestamp_temp = BuildTimeStamp(temp_data_element, temp_data_vec.back()); + temp_data_element={year_temp,month_temp,day_temp,hour_temp,minute_temp,second_temp,miliseconds_temp,timestamp_temp,temp_i}; + + if(timestamp_temp == -1) return -1; + + temp_data_vec.push_back(temp_data_element); + + if(temp_file.eof()) break; + counter++; + if(counter%1000 == 0) cout << counter << " lines read. Year: " << temp_data_element.year << " Month:" << temp_data_element.month << " Day:" << temp_data_element.day << endl; + } + + cout<<"Both files succesfully read! Beginning with sorting the data..."<<endl; + +//create a new vector with the ordered values in the format: timestamp Temperature luminosity + + irr_data_vec.erase(irr_data_vec.begin()); // erase first element each because this was only a space holder + temp_data_vec.erase(temp_data_vec.begin()); + + int temp_iterator = 1; + int irr_iterator = 1; + + newData element; + element={0,0,0}; + + vector<newData> output_vec; + + while(true) + { + if(irr_data_vec.at(irr_iterator).timestamp>temp_data_vec.at(temp_iterator).timestamp) + { + element = {temp_data_vec.at(temp_iterator).timestamp, temp_data_vec.at(temp_iterator).payload, irr_data_vec.at(irr_iterator-1).payload}; + temp_iterator++; + } + + else + { + element = {irr_data_vec.at(irr_iterator).timestamp, temp_data_vec.at(temp_iterator-1).payload, irr_data_vec.at(irr_iterator).payload}; + irr_iterator++; + } + + output_vec.push_back(element); + + if(temp_data_vec.size()<=temp_iterator || irr_data_vec.size()<=irr_iterator) break; + } + + + cout<<"Data is sorted now! Writing file with the data with fixed time spacing..."<<endl; + + + if(debug) + { + for(int k=0;k<output_vec.size();k++) + { + cout<<output_vec.at(k).timestamp<<" "<<output_vec.at(k).temperature<<" "<<output_vec.at(k).luminosity<<endl; + } + } + + +//write out a file with a constant spacing of time_spacing hours, temperature and the converted irradiation is rounded to int + + output_file<<1*60*60<<" "<<(int)round(273.0+(output_vec.at(0).temperature/100.0))<<" "<<(long int)round((conversion_factor1*(output_vec.at(0).luminosity)/1000.0/60.0/60.0))<<endl; + + int old_i = 0; + int i = 1; + int time_difference=0; + int radiation_difference=0; + + while(i<output_vec.size()-2) + { + while(i<output_vec.size()-1 && output_vec.at(i).timestamp-output_vec.at(old_i).timestamp<time_spacing*60*60*1000) //wait until difference between to points is at least time_spacing hour + { + i++; + + if(debug) cout<<"Position in output file:"<<i << " and file size is: " << output_vec.size() <<endl; + } + + time_difference=(int)round((output_vec.at(i).timestamp-output_vec.at(old_i).timestamp)/1000.0); + radiation_difference=(long int)round((conversion_factor1*(output_vec.at(i).luminosity-output_vec.at(old_i).luminosity)/1000.0/(float)time_difference)); + + if(output_vec.at(i).luminosity-(int)round((double)conversion_factor2/(double)conversion_factor1*output_vec.at(old_i).luminosity)==0) + { + radiation_difference=0; + cout << "corrected for change in conversion factor, should not happen more than once!"<<endl; + } + output_file<<time_difference<<" "<<(int)round(273.0+(output_vec.at(i).temperature/100.0))<<" "<<radiation_difference<<endl; + + old_i=i; + i++; + } + + output_file.close(); + + return 0; +} diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/temp_IBL_2015-jan2018.txt b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/RadDamage/HamburgModel/temp_rad_data/temp_IBL_2015-jan2018.txt new file mode 100644 index 000000000000..e69de29bb2d1 -- GitLab From a5ae7e337fd91003ec378c409af7b33e2d763b3c Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Tue, 19 Feb 2019 16:49:31 +0100 Subject: [PATCH 003/163] moved tests out of the main file that is frequently imported --- .../python/ComponentAccumulatorTest.py | 284 ++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 Control/AthenaConfiguration/python/ComponentAccumulatorTest.py diff --git a/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py b/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py new file mode 100644 index 000000000000..3f059ae87694 --- /dev/null +++ b/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py @@ -0,0 +1,284 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +# self test of ComponentAccumulator + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator, forcomps +from AthenaConfiguration.AthConfigFlags import AthConfigFlags +from AthenaCommon.CFElements import findSubSequence,findAlgorithm +from AthenaCommon.Configurable import Configurable, ConfigurablePyAlgorithm # guinea pig algorithms +from AthenaCommon.CFElements import seqAND, seqOR, parOR +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG, INFO + +import unittest + +class TestComponentAccumulator( unittest.TestCase ): + def setUp(self): + + + # trivial case without any nested sequences + + Configurable.configurableRun3Behavior+=1 + + log.setLevel(DEBUG) + + dummyCfgFlags=AthConfigFlags() + dummyCfgFlags.lock() + + class Algo(ConfigurablePyAlgorithm): + def __init__(self, name): + super( ConfigurablePyAlgorithm, self ).__init__( name ) + + def AlgsConf1(flags): + acc = ComponentAccumulator() + a1=Algo("Algo1") + a2=Algo("Algo2") + return acc,[a1,a2] + + + def AlgsConf2(flags): + acc = ComponentAccumulator() + result,algs=AlgsConf1( flags ) + acc.merge(result) + algs.append(Algo("Algo3")) + return acc,algs + + acc = ComponentAccumulator() + + # top level algs + acc1,algs=AlgsConf2(dummyCfgFlags) + acc.merge(acc1) + acc.addEventAlgo(algs) + + def AlgsConf3(flags): + acc = ComponentAccumulator() + na1=Algo("NestedAlgo1") + return acc,na1 + + def AlgsConf4(flags): + acc,na1= AlgsConf3( flags ) + NestedAlgo2 = Algo("NestedAlgo2") + NestedAlgo2.OutputLevel=7 + return acc,na1,NestedAlgo2 + + acc.addSequence( seqAND("Nest") ) + acc.addSequence( seqAND("subSequence1"), parentName="Nest" ) + acc.addSequence( parOR("subSequence2"), parentName="Nest" ) + + acc.addSequence( seqAND("sub2Sequence1"), parentName="subSequence1") + acc.addSequence( seqAND("sub3Sequence1"), parentName="subSequence1") + acc.addSequence( seqAND("sub4Sequence1"), parentName="subSequence1") + + accNA1=AlgsConf4(dummyCfgFlags) + acc.merge(accNA1[0]) + acc.addEventAlgo(accNA1[1:],"sub2Sequence1" ) + acc.store(open("testFile.pkl", "w")) + self.acc = acc + + + def test_algorihmsAreAdded( self ): + self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo1", 1).name(), "Algo1", "Algorithm not added to a top sequence" ) + self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo2", 1).name(), "Algo2", "Algorithm not added to a top sequence" ) + self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo3", 1).name(), "Algo3", "Algorithm not added to a top sequence" ) + + def test_sequencesAreAdded( self ): + self.assertIsNotNone( self.acc.getSequence("subSequence1" ), "Adding sub-sequence failed" ) + self.assertIsNotNone( self.acc.getSequence("subSequence2" ), "Adding sub-sequence failed" ) + self.assertIsNotNone( self.acc.getSequence("sub2Sequence1"), "Adding sub-sequence failed" ) + self.assertIsNotNone( findSubSequence( self.acc.getSequence("subSequence1"), "sub2Sequence1"), "Adding sub-sequence done in a wrong place" ) + + def test_algorithmsInNestedSequences( self ): + self.assertIsNotNone( findAlgorithm( self.acc.getSequence(), "NestedAlgo1" ), "Algorithm added to nested sequence" ) + self.assertIsNotNone( findAlgorithm( self.acc.getSequence(), "NestedAlgo1", 1 ) is None, "Algorithm mistakenly in top sequence" ) + self.assertIsNotNone( findAlgorithm( findSubSequence( self.acc.getSequence(), "sub2Sequence1"), "NestedAlgo1", 1 ), "Algorithm not in right sequence" ) + + + def test_readBackConfiguration( self ): + import pickle + with open( "testFile.pkl" ) as f: + s = pickle.load( f ) + self.assertIsNotNone( s, "The pickle has no content") + + def test_forcomps( self ): + forcomps(self.acc, "/*sub2*/*Algo*").OutputLevel = DEBUG + forcomps(self.acc, "/*sub2*/*Algo*").OutputLevel = DEBUG + forcomps(self.acc, "/Algo/Algo*").OutputLevel = INFO + self.assertEqual(self.acc.getEventAlgo("Algo3").OutputLevel, INFO, "wrong OutputLevel value for Algo3") + self.assertEqual(self.acc.getEventAlgo("NestedAlgo1").OutputLevel, DEBUG, "wrong OutputLevel value for NestedAlgo1") + + + +class TestHLTCF( unittest.TestCase ): + def runTest( self ): + # replicate HLT issue, it occured because the sequnces were recorded in the order of storing in the dict and thus the + # some of them (in this case hltSteps) did not have properties recorded + + + Configurable.configurableRun3Behavior=1 + acc = ComponentAccumulator() + acc.addSequence( seqOR("hltTop") ) + algos2 = ConfigurablePyAlgorithm( "RecoAlgInTop" ) + acc.addEventAlgo( algos2, sequenceName="hltTop" ) # some algo + acc.addSequence( seqAND("hltSteps"), parentName="hltTop" ) + acc.addSequence( parOR("hltStep_1"), parentName="hltSteps" ) + acc.addSequence( seqAND("L2CaloEgammaSeq"), "hltStep_1" ) + acc.addSequence( parOR("hltStep_2"), parentName="hltSteps" ) + acc.moveSequence( "L2CaloEgammaSeq", "hltStep_2" ) + + acc.store(open("testFile2.pkl", "w")) + import pickle + f = open("testFile2.pkl") + s = pickle.load(f) + f.close() + self.assertNotEqual( s['hltSteps']['Members'], '[]', "Empty set of members in hltSteps, Sequences recording order metters" ) + + +class MultipleParentsInSequences( unittest.TestCase ): + def runTest( self ): + # test if an algorithm (or sequence) can be controlled by more than one sequence + Configurable.configurableRun3Behavior=1 + + accTop = ComponentAccumulator() + + recoSeq = seqAND("seqReco") + recoAlg = ConfigurablePyAlgorithm( "recoAlg" ) + recoSeq += recoAlg + + acc1 = ComponentAccumulator() + acc1.addSequence( seqAND("seq1") ) + acc1.addSequence( recoSeq, parentName="seq1" ) + + acc2 = ComponentAccumulator() + acc2.addSequence( seqAND("seq2") ) + acc2.addSequence( recoSeq, parentName="seq2" ) + + accTop.merge( acc1 ) + accTop.merge( acc2 ) + + accTop.printConfig() + + self.assertIsNotNone( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), "Algorithm missing in the first sequence" ) + self.assertIsNotNone( findAlgorithm( accTop.getSequence( "seq2" ), "recoAlg" ), "Algorithm missing in the second sequence" ) + s = accTop.getSequence( "seqReco" ) + self.assertEqual( len( s.getChildren() ), 1, "Wrong number of algorithms in reco seq: %d " % len( s.getChildren() ) ) + self.assertIs( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), findAlgorithm( accTop.getSequence( "seq2" ), "recoAlg" ), "Algorithms are cloned" ) + self.assertIs( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), recoAlg, "Clone of the original inserted in sequence" ) + + accTop.store( open("dummy.pkl", "w") ) + import pickle + # check if the recording did not harm the sequences + with open("dummy.pkl") as f: + s = pickle.load( f ) + self.assertEquals( s['seq1']["Members"], "['AthSequencer/seqReco']", "After pickling recoSeq missing in seq1 " + s['seq1']["Members"]) + self.assertEquals( s['seq2']["Members"], "['AthSequencer/seqReco']", "After pickling recoSeq missing in seq2 " + s['seq2']["Members"]) + self.assertEquals( s['seqReco']["Members"], "['ConfigurablePyAlgorithm/recoAlg']", "After pickling seqReco is corrupt " + s['seqReco']["Members"] ) + +class ForbidRecursiveSequences( unittest.TestCase ): + def runTest( self ): + #Can't add a sequence with the same name below itself, e.g. + # \__ AthAlgSeq (seq: PAR AND) + # \__ seq1 (seq: SEQ AND) + # \__ seq1 (seq: SEQ AND) + def selfSequence(): + Configurable.configurableRun3Behavior=1 + from AthenaCommon.CFElements import seqAND + accTop = ComponentAccumulator() + accTop.wasMerged() + seq1 = seqAND("seq1") + seq1_again = seqAND("seq1") + accTop.addSequence(seq1) + accTop.addSequence(seq1_again, parentName = "seq1") + + #Allowed to add a sequence with the same name at same depth, e.g. + # \__ AthAlgSeq (seq: PAR AND) + # \__ seq1 (seq: SEQ AND) + # \__ seq2 (seq: SEQ AND) + # \__ seq2 (seq: SEQ AND) + # should not raise any exceptions + def selfTwinSequence(): + Configurable.configurableRun3Behavior=1 + from AthenaCommon.CFElements import seqAND + accTop = ComponentAccumulator() + accTop.wasMerged() + seq1 = seqAND("seq1") + seq2 = seqAND("seq2") + seq2_again = seqAND("seq1") + accTop.addSequence(seq1) + accTop.addSequence(seq2, parentName = "seq1") + accTop.addSequence(seq2_again, parentName = "seq1") + accTop.wasMerged() + + + #Can't add a sequence with the same name two steps below itself, e.g. + # \__ AthAlgSeq (seq: PAR AND) + # \__ seq1 (seq: SEQ AND) + # \__ seq2 (seq: SEQ AND) + # \__ seq1 (seq: SEQ AND) + def selfGrandParentSequence(): + Configurable.configurableRun3Behavior=1 + from AthenaCommon.CFElements import seqAND + accTop = ComponentAccumulator() + accTop.store( open("test.pkl", "w") )#silence RuntimeError + seq1 = seqAND("seq1") + seq2 = seqAND("seq2") + seq1_again = seqAND("seq1") + accTop.addSequence(seq1) + accTop.addSequence(seq2, parentName = "seq1") + accTop.addSequence(seq1_again, parentName = "seq2") + accTop.wasMerged() + + #Can't merge sequences with the same name two steps below itself, e.g. + # \__ AthAlgSeq (seq: PAR AND) + # \__ seq1 (seq: SEQ AND) + # \__ seq2 (seq: SEQ AND) + # \__ seq1 (seq: SEQ AND) + def selfMergedGrandParentSequence(): + Configurable.configurableRun3Behavior=1 + from AthenaCommon.CFElements import seqAND + acc1=ComponentAccumulator() + acc1.wasMerged() + acc1.addSequence(seqAND("seq1")) + acc2=ComponentAccumulator() + acc2.wasMerged() + acc2.addSequence(seqAND("seq2")) + acc2.addSequence(seqAND("seq1"), "seq2") + acc1.merge(acc2) + + self.assertRaises(RuntimeError, selfSequence ) + self.assertRaises(RuntimeError, selfGrandParentSequence ) + self.assertRaises(RuntimeError, selfMergedGrandParentSequence ) + +class FailedMerging( unittest.TestCase ): + def runTest( self ): + topCA = ComponentAccumulator() + + def badMerge(): + someCA = ComponentAccumulator() + topCA.merge( (someCA, 1, "hello") ) + self.assertRaises(RuntimeError, badMerge ) + topCA.wasMerged() + + +class MergeMovingAlgorithms( unittest.TestCase ): + def runTest( self ): + Configurable.configurableRun3Behavior=1 + destinationCA = ComponentAccumulator() + destinationCA.addSequence( seqAND("dest") ) + + sourceCA = ComponentAccumulator() + sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg1")) + sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg2")) + sourceCA.addSequence( seqAND("innerSeq") ) + sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg3"), sequenceName="innerSeq" ) + + destinationCA.merge( sourceCA, sequenceName="dest" ) + + #destinationCA.merge( sourceCA ) + self.assertIsNotNone( findAlgorithm( destinationCA.getSequence("dest"), "alg1" ), "Algorithm not placed in sub-sequence" ) + self.assertIsNotNone( findSubSequence( destinationCA.getSequence(), "innerSeq" ), "The sequence is not added" ) + self.assertIsNotNone( findAlgorithm( destinationCA.getSequence("dest"), "alg3" ), "Algorithm deep in thesource CA not placed in sub-sequence of destiantion CA" ) + destinationCA.wasMerged() + sourceCA.wasMerged() + +if __name__ == "__main__": + unittest.main() -- GitLab From 412733ed6efbc0debc7d81330474e99e56120555 Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Tue, 19 Feb 2019 16:50:03 +0100 Subject: [PATCH 004/163] added functionality to change properties for many components --- Control/AthenaConfiguration/CMakeLists.txt | 2 +- .../python/ComponentAccumulator.py | 367 +++++------------- .../TrigUpgradeTest/share/newJOtest.py | 27 +- 3 files changed, 112 insertions(+), 284 deletions(-) diff --git a/Control/AthenaConfiguration/CMakeLists.txt b/Control/AthenaConfiguration/CMakeLists.txt index 9c17642b2cb3..2575ddee9b4f 100644 --- a/Control/AthenaConfiguration/CMakeLists.txt +++ b/Control/AthenaConfiguration/CMakeLists.txt @@ -14,7 +14,7 @@ atlas_install_runtime(python/*.pkl ) atlas_install_scripts( share/confTool.py python/iconfTool/iconfTool ) atlas_add_test( ComponentAccumulatorTest - SCRIPT python -m unittest -v AthenaConfiguration.ComponentAccumulator + SCRIPT python -m unittest -v AthenaConfiguration.ComponentAccumulatorTest POST_EXEC_SCRIPT nopost.sh ) atlas_add_test( UnifyPropertiesTest diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index 9d136f249a54..1ca584802a6a 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -5,7 +5,6 @@ from AthenaCommon.Configurable import Configurable,ConfigurableService,Configura from AthenaCommon.CFElements import isSequence,findSubSequence,findAlgorithm,flatSequencers,findOwningSequence,checkSequenceConsistency from AthenaCommon.AlgSequence import AthSequencer -from AthenaConfiguration.AthConfigFlags import AthConfigFlags import GaudiKernel.GaudiHandles as GaudiHandles from GaudiKernel.GaudiHandles import PublicToolHandle, PublicToolHandleArray, ServiceHandle, PrivateToolHandle, PrivateToolHandleArray import ast @@ -639,7 +638,6 @@ class ComponentAccumulator(object): self._wasMerged=True def createApp(self,OutputLevel=3): - log = logging.getLogger("ComponentAccumulator") self._wasMerged=True from Gaudi.Main import BootstrapHelper bsh=BootstrapHelper() @@ -675,14 +673,14 @@ class ComponentAccumulator(object): name=comp.getJobOptName() for k, v in comp.getValuedProperties().items(): if isinstance(v,Configurable): - log.debug("Adding "+name+"."+k+" = "+v.getFullName()) + self._msg.debug("Adding "+name+"."+k+" = "+v.getFullName()) bsh.addPropertyToCatalogue(jos,name,k,v.getFullName()) addCompToJos(v) elif isinstance(v,GaudiHandles.GaudiHandleArray): bsh.addPropertyToCatalogue(jos,name,k,str([ v1.getFullName() for v1 in v ])) else: if not isSequence(comp) and k!="Members": #This property his handled separatly - log.debug("Adding "+name+"."+k+" = "+str(v)) + self._msg.debug("Adding "+name+"."+k+" = "+str(v)) bsh.addPropertyToCatalogue(jos,name,k,str(v)) pass pass @@ -697,7 +695,7 @@ class ComponentAccumulator(object): #Add tree of algorithm sequences: for seqName, algoList in flatSequencers( self._sequence ).iteritems(): - log.debug("Members of %s : %s" % (seqName,str([alg.getFullName() for alg in algoList]))) + self._msg.debug("Members of %s : %s" % (seqName,str([alg.getFullName() for alg in algoList]))) bsh.addPropertyToCatalogue(jos,seqName,"Members",str( [alg.getFullName() for alg in algoList])) for alg in algoList: addCompToJos(alg) @@ -722,7 +720,6 @@ class ComponentAccumulator(object): def run(self,maxEvents=None,OutputLevel=3): - log = logging.getLogger("ComponentAccumulator") app = self.createApp (OutputLevel) #Determine maxEvents @@ -735,19 +732,19 @@ class ComponentAccumulator(object): print "INITIALIZE STEP" sc = app.initialize() if not sc.isSuccess(): - log.error("Failed to initialize AppMgr") + selg._msg.error("Failed to initialize AppMgr") return sc app.printAlgsSequences() #could be removed later .... sc = app.start() if not sc.isSuccess(): - log.error("Failed to start AppMgr") + self._msg.error("Failed to start AppMgr") return sc sc = app.run(maxEvents) if not sc.isSuccess(): - log.error("Failure running application") + self._msg.error("Failure running application") return sc app.stop().ignore() @@ -768,273 +765,91 @@ def CAtoGlobalWrapper(cfgmethod,flags): return +class PropSetterProxy(object): + __compPaths = {} + __scannedCA = None + + def __init__(self, ca, path): + self.__path = path + self.__findComponents( ca ) + + + def __setattr__(self, name, value): + if name.startswith("_PropSetterProxy"): + return super(PropSetterProxy, self).__setattr__(name, value) + + msg = logging.getLogger('forcomps') + import fnmatch + for component_path, component in PropSetterProxy.__compPaths.iteritems(): + if fnmatch.fnmatch( component_path, self.__path ): + #print "cp", component + if name in component.getProperties(): + try: + setattr( component, name, value ) + msg.debug( "Set property: %s to value %s of component %s because it matched %s " % ( name, str(value), component_path, self.__path ) ) + except Exception, ex: + msg.warning( "Failed to set property: %s to value %s of component %s because it matched %s, reason: %s" % ( name, str(value), component_path, self.__path, str(ex) ) ) + pass + else: + msg.warning( "No such a property: %s in component %s, tried to set it because it matched %s" % ( name, component_path, self.__path ) ) + + + def __findComponents(self, ca): + if ca is not PropSetterProxy.__scannedCA: + PropSetterProxy.__scannedCA = ca + PropSetterProxy.__compPaths = {} + def __add(path, comp): + if comp.getName() == "": + return + PropSetterProxy.__compPaths[ path ] = comp + + for svc in ca._services: + PropSetterProxy.__compPaths['SvcMgr/'+svc.getFullName()] = svc + for t in ca._publicTools: + PropSetterProxy.__compPaths['ToolSvc/'+t.getFullName()] = t + + def __nestAlg(startpath, comp): # it actually dives inside the algorithms and (sub) tools + if comp.getName() == "": + return + for name, value in comp.getProperties().iteritems(): + if isinstance( value, ConfigurableAlgTool ) or isinstance( value, PrivateToolHandle ): + __add( startpath+"/"+name+"/"+value.getFullName(), value ) + __nestAlg( startpath+"/"+name+"/"+value.getName(), value ) + if isinstance( value, PrivateToolHandleArray): + for toolIndex,t in enumerate(value): + __add( startpath+"/"+name+"/"+t.getFullName(), t ) + __nestAlg( startpath+"/"+name+"/"+t.getName(), value[toolIndex] ) + + + def __nestSeq(startpath, comp): + for c in comp.getChildren(): + if isSequence(c): + __nestSeq( startpath+"/"+c.getName(), c) + else: # the algorithm or tool + PropSetterProxy.__compPaths[ startpath+"/"+c.getFullName() ] = comp + __nestAlg( startpath+"/"+c.getFullName(), c ) + + __nestSeq("", ca._sequence) + + +def forcomps(componentAccumulator, path): + """ Utility to set properties of components using wildcards + + Example: + forcomps(ca, "*/HLTTop/*/*Hypo*").OutputLevel=VERBOSE + + The compoments name & locations in the CF tree are translated into the unix like path. + Components of matching path are taken under consideration in setting the property. + If the property is set succesfully an INFO message is printed. Else, a warning is printed. + + The convention for path of nested components is as follows: + Sequencer - only the name is used in the path + Algorithm - full name - type/instance_name (aka full name) is used + PrivateTools - the name of the property + the type/instance_name are added + PublicTools - are located under ToolSvc/ and type/instance_name is used + Services - located under SvcMgr/ and type/instance_name is used + """ + return PropSetterProxy(componentAccumulator, path) -# self test -import unittest - -class TestComponentAccumulator( unittest.TestCase ): - def setUp(self): - - Configurable.configurableRun3Behavior+=1 - # trivial case without any nested sequences - from AthenaCommon.Configurable import ConfigurablePyAlgorithm # guinea pig algorithms - from AthenaCommon.CFElements import seqAND, parOR - from AthenaCommon.Logging import log - from AthenaCommon.Constants import DEBUG - - log.setLevel(DEBUG) - - dummyCfgFlags=AthConfigFlags() - dummyCfgFlags.lock() - - class Algo(ConfigurablePyAlgorithm): - def __init__(self, name): - super( ConfigurablePyAlgorithm, self ).__init__( name ) - - def AlgsConf1(flags): - acc = ComponentAccumulator() - a1=Algo("Algo1") - a2=Algo("Algo2") - return acc,[a1,a2] - - - def AlgsConf2(flags): - acc = ComponentAccumulator() - result,algs=AlgsConf1( flags ) - acc.merge(result) - algs.append(Algo("Algo3")) - return acc,algs - - acc = ComponentAccumulator() - - # top level algs - acc1,algs=AlgsConf2(dummyCfgFlags) - acc.merge(acc1) - acc.addEventAlgo(algs) - - def AlgsConf3(flags): - acc = ComponentAccumulator() - na1=Algo("NestedAlgo1") - return acc,na1 - - def AlgsConf4(flags): - acc,na1= AlgsConf3( flags ) - NestedAlgo2 = Algo("NestedAlgo2") - NestedAlgo2.OutputLevel=7 - return acc,na1,NestedAlgo2 - - acc.addSequence( seqAND("Nest") ) - acc.addSequence( seqAND("subSequence1"), parentName="Nest" ) - acc.addSequence( parOR("subSequence2"), parentName="Nest" ) - - acc.addSequence( seqAND("sub2Sequence1"), parentName="subSequence1") - acc.addSequence( seqAND("sub3Sequence1"), parentName="subSequence1") - acc.addSequence( seqAND("sub4Sequence1"), parentName="subSequence1") - - accNA1=AlgsConf4(dummyCfgFlags) - acc.merge(accNA1[0]) - acc.addEventAlgo(accNA1[1:],"sub2Sequence1" ) - acc.store(open("testFile.pkl", "w")) - self.acc = acc - - - def test_algorihmsAreAdded( self ): - self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo1", 1).name(), "Algo1", "Algorithm not added to a top sequence" ) - self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo2", 1).name(), "Algo2", "Algorithm not added to a top sequence" ) - self.assertEqual( findAlgorithm( self.acc.getSequence(), "Algo3", 1).name(), "Algo3", "Algorithm not added to a top sequence" ) - - def test_sequencesAreAdded( self ): - self.assertIsNotNone( self.acc.getSequence("subSequence1" ), "Adding sub-sequence failed" ) - self.assertIsNotNone( self.acc.getSequence("subSequence2" ), "Adding sub-sequence failed" ) - self.assertIsNotNone( self.acc.getSequence("sub2Sequence1"), "Adding sub-sequence failed" ) - self.assertIsNotNone( findSubSequence( self.acc.getSequence("subSequence1"), "sub2Sequence1"), "Adding sub-sequence done in a wrong place" ) - - def test_algorithmsInNestedSequences( self ): - self.assertIsNotNone( findAlgorithm( self.acc.getSequence(), "NestedAlgo1" ), "Algorithm added to nested sequence" ) - self.assertIsNotNone( findAlgorithm( self.acc.getSequence(), "NestedAlgo1", 1 ) is None, "Algorithm mistakenly in top sequence" ) - self.assertIsNotNone( findAlgorithm( findSubSequence( self.acc.getSequence(), "sub2Sequence1"), "NestedAlgo1", 1 ), "Algorithm not in right sequence" ) - - - def test_readBackConfiguration( self ): - import pickle - with open( "testFile.pkl" ) as f: - s = pickle.load( f ) - self.assertIsNotNone( s, "The pickle has no content") - -class TestHLTCF( unittest.TestCase ): - def runTest( self ): - # replicate HLT issue, it occured because the sequnces were recorded in the order of storing in the dict and thus the - # some of them (in this case hltSteps) did not have properties recorded - from AthenaCommon.CFElements import seqAND, seqOR, parOR - from AthenaCommon.Configurable import ConfigurablePyAlgorithm # guinea pig algorithms - Configurable.configurableRun3Behavior=1 - acc = ComponentAccumulator() - acc.addSequence( seqOR("hltTop") ) - algos2 = ConfigurablePyAlgorithm( "RecoAlgInTop" ) - acc.addEventAlgo( algos2, sequenceName="hltTop" ) # some algo - acc.addSequence( seqAND("hltSteps"), parentName="hltTop" ) - acc.addSequence( parOR("hltStep_1"), parentName="hltSteps" ) - acc.addSequence( seqAND("L2CaloEgammaSeq"), "hltStep_1" ) - acc.addSequence( parOR("hltStep_2"), parentName="hltSteps" ) - acc.moveSequence( "L2CaloEgammaSeq", "hltStep_2" ) - - acc.store(open("testFile2.pkl", "w")) - import pickle - f = open("testFile2.pkl") - s = pickle.load(f) - f.close() - self.assertNotEqual( s['hltSteps']['Members'], '[]', "Empty set of members in hltSteps, Sequences recording order metters" ) - - -class MultipleParentsInSequences( unittest.TestCase ): - def runTest( self ): - # test if an algorithm (or sequence) can be controlled by more than one sequence - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - from AthenaCommon.Configurable import ConfigurablePyAlgorithm # guinea pig algorithms - accTop = ComponentAccumulator() - - recoSeq = seqAND("seqReco") - recoAlg = ConfigurablePyAlgorithm( "recoAlg" ) - recoSeq += recoAlg - - acc1 = ComponentAccumulator() - acc1.addSequence( seqAND("seq1") ) - acc1.addSequence( recoSeq, parentName="seq1" ) - - acc2 = ComponentAccumulator() - acc2.addSequence( seqAND("seq2") ) - acc2.addSequence( recoSeq, parentName="seq2" ) - - accTop.merge( acc1 ) - accTop.merge( acc2 ) - - accTop.printConfig() - - self.assertIsNotNone( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), "Algorithm missing in the first sequence" ) - self.assertIsNotNone( findAlgorithm( accTop.getSequence( "seq2" ), "recoAlg" ), "Algorithm missing in the second sequence" ) - s = accTop.getSequence( "seqReco" ) - self.assertEqual( len( s.getChildren() ), 1, "Wrong number of algorithms in reco seq: %d " % len( s.getChildren() ) ) - self.assertIs( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), findAlgorithm( accTop.getSequence( "seq2" ), "recoAlg" ), "Algorithms are cloned" ) - self.assertIs( findAlgorithm( accTop.getSequence( "seq1" ), "recoAlg" ), recoAlg, "Clone of the original inserted in sequence" ) - accTop.store( open("dummy.pkl", "w") ) - import pickle - # check if the recording did not harm the sequences - with open("dummy.pkl") as f: - s = pickle.load( f ) - self.assertEquals( s['seq1']["Members"], "['AthSequencer/seqReco']", "After pickling recoSeq missing in seq1 " + s['seq1']["Members"]) - self.assertEquals( s['seq2']["Members"], "['AthSequencer/seqReco']", "After pickling recoSeq missing in seq2 " + s['seq2']["Members"]) - self.assertEquals( s['seqReco']["Members"], "['ConfigurablePyAlgorithm/recoAlg']", "After pickling seqReco is corrupt " + s['seqReco']["Members"] ) - -class ForbidRecursiveSequences( unittest.TestCase ): - def runTest( self ): - #Can't add a sequence with the same name below itself, e.g. - # \__ AthAlgSeq (seq: PAR AND) - # \__ seq1 (seq: SEQ AND) - # \__ seq1 (seq: SEQ AND) - def selfSequence(): - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - accTop = ComponentAccumulator() - accTop.wasMerged() - seq1 = seqAND("seq1") - seq1_again = seqAND("seq1") - accTop.addSequence(seq1) - accTop.addSequence(seq1_again, parentName = "seq1") - - #Allowed to add a sequence with the same name at same depth, e.g. - # \__ AthAlgSeq (seq: PAR AND) - # \__ seq1 (seq: SEQ AND) - # \__ seq2 (seq: SEQ AND) - # \__ seq2 (seq: SEQ AND) - # should not raise any exceptions - def selfTwinSequence(): - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - accTop = ComponentAccumulator() - accTop.wasMerged() - seq1 = seqAND("seq1") - seq2 = seqAND("seq2") - seq2_again = seqAND("seq1") - accTop.addSequence(seq1) - accTop.addSequence(seq2, parentName = "seq1") - accTop.addSequence(seq2_again, parentName = "seq1") - accTop.wasMerged() - - #Can't add a sequence with the same name two steps below itself, e.g. - # \__ AthAlgSeq (seq: PAR AND) - # \__ seq1 (seq: SEQ AND) - # \__ seq2 (seq: SEQ AND) - # \__ seq1 (seq: SEQ AND) - def selfGrandParentSequence(): - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - accTop = ComponentAccumulator() - accTop.store( open("test.pkl", "w") )#silence RuntimeError - seq1 = seqAND("seq1") - seq2 = seqAND("seq2") - seq1_again = seqAND("seq1") - accTop.addSequence(seq1) - accTop.addSequence(seq2, parentName = "seq1") - accTop.addSequence(seq1_again, parentName = "seq2") - accTop.wasMerged() - - #Can't merge sequences with the same name two steps below itself, e.g. - # \__ AthAlgSeq (seq: PAR AND) - # \__ seq1 (seq: SEQ AND) - # \__ seq2 (seq: SEQ AND) - # \__ seq1 (seq: SEQ AND) - def selfMergedGrandParentSequence(): - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - acc1=ComponentAccumulator() - acc1.wasMerged() - acc1.addSequence(seqAND("seq1")) - acc2=ComponentAccumulator() - acc2.wasMerged() - acc2.addSequence(seqAND("seq2")) - acc2.addSequence(seqAND("seq1"), "seq2") - acc1.merge(acc2) - - self.assertRaises(RuntimeError, selfSequence ) - self.assertRaises(RuntimeError, selfGrandParentSequence ) - self.assertRaises(RuntimeError, selfMergedGrandParentSequence ) - -class FailedMerging( unittest.TestCase ): - def runTest( self ): - topCA = ComponentAccumulator() - - def badMerge(): - someCA = ComponentAccumulator() - topCA.merge( (someCA, 1, "hello") ) - self.assertRaises(RuntimeError, badMerge ) - topCA.wasMerged() - - -class MergeMovingAlgorithms( unittest.TestCase ): - def runTest( self ): - Configurable.configurableRun3Behavior=1 - from AthenaCommon.CFElements import seqAND - from AthenaCommon.Configurable import ConfigurablePyAlgorithm # guinea pig algorithms - destinationCA = ComponentAccumulator() - destinationCA.addSequence( seqAND("dest") ) - - sourceCA = ComponentAccumulator() - sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg1")) - sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg2")) - sourceCA.addSequence( seqAND("innerSeq") ) - sourceCA.addEventAlgo(ConfigurablePyAlgorithm("alg3"), sequenceName="innerSeq" ) - - destinationCA.merge( sourceCA, sequenceName="dest" ) - - #destinationCA.merge( sourceCA ) - self.assertIsNotNone( findAlgorithm( destinationCA.getSequence("dest"), "alg1" ), "Algorithm not placed in sub-sequence" ) - self.assertIsNotNone( findSubSequence( destinationCA.getSequence(), "innerSeq" ), "The sequence is not added" ) - self.assertIsNotNone( findAlgorithm( destinationCA.getSequence("dest"), "alg3" ), "Algorithm deep in thesource CA not placed in sub-sequence of destiantion CA" ) - destinationCA.wasMerged() - sourceCA.wasMerged() - -if __name__ == "__main__": - unittest.main() diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py index 21bd5aa00cda..cd6b9b94966a 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py @@ -27,7 +27,7 @@ flags.Trigger.L1Decoder.forceEnableAllChains = True flags.lock() -from AthenaCommon.Constants import INFO,DEBUG +from AthenaCommon.Constants import INFO,DEBUG,WARNING acc = ComponentAccumulator() from ByteStreamCnvSvc.ByteStreamConfig import TrigBSReadCfg @@ -68,12 +68,24 @@ if mcc: top += mcc -# from TrigUpgradeTest.TestUtils import applyMenu -# applyMenu( acc.getEventAlgo( "L1Decoder" ) ) -#acc.getEventAlgo( "L1Decoder" ).OutputLevel=DEBUG -#acc.getEventAlgo( "L2ElectronCaloHypo" ).OutputLevel=DEBUG -#acc.getEventAlgo( "FastEMCaloAlgo" ).OutputLevel=DEBUG -#acc.getEventAlgo( "Filter_for_L2PhotonCaloHypo" ).OutputLevel=DEBUG +from AthenaConfiguration.ComponentAccumulator import forcomps +from AthenaCommon.Logging import logging +logging.getLogger('forcomps').setLevel(DEBUG) +forcomps(acc, "*/L1Decoder").OutputLevel = DEBUG +forcomps(acc, "*/L1Decoder/*Tool").OutputLevel = DEBUG # tools +forcomps(acc, "*HLTTop/*Hypo*").OutputLevel = DEBUG # hypo algs +forcomps(acc, "*HLTTop/*Hypo*/*Tool*").OutputLevel = DEBUG # hypo tools +forcomps(acc, "*HLTTop/RoRSeqFilter/*").OutputLevel = DEBUG # filters +forcomps(acc, "*HLTTop/*Input*").OutputLevel = DEBUG # input makers +forcomps(acc, "*HLTTop/*GenericMonitoringTool*").OutputLevel = WARNING # silcence mon tools (addressing by type) + + +# # from TrigUpgradeTest.TestUtils import applyMenu +# # applyMenu( acc.getEventAlgo( "L1Decoder" ) ) +# #acc.getEventAlgo( "L1Decoder" ).OutputLevel=DEBUG +# #acc.getEventAlgo( "L2ElectronCaloHypo" ).OutputLevel=DEBUG +# #acc.getEventAlgo( "FastEMCaloAlgo" ).OutputLevel=DEBUG +# #acc.getEventAlgo( "Filter_for_L2PhotonCaloHypo" ).OutputLevel=DEBUG acc.printConfig() @@ -86,3 +98,4 @@ with file(fname, "w") as p: + -- GitLab From 4488f97b71aba6e0e44c5c237548c34822b06f9d Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Wed, 20 Feb 2019 21:26:27 +0100 Subject: [PATCH 005/163] fixed NewJO --- Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py index 9a2055fbe333..5bfa3555b7c2 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py @@ -68,7 +68,7 @@ if mcc: top += mcc -from AthenaConfiguration.ComponentAccumulator import forcomps +from AthenaConfiguration.ComponentAccumulator import foreach_component from AthenaCommon.Logging import logging logging.getLogger('forcomps').setLevel(DEBUG) foreach_component(acc, "*/L1Decoder").OutputLevel = DEBUG -- GitLab From 3b6572ea2dfcf2eb35a803c72a88019f02f55679 Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Mon, 25 Feb 2019 14:50:59 +0100 Subject: [PATCH 006/163] CA on which the foreach_component was used is not mergable --- Control/AthenaConfiguration/python/ComponentAccumulator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index 965401231f77..eeb1523b89da 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -42,6 +42,7 @@ class ComponentAccumulator(object): #To check if this accumulator was merged: self._wasMerged=False + self._isMergable=True def empty(self): @@ -451,7 +452,9 @@ class ComponentAccumulator(object): if not isinstance(other,ComponentAccumulator): raise TypeError("Attempt merge wrong type %s. Only instances of ComponentAccumulator can be added" % type(other).__name__) - + + if not other._isMergable: + raise ConfigurationError("Attempted to merge the accumulator that was unsafely manipulated (likely with foreach_component, ...)") if not Configurable.configurableRun3Behavior: raise ConfigurationError("discoverd Configurable.configurableRun3Behavior=False while working woth ComponentAccumulator") @@ -883,6 +886,7 @@ def foreach_component(componentAccumulator, path): PublicTools - are located under ToolSvc/ and type/instance_name is used Services - located under SvcMgr/ and type/instance_name is used """ + componentAccumulator._isMergable=False return PropSetterProxy(componentAccumulator, path) -- GitLab From 22a8df07ab47da644a52a3daf299d68e1d279576 Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 27 Feb 2019 17:38:55 +0000 Subject: [PATCH 007/163] Adding first update where I looked at implementing the cache into the raw data provider for RPC and need to next look at the ROD decoder and also how the other tools are included --- .../src/RPC_RawDataProviderTool.cxx | 41 +- .../src/RPC_RawDataProviderTool.h | 7 +- .../MuonConfig/share/MuonDataDecodeTest.ref | 1296 ++++++++++++++++- 3 files changed, 1321 insertions(+), 23 deletions(-) diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx index 7cc1e4841c91..c7a9f62bd030 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx @@ -37,6 +37,7 @@ Muon::RPC_RawDataProviderTool::RPC_RawDataProviderTool( { declareInterface<IMuonRawDataProviderTool>(this); declareProperty("Decoder", m_decoder); + declareProperty ("RpcContainerCacheKey", m_rdoContainerCacheKey, "Optional external cache for the RPC container"); } @@ -50,11 +51,13 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() StatusCode sc = AlgTool::initialize(); if (sc.isFailure()) return sc; - sc = service("ActiveStoreSvc", m_activeStore); - if ( !sc.isSuccess() ) { - ATH_MSG_FATAL( "Could not get active store service" ); - return sc; - } + sc = service("ActiveStoreSvc", m_activeStore); + if ( !sc.isSuccess() ) { + ATH_MSG_FATAL( "Could not get active store service" ); + return sc; + } + + ATH_CHECK( m_rdoContainerCacheKey.initialize( !m_rdoContainerCacheKey.key().empty() ) ); if (m_decoder.retrieve().isFailure()) { @@ -160,7 +163,7 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() // register the container only when the imput from ByteStream is set up m_activeStore->setStore( &*evtStore() ); - if( has_bytestream || m_RpcPadC.key() != "RPCPAD" ) + if( has_bytestream || m_containerKey.key() != "RPCPAD" ) { m_AllowCreation= true; } @@ -171,7 +174,7 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() ATH_MSG_INFO( "initialize() successful in " << name()); - ATH_CHECK( m_RpcPadC.initialize() ); + ATH_CHECK( m_containerKey.initialize() ); ATH_CHECK( m_sec.initialize() ); return StatusCode::SUCCESS; @@ -248,10 +251,25 @@ StatusCode Muon::RPC_RawDataProviderTool::convert(const ROBFragmentList& vecRobs // on the user experience } - SG::WriteHandle<RpcPadContainer> padHandle(m_RpcPadC); - if (padHandle.isPresent()) + SG::WriteHandle<RpcPadContainer> rdoContainerHandle(m_containerKey); + if (rdoContainerHandle.isPresent()) return StatusCode::SUCCESS; - auto pad = std::make_unique<RpcPadContainer> (padMaxIndex); + + + // Split the methods to have one where we use the cache and one where we just setup the container + const bool externalCacheRDO = !m_rdoContainerCacheKey.key().empty(); + if(!externalCacheRDO){ + ATH_CHECK( rdoContainerHandle.record(std::make_unique<RpcPadContainer> (padMaxIndex) ) ); + ATH_MSG_DEBUG( "Created RpcPadContainer" ); + } + else{ + SG::UpdateHandle<RpcPad_Cache> update(m_rdoContainerCacheKey); + ATH_CHECK(update.isValid()); + ATH_CHECK(rdoContainerHandle.record (std::make_unique<RpcPadContainer>( update.ptr() ))); + ATH_MSG_DEBUG("Created container using cache for " << m_rdoContainerCacheKey.key()); + } + + RpcPadContainer* pad = rdoContainerHandle.ptr(); SG::WriteHandle<RpcSectorLogicContainer> logicHandle(m_sec); auto logic = std::make_unique<RpcSectorLogicContainer>(); @@ -281,7 +299,8 @@ StatusCode Muon::RPC_RawDataProviderTool::convert(const ROBFragmentList& vecRobs // store the error condition into the StatusCode and continue } } - ATH_CHECK( padHandle.record (std::move (pad)) ); + // Unsure about this at the moment + //ATH_CHECK( rdoContainerHandle.record (std::move (pad)) ); ATH_CHECK( logicHandle.record (std::move (logic)) ); //in presence of errors return FAILURE //CALLGRIND_STOP_INSTRUMENTATION diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h index c1a2778c582a..820755fecbba 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h @@ -9,6 +9,7 @@ #include "GaudiKernel/ToolHandle.h" #include "MuonCnvToolInterfaces/IMuonRawDataProviderTool.h" #include "MuonRDO/RpcPadContainer.h" +#include "MuonRDO/RpcPad_Cache.h" #include "MuonRDO/RpcSectorLogicContainer.h" class StoreGateSvc; @@ -54,7 +55,7 @@ private: // ServiceHandle<StoreGateSvc> m_eventStore; ToolHandle<IRpcROD_Decoder> m_decoder; // std::string m_rdoContainerKey; - SG::WriteHandleKey<RpcPadContainer> m_RpcPadC { + SG::WriteHandleKey<RpcPadContainer> m_containerKey { this, "RdoLocation", "RPCPAD", "Name of the RPCPAD produced by RawDataProvider"}; SG::WriteHandleKey<RpcSectorLogicContainer> m_sec{ this, "RPCSec", "RPC_SECTORLOGIC", "Name of the RPC_SECTORLOGIC produced by RawDataProvider"}; @@ -68,6 +69,10 @@ private: const IRPCcablingSvc *m_rpcCabling; // Rob Data Provider handle ServiceHandle<IROBDataProviderSvc> m_robDataProvider; + + /// RPC container cache key + SG::UpdateHandleKey<RpcPad_Cache> m_rdoContainerCacheKey ; + }; diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref index 80ddcf2e960b..11fd69c71ab9 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref @@ -1,10 +1,47 @@ Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : [function] +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:Athena INFO About to setup Rpc Raw data decoding Py:ComponentAccumulator DEBUG Adding component EventSelectorByteStream/EventSelector to the job @@ -34,13 +71,119 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/ByteStreamAttListMetadataSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] dynamically loading the flag Detector Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : [function] +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : [function] +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : [function] +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : [function] +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : [function] +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -49,12 +192,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -73,6 +219,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -97,25 +244,37 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component RPCcablingServerSvc/RPCcablingServerSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job @@ -126,12 +285,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -151,6 +313,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -172,17 +335,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component LVL1TGC::TGCRecRoiSvc/LVL1TGC::TGCRecRoiSvc to the job Py:ComponentAccumulator DEBUG Adding component TGCcablingServerSvc/TGCcablingServerSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -191,12 +375,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -216,8 +403,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -258,6 +447,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -272,10 +467,171 @@ Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersiste Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job dynamically loading the flag Muon Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : False +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : False +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : False +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : False +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : False +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : 'CONDBR2' +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : 'data17_13TeV' +Input.RunNumber : [function] +Input.isMC : False +Muon.Align.UseALines : False +Muon.Align.UseAsBuilt : False +Muon.Align.UseBLines : 'none' +Muon.Align.UseILines : False +Muon.Calib.CscF001FromLocalFile : False +Muon.Calib.CscNoiseFromLocalFile : False +Muon.Calib.CscPSlopeFromLocalFile : False +Muon.Calib.CscPedFromLocalFile : False +Muon.Calib.CscRmsFromLocalFile : False +Muon.Calib.CscStatusFromLocalFile : False +Muon.Calib.CscT0BaseFromLocalFile : False +Muon.Calib.CscT0PhaseFromLocalFile : False +Muon.Calib.EventTag : 'MoMu' +Muon.Calib.applyRtScaling : True +Muon.Calib.correctMdtRtForBField : False +Muon.Calib.correctMdtRtForTimeSlewing : False +Muon.Calib.correctMdtRtWireSag : False +Muon.Calib.mdtCalibrationSource : 'MDT' +Muon.Calib.mdtMode : 'ntuple' +Muon.Calib.mdtPropagationSpeedBeta : 0.85 +Muon.Calib.readMDTCalibFromBlob : True +Muon.Calib.useMLRt : True +Muon.Chi2NDofCut : 20.0 +Muon.createTrackParticles : True +Muon.doCSCs : True +Muon.doDigitization : True +Muon.doFastDigitization : False +Muon.doMDTs : True +Muon.doMSVertex : False +Muon.doMicromegas : False +Muon.doPseudoTracking : False +Muon.doRPCClusterSegmentFinding : False +Muon.doRPCs : True +Muon.doSegmentT0Fit : False +Muon.doTGCClusterSegmentFinding : False +Muon.doTGCs : True +Muon.dosTGCs : False +Muon.enableCurvedSegmentFinding : False +Muon.enableErrorTuning : False +Muon.optimiseMomentumResolutionUsingChi2 : False +Muon.patternsOnly : False +Muon.prdToxAOD : False +Muon.printSummary : False +Muon.refinementTool : 'Moore' +Muon.rpcRawToxAOD : False +Muon.segmentOrigin : 'Muon' +Muon.straightLineFitMomentum : 2000.0 +Muon.strategy : [] +Muon.trackBuilder : 'Moore' +Muon.updateSegmentSecondCoordinate : [function] +Muon.useAlignmentCorrections : False +Muon.useLooseErrorTuning : False +Muon.useSegmentMatching : [function] +Muon.useTGCPriorNextBC : False +Muon.useTrackSegmentMatching : True +Muon.useWireSagCorrections : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job @@ -296,12 +652,30 @@ Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... +Py:ConfigurableDb DEBUG loading confDb files... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/WorkDir.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG loading confDb files... [DONE] +Py:ConfigurableDb DEBUG loaded 1103 confDb packages +Py:ConfigurableDb INFO Read module info for 5460 configurables from 4 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... +Py:ConfigurableDb DEBUG : Found configurable <class 'PoolSvc.PoolSvcConf.PoolSvc'> in module PoolSvc.PoolSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaServices.AthenaServicesConf.MetaDataSvc'> in module AthenaServices.AthenaServicesConf +Py:ConfigurableDb DEBUG : Found configurable <class 'StoreGate.StoreGateConf.StoreGateSvc'> in module StoreGate.StoreGateConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDbSvc... +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... +EventInfoMgtInit: Got release version Athena-22.0.1 Py:Configurable ERROR attempt to add a duplicate (ServiceManager.EventPersistencySvc) ... dupe ignored +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDb... [DONE] @@ -317,9 +691,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -331,21 +719,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job @@ -356,12 +765,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -384,16 +796,32 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component CSCcablingSvc/CSCcablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -402,12 +830,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -426,6 +857,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -450,14 +882,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonRPC_CnvTools.MuonRPC_CnvToolsConf.Muon__RpcRDO_Decoder'> in module MuonRPC_CnvTools.MuonRPC_CnvToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component RPCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonRPC_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.RPCCablingDbTool Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -466,12 +922,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -491,6 +950,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -512,14 +972,36 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component LVL1TGC::TGCRecRoiSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TGCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -528,12 +1010,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -553,8 +1038,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -593,6 +1080,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -632,9 +1125,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -646,14 +1153,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingAlg +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AtlasFieldSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MDTCablingDbTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MuonCalib::MdtCalibDbCoolStrTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -662,12 +1197,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -714,6 +1252,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -726,6 +1270,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -738,6 +1288,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -750,6 +1306,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -762,6 +1324,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -774,6 +1342,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -786,11 +1360,18 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -799,19 +1380,48 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonCSC_CnvTools.MuonCSC_CnvToolsConf.Muon__CscRDO_Decoder'> in module MuonCSC_CnvTools.MuonCSC_CnvToolsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'CscCalibTools.CscCalibToolsConf.CscCalibTool'> in module CscCalibTools.CscCalibToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CSCcablingSvc Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc Py:Athena INFO Print Config +Py:ComponentAccumulator INFO Event Inputs +Py:ComponentAccumulator INFO set([]) +Py:ComponentAccumulator INFO Event Algorithm Sequences +Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ************************************************************ |-Atomic = False |-AuditAlgorithms = False |-AuditBeginRun = False @@ -823,21 +1433,29 @@ Py:Athena INFO Print Config |-AuditRestart = False |-AuditStart = False |-AuditStop = False +|-Cardinality = 0 |-ContinueEventloopOnFPE = False +|-DetStore @0x7fb6097b9e50 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 +|-EvtStore @0x7fb6097b9dd0 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7fb607cefb00 = [] (default: []) +|-ExtraOutputs @0x7fb607cefc68 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False +|-Members @0x7fb607cef9e0 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' +|-NeededResources @0x7fb607cefd40 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False |-Sequential = False |-StopOverride = False |-TimeOut = 0.0 +|-Timeline = True |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** | |-AuditAlgorithms = False | |-AuditBeginRun = False @@ -849,29 +1467,44 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fb6082c0690 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb6082c0610 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cefdd0 = [] (default: []) +| |-ExtraOutputs @0x7fb607cefea8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cefd88 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fb608438550 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7fb6082c0710 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' -| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7fb60874b810 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7fb608268510 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb6082684d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb6082ab290 = [] (default: []) +| | |-ExtraOutputs @0x7fb6082ab170 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-RpcContainerCacheKey = 'StoreGateSvc+' | | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** | | | |-AuditFinalize = False | | | |-AuditInitialize = False @@ -881,6 +1514,10 @@ Py:Athena INFO Print Config | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7fb6082685d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb608268610 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb6082ab200 = [] (default: []) +| | | |-ExtraOutputs @0x7fb6082ab1b8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -899,15 +1536,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fb6082ce650 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb6082ce5d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6128 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf6200 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf6170 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fb6095638c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -916,7 +1561,12 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7fb6095639b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7fb60820bb10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb60820bb50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb608210560 = [] (default: []) +| | |-ExtraOutputs @0x7fb6082103b0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -928,6 +1578,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fb60820bc10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb60820bc50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb608210200 = [] (default: []) +| | | |-ExtraOutputs @0x7fb608210368 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -946,15 +1600,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fb608290890 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb608290810 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6248 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf62d8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf61b8 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fb608438c50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -964,6 +1626,11 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CsmContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7fb609563c80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7fb607dc9c10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb607dc9c50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607dd0560 = [] (default: []) +| | |-ExtraOutputs @0x7fb607dd05f0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+MDTCSM' @@ -976,6 +1643,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fb607dc9d10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb607dc9d50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb607dd04d0 = [] (default: []) +| | | |-ExtraOutputs @0x7fb607dd0488 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -994,15 +1665,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fb6082a9d90 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb6082a9cd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6320 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf6368 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf6098 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fb608438e50 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1012,7 +1691,12 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CscContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7fb609563e60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7fb607d8cad0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7fb607d8cb10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607d89c68 = [] (default: []) +| | |-ExtraOutputs @0x7fb607d89ef0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+CSCRDO' @@ -1024,6 +1708,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fb607d8cbd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb607d8cc10 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb607d89dd0 = [] (default: []) +| | | |-ExtraOutputs @0x7fb607d89d88 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1042,19 +1730,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fb608434d20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7fb607cc6590 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb607cc6510 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf60e0 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf6440 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf6488 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fb60ae66b20 = False (default: False) +| |-RegionSelectionSvc @0x7fb607cc6610 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1064,11 +1762,16 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7fb607d2e750 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb607d2e7d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607d9b638 = [] (default: []) +| | |-ExtraOutputs @0x7fb607d9b7e8 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7fb6080a53d0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1086,6 +1789,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fb607d2e850 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb607d2e890 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb607d9b908 = [] (default: []) +| | | |-ExtraOutputs @0x7fb607d9b8c0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1102,20 +1809,30 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fb607d3b050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7fb607d20490 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb607d20410 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6290 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf64d0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf6518 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fb60ae66b20 = False (default: False) +| |-RegionSelectorSvc @0x7fb607d20510 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 +| |-Timeline = True | |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1125,6 +1842,10 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7fb607d2e610 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb607d2e950 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607d3e8c0 = [] (default: []) +| | |-ExtraOutputs @0x7fb607d3e758 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1133,7 +1854,9 @@ Py:Athena INFO Print Config | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7fb607d3e680 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7fb607d3e098 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1149,19 +1872,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fb60a6e0890 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7fb607cba450 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb607cba3d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf65a8 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf6638 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf65f0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fb60ae66b20 = False (default: False) +| |-RegionSelectionSvc @0x7fb607cba4d0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1172,9 +1905,13 @@ Py:Athena INFO Print Config | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True +| | |-DetStore @0x7fb607d2ebd0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True +| | |-EvtStore @0x7fb607d2ec90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607d48ef0 = [] (default: []) +| | |-ExtraOutputs @0x7fb607d48d88 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1201,19 +1938,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7fb6084155a0 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7fb607d3ca50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb607d3c950 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6710 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf63b0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf6680 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fb60ae66b20 = False (default: False) +| |-RegionSelectionSvc @0x7fb607d3cad0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1223,7 +1970,13 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7fb60a74ab10 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7fb607d46b30 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True +| | |-DetStore @0x7fb607d2e790 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fb607d2ef10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fb607d3e2d8 = [] (default: []) +| | |-ExtraOutputs @0x7fb607d3eef0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1236,6 +1989,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fb607d2ef50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb607d2ef90 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb607d3ef80 = [] (default: []) +| | | |-ExtraOutputs @0x7fb608210cb0 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -1262,6 +2019,11 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-CscCalibTool @0x7fb607d2ee90 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7fb607d2e8d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fb607d2eed0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fb607d3e050 = [] (default: []) +| | | |-ExtraOutputs @0x7fb607d3eab8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -1278,30 +2040,449 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fb607c3a290 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fb607c3a210 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fb607cf6758 = [] (default: []) +| |-ExtraOutputs @0x7fb607cf67a0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fb607cf67e8 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7fb607cebb90 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +Py:ComponentAccumulator INFO Condition Algorithms +Py:ComponentAccumulator INFO ['CondInputLoader', 'MuonMDT_CablingAlg'] +Py:ComponentAccumulator INFO Services +Py:ComponentAccumulator INFO ['EventSelector', 'ByteStreamInputSvc', 'EventPersistencySvc', 'ByteStreamCnvSvc', 'ROBDataProviderSvc', 'ByteStreamAddressProviderSvc', 'MetaDataStore', 'InputMetaDataStore', 'MetaDataSvc', 'ProxyProviderSvc', 'ByteStreamAttListMetadataSvc', 'GeoModelSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'RPCcablingServerSvc', 'IOVDbSvc', 'PoolSvc', 'CondSvc', 'DBReplicaSvc', 'MuonRPC_CablingSvc', 'LVL1TGC::TGCRecRoiSvc', 'TGCcablingServerSvc', 'AthenaPoolCnvSvc', 'MuonMDT_CablingSvc', 'AtlasFieldSvc', 'MdtCalibrationDbSvc', 'MdtCalibrationSvc', 'CSCcablingSvc', 'MuonCalib::CscCoolStrSvc'] +Py:ComponentAccumulator INFO Outputs +Py:ComponentAccumulator INFO {} +Py:ComponentAccumulator INFO Public Tools +Py:ComponentAccumulator INFO [ +Py:ComponentAccumulator INFO IOVDbMetaDataTool/IOVDbMetaDataTool, +Py:ComponentAccumulator INFO ByteStreamMetadataTool/ByteStreamMetadataTool, +Py:ComponentAccumulator INFO Muon::MuonIdHelperTool/Muon::MuonIdHelperTool, +Py:ComponentAccumulator INFO RPCCablingDbTool/RPCCablingDbTool, +Py:ComponentAccumulator INFO Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool, +Py:ComponentAccumulator INFO MDTCablingDbTool/MDTCablingDbTool, +Py:ComponentAccumulator INFO MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool, +Py:ComponentAccumulator INFO Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool, +Py:ComponentAccumulator INFO Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool, +Py:ComponentAccumulator INFO Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool, +Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool, +Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, +Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config +RpcRawDataProvider ExtraOutputs [] +RpcRawDataProvider EvtStore StoreGateSvc +RpcRawDataProvider ExtraInputs [] +RpcRawDataProvider RegionSelectionSvc RegSelSvc +RpcRawDataProvider ProviderTool Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool +RpcRawDataProvider NeededResources [] +RpcRawDataProvider DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider ExtraOutputs [] +TgcRawDataProvider EvtStore StoreGateSvc +TgcRawDataProvider ExtraInputs [] +TgcRawDataProvider NeededResources [] +TgcRawDataProvider ProviderTool Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool +TgcRawDataProvider DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider ExtraOutputs [] +MdtRawDataProvider EvtStore StoreGateSvc +MdtRawDataProvider ExtraInputs [] +MdtRawDataProvider NeededResources [] +MdtRawDataProvider ProviderTool Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool +MdtRawDataProvider DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +CscRawDataProvider ExtraOutputs [] +CscRawDataProvider EvtStore StoreGateSvc +CscRawDataProvider ExtraInputs [] +CscRawDataProvider NeededResources [] +CscRawDataProvider ProviderTool Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool +CscRawDataProvider DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData ExtraOutputs [] +RpcRdoToRpcPrepData DecodingTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool +RpcRdoToRpcPrepData EvtStore StoreGateSvc +RpcRdoToRpcPrepData ExtraInputs [] +RpcRdoToRpcPrepData PrintPrepData False +RpcRdoToRpcPrepData RegionSelectionSvc RegSelSvc +RpcRdoToRpcPrepData NeededResources [] +RpcRdoToRpcPrepData DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData ExtraOutputs [] +TgcRdoToTgcPrepData DecodingTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool +TgcRdoToTgcPrepData EvtStore StoreGateSvc +TgcRdoToTgcPrepData RegionSelectorSvc RegSelSvc +TgcRdoToTgcPrepData ExtraInputs [] +TgcRdoToTgcPrepData PrintPrepData False +TgcRdoToTgcPrepData NeededResources [] +TgcRdoToTgcPrepData DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraOutputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraInputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData ExtraOutputs [] +MdtRdoToMdtPrepData DecodingTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool +MdtRdoToMdtPrepData EvtStore StoreGateSvc +MdtRdoToMdtPrepData ExtraInputs [] +MdtRdoToMdtPrepData PrintPrepData False +MdtRdoToMdtPrepData RegionSelectionSvc RegSelSvc +MdtRdoToMdtPrepData NeededResources [] +MdtRdoToMdtPrepData DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraOutputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraInputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData ExtraOutputs [] +CscRdoToCscPrepData CscRdoToCscPrepDataTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool +CscRdoToCscPrepData EvtStore StoreGateSvc +CscRdoToCscPrepData ExtraInputs [] +CscRdoToCscPrepData PrintPrepData False +CscRdoToCscPrepData RegionSelectionSvc RegSelSvc +CscRdoToCscPrepData NeededResources [] +CscRdoToCscPrepData DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +CscThesholdClusterBuilder ExtraOutputs [] +CscThesholdClusterBuilder EvtStore StoreGateSvc +CscThesholdClusterBuilder ExtraInputs [] +CscThesholdClusterBuilder cluster_builder CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool +CscThesholdClusterBuilder NeededResources [] +CscThesholdClusterBuilder DetStore StoreGateSvc/DetectorStore +CondInputLoader ExtraOutputs [] +CondInputLoader Load [('CondAttrListCollection', '/MDT/CABLING/MEZZANINE_SCHEMA'), ('CondAttrListCollection', '/EXT/DCS/MAGNETS/SENSORDATA'), ('CondAttrListCollection', '/MDT/CABLING/MAP_SCHEMA')] +CondInputLoader EvtStore StoreGateSvc +CondInputLoader ExtraInputs [] +CondInputLoader NeededResources [] +CondInputLoader DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg ExtraOutputs [] +MuonMDT_CablingAlg EvtStore StoreGateSvc +MuonMDT_CablingAlg ExtraInputs [] +MuonMDT_CablingAlg NeededResources [] +MuonMDT_CablingAlg DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +MuonMDT_CablingAlg MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.IOVDbMetaDataTool ExtraOutputs [] +ToolSvc.IOVDbMetaDataTool FoldersToBeModified ['/Simulation/Parameters'] +ToolSvc.IOVDbMetaDataTool MinMaxRunNumbers [] +ToolSvc.IOVDbMetaDataTool EvtStore StoreGateSvc +ToolSvc.IOVDbMetaDataTool AttributesToBeRemoved ['RandomSeedOffset'] +ToolSvc.IOVDbMetaDataTool ExtraInputs [] +ToolSvc.IOVDbMetaDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.ByteStreamMetadataTool ExtraOutputs [] +ToolSvc.ByteStreamMetadataTool EvtStore StoreGateSvc +ToolSvc.ByteStreamMetadataTool ExtraInputs [] +ToolSvc.ByteStreamMetadataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.Muon::MuonIdHelperTool ExtraOutputs [] +ToolSvc.Muon::MuonIdHelperTool EvtStore StoreGateSvc +ToolSvc.Muon::MuonIdHelperTool ExtraInputs [] +ToolSvc.Muon::MuonIdHelperTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool ExtraOutputs [] +ToolSvc.RPCCablingDbTool EvtStore StoreGateSvc +ToolSvc.RPCCablingDbTool ExtraInputs [] +ToolSvc.RPCCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool MapCorrectionFolder /RPC/CABLING/MAP_SCHEMA_CORR +ToolSvc.RPCCablingDbTool MapConfigurationFolder /RPC/CABLING/MAP_SCHEMA +ToolSvc.RPC_RawDataProviderTool ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool ExtraOutputs [] +ToolSvc.MDTCablingDbTool EvtStore StoreGateSvc +ToolSvc.MDTCablingDbTool ExtraInputs [] +ToolSvc.MDTCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +ToolSvc.MDTCablingDbTool MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraOutputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RT_InputFiles ['Muon_RT_default.data'] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TimeSlewingCorrection False +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RtFolder /MDT/RTBLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool MeanCorrectionVsR [-5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool defaultT0 40 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraInputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool UseMLRt True +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool PropagationSpeedBeta 0.85 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TubeFolder /MDT/T0BLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +ToolSvc.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TgcRdoToTgcPrepDataTool ExtraOutputs [] +ToolSvc.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +ToolSvc.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool ExtraInputs [] +ToolSvc.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MdtRdoToMdtPrepDataTool ExtraOutputs [] +ToolSvc.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +ToolSvc.MdtRdoToMdtPrepDataTool ExtraInputs [] +ToolSvc.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +ToolSvc.CscRdoToCscPrepDataTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscThesholdClusterBuilderTool ExtraOutputs [] +ToolSvc.CscThesholdClusterBuilderTool split_fitter CscSplitClusterFitter/CscSplitClusterFitter +ToolSvc.CscThesholdClusterBuilderTool strip_fitter CalibCscStripFitter/CalibCscStripFitter +ToolSvc.CscThesholdClusterBuilderTool cscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscThesholdClusterBuilderTool default_fitter SimpleCscClusterFitter/SimpleCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool precision_fitter QratCscClusterFitter/QratCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool EvtStore StoreGateSvc +ToolSvc.CscThesholdClusterBuilderTool ExtraInputs [] +ToolSvc.CscThesholdClusterBuilderTool DetStore StoreGateSvc/DetectorStore +EventSelector SharedMemoryTool +EventSelector SkipEventSequence [] +EventSelector CounterTool +EventSelector Input [] +EventSelector ByteStreamInputSvc ByteStreamInputSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraOutputs [] +EventSelector.xAODMaker::EventInfoSelectorTool EvtStore StoreGateSvc +EventSelector.xAODMaker::EventInfoSelectorTool BeamCondSvc BeamCondSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraInputs [] +EventSelector.xAODMaker::EventInfoSelectorTool LuminosityTool LuminosityTool +EventSelector.xAODMaker::EventInfoSelectorTool DetStore StoreGateSvc/DetectorStore +ByteStreamInputSvc EventStore StoreGateSvc +ByteStreamInputSvc FullFileName ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +ByteStreamInputSvc AttributeListKeys [] +ByteStreamInputSvc MetaDataStore StoreGateSvc/InputMetaDataStore +EventPersistencySvc CnvServices ['ByteStreamCnvSvc', 'AthenaPoolCnvSvc/AthenaPoolCnvSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'AthenaPoolCnvSvc'] +ByteStreamCnvSvc InitCnvs ['EventInfo', 'ROIB::RoIBResult', 'HLT::HLTResult'] +ByteStreamCnvSvc EventStore StoreGateSvc +ByteStreamCnvSvc ROD2ROBmap [] +ByteStreamCnvSvc ByteStreamOutputSvcList [] +ByteStreamCnvSvc GetDetectorMask True +ROBDataProviderSvc filterRobWithStatus [] +ROBDataProviderSvc filterSubDetWithStatus [] +ByteStreamAddressProviderSvc TypeNames ['TileCellIDC/TileCellIDC', 'MdtDigitContainer/MDT_DIGITS', 'RpcDigitContainer/RPC_DIGITS', 'TgcDigitContainer/TGC_DIGITS', 'CscDigitContainer/CSC_DIGITS', 'ROIB::RecRoIBResult/RecRoIBResult', 'MuCTPI_RIO/MUCTPI_RIO', 'CTP_RIO/CTP_RIO', 'LArRawChannelContainer/LArRawChannels', 'TileRawChannelContainer/TileRawChannelCnt', 'ROIB::RoIBResult/RoIBResult', 'MuCTPI_RDO/MUCTPI_RDO', 'HLT::HLTResult/HLTResult_L2', 'HLT::HLTResult/HLTResult_EF', 'CTP_RDO/CTP_RDO', 'L1TopoRDOCollection/L1TopoRDOCollection'] +ByteStreamAddressProviderSvc TopoProcModuleID [129, 145] +ByteStreamAddressProviderSvc JetProcModuleID [172, 173] +ByteStreamAddressProviderSvc CaloClusterProcModuleID [168, 169, 170, 171] +MetaDataStore IncidentSvc IncidentSvc +MetaDataStore ProxyProviderSvc ProxyProviderSvc +InputMetaDataStore IncidentSvc IncidentSvc +InputMetaDataStore ProxyProviderSvc ProxyProviderSvc +MetaDataSvc MetaDataContainer MetaDataHdr +MetaDataSvc CnvSvc AthenaPoolCnvSvc +ProxyProviderSvc ProviderNames ['ByteStreamAddressProviderSvc', 'IOVDbSvc', 'MetaDataSvc', 'TagInfoMgr'] +GeoModelSvc SupportedGeometry 22 +GeoModelSvc AtlasVersion ATLAS-R2-2016-01-00-01 +GeoModelSvc.MuonDetectorTool ExtraOutputs [] +GeoModelSvc.MuonDetectorTool TheMuonAlignmentTool +GeoModelSvc.MuonDetectorTool EvtStore StoreGateSvc +GeoModelSvc.MuonDetectorTool UseConditionDb 1 +GeoModelSvc.MuonDetectorTool ExtraInputs [] +GeoModelSvc.MuonDetectorTool UseIlinesFromGM 1 +GeoModelSvc.MuonDetectorTool SelectedStJff [] +GeoModelSvc.MuonDetectorTool DetStore StoreGateSvc/DetectorStore +GeoModelSvc.MuonDetectorTool SelectedStations [] +GeoModelSvc.MuonDetectorTool SelectedStJzz [] +DetDescrCnvSvc IdDictFromRDB True +DetDescrCnvSvc IdDictName IdDictParser/ATLAS_IDS.xml +DetDescrCnvSvc DetectorNodes [] +DetDescrCnvSvc DetectorManagers [] +TagInfoMgr ExtraTagValuePairs ['AtlasRelease', 'Athena-22.0.1'] +RPCcablingServerSvc Atlas True +RPCcablingServerSvc useMuonRPC_CablingSvc True +RPCcablingServerSvc forcedUse True +IOVDbSvc Folders ['/MDT/CABLING/MEZZANINE_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_ETA<db>COOLONL_RPC/CONDBR2</db>', '/MDT/RTBLOB<db>COOLOFL_MDT/CONDBR2</db>', '/MDT/T0BLOB<db>COOLOFL_MDT/CONDBR2</db>', '/CSC/STAT <key>CSC_STAT</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/NOISE <key>CSC_NOISE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/PED <key>CSC_PED</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/RMS <key>CSC_RMS</key> <db>COOLOFL_CSC/CONDBR2</db>', '/GLOBAL/BField/Maps <noover/><db>COOLONL_GLOBAL/CONDBR2</db>', '/CSC/T0PHASE <key>CSC_T0PHASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/TGC/CABLING/MAP_SCHEMA<db>COOLONL_TGC/CONDBR2</db>', '/EXT/DCS/MAGNETS/SENSORDATA<db>COOLOFL_DCS/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA_CORR<db>COOLONL_RPC/CONDBR2</db>', '/MDT/CABLING/MAP_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_PHI<db>COOLONL_RPC/CONDBR2</db>', '/CSC/PSLOPE <key>CSC_PSLOPE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA<db>COOLONL_RPC/CONDBR2</db>', '/CSC/T0BASE <key>CSC_T0BASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/FTHOLD <key>CSC_FTHOLD</key> <db>COOLOFL_CSC/CONDBR2</db>'] +IOVDbSvc CacheAlign 3 +IOVDbSvc dbConnection sqlite://;schema=mycool.db;dbname=CONDBR2 +IOVDbSvc GlobalTag CONDBR2-BLKPA-2018-13 +IOVDbSvc FoldersToMetaData ['/GLOBAL/BField/Maps'] +IOVDbSvc DBInstance CONDBR2 +IOVDbSvc overrideTags [] +PoolSvc FrontierRefreshSchema [] +PoolSvc ReadCatalog ['apcfile:poolcond/PoolFileCatalog.xml', 'prfile:poolcond/PoolCat_oflcond.xml', 'apcfile:poolcond/PoolCat_oflcond.xml', 'prfile:poolcond/PoolCat_comcond.xml', 'apcfile:poolcond/PoolCat_comcond.xml'] +PoolSvc MaxFilesOpen 0 +DBReplicaSvc COOLSQLiteVetoPattern /DBRelease/ +MuonRPC_CablingSvc ConfFilePath MuonRPC_Cabling/ +MuonRPC_CablingSvc TheRpcTriggerDbTool RPCTriggerDbTool +MuonRPC_CablingSvc ConfFileName LVL1confAtlas.data +MuonRPC_CablingSvc FeetPadThresolds [] +MuonRPC_CablingSvc TheRpcCablingDbTool RPCCablingDbTool/RPCCablingDbTool +MuonRPC_CablingSvc RPCTriggerRoadsfromCool True +MuonRPC_CablingSvc CorrFileName LVL1confAtlas.corr +MuonRPC_CablingSvc CosmicConfiguration True +TGCcablingServerSvc Atlas True +TGCcablingServerSvc useMuonTGC_CablingSvc True +TGCcablingServerSvc forcedUse True +AthenaPoolCnvSvc InputPoolAttributes [] +AthenaPoolCnvSvc PoolAttributes [] +AthenaPoolCnvSvc PrintInputAttrPerEvt [] +AthenaPoolCnvSvc InputStreamingTool +AthenaPoolCnvSvc OutputPoolFileAllocator [] +AthenaPoolCnvSvc MaxFileSizes [] +MuonMDT_CablingSvc DBTool MDTCablingDbTool/MDTCablingDbTool +MuonMDT_CablingSvc TagInfoManager TagInfoMgr +MuonMDT_CablingSvc ForcedUse True +MuonMDT_CablingSvc UseOldCabling False +AtlasFieldSvc UseDCS True +MdtCalibrationDbSvc CreateSlewingFunctions False +MdtCalibrationDbSvc DBTool MuonCalib::MdtCalibDbAsciiTool +MdtCalibrationDbSvc CreateBFieldFunctions False +MdtCalibrationDbSvc CreateWireSagFunctions False +MdtCalibrationSvc DoTofCorrection True +MdtCalibrationSvc MagFieldSvc AtlasFieldSvc +MdtCalibrationSvc DoWireSagCorrection False +MdtCalibrationSvc TimeWindowSetting 2 +MdtCalibrationSvc DoSlewingCorrection False +MdtCalibrationSvc DoTemperatureCorrection True +MuonCalib::CscCoolStrSvc ParSGKeys ['CSC_PED', 'CSC_NOISE', 'CSC_PSLOPE', 'CSC_STAT', 'CSC_RMS', 'CSC_FTHOLD', 'CSC_T0BASE', 'CSC_T0PHASE'] +MuonCalib::CscCoolStrSvc ParDefaults ['2048', '3.5', '0.189', '0', '2.56', '0', '0', '0'] +MuonCalib::CscCoolStrSvc ParDataTypes ['float', 'float', 'float', 'uint32_t', 'float', 'float', 'float', 'float'] +MuonCalib::CscCoolStrSvc ParFolders ['/CSC/PED', '/CSC/NOISE', '/CSC/PSLOPE', '/CSC/STAT', '/CSC/RMS', '/CSC/FTHOLD', '/CSC/T0BASE', '/CSC/T0PHASE'] +MuonCalib::CscCoolStrSvc ParCats ['CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'ASM'] +MuonCalib::CscCoolStrSvc ParNames ['ped', 'noise', 'pslope', 'status', 'rms', 'f001', 't0base', 't0phase'] JOs reading stage finished, launching Athena from pickle file +Wed Feb 27 17:18:53 GMT 2019 +Preloading tcmalloc_minimal.so +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO including file "AthenaCommon/Preparation.py" +Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads +Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode.pkl ... +Py:ConfigurableDb INFO Read module info for 5460 configurables from 4 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +[?1034hApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +ApplicationMgr SUCCESS +==================================================================================================================================== + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on ppevm02.ppe.gla.ac.uk on Wed Feb 27 17:19:08 2019 +==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +Py:Athena INFO including file "AthenaCommon/runbatch.py" +StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry +ClassIDSvc INFO getRegistryEntries: read 3383 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) +ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 +ROBDataProviderSvc INFO Initializing ROBDataProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 ROBDataProviderSvc INFO ---> Filter out empty ROB fragments = 'filterEmptyROB':False ROBDataProviderSvc INFO ---> Filter out specific ROBs by Status Code: # ROBs = 0 ROBDataProviderSvc INFO ---> Filter out Sub Detector ROBs by Status Code: # Sub Detectors = 0 @@ -1316,6 +2497,10 @@ ByteStreamAddre... INFO -- Will fill Store with id = 0 PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok] PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 +DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://frontier-atlas.lcg.triumf.ca:3128/ATLAS_frontier)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 1 servers found for host ppevm02.ppe.gla.ac.uk [ATLF ] +DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO Resolved path (via ATLAS_POOLCOND_PATH) is /cvmfs/atlas-condb.cern.ch/repo/conditions/poolcond/PoolFileCatalog.xml @@ -1324,13 +2509,26 @@ PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_ PoolSvc WARNING Unable to locate catalog for prfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml +DbSession INFO Open DbSession +Domain[ROOT_All] INFO > Access DbDomain READ [ROOT_All] IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once +IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbSvc INFO Global tag: CONDBR2-BLKPA-2018-13 set from joboptions IOVDbFolder INFO Inputfile tag override disabled for /GLOBAL/BField/Maps +IOVDbSvc INFO Folder /GLOBAL/BField/Maps will be written to file metadata IOVDbSvc INFO Initialised with 8 connections and 19 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully +MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 +AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 +ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 +MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 +ClassIDSvc INFO getRegistryEntries: read 3291 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4012 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3031 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -1411,6 +2609,10 @@ GeoModelSvc::RD...WARNING Getting PixTBMatComponents with default tag GeoModelSvc::RD...WARNING Getting PixTBMaterials with default tag GeoModelSvc::RD...WARNING Getting InDetMatComponents with default tag GeoModelSvc::RD...WARNING Getting InDetMaterials with default tag +GeoModelSvc.Muo... INFO create MuonDetectorTool - package version = MuonGeoModel-00-00-00 +GeoModelSvc.Muo... INFO (from GeoModelSvc) AtlasVersion = <ATLAS-R2-2016-01-00-01> MuonVersion = <> +GeoModelSvc.Muo... INFO Keys for Muon Switches are (key) ATLAS-R2-2016-01-00-01 (node) ATLAS +GeoModelSvc.Muo... INFO (from GeoModelSvc) in AtlasVersion = <ATLAS-R2-2016-01-00-01> default MuonVersion is <MuonSpectrometer-R.08.01> GeoModelSvc.Muo... INFO Properties have been set as follows: GeoModelSvc.Muo... INFO LayoutName R GeoModelSvc.Muo... INFO IncludeCutouts 0 @@ -1525,6 +2727,7 @@ AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! MuGM:MuonFactory INFO MMIDHELPER retrieved from DetStore MuGM:MuonFactory INFO **************** MuonDetectorFactory001 ************************ MuGM:MuonFactory INFO *** Start building the Muon Geometry Tree ********************** +MuGM:RDBReadAtlas INFO Start retriving dbObjects with tag = <ATLAS-R2-2016-01-00-01> node <ATLAS> RDBAccessSvc WARNING Could not get the tag for XtomoData node. Returning 0 pointer to IRDBQuery MuGM:RDBReadAtlas INFO After getQuery XtomoData In DblQ00Xtomo(data) @@ -1554,6 +2757,7 @@ MuGM:ProcCutouts INFO Processing Cutouts DONE MuGM:RDBReadAtlas INFO ProcessTGCreadout - version 7 wirespacing 1.8 MuGM:RDBReadAtlas INFO Intermediate Objects built from primary numbers MuGM:MuonFactory INFO theMaterialManager retrieven successfully from the DetStore +MuGM:MuonFactory INFO MuonSystem description from OracleTag=<ATLAS-R2-2016-01-00-01> and node=<ATLAS> MuGM:MuonFactory INFO TreeTop added to the Manager MuGM:MuonFactory INFO Muon Layout R.08.01 MuGM:MuonFactory INFO Fine Clash Fixing disabled: (should be ON/OFF for Simulation/Reconstruction) @@ -1577,9 +2781,13 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 45912Kb Time = 1.01S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL +ClassIDSvc INFO getRegistryEntries: read 1455 CLIDRegistry entries for module ALL +AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 +ClassIDSvc INFO getRegistryEntries: read 1794 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... CondInputLoader INFO Adding base classes: + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) -> @@ -1589,12 +2797,17 @@ CondInputLoader INFO Will create WriteCondHandle dependencies for the follo + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) +ClassIDSvc INFO getRegistryEntries: read 1370 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 743 CLIDRegistry entries for module ALL RpcRawDataProvider INFO RpcRawDataProvider::initialize RpcRawDataProvider INFO 'DoSeededDecoding':False +ClassIDSvc INFO getRegistryEntries: read 1699 CLIDRegistry entries for module ALL +MuonRPC_CablingSvc INFO Initializing MuonRPC_CablingSvc - package version MuonRPC_Cabling-00-00-00 ToolSvc.RPCCabl... INFO Initializing - folders names are: conf /RPC/CABLING/MAP_SCHEMA / corr /RPC/CABLING/MAP_SCHEMA_CORR MuonRPC_CablingSvc INFO RPCCablingDbTool retrieved with statusCode = SUCCESS with handle TheRpcCablingDbTool = PublicToolHandle('RPCCablingDbTool/RPCCablingDbTool') MuonRPC_CablingSvc INFO Register call-back against 2 folders listed below MuonRPC_CablingSvc INFO Folder n. 1 </RPC/CABLING/MAP_SCHEMA> found in the DetStore +ClassIDSvc INFO getRegistryEntries: read 501 CLIDRegistry entries for module ALL MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA> MuonRPC_CablingSvc INFO Folder n. 2 </RPC/CABLING/MAP_SCHEMA_CORR> found in the DetStore MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA_CORR> @@ -1609,25 +2822,32 @@ RpcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') RpcRawDataProvi... INFO Tool = RpcRawDataProvider.RPC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc RpcRawDataProvi... INFO initialize() successful in RpcRawDataProvider.RPC_RawDataProviderTool TgcRawDataProvider INFO TgcRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 878 CLIDRegistry entries for module ALL TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder TgcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') TgcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize +ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x16e5ec00]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL MdtRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') MdtRawDataProvi... INFO Processing configuration for layouts with BME chambers. MdtRawDataProvi... INFO Processing configuration for layouts with BMG chambers. MdtRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') MdtRawDataProvi... INFO Tool = MdtRawDataProvider.MDT_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MdtRawDataProvi... INFO initialize() successful in MdtRawDataProvider.MDT_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 658 CLIDRegistry entries for module ALL CscRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') CscRawDataProvi... INFO Tool = CscRawDataProvider.CSC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc CscRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') CscRawDataProvi... INFO The Muon Geometry version is R.08.01 CscRawDataProvi... INFO initialize() successful in CscRawDataProvider.CSC_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 53 CLIDRegistry entries for module ALL +RpcRdoToRpcPrep... INFO package version = MuonRPC_CnvTools-00-00-00 RpcRdoToRpcPrep... INFO properties are RpcRdoToRpcPrep... INFO processingData 0 RpcRdoToRpcPrep... INFO produceRpcCoinDatafromTriggerWords 1 @@ -1642,18 +2862,31 @@ RpcRdoToRpcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::RpcR TgcRdoToTgcPrep... INFO initialize() successful in TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool TgcRdoToTgcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') MdtCalibrationSvc INFO Processing configuration for layouts with BMG chambers. +ClassIDSvc INFO getRegistryEntries: read 194 CLIDRegistry entries for module ALL AtlasFieldSvc INFO initialize() ... AtlasFieldSvc INFO maps will be chosen reading COOL folder /GLOBAL/BField/Maps +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL AtlasFieldSvc INFO magnet currents will be read from COOL folder /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO Booked callback for /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO initialize() successful MdtRdoToMdtPrep... INFO Processing configuration for layouts with BME chambers. MdtRdoToMdtPrep... INFO Processing configuration for layouts with BMG chambers. MdtRdoToMdtPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for module ALL CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc +ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1af89a00]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. +EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... @@ -1665,10 +2898,12 @@ ToolSvc.Luminos... INFO BunchLumisTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO BunchGroupTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO LBLBFolderName is empty, skipping... EventSelector INFO Retrieved InputCollections from InputSvc +ByteStreamInputSvc INFO Initializing ByteStreamInputSvc - package version ByteStreamCnvSvc-00-00-00 EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully ByteStreamInputSvc INFO Picked valid file: /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 +ClassIDSvc INFO getRegistryEntries: read 1159 CLIDRegistry entries for module ALL CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' @@ -1746,6 +2981,7 @@ phi high-pt mu11 mu15 mu15 RPCcabling INFO CablingRPC---InitMaps from COOL: going to read configuration +RPCcabling INFO CablingRPC--->> RPC cabling map from COOL << RPCcabling INFO CablingRPC--- ReadConf: map has size 222202 RPCcabling INFO CablingRPC--- ReadConf: map n. of lines read is 924 RPCcabling INFO CablingRPC--- ReadConf: version is 5.0 Atlas R_07_03_RUN2ver104 @@ -1783,13 +3019,19 @@ AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] Toroids_SCurrent , 4 , 20397.7 AtlasFieldSvc INFO Currents read from DCS: solenoid 7729.99 toroid 20399.9 AtlasFieldSvc INFO Initializing the field map (solenoidCurrent=7729.99 toroidCurrent=20399.9) +AtlasFieldSvc INFO reading the map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +AtlasFieldSvc INFO Initialized the field map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +ClassIDSvc INFO getRegistryEntries: read 672 CLIDRegistry entries for module ALL AthenaEventLoopMgr INFO ===>>> start processing event #186525031, run #327265 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMapSchema_BMG_01 for folder /MDT/CABLING/MAP_SCHEMA IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMezzanineSchema_M5-RUN2 for folder /MDT/CABLING/MEZZANINE_SCHEMA IOVDbSvc INFO Disconnecting from COOLONL_MDT/CONDBR2 MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) readCdoMez->size()= 24 +MuonMDT_CablingAlg INFO Range of input is {[0,l:0] - [INVALID]} MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) readCdoMap->size()= 2312 +MuonMDT_CablingAlg INFO Range of input is {[327264,l:4294640031] - [327265,l:4294640030]} +MuonMDT_CablingAlg INFO recorded new MuonMDT_CablingMap with range {[327264,l:4294640031] - [327265,l:4294640030]} into Conditions Store AthenaEventLoopMgr INFO ===>>> done processing event #186525031, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186524665, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> done processing event #186524665, run #327265 2 events processed so far <<<=== @@ -1831,10 +3073,40 @@ AthenaEventLoopMgr INFO ===>>> start processing event #186580451, run #3272 AthenaEventLoopMgr INFO ===>>> done processing event #186580451, run #327265 20 events processed so far <<<=== Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully +IncidentProcAlg1 INFO Finalize CondInputLoader INFO Finalizing CondInputLoader... +IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/25 (( 0.26 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/271 (( 0.59 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216598 (( 0.84 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/300 (( 0.43 ))s +IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/444470 (( 0.62 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/58804 (( 0.42 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562972 (( 0.94 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8101322 (( 0.77 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/7408 (( 0.56 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/331329 (( 0.67 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/359591 (( 0.50 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422629 (( 0.56 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/363009 (( 0.47 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422831 (( 0.58 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/236289 (( 0.48 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322855 (( 0.53 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3234 (( 0.36 ))s +IOVDbSvc INFO bytes in (( 9.58 ))s +IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.26 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 2.75 ))s +IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 4.15 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.59 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.56 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.26 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -1858,6 +3130,8 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** +cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 +ChronoStatSvc INFO Time User : Tot= 11.1 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully -- GitLab From 342deef2163cafe2da462e3f5584de9ad2cf29ba Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Thu, 28 Feb 2019 16:49:42 +0000 Subject: [PATCH 008/163] Adding update for cache container in one of the ROD decoders. Need to test with cache on, without cache, seems to run --- .../src/RPC_RawDataProviderTool.cxx | 1 - .../MuonRPC_CnvTools/src/RpcROD_Decoder.h | 140 ++++++++++-------- .../python/MuonBytestreamDecodeConfig.py | 1 + 3 files changed, 76 insertions(+), 66 deletions(-) diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx index c7a9f62bd030..66c2d78ab4a6 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx @@ -67,7 +67,6 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() else ATH_MSG_INFO( "Retrieved tool " << m_decoder ); - //m_hashfunc = new RpcPadIdHash(); // get cabling svc diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h index fa594a3cf276..b1bfc3c249b9 100755 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h @@ -388,6 +388,7 @@ namespace Muon RpcPadContainer& rdoIdc, const std::vector<IdentifierHash> &collections, RpcSectorLogicContainer* RPC_SECTORLOGIC) const { + try { robFrag.check (); @@ -395,7 +396,7 @@ namespace Muon catch (eformat::Issue &ex) { - if(msgLvl(MSG::VERBOSE)) msg() << ex.what () << endmsg; + ATH_MSG_VERBOSE(ex.what()); return StatusCode::FAILURE; // error in fragment } @@ -411,13 +412,11 @@ namespace Muon uint32_t rod_sourceId= robFrag.rod_source_id(); uint16_t subDetector=(sourceId & 0xff0000)>>16; - - if(msgLvl(MSG::VERBOSE)) msg() << "ROD version: " << MSG::hex << version + ATH_MSG_VERBOSE("ROD version: " << MSG::hex << version << MSG::dec << " ROB source ID: " << MSG::hex << sourceId << MSG::dec << " ROD source ID: " << MSG::hex << rod_sourceId << MSG::dec << " Subdetector: " << MSG::hex << subDetector - << MSG::dec << endmsg; - + << MSG::dec); // chose the right decoding routine @@ -456,7 +455,7 @@ namespace Muon StatusCode cnv_sc; - + /* // unpack the 32 bits words into 16 bits // no ROD header and footer @@ -505,55 +504,69 @@ namespace Muon // here optimize decoding of ROB fragment (for data only type==3) if (type==3) + { + std::map<Identifier,RpcPad*> mapOfCollections; + std::vector<IdentifierHash>::const_iterator it = collections.begin(); + for( ; it!=collections.end(); ++it) { - std::map<Identifier,RpcPad*> mapOfCollections; - std::vector<IdentifierHash>::const_iterator it = collections.begin(); - for( ; it!=collections.end(); ++it) - { - RpcPadContainer::const_iterator itColl = rdoIdc.indexFind(*it); - if (itColl == rdoIdc.end()) - { - if(msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << " Created new Pad Collection Hash ID = " - << static_cast<unsigned int>(*it) << endmsg; - - // create new collection - RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); - mapOfCollections[coll->identify()]=coll; + + // Using RpcPadCache + RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( (*it) ); + + if(lock.alreadyPresent() ){ + ATH_MSG_DEBUG ( "RPC RDO collection already exist with collection hash = " << static_cast<unsigned int>(*it) << " converting is skipped!"); + } + else{ + ATH_MSG_VERBOSE(" Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); + + // create new collection - I should be doing this with unique_ptr but it requires changing downstream functions + RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); + mapOfCollections[coll->identify()]=coll; }// endif collection not found in the container - }//end loop over vector of hash id + }//end loop over vector of hash id - if (mapOfCollections.empty()) { - ATH_MSG_VERBOSE("mapOfCollections is empty; fillCollectionsFromRob_v302 will not be called"); - cnv_sc = StatusCode::SUCCESS; - return cnv_sc; - } - - cnv_sc = fillCollectionsFromRob_v302(data,robFrag.rod_ndata(),mapOfCollections,rod_sourceId, RPC_SECTORLOGIC); - if (cnv_sc!=StatusCode::SUCCESS) - { + if (mapOfCollections.empty()) { + ATH_MSG_VERBOSE("mapOfCollections is empty; fillCollectionsFromRob_v302 will not be called"); + cnv_sc = StatusCode::SUCCESS; + return cnv_sc; + } + + // RpcPadCollections not decoded and in container are identified and passed explicitly to decoder + cnv_sc = fillCollectionsFromRob_v302(data,robFrag.rod_ndata(),mapOfCollections,rod_sourceId, RPC_SECTORLOGIC); + if (cnv_sc!=StatusCode::SUCCESS) + { if (cnv_sc==StatusCode::RECOVERABLE) { - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Decoding errors found "<<endmsg; + ATH_MSG_DEBUG("Decoding errors found "); } - else return cnv_sc; // exit if failure - } - for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) - { - // add collection into IDC - RpcPadContainer::const_iterator itColl = rdoIdc.indexFind(((*it).second)->identifyHash()); - if (itColl == rdoIdc.end()) + else + return cnv_sc; // exit if failure + } + + // All un-decoded collections were decoded successfully, so they are passed back to the IDC + //for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) + for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) + { + // add collection into IDC using RpcPadCache functions + + RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( ((*it).second)->identifyHash() ); + + if ( !lock.alreadyPresent() ) { - if (rdoIdc.addCollection((*it).second, ((*it).second)->identifyHash()).isFailure()) - { - msg(MSG::ERROR) << "Failed to add RPC PAD collection to container" - << endmsg; - //report the error condition - } - else ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); - } - } - return cnv_sc; - }//endif (type==3) + // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle + StatusCode status_lock = lock.addOrDelete( std::unique_ptr<RpcPad>( (*it).second ) ); + + if(status_lock != StatusCode::SUCCESS) + { + ATH_MSG_ERROR("Failed to add RPC PAD collection to container" ); + //report the error condition + } + else + ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); + } + } + return cnv_sc; + }//endif (type==3) std::vector<IdentifierHash>::const_iterator it = collections.begin(); for( ; it!=collections.end(); ++it) @@ -561,21 +574,20 @@ namespace Muon RpcPadContainer::const_iterator itColl = rdoIdc.indexFind(*it); if (itColl == rdoIdc.end()) { - if(msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << " Created new Pad Collection Hash ID = " - << static_cast<unsigned int>(*it) << endmsg; + msg(MSG::VERBOSE) << " Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) << endmsg; // create new collection RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); - //convert collection + //convert collection - note case3 will never be used due to statement above switch(type) { case 0: cnv_sc = fillCollection_v240(data,robFrag.rod_ndata(),*coll); break; case 1: cnv_sc = fillCollection_v300(data,robFrag.rod_ndata(),*coll,subDetector, RPC_SECTORLOGIC); break; case 2: cnv_sc = fillCollection_v301(data,robFrag.rod_ndata(),*coll,subDetector, RPC_SECTORLOGIC ); break; - case 3: cnv_sc = fillCollection_v302(data,robFrag.rod_ndata(),*coll,sourceId, RPC_SECTORLOGIC); break; - //case 3: cnv_sc = fillCollection_v302new(data,robFrag.rod_ndata(),*coll,sourceId); break; - + case 3: cnv_sc = fillCollection_v302(data,robFrag.rod_ndata(),*coll,sourceId, RPC_SECTORLOGIC); break; + //case 3: cnv_sc = fillCollection_v302new(data,robFrag.rod_ndata(),*coll,sourceId); break; + default: fillCollection_v240(data,robFrag.rod_ndata(),*coll); break; } @@ -587,17 +599,15 @@ namespace Muon // add collection into IDC if (rdoIdc.addCollection(coll, *it).isFailure()) { - msg(MSG::ERROR) << "Failed to add RPC PAD collection to container" - << endmsg; + msg(MSG::ERROR) << "Failed to add RPC PAD collection to container" << endmsg; //report the error condition } - else ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)(*it)<<" to the RpcPad Container | size = "<<coll->size()); - + else + ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)(*it)<<" to the RpcPad Container | size = "<<coll->size()); } } - return cnv_sc; - } + } // end fillCollections // ---- Implement the template method: @@ -1736,11 +1746,11 @@ namespace Muon if (msgLvl(MSG::VERBOSE)) { msg(MSG::VERBOSE) << "**********Decoder dumping the words******** " << endmsg; if (data_size > 0 ) { - msg(MSG::VERBOSE) << "The size of this ROD-read is " << data_size << endmsg; - for (unsigned int i=0; i < data_size; i++) - msg(MSG::VERBOSE) << "word " << i << " = " << MSG::hex << data[i] << MSG::dec << endmsg; - } - } + msg(MSG::VERBOSE) << "The size of this ROD-read is " << data_size << endmsg; + for (unsigned int i=0; i < data_size; i++) + msg(MSG::VERBOSE) << "word " << i << " = " << MSG::hex << data[i] << MSG::dec << endmsg; + } + } //#endif uint16_t side = (subDetector == eformat::MUON_RPC_BARREL_A_SIDE) ? 1:0; diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py index 6363d17ae0f6..8c7f10f26b4c 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py @@ -55,6 +55,7 @@ def RpcBytestreamDecodeCfg(flags, forTrigger=False): from MuonRPC_CnvTools.MuonRPC_CnvToolsConf import Muon__RPC_RawDataProviderTool MuonRpcRawDataProviderTool = Muon__RPC_RawDataProviderTool(name = "RPC_RawDataProviderTool", Decoder = RPCRodDecoder ) + MuonRpcRawDataProviderTool.OutputLevel = VERBOSE acc.addPublicTool( MuonRpcRawDataProviderTool ) # This should be removed, but now defined as PublicTool at MuFastSteering # Setup the RAW data provider algorithm -- GitLab From fba4afd994f6d7c007924fba2645c2dad6118efb Mon Sep 17 00:00:00 2001 From: Tim Martin <Tim.Martin@cern.ch> Date: Tue, 5 Mar 2019 17:40:11 +0100 Subject: [PATCH 009/163] Pseudomerge TrigEgammaAnalysisTools from 21.0-TrigMC to master --- .../TrigEgammaAnalysisTools/CMakeLists.txt | 82 +- .../Root/EfficiencyTool.cxx | 47 +- .../Root/TrigEgammaAnalysisBaseTool.cxx | 80 +- .../Root/TrigEgammaDistTool.cxx | 99 +- .../Root/TrigEgammaEventSelection.cxx | 1255 +++++++++++++++++ .../Root/TrigEgammaNavAnalysisTool.cxx | 35 +- .../Root/TrigEgammaNavBaseTool.cxx | 43 +- .../Root/TrigEgammaNavNtuple.cxx | 1138 --------------- .../Root/TrigEgammaNavTPAnalysisTool.cxx | 31 +- .../Root/TrigEgammaNavTPBaseTool.cxx | 121 +- .../Root/TrigEgammaNavTPNtuple.cxx | 1066 -------------- .../Root/TrigEgammaPhysValBase.cxx | 1155 +++++++++++++++ .../Root/TrigEgammaPlotTool.cxx | 107 +- .../Root/TrigEgammaResolutionTool.cxx | 30 +- .../ITrigEgammaAnalysisBaseTool.h | 2 + .../TrigEgammaAnalysisBaseTool.h | 67 +- .../TrigEgammaDistTool.h | 3 +- .../TrigEgammaEventSelection.h | 129 ++ .../TrigEgammaAnalysisTools/TrigEgammaInfo.h | 1 + .../TrigEgammaNavBaseTool.h | 2 + .../TrigEgammaNavNtuple.h | 221 --- .../TrigEgammaNavTPBaseTool.h | 244 ++-- .../TrigEgammaNavTPNtuple.h | 220 --- .../TrigEgammaPhysValBase.h | 320 +++++ .../TrigEgammaPlotTool.h | 5 +- .../python/TrigEgammaAnalysisToolsConfig.py | 226 ++- .../python/TrigEgammaProbelist.py | 35 + .../testTrigEgammaAnalysisTools_emulator.py | 249 ++++ .../share/testTrigEgammaEventSelectionTool.py | 193 +++ .../src/TrigEgammaMonTool.cxx | 11 +- .../TrigEgammaAnalysisTools_entries.cxx | 34 +- 31 files changed, 4125 insertions(+), 3126 deletions(-) create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py create mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt index 8bff1abe2b00..78261fb99f56 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt @@ -6,37 +6,38 @@ atlas_subdir( TrigEgammaAnalysisTools ) # Declare the package's dependencies: -atlas_depends_on_subdirs( - PUBLIC - Control/AthToolSupport/AsgTools - Event/xAOD/xAODCaloEvent - Event/xAOD/xAODEgamma - Event/xAOD/xAODEventInfo - Event/xAOD/xAODJet - Event/xAOD/xAODTracking - Event/xAOD/xAODTrigCalo - Event/xAOD/xAODTrigEgamma - Event/xAOD/xAODTrigRinger - Event/xAOD/xAODTrigger - Event/xAOD/xAODTruth - LumiBlock/LumiBlockComps - PhysicsAnalysis/Interfaces/EgammaAnalysisInterfaces - Reconstruction/RecoTools/RecoToolInterfaces - PhysicsAnalysis/ElectronPhotonID/egammaMVACalibAnalysis - Trigger/TrigAnalysis/TrigDecisionTool - Trigger/TrigAnalysis/TrigEgammaMatchingTool - Trigger/TrigAnalysis/TrigEgammaEmulationTool - Trigger/TrigConfiguration/TrigConfHLTData - Trigger/TrigEvent/TrigSteeringEvent - Trigger/TrigMonitoring/TrigHLTMonitoring - PhysicsAnalysis/AnalysisCommon/PATCore - PRIVATE - Control/AthenaBaseComps - Control/AthenaMonitoring - Control/StoreGate - GaudiKernel - Trigger/TrigConfiguration/TrigConfxAOD ) - +atlas_depends_on_subdirs( PUBLIC + Control/AthToolSupport/AsgTools + Event/xAOD/xAODCaloEvent + Event/xAOD/xAODEgamma + Event/xAOD/xAODEventInfo + Event/xAOD/xAODJet + Event/xAOD/xAODPrimitives + Event/xAOD/xAODTracking + Event/xAOD/xAODTrigCalo + Event/xAOD/xAODTrigEgamma + Event/xAOD/xAODTrigRinger + Event/xAOD/xAODTrigger + Event/xAOD/xAODTruth + Event/xAOD/xAODMissingET + Event/xAOD/xAODCaloRings + LumiBlock/LumiBlockComps + PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools + Reconstruction/RecoTools/RecoToolInterfaces + Reconstruction/egamma/egammaMVACalib + Trigger/TrigAnalysis/TrigDecisionTool + Trigger/TrigAnalysis/TrigEgammaMatchingTool + Trigger/TrigAnalysis/TrigEgammaEmulationTool + Trigger/TrigConfiguration/TrigConfHLTData + Trigger/TrigEvent/TrigSteeringEvent + Trigger/TrigMonitoring/TrigHLTMonitoring + PhysicsAnalysis/AnalysisCommon/PATCore + PRIVATE + Control/AthenaBaseComps + Control/AthenaMonitoring + Control/StoreGate + GaudiKernel + Trigger/TrigConfiguration/TrigConfxAOD ) # External dependencies: find_package( Boost ) find_package( ROOT COMPONENTS Core Hist Tree ) @@ -48,20 +49,25 @@ atlas_add_library( TrigEgammaAnalysisToolsLib INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} LINK_LIBRARIES ${ROOT_LIBRARIES} AsgTools xAODCaloEvent xAODEgamma - xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger - xAODTrigger xAODTruth LumiBlockCompsLib EgammaAnalysisInterfacesLib + xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger xAODMissingET + xAODTrigger xAODCaloRings xAODTruth LumiBlockCompsLib EgammaAnalysisInterfacesLib RecoToolInterfaces egammaMVACalibAnalysisLib TrigDecisionToolLib TrigEgammaMatchingToolLib TrigEgammaEmulationToolLib TrigConfHLTData TrigSteeringEvent TrigHLTMonitoringLib PATCoreLib PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} TrigConfxAODLib ) atlas_add_component( TrigEgammaAnalysisTools - src/*.h src/*.cxx src/components/*.cxx - LINK_LIBRARIES AthenaBaseComps GaudiKernel AsgTools TrigHLTMonitoringLib - AthenaMonitoringLib TrigDecisionToolLib TrigEgammaMatchingToolLib xAODEgamma - TrigEgammaAnalysisToolsLib ) + src/*.h + src/*.cxx + Root/*.cxx + src/components/*.cxx + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} AsgTools xAODCaloEvent xAODMissingET xAODEgamma xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger xAODCaloRings xAODTrigger xAODTruth LumiBlockCompsLib ElectronPhotonSelectorToolsLib egammaMVACalibLib TrigDecisionToolLib TrigEgammaMatchingToolLib TrigEgammaEmulationTool TrigConfHLTData TrigSteeringEvent TrigHLTMonitoringLib AthenaBaseComps AthenaMonitoringLib StoreGateLib SGtests GaudiKernel PATCoreLib ) # Install files from the package: atlas_install_python_modules( python/TrigEgamma*.py ) atlas_install_joboptions( share/test*.py ) -atlas_install_scripts( share/trigEgammaDQ.py share/get_trigEgammaDQ.sh ) +atlas_install_generic( share/trigEgammaDQ.py share/get_trigEgammaDQ.sh + DESTINATION share + EXECUTABLE ) + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx index 073cef0276a1..f4baf74a26da 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx @@ -50,26 +50,25 @@ bool EfficiencyTool::analyseIsEMLH(const xAOD::Electron *eg, const std::string p const std::string ineff = "Ineff" + pidword; bool failIsEMLH = true; - unsigned int isem = 9999; try{ - ATH_MSG_DEBUG("Running selectionisEM("<<pidword<<")"); - isem = eg->selectionisEM(pidword); - - failIsEMLH = false; - for (int ii = 0; ii < 11; ii++) { - if ((isem >> ii) & 0x1) { - failIsEMLH = true; - hist1(fail)->Fill(ii + 0.5); - hist1(ineff)->Fill(ii + 3.5, 1); + ATH_MSG_DEBUG("Running selectionisEM("<<pidword<<")"); + unsigned int isem = eg->selectionisEM(pidword); + + failIsEMLH = false; + for (int ii = 0; ii < 11; ii++) { + if ((isem >> ii) & 0x1) { + failIsEMLH = true; + hist1(fail)->Fill(ii + 0.5); + hist1(ineff)->Fill(ii + 3.5, 1); + } } - } } catch (const ValidationException &e) { - ATH_MSG_WARNING("Exception thrown: " << e.msg() ); - ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed...."); - failIsEMLH = true; + ATH_MSG_WARNING("Exception thrown: " << e.msg() ); + ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed...."); + failIsEMLH = true; } catch(...) { - ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed...."); - failIsEMLH = true; + ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed...."); + failIsEMLH = true; } return failIsEMLH; @@ -90,18 +89,7 @@ bool EfficiencyTool::analyseIsEM(const xAOD::Electron *eg, const std::string pid bool failtrt = false; bool failisem = false; - unsigned int isem = 9999; - try{ - isem = eg->selectionisEM(pidword); - } catch (const ValidationException &eg) { - ATH_MSG_WARNING("Exception thrown: " << eg.msg() ); - ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed...."); - return(true); - } catch(...) { - ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed...."); - return(true); - } - + unsigned int isem = eg->selectionisEM(pidword); for (int ii = 0; ii < 29; ii++) { if ((isem >> ii) & 0x1) { @@ -255,8 +243,7 @@ void EfficiencyTool::fillInefficiency(const std::string& pid, const std::string hist1(ineff)->Fill(lastbin - 4, 1); hist1(ineff)->Fill(sumbin, 1); } - else { - hist1(ineff)->Fill(lastbin - 3, 1); + else{ hist1(ineff)->Fill(sumbin, 1); } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx index fcd2a4aee400..7909da2527e7 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx @@ -66,6 +66,7 @@ TrigEgammaAnalysisBaseTool( const std::string& myname ) declareProperty("TPTrigger",m_tp=false)->declareUpdateHandler(&TrigEgammaAnalysisBaseTool::updateTP,this); declareProperty("isEMResultNames",m_isemname,"isEM"); declareProperty("LHResultNames",m_lhname,"LH"); + declareProperty("ForceTrigAttachment", m_forceTrigAttachment=false); m_storeGate = nullptr; m_histsvc = nullptr; @@ -85,6 +86,9 @@ TrigEgammaAnalysisBaseTool( const std::string& myname ) m_nPVertex=0; m_offmu=0.; m_onlmu=0.; + m_sgContainsRnn=false; + m_sgContainsTrigPhoton=false; + m_forceTrigEmulation=false; } void TrigEgammaAnalysisBaseTool::updateDetail(Property& /*p*/){ @@ -101,14 +105,14 @@ void TrigEgammaAnalysisBaseTool::updateAltBinning(Property& /*p*/){ void TrigEgammaAnalysisBaseTool::updateTP(Property& /*p*/){ plot()->setTP(m_tp); - for( auto& tool : m_tools) { + for( const auto& tool : m_tools) { tool->setTP(m_tp); } } void TrigEgammaAnalysisBaseTool::updateEmulation(Property& /*p*/){ plot()->setEmulation(m_doEmulation); - for( auto& tool : m_tools) { + for( const auto& tool : m_tools) { tool->setEmulation(m_doEmulation); ATH_MSG_INFO("updateEmulation() property for tool with name: " << tool->name()); tool->setEmulationTool(m_emulationTool); @@ -175,7 +179,7 @@ StatusCode TrigEgammaAnalysisBaseTool::initialize() { // propagate the emulation tool for all tools if( m_doEmulation ){ - for( auto& tool : m_tools) { + for( const auto& tool : m_tools) { ATH_MSG_INFO("Propagate emulation tool handler to: " << tool->name() ); tool->setEmulationTool(m_emulationTool); } @@ -351,8 +355,10 @@ void TrigEgammaAnalysisBaseTool::setTrigInfo(const std::string trigger){ if(isL1) etthr=l1thr; // Should be handled elsewhere - TrigInfo info{trigger,type,l1item,l1type,pidname,decorator,isL1,perf,etcut,etthr,l1thr}; + TrigInfo info{trigger,type,l1item,l1type,pidname,decorator,isL1,perf,etcut,etthr,l1thr,m_forceTrigEmulation}; m_trigInfo[trigger] = info; + + m_forceTrigEmulation=false; //hack disable } // return the TrigInfo from trigger name @@ -557,6 +563,7 @@ bool TrigEgammaAnalysisBaseTool::isPrescaled(const std::string trigger){ asg::AcceptData TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigInfo info){ + ATH_MSG_DEBUG("setAccept"); asg::AcceptData acceptData (&m_accept); bool passedL1Calo=false; @@ -571,6 +578,16 @@ TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigIn if(getFeature<xAOD::TrigRNNOutput>(te)){ hasRnn=true; } + + ATH_MSG_DEBUG("Rnn container " << getSGContainsRnn()); + ATH_MSG_DEBUG("TrigPhotonContainer " << getSGContainsTrigPhoton()); + + if(getSGContainsRnn()){ + if(getFeature<xAOD::TrigRNNOutput>(te)){ + hasRnn=true; + } + } + if(!info.trigL1){ // HLT item get full decision ATH_MSG_DEBUG("Check for active features: TrigEMCluster,CaloClusterContainer"); @@ -594,7 +611,9 @@ TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigIn } else if(info.trigType == "photon"){ ATH_MSG_DEBUG("Check for active features: TrigPhoton, PhotonContainer"); - passedL2=ancestorPassed<xAOD::TrigPhotonContainer>(te); + if(getSGContainsTrigPhoton()){ + passedL2=ancestorPassed<xAOD::TrigPhotonContainer>(te); + } passedEF = ancestorPassed<xAOD::PhotonContainer>(te); passedEFTrk=true;// Assume true for photons } @@ -930,7 +949,7 @@ GETTER(pixeldEdx) GETTER(deltaPhiRescaled3) #undef GETTER - std::string TrigEgammaAnalysisBaseTool::getProbePid(const std::string pidtype){ +std::string TrigEgammaAnalysisBaseTool::getProbePid(const std::string pidtype){ static std::map<std::string,std::string> PidMap; //no longer class member but static // Note vloose/lhvloose trigger mapped to Loose/LHLoose offline PID if(PidMap.empty()){ @@ -992,43 +1011,56 @@ bool TrigEgammaAnalysisBaseTool::getTrigCaloRings( const xAOD::TrigEMCluster *em return false; } -bool TrigEgammaAnalysisBaseTool::getCaloRings( const xAOD::Electron * /*el*/, std::vector<float> & /*ringsE*/ ){ +bool TrigEgammaAnalysisBaseTool::getCaloRings( const xAOD::Electron * el, std::vector<float> &ringsE ){ - /* + if(!el) return false; ringsE.clear(); - - auto m_ringsELReader = xAOD::getCaloRingsReader(); + auto ringsELReader = xAOD::getCaloRingsReader(); // First, check if we can retrieve decoration: const xAOD::CaloRingsLinks *caloRingsLinks(nullptr); try { - caloRingsLinks = &(m_ringsELReader->operator()(*el)); + ATH_MSG_DEBUG("getCaloRingsReader->operator()(*el)"); + caloRingsLinks = &(ringsELReader->operator()(*el)); } catch ( const std::exception &e) { ATH_MSG_WARNING("Couldn't retrieve CaloRingsELVec. Reason: " << e.what()); return false; } - if ( caloRingsLinks->empty() ){ - ATH_MSG_WARNING("Particle does not have CaloRings decoratorion."); - return false; - } + if( caloRingsLinks ){ + if ( caloRingsLinks->empty() ){ + ATH_MSG_WARNING("Particle does not have CaloRings decoratorion."); + return false; + } + const xAOD::CaloRings *clrings=nullptr; + try { + // For now, we are using only the first cluster + clrings = *(caloRingsLinks->at(0)); + } catch(const std::exception &e){ + ATH_MSG_WARNING("Couldn't retrieve CaloRings. Reason: " << e.what()); + return false; + } + // For now, we are using only the first cluster + if(clrings) { + ATH_MSG_DEBUG("exportRingsTo..."); + clrings->exportRingsTo(ringsE); + }else{ + ATH_MSG_WARNING("There is a problem when try to attack the rings vector using exportRigsTo() method."); + return false; + } - // For now, we are using only the first cluster - const xAOD::CaloRings *clrings = *(caloRingsLinks->at(0)); - // For now, we are using only the first cluster - - if(clrings) clrings->exportRingsTo(ringsE); - else{ - ATH_MSG_WARNING("There is a problem when try to attack the rings vector using exportRigsTo() method."); + }else{ + ATH_MSG_WARNING("CaloRingsLinks in a nullptr..."); return false; } - */ + return true; } + void TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex(){ // pileup calculation m_nGoodVertex = 0.0; m_nPVertex = 0.0; @@ -1050,8 +1082,6 @@ void TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex(){ } - - MonteCarlo::PDGID TrigEgammaAnalysisBaseTool::pdgid(const xAOD::Egamma *eg, const xAOD::TruthParticleContainer* truthContainer, const xAOD::TruthParticle *&mc_match ) { diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx index 95ec6a52b47e..2572366022b4 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx @@ -144,13 +144,34 @@ StatusCode TrigEgammaDistTool::toolExecute(const std::string basePath,TrigInfo i const auto* obj = getFeature<xAOD::TrigEMCluster>(feat.te()); // Only consider passing objects if(!obj) continue; - if(!ancestorPassed<xAOD::TrigEMCluster>(feat.te())) continue; cd(dir+"HLT"); - hist1("rejection")->Fill("L2Calo",1); + if(ancestorPassed<xAOD::TrigEMCluster>(feat.te())) + hist1("rejection")->Fill("L2Calo",1); fillL2Calo(dir+"L2Calo",obj); // Fill HLT shower shapes - if(boost::contains(info.trigName,"ringer") || info.trigEtcut || info.trigPerf) - fillRinger(dir+"L2Calo",obj); // Fill HLT shower shapes } + + /* + const auto vec_l2ringer = fc.get<xAOD::TrigRingerRings>("",TrigDefs::alsoDeactivateTEs); + for(const auto feat : vec_l2ringer){ + if(feat.te()==nullptr) continue; + const auto* obj = getFeature<xAOD::TrigRingerRings>(feat.te()); + // Only consider passing objects + if(!obj) continue; + fillRingerShapes(dir+"L2Calo",obj);// Fill HLT ringer shapes + }*/ + + const auto vec_l2rnn = fc.get<xAOD::TrigRNNOutput>("",TrigDefs::alsoDeactivateTEs); + for(const auto feat : vec_l2rnn){ + if(feat.te()==nullptr) continue; + const auto* obj = getFeature<xAOD::TrigRNNOutput>(feat.te()); + // Only consider passing objects + if(!obj) continue; + //cd(dir+"HLT"); + //if(ancestorPassed<xAOD::TrigRNNOutput>(feat.te())) + // hist1("rejection")->Fill("L2Calo",1); + fillRnnDistribution(dir+"L2Calo",obj);// Fill HLT Rnn distribution output + } + const auto vec_clus = fc.get<xAOD::CaloClusterContainer>("TrigEFCaloCalibFex",TrigDefs::alsoDeactivateTEs); for(const auto feat : vec_clus){ if(feat.te()==nullptr) continue; @@ -309,32 +330,57 @@ void TrigEgammaDistTool::fillL2Calo(const std::string dir, const xAOD::TrigEMClu } } -void TrigEgammaDistTool::fillRinger(const std::string dir, const xAOD::TrigEMCluster *emCluster){ +void TrigEgammaDistTool::fillRingerShapes(const std::string dir, const xAOD::TrigRingerRings *ringer){ cd(dir); - if(!emCluster) ATH_MSG_DEBUG("Online pointer fails"); + if(!ringer) ATH_MSG_DEBUG("Online pointer fails"); else{ - bool hasRings = false; - std::vector<float> ringsE; - hasRings = getTrigCaloRings(emCluster, ringsE ); - if(hasRings){ - hist2("ringer_etVsEta")->Fill(emCluster->eta(), emCluster->et()/1.e3); - ///Fill rings pdf for each ring - if(m_detailedHists){ - for(unsigned layer =0; layer < 7; ++layer){ - unsigned minRing, maxRing; std::string strLayer; - parseCaloRingsLayers( layer, minRing, maxRing, strLayer ); - cd(dir+"/rings_"+strLayer); - for(unsigned r=minRing; r<=maxRing; ++r){ - std::stringstream ss; - ss << "ringer_ring#" << r; - hist1(ss.str())->Fill( ringsE.at(r) ); - }///loop into rings - }///loop for each calo layer - } + //for(unsigned r=0; r<ringer->rings().size(); ++r){ + // hist2("ringer_shapes")->Fill(r, ringer->rings()[r]); + // } + ATH_MSG_DEBUG("L2 Calo distributions."); + } +} + +void TrigEgammaDistTool::fillRnnDistribution(const std::string dir, const xAOD::TrigRNNOutput *rnn){ + // ringer threshold grid for mc15c, 2016 and 2017 + float ringer_thres_et_bins[6]={15.,20.,30.,40.,50.,50000.}; + float ringer_thres_eta_bins[6]={0.,0.8,1.37,1.54,2.37,2.5}; + + if(!rnn) ATH_MSG_DEBUG("Online pointer fails"); + else{ + if(rnn->rnnDecision().empty() || rnn->rnnDecision().size()!=3){ + ATH_MSG_DEBUG("Invalid RNN Decision. skip object..."); + return; + } + + auto emCluster=rnn->ringer()->emCluster(); + float eta=std::abs(emCluster->eta()); + float et=emCluster->et()*1e-3; + float output=rnn->rnnDecision()[2]; + float avgmu=rnn->rnnDecision()[0]; + + cd(dir); + hist1("discriminant")->Fill(output); + hist2("discriminantVsMu")->Fill(output,avgmu); + cd(dir+"/discriminant_binned"); + for (unsigned etBinIdx=0; etBinIdx<6-1; ++etBinIdx){ + for (unsigned etaBinIdx=0; etaBinIdx<6-1; ++etaBinIdx){ + if( ( et < ringer_thres_et_bins[etBinIdx] && ringer_thres_et_bins[etBinIdx+1] >= et) + && ( eta < ringer_thres_eta_bins[etaBinIdx] && ringer_thres_eta_bins[etaBinIdx+1] >= eta)){ + std::stringstream ss1,ss2; + ss1 << "discriminant_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; + ss2 << "discriminantVsMu_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; + hist1(ss1.str())->Fill(output); + hist2(ss2.str())->Fill(output,avgmu); + } } + } + ATH_MSG_DEBUG("L2 Calo distributions."); } } + + void TrigEgammaDistTool::fillShowerShapes(const std::string dir,const xAOD::Egamma *eg){ cd(dir); ATH_MSG_DEBUG("Fill SS distributions " << dir); @@ -362,8 +408,11 @@ void TrigEgammaDistTool::fillShowerShapes(const std::string dir,const xAOD::Egam hist1("eta")->Fill(eg->eta()); hist1("phi")->Fill(eg->phi()); hist1("topoetcone20")->Fill(getIsolation_topoetcone20(eg)/1e3); - if (eg->pt() > 0) + hist1("topoetcone40_shift")->Fill((getIsolation_topoetcone40(eg)-2450)/1e3); + if (eg->pt() > 0) { hist1("topoetcone20_rel")->Fill(getIsolation_topoetcone20(eg)/eg->pt()); + hist1("topoetcone40_shift_rel")->Fill((getIsolation_topoetcone40(eg)-2450)/eg->pt()); + } } } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx new file mode 100644 index 000000000000..fb2df7075283 --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx @@ -0,0 +1,1255 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ +/********************************************************************** + * AsgTool: TrigEgammaEventSelection + * Authors: + * Ryan Mackenzie White <ryan.white@cern.ch> + * Denis Damazio <denis.damazio@cern.ch> + * Contributors: + * Joao Victor da Fonseca Pinto <joao.victor.da.fonseca.pinto@cern.ch> + * Date: Mar 2015 + * Description: + * Derived class for dumping the probe information into a ttree. + * + **********************************************************************/ + +#include "TrigEgammaAnalysisTools/TrigEgammaEventSelection.h" + +using namespace std; + +TrigEgammaEventSelection::TrigEgammaEventSelection( const std::string& myname ): + TrigEgammaNavTPBaseTool(myname) , TrigEgammaPhysValBase() +{ + m_eventCounter = 0; + declareProperty("CutLabels" , m_cutlabels ); + declareProperty("Analysis" , m_anatype="EventSelection"); + declareProperty("SelectionZ" , m_selectionZ=true ); + declareProperty("SelectionFakes" , m_selectionFakes=false ); + declareProperty("SelectionMC" , m_selectionMC=false ); + declareProperty("SelectionW" , m_selectionW=false ); + declareProperty("SelectionJpsi" , m_selectionJpsi=false ); + declareProperty("DumpTags" , m_dumpTags=false ); + declareProperty("DetailedDataLevel" , m_detailedDataLevel=0 ); + declareProperty("ElectronLHVLooseTool" , m_electronLHVLooseTool ); + + + declareProperty("HLTElectronLikelihoodSelector" , m_HLTElectronLHSelectors ); + declareProperty("EFCaloElectronLikelihoodSelector" , m_EFCaloElectronLHSelectors ); + declareProperty("EFCaloElectronIsEMSelector" , m_EFCaloElectronIsEMSelectors ); + declareProperty("HLTElectronIsEMSelector" , m_HLTElectronIsEMSelectors ); + + m_doCaloRings=false; +} + +StatusCode TrigEgammaEventSelection::childInitialize(){ + + if ( (m_electronLHVLooseTool.retrieve()).isFailure() ){ + ATH_MSG_ERROR( "Could not retrieve VeryLoose LH Selector Tool! Can't work"); + return StatusCode::FAILURE; + } + + if ( (m_EFCaloElectronLHSelectors.retrieve()).isFailure() ){ + ATH_MSG_ERROR( "Could not retrieve EFCalo LH Selector Tool! Can't work"); + return StatusCode::FAILURE; + } + + if ( (m_EFCaloElectronIsEMSelectors.retrieve()).isFailure() ){ + ATH_MSG_ERROR( "Could not retrieve EFCalo IsEM Selector Tool! Can't work"); + return StatusCode::FAILURE; + } + if ( (m_HLTElectronLHSelectors.retrieve()).isFailure() ){ + ATH_MSG_ERROR( "Could not retrieve HLT LH Selector Tool! Can't work"); + return StatusCode::FAILURE; + } + if ( (m_HLTElectronIsEMSelectors.retrieve()).isFailure() ){ + ATH_MSG_ERROR( "Could not retrieve HLT IsEM Selector Tool! Can't work"); + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + + +StatusCode TrigEgammaEventSelection::childBook(){ + + ATH_MSG_DEBUG("Now configuring chains for analysis"); + //Set the base directory from the plot() + m_dir=plot()->getBasePath(); + std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); + + TrigEgammaAnalysisBaseTool::write_trigger_list(chains); + + if(!getEmulation()){ + ATH_MSG_ERROR("Emulation tool was not set. This tool use the emulation to retrievea all support objects. Please, enable this!"); + return StatusCode::FAILURE; + } + + + for(const auto trigName:m_trigInputList){ + if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ + if(plot()->getTrigInfoMap().count(trigName) != 0) + ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName); + else{ + m_trigList.push_back(trigName); + setTrigInfo(trigName); + } + }else if(getEmulation() && m_forceTrigAttachment){// + ATH_MSG_DEBUG("Trigger doesn't exist in menu. Attach to emulate."); + if(plot()->getTrigInfoMap().count(trigName) == 0){ + std::string parent; + m_trigList.push_back(trigName); + setTrigEmulation(); + setTrigInfo(trigName); + } + }// emulation + } + + // set the correct schema level to save + /* 0 is very slim schema + * 1 is slim + * 2 is full */ + if(m_detailedDataLevel > 0 ){ + m_doL2Detailed=true; + m_doL2CaloDetailed=true; + } + if(m_detailedDataLevel > 1){ + m_doRecoDetailed=true; + m_doMCDetailed=true; + } + + + // Book histograms for average efficiencies and counters + //const int nTrigger = (int) m_trigList.size(); + addDirectory(m_dir+"/Expert/Event"); + std::string histname=m_anatype+"_ProbeCutCounter"; + addHistogram(new TH1F(histname.c_str(), "Number of Probes; Cut ; Count", 12, 0., 12)); + histname=m_anatype+"_TagCutCounter"; + addHistogram(new TH1F(histname.c_str(), "Number of Tags; Cut ; Count", 10, 0., 10)); + histname=m_anatype+"_Mee"; + addHistogram(new TH1F(histname.c_str(), "Offline M(ee); m_ee [GeV] ; Count", 50, m_ZeeMassMin, m_ZeeMassMax)); + histname=m_anatype+"_CutCounter"; + addHistogram(new TH1I(histname.c_str(), "Event Selection; Cut ; Count", 6, 0., 6)); + setLabels(hist1(histname),m_cutlabels); + + + addDirectory(m_dir+"/Egamma"); + + // create the TDT metadata for future access + TTree *tdtMetadata = new TTree("tdt", "Trigger metadata navigation"); + createTDTMetadata( tdtMetadata, m_trigList ); + addTree(tdtMetadata, m_dir+"/Egamma"); + + if(m_selectionZ){ + if(m_dumpTags){ + TTree *tag = new TTree( "tags", "tree of Offline Zee tags"); + bookEventBranches( tag ); + bookElectronBranches( tag ); + bookTriggerBranches( tag ); + bookTDTBranches( tag ); + bookMonteCarloBranches( tag ); + addTree(tag, m_dir+"/Egamma"); + } + TTree *probe = new TTree( "probes", "tree of Zee probes"); + bookEventBranches( probe ); + bookElectronBranches( probe ); + bookTriggerBranches( probe ); + bookTDTBranches( probe ); + bookMonteCarloBranches( probe ); + + addTree(probe, m_dir+"/Egamma"); + } + + if(m_selectionFakes){ + TTree *fakes = new TTree( "fakes", "tree of Fakes"); + bookEventBranches( fakes ); + bookElectronBranches( fakes ); + bookTriggerBranches( fakes ); + bookTDTBranches( fakes ); + bookMonteCarloBranches( fakes ); + addTree(fakes, m_dir+"/Egamma"); + } + + + + // Check for Rnn container in SG + if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){ + ATH_MSG_DEBUG("Rnn container in SG "); + setSGContainsRnn(true); + } + + + if(m_storeGate->contains<xAOD::CaloRingsContainer>("ElectronCaloRings")){ + ATH_MSG_DEBUG("Offline electron calo rings in SG"); + m_doCaloRings=true; + } + + // This will needed to emulate objects without all features attached + //if(emulation()) + // emulation()->ExperimentalAndExpertMethods(); + + ///Alloc pointers + alloc_space(); + return StatusCode::SUCCESS; +} + +StatusCode TrigEgammaEventSelection::childExecute(){ + + m_eventCounter++; + + cd(m_dir+"/Expert/Event"); + + // Event Wise Selection (independent of the required signatures) + if ( !TrigEgammaNavTPBaseTool::EventWiseSelection() ) return StatusCode::SUCCESS; + + // Pass by errors in EventInfo + if( !TrigEgammaNavTPBaseTool::passesEventCleaning() ) return StatusCode::SUCCESS; + + // nvtx > 0 + if( getNPVtx() <= 0 ) return StatusCode::SUCCESS; + + if(m_selectionZ) + EventSelectionZ(); + + if(m_selectionFakes) + EventSelectionFakes(); + + //if(m_selectionMC) + // EventSelectionMC(); + + + return StatusCode::SUCCESS; +} + +bool TrigEgammaEventSelection::EventSelectionZ(){ + + ATH_MSG_INFO("In EventSelectonZ..."); + // execute the standard tag and probe method + TrigEgammaNavTPBaseTool::executeTandP(); + cd(m_dir+"/Egamma"); + + for(auto Z : m_Z){ + const xAOD::Electron *elTag = m_offElectrons->at(Z.first); + const xAOD::Electron *elProbe = m_offElectrons->at(Z.second); + if(m_dumpTags) + fill( tree("tags" , m_dir+"/Egamma") , elTag ); + fill( tree("probes", m_dir+"/Egamma") , elProbe ); + + }// Loop over pairs + + return true; +} + +bool TrigEgammaEventSelection::EventSelectionFakes(){ + + + ATH_MSG_INFO("In EventSelectonFakes..."); + double GeV = 1000.; + + for(const auto& elTag : *m_offElectrons){ + + // Remove electrons from Z or W if this is Monte Carlo + if(m_selectionMC && !isTruthElectronAny( elTag )) continue; + + if (!elTag->isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON)) continue; + + if(!elTag->trackParticle()) continue; + + // Default is 4 GeV + if( !(elTag->e()/cosh(elTag->trackParticle()->eta()) > m_probeMinEt*GeV) ) continue; + + //fiducial detector acceptance region + float absEta = fabs(elTag->caloCluster()->etaBE(2)); + if (absEta > 2.47) continue; + + if( !(getWTransverseMass(elTag) < 40000) ) continue; + + bool passesZveto=true; + + // If we can find any pair that falls in the Zmass window we fail the passesZveto cut + for(const auto& elProbe : *m_offElectrons){ + + if(elTag == elProbe) continue; + + if(!elProbe->isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON)) continue; + + if(!elProbe->trackParticle()) continue; + + // Must be higher than 4 GeV + if( (getEt(elProbe)) < 4*GeV) continue; + + if(!TrigEgammaNavTPBaseTool::ApplyElectronPid(elProbe,"LHMedium")) continue; + + //Must be an easy way with IParticle + TLorentzVector el1; + TLorentzVector el2; + el1.SetPtEtaPhiE(elTag->pt(), elTag->trackParticle()->eta(), elTag->trackParticle()->phi(), elTag->e()); + el2.SetPtEtaPhiE(elProbe->pt(), elProbe->trackParticle()->eta(), elProbe->trackParticle()->phi(), elProbe->e()); + float tpPairMass = (el1 + el2).M(); + if( !((tpPairMass > m_ZeeMassMin*1.e3) && (tpPairMass < m_ZeeMassMax*1.e3))){ + ATH_MSG_DEBUG("tag and probe pair not in Z mass window"); + continue; + }else{ + ATH_MSG_INFO("tag and probe pain in Z mass window. Regect the electron..."); + passesZveto=false; + break; + } + }// Loop over probes electrons + + if(!passesZveto) continue; + + ATH_MSG_INFO("Appling Fire trigger..."); + if(!ApplyFireTriggers( elTag )) continue; + + if(TrigEgammaNavTPBaseTool::ApplyElectronPid(elTag,"LHTight")) continue; + + ATH_MSG_INFO("Fill electron..."); + fill( tree("fakes" , m_dir+"/Egamma") , elTag ); + + + }// Loop over electrons + + return true; +} + + + +bool TrigEgammaEventSelection::fill( TTree *t, const xAOD::Electron *el){ + + + linkEventBranches(t); + linkElectronBranches(t); + linkTriggerBranches(t); + linkMonteCarloBranches(t); + + const HLT::TriggerElement* feat=nullptr; + + //bool doAccept=false; + //if(trigItem.empty()){ + // Use the support match method from the emulation tool + if(getEmulation()) + emulation()->match( el, feat ); + else{ + ATH_MSG_ERROR("Emulation tool was not configurated. Impossible to match! Please, see your python config."); + return false; + } + //}else{ + // match()->match(el, trigItem, feat); + // doAccept=true; + //} + + if(feat){ + clear(); + fillEvent(); + fillElectron( el ); + + if(!fillMonteCarlo( el ) ){ + ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); + } + + ///Start trigger analisys... + const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat); + if(emTauRoI){ + fillEmTauRoI( emTauRoI ); + }else{ + ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement.."); + } + + const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); + if(emCluster){ + if(!fillTrigEMCluster( emCluster )){ + ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree."); + } + + if(!fillTrigCaloRings( feat )){ + ATH_MSG_WARNING("Cound not attach the TrigRingerRings information into the tree."); + } + }///cluster protection + + + const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat); + // Level 2 ID+Calo + if(trigElCont){ + for(const auto& trigEl : *trigElCont){ + if(!fillTrigElectron(trigEl)) { + ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree."); + } + }// loop over all trigElectrons for this feat + } + + const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat); + if(caloCont){ + for(const auto& cl : *caloCont){ + if(!fillCaloCluster(cl)){ + ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree."); + } + }// loop over calo cluster + } + + + const xAOD::ElectronContainer *elCont = getFeature<xAOD::ElectronContainer>(feat); + + if(elCont){ + for(const auto& hlt_el : *elCont){ + if(!fillHLTElectron(hlt_el)) + ATH_MSG_WARNING("Cound not attach the HLT Electron information into the tree."); + } + } + + + fillTDT( el, feat ); + + + ATH_MSG_INFO("recording trigger information into the file."); + t->Fill(); + }//loop over trigger objects + + return true; +} + + +bool TrigEgammaEventSelection::fillTDT(const xAOD::Electron *el , const HLT::TriggerElement *te){ + + ATH_MSG_DEBUG("FillTDT..."); + for(auto& trigItem : m_trigList){ + + const HLT::TriggerElement* feat=nullptr; + match()->match(el, trigItem, feat); + if(feat){ + asg::AcceptData acceptData = setAccept(feat, getTrigInfo(trigItem)); + bool passedL1Calo = acceptData.getCutResult("L1Calo"); + bool passedL2Calo = acceptData.getCutResult("L2Calo"); + bool passedL2 = acceptData.getCutResult("L2"); + bool passedEFCalo = acceptData.getCutResult("EFCalo"); + bool passedHLT = acceptData.getCutResult("HLT"); + m_trig_tdt_L1_calo_accept->push_back( int(passedL1Calo) ); + m_trig_tdt_L2_calo_accept->push_back( int(passedL2Calo) ); + m_trig_tdt_L2_el_accept->push_back( int(passedL2) ); + m_trig_tdt_EF_calo_accept->push_back( int(passedEFCalo) ); + m_trig_tdt_EF_el_accept->push_back( int(passedHLT) ); + //m_trig_tdt_emu_decision_mask + count("tdt_"+trigItem+"_total"); + if(passedL1Calo) count("tdt_"+trigItem+"_L1Calo"); + if(passedL2Calo) count("tdt_"+trigItem+"_L2Calo"); + if(passedL2) count("tdt_"+trigItem+"_L2" ); + if(passedEFCalo) count("tdt_"+trigItem+"_EFCalo"); + if(passedHLT) count("tdt_"+trigItem+"_HLT" ); + + }else{ + m_trig_tdt_L1_calo_accept->push_back( -1 ); + m_trig_tdt_L2_calo_accept->push_back( -1 ); + m_trig_tdt_L2_el_accept->push_back( -1 ); + m_trig_tdt_EF_calo_accept->push_back( -1 ); + m_trig_tdt_EF_el_accept->push_back( -1 ); + //ATH_MSG_DEBUG("Trigger bitmask was converted to " << int(GetByteFromBools(mask))); + //m_trig_tdt_decision_mask->push_back(GetByteFromBools(mask)); + } + + if(te && getEmulation()){ + asg::AcceptData acceptData = emulation()->executeTool(te, trigItem); + bool passedL1Calo = acceptData.getCutResult("L1Calo"); + bool passedL2Calo = acceptData.getCutResult("L2Calo"); + bool passedL2 = acceptData.getCutResult("L2"); + bool passedEFCalo = acceptData.getCutResult("EFCalo"); + bool passedHLT = acceptData.getCutResult("HLT"); + m_trig_tdt_emu_L1_calo_accept->push_back( int(passedL1Calo) ); + m_trig_tdt_emu_L2_calo_accept->push_back( int(passedL2Calo) ); + m_trig_tdt_emu_L2_el_accept->push_back( int(passedL2) ); + m_trig_tdt_emu_EF_calo_accept->push_back( int(passedEFCalo) ); + m_trig_tdt_emu_EF_el_accept->push_back( int(passedHLT) ); + //m_trig_tdt_emu_decision_mask + count("emu_"+trigItem+"_total"); + if(passedL1Calo) count("emu_"+trigItem+"_L1Calo"); + if(passedL2Calo) count("emu_"+trigItem+"_L2Calo"); + if(passedL2) count("emu_"+trigItem+"_L2" ); + if(passedEFCalo) count("emu_"+trigItem+"_EFCalo"); + if(passedHLT) count("emu_"+trigItem+"_HLT" ); + }else{ + m_trig_tdt_emu_L1_calo_accept->push_back( -1 ); + m_trig_tdt_emu_L2_calo_accept->push_back( -1 ); + m_trig_tdt_emu_L2_el_accept->push_back( -1 ); + m_trig_tdt_emu_EF_calo_accept->push_back( -1 ); + m_trig_tdt_emu_EF_el_accept->push_back( -1 ); + //ATH_MSG_DEBUG("Trigger bitmask was converted to " << int(GetByteFromBools(mask))); + //m_trig_tdt_decision_mask->push_back(GetByteFromBools(mask)); + } + + + }// Loop over triggers + + + return true; + +} + + + +bool TrigEgammaEventSelection::fillTrigCaloRings( const HLT::TriggerElement *feat ){ + + ATH_MSG_DEBUG("FillTrigCaloRings..."); + /* try to get the calo rings energy for this TE!*/ + const xAOD::TrigRingerRings *ringer = getFeature<xAOD::TrigRingerRings>(feat); + if(ringer){// from this TE + for(unsigned r=0; r<ringer->size(); ++r){ + m_trig_L2_calo_rings->push_back(ringer->rings()[r]); + } + }else{// from others TEs + const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); + if(emCluster){ + // try to match without any other cluster. + TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings); + }else{ + return false; + } + } + + if(getSGContainsRnn()){ + /* try to retrieve the NN output from this TE*/ + const xAOD::TrigRNNOutput *rnn = getFeature<xAOD::TrigRNNOutput>(feat); + if(rnn){ + for(unsigned o=0; o<rnn->rnnDecision().size(); ++o) + m_trig_L2_calo_rnnOutput->push_back(rnn->rnnDecision()[o]); + }else{ + ATH_MSG_WARNING("Cound not attach the TrigRNNOutput information into the tree."); + } + } + return true; +} + + + + +bool TrigEgammaEventSelection::ApplyFireTriggers( const xAOD::Electron *el){ + + float GeV = 1000.0; + float et = getEt(el); + + std::string trigger=""; + + if(et < 5*GeV){ + return false; + }else if(et >= 5*GeV && et < 10*GeV){ + trigger = "HLT_e5_etcut"; + }else if(et >= 10*GeV && et < 15*GeV){ + trigger = "HLT_e10_etcut_L1EM7"; + }else if(et >= 15*GeV && et < 20*GeV){ + trigger = "HLT_e15_etcut_L1EM7"; + }else if(et >= 20*GeV && et < 25*GeV){ + trigger = "HLT_e20_etcut_L1EM12"; + }else if(et >= 25*GeV && et < 30*GeV){ + trigger = "HLT_e25_etcut_L1EM15"; + }else if(et >= 30*GeV && et < 40*GeV){ + trigger = "HLT_e30_etcut_L1EM15"; + }else if(et >= 40*GeV && et < 50*GeV){ + trigger = "HLT_e40_etcut_L1EM15"; + }else if(et >= 50*GeV && et < 60*GeV){ + trigger = "HLT_e50_etcut_L1EM15"; + }else if(et >= 50*GeV && et < 60*GeV){ + trigger = "HLT_e60_etcut"; + }else if(et >= 60*GeV && et < 70*GeV){ + trigger = "HLT_e70_etcut"; + }else if(et >= 70*GeV && et < 80*GeV){ + trigger = "HLT_e80_etcut"; + }else if(et >= 80*GeV && et < 100*GeV){ + trigger = "HLT_e100_etcut"; + }else if(et >= 100*GeV && et < 120*GeV){ + trigger = "HLT_e120_etcut"; + }else{ + return true; + } + + const HLT::TriggerElement *te; + match()->match(el,trigger,te); + bool passedHLT = ancestorPassed<xAOD::ElectronContainer>(te); + + if(!passedHLT) return false; + + return true; +} + + + +StatusCode TrigEgammaEventSelection::childFinalize(){ + //release_space(); + //ATH_MSG_DEBUG( "Number of probes collected is: " <<tree("probes" , m_dir+"/Egamma")->GetEntries()); + + for(auto& trigItem : m_trigList){ + ATH_MSG_DEBUG("From TDT tool:"); + ATH_MSG_DEBUG(trigItem << " total = " << m_countMap["tdt_"+trigItem+"_total"] ); + ATH_MSG_DEBUG(trigItem << " L1Calo = " << m_countMap["tdt_"+trigItem+"_L1Calo"]); + ATH_MSG_DEBUG(trigItem << " L2Calo = " << m_countMap["tdt_"+trigItem+"_L2Calo"]); + ATH_MSG_DEBUG(trigItem << " L2 = " << m_countMap["tdt_"+trigItem+"_L2"] ); + ATH_MSG_DEBUG(trigItem << " EFCalo = " << m_countMap["tdt_"+trigItem+"_EFCalo"]); + ATH_MSG_DEBUG(trigItem << " HLT = " << m_countMap["tdt_"+trigItem+"_HLT"] ); + ATH_MSG_DEBUG("From emulation tool:"); + ATH_MSG_DEBUG(trigItem << " total = " << m_countMap["emu_"+trigItem+"_total"] ); + ATH_MSG_DEBUG(trigItem << " L1Calo = " << m_countMap["emu_"+trigItem+"_L1Calo"]); + ATH_MSG_DEBUG(trigItem << " L2Calo = " << m_countMap["emu_"+trigItem+"_L2Calo"]); + ATH_MSG_DEBUG(trigItem << " L2 = " << m_countMap["emu_"+trigItem+"_L2"] ); + ATH_MSG_DEBUG(trigItem << " EFCalo = " << m_countMap["emu_"+trigItem+"_EFCalo"]); + ATH_MSG_DEBUG(trigItem << " HLT = " << m_countMap["emu_"+trigItem+"_HLT"] ); + } + return StatusCode::SUCCESS; +} + + +bool TrigEgammaEventSelection::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){ + + ATH_MSG_DEBUG("FillEmTauRoI..."); + m_trig_L1_eta = emTauRoI->eta(); + m_trig_L1_phi = emTauRoI->phi(); + m_trig_L1_emClus = emTauRoI->emClus(); + m_trig_L1_tauClus = emTauRoI->tauClus(); + m_trig_L1_emIsol = emTauRoI->emIsol(); + m_trig_L1_hadIsol = emTauRoI->hadIsol(); + m_trig_L1_hadCore = emTauRoI->hadCore(); + //for(unsigned i=0; i < emTauRoI->thrNames().size();++i){ + // m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i)); + //} + return true; +} + +bool TrigEgammaEventSelection::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){ + + ATH_MSG_DEBUG("FillTrigEMCluster..."); + m_trig_L2_calo_et = emCluster->et(); + m_trig_L2_calo_eta = emCluster->eta(); + m_trig_L2_calo_phi = emCluster->phi(); + m_trig_L2_calo_emaxs1 = emCluster->emaxs1(); + m_trig_L2_calo_e2tsts1 = emCluster->e2tsts1(); + m_trig_L2_calo_e237 = emCluster->e237(); + m_trig_L2_calo_e277 = emCluster->e277(); + m_trig_L2_calo_ehad1 = emCluster->ehad1(); + m_trig_L2_calo_weta2 = emCluster->weta2(); + m_trig_L2_calo_wstot = emCluster->wstot(); + m_trig_L2_calo_fracs1 = emCluster->fracs1(); + for(unsigned i=0; i<emCluster->energySample().size(); ++i){ + m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i)); + } + + return true; +} + + +bool TrigEgammaEventSelection::fillTrigElectron( const xAOD::TrigElectron *trigEl ){ + ATH_MSG_DEBUG("FillTrigElectron..."); + //const xAOD::TrackParticle* trkIter = trigEl->trackParticle(); + //if (trkIter==nullptr) return false; // disconsider candidates without track + //int algoId = 0; + //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9; + //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] ) algoId=5; + //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] ) algoId=6; + //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] ) algoId=7; + + //m_trig_L2_el_trackAlgID ->push_back(algoId); + m_trig_L2_el_caloEta ->push_back(trigEl->caloEta()); + m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi()); + m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta()); + m_trig_L2_el_pt ->push_back(trigEl->pt()); + m_trig_L2_el_phi ->push_back(trigEl->phi()); + m_trig_L2_el_eta ->push_back(trigEl->eta()); + m_trig_L2_el_etOverPt ->push_back(trigEl->etOverPt()); + m_trig_L2_el_nTRTHits ->push_back(trigEl->nTRTHits()); + m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits()); + m_trig_L2_el_charge ->push_back(trigEl->charge()); + return true; +} + + +bool TrigEgammaEventSelection::fillCaloCluster( const xAOD::CaloCluster *cluster){ + + ATH_MSG_DEBUG("FillCaloCluster..."); + m_trig_EF_calo_et->push_back(cluster->et()); + m_trig_EF_calo_eta->push_back(cluster->eta()); + m_trig_EF_calo_phi->push_back(cluster->phi()); + m_trig_EF_calo_etaBE2->push_back(cluster->etaBE(2)); + m_trig_EF_calo_e->push_back(cluster->e()); + + return true; +} + +bool TrigEgammaEventSelection::fillEvent(){ + ///Event information + ATH_MSG_DEBUG("FillEvent..."); + m_runNumber = m_eventInfo->runNumber(); + m_eventNumber = m_eventInfo->eventNumber(); + m_lumiBlock = m_eventInfo->lumiBlock(); + m_avgmu=getAvgMu(); + return true; +} + +bool TrigEgammaEventSelection::fillElectron( const xAOD::Electron *el ){ + + ATH_MSG_DEBUG("FillElectron..."); + ///Cluster information + uint8_t nblayerhits(0); + uint8_t nblayerolhits(0); + uint8_t npixhits(0); + uint8_t npixolhits(0); + uint8_t nscthits(0); + uint8_t nsctolhits(0); + uint8_t ntrthighthreshits(0); + uint8_t ntrthighthresolhits(0); + uint8_t ntrthits(0); + uint8_t ntrtolhits(0); + uint8_t ntrtxenonhits(0); + uint8_t npixdeadsensors(0); + uint8_t nsctdeadsensors(0); + uint8_t expectblayerhit(true); + uint8_t expectNextToInnerMostLayer(true); + uint8_t nNextToInnerMostLayerHits(0); + uint8_t nNextToInnerMostLayerOutliers(0); + float val(0); + bool hasCalo(false); + bool hasTrack(false); + + + + m_el_e = el->e(); + m_el_et = el->pt(); + m_el_eta = el->eta(); + m_el_phi = el->phi(); + + el->showerShapeValue( m_el_ethad1 , xAOD::EgammaParameters::ShowerShapeType::ethad1 ); + el->showerShapeValue( m_el_ehad1 , xAOD::EgammaParameters::ShowerShapeType::ehad1 ); + el->showerShapeValue( m_el_f1 , xAOD::EgammaParameters::ShowerShapeType::f1 ); // LH + el->showerShapeValue( m_el_f3 , xAOD::EgammaParameters::ShowerShapeType::f3 ); // LH + el->showerShapeValue( m_el_f1core , xAOD::EgammaParameters::ShowerShapeType::f1core ); + el->showerShapeValue( m_el_f3core , xAOD::EgammaParameters::ShowerShapeType::f3core ); + el->showerShapeValue( m_el_weta1 , xAOD::EgammaParameters::ShowerShapeType::weta1 ); // LH (new) + el->showerShapeValue( m_el_weta2 , xAOD::EgammaParameters::ShowerShapeType::weta2 ); // LH + el->showerShapeValue( m_el_wtots1 , xAOD::EgammaParameters::ShowerShapeType::wtots1 ); + el->showerShapeValue( m_el_fracs1 , xAOD::EgammaParameters::ShowerShapeType::fracs1 ); + el->showerShapeValue( m_el_Reta , xAOD::EgammaParameters::ShowerShapeType::Reta ); // LH + el->showerShapeValue( m_el_Rphi , xAOD::EgammaParameters::ShowerShapeType::Rphi ); // LH + el->showerShapeValue( m_el_Eratio , xAOD::EgammaParameters::ShowerShapeType::Eratio ); // LH + el->showerShapeValue( m_el_Rhad , xAOD::EgammaParameters::ShowerShapeType::Rhad ); // LH + el->showerShapeValue( m_el_Rhad1 , xAOD::EgammaParameters::ShowerShapeType::Rhad1 ); // LH + el->showerShapeValue( m_el_deltaE , xAOD::EgammaParameters::ShowerShapeType::DeltaE ); // LH + el->showerShapeValue( m_el_e277 , xAOD::EgammaParameters::ShowerShapeType::e277 ); // LH + ///Combined track/Cluter information + el->trackCaloMatchValue( m_el_deta2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2 ); + el->trackCaloMatchValue( m_el_dphi2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2 ); + el->trackCaloMatchValue( m_el_dphiresc , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 ); + m_el_deltaPhiRescaled2 = get_el_deltaPhiRescaled2(el); // LH + m_el_deltaEta1 = get_el_deltaEta1(el); // LH + + if(el->caloCluster()){ + hasCalo=true; + m_el_calo_et = getCluster_et( el ); + m_el_calo_eta = getCluster_eta( el ); + m_el_calo_phi = getCluster_phi( el ); + m_el_calo_etaBE2 = el->caloCluster()->etaBE(2); // LH + m_el_calo_e = el->caloCluster()->e(); // LH + } + + ///Track particle information + const xAOD::TrackParticle *track = el->trackParticle(); + if(track){ + hasTrack=true; + track->summaryValue( nblayerhits , xAOD::SummaryType::numberOfBLayerHits ); + track->summaryValue( nblayerolhits , xAOD::SummaryType::numberOfBLayerOutliers ); + track->summaryValue( npixhits , xAOD::SummaryType::numberOfPixelHits ); + track->summaryValue( npixolhits , xAOD::SummaryType::numberOfPixelOutliers ); + track->summaryValue( npixdeadsensors , xAOD::SummaryType::numberOfPixelDeadSensors); + track->summaryValue( nscthits , xAOD::SummaryType::numberOfSCTHits ); + track->summaryValue( nsctolhits , xAOD::SummaryType::numberOfSCTOutliers ); + track->summaryValue( nsctdeadsensors , xAOD::SummaryType::numberOfSCTDeadSensors); + track->summaryValue( ntrthits , xAOD::SummaryType::numberOfTRTHits); + track->summaryValue( ntrtolhits , xAOD::SummaryType::numberOfTRTOutliers ); + track->summaryValue( ntrthighthreshits , xAOD::SummaryType::numberOfTRTHighThresholdHits ); + track->summaryValue( ntrthighthresolhits , xAOD::SummaryType::numberOfTRTHighThresholdOutliers ); + track->summaryValue( ntrtxenonhits , xAOD::SummaryType::numberOfTRTXenonHits ); + track->summaryValue( expectblayerhit , xAOD::SummaryType::expectBLayerHit ); + track->summaryValue( expectNextToInnerMostLayer , xAOD::expectNextToInnermostPixelLayerHit); + track->summaryValue( nNextToInnerMostLayerHits , xAOD::numberOfNextToInnermostPixelLayerHits); + track->summaryValue( nNextToInnerMostLayerOutliers, xAOD::numberOfNextToInnermostPixelLayerOutliers); + + m_el_trk_pt = track->pt(); + m_el_trk_eta = track->eta(); + m_el_trk_charge = track->charge(); // LH + m_el_trk_qOverP = track->qOverP(); // LH + m_el_trk_sigd0 = get_el_sigd0(el); // LH + m_el_trk_d0 = get_el_d0(el); // LH + m_el_trk_eProbabilityHT = get_el_eProbabilityHT(el); // LH + m_el_trk_transformed_eProbabilityHT=get_el_transformed_eProbabilityHT(el); // LH + m_el_trk_d0significance = get_el_d0significance(el); + m_el_trk_deltaPOverP = get_el_DeltaPOverP(el); // LH + + } + + ///Extra information about pileup + m_el_nGoodVtx = getNGoodVertex(); + m_el_nPileupPrimaryVtx = getNPVtx(); + + auto ctx = Gaudi::Hive::currentContext() ; + // rerun Likelihood Veryloose selector tool + bool accept=(bool)m_electronLHVLooseTool->accept(ctx,el, getAvgMu()); + m_el_lhVLoose = accept; + m_el_loose = ApplyElectronPid(el, "Loose"); + m_el_medium = ApplyElectronPid(el, "Medium"); + m_el_tight = ApplyElectronPid(el, "Tight"); + m_el_lhLoose = ApplyElectronPid(el, "LHLoose"); + m_el_lhMedium = ApplyElectronPid(el, "LHMedium"); + m_el_lhTight = ApplyElectronPid(el, "LHTight"); + + + // Do not change this order! + m_el_trk_summaryValues->push_back( nblayerhits ); + m_el_trk_summaryValues->push_back( nblayerolhits ); + m_el_trk_summaryValues->push_back( npixhits ); + m_el_trk_summaryValues->push_back( npixolhits ); + m_el_trk_summaryValues->push_back( npixdeadsensors ); + m_el_trk_summaryValues->push_back( nscthits ); + m_el_trk_summaryValues->push_back( nsctolhits ); + m_el_trk_summaryValues->push_back( nsctdeadsensors ); + m_el_trk_summaryValues->push_back( ntrthits ); + m_el_trk_summaryValues->push_back( ntrtolhits ); + m_el_trk_summaryValues->push_back( ntrthighthreshits ); + m_el_trk_summaryValues->push_back( ntrthighthresolhits ); + m_el_trk_summaryValues->push_back( ntrtxenonhits ); + m_el_trk_summaryValues->push_back( expectblayerhit ); + m_el_trk_summaryValues->push_back( expectNextToInnerMostLayer ); + m_el_trk_summaryValues->push_back( nNextToInnerMostLayerHits ); + m_el_trk_summaryValues->push_back( nNextToInnerMostLayerOutliers ); + + //Add isolations values + el->isolationValue(val,xAOD::Iso::etcone20); + m_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::etcone30); + m_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::etcone40); + m_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone20); + m_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone30); + m_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone40); + m_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone20); + m_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone30); + m_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone40); + m_el_ptCone->push_back(val); + + m_el_hasCalo=hasCalo; + m_el_hasTrack=hasTrack; + + + if(m_doCaloRings){ + ATH_MSG_DEBUG("Fill Electron calo rings..."); + if(!TrigEgammaAnalysisBaseTool::getCaloRings( el , *m_el_ringsE)){ + ATH_MSG_WARNING("Could not attach the calorRings information."); + } + } + + + + return true; +} + + +bool TrigEgammaEventSelection::fillHLTElectron( const xAOD::Electron *el ){ + + ATH_MSG_DEBUG("FillHLTElectron..."); + float calo_e(0); + float calo_et(0); + float calo_eta(0); + float calo_phi(0); + float calo_etaBE2(0); + float eta(0); + float et(0); + //float eta2(0); + float phi(0); + float pt(0); + float trk_eta(0); + float ethad1(0); + float ehad1(0); + float f1(0); + float f3(0); + float f1core(0); + float f3core(0); + float weta1(0); + float weta2(0); + float wtots1(0); + float fracs1(0); + float Reta(0); + float Rphi(0); + float Eratio(0); + float Rhad(0); + float Rhad1(0); + float deta1(0); + float deta2(0); + float dphi2(0); + float dphiresc(0); + float charge(0); + float qOverP(0); + float sigd0(0); + float d0(0); + //float eprobht(0); + float eProbabilityHT(0); + float transformed_eProbabilityHT(0); + float d0significance(0); + float deltaPhiRescaled2(0); + float deltaPOverP(0); + float e(0); + float e277(0); + float deltaE(0); + uint8_t nblayerhits(0); + uint8_t nblayerolhits(0); + uint8_t npixhits(0); + uint8_t npixolhits(0); + uint8_t nscthits(0); + uint8_t nsctolhits(0); + uint8_t ntrthighthreshits(0); + uint8_t ntrthighthresolhits(0); + uint8_t ntrthits(0); + uint8_t ntrtolhits(0); + uint8_t ntrtxenonhits(0); + uint8_t npixdeadsensors(0); + uint8_t nsctdeadsensors(0); + uint8_t expectblayerhit(true); + uint8_t expectNextToInnerMostLayer(true); + uint8_t nNextToInnerMostLayerHits(0); + uint8_t nNextToInnerMostLayerOutliers(0); + float val(0) ; + + bool hasCalo(false); + bool hasTrack(false); + + + ATH_MSG_DEBUG("FillElectron..."); + + ///Cluster information + e = el->e(); + et = el->pt(); + eta = el->eta(); + phi = el->phi(); + + el->showerShapeValue( ethad1 , xAOD::EgammaParameters::ShowerShapeType::ethad1 ); + el->showerShapeValue( ehad1 , xAOD::EgammaParameters::ShowerShapeType::ehad1 ); + el->showerShapeValue( f1 , xAOD::EgammaParameters::ShowerShapeType::f1 ); // LH, isEM + el->showerShapeValue( f3 , xAOD::EgammaParameters::ShowerShapeType::f3 ); // LH, isEM + el->showerShapeValue( f1core , xAOD::EgammaParameters::ShowerShapeType::f1core ); + el->showerShapeValue( f3core , xAOD::EgammaParameters::ShowerShapeType::f3core ); // isEM + el->showerShapeValue( weta1 , xAOD::EgammaParameters::ShowerShapeType::weta1 ); // LH, isEM (new) + el->showerShapeValue( weta2 , xAOD::EgammaParameters::ShowerShapeType::weta2 ); // LH, isEM + el->showerShapeValue( wtots1 , xAOD::EgammaParameters::ShowerShapeType::wtots1 ); // LH, isEM + el->showerShapeValue( fracs1 , xAOD::EgammaParameters::ShowerShapeType::fracs1 ); // isEM + el->showerShapeValue( Reta , xAOD::EgammaParameters::ShowerShapeType::Reta ); // LH, isEM + el->showerShapeValue( Rphi , xAOD::EgammaParameters::ShowerShapeType::Rphi ); // LH, isEM + el->showerShapeValue( Eratio , xAOD::EgammaParameters::ShowerShapeType::Eratio ); // LH, isEM + el->showerShapeValue( Rhad , xAOD::EgammaParameters::ShowerShapeType::Rhad ); // LH, isEM + el->showerShapeValue( Rhad1 , xAOD::EgammaParameters::ShowerShapeType::Rhad1 ); // LH, isEM + el->showerShapeValue( e277 , xAOD::EgammaParameters::e277 ); // isEM (new) + el->showerShapeValue( deltaE , xAOD::EgammaParameters::DeltaE ); // isEM (new) + + ///Combined track/Cluter information + el->trackCaloMatchValue( deta2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2 ); + el->trackCaloMatchValue( dphi2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2 ); + el->trackCaloMatchValue( dphiresc , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 ); + deltaPhiRescaled2 = get_el_deltaPhiRescaled2(el); // LH + deta1 = get_el_deltaEta1(el); // LH + + if(el->caloCluster()){ + hasCalo=true; + calo_et = getCluster_et( el ); + calo_eta = getCluster_eta( el ); + calo_phi = getCluster_phi( el ); + calo_etaBE2 = el->caloCluster()->etaBE(2); // LH + calo_e = el->caloCluster()->e(); // LH + } + + + + ///Track particle information + const xAOD::TrackParticle *track = el->trackParticle(); + if(track){ + hasTrack=true; + // track->summaryValue( eprobht , xAOD::SummaryType::eProbabilityHT ); // LH + track->summaryValue( nblayerhits , xAOD::SummaryType::numberOfBLayerHits ); // LH, isEM + track->summaryValue( nblayerolhits , xAOD::SummaryType::numberOfBLayerOutliers ); // LH, isEM + track->summaryValue( npixhits , xAOD::SummaryType::numberOfPixelHits ); // LH, isEM + track->summaryValue( npixolhits , xAOD::SummaryType::numberOfPixelOutliers ); // isEM + track->summaryValue( npixdeadsensors , xAOD::SummaryType::numberOfPixelDeadSensors); // LH, isEM + track->summaryValue( nscthits , xAOD::SummaryType::numberOfSCTHits ); // LH, isEM + track->summaryValue( nsctolhits , xAOD::SummaryType::numberOfSCTOutliers ); // isEM + track->summaryValue( nsctdeadsensors , xAOD::SummaryType::numberOfSCTDeadSensors); // isEM + track->summaryValue( ntrthits , xAOD::SummaryType::numberOfTRTHits); // isEM + track->summaryValue( ntrtolhits , xAOD::SummaryType::numberOfTRTOutliers ); // isEM + track->summaryValue( ntrthighthreshits , xAOD::SummaryType::numberOfTRTHighThresholdHits ); // isEM + track->summaryValue( ntrthighthresolhits , xAOD::SummaryType::numberOfTRTHighThresholdOutliers ); // isEM + track->summaryValue( ntrtxenonhits , xAOD::SummaryType::numberOfTRTXenonHits ); // isEM + track->summaryValue( expectblayerhit , xAOD::SummaryType::expectBLayerHit ); // LH, isEM + track->summaryValue( expectNextToInnerMostLayer , xAOD::expectNextToInnermostPixelLayerHit); // LH, isEM + track->summaryValue( nNextToInnerMostLayerHits , xAOD::numberOfNextToInnermostPixelLayerHits); // LH, isEM + track->summaryValue( nNextToInnerMostLayerOutliers, xAOD::numberOfNextToInnermostPixelLayerOutliers); // LH, isEM + + pt = track->pt(); + trk_eta = track->eta(); // LH + charge = track->charge(); // LH + qOverP = track->qOverP(); // LH, isEM + sigd0 = get_el_sigd0(el); // LH + d0 = get_el_d0(el); // LH, isEM + eProbabilityHT = get_el_eProbabilityHT(el); // LH, isEM + transformed_eProbabilityHT=get_el_transformed_eProbabilityHT(el); // LH + d0significance = get_el_d0significance(el); + deltaPOverP = get_el_DeltaPOverP(el); // LH + } + + auto avgmu=getAvgMu(); + + m_trig_EF_el_hasCalo ->push_back( hasCalo ); + m_trig_EF_el_hasTrack ->push_back( hasTrack ); + + auto ctx = Gaudi::Hive::currentContext(); + m_trig_EF_calo_tight ->push_back((bool)(m_EFCaloElectronIsEMSelectors[0]->accept(ctx,el))); + m_trig_EF_calo_medium ->push_back((bool)(m_EFCaloElectronIsEMSelectors[1]->accept(ctx,el))); + m_trig_EF_calo_loose ->push_back((bool)(m_EFCaloElectronIsEMSelectors[2]->accept(ctx,el))); + m_trig_EF_calo_lhtight ->push_back((bool)(m_EFCaloElectronLHSelectors[0]->accept(ctx,el,avgmu))); + m_trig_EF_calo_lhmedium ->push_back((bool)(m_EFCaloElectronLHSelectors[1]->accept(ctx,el,avgmu))); + m_trig_EF_calo_lhloose ->push_back((bool)(m_EFCaloElectronLHSelectors[2]->accept(ctx,el,avgmu))); + m_trig_EF_calo_lhvloose ->push_back((bool)(m_EFCaloElectronLHSelectors[3]->accept(ctx,el,avgmu))); + + m_trig_EF_el_tight ->push_back((bool)(m_HLTElectronIsEMSelectors[0]->accept(ctx,el))); + m_trig_EF_el_medium ->push_back((bool)(m_HLTElectronIsEMSelectors[1]->accept(ctx,el))); + m_trig_EF_el_loose ->push_back((bool)(m_HLTElectronIsEMSelectors[2]->accept(ctx,el))); + m_trig_EF_el_lhtight ->push_back((bool)(m_HLTElectronLHSelectors[0]->accept(ctx,el,avgmu))); + m_trig_EF_el_lhmedium ->push_back((bool)(m_HLTElectronLHSelectors[1]->accept(ctx,el,avgmu))); + m_trig_EF_el_lhloose ->push_back((bool)(m_HLTElectronLHSelectors[2]->accept(ctx,el,avgmu))); + m_trig_EF_el_lhvloose ->push_back((bool)(m_HLTElectronLHSelectors[3]->accept(ctx,el,avgmu))); + + m_trig_EF_el_calo_et ->push_back( calo_et); + m_trig_EF_el_calo_eta ->push_back( calo_eta ); + m_trig_EF_el_calo_phi ->push_back( calo_phi ); + m_trig_EF_el_calo_etaBE2 ->push_back( calo_etaBE2 ); + m_trig_EF_el_calo_e ->push_back( calo_e ); + + m_trig_EF_el_et ->push_back( et ); + m_trig_EF_el_eta ->push_back( eta ); + m_trig_EF_el_phi ->push_back( phi ); + m_trig_EF_el_e ->push_back( e ); + m_trig_EF_el_e277 ->push_back( e277 ); + m_trig_EF_el_deltaE ->push_back( deltaE ); + m_trig_EF_el_ethad1 ->push_back( ethad1 ); + m_trig_EF_el_ehad1 ->push_back( ehad1 ); + m_trig_EF_el_f1 ->push_back( f1 ); + m_trig_EF_el_f3 ->push_back( f3 ); + m_trig_EF_el_f1core ->push_back( f1core ); + m_trig_EF_el_f3core ->push_back( f3core ); + m_trig_EF_el_weta1 ->push_back( weta1 ); + m_trig_EF_el_weta2 ->push_back( weta2 ); + m_trig_EF_el_wtots1 ->push_back( wtots1 ); + m_trig_EF_el_fracs1 ->push_back( fracs1 ); + m_trig_EF_el_Reta ->push_back( Reta ); + m_trig_EF_el_Rphi ->push_back( Rphi ); + m_trig_EF_el_Eratio ->push_back( Eratio ); + m_trig_EF_el_Rhad ->push_back( Rhad ); + m_trig_EF_el_Rhad1 ->push_back( Rhad1 ); + m_trig_EF_el_deta2 ->push_back( deta2 ); + m_trig_EF_el_dphi2 ->push_back( dphi2 ); + m_trig_EF_el_dphiresc ->push_back( dphiresc ); + m_trig_EF_el_deltaEta1 ->push_back( deta1 ); + m_trig_EF_el_deltaPhiRescaled2 ->push_back( deltaPhiRescaled2 ); + + m_trig_EF_el_trk_pt ->push_back( pt ); + m_trig_EF_el_trk_eta ->push_back( trk_eta ); + m_trig_EF_el_trk_charge ->push_back( charge ); + m_trig_EF_el_trk_qOverP ->push_back( qOverP ); + m_trig_EF_el_trk_sigd0 ->push_back( sigd0 ); + m_trig_EF_el_trk_d0 ->push_back( d0 ); + m_trig_EF_el_trk_eProbabilityHT ->push_back( eProbabilityHT ); + m_trig_EF_el_trk_transformed_eProbabilityHT ->push_back( transformed_eProbabilityHT ); + m_trig_EF_el_trk_d0significance ->push_back( d0significance ); + m_trig_EF_el_trk_deltaPOverP ->push_back( deltaPOverP ); + + + m_trig_EF_el_trk_summaryValues->push_back( nblayerhits ); + m_trig_EF_el_trk_summaryValues->push_back( nblayerolhits ); + m_trig_EF_el_trk_summaryValues->push_back( npixhits ); + m_trig_EF_el_trk_summaryValues->push_back( npixolhits ); + m_trig_EF_el_trk_summaryValues->push_back( npixdeadsensors ); + m_trig_EF_el_trk_summaryValues->push_back( nscthits ); + m_trig_EF_el_trk_summaryValues->push_back( nsctolhits ); + m_trig_EF_el_trk_summaryValues->push_back( nsctdeadsensors ); + m_trig_EF_el_trk_summaryValues->push_back( ntrthits ); + m_trig_EF_el_trk_summaryValues->push_back( ntrtolhits ); + m_trig_EF_el_trk_summaryValues->push_back( ntrthighthreshits ); + m_trig_EF_el_trk_summaryValues->push_back( ntrthighthresolhits ); + m_trig_EF_el_trk_summaryValues->push_back( ntrtxenonhits ); + m_trig_EF_el_trk_summaryValues->push_back( expectblayerhit ); + m_trig_EF_el_trk_summaryValues->push_back( expectNextToInnerMostLayer ); + m_trig_EF_el_trk_summaryValues->push_back( nNextToInnerMostLayerHits ); + m_trig_EF_el_trk_summaryValues->push_back( nNextToInnerMostLayerOutliers ); + + //Add isolations values + el->isolationValue(val,xAOD::Iso::etcone20); + m_trig_EF_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::etcone30); + m_trig_EF_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::etcone40); + m_trig_EF_el_etCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone20); + m_trig_EF_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone30); + m_trig_EF_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptcone40); + m_trig_EF_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone20); + m_trig_EF_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone30); + m_trig_EF_el_ptCone->push_back(val); + el->isolationValue(val,xAOD::Iso::ptvarcone40); + m_trig_EF_el_ptCone->push_back(val); + + + + + /* + m_trig_EF_el_nblayerhits ->push_back( nblayerhits ); + m_trig_EF_el_nblayerolhits ->push_back( nblayerolhits ); + m_trig_EF_el_npixhits ->push_back( npixhits ); + m_trig_EF_el_npixolhits ->push_back( npixolhits ); + m_trig_EF_el_npixdeadsensors ->push_back( npixdeadsensors ); + m_trig_EF_el_nscthits ->push_back( nscthits ); + m_trig_EF_el_nsctolhits ->push_back( nsctolhits ); + m_trig_EF_el_nsctdeadsensors ->push_back( nsctdeadsensors ); + m_trig_EF_el_ntrthits ->push_back( ntrthits ); + m_trig_EF_el_ntrtolhits ->push_back( ntrtolhits ); + m_trig_EF_el_ntrthightreshits ->push_back( ntrthighthreshits ); + m_trig_EF_el_ntrthighthresolhits ->push_back( ntrthighthresolhits ); + m_trig_EF_el_ntrtxenonhits ->push_back( ntrtxenonhits ); + m_trig_EF_el_expectblayerhit ->push_back( expectblayerhit ); + m_trig_EF_el_expectNextToInnerMostLayer ->push_back( expectNextToInnerMostLayer); + m_trig_EF_el_nNextToInnerMostLayerHits ->push_back( nNextToInnerMostLayerHits ); + m_trig_EF_el_nNextToInnerMostLayerOutliers->push_back( nNextToInnerMostLayerOutliers ); + */ + + + + + return true; +} + + + +// if true: is Z or W Or not MC if false: not electron or not Z||W mother +bool TrigEgammaEventSelection::isTruthElectronAny(const xAOD::Egamma *eg ){ + if(m_truthContainer){ + const xAOD::TruthParticle *mc=nullptr; + MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc); + if(mc){ + bool Z,W,e; + Z=W=e=false; + if(pdg == MonteCarlo::PDGID::ZMother) Z = true; + if(pdg == MonteCarlo::PDGID::WMother) W = true; + if(mc->isElectron()) e=true; + return !(e && (Z||W)); + } + } + return true; +} + + +bool TrigEgammaEventSelection::fillMonteCarlo(const xAOD::Egamma *eg){ + + if(m_truthContainer){ + const xAOD::TruthParticle *mc=nullptr; + MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc); + if(mc){ + m_mc_hasMC = true; + m_mc_pt = mc->pt(); + m_mc_eta = mc->eta(); + m_mc_phi = mc->phi(); + m_mc_isTop = mc->isTop(); + m_mc_isQuark = mc->isQuark(); + m_mc_isParton = mc->isParton(); + m_mc_isMeson = mc->isMeson(); + m_mc_isTau = mc->isTau(); + m_mc_isMuon = mc->isMuon(); + m_mc_isPhoton = mc->isPhoton(); + m_mc_isElectron = mc->isElectron(); + if(pdg == MonteCarlo::PDGID::ZMother) m_mc_hasZMother = true; + if(pdg == MonteCarlo::PDGID::WMother) m_mc_hasWMother = true; + return true; + }//has match + }//has truth container + return false; +} + + +bool TrigEgammaEventSelection::fillCaloRings( const xAOD::Electron *el ){ + return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE ); +} + + +//! ============================================================================================================ + + +double TrigEgammaEventSelection::get_el_sigd0(const xAOD::Electron *el){ + float vard0 = el->trackParticle()->definingParametersCovMatrix()(0,0); // Cov matrix in vector form + if(vard0>0.0) + return sqrt(vard0); // variance of d0 + return 0.0; +} + +double TrigEgammaEventSelection::get_el_d0(const xAOD::Electron *el){ + return el->trackParticle()->d0(); +} + + +double TrigEgammaEventSelection::get_el_eProbabilityHT(const xAOD::Electron *el){ + float TRT_PID = 0; + el->trackParticle()->summaryValue(TRT_PID, xAOD::eProbabilityHT); + return TRT_PID; +} + + +double TrigEgammaEventSelection::get_el_transformed_eProbabilityHT(const xAOD::Electron *el){ + double TRT_PID = get_el_eProbabilityHT(el); + double epsilon = 1e-30; + if(TRT_PID >= 1.0) TRT_PID = 1.0 - 1.e-15; + else if(TRT_PID <= epsilon) TRT_PID = epsilon; + double tau = 15.0; + TRT_PID = -(1/tau) * log( (1.0/TRT_PID) - 1.0); + return TRT_PID; +} + + +double TrigEgammaEventSelection::get_el_d0significance(const xAOD::Electron *el){ + double d0 = get_el_d0(el); + double sigd0 = get_el_sigd0(el); + return (sigd0 != 0) ? fabs(d0/sigd0) : 0; +} + +double TrigEgammaEventSelection::get_el_deltaPhiRescaled2(const xAOD::Electron *el){ + float deltaPhiRescaled2 = 0; + el->trackCaloMatchValue(deltaPhiRescaled2, xAOD::EgammaParameters::deltaPhiRescaled2); + return deltaPhiRescaled2; +} + + +double TrigEgammaEventSelection::get_el_deltaEta1(const xAOD::Electron *el){ + float deltaEta1 = 0; + el->trackCaloMatchValue(deltaEta1, xAOD::EgammaParameters::deltaEta1); + return deltaEta1; +} + + +double TrigEgammaEventSelection::get_el_DeltaPOverP(const xAOD::Electron *el){ + unsigned int index; + if(el->trackParticle()->indexOfParameterAtPosition(index,xAOD::LastMeasurement)){ + double LMPX = el->trackParticle()->parameterPX(index); + double LMPY = el->trackParticle()->parameterPY(index); + double LMPZ = el->trackParticle()->parameterPZ(index); + double refittedTrack_LMP = sqrt(LMPX*LMPX + LMPY*LMPY + LMPZ*LMPZ); + double refittedTrack_LMqOverP = el->trackParticle()->charge() / refittedTrack_LMP; + double unrefittedTrack_qOverP = el->trackParticle()->qOverP(); + return 1 - (unrefittedTrack_qOverP / refittedTrack_LMqOverP); + } + else + return 0.0; +} + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx index 0c030885532a..b071f53faa53 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx @@ -27,13 +27,25 @@ StatusCode TrigEgammaNavAnalysisTool::childBook(){ m_dir=plot()->getBasePath(); std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); - for(const auto trigName:m_trigInputList){ - if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) { + for(const auto trigName:m_trigInputList){ + if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ if(plot()->getTrigInfoMap().count(trigName) != 0) ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName); - else + else { m_trigList.push_back(trigName); + setTrigInfo(trigName); + } } + // Special code to attach trigger without of the menu + else if(getEmulation() && m_forceTrigAttachment){// + ATH_MSG_INFO("Trigger doesn't exist in menu. Attach to emulate."); + if(plot()->getTrigInfoMap().count(trigName) == 0){ + m_trigList.push_back(trigName); + setTrigEmulation(); + setTrigInfo(trigName); + } + } + } // Container level kinematic histograms @@ -57,8 +69,6 @@ StatusCode TrigEgammaNavAnalysisTool::childBook(){ setLabels(plot()->hist1(m_anatype+"_trigger_counts"),m_trigList); } - for (const auto trigger: m_trigList) - setTrigInfo(trigger); plot()->setEmulation(getEmulation()); if(plot()->book(getTrigInfoMap()).isFailure()) { @@ -79,6 +89,21 @@ StatusCode TrigEgammaNavAnalysisTool::childExecute(){ ATH_MSG_DEBUG("Fails EventWise selection"); return StatusCode::SUCCESS; //return nicely } + // Check for Rnn container in SG + if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){ + ATH_MSG_DEBUG("Rnn container in SG "); + setSGContainsRnn(true); + } + if(m_storeGate->contains<xAOD::TrigPhotonContainer>("HLT_xAOD__TrigPhotonContainer_L2PhotonFex")){ + ATH_MSG_DEBUG("TrigPhotonContainer in SG "); + setSGContainsTrigPhoton(true); + } + ATH_MSG_DEBUG("Rnn container in SG " << getSGContainsRnn()); + ATH_MSG_DEBUG("TrigPhotonContainer in SG " << getSGContainsTrigPhoton()); + for( const auto& tool : m_tools) { + tool->setSGContainsRnn(getSGContainsRnn()); + tool->setSGContainsTrigPhoton(getSGContainsTrigPhoton()); + } // Check HLTResult if(tdt()->ExperimentalAndExpertMethods()->isHLTTruncated()){ diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx index 8ae71d4a1429..9a2c3d3cae20 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx @@ -13,7 +13,6 @@ * Description: * Inherits from TrigEgammaAnalysisBaseTool. **********************************************************************/ -#include "egammaMVACalibAnalysis/IegammaMVATool.h" #include "TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h" #include "TrigConfxAOD/xAODConfigTool.h" #include "PATCore/AcceptData.h" @@ -138,6 +137,7 @@ bool TrigEgammaNavBaseTool::EventWiseSelection( ){ //Calculate number of vertex TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex(); + return true; } @@ -239,15 +239,20 @@ StatusCode TrigEgammaNavBaseTool::executeElectronNavigation( std::string trigIte xAOD::Electron *el = new xAOD::Electron(*eg); el->auxdecor<bool>(decor)=static_cast<bool>(true); - - if (match()->match(el, trigItem, te)){ - std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te); - m_objTEList.push_back(pair); - } - else { - std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,nullptr); - m_objTEList.push_back(pair); + bool isEmulation = getTrigInfo(trigItem).trigIsEmulation; + if(isEmulation && getEmulation()){ + emulation()->match(el,te); + std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te); + m_objTEList.push_back(pair); + }else{ + if (match()->match(el, trigItem, te)){ + std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te); + m_objTEList.push_back(pair); + }else { + std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,nullptr); + m_objTEList.push_back(pair); + } } } @@ -279,13 +284,19 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem, } xAOD::Photon *ph = new xAOD::Photon(*eg); ph->auxdecor<bool>(decor)=static_cast<bool>(true); - if ( match()->match(ph, trigItem, te)){ - std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te); - m_objTEList.push_back(pair); - } - else { - std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,nullptr); - m_objTEList.push_back(pair); + bool isEmulation = getTrigInfo(trigItem).trigIsEmulation; + if(isEmulation && getEmulation()){ + emulation()->match(ph,te); + std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te); + m_objTEList.push_back(pair); + }else{ + if (match()->match(ph, trigItem, te)){ + std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te); + m_objTEList.push_back(pair); + }else { + std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,nullptr); + m_objTEList.push_back(pair); + } } } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx deleted file mode 100755 index a15b46ae1485..000000000000 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx +++ /dev/null @@ -1,1138 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - - -#include "TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h" -using namespace std; - -TrigEgammaNavNtuple::TrigEgammaNavNtuple( const std::string& myname ): TrigEgammaNavBaseTool(myname) -{ - declareProperty("Analysis", m_anatype="NavNtuple" ); - declareProperty("doOfflineDump", m_doOfflineDump=false ); - declareProperty("DoSupportTrigger", m_doSupport=true ); - declareProperty("ForceMCMatch", m_forceMCMatch=true ); - declareProperty("OfflineMinEtThreshold", m_minEt=-1 ); - - ///Set base tool configuration - m_forcePidSelection=false; - - m_el_ringsE=nullptr; - m_trig_L1_thrNames=nullptr; - m_trig_L2_calo_energySample=nullptr; - m_trig_L2_calo_rings=nullptr; - m_trig_L2_el_trackAlgID=nullptr; - m_trig_L2_el_pt=nullptr; - m_trig_L2_el_eta=nullptr; - m_trig_L2_el_caloEta=nullptr; - m_trig_L2_el_phi=nullptr; - m_trig_L2_el_charge=nullptr; - m_trig_L2_el_nTRTHits=nullptr; - m_trig_L2_el_nTRTHiThresholdHits=nullptr; - m_trig_L2_el_etOverPt=nullptr; - m_trig_L2_el_trkClusDeta=nullptr; - m_trig_L2_el_trkClusDphi=nullptr; - m_trig_EF_calo_et=nullptr; - m_trig_EF_calo_eta=nullptr; - -} - - -StatusCode TrigEgammaNavNtuple::childInitialize(){ - - return StatusCode::SUCCESS; -} - -StatusCode TrigEgammaNavNtuple::childBook(){ - - ATH_MSG_DEBUG("Now configuring chains for analysis"); - //Set the base directory from the plot() - m_dir=plot()->getBasePath(); - std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); - - TrigEgammaAnalysisBaseTool::write_trigger_list(chains); - - for(const auto trigName:m_trigInputList){ - if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) { - if(plot()->getTrigInfoMap().count(trigName) != 0) - ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName); - else - m_trigList.push_back(trigName); - } - } - - - // Container level kinematic histograms - ATH_MSG_DEBUG("cd in: " << m_dir <<"/Expert/Event"); - addDirectory(m_dir+"/Expert/Event"); - const int nTrigger = (int) m_trigList.size(); - - std::string histname=m_anatype+"_electrons"; - addHistogram(new TH1F(histname.c_str(), "Offline Electrons; ; N_{electrons}", 6, 1., 6)); - std::vector<std::string> el_labels; - el_labels.push_back("loose"); - el_labels.push_back("medium"); - el_labels.push_back("tight"); - el_labels.push_back("lhloose"); - el_labels.push_back("lhmedium"); - el_labels.push_back("lhtight"); - setLabels(hist1(histname),el_labels); - - histname=m_anatype+"_trigger_counts"; - if(nTrigger>0) { - addHistogram(new TH1F(histname.c_str(), "Trigger Counts; Trigger ; Count", nTrigger, 1, nTrigger)); - setLabels(plot()->hist1(m_anatype+"_trigger_counts"),m_trigList); - } - - ///Only offline egamma ntuple - if(m_doOfflineDump){ - ATH_MSG_DEBUG("Now configuting only the egamma analysis"); - addDirectory(m_dir+"/Expert/Offline"); - TTree *t_el = new TTree("electron", "tree of egamma and monte carlo information"); - TTree *t_ph = new TTree("photons", "tree of egamma and monte carlo information"); - bookEventBranches( t_ph ); - //bookPhotonBranches( t_ph ); - bookMonteCarloBranches( t_ph ); - bookEventBranches( t_el ); - bookElectronBranches( t_el ); - bookMonteCarloBranches( t_el ); - addTree( t_el, m_dir+"/Expert/Offline" ); - addTree( t_ph, m_dir+"/Expert/Offline" ); - }else if(m_doSupport){// all support trigger in one - addDirectory(m_dir+"/Expert/support"); - TTree *t = new TTree( "trigger", "support trigger"); - bookEventBranches( t ); - bookElectronBranches( t ); - //bookPhotonBranches( t ); - bookTriggerBranches( t ); - bookMonteCarloBranches( t ); - for(auto& trigItem : m_trigList) - setTrigInfo(trigItem); - addTree(t, m_dir+"/Expert/support"); - }else{// each trigger - for (int i = 0; i < (int) m_trigList.size(); i++) { - std::string trigItem = m_trigList[i]; - addDirectory(m_dir+"/Expert/"+trigItem); - - TTree *t = new TTree( "trigger", "tree of trigger, egamma and monte carlo information"); - bookEventBranches( t ); - bookElectronBranches( t ); - //bookPhotonBranches( t ); - bookTriggerBranches( t ); - bookMonteCarloBranches( t ); - ATH_MSG_DEBUG("Already to attach the tree: " << trigItem); - setTrigInfo(trigItem); - addTree(t, m_dir+"/Expert/"+trigItem); - } - } - - // alloc memory to vector branchs - alloc_space(); - - return StatusCode::SUCCESS; -} - -StatusCode TrigEgammaNavNtuple::childExecute(){ - - m_eventCounter++; - - m_dir=plot()->getBasePath(); - - cd(m_dir+"/Expert/Event"); - if( !EventWiseSelection() ) { - ATH_MSG_DEBUG("Unable to retrieve offline containers"); - return StatusCode::FAILURE; - } - - cd(m_dir+"/Expert"); - - - /// Egamma ntuple mode - if(m_doOfflineDump){ - cd(m_dir+"/Expert/Offline"); - if(!executeElectronDump()) return StatusCode::FAILURE; - if(!executePhotonDump()) return StatusCode::FAILURE; - }else if(m_doSupport){ - if(!executeTrigSupportDump()) return StatusCode::FAILURE; - }else{ - if(!executeTrigItemDump()) return StatusCode::FAILURE; - } - - return StatusCode::SUCCESS; -} - - -StatusCode TrigEgammaNavNtuple::childFinalize(){ - //release_space(); - return StatusCode::SUCCESS; -} - - -bool TrigEgammaNavNtuple::executeElectronDump(){ - - ATH_MSG_DEBUG("TrigEgammaNavNtuple::executeEgammaDump()"); - - const xAOD::ElectronContainer* offElectrons = 0; - if ( (m_storeGate->retrieve(offElectrons,m_offElContKey)).isFailure() ){ - ATH_MSG_ERROR("Failed to retrieve offline Electrons "); - return false; - } - - TTree *t = tree( "electron" , m_dir+"/Expert/Offline" ); - if(!t){ - ATH_MSG_ERROR("Can no get the ttree pointer into the store."); - return false; - } - - linkEventBranches(t); - linkElectronBranches(t); - linkMonteCarloBranches(t); - - for (const auto &eg : *offElectrons){ - clear(); - if(!eg->trackParticle()){ - ATH_MSG_DEBUG("No track Particle"); - continue; - } - if(!eg->caloCluster()){ - ATH_MSG_DEBUG("No caloCluster"); - continue; - } - - if(m_rmCrack){///default is true - if ( (fabs(eg->eta())>1.37 && fabs(eg->eta())<1.52) || fabs(eg->eta())>2.47 ) continue; - } - - if (m_forceProbeIsolation) {///default is false - if (!isIsolated(eg, "Loose")) continue;///default is Loose - } - - if(m_forceMCEnhancedBias){///default is false - const xAOD::TruthParticle *mc=nullptr; - if( pdgid(eg,m_truthContainer,mc) != MonteCarlo::PDGID::EnhancedBias) continue; - } - - const xAOD::Electron* el =static_cast<const xAOD::Electron*> (el); - - fillEvent(); - fillElectron( eg ); - - if(!fillMonteCarlo( eg ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - } - - ATH_MSG_DEBUG("Record information into the ttree."); - t->Fill();// save information - } - - return true; -} - -bool TrigEgammaNavNtuple::executePhotonDump(){ - return true; -} - - -bool TrigEgammaNavNtuple::executeTrigItemDump(){ - - - for(unsigned int ilist = 0; ilist != m_trigList.size(); ilist++) { - - std::string trigItem = m_trigList.at(ilist); - const TrigInfo info = getTrigInfo(trigItem); - if ( executeNavigation(info).isFailure() ){ - ATH_MSG_DEBUG("executeNavigation failure! continue..."); - return false; - } - - TTree *t = tree( "trigger", m_dir+"/Expert/"+trigItem); - linkEventBranches(t); - linkElectronBranches(t); - //linkPhotonBranches(t); - linkTriggerBranches(t); - linkMonteCarloBranches(t); - ATH_MSG_DEBUG("ObjTEList size is: " << m_objTEList.size()); - for(unsigned int i = 0; i != m_objTEList.size(); ++i){ - - const xAOD::Electron* el =static_cast<const xAOD::Electron*> (m_objTEList[i].first); - //const xAOD::Photon* ph =static_cast<const xAOD::Photon*> (m_objTEList[i].first); - const HLT::TriggerElement *feat = m_objTEList[i].second; - if(feat == nullptr){ - ATH_MSG_WARNING("TriggerElement is nullptr"); - continue; - } - - clear(); - fillEvent(); - fillElectron( el ); - //fillPhoton( ph ); - - if(!fillMonteCarlo( el ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - } - - ///Start trigger analisys... - const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat); - if(emTauRoI){ - fillEmTauRoI( emTauRoI ); - }else{ - ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement.."); - } - - const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); - if(emCluster){ - - if(!fillTrigEMCluster( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree."); - } - - //const xAOD::TrigRNNOutput *rnnOutput=getFeature<xAOD::TrigRNNOutput>(feat); - //if(rnnOutput) m_trig_L2_calo_rnnOutput = rnnOutput->rnnDecision().at(0); - - //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){ - if(!fillTrigCaloRings( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree."); - } - - }///cluster protection - - - const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat); - // Level 2 ID+Calo - if(trigElCont){ - for(const auto& trigEl : *trigElCont){ - if(!fillTrigElectron(trigEl)) { - ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree."); - } - }// loop over all trigElectrons for this feat - } - - const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat); - if(caloCont){ - for(const auto& cl : *caloCont){ - if(!fillCaloCluster(cl)){ - ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree."); - } - }// loop over calo cluster - } - - asg::AcceptData acceptData = setAccept(feat,info); - m_trig_L1_accept = acceptData.getCutResult("L1Calo"); - m_trig_L2_calo_accept = acceptData.getCutResult("L2Calo"); - m_trig_L2_el_accept = acceptData.getCutResult("L2"); - m_trig_EF_calo_accept = acceptData.getCutResult("EFCalo"); - m_trig_EF_el_accept = acceptData.getCutResult("HLT"); - - ATH_MSG_DEBUG("L1Calo: " << int(m_trig_L1_accept)); - ATH_MSG_DEBUG("L2Calo: " << int(m_trig_L2_calo_accept)); - ATH_MSG_DEBUG("L2 : " << int(m_trig_L2_el_accept)); - ATH_MSG_DEBUG("EFCalo: " << int(m_trig_EF_calo_accept)); - ATH_MSG_DEBUG("HLT : " << int(m_trig_EF_el_accept)); - - ATH_MSG_DEBUG("Record information into the ttree."); - t->Fill();// save information - }// loop - } // End loop over trigger - return true; -} - - -bool TrigEgammaNavNtuple::executeTrigSupportDump(){ - - double GeV=1000.; - // Just do this to retrieve all offline electrons, dummy trigItem! - const TrigInfo info = getTrigInfo(m_trigList[0]); - if ( executeNavigation(info).isFailure() ){ - ATH_MSG_DEBUG("executeNavigation failure! continue..."); - return false; - }//executeNavigation to collect electron - - std::vector<const HLT::TriggerElement *> vec_feat; - - - cd(m_dir+"/Expert/support"); - TTree *t = tree( "trigger", m_dir+"/Expert/support"); - linkEventBranches(t); - linkElectronBranches(t); - linkTriggerBranches(t); - linkMonteCarloBranches(t); - - // Loop over all good offline objects - for(const auto& eg : m_objTEList){ - - // Get the good electron - const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg.first); - // Force Et cut - if(m_minEt > 0.0){ - if( !( getEt(el) > (m_minEt)*GeV) ) continue; - } - // Clear the vector - vec_feat.clear(); - // Loop over support triggers - for(auto& trigItem : m_trigList){ - const HLT::TriggerElement *feat; - // Trigger match using Matching tool - match()->match(el, trigItem, feat); - if(feat){// If has a match! - for(unsigned i=0; i < vec_feat.size(); ++i){ - if(getFeature<xAOD::EmTauRoI>(vec_feat[i])->roiWord() == getFeature<xAOD::EmTauRoI>(feat)->roiWord()){ - if(count_HLT_objects(feat) > count_HLT_objects(vec_feat[i])){ - vec_feat.erase(vec_feat.begin() + i); // Erase the trigger element lowest than the new feature - vec_feat.push_back(feat); // attach the new trigger element - break; - } - }// The same region in L1Calo trigger - } - if(vec_feat.empty()) vec_feat.push_back(feat); - } - }// Loop over support trigger - - ATH_MSG_DEBUG("Attach " << vec_feat.size() << " features "); - for(auto& feat : vec_feat){ - - clear(); - fillEvent(); - fillElectron( el ); - - if(!fillMonteCarlo( el ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - if(m_forceMCMatch) continue; - } - - ///Start trigger analisys... - const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat); - if(emTauRoI){ - fillEmTauRoI( emTauRoI ); - }else{ - ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement.."); - } - - const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); - if(emCluster){ - //ATH_MSG_INFO("AKI: Et = " << emCluster->et()*1e-3); - //if(emCluster->et()*1e-3 < 20){ - // continue; - //} - if(!fillTrigEMCluster( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree."); - } - - //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){ - if(!fillTrigCaloRings( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree."); - } - }///cluster protection - - - const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat); - // Level 2 ID+Calo - if(trigElCont){ - for(const auto& trigEl : *trigElCont){ - if(!fillTrigElectron(trigEl)) { - ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree."); - } - }// loop over all trigElectrons for this feat - } - - const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat); - if(caloCont){ - for(const auto& cl : *caloCont){ - if(!fillCaloCluster(cl)){ - ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree."); - } - }// loop over calo cluster - } - - ATH_MSG_DEBUG("record trigger information into the file."); - t->Fill(); - }//loop over trigger objects - - }// Loop over electrons - return true; -} - - - - - - - -bool TrigEgammaNavNtuple::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){ - - m_trig_L1_eta = emTauRoI->eta(); - m_trig_L1_phi = emTauRoI->phi(); - m_trig_L1_emClus = emTauRoI->emClus(); - m_trig_L1_tauClus = emTauRoI->tauClus(); - m_trig_L1_emIsol = emTauRoI->emIsol(); - m_trig_L1_hadIsol = emTauRoI->hadIsol(); - for(unsigned i=0; i < emTauRoI->thrNames().size();++i) m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i)); - return true; -} - -bool TrigEgammaNavNtuple::fillCaloCluster( const xAOD::CaloCluster *cluster){ - - m_trig_EF_calo_et->push_back(cluster->et()); - m_trig_EF_calo_eta->push_back(cluster->eta()); - return true; -} - -bool TrigEgammaNavNtuple::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){ - - m_trig_L2_calo_et = emCluster->et(); - m_trig_L2_calo_eta = emCluster->eta(); - m_trig_L2_calo_phi = emCluster->phi(); - m_trig_L2_calo_e237 = emCluster->e237(); - m_trig_L2_calo_e277 = emCluster->e277(); - m_trig_L2_calo_fracs1 = emCluster->fracs1(); - m_trig_L2_calo_weta2 = emCluster->weta2(); - m_trig_L2_calo_ehad1 = emCluster->ehad1(); - m_trig_L2_calo_emaxs1 = emCluster->emaxs1(); - m_trig_L2_calo_e2tsts1 = emCluster->e2tsts1(); - m_trig_L2_calo_wstot = emCluster->wstot(); - for(unsigned i=0; i<emCluster->energySample().size(); ++i){ - m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i)); - } - - return true; -} - - -bool TrigEgammaNavNtuple::fillTrigElectron( const xAOD::TrigElectron *trigEl ){ - - const xAOD::TrackParticle* trkIter = trigEl->trackParticle(); - if (trkIter==nullptr) return false; // disconsider candidates without track - int algoId = 0; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] ) algoId=5; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] ) algoId=6; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] ) algoId=7; - - m_trig_L2_el_trackAlgID ->push_back(algoId); - m_trig_L2_el_caloEta ->push_back(trigEl->caloEta()); - m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi()); - m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta()); - m_trig_L2_el_pt ->push_back(trigEl->pt()); - m_trig_L2_el_phi ->push_back(trigEl->phi()); - m_trig_L2_el_eta ->push_back(trigEl->eta()); - m_trig_L2_el_etOverPt ->push_back(trigEl->etOverPt()); - m_trig_L2_el_nTRTHits ->push_back(trigEl->nTRTHits()); - m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits()); - m_trig_L2_el_charge ->push_back(trigEl->charge()); - return true; -} - - - -bool TrigEgammaNavNtuple::fillEvent(){ - ///Event information - m_runNumber = m_eventInfo->runNumber(); - m_eventNumber = m_eventInfo->eventNumber(); - m_avgmu=getAvgMu(); - return true; -} - -bool TrigEgammaNavNtuple::fillElectron( const xAOD::Electron *el ){ - - ///Cluster information - m_el_et = el->pt(); - m_el_eta = el->eta(); - m_el_phi = el->phi(); - el->showerShapeValue( m_el_ethad1 , xAOD::EgammaParameters::ShowerShapeType::ethad1 ); - el->showerShapeValue( m_el_ehad1 , xAOD::EgammaParameters::ShowerShapeType::ehad1 ); - el->showerShapeValue( m_el_f1 , xAOD::EgammaParameters::ShowerShapeType::f1 ); - el->showerShapeValue( m_el_f3 , xAOD::EgammaParameters::ShowerShapeType::f3 ); - el->showerShapeValue( m_el_f1core , xAOD::EgammaParameters::ShowerShapeType::f1core ); - el->showerShapeValue( m_el_f3core , xAOD::EgammaParameters::ShowerShapeType::f3core ); - el->showerShapeValue( m_el_weta2 , xAOD::EgammaParameters::ShowerShapeType::weta2 ); - el->showerShapeValue( m_el_wtots1 , xAOD::EgammaParameters::ShowerShapeType::wtots1 ); - el->showerShapeValue( m_el_fracs1 , xAOD::EgammaParameters::ShowerShapeType::fracs1 ); - el->showerShapeValue( m_el_Reta , xAOD::EgammaParameters::ShowerShapeType::Reta ); - el->showerShapeValue( m_el_Rphi , xAOD::EgammaParameters::ShowerShapeType::Rphi ); - el->showerShapeValue( m_el_Eratio , xAOD::EgammaParameters::ShowerShapeType::Eratio ); - el->showerShapeValue( m_el_Rhad , xAOD::EgammaParameters::ShowerShapeType::Rhad ); - el->showerShapeValue( m_el_Rhad1 , xAOD::EgammaParameters::ShowerShapeType::Rhad1 ); - - ///Combined track/Cluter information - el->trackCaloMatchValue( m_el_deta1 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta1 ); - el->trackCaloMatchValue( m_el_deta2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2 ); - el->trackCaloMatchValue( m_el_dphi2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2 ); - el->trackCaloMatchValue( m_el_dphiresc , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 ); - el->trackCaloMatchValue( m_el_dphiresc2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled2 ); - - - ///Track particle information - const xAOD::TrackParticle *track = el->trackParticle(); - if(track){ - m_el_pt = track->pt(); - m_el_d0 = fabsf(track->d0()); - m_el_charge = el->charge(); - - track->summaryValue( m_el_eprobht , xAOD::SummaryType::eProbabilityHT ); - track->summaryValue( m_el_nblayerhits , xAOD::SummaryType::numberOfInnermostPixelLayerHits ); - track->summaryValue( m_el_nblayerolhits , xAOD::SummaryType::numberOfInnermostPixelLayerOutliers ); - track->summaryValue( m_el_npixhits , xAOD::SummaryType::numberOfPixelHits ); - track->summaryValue( m_el_npixolhits , xAOD::SummaryType::numberOfPixelOutliers ); - track->summaryValue( m_el_nscthits , xAOD::SummaryType::numberOfSCTHits ); - track->summaryValue( m_el_nsctolhits , xAOD::SummaryType::numberOfSCTOutliers ); - track->summaryValue( m_el_ntrthightreshits , xAOD::SummaryType::numberOfTRTHighThresholdHits ); - track->summaryValue( m_el_ntrthits , xAOD::SummaryType::numberOfTRTHits); - track->summaryValue( m_el_ntrthighthresolhits, xAOD::SummaryType::numberOfTRTHighThresholdOutliers ); - track->summaryValue( m_el_ntrtolhits , xAOD::SummaryType::numberOfTRTOutliers ); - track->summaryValue( m_el_ntrtxenonhits , xAOD::SummaryType::numberOfTRTXenonHits ); - //track->summaryValue( m_el_expectblayerhit , xAOD::SummaryType::expectInnermostPixelLayerHit ); - track->summaryValue( m_el_npixdeadsensors , xAOD::SummaryType::numberOfPixelDeadSensors); - track->summaryValue( m_el_nsctdeadsensors , xAOD::SummaryType::numberOfSCTDeadSensors); - - m_el_nsideadsensors = m_el_npixdeadsensors + m_el_nsctdeadsensors; - m_el_nsihits = m_el_npixhits + m_el_nscthits; - } - - //m_el_loose = el->passSelection("Loose"); - //m_el_medium = el->passSelection("Medium"); - //m_el_tight = el->passSelection("Tight"); - //m_el_lhLoose = el->passSelection("LHLoose"); - //m_el_lhMedium = el->passSelection("LHMedium"); - //m_el_lhTight = el->passSelection("LHTight"); - //m_el_rgLoose = el->passSelection("RGLoose"); - //m_el_rgMedium = el->passSelection("RGMedium"); - //m_el_rgTight = el->passSelection("RGTight"); - //m_el_multiLepton = el->passSelection("MultiLepton"); - m_el_loose = ApplyElectronPid(el, "Loose"); - m_el_medium = ApplyElectronPid(el, "Medium"); - m_el_tight = ApplyElectronPid(el, "Tight"); - m_el_lhLoose = ApplyElectronPid(el, "LHLoose"); - m_el_lhMedium = ApplyElectronPid(el, "LHMedium"); - m_el_lhTight = ApplyElectronPid(el, "LHTight"); - //m_el_rgLoose = ApplyElectronPid(el, "RGLoose"); - //m_el_rgMedium = ApplyElectronPid(el, "RGMedium"); - //m_el_rgTight = ApplyElectronPid(el, "RGTight"); - - m_calo_et = getCluster_et( el ); - m_calo_eta = getCluster_eta( el ); - m_calo_phi = getCluster_phi( el ); - ///Extra information about pileup - m_el_nGoodVtx = getNGoodVertex(); - m_el_nPileupPrimaryVtx = getNPVtx(); - - - if(!fillCaloRings( el )){ - ATH_MSG_WARNING("Could not attach the calorRings information."); - } - - return true; -} - - -/*bool TrigEgammaNavNtuple::fillPhoton( const xAOD::Photon *ph ){ - return true; -}*/ - -bool TrigEgammaNavNtuple::fillMonteCarlo(const xAOD::Egamma *eg){ - - if(m_truthContainer){ - ATH_MSG_DEBUG("TruthParticle container size is: " << m_truthContainer->size()); - const xAOD::TruthParticle *mc=nullptr; - MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc); - if(mc){ - m_mc_hasMC = true; - m_mc_pt = mc->pt(); - m_mc_eta = mc->eta(); - m_mc_phi = mc->phi(); - m_mc_isTop = mc->isTop(); - m_mc_isQuark = mc->isQuark(); - m_mc_isParton = mc->isParton(); - m_mc_isMeson = mc->isMeson(); - m_mc_isTau = mc->isTau(); - m_mc_isMuon = mc->isMuon(); - m_mc_isPhoton = mc->isPhoton(); - m_mc_isElectron = mc->isElectron(); - if(pdg == MonteCarlo::PDGID::ZMother) m_mc_hasZMother = true; - if(pdg == MonteCarlo::PDGID::WMother) m_mc_hasWMother = true; - return true; - }//has match - }//has truth container - return false; -} - - -bool TrigEgammaNavNtuple::fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ){ - return TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings); -} - - -bool TrigEgammaNavNtuple::fillCaloRings( const xAOD::Electron *el ){ - return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE ); -} - -/* - * book, link, clear, alloc and release method divide in: - * trigger, Egamma and MonteCarlo data base. - */ - -template <class T> -void TrigEgammaNavNtuple::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){ - - std::string bname = branch_name; - if (fChain->GetAlias(bname.c_str())) - bname = std::string(fChain->GetAlias(bname.c_str())); - - if (!fChain->FindBranch(bname.c_str()) && message) { - ATH_MSG_WARNING("unknown branch " << bname); - return; - } - fChain->SetBranchStatus(bname.c_str(), 1.); - fChain->SetBranchAddress(bname.c_str(), param); -} - -void TrigEgammaNavNtuple::bookEventBranches(TTree *t){ - - t->Branch("RunNumber", &m_runNumber); - t->Branch("EventNumber", &m_eventNumber); - t->Branch("avgmu", &m_avgmu); -} - -void TrigEgammaNavNtuple::bookTriggerBranches(TTree *t){ - - // Level L1 cluster - t->Branch( "trig_L1_eta", &m_trig_L1_eta); - t->Branch( "trig_L1_phi", &m_trig_L1_phi); - t->Branch( "trig_L1_emClus", &m_trig_L1_emClus); - t->Branch( "trig_L1_tauClus", &m_trig_L1_tauClus); - t->Branch( "trig_L1_emIsol", &m_trig_L1_emIsol); - t->Branch( "trig_L1_hadIsol", &m_trig_L1_hadIsol); - t->Branch( "trig_L1_thrNames", &m_trig_L1_thrNames); - t->Branch( "trig_L1_accept", &m_trig_L1_accept); - t->Branch( "trig_L2_calo_et", &m_trig_L2_calo_et); - t->Branch( "trig_L2_calo_eta", &m_trig_L2_calo_eta); - t->Branch( "trig_L2_calo_phi", &m_trig_L2_calo_phi); - t->Branch( "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); - t->Branch( "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); - t->Branch( "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); - t->Branch( "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); - t->Branch( "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); - t->Branch( "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); - t->Branch( "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); - t->Branch( "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); - t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); - t->Branch( "trig_L2_calo_rings", &m_trig_L2_calo_rings ); - t->Branch( "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput ); - t->Branch( "trig_L2_calo_accept", &m_trig_L2_calo_accept); - t->Branch( "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); - t->Branch( "trig_L2_el_pt" , &m_trig_L2_el_pt ); - t->Branch( "trig_L2_el_eta", &m_trig_L2_el_eta); - t->Branch( "trig_L2_el_phi", &m_trig_L2_el_phi ); - t->Branch( "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); - t->Branch( "trig_L2_el_charge", &m_trig_L2_el_charge); - t->Branch( "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); - t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); - t->Branch( "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); - t->Branch( "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); - t->Branch( "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); - t->Branch( "trig_L2_el_accept", &m_trig_L2_el_accept ); - t->Branch( "trig_EF_calo_accept", &m_trig_EF_calo_accept); - t->Branch( "trig_EF_calo_et", &m_trig_EF_calo_et); - t->Branch( "trig_EF_calo_eta", &m_trig_EF_calo_eta); - t->Branch( "trig_EF_el_accept", &m_trig_EF_el_accept); -} - -void TrigEgammaNavNtuple::bookElectronBranches(TTree *t){ - - t->Branch("el_et", &m_el_et); - t->Branch("el_pt", &m_el_pt); - t->Branch("el_eta", &m_el_eta); - t->Branch("el_phi", &m_el_phi); - t->Branch("el_ethad1", &m_el_ethad1); - t->Branch("el_ehad1", &m_el_ehad1); - t->Branch("el_f1", &m_el_f1); - t->Branch("el_f3", &m_el_f3); - t->Branch("el_f1core", &m_el_f1core); - t->Branch("el_f3core", &m_el_f3core); - t->Branch("el_weta2", &m_el_weta2); - t->Branch("el_d0", &m_el_d0); - t->Branch("el_wtots1", &m_el_wtots1); - t->Branch("el_fracs1", &m_el_fracs1); - t->Branch("el_Reta", &m_el_Reta); - t->Branch("el_Rphi", &m_el_Rphi); - t->Branch("el_Eratio", &m_el_Eratio); - t->Branch("el_Rhad", &m_el_Rhad); - t->Branch("el_Rhad1", &m_el_Rhad1); - t->Branch("el_deta1", &m_el_deta1); - t->Branch("el_deta2", &m_el_deta2); - t->Branch("el_dphi2", &m_el_dphi2); - t->Branch("el_dphiresc", &m_el_dphiresc); - t->Branch("el_dphiresc2", &m_el_dphiresc2); - t->Branch("el_eprobht", &m_el_eprobht); - t->Branch("el_charge", &m_el_charge); - t->Branch("el_nblayerhits", &m_el_nblayerhits); - t->Branch("el_nblayerolhits", &m_el_nblayerolhits); - t->Branch("el_npixhits", &m_el_npixhits); - t->Branch("el_npixolhits", &m_el_npixolhits); - t->Branch("el_nscthits", &m_el_nscthits); - t->Branch("el_nsctolhits", &m_el_nsctolhits); - t->Branch("el_ntrthightreshits", &m_el_ntrthightreshits); - t->Branch("el_ntrthits", &m_el_ntrthits); - t->Branch("el_ntrthighthresolhits", &m_el_ntrthighthresolhits); - t->Branch("el_ntrtolhits", &m_el_ntrtolhits); - t->Branch("el_ntrtxenonhits", &m_el_ntrtxenonhits); - t->Branch("el_expectblayerhit", &m_el_expectblayerhit); - t->Branch("el_nsihits", &m_el_nsihits ); - t->Branch("el_nsideadsensors", &m_el_nsideadsensors ); - t->Branch("el_npixdeadsensors", &m_el_npixdeadsensors ); - t->Branch("el_nsctdeadsensors", &m_el_nsctdeadsensors ); - t->Branch("el_ringsE", &m_el_ringsE ); - t->Branch("el_loose", &m_el_loose ); - t->Branch("el_medium", &m_el_medium ); - t->Branch("el_tight", &m_el_tight ); - t->Branch("el_lhLoose", &m_el_lhLoose ); - t->Branch("el_lhMedium", &m_el_lhMedium ); - t->Branch("el_lhTight", &m_el_lhTight ); - t->Branch("el_rgLoose", &m_el_rgLoose ); - t->Branch("el_rgMedium", &m_el_rgMedium ); - t->Branch("el_rgTight", &m_el_rgTight ); - t->Branch("el_multiLepton", &m_el_multiLepton); - t->Branch("el_nGoodVtx", &m_el_nGoodVtx); - t->Branch("el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); - t->Branch("calo_et", &m_calo_et); - t->Branch("calo_eta", &m_calo_eta); - t->Branch("calo_phi", &m_calo_phi); - -} - - -/*void TrigEgammaNavNtuple::bookPhotonBranches(TTree *t){ -} */ - -void TrigEgammaNavNtuple::bookMonteCarloBranches(TTree *t){ - // Monte Carlo - t->Branch("mc_hasMC", &m_mc_hasMC); - t->Branch("mc_pt", &m_mc_pt); - t->Branch("mc_eta", &m_mc_eta); - t->Branch("mc_phi", &m_mc_phi); - t->Branch("mc_isTop", &m_mc_isTop); - t->Branch("mc_isParton", &m_mc_isParton); - t->Branch("mc_isMeson", &m_mc_isMeson); - t->Branch("mc_isTau", &m_mc_isTau); - t->Branch("mc_isMuon", &m_mc_isMuon); - t->Branch("mc_isPhoton", &m_mc_isPhoton); - t->Branch("mc_isElectron", &m_mc_isElectron); - t->Branch("mc_hasZMother", &m_mc_hasZMother); - t->Branch("mc_hasWMother", &m_mc_hasWMother); -} - -void TrigEgammaNavNtuple::linkEventBranches(TTree *t){ - - InitBranch( t, "RunNumber", &m_runNumber); - InitBranch( t, "EventNumber", &m_eventNumber); - InitBranch( t, "avgmu", &m_avgmu); -} - -void TrigEgammaNavNtuple::linkElectronBranches( TTree *t ){ - - InitBranch( t, "el_et", &m_el_et); - InitBranch( t, "el_pt", &m_el_pt); - InitBranch( t, "el_eta", &m_el_eta); - InitBranch( t, "el_phi", &m_el_phi); - InitBranch( t, "el_ethad1", &m_el_ethad1); - InitBranch( t, "el_ehad1", &m_el_ehad1); - InitBranch( t, "el_f1", &m_el_f1); - InitBranch( t, "el_f3", &m_el_f3); - InitBranch( t, "el_f1core", &m_el_f1core); - InitBranch( t, "el_f3core", &m_el_f3core); - InitBranch( t, "el_weta2", &m_el_weta2); - InitBranch( t, "el_d0", &m_el_d0); - InitBranch( t, "el_wtots1", &m_el_wtots1); - InitBranch( t, "el_fracs1", &m_el_fracs1); - InitBranch( t, "el_Reta", &m_el_Reta); - InitBranch( t, "el_Rphi", &m_el_Rphi); - InitBranch( t, "el_Eratio", &m_el_Eratio); - InitBranch( t, "el_Rhad", &m_el_Rhad); - InitBranch( t, "el_Rhad1", &m_el_Rhad1); - InitBranch( t, "el_deta1", &m_el_deta1); - InitBranch( t, "el_deta2", &m_el_deta2); - InitBranch( t, "el_dphi2", &m_el_dphi2); - InitBranch( t, "el_dphiresc", &m_el_dphiresc); - InitBranch( t, "el_dphiresc2", &m_el_dphiresc2); - InitBranch( t, "el_eprobht", &m_el_eprobht); - InitBranch( t, "el_charge", &m_el_charge); - InitBranch( t, "el_nblayerhits", &m_el_nblayerhits); - InitBranch( t, "el_nblayerolhits", &m_el_nblayerolhits); - InitBranch( t, "el_npixhits", &m_el_npixhits); - InitBranch( t, "el_npixolhits", &m_el_npixolhits); - InitBranch( t, "el_nscthits", &m_el_nscthits); - InitBranch( t, "el_nsctolhits", &m_el_nsctolhits); - InitBranch( t, "el_ntrthightreshits", &m_el_ntrthightreshits); - InitBranch( t, "el_ntrthits", &m_el_ntrthits); - InitBranch( t, "el_ntrthighthresolhits", &m_el_ntrthighthresolhits); - InitBranch( t, "el_ntrtolhits", &m_el_ntrtolhits); - InitBranch( t, "el_ntrtxenonhits", &m_el_ntrtxenonhits); - InitBranch( t, "el_expectblayerhit", &m_el_expectblayerhit); - InitBranch( t, "el_nsihits", &m_el_nsihits ); - InitBranch( t, "el_nsideadsensors", &m_el_nsideadsensors ); - InitBranch( t, "el_npixdeadsensors", &m_el_npixdeadsensors ); - InitBranch( t, "el_nsctdeadsensors", &m_el_nsctdeadsensors ); - InitBranch( t, "el_ringsE", &m_el_ringsE ); - InitBranch( t, "el_loose", &m_el_loose ); - InitBranch( t, "el_medium", &m_el_medium ); - InitBranch( t, "el_tight", &m_el_tight ); - InitBranch( t, "el_lhLoose", &m_el_lhLoose ); - InitBranch( t, "el_lhMedium", &m_el_lhMedium ); - InitBranch( t, "el_lhTight", &m_el_lhTight ); - InitBranch( t, "el_rgLoose", &m_el_rgLoose ); - InitBranch( t, "el_rgMedium", &m_el_rgMedium ); - InitBranch( t, "el_rgTight", &m_el_rgTight ); - InitBranch( t, "el_multiLepton", &m_el_multiLepton); - InitBranch( t, "el_nGoodVtx", &m_el_nGoodVtx); - InitBranch( t, "el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); - InitBranch( t, "calo_et", &m_calo_et); - InitBranch( t, "calo_eta", &m_calo_eta); - InitBranch( t, "calo_phi", &m_calo_phi); - -} - - -/*void TrigEgammaNavNtuple::linkPhotonBranches( TTree *t ){ -}*/ - -void TrigEgammaNavNtuple::linkTriggerBranches( TTree *t ){ - - InitBranch(t, "trig_L1_eta", &m_trig_L1_eta); - InitBranch(t, "trig_L1_phi", &m_trig_L1_phi); - InitBranch(t, "trig_L1_emClus", &m_trig_L1_emClus); - InitBranch(t, "trig_L1_tauClus", &m_trig_L1_tauClus); - InitBranch(t, "trig_L1_emIsol", &m_trig_L1_emIsol); - InitBranch(t, "trig_L1_hadIsol", &m_trig_L1_hadIsol); - InitBranch(t, "trig_L1_thrNames", &m_trig_L1_thrNames); - InitBranch(t, "trig_L1_accept", &m_trig_L1_accept); - InitBranch(t, "trig_L2_calo_et", &m_trig_L2_calo_et); - InitBranch(t, "trig_L2_calo_eta", &m_trig_L2_calo_eta); - InitBranch(t, "trig_L2_calo_phi", &m_trig_L2_calo_phi); - InitBranch(t, "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); - InitBranch(t, "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); - InitBranch(t, "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); - InitBranch(t, "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); - InitBranch(t, "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); - InitBranch(t, "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); - InitBranch(t, "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); - InitBranch(t, "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); - InitBranch(t, "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput ); - InitBranch(t, "trig_L2_calo_rings", &m_trig_L2_calo_rings ); - InitBranch(t, "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); - InitBranch(t, "trig_L2_calo_accept", &m_trig_L2_calo_accept); - - InitBranch(t, "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); - InitBranch(t, "trig_L2_el_pt" , &m_trig_L2_el_pt ); - InitBranch(t, "trig_L2_el_eta", &m_trig_L2_el_eta); - InitBranch(t, "trig_L2_el_phi", &m_trig_L2_el_phi ); - InitBranch(t, "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); - InitBranch(t, "trig_L2_el_charge", &m_trig_L2_el_charge); - InitBranch(t, "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); - InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); - InitBranch(t, "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); - InitBranch(t, "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); - InitBranch(t, "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); - - InitBranch(t, "trig_L2_el_accept", &m_trig_L2_el_accept ); - InitBranch(t, "trig_EF_el_accept", &m_trig_EF_el_accept ); - InitBranch(t, "trig_EF_calo_accept", &m_trig_EF_calo_accept ); - InitBranch(t, "trig_EF_calo_et", &m_trig_EF_calo_et ); - InitBranch(t, "trig_EF_calo_eta", &m_trig_EF_calo_eta ); - -} - - -void TrigEgammaNavNtuple::linkMonteCarloBranches(TTree *t){ - - InitBranch(t, "mc_hasMC", &m_mc_hasMC); - InitBranch(t, "mc_pt", &m_mc_pt); - InitBranch(t, "mc_eta", &m_mc_eta); - InitBranch(t, "mc_phi", &m_mc_phi); - InitBranch(t, "mc_isTop", &m_mc_isTop); - InitBranch(t, "mc_isParton", &m_mc_isParton); - InitBranch(t, "mc_isMeson", &m_mc_isMeson); - InitBranch(t, "mc_isTau", &m_mc_isTau); - InitBranch(t, "mc_isMuon", &m_mc_isMuon); - InitBranch(t, "mc_isPhoton", &m_mc_isPhoton); - InitBranch(t, "mc_isElectron", &m_mc_isElectron); - InitBranch(t, "mc_hasZMother", &m_mc_hasZMother); - InitBranch(t, "mc_hasWMother", &m_mc_hasWMother); -} - - -void TrigEgammaNavNtuple::clear(){ - - ///EventInfo - m_runNumber = 0; - m_eventNumber = 0; - m_avgmu = 0; - ///Egamma - m_el_et = -1; - m_el_pt = -1; - m_el_eta = -1; - m_el_phi = -1; - m_el_ethad1 = -1; - m_el_ehad1 = -1; - m_el_f1 = -1; - m_el_f3 = -1; - m_el_f1core = -1; - m_el_f3core = -1; - m_el_weta2 = -1; - m_el_d0 = -1; - m_el_wtots1 = -1; - m_el_fracs1 = -1; - m_el_Reta = -1; - m_el_Rphi = -1; - m_el_Eratio = -1; - m_el_Rhad = -1; - m_el_Rhad1 = -1; - m_el_deta1 = -1; - m_el_deta2 = -1; - m_el_dphi2 = -1; - m_el_dphiresc = -1; - m_el_dphiresc2 = -1; - m_el_eprobht = -1; - m_el_charge = 0; - m_el_nblayerhits = 0; - m_el_nblayerolhits = 0; - m_el_npixhits = 0; - m_el_npixolhits = 0; - m_el_nscthits = 0; - m_el_nsctolhits = 0; - m_el_ntrthightreshits = 0; - m_el_ntrthits = 0; - m_el_ntrthighthresolhits= 0; - m_el_ntrtolhits = 0; - m_el_ntrtxenonhits = 0; - m_el_expectblayerhit = false; - m_el_nsihits = 0; - m_el_nsideadsensors = 0; - m_el_npixdeadsensors = 0; - m_el_nsctdeadsensors = 0; - m_el_loose = false; - m_el_medium = false; - m_el_tight = false; - m_el_lhLoose = false; - m_el_lhMedium = false; - m_el_lhTight = false; - m_el_rgLoose = false; - m_el_rgMedium = false; - m_el_rgTight = false; - m_el_multiLepton = false; - m_el_nGoodVtx = -1; - m_el_nPileupPrimaryVtx = -1; - m_calo_et = -1; - m_calo_eta = -1; - m_calo_phi = -1; - - ///Trigger - m_trig_L1_eta = -1; - m_trig_L1_phi = -1; - m_trig_L1_emClus = -1; - m_trig_L1_tauClus = -1; - m_trig_L1_emIsol = -1; - m_trig_L1_hadIsol = -1; - m_trig_L1_accept = false; - m_trig_L2_calo_et = -1; - m_trig_L2_calo_eta = -1; - m_trig_L2_calo_phi = -1; - m_trig_L2_calo_e237 = -1; - m_trig_L2_calo_e277 = -1; - m_trig_L2_calo_fracs1 = -1; - m_trig_L2_calo_weta2 = -1; - m_trig_L2_calo_ehad1 = -1; - m_trig_L2_calo_emaxs1 = -1; - m_trig_L2_calo_e2tsts1 = -1; - m_trig_L2_calo_wstot = -1; - m_trig_L2_calo_rnnOutput = 999; - - m_trig_L1_accept = false; - m_trig_L2_calo_accept = false; - m_trig_L2_el_accept = false; - m_trig_EF_calo_accept = false; - m_trig_EF_el_accept = false; - - ///Monte Carlo - m_mc_hasMC = false; - m_mc_pt = -1; - m_mc_eta = -1; - m_mc_phi = -1; - m_mc_isTop = false; - m_mc_isParton = false; - m_mc_isMeson = false; - m_mc_isTau = false; - m_mc_isMuon = false; - m_mc_isPhoton = false; - m_mc_isElectron = false; - m_mc_hasZMother = false; - m_mc_hasWMother = false; - - ///Some vectors - m_trig_L1_thrNames ->clear(); - m_trig_L2_calo_energySample ->clear(); - m_trig_L2_calo_rings ->clear(); - - m_trig_L2_el_trackAlgID ->clear(); - m_trig_L2_el_eta ->clear(); - m_trig_L2_el_phi ->clear(); - m_trig_L2_el_caloEta ->clear(); - m_trig_L2_el_trkClusDeta ->clear(); - m_trig_L2_el_trkClusDphi ->clear(); - m_trig_L2_el_pt ->clear(); - m_trig_L2_el_etOverPt ->clear(); - m_trig_L2_el_nTRTHits ->clear(); - m_trig_L2_el_nTRTHiThresholdHits ->clear(); - m_trig_L2_el_charge ->clear(); - m_trig_EF_calo_et ->clear(); -} - -void TrigEgammaNavNtuple::alloc_space(){ - - m_el_ringsE = new std::vector<float>(); - m_trig_L1_thrNames = new std::vector<std::string>(); - m_trig_L2_calo_energySample = new std::vector<float>(); - m_trig_L2_calo_rings = new std::vector<float>(); - m_trig_L2_el_trackAlgID = new std::vector<int>(); - m_trig_L2_el_eta = new std::vector<float>(); - m_trig_L2_el_phi = new std::vector<float>(); - m_trig_L2_el_caloEta = new std::vector<float>(); - m_trig_L2_el_trkClusDeta = new std::vector<float>(); - m_trig_L2_el_trkClusDphi = new std::vector<float>(); - m_trig_L2_el_pt = new std::vector<float>(); - m_trig_L2_el_etOverPt = new std::vector<float>(); - m_trig_L2_el_nTRTHits = new std::vector<float>(); - m_trig_L2_el_nTRTHiThresholdHits = new std::vector<float>(); - m_trig_L2_el_charge = new std::vector<float>(); - m_trig_EF_calo_et = new std::vector<float>(); - m_trig_EF_calo_eta = new std::vector<float>(); - -} - -void TrigEgammaNavNtuple::release_space(){ - delete m_el_ringsE ; - delete m_trig_L1_thrNames ; - delete m_trig_L2_calo_energySample; - delete m_trig_L2_calo_rings ; - delete m_trig_L2_el_trackAlgID ; - delete m_trig_L2_el_pt ; - delete m_trig_L2_el_eta ; - delete m_trig_L2_el_caloEta ; - delete m_trig_L2_el_phi ; - delete m_trig_L2_el_charge ; - delete m_trig_L2_el_nTRTHits ; - delete m_trig_L2_el_nTRTHiThresholdHits ; - delete m_trig_L2_el_etOverPt ; - delete m_trig_L2_el_trkClusDeta ; - delete m_trig_L2_el_trkClusDphi ; - delete m_trig_EF_calo_et ; - delete m_trig_EF_calo_eta ; -} - -unsigned TrigEgammaNavNtuple::count_HLT_objects( const HLT::TriggerElement *feat ) -{ - unsigned nobj=0; - if(getFeature<xAOD::ElectronContainer>(feat) ) nobj++; // HLT - if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj++; // EFCalo - if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj++; // L2 - if(getFeature<xAOD::TrigEMCluster>(feat) ) nobj++; // L2Calo - ATH_MSG_DEBUG("Number of objects counted in this feature: " << nobj); - return nobj; -} diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx index 57a1a2058f76..e18a851a02a7 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx @@ -43,14 +43,27 @@ StatusCode TrigEgammaNavTPAnalysisTool::childBook(){ //Set the base directory from the plot() m_dir=plot()->getBasePath(); std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); + //TrigEgammaAnalysisBaseTool::write_trigger_list(chains); for(const auto trigName:m_trigInputList){ if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ if(plot()->getTrigInfoMap().count(trigName) != 0) ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName); - else + else { m_trigList.push_back(trigName); + setTrigInfo(trigName); + } } + + // specail code to add trigger without the menu + else if(getEmulation() && m_forceTrigAttachment){// + ATH_MSG_INFO("Trigger doesn't exist in menu. Attach to emulate."); + if(plot()->getTrigInfoMap().count(trigName) == 0){ + m_trigList.push_back(trigName); + setTrigEmulation(); + setTrigInfo(trigName); + } + }// emulation } // Book histograms for average efficiencies and counters const int nTrigger = (int) m_trigList.size(); @@ -104,9 +117,6 @@ StatusCode TrigEgammaNavTPAnalysisTool::childBook(){ setLabels(hist1(m_anatype+"_EffHLT"),m_trigList); setLabels(hist1(m_anatype+"_CutCounter"),m_cutlabels); } - // Book the histograms per signature - for (int i = 0; i < (int) m_trigList.size(); i++) - setTrigInfo(m_trigList[i]); plot()->setEmulation(getEmulation()); if(plot()->book(getTrigInfoMap()).isFailure()){ @@ -136,6 +146,19 @@ StatusCode TrigEgammaNavTPAnalysisTool::childExecute() ATH_MSG_DEBUG("Fails EventWise selection"); return StatusCode::SUCCESS; } + // Check for Rnn container in SG + if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){ + setSGContainsRnn(true); + } + if(m_storeGate->contains<xAOD::TrigPhotonContainer>("HLT_xAOD__TrigPhotonContainer_L2PhotonFex")){ + setSGContainsTrigPhoton(true); + } + ATH_MSG_DEBUG("Rnn container in SG " << getSGContainsRnn()); + ATH_MSG_DEBUG("TrigPhotonContainer in SG " << getSGContainsTrigPhoton()); + for( const auto& tool : m_tools) { + tool->setSGContainsRnn(getSGContainsRnn()); + tool->setSGContainsTrigPhoton(getSGContainsTrigPhoton()); + } // Event Wise Selection (independent of the required signatures) hist1(m_anatype+"_CutCounter")->Fill("EventWise",1); // Select TP Pairs diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx index 4dac467c9006..89cbec013150 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx @@ -19,7 +19,6 @@ * All derived classes work with list of probes for a given trigger. * As input property, pass a list of triggers to study. **********************************************************************/ -#include "egammaMVACalibAnalysis/IegammaMVATool.h" #include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h" #include "TrigConfxAOD/xAODConfigTool.h" #include "xAODEventInfo/EventInfo.h" @@ -47,12 +46,14 @@ TrigEgammaNavTPBaseTool( const std::string& myname ) declareProperty("ForceProbePid", m_forceProbePid=false); // new declareProperty("OppositeCharge",m_oppositeCharge=true); declareProperty("OfflineTagMinEt",m_tagMinEt=25); + declareProperty("OfflineProbeMinEt",m_probeMinEt=4); declareProperty("TagTriggerList", m_tagTrigList); declareProperty("TriggerList",m_trigInputList); declareProperty("CategoryList",m_categories); declareProperty("RemoveCrack", m_rmCrack=true); //new declareProperty("OfflineProbeIsolation", m_offProbeIsolation="Loose"); declareProperty("ForceProbeIsolation", m_forceProbeIsolation=false); + declareProperty("ApplyMinimalTrigger", m_applyMinimalTrigger=true); // Maps should be static m_PidToolMap["Tight"]=0; @@ -64,9 +65,9 @@ TrigEgammaNavTPBaseTool( const std::string& myname ) m_jets=nullptr; m_eventInfo=nullptr; m_truthContainer=nullptr; + m_METContainer=nullptr; m_applyJetNearProbeSelection=true; - m_skipTrigger=false; - + m_skipTrigger=false; } //********************************************************************** @@ -104,9 +105,11 @@ TrigEgammaNavTPBaseTool::childInitialize() { return StatusCode::SUCCESS; } + StatusCode TrigEgammaNavTPBaseTool::childBook() { return StatusCode::SUCCESS; } + bool TrigEgammaNavTPBaseTool::EventWiseSelection(){ ATH_MSG_DEBUG("Apply EventWise selection"); @@ -122,7 +125,6 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){ m_offElectrons = 0; m_jets = 0; m_truthContainer=0; - if ( (m_storeGate->retrieve(m_eventInfo, "EventInfo")).isFailure() ){ ATH_MSG_WARNING("Failed to retrieve eventInfo "); @@ -136,6 +138,15 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){ } }// protection + if(m_storeGate->contains<xAOD::MissingETContainer>("MET_Reference_AntiKt4EMTopo")){ + if(m_storeGate->retrieve(m_METContainer,"MET_Reference_AntiKt4EMTopo").isFailure()){ + ATH_MSG_WARNING("Could not retrieve xAOD::MissingETContainer 'MET_Reference_AntiKt4EMTopo'"); + return false; + } + }// protection + + + if (m_eventInfo->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error) { ATH_MSG_DEBUG("Event not passing LAr"); return false; @@ -173,9 +184,11 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){ // missing more selections // check Minimal Trigger Requirements - if ( !MinimalTriggerRequirement() ) return false; + if(m_applyMinimalTrigger) + if ( !MinimalTriggerRequirement() ) return false; hist1(m_anatype+"_CutCounter")->Fill("PassTrigger",1); + return true; } @@ -193,11 +206,18 @@ bool TrigEgammaNavTPBaseTool::MinimalTriggerRequirement(){ void TrigEgammaNavTPBaseTool::executeTandP(){ + // clear all Z index pairs + m_Z.clear(); + unsigned itag=0; + clearProbeList(); // Clear Probes after each trigger ATH_MSG_DEBUG("Execute TandP BaseTool " << m_offElectrons->size()); for(const auto& elTag : *m_offElectrons){ + itag++; if( ! isTagElectron(elTag) ) continue; + unsigned iprobe=0; for(const auto& elProbe : *m_offElectrons){ // Dress the probes with updated Pid decision + iprobe++; hist1(m_anatype+"_ProbeCutCounter")->Fill("Electrons",1); if(elProbe==elTag) continue; hist1(m_anatype+"_ProbeCutCounter")->Fill("NotTag",1); @@ -241,27 +261,37 @@ void TrigEgammaNavTPBaseTool::executeTandP(){ xAOD::Electron *selProbe = new xAOD::Electron(*elProbe); DressPid(selProbe); m_probeElectrons.push_back(selProbe); + m_Z.push_back( std::pair<unsigned,unsigned>(itag-1,iprobe-1) ); hist1(m_anatype+"_Mee")->Fill(tpPairMass/1.e3); } } // end of for in Probe } // end of for in Tags } + void TrigEgammaNavTPBaseTool::matchObjects(const std::string probeTrigItem){ clearPairList(); + bool isEmulation = getTrigInfo(probeTrigItem).trigIsEmulation; + + for(unsigned int i=0;i<m_probeElectrons.size();i++){ const HLT::TriggerElement *finalFC; - - // Use matching tool and create pair of offline probe and TE - if ( match()->match(m_probeElectrons[i], probeTrigItem, finalFC)){ - std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC); - m_pairObj.push_back(pairProbe); - } // end of check Probe - else { - std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],nullptr); - m_pairObj.push_back(pairProbe); - } // still include the probe + if(isEmulation && getEmulation()){ // Collect from support match + emulation()->match( m_probeElectrons[i], finalFC ); + std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC); + m_pairObj.push_back(pairProbe); + }else{ + // Use matching tool and create pair of offline probe and TE + if ( match()->match(m_probeElectrons[i], probeTrigItem, finalFC)){ + std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC); + m_pairObj.push_back(pairProbe); + } // end of check Probe + else { + std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],nullptr); + m_pairObj.push_back(pairProbe); + } // still include the probe + } } } @@ -375,13 +405,14 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){ void TrigEgammaNavTPBaseTool::DressPid(const xAOD::Electron *eg){ + auto ctx = Gaudi::Hive::currentContext() ; for(int ipid=0;ipid<3;ipid++){ - bool accept = (bool) m_electronIsEMTool[ipid]->accept(eg); + bool accept = (bool) m_electronIsEMTool[ipid]->accept(ctx,eg); const std::string pidname="is"+m_isemname[ipid]; eg->auxdecor<bool>(pidname)=static_cast<bool>(accept); } for(int ipid=0;ipid<2;ipid++){ - bool accept = (bool) m_electronLHTool[ipid]->accept(eg); + bool accept = (bool) m_electronLHTool[ipid]->accept(ctx,eg); const std::string pidname="is"+m_lhname[ipid]; eg->auxdecor<bool>(pidname)=static_cast<bool>(accept); } @@ -389,34 +420,30 @@ void TrigEgammaNavTPBaseTool::DressPid(const xAOD::Electron *eg){ } bool TrigEgammaNavTPBaseTool::ApplyElectronPid(const xAOD::Electron *eg, const std::string pidname){ - + auto ctx = Gaudi::Hive::currentContext() ; if (pidname == "Tight"){ - bool accept = (bool) m_electronIsEMTool[0]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronIsEMTool[0]->accept(ctx,eg); } else if (pidname == "Medium"){ - bool accept = (bool) m_electronIsEMTool[1]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronIsEMTool[1]->accept(ctx,eg); } else if (pidname == "Loose"){ - bool accept = (bool) m_electronIsEMTool[2]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronIsEMTool[2]->accept(ctx,eg); } else if (pidname == "LHTight"){ - bool accept = (bool) m_electronLHTool[0]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronLHTool[0]->accept(ctx,eg); } else if (pidname == "LHMedium"){ - bool accept = (bool) m_electronLHTool[1]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronLHTool[1]->accept(ctx,eg); } else if (pidname == "LHLoose"){ - bool accept = (bool) m_electronLHTool[2]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronLHTool[2]->accept(ctx,eg); + } + else if (pidname == "LHMediumHI"){ + return (bool) m_electronLHTool[3]->accept(ctx,eg); } else if (pidname == "LHMediumHI"){ - bool accept = (bool) m_electronLHTool[3]->accept(eg); - return static_cast<bool>(accept); + return (bool) m_electronLHTool[3]->accept(ctx,eg); } else ATH_MSG_DEBUG("No Pid tool, continue without PID"); return false; @@ -529,3 +556,33 @@ double TrigEgammaNavTPBaseTool::simple_lxy(int flag, double d1, double d2, do else return (a+b)/c; } + + + +float TrigEgammaNavTPBaseTool::getWTransverseMass( const xAOD::Electron *el ){ + float transverseMass=0.0; + if(m_METContainer){ + TLorentzVector MET_4vec = TLorentzVector(getMET()->mpx(), getMET()->mpy(), 0, getMET()->met()); + TLorentzVector electron; + electron.SetPtEtaPhiE(el->pt(), 0, el->phi(), el->pt()); + transverseMass = (MET_4vec + electron).M(); + } + return transverseMass; + +} + +bool TrigEgammaNavTPBaseTool::passesEventCleaning() +{ + ATH_MSG_DEBUG("Appling Event Cleaning..."); + //if(m_ismc) return true; + bool failsLAr = (m_eventInfo->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error ); + bool failsTile = (m_eventInfo->errorState(xAOD::EventInfo::Tile) == xAOD::EventInfo::Error ); + bool failsSCT = (m_eventInfo->errorState(xAOD::EventInfo::SCT) == xAOD::EventInfo::Error ); + bool failsTTC = (m_eventInfo->isEventFlagBitSet(xAOD::EventInfo::Core, 18)); // timing, trigger, control failed => some eventinfo missing + bool pass = !(failsLAr || failsTile || failsSCT || failsTTC); + if(!pass) + ATH_MSG_DEBUG("Event not clear! "); + return pass; +} + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx deleted file mode 100755 index 680e786f42f3..000000000000 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx +++ /dev/null @@ -1,1066 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - -/********************************************************************** - * AsgTool: TrigEgammaNavTPNtuple - * Authors: - * Ryan Mackenzie White <ryan.white@cern.ch> - * Denis Damazio <denis.damazio@cern.ch> - * Contributors: - * Joao Victor da Fonseca Pinto <joao.victor.da.fonseca.pinto@cern.ch> - * Date: Mar 2015 - * Description: - * Derived class for dumping the probe information into a ttree. - * - **********************************************************************/ - -#include "TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h" - -using namespace std; - -TrigEgammaNavTPNtuple::TrigEgammaNavTPNtuple( const std::string& myname ): TrigEgammaNavTPBaseTool(myname) -{ - m_eventCounter = 0; - declareProperty("CutLabels", m_cutlabels ); - declareProperty("Analysis", m_anatype="NavTPNtuple" ); - declareProperty("doOfflineDump", m_doOfflineDump=false ); - declareProperty("DoSupportTrigger", m_doSupport=true ); - declareProperty("OfflineProbeMinEt", m_probeMinEt=-1 ); - - m_el_ringsE=nullptr; - m_trig_L1_thrNames=nullptr; - m_trig_L2_calo_energySample=nullptr; - m_trig_L2_calo_rings=nullptr; - m_trig_L2_el_trackAlgID=nullptr; - m_trig_L2_el_pt=nullptr; - m_trig_L2_el_eta=nullptr; - m_trig_L2_el_caloEta=nullptr; - m_trig_L2_el_phi=nullptr; - m_trig_L2_el_charge=nullptr; - m_trig_L2_el_nTRTHits=nullptr; - m_trig_L2_el_nTRTHiThresholdHits=nullptr; - m_trig_L2_el_etOverPt=nullptr; - m_trig_L2_el_trkClusDeta=nullptr; - m_trig_L2_el_trkClusDphi=nullptr; - m_trig_EF_calo_et=nullptr; - m_trig_EF_calo_eta=nullptr; -} - -StatusCode TrigEgammaNavTPNtuple::childInitialize(){ - return StatusCode::SUCCESS; -} - - -StatusCode TrigEgammaNavTPNtuple::childBook(){ - - ATH_MSG_DEBUG("Now configuring chains for analysis"); - //Set the base directory from the plot() - m_dir=plot()->getBasePath(); - std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); - - TrigEgammaAnalysisBaseTool::write_trigger_list(chains); - - for(const auto trigName:m_trigInputList){ - if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) { - if(plot()->getTrigInfoMap().count(trigName) != 0) - ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName); - else - m_trigList.push_back(trigName); - } - } - - - - // Book histograms for average efficiencies and counters - //const int nTrigger = (int) m_trigList.size(); - addDirectory(m_dir+"/Expert/Event"); - std::string histname=m_anatype+"_ProbeCutCounter"; - addHistogram(new TH1F(histname.c_str(), "Number of Probes; Cut ; Count", 12, 0., 12)); - histname=m_anatype+"_TagCutCounter"; - addHistogram(new TH1F(histname.c_str(), "Number of Tags; Cut ; Count", 10, 0., 10)); - histname=m_anatype+"_Mee"; - addHistogram(new TH1F(histname.c_str(), "Offline M(ee); m_ee [GeV] ; Count", 50, m_ZeeMassMin, m_ZeeMassMax)); - histname=m_anatype+"_CutCounter"; - addHistogram(new TH1I(histname.c_str(), "Event Selection; Cut ; Count", 6, 0., 6)); - setLabels(hist1(histname),m_cutlabels); - - if(m_doOfflineDump){ - addDirectory(m_dir+"/Expert/Offline"); - TTree *t = new TTree( "probes", "tree of Offline Zee probes"); - bookEventBranches( t ); - bookElectronBranches( t ); - //bookPhotonBranches( t ); - bookMonteCarloBranches( t ); - addTree(t, m_dir+"/Expert/Offline"); - }else if (m_doSupport){ // All trigger in one - addDirectory(m_dir+"/Expert/support"); - TTree *t = new TTree( "probes", "tree of Zee probes"); - bookEventBranches( t ); - bookElectronBranches( t ); - //bookPhotonBranches( t ); - bookTriggerBranches( t ); - bookMonteCarloBranches( t ); - for(auto& trigItem : m_trigList) - setTrigInfo(trigItem); - addTree(t, m_dir+"/Expert/support"); - }else{// Each trigger - for (auto& trigItem : m_trigList) { - addDirectory(m_dir+"/Expert/"+trigItem); - TTree *t = new TTree( "probes", "tree of Zee probes"); - bookEventBranches( t ); - bookElectronBranches( t ); - //bookPhotonBranches( t ); - bookTriggerBranches( t ); - bookMonteCarloBranches( t ); - setTrigInfo(trigItem); - addTree(t, m_dir+"/Expert/"+trigItem); - }// Loop over triggers - } - - ///Alloc pointers - alloc_space(); - return StatusCode::SUCCESS; -} - -StatusCode TrigEgammaNavTPNtuple::childExecute(){ - - m_eventCounter++; - cd(m_dir+"/Expert/Event"); - // Event Wise Selection (independent of the required signatures) - if ( !TrigEgammaNavTPBaseTool::EventWiseSelection() ) return StatusCode::SUCCESS; - - if(m_doOfflineDump){ - if(!executeProbesDump()) return StatusCode::FAILURE; - }else if (m_doSupport){ - if(!executeProbesSupportDump()) return StatusCode::FAILURE; - }else{ - if(!executeProbesItemDump()) return StatusCode::FAILURE; - } - - return StatusCode::SUCCESS; -} - - - -bool TrigEgammaNavTPNtuple::executeProbesDump(){ - - // Select TP Pairs - executeTandP(); - - TTree *t = tree( "probes", m_dir+"/Expert/Offline"); - linkEventBranches(t); - linkElectronBranches(t); - linkMonteCarloBranches(t); - for(unsigned int iprobe = 0; iprobe != m_probeElectrons.size(); ++iprobe){ - const xAOD::Electron *el = static_cast<const xAOD::Electron *> (m_probeElectrons[iprobe]); - ATH_MSG_DEBUG("dumping probe electron information..."); - clear(); - fillEvent(); - fillElectron( el ); - if(!fillMonteCarlo( el ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - } - ATH_MSG_DEBUG("record probe information into the file."); - t->Fill(); - }// loop over offline probes - - return true; -} - - -bool TrigEgammaNavTPNtuple::executeProbesItemDump(){ - - executeTandP(); - - for(unsigned int ilist = 0; ilist != m_trigList.size(); ++ilist) { - - std::string trigItem = m_trigList.at(ilist); - const TrigInfo info = getTrigInfo(trigItem); - cd(m_dir+"/Expert/"+trigItem); - TTree *t = tree( "probes", m_dir+"/Expert/"+trigItem); - linkEventBranches(t); - linkElectronBranches(t); - linkTriggerBranches(t); - linkMonteCarloBranches(t); - //Try to find trigger objects - TrigEgammaNavTPBaseTool::matchObjects(trigItem); - - for(unsigned int iprobe = 0; iprobe != m_pairObj.size(); ++iprobe){ - - const xAOD::Electron *el = static_cast<const xAOD::Electron *> (m_pairObj[iprobe].first); - const HLT::TriggerElement *feat = m_pairObj[iprobe].second; - ATH_MSG_DEBUG("dumping probe electron information..."); - - clear(); - fillEvent(); - fillElectron( el ); - - if(!fillMonteCarlo( el ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - } - - if(feat){ - ///Start trigger analisys... - const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat); - if(emTauRoI){ - fillEmTauRoI( emTauRoI ); - }else{ - ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement.."); - } - - const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); - if(emCluster){ - - if(!fillTrigEMCluster( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree."); - } - - //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){ - if(!fillTrigCaloRings( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree."); - } - }///cluster protection - - - const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat); - // Level 2 ID+Calo - if(trigElCont){ - for(const auto& trigEl : *trigElCont){ - if(!fillTrigElectron(trigEl)) { - ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree."); - } - }// loop over all trigElectrons for this feat - } - - const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat); - if(caloCont){ - for(const auto& cl : *caloCont){ - if(!fillCaloCluster(cl)){ - ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree."); - } - }// loop over calo cluster - } - - - asg::AcceptData acceptData = setAccept(feat,info); - m_trig_L1_accept = acceptData.getCutResult("L1Calo"); - m_trig_L2_calo_accept = acceptData.getCutResult("L2Calo"); - m_trig_L2_el_accept = acceptData.getCutResult("L2"); - m_trig_EF_calo_accept = acceptData.getCutResult("EFCalo"); - m_trig_EF_el_accept = acceptData.getCutResult("HLT"); - - ATH_MSG_DEBUG("L1Calo: " << int(m_trig_L1_accept)); - ATH_MSG_DEBUG("L2Calo: " << int(m_trig_L2_calo_accept)); - ATH_MSG_DEBUG("L2 : " << int(m_trig_L2_el_accept)); - ATH_MSG_DEBUG("EFCalo: " << int(m_trig_EF_calo_accept)); - ATH_MSG_DEBUG("HLT : " << int(m_trig_EF_el_accept)); - - }else{ - ATH_MSG_DEBUG("No TriggerElement for this probe!"); - } - ATH_MSG_DEBUG("record probe information into the file."); - t->Fill(); - }// loop over probes - } // End loop over trigger list - - return true; -} - - - -bool TrigEgammaNavTPNtuple::executeProbesSupportDump(){ - - double GeV=1000.; - std::vector<const HLT::TriggerElement *> vec_feat; - - // Tag and probe algorithm - executeTandP(); - - cd(m_dir+"/Expert/support"); - TTree *t = tree( "probes", m_dir+"/Expert/support"); - linkEventBranches(t); - linkElectronBranches(t); - linkMonteCarloBranches(t); - - for(const auto &eg : m_probeElectrons){ - // Get the good electron - const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg); - // Force Et cut - if(m_probeMinEt > 0.0){ - if( !( getEt(el) > (m_probeMinEt)*GeV) ) continue; - } - // Clear the vector - vec_feat.clear(); - // Loop over support triggers: Here, we will collect all good trigger elements to - // dump on the ttree. - for(auto& trigItem : m_trigList){ - - const HLT::TriggerElement *feat=nullptr; - // Trigger match using Matching tool - match()->match(el, trigItem, feat); - - if(feat){// If has a match! - for(unsigned i=0; i < vec_feat.size(); ++i){ - if(getFeature<xAOD::EmTauRoI>(vec_feat[i])->roiWord() == getFeature<xAOD::EmTauRoI>(feat)->roiWord()){ - if(count_HLT_objects(feat) > count_HLT_objects(vec_feat[i])){ - vec_feat.erase(vec_feat.begin() + i); // Erase the trigger element lowest than the new feature - vec_feat.push_back(feat); // attach the new trigger element - break; - } - }// The same region in L1Calo trigger - } - if(vec_feat.empty()) vec_feat.push_back(feat); - }else{ - ATH_MSG_DEBUG("There is no match for this probe."); - } - }// Loop over support triggers - - ATH_MSG_DEBUG("Attached " << vec_feat.size() << " features "); - for(auto& feat : vec_feat){ - clear(); - fillEvent(); - fillElectron( el ); - - if(!fillMonteCarlo( el ) ){ - ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron"); - } - - ///Start trigger analisys... - const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat); - if(emTauRoI){ - fillEmTauRoI( emTauRoI ); - }else{ - ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement.."); - } - - const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat); - if(emCluster){ - - if(!fillTrigEMCluster( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree."); - } - - //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){ - if(!fillTrigCaloRings( emCluster )){ - ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree."); - } - }///cluster protection - - - const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat); - // Level 2 ID+Calo - if(trigElCont){ - for(const auto& trigEl : *trigElCont){ - if(!fillTrigElectron(trigEl)) { - ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree."); - } - }// loop over all trigElectrons for this feat - } - - const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat); - if(caloCont){ - for(const auto& cl : *caloCont){ - if(!fillCaloCluster(cl)){ - ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree."); - } - }// loop over calo cluster - } - - ATH_MSG_DEBUG("record trigger information into the file."); - t->Fill(); - }//loop over trigger objects - - }// Loop over probes - return true; -} - - - -StatusCode TrigEgammaNavTPNtuple::childFinalize(){ - //release_space(); - return StatusCode::SUCCESS; -} - - - -bool TrigEgammaNavTPNtuple::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){ - - m_trig_L1_eta = emTauRoI->eta(); - m_trig_L1_phi = emTauRoI->phi(); - m_trig_L1_emClus = emTauRoI->emClus(); - m_trig_L1_tauClus = emTauRoI->tauClus(); - m_trig_L1_emIsol = emTauRoI->emIsol(); - m_trig_L1_hadIsol = emTauRoI->hadIsol(); - for(unsigned i=0; i < emTauRoI->thrNames().size();++i) m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i)); - return true; -} - -bool TrigEgammaNavTPNtuple::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){ - - m_trig_L2_calo_et = emCluster->et(); - m_trig_L2_calo_eta = emCluster->eta(); - m_trig_L2_calo_phi = emCluster->phi(); - m_trig_L2_calo_e237 = emCluster->e237(); - m_trig_L2_calo_e277 = emCluster->e277(); - m_trig_L2_calo_fracs1 = emCluster->fracs1(); - m_trig_L2_calo_weta2 = emCluster->weta2(); - m_trig_L2_calo_ehad1 = emCluster->ehad1(); - m_trig_L2_calo_emaxs1 = emCluster->emaxs1(); - m_trig_L2_calo_e2tsts1 = emCluster->e2tsts1(); - m_trig_L2_calo_wstot = emCluster->wstot(); - for(unsigned i=0; i<emCluster->energySample().size(); ++i){ - m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i)); - } - - return true; -} - - -bool TrigEgammaNavTPNtuple::fillTrigElectron( const xAOD::TrigElectron *trigEl ){ - - const xAOD::TrackParticle* trkIter = trigEl->trackParticle(); - if (trkIter==nullptr) return false; // disconsider candidates without track - int algoId = 0; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] ) algoId=5; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] ) algoId=6; - if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] ) algoId=7; - - m_trig_L2_el_trackAlgID ->push_back(algoId); - m_trig_L2_el_caloEta ->push_back(trigEl->caloEta()); - m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi()); - m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta()); - m_trig_L2_el_pt ->push_back(trigEl->pt()); - m_trig_L2_el_phi ->push_back(trigEl->phi()); - m_trig_L2_el_eta ->push_back(trigEl->eta()); - m_trig_L2_el_etOverPt ->push_back(trigEl->etOverPt()); - m_trig_L2_el_nTRTHits ->push_back(trigEl->nTRTHits()); - m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits()); - m_trig_L2_el_charge ->push_back(trigEl->charge()); - return true; -} - - -bool TrigEgammaNavTPNtuple::fillCaloCluster( const xAOD::CaloCluster *cluster){ - - m_trig_EF_calo_et->push_back(cluster->et()); - m_trig_EF_calo_eta->push_back(cluster->eta()); - return true; -} - -bool TrigEgammaNavTPNtuple::fillEvent(){ - ///Event information - m_runNumber = m_eventInfo->runNumber(); - m_eventNumber = m_eventInfo->eventNumber(); - m_avgmu=getAvgMu(); - return true; -} - -bool TrigEgammaNavTPNtuple::fillElectron( const xAOD::Electron *el ){ - - ///Cluster information - m_el_et = el->pt(); - m_el_eta = el->eta(); - m_el_phi = el->phi(); - el->showerShapeValue( m_el_ethad1 , xAOD::EgammaParameters::ShowerShapeType::ethad1 ); - el->showerShapeValue( m_el_ehad1 , xAOD::EgammaParameters::ShowerShapeType::ehad1 ); - el->showerShapeValue( m_el_f1 , xAOD::EgammaParameters::ShowerShapeType::f1 ); - el->showerShapeValue( m_el_f3 , xAOD::EgammaParameters::ShowerShapeType::f3 ); - el->showerShapeValue( m_el_f1core , xAOD::EgammaParameters::ShowerShapeType::f1core ); - el->showerShapeValue( m_el_f3core , xAOD::EgammaParameters::ShowerShapeType::f3core ); - el->showerShapeValue( m_el_weta2 , xAOD::EgammaParameters::ShowerShapeType::weta2 ); - el->showerShapeValue( m_el_wtots1 , xAOD::EgammaParameters::ShowerShapeType::wtots1 ); - el->showerShapeValue( m_el_fracs1 , xAOD::EgammaParameters::ShowerShapeType::fracs1 ); - el->showerShapeValue( m_el_Reta , xAOD::EgammaParameters::ShowerShapeType::Reta ); - el->showerShapeValue( m_el_Rphi , xAOD::EgammaParameters::ShowerShapeType::Rphi ); - el->showerShapeValue( m_el_Eratio , xAOD::EgammaParameters::ShowerShapeType::Eratio ); - el->showerShapeValue( m_el_Rhad , xAOD::EgammaParameters::ShowerShapeType::Rhad ); - el->showerShapeValue( m_el_Rhad1 , xAOD::EgammaParameters::ShowerShapeType::Rhad1 ); - - ///Combined track/Cluter information - el->trackCaloMatchValue( m_el_deta1 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta1 ); - el->trackCaloMatchValue( m_el_deta2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2 ); - el->trackCaloMatchValue( m_el_dphi2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2 ); - el->trackCaloMatchValue( m_el_dphiresc , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 ); - el->trackCaloMatchValue( m_el_dphiresc2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled2 ); - - - ///Track particle information - const xAOD::TrackParticle *track = el->trackParticle(); - if(track){ - m_el_pt = track->pt(); - m_el_d0 = fabsf(track->d0()); - m_el_charge = el->charge(); - - track->summaryValue( m_el_eprobht , xAOD::SummaryType::eProbabilityHT ); - track->summaryValue( m_el_nblayerhits , xAOD::SummaryType::numberOfInnermostPixelLayerHits ); - track->summaryValue( m_el_nblayerolhits , xAOD::SummaryType::numberOfInnermostPixelLayerOutliers ); - track->summaryValue( m_el_npixhits , xAOD::SummaryType::numberOfPixelHits ); - track->summaryValue( m_el_npixolhits , xAOD::SummaryType::numberOfPixelOutliers ); - track->summaryValue( m_el_nscthits , xAOD::SummaryType::numberOfSCTHits ); - track->summaryValue( m_el_nsctolhits , xAOD::SummaryType::numberOfSCTOutliers ); - track->summaryValue( m_el_ntrthightreshits , xAOD::SummaryType::numberOfTRTHighThresholdHits ); - track->summaryValue( m_el_ntrthits , xAOD::SummaryType::numberOfTRTHits); - track->summaryValue( m_el_ntrthighthresolhits, xAOD::SummaryType::numberOfTRTHighThresholdOutliers ); - track->summaryValue( m_el_ntrtolhits , xAOD::SummaryType::numberOfTRTOutliers ); - track->summaryValue( m_el_ntrtxenonhits , xAOD::SummaryType::numberOfTRTXenonHits ); - //track->summaryValue( m_el_expectblayerhit , xAOD::SummaryType::expectInnermostPixelLayerHit ); - track->summaryValue( m_el_npixdeadsensors , xAOD::SummaryType::numberOfPixelDeadSensors); - track->summaryValue( m_el_nsctdeadsensors , xAOD::SummaryType::numberOfSCTDeadSensors); - - m_el_nsideadsensors = m_el_npixdeadsensors + m_el_nsctdeadsensors; - m_el_nsihits = m_el_npixhits + m_el_nscthits; - } - - //m_el_loose = el->passSelection("Loose"); - //m_el_medium = el->passSelection("Medium"); - //m_el_tight = el->passSelection("Tight"); - //m_el_lhLoose = el->passSelection("LHLoose"); - //m_el_lhMedium = el->passSelection("LHMedium"); - //m_el_lhTight = el->passSelection("LHTight"); - //m_el_rgLoose = el->passSelection("RGLoose"); - //m_el_rgMedium = el->passSelection("RGMedium"); - //m_el_rgTight = el->passSelection("RGTight"); - //m_el_multiLepton = el->passSelection("MultiLepton"); - m_el_loose = ApplyElectronPid(el, "Loose"); - m_el_medium = ApplyElectronPid(el, "Medium"); - m_el_tight = ApplyElectronPid(el, "Tight"); - m_el_lhLoose = ApplyElectronPid(el, "LHLoose"); - m_el_lhMedium = ApplyElectronPid(el, "LHMedium"); - m_el_lhTight = ApplyElectronPid(el, "LHTight"); - //m_el_rgLoose = ApplyElectronPid(el, "RGLoose"); - //m_el_rgMedium = ApplyElectronPid(el, "RGMedium"); - //m_el_rgTight = ApplyElectronPid(el, "RGTight"); - - m_calo_et = getCluster_et( el ); - m_calo_eta = getCluster_eta( el ); - m_calo_phi = getCluster_phi( el ); - ///Extra information about pileup - m_el_nGoodVtx = getNGoodVertex(); - m_el_nPileupPrimaryVtx = getNPVtx(); - - - if(!fillCaloRings( el )){ - ATH_MSG_WARNING("Could not attach the calorRings information."); - } - - return true; -} - - -/*bool TrigEgammaNavTPNtuple::fillPhoton( const xAOD::Photon *ph ){ - return true; -}*/ - - -bool TrigEgammaNavTPNtuple::fillMonteCarlo(const xAOD::Egamma *eg){ - - if(m_truthContainer){ - const xAOD::TruthParticle *mc=nullptr; - MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc); - if(mc){ - m_mc_hasMC = true; - m_mc_pt = mc->pt(); - m_mc_eta = mc->eta(); - m_mc_phi = mc->phi(); - m_mc_isTop = mc->isTop(); - m_mc_isQuark = mc->isQuark(); - m_mc_isParton = mc->isParton(); - m_mc_isMeson = mc->isMeson(); - m_mc_isTau = mc->isTau(); - m_mc_isMuon = mc->isMuon(); - m_mc_isPhoton = mc->isPhoton(); - m_mc_isElectron = mc->isElectron(); - if(pdg == MonteCarlo::PDGID::ZMother) m_mc_hasZMother = true; - if(pdg == MonteCarlo::PDGID::WMother) m_mc_hasWMother = true; - return true; - }//has match - }//has truth container - return false; -} - -bool TrigEgammaNavTPNtuple::fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ){ - return TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings); -} - - -bool TrigEgammaNavTPNtuple::fillCaloRings( const xAOD::Electron *el ){ - return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE ); -} - -/* - * book, link, clear, alloc and release method divide in: - * trigger, Egamma and MonteCarlo data base. - */ - -template <class T> -void TrigEgammaNavTPNtuple::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){ - - std::string bname = branch_name; - if (fChain->GetAlias(bname.c_str())) - bname = std::string(fChain->GetAlias(bname.c_str())); - - if (!fChain->FindBranch(bname.c_str()) && message) { - ATH_MSG_WARNING("unknown branch " << bname); - return; - } - fChain->SetBranchStatus(bname.c_str(), 1.); - fChain->SetBranchAddress(bname.c_str(), param); -} - -void TrigEgammaNavTPNtuple::bookEventBranches(TTree *t){ - - t->Branch("RunNumber", &m_runNumber); - t->Branch("EventNumber", &m_eventNumber); - t->Branch("avgmu", &m_avgmu); -} - -void TrigEgammaNavTPNtuple::bookTriggerBranches(TTree *t){ - - // Level L1 cluster - t->Branch( "trig_L1_eta", &m_trig_L1_eta); - t->Branch( "trig_L1_phi", &m_trig_L1_phi); - t->Branch( "trig_L1_emClus", &m_trig_L1_emClus); - t->Branch( "trig_L1_tauClus", &m_trig_L1_tauClus); - t->Branch( "trig_L1_emIsol", &m_trig_L1_emIsol); - t->Branch( "trig_L1_hadIsol", &m_trig_L1_hadIsol); - t->Branch( "trig_L1_thrNames", &m_trig_L1_thrNames); - t->Branch( "trig_L1_accept", &m_trig_L1_accept); - t->Branch( "trig_L2_calo_et", &m_trig_L2_calo_et); - t->Branch( "trig_L2_calo_eta", &m_trig_L2_calo_eta); - t->Branch( "trig_L2_calo_phi", &m_trig_L2_calo_phi); - t->Branch( "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); - t->Branch( "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); - t->Branch( "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); - t->Branch( "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); - t->Branch( "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); - t->Branch( "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); - t->Branch( "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); - t->Branch( "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); - t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); - t->Branch( "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput ); - t->Branch( "trig_L2_calo_rings", &m_trig_L2_calo_rings ); - t->Branch( "trig_L2_calo_accept", &m_trig_L2_calo_accept); - t->Branch( "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); - t->Branch( "trig_L2_el_pt" , &m_trig_L2_el_pt ); - t->Branch( "trig_L2_el_eta", &m_trig_L2_el_eta); - t->Branch( "trig_L2_el_phi", &m_trig_L2_el_phi ); - t->Branch( "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); - t->Branch( "trig_L2_el_charge", &m_trig_L2_el_charge); - t->Branch( "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); - t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); - t->Branch( "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); - t->Branch( "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); - t->Branch( "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); - t->Branch( "trig_L2_el_accept", &m_trig_L2_el_accept ); - t->Branch( "trig_EF_calo_accept", &m_trig_EF_calo_accept); - t->Branch( "trig_EF_calo_et", &m_trig_EF_calo_et); - t->Branch( "trig_EF_calo_eta", &m_trig_EF_calo_eta); - t->Branch( "trig_EF_el_accept", &m_trig_EF_el_accept); -} - -void TrigEgammaNavTPNtuple::bookElectronBranches(TTree *t){ - - t->Branch("el_et", &m_el_et); - t->Branch("el_pt", &m_el_pt); - t->Branch("el_eta", &m_el_eta); - t->Branch("el_phi", &m_el_phi); - t->Branch("el_ethad1", &m_el_ethad1); - t->Branch("el_ehad1", &m_el_ehad1); - t->Branch("el_f1", &m_el_f1); - t->Branch("el_f3", &m_el_f3); - t->Branch("el_f1core", &m_el_f1core); - t->Branch("el_f3core", &m_el_f3core); - t->Branch("el_weta2", &m_el_weta2); - t->Branch("el_d0", &m_el_d0); - t->Branch("el_wtots1", &m_el_wtots1); - t->Branch("el_fracs1", &m_el_fracs1); - t->Branch("el_Reta", &m_el_Reta); - t->Branch("el_Rphi", &m_el_Rphi); - t->Branch("el_Eratio", &m_el_Eratio); - t->Branch("el_Rhad", &m_el_Rhad); - t->Branch("el_Rhad1", &m_el_Rhad1); - t->Branch("el_deta1", &m_el_deta1); - t->Branch("el_deta2", &m_el_deta2); - t->Branch("el_dphi2", &m_el_dphi2); - t->Branch("el_dphiresc", &m_el_dphiresc); - t->Branch("el_dphiresc2", &m_el_dphiresc2); - t->Branch("el_eprobht", &m_el_eprobht); - t->Branch("el_charge", &m_el_charge); - t->Branch("el_nblayerhits", &m_el_nblayerhits); - t->Branch("el_nblayerolhits", &m_el_nblayerolhits); - t->Branch("el_npixhits", &m_el_npixhits); - t->Branch("el_npixolhits", &m_el_npixolhits); - t->Branch("el_nscthits", &m_el_nscthits); - t->Branch("el_nsctolhits", &m_el_nsctolhits); - t->Branch("el_ntrthightreshits", &m_el_ntrthightreshits); - t->Branch("el_ntrthits", &m_el_ntrthits); - t->Branch("el_ntrthighthresolhits", &m_el_ntrthighthresolhits); - t->Branch("el_ntrtolhits", &m_el_ntrtolhits); - t->Branch("el_ntrtxenonhits", &m_el_ntrtxenonhits); - t->Branch("el_expectblayerhit", &m_el_expectblayerhit); - t->Branch("el_nsihits", &m_el_nsihits ); - t->Branch("el_nsideadsensors", &m_el_nsideadsensors ); - t->Branch("el_npixdeadsensors", &m_el_npixdeadsensors ); - t->Branch("el_nsctdeadsensors", &m_el_nsctdeadsensors ); - t->Branch("el_ringsE", &m_el_ringsE ); - t->Branch("el_loose", &m_el_loose ); - t->Branch("el_medium", &m_el_medium ); - t->Branch("el_tight", &m_el_tight ); - t->Branch("el_lhLoose", &m_el_lhLoose ); - t->Branch("el_lhMedium", &m_el_lhMedium ); - t->Branch("el_lhTight", &m_el_lhTight ); - t->Branch("el_rgLoose", &m_el_rgLoose ); - t->Branch("el_rgMedium", &m_el_rgMedium ); - t->Branch("el_rgTight", &m_el_rgTight ); - t->Branch("el_multiLepton", &m_el_multiLepton); - t->Branch("el_nGoodVtx", &m_el_nGoodVtx); - t->Branch("el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); - t->Branch("calo_et", &m_calo_et); - t->Branch("calo_eta", &m_calo_eta); - t->Branch("calo_phi", &m_calo_phi); - -} - - -/*void TrigEgammaNavTPNtuple::bookPhotonBranches(TTree *t){ -} */ - -void TrigEgammaNavTPNtuple::bookMonteCarloBranches(TTree *t){ - // Monte Carlo - t->Branch("mc_hasMC", &m_mc_hasMC); - t->Branch("mc_pt", &m_mc_pt); - t->Branch("mc_eta", &m_mc_eta); - t->Branch("mc_phi", &m_mc_phi); - t->Branch("mc_isTop", &m_mc_isTop); - t->Branch("mc_isParton", &m_mc_isParton); - t->Branch("mc_isMeson", &m_mc_isMeson); - t->Branch("mc_isTau", &m_mc_isTau); - t->Branch("mc_isMuon", &m_mc_isMuon); - t->Branch("mc_isPhoton", &m_mc_isPhoton); - t->Branch("mc_isElectron", &m_mc_isElectron); - t->Branch("mc_hasZMother", &m_mc_hasZMother); - t->Branch("mc_hasWMother", &m_mc_hasWMother); -} - -void TrigEgammaNavTPNtuple::linkEventBranches(TTree *t){ - - InitBranch( t, "RunNumber", &m_runNumber); - InitBranch( t, "EventNumber", &m_eventNumber); - InitBranch( t, "avgmu", &m_avgmu); -} - -void TrigEgammaNavTPNtuple::linkElectronBranches( TTree *t ){ - - InitBranch( t, "el_et", &m_el_et); - InitBranch( t, "el_pt", &m_el_pt); - InitBranch( t, "el_eta", &m_el_eta); - InitBranch( t, "el_phi", &m_el_phi); - InitBranch( t, "el_ethad1", &m_el_ethad1); - InitBranch( t, "el_ehad1", &m_el_ehad1); - InitBranch( t, "el_f1", &m_el_f1); - InitBranch( t, "el_f3", &m_el_f3); - InitBranch( t, "el_f1core", &m_el_f1core); - InitBranch( t, "el_f3core", &m_el_f3core); - InitBranch( t, "el_weta2", &m_el_weta2); - InitBranch( t, "el_d0", &m_el_d0); - InitBranch( t, "el_wtots1", &m_el_wtots1); - InitBranch( t, "el_fracs1", &m_el_fracs1); - InitBranch( t, "el_Reta", &m_el_Reta); - InitBranch( t, "el_Rphi", &m_el_Rphi); - InitBranch( t, "el_Eratio", &m_el_Eratio); - InitBranch( t, "el_Rhad", &m_el_Rhad); - InitBranch( t, "el_Rhad1", &m_el_Rhad1); - InitBranch( t, "el_deta1", &m_el_deta1); - InitBranch( t, "el_deta2", &m_el_deta2); - InitBranch( t, "el_dphi2", &m_el_dphi2); - InitBranch( t, "el_dphiresc", &m_el_dphiresc); - InitBranch( t, "el_dphiresc2", &m_el_dphiresc2); - InitBranch( t, "el_eprobht", &m_el_eprobht); - InitBranch( t, "el_charge", &m_el_charge); - InitBranch( t, "el_nblayerhits", &m_el_nblayerhits); - InitBranch( t, "el_nblayerolhits", &m_el_nblayerolhits); - InitBranch( t, "el_npixhits", &m_el_npixhits); - InitBranch( t, "el_npixolhits", &m_el_npixolhits); - InitBranch( t, "el_nscthits", &m_el_nscthits); - InitBranch( t, "el_nsctolhits", &m_el_nsctolhits); - InitBranch( t, "el_ntrthightreshits", &m_el_ntrthightreshits); - InitBranch( t, "el_ntrthits", &m_el_ntrthits); - InitBranch( t, "el_ntrthighthresolhits", &m_el_ntrthighthresolhits); - InitBranch( t, "el_ntrtolhits", &m_el_ntrtolhits); - InitBranch( t, "el_ntrtxenonhits", &m_el_ntrtxenonhits); - InitBranch( t, "el_expectblayerhit", &m_el_expectblayerhit); - InitBranch( t, "el_nsihits", &m_el_nsihits ); - InitBranch( t, "el_nsideadsensors", &m_el_nsideadsensors ); - InitBranch( t, "el_npixdeadsensors", &m_el_npixdeadsensors ); - InitBranch( t, "el_nsctdeadsensors", &m_el_nsctdeadsensors ); - InitBranch( t, "el_ringsE", &m_el_ringsE ); - InitBranch( t, "el_loose", &m_el_loose ); - InitBranch( t, "el_medium", &m_el_medium ); - InitBranch( t, "el_tight", &m_el_tight ); - InitBranch( t, "el_lhLoose", &m_el_lhLoose ); - InitBranch( t, "el_lhMedium", &m_el_lhMedium ); - InitBranch( t, "el_lhTight", &m_el_lhTight ); - InitBranch( t, "el_rgLoose", &m_el_rgLoose ); - InitBranch( t, "el_rgMedium", &m_el_rgMedium ); - InitBranch( t, "el_rgTight", &m_el_rgTight ); - InitBranch( t, "el_multiLepton", &m_el_multiLepton); - InitBranch( t, "el_nGoodVtx", &m_el_nGoodVtx); - InitBranch( t, "el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); - InitBranch( t, "calo_et", &m_calo_et); - InitBranch( t, "calo_eta", &m_calo_eta); - InitBranch( t, "calo_phi", &m_calo_phi); - -} - - -/*void TrigEgammaNavTPNtuple::linkPhotonBranches( TTree *t ){ -}*/ - -void TrigEgammaNavTPNtuple::linkTriggerBranches( TTree *t ){ - - InitBranch(t, "trig_L1_eta", &m_trig_L1_eta); - InitBranch(t, "trig_L1_phi", &m_trig_L1_phi); - InitBranch(t, "trig_L1_emClus", &m_trig_L1_emClus); - InitBranch(t, "trig_L1_tauClus", &m_trig_L1_tauClus); - InitBranch(t, "trig_L1_emIsol", &m_trig_L1_emIsol); - InitBranch(t, "trig_L1_hadIsol", &m_trig_L1_hadIsol); - InitBranch(t, "trig_L1_thrNames", &m_trig_L1_thrNames); - InitBranch(t, "trig_L1_accept", &m_trig_L1_accept); - InitBranch(t, "trig_L2_calo_et", &m_trig_L2_calo_et); - InitBranch(t, "trig_L2_calo_eta", &m_trig_L2_calo_eta); - InitBranch(t, "trig_L2_calo_phi", &m_trig_L2_calo_phi); - InitBranch(t, "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); - InitBranch(t, "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); - InitBranch(t, "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); - InitBranch(t, "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); - InitBranch(t, "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); - InitBranch(t, "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); - InitBranch(t, "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); - InitBranch(t, "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); - InitBranch(t, "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput ); - InitBranch(t, "trig_L2_calo_rings", &m_trig_L2_calo_rings ); - InitBranch(t, "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); - InitBranch(t, "trig_L2_calo_accept", &m_trig_L2_calo_accept); - - InitBranch(t, "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); - InitBranch(t, "trig_L2_el_pt" , &m_trig_L2_el_pt ); - InitBranch(t, "trig_L2_el_eta", &m_trig_L2_el_eta); - InitBranch(t, "trig_L2_el_phi", &m_trig_L2_el_phi ); - InitBranch(t, "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); - InitBranch(t, "trig_L2_el_charge", &m_trig_L2_el_charge); - InitBranch(t, "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); - InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); - InitBranch(t, "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); - InitBranch(t, "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); - InitBranch(t, "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); - - InitBranch(t, "trig_L2_el_accept", &m_trig_L2_el_accept ); - InitBranch(t, "trig_EF_el_accept", &m_trig_EF_el_accept ); - InitBranch(t, "trig_EF_calo_accept", &m_trig_EF_calo_accept ); - InitBranch(t, "trig_EF_calo_et", &m_trig_EF_calo_et ); - InitBranch(t, "trig_EF_calo_eta", &m_trig_EF_calo_eta ); - -} - - -void TrigEgammaNavTPNtuple::linkMonteCarloBranches(TTree *t){ - - InitBranch(t, "mc_hasMC", &m_mc_hasMC); - InitBranch(t, "mc_pt", &m_mc_pt); - InitBranch(t, "mc_eta", &m_mc_eta); - InitBranch(t, "mc_phi", &m_mc_phi); - InitBranch(t, "mc_isTop", &m_mc_isTop); - InitBranch(t, "mc_isParton", &m_mc_isParton); - InitBranch(t, "mc_isMeson", &m_mc_isMeson); - InitBranch(t, "mc_isTau", &m_mc_isTau); - InitBranch(t, "mc_isMuon", &m_mc_isMuon); - InitBranch(t, "mc_isPhoton", &m_mc_isPhoton); - InitBranch(t, "mc_isElectron", &m_mc_isElectron); - InitBranch(t, "mc_hasZMother", &m_mc_hasZMother); - InitBranch(t, "mc_hasWMother", &m_mc_hasWMother); -} - -void TrigEgammaNavTPNtuple::clear(){ - - ///EventInfo - m_runNumber = 0; - m_eventNumber = 0; - m_avgmu = 0; - ///Egamma - m_el_et = -1; - m_el_pt = -1; - m_el_eta = -1; - m_el_phi = -1; - m_el_ethad1 = -1; - m_el_ehad1 = -1; - m_el_f1 = -1; - m_el_f3 = -1; - m_el_f1core = -1; - m_el_f3core = -1; - m_el_weta2 = -1; - m_el_d0 = -1; - m_el_wtots1 = -1; - m_el_fracs1 = -1; - m_el_Reta = -1; - m_el_Rphi = -1; - m_el_Eratio = -1; - m_el_Rhad = -1; - m_el_Rhad1 = -1; - m_el_deta1 = -1; - m_el_deta2 = -1; - m_el_dphi2 = -1; - m_el_dphiresc = -1; - m_el_dphiresc2 = -1; - m_el_eprobht = -1; - m_el_charge = 0; - m_el_nblayerhits = 0; - m_el_nblayerolhits = 0; - m_el_npixhits = 0; - m_el_npixolhits = 0; - m_el_nscthits = 0; - m_el_nsctolhits = 0; - m_el_ntrthightreshits = 0; - m_el_ntrthits = 0; - m_el_ntrthighthresolhits= 0; - m_el_ntrtolhits = 0; - m_el_ntrtxenonhits = 0; - m_el_expectblayerhit = false; - m_el_nsihits = 0; - m_el_nsideadsensors = 0; - m_el_npixdeadsensors = 0; - m_el_nsctdeadsensors = 0; - m_el_loose = false; - m_el_medium = false; - m_el_tight = false; - m_el_lhLoose = false; - m_el_lhMedium = false; - m_el_lhTight = false; - m_el_rgLoose = false; - m_el_rgMedium = false; - m_el_rgTight = false; - m_el_multiLepton = false; - m_el_nGoodVtx = -1; - m_el_nPileupPrimaryVtx = -1; - m_calo_et = -1; - m_calo_eta = -1; - m_calo_phi = -1; - - ///Trigger - m_trig_L1_eta = -1; - m_trig_L1_phi = -1; - m_trig_L1_emClus = -1; - m_trig_L1_tauClus = -1; - m_trig_L1_emIsol = -1; - m_trig_L1_hadIsol = -1; - m_trig_L1_accept = false; - m_trig_L2_calo_et = -1; - m_trig_L2_calo_eta = -1; - m_trig_L2_calo_phi = -1; - m_trig_L2_calo_e237 = -1; - m_trig_L2_calo_e277 = -1; - m_trig_L2_calo_fracs1 = -1; - m_trig_L2_calo_weta2 = -1; - m_trig_L2_calo_ehad1 = -1; - m_trig_L2_calo_emaxs1 = -1; - m_trig_L2_calo_e2tsts1 = -1; - m_trig_L2_calo_wstot = -1; - m_trig_L2_calo_rnnOutput = 999; - - m_trig_L1_accept = false; - m_trig_L2_calo_accept = false; - m_trig_L2_el_accept = false; - m_trig_EF_calo_accept = false; - m_trig_EF_el_accept = false; - - ///Monte Carlo - m_mc_hasMC = false; - m_mc_pt = -1; - m_mc_eta = -1; - m_mc_phi = -1; - m_mc_isTop = false; - m_mc_isParton = false; - m_mc_isMeson = false; - m_mc_isTau = false; - m_mc_isMuon = false; - m_mc_isPhoton = false; - m_mc_isElectron = false; - m_mc_hasZMother = false; - m_mc_hasWMother = false; - - ///Some vectors - m_trig_L1_thrNames ->clear(); - m_trig_L2_calo_energySample ->clear(); - m_trig_L2_calo_rings ->clear(); - - m_trig_L2_el_trackAlgID ->clear(); - m_trig_L2_el_eta ->clear(); - m_trig_L2_el_phi ->clear(); - m_trig_L2_el_caloEta ->clear(); - m_trig_L2_el_trkClusDeta ->clear(); - m_trig_L2_el_trkClusDphi ->clear(); - m_trig_L2_el_pt ->clear(); - m_trig_L2_el_etOverPt ->clear(); - m_trig_L2_el_nTRTHits ->clear(); - m_trig_L2_el_nTRTHiThresholdHits ->clear(); - m_trig_L2_el_charge ->clear(); - m_trig_EF_calo_et ->clear(); - m_trig_EF_calo_eta ->clear(); - - -} - -void TrigEgammaNavTPNtuple::alloc_space(){ - - m_el_ringsE = new std::vector<float>(); - m_trig_L1_thrNames = new std::vector<std::string>(); - m_trig_L2_calo_energySample = new std::vector<float>(); - m_trig_L2_calo_rings = new std::vector<float>(); - m_trig_L2_el_trackAlgID = new std::vector<int>(); - m_trig_L2_el_eta = new std::vector<float>(); - m_trig_L2_el_phi = new std::vector<float>(); - m_trig_L2_el_caloEta = new std::vector<float>(); - m_trig_L2_el_trkClusDeta = new std::vector<float>(); - m_trig_L2_el_trkClusDphi = new std::vector<float>(); - m_trig_L2_el_pt = new std::vector<float>(); - m_trig_L2_el_etOverPt = new std::vector<float>(); - m_trig_L2_el_nTRTHits = new std::vector<float>(); - m_trig_L2_el_nTRTHiThresholdHits = new std::vector<float>(); - m_trig_L2_el_charge = new std::vector<float>(); - m_trig_EF_calo_et = new std::vector<float>(); - m_trig_EF_calo_eta = new std::vector<float>(); - -} - - -void TrigEgammaNavTPNtuple::release_space(){ - delete m_el_ringsE ; - delete m_trig_L1_thrNames ; - delete m_trig_L2_calo_energySample; - delete m_trig_L2_calo_rings ; - delete m_trig_L2_el_trackAlgID ; - delete m_trig_L2_el_pt ; - delete m_trig_L2_el_eta ; - delete m_trig_L2_el_caloEta ; - delete m_trig_L2_el_phi ; - delete m_trig_L2_el_charge ; - delete m_trig_L2_el_nTRTHits ; - delete m_trig_L2_el_nTRTHiThresholdHits ; - delete m_trig_L2_el_etOverPt ; - delete m_trig_L2_el_trkClusDeta ; - delete m_trig_L2_el_trkClusDphi ; - delete m_trig_EF_calo_et ; - delete m_trig_EF_calo_eta ; -} - -unsigned TrigEgammaNavTPNtuple::count_HLT_objects( const HLT::TriggerElement *feat ) -{ - unsigned nobj=0; - if(getFeature<xAOD::ElectronContainer>(feat) ) nobj++; // HLT - if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj++; // EFCalo - if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj++; // L2 - if(getFeature<xAOD::TrigEMCluster>(feat) ) nobj++; // L2Calo - ATH_MSG_DEBUG("Number of objects counted in this feature: " << nobj); - return nobj; -} diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx new file mode 100644 index 000000000000..3c63338f5693 --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx @@ -0,0 +1,1155 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#include <iostream> +#include "TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h" +using namespace std; + +TrigEgammaPhysValBase::TrigEgammaPhysValBase(){ + + m_el_ringsE=nullptr; + m_trig_L1_thrNames=nullptr; + m_trig_L2_calo_energySample=nullptr; + m_trig_L2_calo_rings=nullptr; + m_trig_L2_el_trackAlgID=nullptr; + m_trig_L2_el_pt=nullptr; + m_trig_L2_el_eta=nullptr; + m_trig_L2_el_caloEta=nullptr; + m_trig_L2_el_phi=nullptr; + m_trig_L2_el_charge=nullptr; + m_trig_L2_el_nTRTHits=nullptr; + m_trig_L2_el_nTRTHiThresholdHits=nullptr; + m_trig_L2_el_etOverPt=nullptr; + m_trig_L2_el_trkClusDeta=nullptr; + m_trig_L2_el_trkClusDphi=nullptr; + m_trig_EF_calo_et=nullptr; + m_trig_EF_calo_eta=nullptr; + + m_doMCDetailed=false; + m_doL2Detailed=false; + m_doL2CaloDetailed=false; + m_doRecoDetailed=false; +} + +/* + * book, link, clear, alloc and release method divide in: + * trigger, Egamma and MonteCarlo data base. + */ +template <class T> +void TrigEgammaPhysValBase::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){ + + std::string bname = branch_name; + if (fChain->GetAlias(bname.c_str())) + bname = std::string(fChain->GetAlias(bname.c_str())); + + if (!fChain->FindBranch(bname.c_str()) && message) { + std::cout << "[WARNING] unknown branch " << bname << std::endl; + return; + } + fChain->SetBranchStatus(bname.c_str(), 1.); + fChain->SetBranchAddress(bname.c_str(), param); +} + +void TrigEgammaPhysValBase::bookEventBranches(TTree *t){ + + t->Branch("RunNumber", &m_runNumber); + t->Branch("EventNumber", &m_eventNumber); + t->Branch("LumiBlock", &m_lumiBlock); + t->Branch("avgmu", &m_avgmu); +} + +void TrigEgammaPhysValBase::bookTriggerBranches(TTree *t){ + + // Level L1 cluster + //t->Branch( "trig_isPrescaled", &m_trig_isPrescaled); + t->Branch( "trig_L1_eta", &m_trig_L1_eta); + t->Branch( "trig_L1_phi", &m_trig_L1_phi); + t->Branch( "trig_L1_emClus", &m_trig_L1_emClus); + t->Branch( "trig_L1_tauClus", &m_trig_L1_tauClus); + t->Branch( "trig_L1_emIsol", &m_trig_L1_emIsol); + t->Branch( "trig_L1_hadIsol", &m_trig_L1_hadIsol); + t->Branch( "trig_L1_hadCore", &m_trig_L1_hadCore); + t->Branch( "trig_L2_calo_et", &m_trig_L2_calo_et); + t->Branch( "trig_L2_calo_eta", &m_trig_L2_calo_eta); + t->Branch( "trig_L2_calo_phi", &m_trig_L2_calo_phi); + + if(m_doL2CaloDetailed){ + t->Branch( "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); + t->Branch( "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); + t->Branch( "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); + t->Branch( "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); + t->Branch( "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); + t->Branch( "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); + t->Branch( "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); + t->Branch( "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); + t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample); + } + + t->Branch( "trig_L2_calo_rings", &m_trig_L2_calo_rings ); + t->Branch( "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput ); + + + if(m_doL2Detailed){ + t->Branch( "trig_L2_el_pt" , &m_trig_L2_el_pt ); + t->Branch( "trig_L2_el_eta", &m_trig_L2_el_eta); + t->Branch( "trig_L2_el_phi", &m_trig_L2_el_phi ); + t->Branch( "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); + t->Branch( "trig_L2_el_charge", &m_trig_L2_el_charge); + t->Branch( "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); + t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); + t->Branch( "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); + t->Branch( "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); + t->Branch( "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); + t->Branch( "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); + } + + t->Branch( "trig_EF_calo_e", &m_trig_EF_calo_e ); + t->Branch( "trig_EF_calo_et", &m_trig_EF_calo_et ); + t->Branch( "trig_EF_calo_eta", &m_trig_EF_calo_eta ); + t->Branch( "trig_EF_calo_phi", &m_trig_EF_calo_phi ); + t->Branch( "trig_EF_calo_etaBE2", &m_trig_EF_calo_etaBE2 ); + +#define BRANCH(_name_) t->Branch( #_name_ , & m_##_name_ );\ + + BRANCH( trig_EF_calo_tight ); + BRANCH( trig_EF_calo_medium ); + BRANCH( trig_EF_calo_loose ); + BRANCH( trig_EF_calo_lhtight ); + BRANCH( trig_EF_calo_lhmedium ); + BRANCH( trig_EF_calo_lhloose ); + BRANCH( trig_EF_calo_lhvloose ); + + BRANCH( trig_EF_el_calo_e ); + BRANCH( trig_EF_el_calo_et ); + BRANCH( trig_EF_el_calo_eta ); + BRANCH( trig_EF_el_calo_phi ); + BRANCH( trig_EF_el_calo_etaBE2 ); + + BRANCH( trig_EF_el_hasCalo ); + BRANCH( trig_EF_el_hasTrack ); + BRANCH( trig_EF_el_e ); + BRANCH( trig_EF_el_et ); + BRANCH( trig_EF_el_eta ); + BRANCH( trig_EF_el_phi ); + BRANCH( trig_EF_el_e277 ); + BRANCH( trig_EF_el_ethad1 ); + BRANCH( trig_EF_el_ehad1 ); + BRANCH( trig_EF_el_f1 ); + BRANCH( trig_EF_el_f3 ); + BRANCH( trig_EF_el_f1core ); + BRANCH( trig_EF_el_f3core ); + BRANCH( trig_EF_el_weta1 ); + BRANCH( trig_EF_el_weta2 ); + BRANCH( trig_EF_el_wtots1 ); + BRANCH( trig_EF_el_fracs1 ); + BRANCH( trig_EF_el_Reta ); + BRANCH( trig_EF_el_Rphi ); + BRANCH( trig_EF_el_Eratio ); + BRANCH( trig_EF_el_Rhad ); + BRANCH( trig_EF_el_Rhad1 ); + BRANCH( trig_EF_el_deta2 ); + BRANCH( trig_EF_el_dphi2 ); + BRANCH( trig_EF_el_dphiresc ); + BRANCH( trig_EF_el_deltaPhiRescaled2 ); + BRANCH( trig_EF_el_deltaEta1 ); + BRANCH( trig_EF_el_deltaE ); + BRANCH( trig_EF_el_etCone ); + BRANCH( trig_EF_el_ptCone ); + + BRANCH( trig_EF_el_trk_pt ); + BRANCH( trig_EF_el_trk_eta ); + BRANCH( trig_EF_el_trk_charge ); + BRANCH( trig_EF_el_trk_qOverP ); + BRANCH( trig_EF_el_trk_sigd0 ); + BRANCH( trig_EF_el_trk_d0 ); + BRANCH( trig_EF_el_trk_eProbabilityHT ); + BRANCH( trig_EF_el_trk_transformed_eProbabilityHT ); + BRANCH( trig_EF_el_trk_d0significance ); + BRANCH( trig_EF_el_trk_deltaPOverP ); + BRANCH( trig_EF_el_trk_summaryValues ); + + BRANCH( trig_EF_el_tight ); + BRANCH( trig_EF_el_medium ); + BRANCH( trig_EF_el_loose ); + BRANCH( trig_EF_el_lhtight ); + BRANCH( trig_EF_el_lhmedium ); + BRANCH( trig_EF_el_lhloose ); + BRANCH( trig_EF_el_lhvloose ); + + +/* + BRANCH( trig_EF_el_nblayerhits ); + BRANCH( trig_EF_el_nblayerolhits ); + BRANCH( trig_EF_el_npixhits ); + BRANCH( trig_EF_el_npixolhits ); + BRANCH( trig_EF_el_nscthits ); + BRANCH( trig_EF_el_nsctolhits ); + BRANCH( trig_EF_el_ntrthightreshits ); + BRANCH( trig_EF_el_ntrthits ); + BRANCH( trig_EF_el_ntrthighthresolhits ); + BRANCH( trig_EF_el_ntrtolhits ); + BRANCH( trig_EF_el_ntrtxenonhits ); + BRANCH( trig_EF_el_expectblayerhit ); + BRANCH( trig_EF_el_npixdeadsensors ); + BRANCH( trig_EF_el_nsctdeadsensors ); + BRANCH( trig_EF_el_expectNextToInnerMostLayer ); + BRANCH( trig_EF_el_nNextToInnerMostLayerHits ); + BRANCH( trig_EF_el_nNextToInnerMostLayerOutliers); + */ + +#undef BRANCH + + + +} + + + +void TrigEgammaPhysValBase::bookElectronBranches(TTree *t){ + + t->Branch("el_calo_e", &m_el_calo_e); + t->Branch("el_calo_et", &m_el_calo_et); + t->Branch("el_calo_eta", &m_el_calo_eta); + t->Branch("el_calo_etaBE2", &m_el_calo_etaBE2); + t->Branch("el_calo_phi", &m_el_calo_phi); + + t->Branch("el_hasCalo", &m_el_hasCalo ); + t->Branch("el_hasTrack", &m_el_hasTrack ); + t->Branch("el_e", &m_el_e ); + t->Branch("el_et", &m_el_et ); + t->Branch("el_eta", &m_el_eta ); + t->Branch("el_phi", &m_el_phi ); + + if(m_doRecoDetailed){ + t->Branch("el_ethad1", &m_el_ethad1); + t->Branch("el_ehad1", &m_el_ehad1); + t->Branch("el_e277", &m_el_e277); + t->Branch("el_f1", &m_el_f1); + t->Branch("el_f3", &m_el_f3); + t->Branch("el_f1core", &m_el_f1core); + t->Branch("el_f3core", &m_el_f3core); + t->Branch("el_weta1", &m_el_weta1); + t->Branch("el_weta2", &m_el_weta2); + t->Branch("el_wtots1", &m_el_wtots1); + t->Branch("el_fracs1", &m_el_fracs1); + t->Branch("el_Reta", &m_el_Reta); + t->Branch("el_Rphi", &m_el_Rphi); + t->Branch("el_Eratio", &m_el_Eratio); + t->Branch("el_Rhad", &m_el_Rhad); + t->Branch("el_Rhad1", &m_el_Rhad1); + t->Branch("el_deta2", &m_el_deta2); + t->Branch("el_dphi2", &m_el_dphi2); + t->Branch("el_dphiresc", &m_el_dphiresc); + t->Branch("el_deltaPhiRescaled2" , &m_el_deltaPhiRescaled2 ); + t->Branch("el_deltaEta1" , &m_el_deltaEta1 ); + t->Branch("el_deltaE", &m_el_deltaE ); + t->Branch("el_etCone" , &m_el_etCone ); + t->Branch("el_ptCone" , &m_el_ptCone ); + + + t->Branch("el_trk_pt", &m_el_trk_pt ); + t->Branch("el_trk_eta", &m_el_trk_eta ); + t->Branch("el_trk_charge", &m_el_trk_charge); + t->Branch("el_trk_qOverP", &m_el_trk_qOverP); + t->Branch("el_trk_sigd0" , &m_el_trk_sigd0 ); + t->Branch("el_trk_d0" , &m_el_trk_d0 ); + t->Branch("el_trk_eProbabilityHT" , &m_el_trk_eProbabilityHT ); + t->Branch("el_trk_transformed_eProbabilityHT", &m_el_trk_transformed_eProbabilityHT); + t->Branch("el_trk_d0significance" , &m_el_trk_d0significance ); + t->Branch("el_trk_deltaPOverP" , &m_el_trk_deltaPOverP ); + t->Branch("el_trk_summaryValues" , &m_el_trk_summaryValues ); + } + + t->Branch("el_ringsE", &m_el_ringsE ); + t->Branch("el_nGoodVtx", &m_el_nGoodVtx); + t->Branch("el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); + + + t->Branch("el_loose", &m_el_loose ); + t->Branch("el_medium", &m_el_medium ); + t->Branch("el_tight", &m_el_tight ); + t->Branch("el_lhvloose", &m_el_lhVLoose ); + t->Branch("el_lhloose", &m_el_lhLoose ); + t->Branch("el_lhmedium", &m_el_lhMedium ); + t->Branch("el_lhtight", &m_el_lhTight ); + t->Branch("el_multiLepton", &m_el_multiLepton); + + + +} + + +void TrigEgammaPhysValBase::createTDTMetadata( TTree *t, std::vector<std::string> trigList ){ + + std::vector<std::string> *trig_tdt_triggerList; + t->Branch("trig_tdt_triggerList", &trig_tdt_triggerList ); + trig_tdt_triggerList = new std::vector<std::string>(); + for(auto& trigger : trigList ){ + trig_tdt_triggerList->push_back(trigger); + } + t->Fill(); + delete trig_tdt_triggerList; +} + + +void TrigEgammaPhysValBase::bookTDTBranches(TTree *t){ + + t->Branch("trig_tdt_L1_calo_accept", &m_trig_tdt_L1_calo_accept); + t->Branch("trig_tdt_L2_calo_accept", &m_trig_tdt_L2_calo_accept); + t->Branch("trig_tdt_L2_el_accept", &m_trig_tdt_L2_el_accept ); + t->Branch("trig_tdt_EF_calo_accept", &m_trig_tdt_EF_calo_accept); + t->Branch("trig_tdt_EF_el_accept", &m_trig_tdt_EF_el_accept ); + t->Branch("trig_tdt_emu_L1_calo_accept", &m_trig_tdt_emu_L1_calo_accept); + t->Branch("trig_tdt_emu_L2_calo_accept", &m_trig_tdt_emu_L2_calo_accept); + t->Branch("trig_tdt_emu_L2_el_accept", &m_trig_tdt_emu_L2_el_accept ); + t->Branch("trig_tdt_emu_EF_calo_accept", &m_trig_tdt_emu_EF_calo_accept); + t->Branch("trig_tdt_emu_EF_el_accept", &m_trig_tdt_emu_EF_el_accept ); + +} + + +/*void TrigEgammaPhysValBase::bookPhotonBranches(TTree *t){ +} */ + +void TrigEgammaPhysValBase::bookMonteCarloBranches(TTree *t){ + // Monte Carlo + t->Branch("mc_hasMC", &m_mc_hasMC); + t->Branch("mc_pt", &m_mc_pt); + t->Branch("mc_eta", &m_mc_eta); + t->Branch("mc_phi", &m_mc_phi); + + if(m_doMCDetailed){ + t->Branch("mc_isTop", &m_mc_isTop); + t->Branch("mc_isParton", &m_mc_isParton); + t->Branch("mc_isMeson", &m_mc_isMeson); + t->Branch("mc_isTau", &m_mc_isTau); + t->Branch("mc_isMuon", &m_mc_isMuon); + } + + t->Branch("mc_isPhoton", &m_mc_isPhoton); + t->Branch("mc_isElectron", &m_mc_isElectron); + t->Branch("mc_hasZMother", &m_mc_hasZMother); + t->Branch("mc_hasWMother", &m_mc_hasWMother); +} + + +void TrigEgammaPhysValBase::linkTDTBranches(TTree *t){ + + InitBranch( t, "trig_tdt_L1_calo_accept", &m_trig_tdt_L1_calo_accept); + InitBranch( t, "trig_tdt_L2_calo_accept", &m_trig_tdt_L2_calo_accept); + InitBranch( t, "trig_tdt_L2_el_accept", &m_trig_tdt_L2_el_accept ); + InitBranch( t, "trig_tdt_EF_calo_accept", &m_trig_tdt_EF_calo_accept); + InitBranch( t, "trig_tdt_EF_el_accept", &m_trig_tdt_EF_el_accept ); + InitBranch( t, "trig_tdt_emu_L1_calo_accept", &m_trig_tdt_emu_L1_calo_accept); + InitBranch( t, "trig_tdt_emu_L2_calo_accept", &m_trig_tdt_emu_L2_calo_accept); + InitBranch( t, "trig_tdt_emu_L2_el_accept", &m_trig_tdt_emu_L2_el_accept ); + InitBranch( t, "trig_tdt_emu_EF_calo_accept", &m_trig_tdt_emu_EF_calo_accept); + InitBranch( t, "trig_tdt_emu_EF_el_accept", &m_trig_tdt_emu_EF_el_accept ); + +} + + + +void TrigEgammaPhysValBase::linkEventBranches(TTree *t){ + + InitBranch( t, "RunNumber", &m_runNumber); + InitBranch( t, "EventNumber", &m_eventNumber); + InitBranch( t, "LumiBlock", &m_lumiBlock); + InitBranch( t, "avgmu", &m_avgmu); +} + +void TrigEgammaPhysValBase::linkElectronBranches( TTree *t ){ + + InitBranch( t, "el_calo_e", &m_el_calo_e); + InitBranch( t, "el_calo_et", &m_el_calo_et); + InitBranch( t, "el_calo_eta", &m_el_calo_eta); + InitBranch( t, "el_calo_etaBE2", &m_el_calo_etaBE2); + InitBranch( t, "el_calo_phi", &m_el_calo_phi); + + InitBranch( t, "el_hasCalo", &m_el_hasCalo); + InitBranch( t, "el_hasTrack", &m_el_hasTrack); + InitBranch( t, "el_e", &m_el_e); + InitBranch( t, "el_et", &m_el_et); + InitBranch( t, "el_eta", &m_el_eta); + InitBranch( t, "el_phi", &m_el_phi); + + + if(m_doRecoDetailed){ + InitBranch( t, "el_ethad1", &m_el_ethad1); + InitBranch( t, "el_ehad1", &m_el_ehad1); + InitBranch( t, "el_f1", &m_el_f1); + InitBranch( t, "el_f3", &m_el_f3); + InitBranch( t, "el_f1core", &m_el_f1core); + InitBranch( t, "el_f3core", &m_el_f3core); + InitBranch( t, "el_weta1", &m_el_weta2); + InitBranch( t, "el_weta2", &m_el_weta2); + InitBranch( t, "el_wtots1", &m_el_wtots1); + InitBranch( t, "el_fracs1", &m_el_fracs1); + InitBranch( t, "el_Reta", &m_el_Reta); + InitBranch( t, "el_Rphi", &m_el_Rphi); + InitBranch( t, "el_Eratio", &m_el_Eratio); + InitBranch( t, "el_Rhad", &m_el_Rhad); + InitBranch( t, "el_Rhad1", &m_el_Rhad1); + InitBranch( t, "el_deta2", &m_el_deta2); + InitBranch( t, "el_dphi2", &m_el_dphi2); + InitBranch( t, "el_dphiresc", &m_el_dphiresc); + InitBranch( t, "el_deltaPhiRescaled2" , &m_el_deltaPhiRescaled2 ); + InitBranch( t, "el_e277" , &m_el_e277 ); + InitBranch( t, "el_deltaE" , &m_el_e277 ); + InitBranch( t, "el_deltaEta1" , &m_el_deltaEta1 ); + InitBranch( t, "el_etCone" , &m_el_etCone ); + InitBranch( t, "el_ptCone" , &m_el_ptCone ); + + InitBranch( t, "el_trk_pt", &m_el_trk_pt); + InitBranch( t, "el_trk_eta" , &m_el_trk_eta); + InitBranch( t, "el_trk_charge", &m_el_trk_charge); + InitBranch( t, "el_trk_qOverP", &m_el_trk_qOverP); + InitBranch( t, "el_trk_deltaPOverP" , &m_el_trk_deltaPOverP ); + InitBranch( t, "el_trk_sigd0" , &m_el_trk_sigd0 ); + InitBranch( t, "el_trk_d0" , &m_el_trk_d0 ); + InitBranch( t, "el_trk_eProbabilityHT" , &m_el_trk_eProbabilityHT ); + InitBranch( t, "el_trk_transformed_eProbabilityHT", &m_el_trk_transformed_eProbabilityHT); + InitBranch( t, "el_trk_d0significance" , &m_el_trk_d0significance ); + InitBranch( t, "el_trk_summaryValues" , &m_el_trk_summaryValues ); + + + + } + + InitBranch( t, "el_nGoodVtx", &m_el_nGoodVtx); + InitBranch( t, "el_ringsE", &m_el_ringsE ); + InitBranch( t, "el_nPileupPrimaryVtx", &m_el_nPileupPrimaryVtx); + + InitBranch( t, "el_loose", &m_el_loose ); + InitBranch( t, "el_medium", &m_el_medium ); + InitBranch( t, "el_tight", &m_el_tight ); + InitBranch( t, "el_lhvloose", &m_el_lhVLoose ); + InitBranch( t, "el_lhloose", &m_el_lhLoose ); + InitBranch( t, "el_lhmedium", &m_el_lhMedium ); + InitBranch( t, "el_lhtight", &m_el_lhTight ); + InitBranch( t, "el_multiLepton", &m_el_multiLepton); + /* + InitBranch( t, "el_nblayerhits", &m_el_nblayerhits); + InitBranch( t, "el_nblayerolhits", &m_el_nblayerolhits); + InitBranch( t, "el_npixhits", &m_el_npixhits); + InitBranch( t, "el_npixolhits", &m_el_npixolhits); + InitBranch( t, "el_npixdeadsensors", &m_el_npixdeadsensors ); + InitBranch( t, "el_nscthits", &m_el_nscthits); + InitBranch( t, "el_nsctolhits", &m_el_nsctolhits); + InitBranch( t, "el_nsctdeadsensors", &m_el_nsctdeadsensors ); + InitBranch( t, "el_ntrthits", &m_el_ntrthits); + InitBranch( t, "el_ntrtolhits", &m_el_ntrtolhits); + InitBranch( t, "el_ntrthighthreshits", &m_el_ntrthighthreshits); + InitBranch( t, "el_ntrthighthresolhits", &m_el_ntrthighthresolhits); + InitBranch( t, "el_ntrtxenonhits", &m_el_ntrtxenonhits); + InitBranch( t, "el_expectblayerhit", &m_el_expectblayerhit); + */ + + + + +} + + +/*void TrigEgammaPhysValBase::linkPhotonBranches( TTree *t ){ +}*/ + +void TrigEgammaPhysValBase::linkTriggerBranches( TTree *t ){ + + //InitBranch(t, "trig_isPrescaled", &m_trig_isPrescaled); + InitBranch(t, "trig_L1_eta", &m_trig_L1_eta); + InitBranch(t, "trig_L1_phi", &m_trig_L1_phi); + InitBranch(t, "trig_L1_emClus", &m_trig_L1_emClus); + InitBranch(t, "trig_L1_tauClus", &m_trig_L1_tauClus); + InitBranch(t, "trig_L1_emIsol", &m_trig_L1_emIsol); + InitBranch(t, "trig_L1_hadIsol", &m_trig_L1_hadIsol); + InitBranch(t, "trig_L1_hadCore", &m_trig_L1_hadCore); + //InitBranch(t, "trig_L1_thrNames", &m_trig_L1_thrNames); + InitBranch(t, "trig_L2_calo_et", &m_trig_L2_calo_et); + InitBranch(t, "trig_L2_calo_eta", &m_trig_L2_calo_eta); + InitBranch(t, "trig_L2_calo_phi", &m_trig_L2_calo_phi); + + if(m_doL2CaloDetailed){ + InitBranch(t, "trig_L2_calo_e237", &m_trig_L2_calo_e237 ); + InitBranch(t, "trig_L2_calo_e277", &m_trig_L2_calo_e277 ); + InitBranch(t, "trig_L2_calo_fracs1", &m_trig_L2_calo_fracs1); + InitBranch(t, "trig_L2_calo_weta2", &m_trig_L2_calo_weta2); + InitBranch(t, "trig_L2_calo_ehad1", &m_trig_L2_calo_ehad1); + InitBranch(t, "trig_L2_calo_emaxs1", &m_trig_L2_calo_emaxs1); + InitBranch(t, "trig_L2_calo_e2tsts1", &m_trig_L2_calo_e2tsts1); + InitBranch(t, "trig_L2_calo_wstot", &m_trig_L2_calo_wstot); + InitBranch(t, "trig_L2_calo_energySample", &m_trig_L2_calo_energySample); + } + + InitBranch(t, "trig_L2_calo_rings", &m_trig_L2_calo_rings ); + InitBranch(t, "trig_L2_calo_rnnOutput", &m_trig_L2_calo_rnnOutput); + + if(m_doL2Detailed){ + InitBranch(t, "trig_L2_el_trackAlgID" , &m_trig_L2_el_trackAlgID ); + InitBranch(t, "trig_L2_el_pt" , &m_trig_L2_el_pt ); + InitBranch(t, "trig_L2_el_eta", &m_trig_L2_el_eta); + InitBranch(t, "trig_L2_el_phi", &m_trig_L2_el_phi ); + InitBranch(t, "trig_L2_el_caloEta", &m_trig_L2_el_caloEta ); + InitBranch(t, "trig_L2_el_charge", &m_trig_L2_el_charge); + InitBranch(t, "trig_L2_el_nTRTHits", &m_trig_L2_el_nTRTHits); + InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits); + InitBranch(t, "trig_L2_el_etOverPt" , &m_trig_L2_el_etOverPt ); + InitBranch(t, "trig_L2_el_trkClusDeta" , &m_trig_L2_el_trkClusDeta ); + InitBranch(t, "trig_L2_el_trkClusDphi" , &m_trig_L2_el_trkClusDphi ); + + } + + + +#define INIT(_name_) TrigEgammaPhysValBase::InitBranch(t, #_name_, & m_##_name_);\ + + INIT( trig_EF_calo_et ); + INIT( trig_EF_calo_eta ); + INIT( trig_EF_calo_phi ); + INIT( trig_EF_calo_etaBE2 ); + INIT( trig_EF_calo_e ); + + INIT( trig_EF_el_calo_e ); + INIT( trig_EF_el_calo_et ); + INIT( trig_EF_el_calo_eta ); + INIT( trig_EF_el_calo_phi ); + INIT( trig_EF_el_calo_etaBE2 ); + + INIT( trig_EF_el_hasCalo ); + INIT( trig_EF_el_hasTrack ); + INIT( trig_EF_el_et ); + INIT( trig_EF_el_eta ); + INIT( trig_EF_el_phi ); + INIT( trig_EF_el_e ); + INIT( trig_EF_el_ethad1 ); + INIT( trig_EF_el_ehad1 ); + INIT( trig_EF_el_f1 ); + INIT( trig_EF_el_f3 ); + INIT( trig_EF_el_f1core ); + INIT( trig_EF_el_f3core ); + INIT( trig_EF_el_weta1 ); + INIT( trig_EF_el_weta2 ); + INIT( trig_EF_el_wtots1 ); + INIT( trig_EF_el_fracs1 ); + INIT( trig_EF_el_Reta ); + INIT( trig_EF_el_Rphi ); + INIT( trig_EF_el_Eratio ); + INIT( trig_EF_el_Rhad ); + INIT( trig_EF_el_Rhad1 ); + INIT( trig_EF_el_deta2 ); + INIT( trig_EF_el_dphi2 ); + INIT( trig_EF_el_e277 ); + INIT( trig_EF_el_deltaE ); + INIT( trig_EF_el_dphiresc ); + INIT( trig_EF_el_deltaPhiRescaled2 ); + INIT( trig_EF_el_deltaEta1 ); + INIT( trig_EF_el_etCone ); + INIT( trig_EF_el_ptCone ); + + INIT( trig_EF_el_trk_pt ); + INIT( trig_EF_el_trk_eta ); + INIT( trig_EF_el_trk_charge ); + INIT( trig_EF_el_trk_qOverP ); + INIT( trig_EF_el_trk_sigd0 ); + INIT( trig_EF_el_trk_d0 ); + INIT( trig_EF_el_trk_eProbabilityHT ); + INIT( trig_EF_el_trk_transformed_eProbabilityHT ); + INIT( trig_EF_el_trk_d0significance ); + INIT( trig_EF_el_trk_deltaPOverP ); + INIT( trig_EF_el_trk_summaryValues ); + + INIT( trig_EF_calo_tight ); + INIT( trig_EF_calo_medium ); + INIT( trig_EF_calo_loose ); + INIT( trig_EF_calo_lhtight ); + INIT( trig_EF_calo_lhmedium ); + INIT( trig_EF_calo_lhloose ); + INIT( trig_EF_calo_lhvloose ); + INIT( trig_EF_el_tight ); + INIT( trig_EF_el_medium ); + INIT( trig_EF_el_loose ); + INIT( trig_EF_el_lhtight ); + INIT( trig_EF_el_lhmedium ); + INIT( trig_EF_el_lhloose ); + INIT( trig_EF_el_lhvloose ); + + /* + INIT( trig_EF_el_nblayerhits ); + INIT( trig_EF_el_nblayerolhits ); + INIT( trig_EF_el_npixhits ); + INIT( trig_EF_el_npixolhits ); + INIT( trig_EF_el_nscthits ); + INIT( trig_EF_el_nsctolhits ); + INIT( trig_EF_el_ntrthightreshits ); + INIT( trig_EF_el_ntrthits ); + INIT( trig_EF_el_ntrthighthresolhits ); + INIT( trig_EF_el_ntrtolhits ); + INIT( trig_EF_el_ntrtxenonhits ); + INIT( trig_EF_el_expectblayerhit ); + INIT( trig_EF_el_npixdeadsensors ); + INIT( trig_EF_el_nsctdeadsensors ); + INIT( trig_EF_el_expectNextToInnerMostLayer ); + INIT( trig_EF_el_nNextToInnerMostLayerHits ); + INIT( trig_EF_el_nNextToInnerMostLayerOutliers); + */ + + + + +#undef INIT + + +} + + + +void TrigEgammaPhysValBase::linkMonteCarloBranches(TTree *t){ + + InitBranch(t, "mc_hasMC", &m_mc_hasMC); + InitBranch(t, "mc_pt", &m_mc_pt); + InitBranch(t, "mc_eta", &m_mc_eta); + InitBranch(t, "mc_phi", &m_mc_phi); + + if(m_doMCDetailed){ + InitBranch(t, "mc_isTop", &m_mc_isTop); + InitBranch(t, "mc_isParton", &m_mc_isParton); + InitBranch(t, "mc_isMeson", &m_mc_isMeson); + InitBranch(t, "mc_isTau", &m_mc_isTau); + InitBranch(t, "mc_isMuon", &m_mc_isMuon); + } + + InitBranch(t, "mc_isPhoton", &m_mc_isPhoton); + InitBranch(t, "mc_isElectron", &m_mc_isElectron); + InitBranch(t, "mc_hasZMother", &m_mc_hasZMother); + InitBranch(t, "mc_hasWMother", &m_mc_hasWMother); +} + + +void TrigEgammaPhysValBase::clear(){ + + ///EventInfo + m_runNumber = 0; + m_eventNumber = 0; + m_lumiBlock = 0; + m_avgmu = 0; + + ///Egamma + m_el_hasCalo = false; + m_el_hasTrack = false; + + + m_el_calo_e = 0; + m_el_calo_et = 0; + m_el_calo_eta = 0; + m_el_calo_phi = 0; + m_el_calo_etaBE2 = 0; + + m_el_e = 0; + m_el_et = 0; + m_el_eta = 0; + m_el_phi = 0; + m_el_ethad1 = 0; + m_el_ehad1 = 0; + m_el_f1 = 0; + m_el_f3 = 0; + m_el_f1core = 0; + m_el_f3core = 0; + m_el_weta1 = 0; + m_el_weta2 = 0; + m_el_wtots1 = 0; + m_el_fracs1 = 0; + m_el_e277 = 0; + m_el_Reta = 0; + m_el_Rphi = 0; + m_el_Eratio = 0; + m_el_Rhad = 0; + m_el_Rhad1 = 0; + m_el_deta2 = 0; + m_el_dphi2 = 0; + m_el_dphiresc = 0; + m_el_deltaPhiRescaled2 = 0; + m_el_deltaEta1 = 0; + m_el_deltaE = 0; + m_el_etCone ->clear(); + m_el_ptCone ->clear(); + + m_el_trk_pt = 0; + m_el_trk_eta = 0; + m_el_trk_charge = 0; + m_el_trk_sigd0 = 0; + m_el_trk_d0 = 0; + m_el_trk_eProbabilityHT = 0; + m_el_trk_transformed_eProbabilityHT=0; + m_el_trk_d0significance = 0; + m_el_trk_deltaPOverP = 0; + m_el_trk_qOverP = 0; + m_el_trk_summaryValues ->clear(); + + + + m_el_medium = false; + m_el_tight = false; + m_el_lhVLoose = false; + m_el_lhLoose = false; + m_el_lhMedium = false; + m_el_lhTight = false; + m_el_rgLoose = false; + m_el_rgMedium = false; + m_el_rgTight = false; + m_el_multiLepton = false; + + m_el_nGoodVtx = -1; + m_el_nPileupPrimaryVtx = -1; + m_el_ringsE ->clear(); + + // Trigger L1 + m_trig_L1_eta = 0; + m_trig_L1_phi = 0; + m_trig_L1_emClus = 0; + m_trig_L1_tauClus = 0; + m_trig_L1_emIsol = 0; + m_trig_L1_hadIsol = 0; + m_trig_L1_hadCore = 0; + + // Trigger L2 Calo + m_trig_L2_calo_et = 0; + m_trig_L2_calo_eta = 0; + m_trig_L2_calo_phi = 0; + m_trig_L2_calo_e237 = 0; + m_trig_L2_calo_e277 = 0; + m_trig_L2_calo_fracs1 = 0; + m_trig_L2_calo_weta2 = 0; + m_trig_L2_calo_ehad1 = 0; + m_trig_L2_calo_emaxs1 = 0; + m_trig_L2_calo_e2tsts1 = 0; + m_trig_L2_calo_wstot = 0; + + + m_trig_L2_calo_energySample ->clear(); + m_trig_L2_calo_rings ->clear(); + m_trig_L2_calo_rnnOutput ->clear(); + + + // L2 Electron + m_trig_L2_el_pt ->clear(); + m_trig_L2_el_eta ->clear(); + m_trig_L2_el_phi ->clear(); + m_trig_L2_el_charge ->clear(); + m_trig_L2_el_caloEta ->clear(); + m_trig_L2_el_trkClusDeta ->clear(); + m_trig_L2_el_trkClusDphi ->clear(); + m_trig_L2_el_etOverPt ->clear(); + m_trig_L2_el_nTRTHits ->clear(); + m_trig_L2_el_nTRTHiThresholdHits ->clear(); + m_trig_L2_el_trackAlgID ->clear(); + + m_trig_EF_el_hasCalo ->clear(); + m_trig_EF_el_hasTrack ->clear(); + + // EF Calo + m_trig_EF_calo_e ->clear(); + m_trig_EF_calo_et ->clear(); + m_trig_EF_calo_eta ->clear(); + m_trig_EF_calo_phi ->clear(); + m_trig_EF_calo_etaBE2 ->clear(); + + m_trig_EF_calo_tight ->clear(); + m_trig_EF_calo_medium ->clear(); + m_trig_EF_calo_loose ->clear(); + m_trig_EF_calo_lhtight ->clear(); + m_trig_EF_calo_lhmedium ->clear(); + m_trig_EF_calo_lhloose ->clear(); + m_trig_EF_calo_lhvloose ->clear(); + + // HLT electron + m_trig_EF_el_calo_e ->clear(); + m_trig_EF_el_calo_et ->clear(); + m_trig_EF_el_calo_eta ->clear(); + m_trig_EF_el_calo_phi ->clear(); + m_trig_EF_el_calo_etaBE2 ->clear(); + + m_trig_EF_el_e ->clear(); + m_trig_EF_el_et ->clear(); + m_trig_EF_el_eta ->clear(); + m_trig_EF_el_phi ->clear(); + m_trig_EF_el_deltaE ->clear(); + m_trig_EF_el_ethad1 ->clear(); + m_trig_EF_el_ehad1 ->clear(); + m_trig_EF_el_f1 ->clear(); + m_trig_EF_el_f3 ->clear(); + m_trig_EF_el_f1core ->clear(); + m_trig_EF_el_f3core ->clear(); + m_trig_EF_el_weta1 ->clear(); + m_trig_EF_el_weta2 ->clear(); + m_trig_EF_el_wtots1 ->clear(); + m_trig_EF_el_fracs1 ->clear(); + m_trig_EF_el_Reta ->clear(); + m_trig_EF_el_Rphi ->clear(); + m_trig_EF_el_Eratio ->clear(); + m_trig_EF_el_Rhad ->clear(); + m_trig_EF_el_Rhad1 ->clear(); + m_trig_EF_el_e277 ->clear(); + m_trig_EF_el_deta2 ->clear(); + m_trig_EF_el_dphi2 ->clear(); + m_trig_EF_el_dphiresc ->clear(); + m_trig_EF_el_deltaPhiRescaled2 ->clear(); + m_trig_EF_el_deltaEta1 ->clear(); + m_trig_EF_el_etCone ->clear(); + m_trig_EF_el_ptCone ->clear(); + + m_trig_EF_el_trk_pt ->clear(); + m_trig_EF_el_trk_eta ->clear(); + m_trig_EF_el_trk_charge ->clear(); + m_trig_EF_el_trk_qOverP ->clear(); + m_trig_EF_el_trk_sigd0 ->clear(); + m_trig_EF_el_trk_d0 ->clear(); + m_trig_EF_el_trk_eProbabilityHT ->clear(); + m_trig_EF_el_trk_transformed_eProbabilityHT->clear(); + m_trig_EF_el_trk_d0significance ->clear(); + m_trig_EF_el_trk_deltaPOverP ->clear(); + m_trig_EF_el_trk_summaryValues ->clear(); + + + m_trig_EF_el_tight ->clear(); + m_trig_EF_el_medium ->clear(); + m_trig_EF_el_loose ->clear(); + m_trig_EF_el_lhtight ->clear(); + m_trig_EF_el_lhmedium ->clear(); + m_trig_EF_el_lhloose ->clear(); + m_trig_EF_el_lhvloose ->clear(); + + m_trig_tdt_L1_calo_accept ->clear(); + m_trig_tdt_L2_calo_accept ->clear(); + m_trig_tdt_L2_el_accept ->clear(); + m_trig_tdt_EF_calo_accept ->clear(); + m_trig_tdt_EF_el_accept ->clear(); + m_trig_tdt_emu_L1_calo_accept ->clear(); + m_trig_tdt_emu_L2_calo_accept ->clear(); + m_trig_tdt_emu_L2_el_accept ->clear(); + m_trig_tdt_emu_EF_calo_accept ->clear(); + m_trig_tdt_emu_EF_el_accept ->clear(); + + ///Monte Carlo + m_mc_hasMC = false; + m_mc_pt = -1; + m_mc_eta = -1; + m_mc_phi = -1; + m_mc_isTop = false; + m_mc_isParton = false; + m_mc_isMeson = false; + m_mc_isTau = false; + m_mc_isMuon = false; + m_mc_isPhoton = false; + m_mc_isElectron = false; + m_mc_hasZMother = false; + m_mc_hasWMother = false; + + /* + m_el_nblayerhits = 0; + m_el_nblayerolhits = 0; + m_el_npixhits = 0; + m_el_npixolhits = 0; + m_el_nscthits = 0; + m_el_nsctolhits = 0; + m_el_ntrthightreshits = 0; + m_el_ntrthits = 0; + m_el_ntrthighthresolhits= 0; + m_el_ntrtolhits = 0; + m_el_ntrtxenonhits = 0; + m_el_expectblayerhit = 0; + m_el_nsihits = 0; + m_el_nsideadsensors = 0; + m_el_npixdeadsensors = 0; + m_el_nsctdeadsensors = 0; + */ + + + /* + m_trig_EF_el_nblayerhits ->clear(); + m_trig_EF_el_nblayerolhits ->clear(); + m_trig_EF_el_npixhits ->clear(); + m_trig_EF_el_npixolhits ->clear(); + m_trig_EF_el_nscthits ->clear(); + m_trig_EF_el_nsctolhits ->clear(); + m_trig_EF_el_ntrthightreshits ->clear(); + m_trig_EF_el_ntrthits ->clear(); + m_trig_EF_el_ntrthighthresolhits ->clear(); + m_trig_EF_el_ntrtolhits ->clear(); + m_trig_EF_el_ntrtxenonhits ->clear(); + m_trig_EF_el_expectblayerhit ->clear(); + m_trig_EF_el_npixdeadsensors ->clear(); + m_trig_EF_el_nsctdeadsensors ->clear(); + m_trig_EF_el_expectNextToInnerMostLayer ->clear(); + m_trig_EF_el_nNextToInnerMostLayerHits ->clear(); + m_trig_EF_el_nNextToInnerMostLayerOutliers ->clear(); + */ + + +} + +void TrigEgammaPhysValBase::alloc_space(){ + + m_el_ringsE = new std::vector<float>(); + m_el_trk_summaryValues = new std::vector<uint8_t>(); + m_el_etCone = new std::vector<float>(); + m_el_ptCone = new std::vector<float>(); + + + m_trig_L2_calo_energySample = new std::vector<float>(); + m_trig_L2_calo_rings = new std::vector<float>(); + m_trig_L2_calo_rnnOutput = new std::vector<float>(); + + m_trig_L2_el_trackAlgID = new std::vector<int>(); + m_trig_L2_el_eta = new std::vector<float>(); + m_trig_L2_el_phi = new std::vector<float>(); + m_trig_L2_el_caloEta = new std::vector<float>(); + m_trig_L2_el_trkClusDeta = new std::vector<float>(); + m_trig_L2_el_trkClusDphi = new std::vector<float>(); + m_trig_L2_el_pt = new std::vector<float>(); + m_trig_L2_el_etOverPt = new std::vector<float>(); + m_trig_L2_el_nTRTHits = new std::vector<float>(); + m_trig_L2_el_nTRTHiThresholdHits = new std::vector<float>(); + m_trig_L2_el_charge = new std::vector<float>(); + + m_trig_EF_calo_et = new std::vector<float>(); + m_trig_EF_calo_eta = new std::vector<float>(); + m_trig_EF_calo_phi = new std::vector<float>(); + m_trig_EF_calo_etaBE2 = new std::vector<float>(); + m_trig_EF_calo_e = new std::vector<float>(); + + m_trig_EF_el_calo_et = new std::vector<float>(); + m_trig_EF_el_calo_eta = new std::vector<float>(); + m_trig_EF_el_calo_phi = new std::vector<float>(); + m_trig_EF_el_calo_etaBE2 = new std::vector<float>(); + m_trig_EF_el_calo_e = new std::vector<float>(); + + m_trig_EF_el_hasCalo = new std::vector<bool>(); + m_trig_EF_el_hasTrack = new std::vector<bool>(); + + m_trig_EF_el_et = new std::vector<float>(); + m_trig_EF_el_eta = new std::vector<float>(); + m_trig_EF_el_phi = new std::vector<float>(); + m_trig_EF_el_e = new std::vector<float>(); + m_trig_EF_el_deltaE = new std::vector<float>(); + m_trig_EF_el_ethad1 = new std::vector<float>(); + m_trig_EF_el_ehad1 = new std::vector<float>(); + m_trig_EF_el_f1 = new std::vector<float>(); + m_trig_EF_el_f3 = new std::vector<float>(); + m_trig_EF_el_f1core = new std::vector<float>(); + m_trig_EF_el_f3core = new std::vector<float>(); + m_trig_EF_el_weta1 = new std::vector<float>(); + m_trig_EF_el_weta2 = new std::vector<float>(); + m_trig_EF_el_wtots1 = new std::vector<float>(); + m_trig_EF_el_fracs1 = new std::vector<float>(); + m_trig_EF_el_e277 = new std::vector<float>(); + m_trig_EF_el_Reta = new std::vector<float>(); + m_trig_EF_el_Rphi = new std::vector<float>(); + m_trig_EF_el_Eratio = new std::vector<float>(); + m_trig_EF_el_Rhad = new std::vector<float>(); + m_trig_EF_el_Rhad1 = new std::vector<float>(); + m_trig_EF_el_deta2 = new std::vector<float>(); + m_trig_EF_el_dphi2 = new std::vector<float>(); + m_trig_EF_el_dphiresc = new std::vector<float>(); + m_trig_EF_el_deltaPhiRescaled2 = new std::vector<float>(); + m_trig_EF_el_deltaEta1 = new std::vector<float>(); + m_trig_EF_el_etCone = new std::vector<float>(); + m_trig_EF_el_ptCone = new std::vector<float>(); + + m_trig_EF_el_trk_pt = new std::vector<float>(); + m_trig_EF_el_trk_eta = new std::vector<float>(); + m_trig_EF_el_trk_charge = new std::vector<float>(); + m_trig_EF_el_trk_qOverP = new std::vector<float>(); + m_trig_EF_el_trk_sigd0 = new std::vector<float>(); + m_trig_EF_el_trk_d0 = new std::vector<float>(); + m_trig_EF_el_trk_eProbabilityHT = new std::vector<float>(); + m_trig_EF_el_trk_transformed_eProbabilityHT = new std::vector<float>(); + m_trig_EF_el_trk_d0significance = new std::vector<float>(); + m_trig_EF_el_trk_deltaPOverP = new std::vector<float>(); + m_trig_EF_el_trk_summaryValues = new std::vector<uint8_t>(); + + m_trig_EF_calo_tight = new std::vector<bool>(); + m_trig_EF_calo_medium = new std::vector<bool>(); + m_trig_EF_calo_loose = new std::vector<bool>(); + m_trig_EF_calo_lhtight = new std::vector<bool>(); + m_trig_EF_calo_lhmedium = new std::vector<bool>(); + m_trig_EF_calo_lhloose = new std::vector<bool>(); + m_trig_EF_calo_lhvloose = new std::vector<bool>(); + + m_trig_EF_el_tight = new std::vector<bool>(); + m_trig_EF_el_medium = new std::vector<bool>(); + m_trig_EF_el_loose = new std::vector<bool>(); + m_trig_EF_el_lhtight = new std::vector<bool>(); + m_trig_EF_el_lhmedium = new std::vector<bool>(); + m_trig_EF_el_lhloose = new std::vector<bool>(); + m_trig_EF_el_lhvloose = new std::vector<bool>(); + + m_trig_tdt_L1_calo_accept = new std::vector<int>(); + m_trig_tdt_L2_calo_accept = new std::vector<int>(); + m_trig_tdt_L2_el_accept = new std::vector<int>(); + m_trig_tdt_EF_calo_accept = new std::vector<int>(); + m_trig_tdt_EF_el_accept = new std::vector<int>(); + + m_trig_tdt_emu_L1_calo_accept = new std::vector<int>(); + m_trig_tdt_emu_L2_calo_accept = new std::vector<int>(); + m_trig_tdt_emu_L2_el_accept = new std::vector<int>(); + m_trig_tdt_emu_EF_calo_accept = new std::vector<int>(); + m_trig_tdt_emu_EF_el_accept = new std::vector<int>(); + + + + /* + m_trig_EF_el_nblayerhits = new std::vector<uint8_t>(); + m_trig_EF_el_nblayerolhits = new std::vector<uint8_t>(); + m_trig_EF_el_npixhits = new std::vector<uint8_t>(); + m_trig_EF_el_npixolhits = new std::vector<uint8_t>(); + m_trig_EF_el_nscthits = new std::vector<uint8_t>(); + m_trig_EF_el_nsctolhits = new std::vector<uint8_t>(); + m_trig_EF_el_ntrthightreshits = new std::vector<uint8_t>(); + m_trig_EF_el_ntrthits = new std::vector<uint8_t>(); + m_trig_EF_el_ntrthighthresolhits = new std::vector<uint8_t>(); + m_trig_EF_el_ntrtolhits = new std::vector<uint8_t>(); + m_trig_EF_el_ntrtxenonhits = new std::vector<uint8_t>(); + m_trig_EF_el_expectblayerhit = new std::vector<uint8_t>(); + m_trig_EF_el_npixdeadsensors = new std::vector<uint8_t>(); + m_trig_EF_el_nsctdeadsensors = new std::vector<uint8_t>(); + m_trig_EF_el_expectNextToInnerMostLayer = new std::vector<uint8_t>(); + m_trig_EF_el_nNextToInnerMostLayerHits = new std::vector<uint8_t>(); + m_trig_EF_el_nNextToInnerMostLayerOutliers = new std::vector<uint8_t>(); + */ + + +} + +void TrigEgammaPhysValBase::release_space(){ + + delete m_el_ringsE ; + delete m_el_trk_summaryValues ; + delete m_el_etCone ; + delete m_el_ptCone ; + + + + //delete m_trig_L1_thrNames ; + delete m_trig_L2_calo_energySample; + delete m_trig_L2_calo_rings ; + delete m_trig_L2_calo_rnnOutput ; + delete m_trig_L2_el_trackAlgID ; + delete m_trig_L2_el_pt ; + delete m_trig_L2_el_eta ; + delete m_trig_L2_el_caloEta ; + delete m_trig_L2_el_phi ; + delete m_trig_L2_el_charge ; + delete m_trig_L2_el_nTRTHits ; + delete m_trig_L2_el_nTRTHiThresholdHits ; + delete m_trig_L2_el_etOverPt ; + delete m_trig_L2_el_trkClusDeta ; + delete m_trig_L2_el_trkClusDphi ; + + delete m_trig_EF_calo_et ; + delete m_trig_EF_calo_eta ; + delete m_trig_EF_calo_phi ; + delete m_trig_EF_calo_etaBE2 ; + delete m_trig_EF_calo_e ; + + delete m_trig_EF_el_calo_et ; + delete m_trig_EF_el_calo_eta ; + delete m_trig_EF_el_calo_phi ; + delete m_trig_EF_el_calo_etaBE2 ; + delete m_trig_EF_el_calo_e ; + + delete m_trig_EF_el_et ; + delete m_trig_EF_el_eta ; + delete m_trig_EF_el_phi ; + delete m_trig_EF_el_e ; + delete m_trig_EF_el_deltaE ; + delete m_trig_EF_el_ethad1 ; + delete m_trig_EF_el_ehad1 ; + delete m_trig_EF_el_f1 ; + delete m_trig_EF_el_f3 ; + delete m_trig_EF_el_f1core ; + delete m_trig_EF_el_f3core ; + delete m_trig_EF_el_weta1 ; + delete m_trig_EF_el_weta2 ; + delete m_trig_EF_el_wtots1 ; + delete m_trig_EF_el_fracs1 ; + delete m_trig_EF_el_e277 ; + delete m_trig_EF_el_Reta ; + delete m_trig_EF_el_Rphi ; + delete m_trig_EF_el_Eratio ; + delete m_trig_EF_el_Rhad ; + delete m_trig_EF_el_Rhad1 ; + delete m_trig_EF_el_deta2 ; + delete m_trig_EF_el_dphi2 ; + delete m_trig_EF_el_dphiresc ; + delete m_trig_EF_el_deltaPhiRescaled2 ; + delete m_trig_EF_el_deltaEta1 ; + delete m_trig_EF_el_etCone ; + delete m_trig_EF_el_ptCone ; + + delete m_trig_EF_el_trk_pt ; + delete m_trig_EF_el_trk_eta ; + delete m_trig_EF_el_trk_charge ; + delete m_trig_EF_el_trk_qOverP ; + delete m_trig_EF_el_trk_sigd0 ; + delete m_trig_EF_el_trk_d0 ; + delete m_trig_EF_el_trk_eProbabilityHT ; + delete m_trig_EF_el_trk_transformed_eProbabilityHT ; + delete m_trig_EF_el_trk_d0significance ; + delete m_trig_EF_el_trk_deltaPOverP ; + delete m_trig_EF_el_trk_summaryValues ; + + /* + delete m_trig_EF_el_nblayerhits ; + delete m_trig_EF_el_nblayerolhits ; + delete m_trig_EF_el_npixhits ; + delete m_trig_EF_el_npixolhits ; + delete m_trig_EF_el_nscthits ; + delete m_trig_EF_el_nsctolhits ; + delete m_trig_EF_el_ntrthightreshits ; + delete m_trig_EF_el_ntrthits ; + delete m_trig_EF_el_ntrthighthresolhits ; + delete m_trig_EF_el_ntrtolhits ; + delete m_trig_EF_el_ntrtxenonhits ; + delete m_trig_EF_el_expectblayerhit ; + delete m_trig_EF_el_npixdeadsensors ; + delete m_trig_EF_el_nsctdeadsensors ; + delete m_trig_EF_el_expectNextToInnerMostLayer ; + delete m_trig_EF_el_nNextToInnerMostLayerHits ; + delete m_trig_EF_el_nNextToInnerMostLayerOutliers ; + */ + delete m_trig_EF_calo_tight ; + delete m_trig_EF_calo_medium ; + delete m_trig_EF_calo_loose ; + delete m_trig_EF_calo_lhtight ; + delete m_trig_EF_calo_lhmedium ; + delete m_trig_EF_calo_lhloose ; + delete m_trig_EF_calo_lhvloose ; + delete m_trig_EF_el_tight ; + delete m_trig_EF_el_medium ; + delete m_trig_EF_el_loose ; + delete m_trig_EF_el_lhtight ; + delete m_trig_EF_el_lhmedium ; + delete m_trig_EF_el_lhloose ; + delete m_trig_EF_el_lhvloose ; + + delete m_trig_tdt_L1_calo_accept ; + delete m_trig_tdt_L2_calo_accept ; + delete m_trig_tdt_L2_el_accept ; + delete m_trig_tdt_EF_calo_accept ; + delete m_trig_tdt_EF_el_accept ; + delete m_trig_tdt_emu_L1_calo_accept ; + delete m_trig_tdt_emu_L2_calo_accept ; + delete m_trig_tdt_emu_L2_el_accept ; + delete m_trig_tdt_emu_EF_calo_accept ; + delete m_trig_tdt_emu_EF_el_accept ; + + + + delete m_trig_EF_el_hasCalo ; + delete m_trig_EF_el_hasTrack ; + + +} + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx index 1b1436394b59..776849479e81 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx @@ -135,6 +135,8 @@ void TrigEgammaPlotTool::setBinning(){ m_defaultEtabins.clear(); m_coarseEtbins.clear(); m_coarseEtabins.clear(); + m_ringerEtbins.clear(); + m_ringerEtabins.clear(); // Binning as defined in TP framework double coarse_eta_bins[9] ={-2.47,-1.52,-1.37,-0.60,0.00,0.60,1.37,1.52,2.47}; @@ -161,23 +163,10 @@ void TrigEgammaPlotTool::setBinning(){ 20,20.5,21,21.5,22,22.5,23,23.5,24,24.5, 25,25.5}; - /* Ringer bins pdfs for each layer */ - m_minBin_ringer.assign - ({-500 ,-500 ,-1000,-1500,-1500,-1000,-1000,-1000,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-800, - -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800, - -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800, - -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800, - -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-500 ,-500 ,-500 ,-500 ,-1000,-1000,-1000,-500, - -500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-600 ,-1000,-1500,-2000,-400 ,-1000,-1500,-1500, - -1000,-2000,-2000,-2000}); - m_maxBin_ringer.assign - ({9000 , 7000, 2000, 2000, 2000, 2000, 2000, 2000, 20000, 20000, 6000, 4000, 3000, 2000, 2000, 800, - 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800, - 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800, - 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800, - 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 40000, 40000, 6000, 4000, 2000, 2000, 2000, 2000, - 500 , 500 , 500 , 500 , 500 , 500 ,500 , 500 , 3000 , 3000 , 3000 ,3000, 2000, 2000, 2000, 2000, - 8000, 5000 ,4000 ,3000}); + //float ringer_eta_bins[10]={0.00, 0.60, 0.80, 1.15, 1.37, 1.54, 1.81, 2.01, 2.37, 2.47}; + //float ringer_et_bins[9] ={4.00,7.00,10.0,15.0,20.0,30.0,40.0,50.0,50000.}; + float ringer_thres_et_bins[6]={15.,20.,30.,40.,50.,50000.}; + float ringer_thres_eta_bins[6]={0.,0.8,1.37,1.54,2.37,2.5}; if(m_doJpsiee){ m_nEtbins=51; @@ -204,6 +193,8 @@ void TrigEgammaPlotTool::setBinning(){ m_defaultEtabins.insert(m_defaultEtabins.end(), &default_eta_bins[0], &default_eta_bins[m_ndefaultEtabins+1]); m_coarseEtbins.insert(m_coarseEtbins.end(), &coarse_et_bins[0], &coarse_et_bins[m_ncoarseEtbins+1]); m_coarseEtabins.insert(m_coarseEtabins.end(), &coarse_eta_bins[0], &coarse_eta_bins[m_ncoarseEtabins+1]); + m_ringerEtbins.insert(m_ringerEtbins.end(), &ringer_thres_et_bins[0], &ringer_thres_et_bins[6]); + m_ringerEtabins.insert(m_ringerEtabins.end(), &ringer_thres_eta_bins[0], &ringer_thres_eta_bins[6]); } StatusCode TrigEgammaPlotTool::book(std::map<std::string,TrigInfo> trigInfo){ @@ -624,8 +615,8 @@ void TrigEgammaPlotTool::bookAbsResolutionHistos(const std::string directory){ cd(directory); addHistogram(new TH1F("res_pt", "HLT p_{T} resolution; (p_{T}(on)-p_{T}(off)) ; Count", 200, -1.5, 1.5)); addHistogram(new TH1F("res_et", "HLT E_{T} resolution; (E_{T}(on)-E_{T}(off)) ; Count", 200, -0.5, 0.5)); - addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off)) ; Count", 40, -0.2, 0.2)); - addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off)) ; Count", 40, -0.2, 0.2)); + addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off)) ; Count", 40, -0.001, 0.001)); + addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off)) ; Count", 40, -0.001, 0.001)); addHistogram(new TH2F("res_etVsEta", "HLT E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off)); Count", 50, -2.47, 2.47, @@ -699,8 +690,8 @@ void TrigEgammaPlotTool::bookAbsResolutionHistos(const std::string directory){ void TrigEgammaPlotTool::bookResolutionHistos(const std::string directory){ cd(directory); addHistogram(new TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1)); - addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.2, 0.2)); - addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.2, 0.2)); + addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.001, 0.001)); + addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.001, 0.001)); addHistogram(new TH2F("res_etVsEta", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count", 25, -2.5, 2.5, 50, -0.1, 0.1)); @@ -834,12 +825,18 @@ void TrigEgammaPlotTool::bookPhotonIsoResolutionHistos(const std::string directo addHistogram(new TH2F("res_topoetcone20_relVsMu", "HLT topoetcone20/pt resolution as function of avg #mu; #mu; (on-off)/off; Count", 50, 0, 100, 100, -0.1, 0.1)); - addHistogram(new TH2F("res_topoetcone20_onVsOff", "online topoetcone20 vs offline topoetcone20; offline [MeV]; online [MeV]; Count", - 100, 0.0, 10000.0, - 100, 0.0, 10000.0)); + addHistogram(new TH2F("res_topoetcone20_onVsOff", "online topoetcone20 vs offline topoetcone20; offline [GeV]; online [GeV]; Count", + 100, -10.0, 10.0, + 100, -10.0, 10.0)); addHistogram(new TH2F("res_topoetcone20_rel_onVsOff", "online topoetcone20/pt vs offline topoetcone20/pt; offline; online; Count", - 100, 0.0, 0.2, - 100, 0.0, 0.2)); + 100, -0.5, 0.5, + 100, -0.5, 0.5)); + addHistogram(new TH2F("res_topoetcone40_shift_onVsOff", "online topoetcone40-2.45 GeV vs offline topoetcone40-2.45 GeV; offline [GeV]; online [GeV]; Count", + 100, -10.0, 10.0, + 100, -10.0, 10.0)); + addHistogram(new TH2F("res_topoetcone40_shift_rel_onVsOff", "online (topoetcone40-2.45 GeV)/pt vs offline (topoetcone40-2.45 GeV)/pt; offline; online; Count", + 100, -0.5, 0.5, + 100, -0.5, 0.5)); } void TrigEgammaPlotTool::bookExpertResolutionHistos(const std::string directory){ @@ -1033,8 +1030,10 @@ void TrigEgammaPlotTool::bookEgammaDistributionHistos(const std::string director addHistogram(new TH1F("Rhad", "Rhad; Rhad ; Count", 35, -0.3, 0.3)); addHistogram(new TH1F("Rhad1", "Rhad1; Rhad1 ; Count", 30, -0.3, 0.3)); addHistogram(new TH1F("eratio","eratio; eratio; Count",20, 0, 2)); - addHistogram(new TH1F("topoetcone20", "topoetcone20; topoetcone20; Count", 50, 0.0, 5.0)); - addHistogram(new TH1F("topoetcone20_rel", "topoetcone20/pt; topoetcone20/pt; Count", 50, 0.0, 1.0)); + addHistogram(new TH1F("topoetcone20", "topoetcone20; topoetcone20 [GeV] ; Count", 100, -10.0, 10.0)); + addHistogram(new TH1F("topoetcone20_rel", "topoetcone20/pt; topoetcone20/pt ; Count", 100, -0.5, 0.5)); + addHistogram(new TH1F("topoetcone40_shift", "topoetcone40-2.45 GeV; topoetcone40-2.45 GeV [GeV] ; Count", 100, -10.0, 10.0)); + addHistogram(new TH1F("topoetcone40_shift_rel", "(topoetcone40-2.45 GeV)/pt; (topoetcone40-2.45 GeV)/pt ; Count", 100, -0.5, 0.5)); } void TrigEgammaPlotTool::bookElectronDistributionHistos(const std::string directory){ @@ -1185,6 +1184,32 @@ void TrigEgammaPlotTool::bookL1Histos(TrigInfo trigInfo){ } +void TrigEgammaPlotTool::bookRnnDistributionHistos(const std::string dir) +{ + cd(dir); + //addHistogram(new TH2F("RingerShapes","RingerShapes;E_{t};#rings;Count",21000,-1000,20000,100,0,100)); + addHistogram(new TH1F("discriminant","discriminant(integrated);discriminant(ringer);Count",95,-12,7)); + addHistogram(new TH2F("discriminantVsMu","discriminantVsMu(integrated);discriminant(ringer);avgmu;Count",95,-12,7,16,0,70)); + addDirectory(dir+"/discriminant_binned"); + for(unsigned etBinIdx=0; etBinIdx<m_ringerEtbins.size()-1; ++etBinIdx){ + for(unsigned etaBinIdx=0; etaBinIdx<m_ringerEtabins.size()-1; ++etaBinIdx){ + std::stringstream ss1,ss2,ss3,ss4; + ss1 << "discriminant_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; + ss2 << m_ringerEtabins[etaBinIdx]<<"<=|#eta|<"<< m_ringerEtabins[etaBinIdx+1] << + " and " << m_ringerEtbins[etBinIdx]<< "<=E_{t}<"<< m_ringerEtbins[etBinIdx+1] << + ";discriminant(ringer);Count"; + + addHistogram(new TH1F(ss1.str().c_str(),ss2.str().c_str(),95,-12.,7.)); + ss3 << "discriminantVsMu_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; + ss4 << m_ringerEtabins[etaBinIdx]<<"<=|#eta|<"<< m_ringerEtabins[etaBinIdx+1] << + " and " << m_ringerEtbins[etBinIdx]<< "<=E_{t}<"<< m_ringerEtbins[etBinIdx+1] << + ";discriminant(ringer);Avgmu;Count"; + addHistogram(new TH2F(ss3.str().c_str(),ss4.str().c_str(),95,-12.,7.,16,0.,70.)); + } + } + +} + void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){ const std::string basePath=m_baseDir+"/Expert/"+trigInfo.trigName; @@ -1337,29 +1362,7 @@ void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){ dirname=basePath + "/Distributions/L2Calo"; dirnames.push_back(dirname); addDirectory(dirname); - - // Store ringer in trigInfo - if(boost::contains(trigInfo.trigName,"ringer") || trigInfo.trigEtcut || trigInfo.trigPerf){ - addHistogram(new TH1F("ringer_nnOutput", "Discriminator distribution; nnOutput ; Count", 100, -1, 1)); - addHistogram(new TH2F("ringer_etVsEta", "ringer count as function of #eta and E_{t}; #eta; E_{t} [GeV]; Count", - m_ndefaultEtabins,m_defaultEtabins.data(), m_ndefaultEtbins, m_defaultEtbins.data() )); - if(m_detailedHists){ - unsigned rCount=0; - for(unsigned layer =0; layer < 7; ++layer){ - unsigned minRing, maxRing; std::string strLayer; - parseCaloRingsLayers( layer, minRing, maxRing, strLayer ); - addDirectory(dirname+"/rings_"+strLayer); - for(unsigned r=minRing; r<=maxRing; ++r){ - std::stringstream ss_title, ss; - ss_title << "ringer_ring#" << r; ss << "L2Calo ringer ("<< strLayer <<"); ring#" << r << " E [MeV]; Count"; - addHistogram(new TH1F(ss_title.str().c_str(), ss.str().c_str(), 100, m_minBin_ringer[rCount], m_maxBin_ringer[rCount])); - rCount++; - } - }///Loop for each calo layers - } - } - - + bookRnnDistributionHistos(dirname); //Book the kinematic plots for each trigger level for(const auto dir:dirnames) @@ -1376,7 +1379,7 @@ void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){ } if(trigInfo.trigType=="photon"){ bookPhotonResolutionHistos(dirname); - if(boost::contains(trigInfo.trigName,"iloose")) + if(boost::contains(trigInfo.trigName,"icaloloose") ||boost::contains(trigInfo.trigName,"icalovloose") || boost::contains(trigInfo.trigName,"icalotight")) bookPhotonIsoResolutionHistos(dirname); } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx index c2d851d919f7..66e0a7441e5d 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx @@ -47,6 +47,7 @@ StatusCode TrigEgammaResolutionTool::toolExecute(const std::string basePath,Trig const std::string dir = basePath+"/"+info.trigName; bool filliso=false; if(boost::contains(info.trigName,"iloose") || boost::contains(info.trigName,"ivarloose")) filliso=true; + if(boost::contains(info.trigName,"icaloloose") || boost::contains(info.trigName,"icalovloose") || boost::contains(info.trigName,"icalotight")) filliso=true; ATH_MSG_DEBUG("Executing resolution for " << dir); for(const auto pairObj : pairObjs){ const xAOD::Egamma* eg =pairObj.first; @@ -142,14 +143,17 @@ void TrigEgammaResolutionTool::resolutionElectron(const std::string basePath,std void TrigEgammaResolutionTool::resolutionL2Photon(const std::string dir,std::pair< const xAOD::Egamma*,const HLT::TriggerElement*> pairObj){ cd(dir); + ATH_MSG_DEBUG("L2 Photon Resolution"); float dRmax = 100; const xAOD::TrigPhoton *phL2 = nullptr; - if(pairObj.second){ - if(ancestorPassed<xAOD::TrigPhotonContainer>(pairObj.second)) - phL2=closestObject<xAOD::TrigPhoton,xAOD::TrigPhotonContainer>(pairObj,dRmax); - if(phL2){ - if(dRmax < 0.05){ - //Do something here + if(getSGContainsTrigPhoton()){ + if(pairObj.second){ + if(ancestorPassed<xAOD::TrigPhotonContainer>(pairObj.second)) + phL2=closestObject<xAOD::TrigPhoton,xAOD::TrigPhotonContainer>(pairObj,dRmax); + if(phL2){ + if(dRmax < 0.05){ + //Do something here + } } } } @@ -498,8 +502,6 @@ void TrigEgammaResolutionTool::fillIsolationResolution(const std::string dir,con float etoff=off->pt(); if (val_off > 0.) { hist1("res_topoetcone20")->Fill((getIsolation_topoetcone20(onl)-val_off)/val_off); - hist2("res_topoetcone20_onVsOff")->Fill(getIsolation_topoetcone20(off), - getIsolation_topoetcone20(onl)); if (etonl > 0. && etoff > 0.) { const float reliso_onl=getIsolation_topoetcone20(onl)/etonl; const float reliso_off=getIsolation_topoetcone20(off)/etoff; @@ -512,10 +514,18 @@ void TrigEgammaResolutionTool::fillIsolationResolution(const std::string dir,con (reliso_onl-reliso_off)/reliso_off); hist2("res_topoetcone20VsMu")->Fill(getAvgMu(), (reliso_onl-reliso_off)/reliso_off); - hist2("res_topoetcone20_rel_onVsOff")->Fill(getIsolation_topoetcone20(off)/etoff, - getIsolation_topoetcone20(onl)/etonl); } } + hist2("res_topoetcone20_onVsOff")->Fill(getIsolation_topoetcone20(off)/1e3, + getIsolation_topoetcone20(onl)/1e3); + hist2("res_topoetcone40_shift_onVsOff")->Fill((getIsolation_topoetcone40(off)-2450)/1e3, + (getIsolation_topoetcone40(onl)-2450)/1e3); + if (etonl > 0. && etoff > 0.) { + hist2("res_topoetcone20_rel_onVsOff")->Fill(getIsolation_topoetcone20(off)/etoff, + getIsolation_topoetcone20(onl)/etonl); + hist2("res_topoetcone40_shift_rel_onVsOff")->Fill((getIsolation_topoetcone40(off)-2450)/etoff, + (getIsolation_topoetcone40(onl)-2450)/etonl); + } } } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h index 366d3441c265..2b201ce53549 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h @@ -42,6 +42,8 @@ public: virtual void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool>)=0; virtual void setAvgMu(const float, const float)=0; virtual void setPVertex(const float, const float)=0; + virtual void setSGContainsRnn(bool)=0; + virtual void setSGContainsTrigPhoton(bool)=0; virtual StatusCode childInitialize(){return StatusCode::SUCCESS;}; virtual StatusCode childBook(){return StatusCode::SUCCESS;}; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h index 5a67bcefb1e4..2057c3376397 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h @@ -27,20 +27,16 @@ #include "xAODEgamma/ElectronAuxContainer.h" #include "xAODTrigRinger/TrigRingerRings.h" #include "xAODTrigRinger/TrigRingerRingsContainer.h" +#include "xAODTrigRinger/TrigRNNOutput.h" +#include "xAODTrigRinger/TrigRNNOutputContainer.h" #include "xAODTracking/TrackParticleContainer.h" #include "xAODTrigger/TrigPassBits.h" #include "xAODEgamma/PhotonAuxContainer.h" - -/* - Ringer offline to be include for future -///////////////////////////////////////////////////////// -#include "xAODCaloRings/RingSet.h" // -#include "xAODCaloRings/RingSetContainer.h" // -#include "xAODCaloRings/CaloRings.h" // -#include "xAODCaloRings/CaloRingsContainer.h" // -#include "xAODCaloRings/tools/getCaloRingsDecorator.h" // -///////////////////////////////////////////////////////// -*/ +#include "xAODCaloRings/RingSet.h" +#include "xAODCaloRings/RingSetContainer.h" +#include "xAODCaloRings/CaloRings.h" +#include "xAODCaloRings/CaloRingsContainer.h" +#include "xAODCaloRings/tools/getCaloRingsDecorator.h" class TrigEgammaAnalysisBaseTool : public asg::AsgTool, @@ -50,12 +46,12 @@ ASG_TOOL_CLASS(TrigEgammaAnalysisBaseTool, ITrigEgammaAnalysisBaseTool) public: TrigEgammaAnalysisBaseTool( const std::string& myname); - virtual ~TrigEgammaAnalysisBaseTool() {}; + ~TrigEgammaAnalysisBaseTool() {}; - virtual StatusCode initialize() override; - virtual StatusCode book() override; - virtual StatusCode execute() override; - virtual StatusCode finalize() override; + StatusCode initialize() ; + StatusCode book() ; + StatusCode execute() ; + StatusCode finalize() ; template<class T, class B> std::unique_ptr<xAOD::TrigPassBits> createBits(const T* CONT, const B* BITS); template<class T> std::unique_ptr<xAOD::TrigPassBits> getBits(const HLT::TriggerElement* te,const T* CONT); template<class T> const T* getFeature(const HLT::TriggerElement* te,const std::string key=""); @@ -63,15 +59,18 @@ public: template <class T1, class T2> const T1* closestObject(const std::pair<const xAOD::Egamma *, const HLT::TriggerElement *>, float &, bool usePassbits=true,const std::string key=""); // Interface class methods needed to pass information to additional tools or to set common tools - virtual void setParent(IHLTMonTool *parent) override { m_parent = parent;}; - virtual void setPlotTool(ToolHandle<ITrigEgammaPlotTool> tool) override {m_plot=tool;} - virtual void setDetail(bool detail) override {m_detailedHists=detail;} - virtual void setTP(bool tp) override {m_tp=tp;} - virtual void setEmulation(bool doEmu) override {m_doEmulation=doEmu;} - virtual void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool> tool) override {m_emulationTool=tool;} - virtual void setPVertex(const float onvertex, const float ngoodvertex) override {m_nPVertex = onvertex; m_nGoodVertex = ngoodvertex;} - virtual void setAvgMu(const float onlmu, const float offmu) override {m_onlmu=onlmu; m_offmu=offmu;} //For tools called by tools - + void setParent(IHLTMonTool *parent) { m_parent = parent;}; + void setPlotTool(ToolHandle<ITrigEgammaPlotTool> tool) {m_plot=tool;} + void setDetail(bool detail) {m_detailedHists=detail;} + void setTP(bool tp) {m_tp=tp;} + void setEmulation(bool doEmu) {m_doEmulation=doEmu;} + void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool> tool) {m_emulationTool=tool;} + void setPVertex(const float onvertex, const float ngoodvertex) {m_nPVertex = onvertex; m_nGoodVertex = ngoodvertex;} + void setAvgMu(const float onlmu, const float offmu) {m_onlmu=onlmu; m_offmu=offmu;} //For tools called by tools + + void setSGContainsRnn(bool contains) {m_sgContainsRnn=contains;} + void setSGContainsTrigPhoton(bool contains) {m_sgContainsTrigPhoton=contains;} + // Set current MonGroup void cd(const std::string &dir); // Accessor members @@ -112,7 +111,10 @@ private: float m_offmu; float m_nGoodVertex; float m_nPVertex; - + + /*! Hook to check for RNN features in SG */ + bool m_sgContainsRnn; + bool m_sgContainsTrigPhoton; // Properties ToolHandle<Trig::TrigDecisionTool> m_trigdec; ToolHandle<Trig::ITrigEgammaMatchingTool> m_matchTool; @@ -137,6 +139,8 @@ protected: void bookAnalysisHistos(const std::string); void setTrigInfo(const std::string); + void setTrigEmulation(){m_forceTrigEmulation=true;}; + TrigInfo getTrigInfo(const std::string); std::map<std::string,TrigInfo> getTrigInfoMap() { return m_trigInfo; } @@ -169,7 +173,11 @@ protected: float getNPVtx(){return m_nPVertex;} float getNGoodVertex(){return m_nGoodVertex;} - /* trig rings and offline rings helper method for feature extraction from xaod */ + /* Protection for Holders not in AOD */ + bool getSGContainsRnn() { return m_sgContainsRnn;} + bool getSGContainsTrigPhoton() { return m_sgContainsTrigPhoton;} + + /* trig rings and offline rings helper method for feature extraction from xaod */ bool getCaloRings( const xAOD::Electron *, std::vector<float> & ); bool getTrigCaloRings( const xAOD::TrigEMCluster *, std::vector<float> & ); void parseCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, std::string &caloLayerName); @@ -213,6 +221,11 @@ protected: bool m_tp; /*! Emulation Analysis */ bool m_doEmulation; + /*! force emulation trigger */ + bool m_forceTrigEmulation; + /* force trigger attachment into the list */ + bool m_forceTrigAttachment; + // Infra-structure members std::string m_file; /*! String for offline container key */ diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h index 56a0eeb5119e..71379e7fec15 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h @@ -32,7 +32,8 @@ private: void fillEFCalo(const std::string,const xAOD::CaloCluster *); void fillL2Electron(const std::string,const xAOD::TrigElectron *); void fillL2Calo(const std::string,const xAOD::TrigEMCluster *); - void fillRinger(const std::string,const xAOD::TrigEMCluster *); + void fillRingerShapes(const std::string,const xAOD::TrigRingerRings *); + void fillRnnDistribution(const std::string,const xAOD::TrigRNNOutput *); void fillL1Calo(const std::string,const xAOD::EmTauRoI *); /*! Include more detailed histograms */ bool m_detailedHists; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h new file mode 100644 index 000000000000..294e43189f96 --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H +#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H + +#include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h" +#include "TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h" +#include "xAODTracking/TrackParticle.h" +#include "xAODTracking/Vertex.h" +#include "xAODEventInfo/EventInfo.h" +#include "xAODEgamma/EgammaEnums.h" +#include "xAODTracking/TrackingPrimitives.h" +#include <map> + +class TrigEgammaEventSelection : public TrigEgammaNavTPBaseTool, public TrigEgammaPhysValBase, + virtual public ITrigEgammaAnalysisBaseTool +{ + ASG_TOOL_CLASS(TrigEgammaEventSelection, ITrigEgammaAnalysisBaseTool) + + public: + + TrigEgammaEventSelection( const std::string& myname ); + ~TrigEgammaEventSelection() {}; + StatusCode childInitialize(); + StatusCode childBook(); + StatusCode childExecute(); + StatusCode childFinalize(); + + private: + + /* Dump trigger and offline probe object */ + bool EventSelectionZ(); + bool EventSelectionFakes(); + + bool ApplyFireTriggers( const xAOD::Electron *el); + bool isTruthElectronAny(const xAOD::Egamma *eg ); + + bool fill(TTree *t, const xAOD::Electron *el ); + + /* parse between objects and local variables connected to the + * ttree pointer */ + bool fillEvent ( ); + bool fillMonteCarlo ( const xAOD::Egamma *eg ); + bool fillElectron ( const xAOD::Electron *el ); + bool fillCaloRings ( const xAOD::Electron *el ); + bool fillEmTauRoI ( const xAOD::EmTauRoI *emTauRoI ); + bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ); + bool fillTrigElectron ( const xAOD::TrigElectron *trigEl ); + bool fillCaloCluster ( const xAOD::CaloCluster *cluster ); + bool fillAccept ( const HLT::TriggerElement * ); + bool fillTrigCaloRings( const HLT::TriggerElement *feat ); + bool fillHLTElectron ( const xAOD::Electron *el ); + bool fillTDT ( const xAOD::Electron *el , const HLT::TriggerElement *te ); + + // Helper methods + double get_el_sigd0(const xAOD::Electron *el); + double get_el_d0(const xAOD::Electron *el); + double get_el_eProbabilityHT(const xAOD::Electron *el); + double get_el_transformed_eProbabilityHT(const xAOD::Electron *el); + double get_el_d0significance(const xAOD::Electron *el); + double get_el_deltaPhiRescaled2(const xAOD::Electron *el); + double get_el_deltaEta1(const xAOD::Electron *el); + double get_el_DeltaPOverP(const xAOD::Electron *el); + + + private: + + std::map<std::string, unsigned >m_countMap; + + void count( std::string key ){ + if(m_countMap.find(key) == m_countMap.end()){ + m_countMap[key]= 1; + }else{ + m_countMap[key]++; + } + } + + + + // [*,*,HLT,EFCalo,L2,L2Calo,L1Calo,isGoodMatch] + //uint8_t GetByteFromBools(const bool eightBools[8]) + int GetByteFromBools(const bool eightBools[8]) + { + int ret = 0; + //uint8_t ret = 0; + for (int i=0; i<8; i++) if (eightBools[i] == true) ret |= (1<<i); + return ret; + } + + //ToolHandleArray<ITrigEgammaEmulationTool> m_emulationTools; + + ToolHandleArray<IAsgElectronIsEMSelector> m_EFCaloElectronIsEMSelectors; + ToolHandleArray<IAsgElectronIsEMSelector> m_HLTElectronIsEMSelectors; + ToolHandleArray<IAsgElectronLikelihoodTool> m_EFCaloElectronLHSelectors; + ToolHandleArray<IAsgElectronLikelihoodTool> m_HLTElectronLHSelectors; + ToolHandle<IAsgElectronLikelihoodTool> m_electronLHVLooseTool; + + std::vector<std::string> m_supportingTrigList; + int m_detailedDataLevel; + bool m_selectionZ; + bool m_selectionW; + bool m_selectionMC; + bool m_selectionJpsi; + bool m_selectionFakes; + bool m_doCaloRings; + bool m_dumpTags; + +#define GETTER(_name_) void get_##_name_(const xAOD::Electron*, float); + GETTER(trig_EF_calo_isLHTightCaloOnly_rel21_20170217 ) + GETTER(trig_EF_calo_isLHMediumCaloOnly_rel21_20170217) + GETTER(trig_EF_calo_isLHLooseCaloOnly_rel21_20170217 ) + GETTER(trig_EF_calo_isLHVLooseCaloOnly_rel21_20170217) + GETTER(trig_EF_el_isLHTight_rel21_20170217 ) + GETTER(trig_EF_el_isLHMedium_rel21_20170217) + GETTER(trig_EF_el_isLHLoose_rel21_20170217 ) + GETTER(trig_EF_el_isLHVLoose_rel21_20170217) + GETTER(trig_EF_el_isLHTightNoD0_rel21_20170217 ) + GETTER(trig_EF_el_isLHMediumNoD0_rel21_20170217) + GETTER(trig_EF_el_isLHLooseNoD0_rel21_20170217 ) + GETTER(trig_EF_el_isLHVLooseNoD0_rel21_20170217) +#undef GETTER + + +}; + + + +#endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h index b977da3bd5ac..8f6e1f62c7a2 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h @@ -16,6 +16,7 @@ typedef struct _triginfo bool trigEtcut; // Et cut only chain float trigThrHLT; // HLT Et threshold float trigThrL1; // L1 Et threshold + bool trigIsEmulation; } TrigInfo; // Enums diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h index 850ed18d98bd..9952cbcdc6ed 100755 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h @@ -26,6 +26,8 @@ #include "xAODTracking/TrackParticleContainer.h" #include "xAODTracking/TrackParticleAuxContainer.h" #include "xAODTrigCalo/TrigEMCluster.h" +#include "xAODTrigRinger/TrigRNNOutput.h" +#include "xAODTrigRinger/TrigRNNOutputContainer.h" #include "xAODCaloEvent/CaloClusterContainer.h" #include "xAODCaloEvent/CaloClusterAuxContainer.h" #include "xAODJet/JetContainer.h" diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h deleted file mode 100755 index 4383d5db040e..000000000000 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - - -#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVNTUPLE_H -#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVNTUPLE_H - -#include "TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h" -#include "xAODTruth/TruthParticle.h" -#include "xAODTruth/TruthParticleContainer.h" -#include "xAODEventInfo/EventInfo.h" -#include "xAODEgamma/EgammaEnums.h" -#include "xAODTracking/TrackingPrimitives.h" - -class TrigEgammaNavNtuple : public TrigEgammaNavBaseTool, - virtual public ITrigEgammaAnalysisBaseTool -{ - ASG_TOOL_CLASS(TrigEgammaNavNtuple, ITrigEgammaAnalysisBaseTool) - - public: - - TrigEgammaNavNtuple( const std::string& myname ); - ~TrigEgammaNavNtuple() {}; - StatusCode childInitialize (); - StatusCode childBook(); - StatusCode childExecute(); - StatusCode childFinalize(); - - private: - - /* Dump offline photons */ - bool executePhotonDump(); - /* Dump offline electrons */ - bool executeElectronDump(); - /* Dump Trigger, electron and photons matched with the trigger object */ - bool executeTrigItemDump(); - /* Dump using trigger supports */ - bool executeTrigSupportDump(); - - - /* helper function */ - template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true); - - unsigned count_HLT_objects(const HLT::TriggerElement *); - - /* Create branches */ - void bookEventBranches( TTree *t ); - void bookElectronBranches( TTree *t ); - //void bookPhotonBranches( TTree *t ); - void bookTriggerBranches( TTree *t ); - void bookMonteCarloBranches( TTree *t ); - - /* uses InitBranch to connect the local variable and ttree pointer */ - void linkEventBranches( TTree *t); - void linkElectronBranches( TTree *t); - //void linkPhotonBranches( TTree *t); - void linkTriggerBranches( TTree *t); - void linkMonteCarloBranches( TTree *t); - - /* parse between objects and local variables connected to the - * ttree pointer */ - bool fillEvent ( ); - bool fillMonteCarlo ( const xAOD::Egamma *eg ); - bool fillElectron ( const xAOD::Electron *el ); - //bool fillPhoton ( const xAOD::Photon *ph ); - - bool fillCaloRings ( const xAOD::Electron *el ); - bool fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ); - bool fillEmTauRoI ( const xAOD::EmTauRoI *emTauRoI ); - bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ); - bool fillTrigElectron ( const xAOD::TrigElectron *trigEl ); - bool fillCaloCluster ( const xAOD::CaloCluster *cluster ); - - /* Space memory manager */ - void alloc_space(); - void release_space(); - void clear(); - - - - private: - - /* Offline variables only */ - bool m_doOfflineDump; - bool m_doSupport; - bool m_forceMCMatch; - float m_minEt; // default is -1 - - /* Branch variables */ - uint32_t m_runNumber{}; - unsigned long long m_eventNumber{}; - unsigned int m_eventCounter{}; - float m_avgmu{}; - - /* Egamma */ - float m_el_et{}; - float m_el_pt{}; - float m_el_eta{}; - float m_el_phi{}; - float m_el_ethad1{}; - float m_el_ehad1{}; - float m_el_f1{}; - float m_el_f3{}; - float m_el_d0{}; - float m_el_f1core{}; - float m_el_f3core{}; - float m_el_weta2{}; - float m_el_wtots1{}; - float m_el_fracs1{}; - float m_el_Reta{}; - float m_el_Rphi{}; - float m_el_Eratio{}; - float m_el_Rhad{}; - float m_el_Rhad1{}; - float m_el_deta1{}; - float m_el_deta2{}; - float m_el_dphi2{}; - float m_el_dphiresc{}; - float m_el_dphiresc2{}; - float m_el_eprobht{}; - float m_el_charge{}; - uint8_t m_el_nblayerhits{}; - uint8_t m_el_nblayerolhits{}; - uint8_t m_el_npixhits{}; - uint8_t m_el_npixolhits{}; - uint8_t m_el_nscthits{}; - uint8_t m_el_nsctolhits{}; - uint8_t m_el_ntrthightreshits{}; - uint8_t m_el_ntrthits{}; - uint8_t m_el_ntrthighthresolhits{}; - uint8_t m_el_ntrtolhits{}; - uint8_t m_el_ntrtxenonhits{}; - bool m_el_expectblayerhit{}; - uint8_t m_el_nsihits{} ; - uint8_t m_el_nsideadsensors{} ; - uint8_t m_el_npixdeadsensors{} ; - uint8_t m_el_nsctdeadsensors{} ; - bool m_el_loose{}; - bool m_el_medium{}; - bool m_el_tight{}; - bool m_el_lhLoose{}; - bool m_el_lhMedium{}; - bool m_el_lhTight{}; - bool m_el_rgLoose{}; - bool m_el_rgMedium{}; - bool m_el_rgTight{}; - bool m_el_multiLepton{}; - std::vector<float> *m_el_ringsE; - int m_el_nGoodVtx{}; - int m_el_nPileupPrimaryVtx{}; - ///Egamma Calo - float m_calo_et{}; - float m_calo_eta{}; - float m_calo_phi{}; - - // Level 1 - float m_trig_L1_eta{}; - float m_trig_L1_phi{}; - float m_trig_L1_emClus{}; - float m_trig_L1_tauClus{}; - float m_trig_L1_emIsol{}; - float m_trig_L1_hadIsol{}; - std::vector<std::string> *m_trig_L1_thrNames; - bool m_trig_L1_accept{}; - // Level 2 Calo - float m_trig_L2_calo_et{}; - float m_trig_L2_calo_eta{}; - float m_trig_L2_calo_phi{}; - float m_trig_L2_calo_e237{}; - float m_trig_L2_calo_e277{}; - float m_trig_L2_calo_fracs1{}; - float m_trig_L2_calo_weta2{}; - float m_trig_L2_calo_ehad1{}; - float m_trig_L2_calo_emaxs1{}; - float m_trig_L2_calo_e2tsts1{}; - float m_trig_L2_calo_wstot{}; - float m_trig_L2_calo_rnnOutput{}; - std::vector<float> *m_trig_L2_calo_energySample; - std::vector<float> *m_trig_L2_calo_rings; - bool m_trig_L2_calo_accept{}; - // level 2 id - std::vector<int> *m_trig_L2_el_trackAlgID; - std::vector<float> *m_trig_L2_el_pt; - std::vector<float> *m_trig_L2_el_caloEta; - std::vector<float> *m_trig_L2_el_eta; - std::vector<float> *m_trig_L2_el_phi; - std::vector<float> *m_trig_L2_el_charge; - std::vector<float> *m_trig_L2_el_nTRTHits; - std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits; - std::vector<float> *m_trig_L2_el_etOverPt; - std::vector<float> *m_trig_L2_el_trkClusDeta; - std::vector<float> *m_trig_L2_el_trkClusDphi; - bool m_trig_L2_el_accept{}; - // Level EF - bool m_trig_EF_calo_accept{}; - std::vector<float> *m_trig_EF_calo_et; - std::vector<float> *m_trig_EF_calo_eta; - bool m_trig_EF_el_accept{}; - - - // Monte Carlo - bool m_mc_hasMC{} ; - float m_mc_pt{} ; - float m_mc_eta{} ; - float m_mc_phi{} ; - bool m_mc_isTop{} ; - bool m_mc_isParton{} ; - bool m_mc_isMeson{} ; - bool m_mc_isQuark{} ; - bool m_mc_isTau{} ; - bool m_mc_isMuon{} ; - bool m_mc_isPhoton{} ; - bool m_mc_isElectron{}; - bool m_mc_hasZMother{}; - bool m_mc_hasWMother{}; - -}; - - -#endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h index 317521db5d47..aa6a54f060ec 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h @@ -1,7 +1,6 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ - #ifndef TrigEgammaNavTPBaseTool_H #define TrigEgammaNavTPBaseTool_H @@ -25,9 +24,12 @@ #include "xAODTracking/TrackParticleContainer.h" #include "xAODTracking/TrackParticleAuxContainer.h" #include "xAODTrigCalo/TrigEMCluster.h" +#include "xAODTrigRinger/TrigRNNOutput.h" +#include "xAODTrigRinger/TrigRNNOutputContainer.h" #include "xAODCaloEvent/CaloClusterContainer.h" #include "xAODCaloEvent/CaloClusterAuxContainer.h" #include "xAODJet/JetContainer.h" +#include "xAODMissingET/MissingETContainer.h" #include "xAODTrigger/EmTauRoIContainer.h" #include "EgammaAnalysisInterfaces/IAsgElectronIsEMSelector.h" #include "EgammaAnalysisInterfaces/IAsgPhotonIsEMSelector.h" @@ -37,125 +39,139 @@ namespace Trig{ class FeatureContainer; } -class TrigEgammaNavTPBaseTool -: public TrigEgammaAnalysisBaseTool, +class TrigEgammaNavTPBaseTool: public TrigEgammaAnalysisBaseTool, virtual public ITrigEgammaAnalysisBaseTool { ASG_TOOL_CLASS(TrigEgammaNavTPBaseTool, ITrigEgammaAnalysisBaseTool) -public: - - TrigEgammaNavTPBaseTool( const std::string& myname ); - ~TrigEgammaNavTPBaseTool() {}; - - StatusCode childInitialize(); - StatusCode childBook(); - StatusCode childExecute(); - StatusCode childFinalize(); -protected: - /*! things like LAr-error, Tile-error, etc, should come here */ - bool EventWiseSelection(); - /*! at least one chain should pass. e28_tight_iloose? */ - bool MinimalTriggerRequirement (); - /*! Tag and Probe method called by derived classes */ - void executeTandP(); - /*! Match probes called by derived classes */ - void matchObjects(const std::string trigItem); - /*! Tag Electron selection */ - bool isTagElectron(const xAOD::Electron *el); - /*! Rerun offline selection */ - bool ApplyElectronPid(const xAOD::Electron *eg,const std::string); - /*! Rerun offline selection */ - void DressPid(const xAOD::Electron *eg); - /*! Probe selection */ - bool isGoodProbeElectron(const xAOD::Electron *el);//,const std::string,const float,const std::string); - /*! Event-wise trigger selection */ - bool passedTrigger(const HLT::TriggerElement* obj); - /*! Clears list of probes after each trigger item per event */ - void clearProbeList(); - /*! Clears list of matched probes after each trigger item per event */ - void clearPairList(); - /* Clears decorations offline objects */ - void clearDecorations(); - /*! Return pseudo-lifetime of Jpsi */ - float GetPseudoLifetime(const xAOD::Electron*,const xAOD::Electron*); - /*! Calculate the displacement of the Jpsi vertex w.r.t. the primary vertex in the transverse plane */ - double simple_lxy(int ,double, double, double , double , double , double , double, double ); - /*! vector of electron probes */ - std::vector<const xAOD::Electron*> m_probeElectrons; - /*! vector of photon probes */ - std::vector<const xAOD::Photon*> m_probePhotons; - /*! vector of offline electron probe and matched TE */ - std::vector<std::pair<const xAOD::Egamma*,const HLT::TriggerElement*> > m_pairObj; - /* vector of offline photon probe and matched TE */ - //std::vector<std::pair<const xAOD::Photon*,const HLT::TriggerElement*> > m_probePhotons; - /*! List of triggers from menu */ - std::vector<std::string> m_trigInputList; - /*! List of trigger categories for MaM */ - std::vector<std::string> m_categories; - /*! List of triggers to study */ - std::vector<std::string> m_trigList; - /*! Zee lower mass cut */ - float m_ZeeMassMin; - /*! Zee upper mass cut */ - float m_ZeeMassMax; - /*! Remove crack region for Probe default True */ - bool m_rmCrack; - /*! Directory name for each algorithm */ - std::string m_dir; - /*! Directory name for each algorithm */ - std::string m_anatype; + public: - const xAOD::EventInfo* m_eventInfo; - const xAOD::TruthParticleContainer* m_truthContainer; - - -private: - // ToolHandles - // - //Offline ++ selectors - // In python order will matter. Should always be tight, medium, loose - // Order no longer important since using a map - ///*! Offline isEM Selectors */ - ToolHandleArray<IAsgElectronIsEMSelector> m_electronIsEMTool; - /*! Offline LH Selectors */ - ToolHandleArray<IAsgElectronLikelihoodTool> m_electronLHTool; + TrigEgammaNavTPBaseTool( const std::string& myname ); + ~TrigEgammaNavTPBaseTool() {}; + + StatusCode childInitialize(); + StatusCode childBook(); + StatusCode childExecute(); + StatusCode childFinalize(); + + protected: + + /*! things like LAr-error, Tile-error, etc, should come here */ + bool EventWiseSelection(); + /*! pass without detector errors */ + bool passesEventCleaning(); + /*! at least one chain should pass. e28_tight_iloose? */ + bool MinimalTriggerRequirement (); + /*! Tag and Probe method called by derived classes */ + void executeTandP(); + /*! Match probes called by derived classes */ + void matchObjects(const std::string trigItem); + /*! Tag Electron selection */ + bool isTagElectron(const xAOD::Electron *el); + /*! Rerun offline selection */ + bool ApplyElectronPid(const xAOD::Electron *eg,const std::string); + /*! Rerun offline selection */ + void DressPid(const xAOD::Electron *eg); + /*! Probe selection */ + bool isGoodProbeElectron(const xAOD::Electron *el);//,const std::string,const float,const std::string); + /*! Event-wise trigger selection */ + bool passedTrigger(const HLT::TriggerElement* obj); + /*! Clears list of probes after each trigger item per event */ + void clearProbeList(); + /*! Clears list of matched probes after each trigger item per event */ + void clearPairList(); + /* Clears decorations offline objects */ + void clearDecorations(); + /*! Return pseudo-lifetime of Jpsi */ + float GetPseudoLifetime(const xAOD::Electron*,const xAOD::Electron*); + /*! Calculate the displacement of the Jpsi vertex w.r.t. the primary vertex in the transverse plane */ + double simple_lxy(int ,double, double, double , double , double , double , double, double ); + /*! get the W mass */ + float getWTransverseMass( const xAOD::Electron *el ); + /*! Return MissingEt obj */ + const xAOD::MissingET* getMET(){ + return (*m_METContainer)["FinalClus"]; + } - std::map< std::string, unsigned int > m_PidToolMap; /*! Pass a string to pick up correct selector */ - //std::map< std::string, std::string > m_PidMap; /*! Map trigger pid to selector pid */ - // - /*! Event Wise offline ElectronContainer Access and end iterator */ - const xAOD::ElectronContainer* m_offElectrons; - /*! Jet container for probe selection */ - const xAOD::JetContainer* m_jets; - /* TP selection properties */ + /*! The pair index for each electron */ + std::vector<std::pair<unsigned,unsigned>> m_Z; + /*! vector of electron probes */ + std::vector<const xAOD::Electron*> m_probeElectrons; + /*! vector of photon probes */ + std::vector<const xAOD::Photon*> m_probePhotons; + /*! vector of offline electron probe and matched TE */ + std::vector<std::pair<const xAOD::Egamma*,const HLT::TriggerElement*> > m_pairObj; + /* vector of offline photon probe and matched TE */ + //std::vector<std::pair<const xAOD::Photon*,const HLT::TriggerElement*> > m_probePhotons; + /*! List of triggers from menu */ + std::vector<std::string> m_trigInputList; + /*! List of trigger categories for MaM */ + std::vector<std::string> m_categories; + /*! List of triggers to study */ + std::vector<std::string> m_trigList; + /*! Zee lower mass cut */ + float m_ZeeMassMin; + /*! Zee upper mass cut */ + float m_ZeeMassMax; + /*! Remove crack region for Probe default True */ + bool m_rmCrack; + /*! Enable the requirement of triggers */ + bool m_applyMinimalTrigger; + /*! Directory name for each algorithm */ + std::string m_dir; + /*! Directory name for each algorithm */ + std::string m_anatype; + /*! Select opposite or same-sign pairs -- for background studies */ + bool m_oppositeCharge; + /*! Minimum tag Et */ + float m_tagMinEt; + /*! Minimum probe Et */ + float m_probeMinEt; + + // Containers + /*! Event Wise offline ElectronContainer Access and end iterator */ + const xAOD::ElectronContainer* m_offElectrons; + /*! Jet container for probe selection */ + const xAOD::JetContainer* m_jets; + /*! Missing Et container */ + const xAOD::MissingETContainer* m_METContainer; + /*! EventInfo Container */ + const xAOD::EventInfo* m_eventInfo; + /* Truth Container */ + const xAOD::TruthParticleContainer* m_truthContainer; - /*! Not needed */ - // unsigned int m_isEMoffTag; - /*! Define the PID for tag electron */ - std::string m_offTagTightness; - /*! define the Pid of Probe from the trigger name */ - std::string m_offProbeTightness; - /*! define the Pid of Probe from the user */ - std::string m_defaultProbeTightness; - /*! force user defined probe for pid triggers */ - bool m_forceProbePid; - /*! Select opposite or same-sign pairs -- for background studies */ - bool m_oppositeCharge; - /*! Minimum tag Et */ - float m_tagMinEt; - /*! Minimum probe Et */ - float m_probeMinEt; - /*! Trigger for tag and event wise selection */ - std::vector<std::string> m_tagTrigList; - /*! Apply nearby jet selection */ - bool m_applyJetNearProbeSelection; - /*! force probe isolation */ - bool m_forceProbeIsolation; - /*! Define isolation working point for Probe electron */ - std::string m_offProbeIsolation; - /*! skip trigger for offline Tag and Probe analysis */ - bool m_skipTrigger; + private: + // In python order will matter. Should always be tight, medium, loose + // Order no longer important since using a map + ///*! Offline isEM Selectors */ + ToolHandleArray<IAsgElectronIsEMSelector> m_electronIsEMTool; + /*! Offline LH Selectors */ + ToolHandleArray<IAsgElectronLikelihoodTool> m_electronLHTool; + + std::map< std::string, unsigned int > m_PidToolMap; /*! Pass a string to pick up correct selector */ + //std::map< std::string, std::string > m_PidMap; /*! Map trigger pid to selector pid */ + + /* TP selection properties */ + /*! Not needed */ + // unsigned int m_isEMoffTag; + /*! Define the PID for tag electron */ + std::string m_offTagTightness; + /*! define the Pid of Probe from the trigger name */ + std::string m_offProbeTightness; + /*! define the Pid of Probe from the user */ + std::string m_defaultProbeTightness; + /*! force user defined probe for pid triggers */ + bool m_forceProbePid; + /*! Trigger for tag and event wise selection */ + std::vector<std::string> m_tagTrigList; + /*! Apply nearby jet selection */ + bool m_applyJetNearProbeSelection; + /*! force probe isolation */ + bool m_forceProbeIsolation; + /*! Define isolation working point for Probe electron */ + std::string m_offProbeIsolation; + /*! skip trigger for offline Tag and Probe analysis */ + bool m_skipTrigger; }; #endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h deleted file mode 100755 index cfe8b5a74cec..000000000000 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H -#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H - -#include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h" -#include "xAODTracking/TrackParticle.h" -#include "xAODTracking/Vertex.h" -#include "xAODEventInfo/EventInfo.h" -#include "xAODEgamma/EgammaEnums.h" -#include "xAODTracking/TrackingPrimitives.h" - -class TrigEgammaNavTPNtuple : public TrigEgammaNavTPBaseTool, - virtual public ITrigEgammaAnalysisBaseTool -{ - ASG_TOOL_CLASS(TrigEgammaNavTPNtuple, ITrigEgammaAnalysisBaseTool) - - public: - - TrigEgammaNavTPNtuple( const std::string& myname ); - ~TrigEgammaNavTPNtuple() {}; - StatusCode childInitialize(); - StatusCode childBook(); - StatusCode childExecute(); - StatusCode childFinalize(); - - private: - - /* Dump trigger and offline probe object */ - bool executeProbesDump(); - bool executeProbesSupportDump(); - bool executeProbesItemDump(); - - - /* helper function */ - template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true); - - unsigned count_HLT_objects(const HLT::TriggerElement *); - - /* Create branches */ - void bookEventBranches( TTree *t ); - void bookElectronBranches( TTree *t ); - //void bookPhotonBranches( TTree *t ); - void bookTriggerBranches( TTree *t ); - void bookMonteCarloBranches( TTree *t ); - - /* uses InitBranch to connect the local variable and ttree pointer */ - void linkEventBranches( TTree *t); - void linkElectronBranches( TTree *t); - void linkPhotonBranches( TTree *t); - void linkTriggerBranches( TTree *t); - void linkMonteCarloBranches( TTree *t); - - /* parse between objects and local variables connected to the - * ttree pointer */ - bool fillEvent ( ); - bool fillMonteCarlo ( const xAOD::Egamma *eg ); - bool fillElectron ( const xAOD::Electron *el ); - //bool fillPhoton ( const xAOD::Photon *ph ); - - bool fillCaloRings ( const xAOD::Electron *el ); - bool fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ); - bool fillEmTauRoI ( const xAOD::EmTauRoI *emTauRoI ); - bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ); - bool fillTrigElectron ( const xAOD::TrigElectron *trigEl ); - bool fillCaloCluster ( const xAOD::CaloCluster *cluster ); - - - /* Space memory manager */ - void alloc_space(); - void release_space(); - void clear(); - - - private: - - - /* Offline variables only */ - bool m_doOfflineDump; - /* Support triggers dump */ - bool m_doSupport; - float m_probeMinEt; - - /* Branch variables */ - uint32_t m_runNumber{}; - unsigned long long m_eventNumber{}; - unsigned int m_eventCounter{}; - float m_avgmu{}; - /* Egamma */ - float m_el_et{}; - float m_el_pt{}; - float m_el_eta{}; - float m_el_phi{}; - float m_el_ethad1{}; - float m_el_ehad1{}; - float m_el_f1{}; - float m_el_f3{}; - float m_el_d0{}; - float m_el_f1core{}; - float m_el_f3core{}; - float m_el_weta2{}; - float m_el_wtots1{}; - float m_el_fracs1{}; - float m_el_Reta{}; - float m_el_Rphi{}; - float m_el_Eratio{}; - float m_el_Rhad{}; - float m_el_Rhad1{}; - float m_el_deta1{}; - float m_el_deta2{}; - float m_el_dphi2{}; - float m_el_dphiresc{}; - float m_el_dphiresc2{}; - float m_el_eprobht{}; - float m_el_charge{}; - uint8_t m_el_nblayerhits{}; - uint8_t m_el_nblayerolhits{}; - uint8_t m_el_npixhits{}; - uint8_t m_el_npixolhits{}; - uint8_t m_el_nscthits{}; - uint8_t m_el_nsctolhits{}; - uint8_t m_el_ntrthightreshits{}; - uint8_t m_el_ntrthits{}; - uint8_t m_el_ntrthighthresolhits{}; - uint8_t m_el_ntrtolhits{}; - uint8_t m_el_ntrtxenonhits{}; - bool m_el_expectblayerhit{}; - uint8_t m_el_nsihits{} ; - uint8_t m_el_nsideadsensors{} ; - uint8_t m_el_npixdeadsensors{} ; - uint8_t m_el_nsctdeadsensors{} ; - bool m_el_loose{}; - bool m_el_medium{}; - bool m_el_tight{}; - bool m_el_lhLoose{}; - bool m_el_lhMedium{}; - bool m_el_lhTight{}; - bool m_el_rgLoose{}; - bool m_el_rgMedium{}; - bool m_el_rgTight{}; - bool m_el_multiLepton{}; - std::vector<float> *m_el_ringsE; - int m_el_nGoodVtx{}; - int m_el_nPileupPrimaryVtx{}; - ///Egamma Calo - float m_calo_et{}; - float m_calo_eta{}; - float m_calo_phi{}; - - // Level 1 - float m_trig_L1_eta{}; - float m_trig_L1_phi{}; - float m_trig_L1_emClus{}; - float m_trig_L1_tauClus{}; - float m_trig_L1_emIsol{}; - float m_trig_L1_hadIsol{}; - std::vector<std::string> *m_trig_L1_thrNames; - bool m_trig_L1_accept{}; - // Level 2 Calo - float m_trig_L2_calo_et{}; - float m_trig_L2_calo_eta{}; - float m_trig_L2_calo_phi{}; - float m_trig_L2_calo_e237{}; - float m_trig_L2_calo_e277{}; - float m_trig_L2_calo_fracs1{}; - float m_trig_L2_calo_weta2{}; - float m_trig_L2_calo_ehad1{}; - float m_trig_L2_calo_emaxs1{}; - float m_trig_L2_calo_e2tsts1{}; - float m_trig_L2_calo_wstot{}; - float m_trig_L2_calo_rnnOutput{}; - std::vector<float> *m_trig_L2_calo_energySample; - std::vector<float> *m_trig_L2_calo_rings; - bool m_trig_L2_calo_accept{}; - // level 2 id - std::vector<int> *m_trig_L2_el_trackAlgID; - std::vector<float> *m_trig_L2_el_pt; - std::vector<float> *m_trig_L2_el_caloEta; - std::vector<float> *m_trig_L2_el_eta; - std::vector<float> *m_trig_L2_el_phi; - std::vector<float> *m_trig_L2_el_charge; - std::vector<float> *m_trig_L2_el_nTRTHits; - std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits; - std::vector<float> *m_trig_L2_el_etOverPt; - std::vector<float> *m_trig_L2_el_trkClusDeta; - std::vector<float> *m_trig_L2_el_trkClusDphi; - - - bool m_trig_L2_el_accept{}; - // Level EF - bool m_trig_EF_calo_accept{}; - std::vector<float> *m_trig_EF_calo_et; - std::vector<float> *m_trig_EF_calo_eta; - bool m_trig_EF_el_accept{}; - - - // Monte Carlo - bool m_mc_hasMC{} ; - float m_mc_pt{} ; - float m_mc_eta{} ; - float m_mc_phi{} ; - bool m_mc_isTop{} ; - bool m_mc_isQuark{} ; - bool m_mc_isParton{} ; - bool m_mc_isMeson{} ; - bool m_mc_isTau{} ; - bool m_mc_isMuon{} ; - bool m_mc_isPhoton{} ; - bool m_mc_isElectron{}; - bool m_mc_hasZMother{}; - bool m_mc_hasWMother{}; - - -}; - - - -#endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h new file mode 100644 index 000000000000..53f925f4fe32 --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h @@ -0,0 +1,320 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMAPHYSVALBASE_H +#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMAPHYSVALBASE_H + +#include "xAODEventInfo/EventInfo.h" +#include "xAODTruth/TruthParticle.h" +#include "xAODTruth/TruthParticleContainer.h" +#include "xAODEventInfo/EventInfo.h" +#include "xAODEgamma/EgammaEnums.h" +#include "xAODTracking/TrackingPrimitives.h" +#include "TrigDecisionTool/TrigDecisionTool.h" +#include "TTree.h" + +class TrigEgammaPhysValBase +{ + public: + TrigEgammaPhysValBase(); + ~TrigEgammaPhysValBase() {}; + + protected: + /* helper function */ + template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true); + + /* Create branches */ + void bookEventBranches( TTree *t ); + void bookElectronBranches( TTree *t ); + void bookTriggerBranches( TTree *t ); + void bookMonteCarloBranches( TTree *t ); + void bookTDTBranches( TTree *t ); + + /* uses InitBranch to connect the local variable and ttree pointer */ + void linkEventBranches( TTree *t); + void linkElectronBranches( TTree *t); + void linkTriggerBranches( TTree *t); + void linkSelectorBranches( TTree *t); + void linkMonteCarloBranches( TTree *t); + void linkTDTBranches( TTree *t); + + /* Space memory manager */ + void alloc_space(); + void release_space(); + void clear(); + void createTDTMetadata( TTree *t, std::vector<std::string> trigList ); + + bool m_doMCDetailed; + bool m_doL2Detailed; + bool m_doL2CaloDetailed; + bool m_doRecoDetailed; + + /* Branch variables */ + uint32_t m_runNumber{}; + unsigned long long m_eventNumber{}; + unsigned int m_eventCounter{}; + float m_avgmu{}; + float m_lumiBlock{}; + + /* Egamma */ + + bool m_el_hasCalo ; + bool m_el_hasTrack ; + float m_el_e; + float m_el_et; + float m_el_eta; + float m_el_phi; + float m_el_ethad1; + float m_el_ehad1; + float m_el_f1; + float m_el_f3; + float m_el_f1core; + float m_el_f3core; + float m_el_weta1; + float m_el_weta2; + float m_el_wtots1; + float m_el_fracs1; + float m_el_Reta; + float m_el_Rphi; + float m_el_Eratio; + float m_el_Rhad; + float m_el_Rhad1; + float m_el_deta1; + float m_el_deta2; + float m_el_dphi2; + float m_el_dphiresc; + float m_el_deltaPhiRescaled2; + float m_el_deltaEta1; + float m_el_deltaE; + float m_el_e277; + std::vector<float> *m_el_etCone; + std::vector<float> *m_el_ptCone; + + + + float m_el_trk_pt; + float m_el_trk_eta; + float m_el_trk_charge; + float m_el_trk_sigd0; + float m_el_trk_d0; + float m_el_trk_eProbabilityHT; + float m_el_trk_transformed_eProbabilityHT; + float m_el_trk_d0significance; + float m_el_trk_deltaPOverP; + float m_el_trk_qOverP; + std::vector<uint8_t> *m_el_trk_summaryValues; + + bool m_el_loose{}; + bool m_el_medium{}; + bool m_el_tight{}; + bool m_el_lhVLoose{}; + bool m_el_lhLoose{}; + bool m_el_lhMedium{}; + bool m_el_lhTight{}; + bool m_el_rgLoose{}; + bool m_el_rgMedium{}; + bool m_el_rgTight{}; + bool m_el_multiLepton{}; + std::vector<float> *m_el_ringsE; + int m_el_nGoodVtx{}; + int m_el_nPileupPrimaryVtx{}; + ///Egamma Calo + float m_el_calo_et{}; + float m_el_calo_eta{}; + float m_el_calo_phi{}; + float m_el_calo_etaBE2{}; + float m_el_calo_e{}; + // Level 1 + float m_trig_L1_eta{}; + float m_trig_L1_phi{}; + float m_trig_L1_emClus{}; + float m_trig_L1_tauClus{}; + float m_trig_L1_emIsol{}; + float m_trig_L1_hadIsol{}; + float m_trig_L1_hadCore{}; + std::vector<std::string> *m_trig_L1_thrNames; + + // Level 2 Calo + float m_trig_L2_calo_et{}; + float m_trig_L2_calo_eta{}; + float m_trig_L2_calo_phi{}; + float m_trig_L2_calo_e237{}; + float m_trig_L2_calo_e277{}; + float m_trig_L2_calo_fracs1{}; + float m_trig_L2_calo_weta2{}; + float m_trig_L2_calo_ehad1{}; + float m_trig_L2_calo_emaxs1{}; + float m_trig_L2_calo_e2tsts1{}; + float m_trig_L2_calo_wstot{}; + float m_trig_L2_calo_nnOutput{}; + std::vector<float> *m_trig_L2_calo_energySample; + std::vector<float> *m_trig_L2_calo_rings; + std::vector<float> *m_trig_L2_calo_rnnOutput; + // level 2 id + std::vector<int> *m_trig_L2_el_trackAlgID; + std::vector<float> *m_trig_L2_el_pt; + std::vector<float> *m_trig_L2_el_caloEta; + std::vector<float> *m_trig_L2_el_eta; + std::vector<float> *m_trig_L2_el_phi; + std::vector<float> *m_trig_L2_el_charge; + std::vector<float> *m_trig_L2_el_nTRTHits; + std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits; + std::vector<float> *m_trig_L2_el_etOverPt; + std::vector<float> *m_trig_L2_el_trkClusDeta; + std::vector<float> *m_trig_L2_el_trkClusDphi; + + // EFCalo and HLT steps + + std::vector<float> *m_trig_EF_calo_e; + std::vector<float> *m_trig_EF_calo_et; + std::vector<float> *m_trig_EF_calo_eta; + std::vector<float> *m_trig_EF_calo_phi; + std::vector<float> *m_trig_EF_calo_etaBE2; + + std::vector<float> *m_trig_EF_el_calo_e; + std::vector<float> *m_trig_EF_el_calo_et; + std::vector<float> *m_trig_EF_el_calo_eta; + std::vector<float> *m_trig_EF_el_calo_phi; + std::vector<float> *m_trig_EF_el_calo_etaBE2; + + std::vector<float> *m_trig_EF_el_e; + std::vector<float> *m_trig_EF_el_et; + std::vector<float> *m_trig_EF_el_eta; + std::vector<float> *m_trig_EF_el_phi; + std::vector<float> *m_trig_EF_el_ethad1; + std::vector<float> *m_trig_EF_el_ehad1; + std::vector<float> *m_trig_EF_el_f1; + std::vector<float> *m_trig_EF_el_f3; + std::vector<float> *m_trig_EF_el_f1core; + std::vector<float> *m_trig_EF_el_f3core; + std::vector<float> *m_trig_EF_el_weta1; + std::vector<float> *m_trig_EF_el_weta2; + std::vector<float> *m_trig_EF_el_wtots1; + std::vector<float> *m_trig_EF_el_fracs1; + std::vector<float> *m_trig_EF_el_Reta; + std::vector<float> *m_trig_EF_el_Rphi; + std::vector<float> *m_trig_EF_el_Eratio; + std::vector<float> *m_trig_EF_el_Rhad; + std::vector<float> *m_trig_EF_el_Rhad1; + std::vector<float> *m_trig_EF_el_deta2; + std::vector<float> *m_trig_EF_el_dphi2; + std::vector<float> *m_trig_EF_el_dphiresc; + std::vector<float> *m_trig_EF_el_e277; + std::vector<float> *m_trig_EF_el_deltaPhiRescaled2; + std::vector<float> *m_trig_EF_el_deltaEta1; + std::vector<float> *m_trig_EF_el_deltaE; + std::vector<float> *m_trig_EF_el_etCone; + std::vector<float> *m_trig_EF_el_ptCone; + + + std::vector<float> *m_trig_EF_el_trk_pt; + std::vector<float> *m_trig_EF_el_trk_eta; + std::vector<float> *m_trig_EF_el_trk_charge; + std::vector<float> *m_trig_EF_el_trk_sigd0; + std::vector<float> *m_trig_EF_el_trk_d0; + std::vector<float> *m_trig_EF_el_trk_eProbabilityHT; + std::vector<float> *m_trig_EF_el_trk_transformed_eProbabilityHT; + std::vector<float> *m_trig_EF_el_trk_d0significance; + std::vector<float> *m_trig_EF_el_trk_deltaPOverP; + std::vector<float> *m_trig_EF_el_trk_qOverP; + std::vector<uint8_t> *m_trig_EF_el_trk_summaryValues; + + + std::vector<bool> *m_trig_EF_el_hasCalo ; + std::vector<bool> *m_trig_EF_el_hasTrack ; + + + + std::vector<bool> *m_trig_EF_el_loose; + std::vector<bool> *m_trig_EF_el_medium; + std::vector<bool> *m_trig_EF_el_tight; + std::vector<bool> *m_trig_EF_el_lhvloose; + std::vector<bool> *m_trig_EF_el_lhloose; + std::vector<bool> *m_trig_EF_el_lhmedium; + std::vector<bool> *m_trig_EF_el_lhtight; + std::vector<bool> *m_trig_EF_calo_loose; + std::vector<bool> *m_trig_EF_calo_medium; + std::vector<bool> *m_trig_EF_calo_tight; + std::vector<bool> *m_trig_EF_calo_lhvloose; + std::vector<bool> *m_trig_EF_calo_lhloose; + std::vector<bool> *m_trig_EF_calo_lhmedium; + std::vector<bool> *m_trig_EF_calo_lhtight; + + std::vector<int> *m_trig_tdt_L1_calo_accept; + std::vector<int> *m_trig_tdt_L2_calo_accept; + std::vector<int> *m_trig_tdt_L2_el_accept ; + std::vector<int> *m_trig_tdt_EF_calo_accept; + std::vector<int> *m_trig_tdt_EF_el_accept ; + std::vector<int> *m_trig_tdt_emu_L1_calo_accept; + std::vector<int> *m_trig_tdt_emu_L2_calo_accept; + std::vector<int> *m_trig_tdt_emu_L2_el_accept ; + std::vector<int> *m_trig_tdt_emu_EF_calo_accept; + std::vector<int> *m_trig_tdt_emu_EF_el_accept ; + + + + // Monte Carlo + bool m_mc_hasMC{} ; + float m_mc_pt{} ; + float m_mc_eta{} ; + float m_mc_phi{} ; + bool m_mc_isTop{} ; + bool m_mc_isParton{} ; + bool m_mc_isMeson{} ; + bool m_mc_isQuark{} ; + bool m_mc_isTau{} ; + bool m_mc_isMuon{} ; + bool m_mc_isPhoton{} ; + bool m_mc_isElectron{}; + bool m_mc_hasZMother{}; + bool m_mc_hasWMother{}; + + /* + + uint8_t m_el_nblayerhits; + uint8_t m_el_nblayerolhits; + uint8_t m_el_npixhits; + uint8_t m_el_npixolhits; + uint8_t m_el_nscthits; + uint8_t m_el_nsctolhits; + uint8_t m_el_ntrthightreshits; + uint8_t m_el_ntrthits; + uint8_t m_el_ntrthighthresolhits; + uint8_t m_el_ntrtolhits; + uint8_t m_el_ntrtxenonhits; + uint8_t m_el_expectblayerhit; + uint8_t m_el_nsihits ; + uint8_t m_el_nsideadsensors ; + uint8_t m_el_npixdeadsensors ; + uint8_t m_el_nsctdeadsensors ; + uint8_t m_el_expectNextToInnerMostLayer; + uint8_t m_el_nNextToInnerMostLayerHits; + uint8_t m_el_nNextToInnerMostLayerOutliers; + + std::vector<float> *m_trig_EF_el_charge; + std::vector<uint8_t> *m_trig_EF_el_nblayerhits; + std::vector<uint8_t> *m_trig_EF_el_nblayerolhits; + std::vector<uint8_t> *m_trig_EF_el_npixhits; + std::vector<uint8_t> *m_trig_EF_el_npixolhits; + std::vector<uint8_t> *m_trig_EF_el_nscthits; + std::vector<uint8_t> *m_trig_EF_el_nsctolhits; + std::vector<uint8_t> *m_trig_EF_el_ntrthightreshits; + std::vector<uint8_t> *m_trig_EF_el_ntrthits; + std::vector<uint8_t> *m_trig_EF_el_ntrthighthresolhits; + std::vector<uint8_t> *m_trig_EF_el_ntrtolhits; + std::vector<uint8_t> *m_trig_EF_el_ntrtxenonhits; + std::vector<uint8_t> *m_trig_EF_el_expectblayerhit; + std::vector<uint8_t> *m_trig_EF_el_transformed_expectblayerhit; + std::vector<uint8_t> *m_trig_EF_el_nsihits ; + std::vector<uint8_t> *m_trig_EF_el_nsideadsensors ; + std::vector<uint8_t> *m_trig_EF_el_npixdeadsensors ; + std::vector<uint8_t> *m_trig_EF_el_nsctdeadsensors ; + std::vector<uint8_t> *m_trig_EF_el_expectNextToInnerMostLayer; + std::vector<uint8_t> *m_trig_EF_el_nNextToInnerMostLayerHits; + std::vector<uint8_t> *m_trig_EF_el_nNextToInnerMostLayerOutliers; + */ +}; + + +#endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h index c1cd6fa59b9b..7d141d4e1575 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h @@ -73,8 +73,8 @@ class TrigEgammaPlotTool int m_ncoarseEtabins; //2D std::vector<float> m_etbins; std::vector<float> m_etabins; - std::vector<float> m_minBin_ringer; - std::vector<float> m_maxBin_ringer; + std::vector<float> m_ringerEtbins; + std::vector<float> m_ringerEtabins; std::vector<double> m_defaultEtbins; std::vector<double> m_defaultEtabins; std::vector<double> m_coarseEtbins; @@ -131,6 +131,7 @@ class TrigEgammaPlotTool void bookExpertResolutionHistos(const std::string dir); void bookExpertL2CaloResolutionHistos(const std::string dir); void bookAbsResolutionHistos(const std::string dir); + void bookRnnDistributionHistos(const std::string dir); void parseCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, std::string &caloLayerName); }; #endif diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py index 2159a9dd7815..6b5d24fa7d7f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py @@ -1,10 +1,11 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + from TrigEgammaAnalysisTools import TrigEgammaAnalysisToolsConf from AthenaCommon import CfgMgr from AthenaCommon.AppMgr import ToolSvc -from egammaRec.Factories import ToolFactory,FcnWrapper,AlgFactory, getPropertyValue +from egammaRec.Factories import PublicToolFactory,FcnWrapper,AlgFactory, getPropertyValue import PyUtils.RootUtils as ru ROOT = ru.import_root() @@ -29,22 +30,29 @@ MediumElectronSelector = CfgMgr.AsgElectronIsEMSelector("T0HLTMediumE TightElectronSelector = CfgMgr.AsgElectronIsEMSelector("T0HLTTightElectronSelector") LooseLHSelector = CfgMgr.AsgElectronLikelihoodTool("T0HLTLooseLHSelector") MediumLHSelector = CfgMgr.AsgElectronLikelihoodTool("T0HLTMediumLHSelector") -MediumLHHISelector = CfgMgr.AsgElectronLikelihoodTool("T0HLTMediumLHHISelector") TightLHSelector = CfgMgr.AsgElectronLikelihoodTool("T0HLTTightLHSelector") +VeryLooseLHSelector = CfgMgr.AsgElectronLikelihoodTool("T0HLTVeryLooseLHSelector") + +# see the configuration calib paths below LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf" MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf" TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf" +# 2018 (vtest) LooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodLooseOfflineConfig2017_CutBL_Smooth.conf" MediumLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodMediumOfflineConfig2017_Smooth.conf" -MediumLHHISelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160907_HI/ElectronLikelihoodMediumOfflineConfig2016_HI.conf" TightLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf" +VeryLooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth.conf" + + + + ToolSvc+=LooseElectronSelector ToolSvc+=MediumElectronSelector ToolSvc+=TightElectronSelector ToolSvc+=LooseLHSelector ToolSvc+=MediumLHSelector -ToolSvc+=MediumLHHISelector ToolSvc+=TightLHSelector +ToolSvc+=VeryLooseLHSelector #from LumiBlockComps.LuminosityToolDefault import LuminosityToolOnline @@ -69,81 +77,43 @@ EgammaMatchTool = Trig__TrigEgammaMatchingTool() ToolSvc += EgammaMatchTool # Plot Tool sets the base path for histograms of all tools -TrigEgammaPlotTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaPlotTool, name="TrigEgammaPlotTool", +TrigEgammaPlotTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaPlotTool, name="TrigEgammaPlotTool", DirectoryPath="/HLT/Egamma", MaM=monitoring_mam, Efficiency=["eff_et","eff_eta","eff_mu"], Distribution=["et","eta"], Resolution=["res_et","res_eta"], OutputLevel=0) -EfficiencyTool = ToolFactory(TrigEgammaAnalysisToolsConf.EfficiencyTool, + +EfficiencyTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.EfficiencyTool, name="EfficiencyTool", PlotTool=TrigEgammaPlotTool, isEMResultNames=["Tight","Medium","Loose"], LHResultNames=["LHTight","LHMedium","LHLoose"], OutputLevel=0) -ResolutionTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaResolutionTool, + +ResolutionTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaResolutionTool, name="ResolutionTool", PlotTool=TrigEgammaPlotTool, OutputLevel=0) -DistTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaDistTool, + +DistTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaDistTool, name="DistTool", PlotTool=TrigEgammaPlotTool, OutputLevel=0) # import emulator egamma trigger tool -from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool +#from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool # Copy the default config w/ list # Allows factories below to instantiate emulator once Factories are instantiated -EmulationTool = TrigEgammaEmulationTool.copy( name = "TrigEgammaEmulationTool", - TriggerList = monitoringTP_electron) - -TrigEgammaNavTPNtuple = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPNtuple, name ="TrigEgammaNavTPNtuple", - Analysis='ZeeTPNtuple', - ElectronKey = 'Electrons', - MatchTool = EgammaMatchTool, - PlotTool=TrigEgammaPlotTool, - EmulationTool=EmulationTool, - Tools=[], - isEMResultNames=["Tight","Medium","Loose"], - LHResultNames=["LHTight","LHMedium","LHLoose"], - ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], - ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], - ZeeLowerMass=80, - ZeeUpperMass=100, - doOfflineDump=False, - doEmulation=False, - OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose - OfflineProbeSelector='Loose', - ForceProbePid=False, - OppositeCharge=True, - OfflineTagMinEt=25, - CutLabels=["Events","LAr","RetrieveElectrons","TwoElectrons","PassTrigger","EventWise","Success"], - TagTriggerList=["e24_tight_iloose"], - TriggerList=monitoringTP_electron +#EmulationTool = TrigEgammaEmulationTool.copy( name = "TrigEgammaEmulationTool", +# TriggerList = monitoringTP_electron) - ) +################################################################################################ +# Build factory -TrigEgammaNavNtuple = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavNtuple, name ="TrigEgammaNavNtuple", - Analysis='Ntuple', - ElectronKey = 'Electrons', - MatchTool = EgammaMatchTool, - PlotTool=TrigEgammaPlotTool, - EmulationTool=EmulationTool, - Tools=[], - ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], - ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], - TriggerList=monitoringTP_electron, - doOfflineDump=False, - doEmulation=False, - ForcePidSelection=True, - ForceProbeIsolation=False, - ForceEtThreshold=True, - ForceMCEnhancedBias=False, - RemoveCrack=True, - ) -TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, name = "TrigEgammaNavTPAnalysisTool", +TrigEgammaNavTPAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, name = "TrigEgammaNavTPAnalysisTool", Analysis='Zee', ElectronKey = 'Electrons', MatchTool = EgammaMatchTool, @@ -162,6 +132,7 @@ TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgamma OppositeCharge=True, doJpsiee=False, doEmulation=False, + ForceTrigAttachment=False, TPTrigger=False, OfflineTagMinEt=25, RemoveCrack=True, @@ -173,7 +144,7 @@ TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgamma TagLabels=["Electrons","HasTrack","HasCluster","GoodPid","Et","Eta","IsGoodOQ","PassTrigger","MatchTrigger"], ) -TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, +TrigEgammaNavTPJpsieeAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, name = "TrigEgammaNavTPJpsieeAnalysisTool", Analysis='Jpsiee', ElectronKey = 'Electrons', @@ -184,7 +155,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig isEMResultNames=["Tight","Medium","Loose"], LHResultNames=["LHTight","LHMedium","LHLoose"], ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], - ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector, MediumLHHISelector], + ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], ZeeLowerMass=2, ZeeUpperMass=5, OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose @@ -193,6 +164,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig OppositeCharge=True, doJpsiee=True, doEmulation=False, + ForceTrigAttachment=False, TPTrigger=False, OfflineTagMinEt=5, RemoveCrack=True, @@ -204,7 +176,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig TagLabels=["Electrons","HasTrack","HasCluster","GoodPid","Et","Eta","PassTrigger","MatchTrigger"], ) -TrigEgammaNavAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavAnalysisTool", +TrigEgammaNavAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavAnalysisTool", Analysis='Analysis', ElectronKey = 'Electrons', MatchTool = EgammaMatchTool, @@ -212,42 +184,140 @@ TrigEgammaNavAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNa #EmulationTool=EmulationTool, Tools=[EfficiencyTool,ResolutionTool,DistTool], ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], - ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,MediumLHHISelector], + ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], + ElectronLHVLooseTool=VeryLooseLHSelector, IsEMLabels=IneffLabels, TriggerList=monitoring_electron + monitoring_photon, ForcePidSelection=True, ForceProbeIsolation=False, ForceEtThreshold=True, + ForceTrigAttachment=False, RemoveCrack=True, doEmulation=False, ) -TrigEgammaNavEnhancedBiasAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavEnhancedBiasAnalysisTool", - Analysis='EnhancedBias', - ElectronKey = 'Electrons', - MatchTool = EgammaMatchTool, - EmulationTool=EmulationTool, - PlotTool=TrigEgammaPlotTool, - Tools=[EfficiencyTool,ResolutionTool,DistTool], - ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], - ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], - IsEMLabels=IneffLabels, - TriggerList=monitoring_electron + monitoring_photon, - ForcePidSelection=False, - ForceProbeIsolation=False, - ForceEtThreshold=False, - ForceMCEnhancedBias=False, - RemoveCrack=False, - doEmulation=False, - ) +############################################################################################# +# Functions # Function to return triggerlist tools def getAllTools(): return [TrigEgammaNavZeeTPCounts(),TrigEgammaNavZeeTPEff(),TrigEgammaNavZeeTPIneff(),TrigEgammaNavZeeTPRes(),] + +def setRunFlag( runFlag ): + if runFlag == '2018': + # cut based + LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf" + MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf" + TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf" + + # 2018 (vtest) + LooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodLooseOfflineConfig2017_CutBL_Smooth.conf" + MediumLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodMediumOfflineConfig2017_Smooth.conf" + TightLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf" + VeryLooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth.conf" + elif runFlag == '2017': + # cut based + LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf" + MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf" + TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf" + + # 2017 (v11) + LooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodLooseOfflineConfig2016_CutBL_Smooth.conf" + MediumLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodMediumOfflineConfig2016_Smooth.conf" + TightLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodTightOfflineConfig2016_Smooth.conf" + VeryLooseLHSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodVeryLooseOfflineConfig2016_Smooth.conf" + else: + print 'Wrong run flag configuration' + + + # The main algorithm # Add triggerlist tools to ToolHandleArray TrigEgammaAnalysisAlg = AlgFactory(TrigEgammaAnalysisToolsConf.TrigEgammaAnalysisAlg, name='TrigEgammaAnalysisAlg', Tools = FcnWrapper(getAllTools), ) + + + +# This function will be used to collect events from Zee,JF17 and PhysicsMain samples. +# Use this if you really know. (for experts) +def getEventSelectionTool(runFlag): + + from TrigEgammaEmulationTool.TrigEgammaEmulationPidToolsConfig import getEgammaIsEMSelectorCaloOnly, \ + getElectronIsEMSelector,\ + getEgammaLikelihoodSelectorCaloOnly, \ + getElectronLikelihoodSelector2015,\ + getElectronLikelihoodSelectorNoD0 + from AthenaCommon import CfgMgr + from AthenaCommon.AppMgr import ToolSvc + # create all selector list. Here, the order is matter. Please check the + + setRunFlag(runFlag) + if runFlag == '2017': + + # trigger configuration + EFCaloIsEMSelectorList = getEgammaIsEMSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20170217") + HLTIsEMSelectorList = getElectronIsEMSelector( "ElectronPhotonSelectorTools/trigger/rel21_20170217") + EFCaloLikelihoodSelectorList = getEgammaLikelihoodSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20170217") + HLTLikelihoodSelectorList = getElectronLikelihoodSelectorNoD0( "ElectronPhotonSelectorTools/trigger/rel21_20170217") + + elif runFlag == '2018': + # trigger configuration + EFCaloIsEMSelectorList = getEgammaIsEMSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20180312") + HLTIsEMSelectorList = getElectronIsEMSelector( "ElectronPhotonSelectorTools/trigger/rel21_20180312") + EFCaloLikelihoodSelectorList = getEgammaLikelihoodSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20180312") + HLTLikelihoodSelectorList = getElectronLikelihoodSelectorNoD0( "ElectronPhotonSelectorTools/trigger/rel21_20180312") + + else: + print 'Wrong run flag configuration' + + # create the event selection tool + TrigEgammaEventSelection = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaEventSelection, name ="TrigEgammaEventSelection", + Analysis='EventsSelection', + ElectronKey = 'Electrons', + MatchTool = EgammaMatchTool, + PlotTool=TrigEgammaPlotTool, + EmulationTool=EmulationTool, # The emulation must be on in this tool. + doEmulation=True, + Tools=[], + isEMResultNames=["Tight","Medium","Loose"], + LHResultNames=["LHTight","LHMedium","LHLoose"], + ElectronLHVLooseTool=VeryLooseLHSelector, + ZeeLowerMass=80, + ZeeUpperMass=100, + OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose + OfflineProbeSelector='Loose', + ForceProbePid=False, + OppositeCharge=True, + RemoveCrack=False, + OfflineTagMinEt=25, + OfflineProbeMinEt=4, + CutLabels=["Events","LAr","RetrieveElectrons","TwoElectrons","PassTrigger","EventWise","Success"], + TagTriggerList=["e24_tight_iloose"], + TriggerList=monitoringTP_electron, + ApplyMinimalTrigger = False, + SelectionZ=True, + SelectionW=False, + SelectionJpsi=False, + SelectionFakes=False, + SelectionMC=False, + ForceTrigAttachment=True, + DetailedDataLevel=0, # 0 = VerySlim, 1 = Slim and 2 = Full + # Asg selectors to decorate my final skimmed ntuple. + EFCaloElectronLikelihoodSelector=EFCaloLikelihoodSelectorList, + EFCaloElectronIsEMSelector=EFCaloIsEMSelectorList, + HLTElectronLikelihoodSelector=HLTLikelihoodSelectorList, + HLTElectronIsEMSelector=HLTIsEMSelectorList, + ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector], + ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], + + ) + + + # Return the template + return TrigEgammaEventSelection + + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py index 7a86304b75c8..cad747178a9a 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py @@ -484,6 +484,7 @@ defaultJpsi=[ "HLT_e5_lhvloose", ] + # Lowest single electron triggers for TP analysis monitoringTP_electron_extra =[ 'HLT_e24_lhmedium_L1EM18VH', @@ -514,3 +515,37 @@ monitoringTP_electron_extra =[ ] + +### Make supproting trigger list for the emulation e/g tool +supportingTriggerList = probeListLowMidPtSupportingTriggers+probeListHighPtSupportingTriggers +# Update the supporting list with very loose chains. This will be used in data collisin matches +for trig in probeListLowMidPtPhysicsTriggers+probeListHighPtPhysicsTriggers: + if 'vloose' in trig: supportingTriggerList.append(trig) + +supportingTriggerList.extend( [ + 'HLT_e24_lhvloose_nod0_L1EM20VH', + 'HLT_e26_lhvloose_nod0_L1EM20VH', + 'HLT_e28_lhvloose_nod0_L1EM20VH', + 'HLT_e140_lhvloose_nod0', + 'HLT_e10_lhvloose_nod0_L1EM7', + 'HLT_e10_lhvloose_nod0_L1EM7', + 'HLT_e15_lhvloose_nod0_L1EM7', + 'HLT_e20_lhvloose_nod0_L1EM12', + 'HLT_e25_lhvloose_nod0_L1EM15', + 'HLT_e30_lhvloose_nod0_L1EM15', + 'HLT_e40_lhvloose_nod0_L1EM15', + 'HLT_e50_lhvloose_nod0_L1EM15', + 'HLT_e70_lhvloose_nod0', + 'HLT_e80_lhvloose_nod0', + 'HLT_e100_lhvloose_nod0', + 'HLT_e120_lhvloose_nod0', + 'HLT_e5_lhvloose_nod0', + 'HLT_e12_lhvloose_nod0_L1EM10VH', + 'HLT_e17_lhvloose_nod0', + 'HLT_e20_lhvloose_nod0', + 'HLT_e40_lhvloose_nod0', + 'HLT_e60_lhvloose_nod0', +] ) + + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py new file mode 100644 index 000000000000..740c69cdd444 --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py @@ -0,0 +1,249 @@ + +#################################################################################################### +# Job options for standalone and Tier0 running of AnalysisTools +# Authors: +# Ryan Mackenzie White <ryan.white@cern.ch> +# Joao Victor Pinto <jodafons@cern.ch> +# +# Tool and algorithm configuration done using egamma Factories +# +# To run +# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/\ +# valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" +# -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py +# where NOV is the number of events to run +#################################################################################################### + + +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from RecExConfig.RecFlags import rec +from RecExConfig.RecAlgsFlags import recAlgs +from AthenaCommon.AppMgr import ToolSvc +import os + +# Define triggers for tagging +tagList = ['HLT_e24_lhtight_nod0_ivarloose', + 'HLT_e26_lhtight_nod0_ivarloose', + 'HLT_e28_lhtight_nod0_ivarloose'] + +triggerList_commissioning_v1 = [ + + # standard monitoring chains + #'HLT_e17_lhvloose_nod0_L1EM15VHI', + 'HLT_e17_lhvloose_nod0', + 'HLT_e26_lhloose_nod0', + 'HLT_e26_lhmedium_nod0', + #'HLT_e26_lhtight_nod0', + #'HLT_e26_lhtight_nod0_ivarloose', + 'HLT_e28_lhtight_nod0_ivarloose', + 'HLT_e60_lhmedium_nod0_L1EM24VHI', + 'HLT_e140_lhloose_nod0_L1EM24VHI', + # ringer chains for the commissioning... + #'HLT_e17_lhvloose_nod0_ringer_L1EM15VHI', + 'HLT_e17_lhvloose_nod0_ringer', + 'HLT_e26_lhloose_nod0_ringer', + 'HLT_e26_lhmedium_nod0_ringer', + #'HLT_e26_lhtight_nod0_ringer', + #'HLT_e26_lhtight_nod0_ringer_ivarloose', + 'HLT_e28_lhtight_nod0_ringer_ivarloose', + 'HLT_e60_lhmedium_nod0_ringer_L1EM24VHI', + 'HLT_e140_lhloose_nod0_ringer_L1EM24VHI', + ] + + +triggerList_monitoring_v1 = [ + # standard monitoring chains + 'HLT_e17_lhvloose_nod0_L1EM15VHI', + 'HLT_e26_lhtight_nod0_ivarloose', + 'HLT_e28_lhtight_nod0_icaloloose', + 'HLT_e60_lhmedium_nod0_L1EM24VHI', + 'HLT_e140_lhloose_nod0_L1EM24VHI', + # no ringer chains for pos-commissioning... + 'HLT_e17_lhvloose_nod0_noringer_L1EM15VHI', + 'HLT_e26_lhtight_nod0_noringer_ivarloose', + 'HLT_e28_lhtight_nod0_noringer_ivarloose', + 'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI', + 'HLT_e140_lhloose_nod0_noringer_L1EM24VHI', + + ] + + +triggerList = triggerList_monitoring_v1 + +doGRL=False +doEmulation=True +DetailedHistograms=False +#################################################################################################### +dirtouse = str() +finallist=[] +grllist=[] + +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags as acf +from glob import glob + +if ('FILE' in dir()): + acf.FilesInput=[FILE] +elif ('DIR' in dir()): + inputFiles = glob(DIR+'*') + acf.FilesInput=inputFiles +if 'NOV' in dir(): + nov=NOV +else : + nov=500 +if 'GRL' in dir(): + grllist.append(GRL) +else: + #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml') + #grllist.append('data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml') + #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml') + #grllist.append('data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml') + grllist.append('data17_13TeV.periodAllYear_DetStatus-v92-pro21-05_Unknown_PHYS_StandardGRL_All_Good_25ns_Triggerno17e33prim.xml') + +#################################################################################################### + +acf.EvtMax=nov +rec.readAOD=True +# switch off detectors +rec.doForwardDet=False +rec.doInDet=False +rec.doCalo=False +rec.doMuon=False +rec.doEgamma=False +rec.doTrigger=True +recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off) +rec.doMuon=False +rec.doMuonCombined=False +rec.doWriteAOD=True +rec.doWriteESD=False +rec.doDPD=False +rec.doTruth=False +# autoconfiguration might trigger undesired feature +rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms +rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD +rec.doAOD.set_Value_and_Lock(True) # uncomment if do not run AOD making algorithms +rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD +rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG + +# main jobOption +include ("RecExCommon/RecExCommon_topOptions.py") +MessageSvc.debugLimit = 20000000 +MessageSvc.infoLimit = 20000000 + +# Add Trigger Decision Tool +from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool +tdt = Trig__TrigDecisionTool( "TrigDecisionTool" ) +tdt.TrigDecisionKey='xTrigDecision' +tdt.Navigation.ReadonlyHolders=True +ToolSvc+=tdt + +try: + include ("AthenaMonitoring/DataQualityInit_jobOptions.py") +except Exception: + treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py") + + + + +# Call top sequence +from AthenaCommon.AlgSequence import AlgSequence, AthSequencer +topSequence = AlgSequence() + + +##################################### GRL Tools ########################################## +# Good Run List (GRL) +if doGRL: + from RecExConfig.InputFilePeeker import inputFileSummary + try: + if inputFileSummary['evt_type'][0] == "IS_DATA": + from GoodRunsLists.GoodRunsListsConf import * + ToolSvc += GoodRunsListSelectorTool() + GoodRunsListSelectorTool.GoodRunsListVec = grllist + from GoodRunsListsUser.GoodRunsListsUserConf import * + seq = AthSequencer("AthFilterSeq") + seq += GRLTriggerSelectorAlg('GRLTriggerAlg1') + #seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good_25ns'] + seq.GRLTriggerAlg1.GoodRunsListArray = [grllist[0].replace('.xml','')] + except: + print "GRL not available!" + +##################################### Mon Tools ########################################## + +from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager +topSequence += AthenaMonManager( "HLTMonManager") +HLTMonManager = topSequence.HLTMonManager +################ Mon Tools ################# +#Global HLTMonTool +from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool +HLTMon = HLTMonTool(name = 'HLTMon', histoPathBase = "HLT"); +ToolSvc += HLTMon; +HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ]; + +#################################################################################################### +#Define the base path for all histograms + + + +basePath = '/HLT/Egamma' +#Configure the TrigEgammaPlotTool +from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavTPAnalysisTool, TrigEgammaPlotTool, EfficiencyTool, DistTool, ResolutionTool +from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoring_mam, monitoring_electron, monitoring_photon +from TrigEgammaAnalysisTools.TrigEgammaProbelist import probeListLowMidPtSupportingTriggers, probeListHighPtSupportingTriggers + +PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool", + DirectoryPath=basePath, + MaM=monitoring_mam, + Efficiency=[], + Distribution=[], + Resolution=[]) + +EffTool = EfficiencyTool.copy(name="EfficiencyTool", + PlotTool=PlotTool, + isEMResultNames=["Tight","Medium","Loose"], + LHResultNames=["LHTight","LHMedium","LHLoose"], + OutputLevel=0) + + + +#################################################################################################### +from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool +from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator +from TriggerJobOpts.TriggerFlags import TriggerFlags + +# Force this emulation selector path +TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/") +TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6") + +EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool", + TriggerList = triggerList, + DoL2ElectronFex=True, + DoEFCaloPid=False, + DoRinger=True, + OutputLevel=0) + +#################################################################################################### + +AnalysisTool = TrigEgammaNavTPAnalysisTool( name = "TrigEgammaNavTPAnalysisTool", + Analysis='Zee', + PlotTool=PlotTool, + Tools=[EffTool], + OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose + OfflineProbeSelector='Loose', + DefaultProbePid='LHMedium', + doEmulation=doEmulation, + DetailedHistograms=DetailedHistograms, + EmulationTool=EmulationElectronTool, + TPTrigger=False, + RemoveCrack=False, + TagTriggerList=tagList, + TriggerList=triggerList, + OutputLevel=0) + +#################################################################################################### +Tools=['TrigEgammaNavTPAnalysisTool/TrigEgammaNavTPAnalysisTool'] +from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool +TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", histoPathBase=basePath, Tools=Tools) +ToolSvc += TrigEgammaMonTool +HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ] +HLTMonManager.FileKey = "GLOBAL" +ToolSvc.TrigDecisionTool.Navigation.OutputLevel = WARNING +#################################################################################################### diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py new file mode 100644 index 000000000000..bc80bef8197f --- /dev/null +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py @@ -0,0 +1,193 @@ +# Job options for standalone and Tier0 running of AnalysisTools +# Authors: +# Ryan Mackenzie White <ryan.white@cern.ch> +# +# Tool and algorithm configuration done using egamma Factories +# Default configurations found in TrigEgammaAnalysisToolsConfig +# +# To run +# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" +# -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py +# where NOV is the number of events to run + +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from RecExConfig.RecFlags import rec +from RecExConfig.RecAlgsFlags import recAlgs +from AthenaCommon.AppMgr import ToolSvc +import os + +doZ=True +doFakes=True + +# Define triggers for tagging +triggerTags = ['HLT_e24_lhtight_nod0_ivarloose', + 'HLT_e26_lhtight_nod0_ivarloose', + 'HLT_e28_lhtight_nod0_ivarloose'] + +triggerList = [ + # standard monitoring chains + 'HLT_e26_lhtight_nod0_ivarloose', + 'HLT_e28_lhtight_nod0_ivarloose', + 'HLT_e60_lhmedium_nod0_L1EM24VHI', + # no ringer chains for pos-commissioning... + 'HLT_e26_lhtight_nod0_noringer_ivarloose_L1EM22VHI', + 'HLT_e28_lhtight_nod0_noringer_ivarloose', # get real TDT + 'HLT_e28_lhtight_nod0_noringer_ivarloose_L1EM24VHI', + 'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI', + ] + + + +#print 'Set some variables for job' +dirtouse = str() +finallist=[] + +if 'FILE' in dir() : + finallist.append(FILE) + +if 'DIR' in dir() : + dirtouse=DIR + print 'DIR = ',dirtouse + while( dirtouse.endswith('/') ) : + dirtouse= dirtouse.rstrip('/') + listfiles=os.listdir(dirtouse) + for ll in listfiles: + finallist.append(dirtouse+'/'+ll) + +if 'NOV' in dir(): + nov=NOV +else : + nov=-1 + + +print finallist +athenaCommonFlags.FilesInput=finallist +athenaCommonFlags.EvtMax=nov +rec.readAOD=True +# switch off detectors +rec.doForwardDet=False +rec.doInDet=False +rec.doCalo=False +rec.doMuon=False +rec.doEgamma=False +rec.doTrigger = True; recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off) +rec.doMuon=False +rec.doAOD=False +rec.doMuonCombined=False +rec.doWriteAOD=False +rec.doWriteESD=False +rec.doDPD=False +rec.doTruth=False + +# autoconfiguration might trigger undesired feature +rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms +rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD +rec.doAOD.set_Value_and_Lock(True) # uncomment if do not run AOD making algorithms +rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD +rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG + +# main jobOption +include ("RecExCommon/RecExCommon_topOptions.py") +MessageSvc.debugLimit = 20000000 +MessageSvc.infoLimit = 20000000 +# TDT +from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool +tdt = Trig__TrigDecisionTool( "TrigDecisionTool" ) +tdt.TrigDecisionKey='xTrigDecision' +tdt.Navigation.ReadonlyHolders=True +ToolSvc+=tdt + +try: + include ("AthenaMonitoring/DataQualityInit_jobOptions.py") +except Exception: + treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py") + +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager +topSequence += AthenaMonManager( "HLTMonManager") +HLTMonManager = topSequence.HLTMonManager + +################ Mon Tools ################# +#Global HLTMonTool + +from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool +HLTMon = HLTMonTool(name = 'HLTMon', histoPathBase = "HLT"); + +ToolSvc += HLTMon; +HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ]; + +from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaPlotTool, getEventSelectionTool +#Define the base path for all histograms +basePath = '/HLT/Physval' + +#Configure the TrigEgammaPlotTool +PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool", + DirectoryPath=basePath, + #MaM=monitoring_mam, + Efficiency=[], + Distribution=[], + Resolution=[]) + +TrigEgammaEventSelection = getEventSelectionTool() + +#################################################################################################### + +from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool +from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator +from TriggerJobOpts.TriggerFlags import TriggerFlags + +# Force this emulation selector path +TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/") +TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6") + +EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool", + TriggerList = triggerList, + DoL2ElectronFex=True, + DoEFCaloPid=False, + DoRinger=True, + OutputLevel=0) + +#################################################################################################### + + +Tool = TrigEgammaEventSelection( name='EventSelection', + Analysis='Probes', + PlotTool=PlotTool, + EmulationTool=EmulationElectronTool, + File="", + OutputLevel=0, + DetailedHistograms=False, + isEMResultNames=["Tight","Medium","Loose"], + LHResultNames=["LHTight","LHMedium","LHLoose"], + ZeeLowerMass=80, + ZeeUpperMass=100, + OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose + OfflineProbeSelector='Loose', + ForceProbePid=False, + OppositeCharge=True, + OfflineTagMinEt=25, + TagTriggerList=triggerTags, + SelectionZ=doZ, + SelectionFakes=doFakes, + ApplyMinimalTrigger=False, + DetailedDataLevel=2, + DumpTags=False, + TriggerList=triggerList) + +Tools=['TrigEgammaEventSelection/EventSelection'] + +from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool +TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", + histoPathBase=basePath, + Tools=Tools) + +ToolSvc += TrigEgammaMonTool + +#TrigEgammaMonToolConfig.TrigEgammaMonTool() +HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ] +HLTMonManager.FileKey = "GLOBAL" + + + diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx index dd7bd078d5ca..84c3551dfeba 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx @@ -27,20 +27,23 @@ TrigEgammaMonTool( const std::string & type, const std::string & name, const IIn } TrigEgammaMonTool::~TrigEgammaMonTool(){} -StatusCode TrigEgammaMonTool::init(){ - + + +StatusCode TrigEgammaMonTool::init(){ return StatusCode::SUCCESS; } StatusCode TrigEgammaMonTool::book(){ ATH_MSG_INFO("Initializing " << name() << "..."); - ATH_MSG_INFO("Retrieving tools..."); + ATH_MSG_INFO("Retrieving tools..." << m_asgToolNames.size()); for(const auto toolname : m_asgToolNames){ + ATH_MSG_INFO("Add "<<toolname<<"..." ); m_asgtools.push_back(ToolHandle<ITrigEgammaAnalysisBaseTool>(toolname)); } for ( ToolHandleArray<ITrigEgammaAnalysisBaseTool>::const_iterator itoo=m_asgtools.begin(); itoo!=m_asgtools.end(); ++itoo ) { + ATH_MSG_INFO("Initializing..." ); ToolHandle<ITrigEgammaAnalysisBaseTool> htool = *itoo; htool->setParent(this); StatusCode sc = htool->initialize(); @@ -56,8 +59,6 @@ StatusCode TrigEgammaMonTool::book(){ } ATH_MSG_INFO("Tool retrieval completed."); - - return StatusCode::SUCCESS; } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx index 77b8a9677f6e..9ca518c5150f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx @@ -1,3 +1,6 @@ + + + #include "TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h" #include "../TrigEgammaMonTool.h" #include "../TrigEgammaPhysValMonTool.h" @@ -5,28 +8,25 @@ #include "TrigEgammaAnalysisTools/TrigEgammaNavAnalysisTool.h" #include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h" #include "TrigEgammaAnalysisTools/TrigEgammaNavTPAnalysisTool.h" -#include "TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h" -#include "TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h" #include "TrigEgammaAnalysisTools/EfficiencyTool.h" #include "TrigEgammaAnalysisTools/TrigEgammaResolutionTool.h" #include "TrigEgammaAnalysisTools/TrigEgammaDistTool.h" #include "TrigEgammaAnalysisTools/TrigEgammaPlotTool.h" +#include "TrigEgammaAnalysisTools/TrigEgammaEventSelection.h" #include "../TrigEgammaAnalysisAlg.h" #include "../TrigEgammaTDToolTest.h" -DECLARE_COMPONENT( TrigEgammaAnalysisBaseTool ) -DECLARE_COMPONENT( TrigEgammaMonTool ) -DECLARE_COMPONENT( TrigEgammaPhysValMonTool ) -DECLARE_COMPONENT( TrigEgammaNavTPBaseTool ) -DECLARE_COMPONENT( TrigEgammaNavTPNtuple ) -DECLARE_COMPONENT( TrigEgammaNavAnalysisTool ) -DECLARE_COMPONENT( TrigEgammaNavTPAnalysisTool ) -DECLARE_COMPONENT( TrigEgammaNavNtuple ) -DECLARE_COMPONENT( EfficiencyTool ) -DECLARE_COMPONENT( TrigEgammaResolutionTool ) -DECLARE_COMPONENT( TrigEgammaDistTool ) -DECLARE_COMPONENT( TrigEgammaPlotTool ) -DECLARE_COMPONENT( TrigEgammaAnalysisAlg ) -DECLARE_COMPONENT( TrigEgammaTDToolTest ) - +DECLARE_COMPONENT(TrigEgammaAnalysisBaseTool) +DECLARE_COMPONENT(TrigEgammaMonTool) +DECLARE_COMPONENT(TrigEgammaPhysValMonTool) +DECLARE_COMPONENT(TrigEgammaNavTPBaseTool) +DECLARE_COMPONENT(TrigEgammaNavAnalysisTool) +DECLARE_COMPONENT(TrigEgammaNavTPAnalysisTool) +DECLARE_COMPONENT(EfficiencyTool) +DECLARE_COMPONENT(TrigEgammaResolutionTool) +DECLARE_COMPONENT(TrigEgammaDistTool) +DECLARE_COMPONENT(TrigEgammaPlotTool) +DECLARE_COMPONENT(TrigEgammaEventSelection) +DECLARE_COMPONENT(TrigEgammaAnalysisAlg) +DECLARE_COMPONENT(TrigEgammaTDToolTest) -- GitLab From 9c97736249a3498d1e9071d63f7eadeeac23301b Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Wed, 6 Mar 2019 18:50:35 +0100 Subject: [PATCH 010/163] fix the memory leak as point by the review in tpbase.cxx --- .../Root/TrigEgammaNavBaseTool.cxx | 11 +++++++---- .../Root/TrigEgammaNavTPBaseTool.cxx | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx index 9a2c3d3cae20..73cf6e0b6b5b 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx @@ -218,10 +218,10 @@ StatusCode TrigEgammaNavBaseTool::executeElectronNavigation( std::string trigIte if(m_forcePidSelection){///default is true if(!ApplyElectronPid(eg,pidname)){ - ATH_MSG_DEBUG("Fails ElectronID "<< pidname); - continue; - } - ATH_MSG_DEBUG("Passes ElectronID "<< pidname); + ATH_MSG_DEBUG("Fails ElectronID "<< pidname); + continue; + } + ATH_MSG_DEBUG("Passes ElectronID "<< pidname); } if (m_forceProbeIsolation) {///default is false @@ -306,6 +306,9 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem, } void TrigEgammaNavBaseTool::clearList(){ + for( auto paitIt : m_objTEList ) + delete paitIt.first; + m_objTEList.clear(); } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx index 89cbec013150..b9a15b8223d9 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx @@ -82,7 +82,10 @@ StatusCode TrigEgammaNavTPBaseTool::childExecute() { StatusCode TrigEgammaNavTPBaseTool::childFinalize() { ATH_MSG_VERBOSE( "child Finalize tool " << name() ); + // delete electron pointers alloc in the tap execute method and + // clear the list of pairs clearProbeList(); + // clear the list of pairs clearPairList(); //m_offElectrons->clearDecorations(); @@ -296,11 +299,21 @@ void TrigEgammaNavTPBaseTool::matchObjects(const std::string probeTrigItem){ } void TrigEgammaNavTPBaseTool::clearProbeList(){ + + ATH_MSG_DEBUG("Clear all Probes..."); + // this vector hold the Electron pointer and need to + // be deleted since we alloc such memory for than + for (auto it : m_probeElectrons) + delete it; m_probeElectrons.clear(); + m_probePhotons.clear(); } void TrigEgammaNavTPBaseTool::clearPairList(){ + + ATH_MSG_DEBUG("Clear all Pairs..."); + // this only hold < Electron * , TriggerElement * > m_pairObj.clear(); } -- GitLab From 933c34dcd526c15c27b594b7a1a6c07c3f486123 Mon Sep 17 00:00:00 2001 From: Tim Martin <tim.martin@cern.ch> Date: Fri, 8 Mar 2019 13:48:05 +0000 Subject: [PATCH 011/163] Revert "Merge branch 'revert-2bed096f' into 'master'" This reverts merge request !21752 --- .../TrigHLTJetHypoUtils/DijetMTCondition.h | 61 +++ .../TrigHLTJetHypoUtils/conditionsFactory2.h | 8 + .../TrigHLTJetHypo/python/ChainLabelParser.py | 390 +++++++++++++++++ .../TrigHLTJetHypo/python/ToolSetter.py | 134 ++++++ .../python/TrigJetHypoToolConfig.py | 102 ++--- .../python/chainDict2jetLabel.py | 106 +++++ .../TrigHLTJetHypo/python/chainDictDumper.py | 22 + .../TrigHLTJetHypo/python/constants.py | 6 + .../TrigHLTJetHypo/python/node.py | 69 +++ .../TrigHLTJetHypo/python/test_cases.py | 70 ++++ .../TrigHLTJetHypo/python/treeVisitors.py | 392 ++++++++++++++++++ .../TrigHLTJetHypoUtils/DijetMTCondition.cxx | 101 +++++ .../conditionsFactory2.cxx | 25 ++ .../TrigHLTJetHypo/src/TrigJetAndToolMT.cxx | 62 +++ .../TrigHLTJetHypo/src/TrigJetAndToolMT.h | 68 +++ .../src/TrigJetHypoToolConfig_dijet.cxx | 94 +++++ .../src/TrigJetHypoToolConfig_dijet.h | 76 ++++ .../src/TrigJetHypoToolConfig_simple.cxx | 92 ++++ .../src/TrigJetHypoToolConfig_simple.h | 71 ++++ .../TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx | 10 +- .../TrigHLTJetHypo/src/TrigJetHypoToolMT.h | 5 +- .../TrigHLTJetHypo/src/TrigJetNotToolMT.cxx | 63 +++ .../TrigHLTJetHypo/src/TrigJetNotToolMT.h | 66 +++ .../TrigHLTJetHypo/src/TrigJetOrToolMT.cxx | 60 +++ .../TrigHLTJetHypo/src/TrigJetOrToolMT.h | 68 +++ .../src/components/TrigHLTJetHypo_entries.cxx | 12 +- .../TrigUpgradeTest/python/jetDefs.py | 2 - .../TrigUpgradeTest/share/fullMenu.py | 2 +- .../TrigUpgradeTest/share/fullMenu.ref | 23 +- .../TrigUpgradeTest/share/jet.menu.py | 2 +- .../TrigUpgradeTest/share/jetMenu.ref | 23 +- .../TrigUpgradeTest/share/simpleJetJob.py | 16 +- .../HLTMenuConfig/Menu/SignatureDicts.py | 6 +- 33 files changed, 2209 insertions(+), 98 deletions(-) create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h new file mode 100644 index 000000000000..84aef0dc56ad --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h @@ -0,0 +1,61 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGHLTJETHYPO_DIJETMTCONDITION_H +#define TRIGHLTJETHYPO_DIJETMTCONDITION_H + +/******************************************************************** + * + * NAME: DijetMTCondition.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * Cuts on paris of jets makling up a dijet + * + * AUTHOR: P. Sherwood + * CREATED: February 21, 2019 + * + *********************************************************************/ + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJet.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICondition.h" + + +class DijetMTCondition: public ICondition{ + public: + DijetMTCondition( + double massMin, + double massMax, + double detaMin, + double detaMax, + double dphiMin, + double dphiMax + ); + + ~DijetMTCondition() override {} + + bool isSatisfied(const HypoJetVector&) const override; + + double orderingParameter() const noexcept override; + + std::string toString() const noexcept override; + + private: + + bool passJetCuts(pHypoJet, pHypoJet) const; + bool passDijetCuts(pHypoJet, pHypoJet) const; + + // cuts on sum of jets + double m_massMin; + double m_massMax; + + // cuts on the two jets + double m_detaMin; + double m_detaMax; + + double m_dphiMin; + double m_dphiMax; + +}; + +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h index 92078f82269f..034926817227 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h @@ -44,6 +44,14 @@ Conditions conditionsFactoryDijet(const std::vector<double>& etThresholds1, const std::vector<double>& dphiMins, const std::vector<double>& dphiMaxs); +Conditions conditionsFactoryDijetMT(const std::vector<double>& massMins, + const std::vector<double>& massMaxs, + const std::vector<double>& detaMins, + const std::vector<double>& detaMaxs, + const std::vector<double>& dphiMins, + const std::vector<double>& dphiMaxs); + + // for conditionsFactory2 Conditions conditionsFactoryDijetEtaMass(const std::vector<double>& etasMin, diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py new file mode 100644 index 000000000000..46230e0139dc --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py @@ -0,0 +1,390 @@ +from node import Node +from constants import (lchars, + digits, + delims) + + + +def get_char(s): + """character generator""" + + while s: + c = s[0] + s = s[1:] + yield c + +def _check_parens(s, pars): + pl = pars[0] + pr = pars[1] + np = 0 + for c in s: + if c == pl: np += 1 + if c == pr: np -= 1 + if np < 0: + raise RuntimeError('Paren mismatch for parens %s, %s' % (pars, s)) + +def check_parens(s): + _check_parens(s, '()') + _check_parens(s, '[]') + + + +def preprocess(s): + llines = s.split('\n') + + lines = [l.split('#')[0].strip() for l in llines] + s = ''.join(lines) + ss = '' + reject = ' \n' + for c in s: + # keep white space whn within square brackets, reject otherwise + if c not in reject: + ss += c + s = ss + + check_parens(s) + print s + from constants import alphabet + for c in s: + if not c in alphabet: + raise RuntimeError('bad character %s in string %s' % (c, s)) + print 'end of preprocess: ', s + return s + + +class ChainLabelParser(object): + def __init__(self, label, debug=False): + self.label = label + self.state = 'start' + pp = preprocess(label) + print 'preprocessd string', pp, 'length', len(pp) + self.gc = get_char(pp) + self.state_history = [] + self.states = { + 'start': self.start, + 'scenario': self.scen, + 'start_params_0': self.start_params_0, + 'start_params_1': self.start_params_1, + 'params': self.params, + 'end_params_0': self.end_params_0, + 'end_params': self.end_params, + 'end_scenario': self.end_scenario, + 'error': self.error, + } + self.debug = debug + + def paramAppend(self, c): + self.parameters += c + if self.debug: + print 'parameters', self.parameters + + def scenAppend(self, c): + self.scenario += c + if self.debug: + print 'scenario', self.scenario + + def start(self): + "initialise" + + self.state = 'scenario' + self.scenario = '' + self.parameters = '' + self.tree = [Node('dummy')] + self.msg = '' + + + def scen(self): + """accumulate scenario name string into self.scenario""" + + c = self.gc.next() + + if c in lchars: + self.scenAppend(c) + return + + if c == '(': + self.state = 'start_params_0' + + return + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + def start_params_0(self): + """accumulate parameter string into self.parameter""" + + self.tree.append(Node(self.scenario)) + self.scenario = '' + + c = self.gc.next() + + if c == '[': + self.state = 'start_params_1' + return + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + def start_params_1(self): + """accumulate parameter string into self.parameter""" + + c = self.gc.next() + + if c == '(': + self.paramAppend(c) + self.state = 'params' + return + + if c == ']': + self.state = 'end_params' + return + + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + def params(self): + """accumulate parameter string into self.parameter""" + + c = self.gc.next() + + if c in lchars or c in digits or c ==',': + self.paramAppend(c) + return + + if c == ')': + self.paramAppend(c) + self.state = 'end_params_0' + return + + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + + def end_params_0(self): + """Check whether there are more prameters to accumulate""" + + c = self.gc.next() + + # more parameters + if c == '(': + self.paramAppend(c) + self.state = 'params' + return + + # end of paramter lists + if c == ']': + self.tree[-1].parameters = self.parameters.strip() + self.parameters = '' + self.state = 'end_params' + return + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + + def end_params(self): + """after accumulating params, drop white space, then add node to tree + or process next scenario""" + + c = self.gc.next() + + if c == ')': + self.state = 'end_scenario' + return + + if c in lchars: + self.scenAppend(c) + self.state = 'scenario' + return + + self.msg = 'state %s, bad character %s in string %s' % (self.state, + c, + self.label) + self.state = 'error' + + def end_scenario(self): + """Add current node to its parent""" + + n = self.tree.pop() + self.tree[-1].add_child(n) + + while True: + c = self.gc.next() + if c == ')': + n = self.tree.pop() + self.tree[-1].add_child(n) + else: + + # more input means a new scenario is starting + self.scenario = c + self.parameters = '' + self.msg = '' + self.state = 'scenario' + + return + + + def error(self): + """From error state, dump error report and raise exception""" + + print '---error state report ---' + print ' state', self.state + print ' scenario', self.scenario + print ' parameters', self.parameters + print ' msg', self.msg + print 'state history', self.state_history + print ' tree dump:' + print self.tree[0].dump() + print '--end error state report---' + raise RuntimeError('error state') + + def get_state(self): + self.state_history.append(self.state) + return self.states[self.state] + + + + def parse(self): + "parse a chain label" + + error = False + terminated = False + + self.start() # re-initialise + + try: # parsing ends with an exception + while True: # continue until exception + + # print 'current state', self.state + # print 'current scenario', self.scenario + # print 'current parameters', self.parameters + + # self.states[self.state]() # process the current state + self.get_state()() + + except StopIteration: # generator has reached the end of the string + print 'parse terminated' + terminated = True + except AssertionError, e: + print 'assertion err' + print e + error = True + except RuntimeError, e: + print e + error = True + + + if not terminated: + s = '' + try: + while True: + s += self.gc.next() + except StopIteration: + if s: + print 'error: remaining characters:', s + + if len(self.tree) != 1: + error = True + print 'error, stack size', len(self.tree), 'expected 2' + print self.state_history + + if len(self.tree[0].children) != 1: + error = True + print 'error, top node has %d cdildren, expected 1' % ( + len(self.tree[0].children)) + + final_state = 'end_scenario' + if self.state != final_state: + error = True + print 'error: final state is %s, expected %s' % (self.state, + final_state) + # print 'tree dump:' + # print self.tree[0].dump() + print 'parse', + if not error: + print 'succeeded' + else: + print 'state: %s scenario: %s parameters: %s stack len %d' % ( + self.state, self.scenario, self.parameters, len(self.tree)) + print 'failed' + + # Kludge: mark the tops of the trees. The visitor which + # creates Tool instances with give the Tool for this node + # the name of the chain + + for c in self.tree[0].children: + c.tree_top = True + + # for now (02/01/2019), no reco. First tree is only tree is hypo + return self.tree[0].children[0] + +def _test(s): + from ChainLabelParser import ChainLabelParser + parser = ChainLabelParser(s, debug=True) + tree = parser.parse() + print tree.dump() + + +def test(index): + from test_cases import test_strings + c = sys.argv[1] + index = -1 + try: + index = int(c) + except: + print 'expected int in [1,%d] ]on comand line, got %s' % ( + len(test_strins), c) + sys.exit() + + print 'index', index + print '========== Test %d ==============' % index + s = test_strings[index] + print s + _test(s) + + +def usage(options): + print 'usage: ChainLabelPaers -[%s]' % options + + +if __name__ == '__main__': + + import getopt, sys + from test_cases import test_strings + ncases = len(test_strings) + try: + options = "1234567" + opts, args = getopt.getopt(sys.argv[1:], options, []) + except getopt.GetoptError as err: + # print help information and exit: + print str(err) # will print something like "option -a not recognized" + usage(options) + sys.exit(2) + + assert len(args) == 1 + o = args[0] + try: + index = int(o) + except: + print 'Supply an test case integer index on the command line ' + sys.exit(0) + + if index < 0 or index >= ncases: + print 'no such test case ind %d, expect val in [0, %d]' %(index, + ncases-1) + sys.exit(0) + + test(int(o)) + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py new file mode 100644 index 000000000000..87c1114df9cf --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py @@ -0,0 +1,134 @@ +from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolConfig_simple, + TrigJetHypoToolConfig_dijet, + TrigJetNotToolMT, + TrigJetAndToolMT, + TrigJetOrToolMT, + TrigJetHypoToolMT) + + +class ToolSetter(object): + """Visitor to set instantiated AlgTools to a jet hypo tree""" + + def __init__(self, name, dump_jets=True): + + self.chain_name = name + self.dump_jets = dump_jets + + self.tool_factories = { + 'simple': [TrigJetHypoToolConfig_simple, 0], + 'not': [TrigJetNotToolMT, 0], + 'and': [TrigJetAndToolMT, 0], + 'or': [TrigJetOrToolMT, 0], + 'dijet': [TrigJetHypoToolConfig_dijet, 0], + } + + self.mod_router = { + 'not': self.mod_logical_unary, + 'and': self.mod_logical_binary, + 'or': self.mod_logical_binary, + # 'not': self.mod_logical_unary, + } + + def mod_logical_binary(self, node): + """Set the HypoConfigTool instance the 'and' and 'or' scenarios + these take two predicates""" + + scen = node.scenario + klass = self.tool_factories[scen][0] + sn = self.tool_factories[scen][1] + name = '%s_%d' % (scen, sn) + self.tool_factories[scen][1] += 1 + + # kludgy. The name of the tool seen by the trigger must be + # the trigger name, so have to figure out if this is the top + # level node (actually first daughter, as the start node is the top) + # note that the name can only be set once so have to know + # if we are the top of the tree while traversing it. kludgy... + # also - will break when using a forest... + + print 'Toolsetter, node.tree_top', node.tree_top + if node.tree_top: + tool = klass(name=self.chain_name) + else: + tool = klass(name=name) + + print 'ToolSetter, setting lhs ', node.children[0].tool + tool.lhs = node.children[0].tool + tool.rhs = node.children[1].tool + node.tool = tool + + + def mod_logical_unary(self, node): + """Set the HypoConfigTool instance for the 'not' scenario + this takes a single predicate""" + + scen = node.scenario + klass = self.tool_factories[scen][0] + sn = self.tool_factories[scen][1] + name = '%s_%d' % (scen, sn) + self.tool_factories[scen][1] += 1 + + # kludgy. The name of the tool seen by the trigger must be + # the trigger name, so have to figure out if this is the top + # level node (actually first daughter, as the start node is the top) + # note that the name can only be set once so have to know + # if we are the top of the tree while traversing it. kludgy... + # also - will break when using a forest... + + print 'Toolsetter, node.tree_top', node.tree_top + if node.tree_top: + tool = klass(name=self.chain_name) + else: + tool = klass(name=name) + + print 'ToolSetter, setting lhs ', node.children[0].tool + tool.hypoTool = node.children[0].tool + node.tool = tool + + + + def mod_simple(self, node): + """Set the HypoConfigTool instance in a hypo tree node""" + + scen = node.scenario + klass = self.tool_factories[scen][0] + sn = self.tool_factories[scen][1] + name = '%s_%d' % (scen, sn) + + self.tool_factories[scen][1] += 1 + + config_tool = klass(name=name+'_config') + [setattr(config_tool, k, v) for k, v in node.conf_attrs.items()] + + # kludgy. The name of the tool seen by the trigger must be + # the trigger name, so have to figure out if this is the top + # level node (actually first daughter, as the start node is the top) + # note that the name can only be set once so have to know + # if we are the top of the tree while traversing it. kludgy... + # also - will break when using a forest... + print 'Toolsetter, node.tree_top', node.tree_top + if node.tree_top: + tool = TrigJetHypoToolMT(name=self.chain_name) + else: + tool = TrigJetHypoToolMT(name=name) + + tool.HypoConfigurer = config_tool + tool.dumpJets = self.dump_jets + node.tool = tool + + def mod(self, node): + """Set the HypoConfigTool instance according to the scenario. + Note: node.accept must perform depth first navigation to ensure + child tools are set.""" + + self.mod_router.get(node.scenario, self.mod_simple)(node) + + def report(self): + wid = max(len(k) for k in self.tool_factories.keys()) + rep = '\n%s: ' % self.__class__.__name__ + + rep += '\n'.join( + ['%s: %d' % (k.ljust(wid), v[1]) + for k, v in self.tool_factories.items()]) + + return rep diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py index 538ed52e796f..908fcb0454ad 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py @@ -1,67 +1,73 @@ -from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoToolMT, TrigJetHypoToolConfig_EtaEt -import re +from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolMT, + TrigJetHypoToolConfig_EtaEt) -re_EtEta0 = re.compile( - r'^HLT_j(?P<thresh>\d+)(_(?P<etalo>\d{3})eta(?P<etahi>\d{3}))?$') -# re_EtEta1 = re.compile(r'^HLT_j\d+(_\d{1-3}eta\d{3})?_L1') -# re_EtEta2 = re.compile(r'^HLT_j\d+(_\d{3}eta\d{3})?_(jes|nojcalib|lcw)*$') +from TrigHLTJetHypo.ToolSetter import ToolSetter +from TrigHLTJetHypo.treeVisitors import TreeParameterExpander +from TrigHLTJetHypo.chainDict2jetLabel import (make_simple_label, + make_vbenf_label) +from TrigHLTJetHypo.ChainLabelParser import ChainLabelParser +from GaudiKernel.Constants import (VERBOSE, + DEBUG, + INFO, + WARNING, + ERROR, + FATAL,) -def decodeEtEta(match, chain): - """Create a hypo tool for the Et - Eta scenario""" - default = {'etalo': '0', 'etahi': '320'} - conf_dict = match.groupdict() - for k, v in default.items(): - if k not in conf_dict: conf_dict[k] = v - if conf_dict[k] is None: conf_dict[k] = v - conf_tool = TrigJetHypoToolConfig_EtaEt(name=chain+"config") - conf_tool.EtThresholds = [float(conf_dict['thresh'])] - conf_tool.eta_mins = [float(conf_dict['etalo'])] - conf_tool.eta_maxs = [float(conf_dict['etahi'])] - conf_tool.asymmetricEtas = [0] - conf_tool.OutputLevel = 0 - return conf_tool +def trigJetHypoToolFromDict(chain_dict): + """Produce a jet trigger hypo tool from a chainDict""" + print 'trigJetHypoToolFromDict starts' + chain_label = '' + if 'vbenf' in chain_dict['chainParts'][0]['hypoScenario']: + assert len(chain_dict['chainParts']) == 1 + chain_label = make_vbenf_label(chain_dict) + else: + chain_label = make_simple_label(chain_dict) + parser = ChainLabelParser(chain_label) + tree = parser.parse() -def trigJetHypoToolFromDict(chainDict): - return trigJetHypoToolFromName( chainDict['chainName'], chainDict['chainName']) + #expand strings of cuts to a cut dictionary + visitor = TreeParameterExpander() + tree.accept(visitor) + visitor.report() -def trigJetHypoToolFromName(name, jetconfig): - """Configure a jet hypo tool from chain name. + # create - possibly nested - tools - Delegate to functions according to the hypo scenartio.""" - scenario_dict = {re_EtEta0: decodeEtEta} + # chain name in run 2 dicts were missing the 'HLT_' prefix + # but it seems it is necessary to run the hypos in AthenaMT ?...? + + chain_name = chain_dict['chainName'] + if not chain_name.startswith('HLT_'): + chain_name = 'HLT_' + chain_name - chain = jetconfig - for k, v in scenario_dict.items(): - match = k.match(chain) - if match: - hypo_tool = TrigJetHypoToolMT(chain) - hypo_tool.HypoConfigurer = v(match, chain) - return hypo_tool + print 'trigJetHypoToolFromDict chain_name', chain_name + visitor = ToolSetter(chain_name) + tree.accept(visitor) + visitor.report() - msg = 'trigJetHypoToolFromName(%s) - decode error' % chain - raise NotImplementedError(msg) + print 'Dumping jet config for', chain_name + print tree.dump() + tool = tree.tool + tool.OutputLevel = DEBUG + return tool import unittest class TestStringMethods(unittest.TestCase): def testValidConfigs(self): - # EtaEt hypos - # from MC_pp_v7 import TriggerFlags.JetSlice.signatures - # exception or any other issue will make the ctest for this package fail - chains = ('HLT_j85', 'HLT_j35_320eta490') - wid = max(len(c) for c in chains) - for c in chains: - tool = trigJetHypoToolFromName(c, c) - self.assertIsNotNone( tool ) - print '%s' % c.rjust(wid), tool - - def testInvalidConfig(self): - with self.assertRaises(NotImplementedError): - tool = trigJetHypoToolFromName('HLT_nonsense', 'HLT_nonsense') + from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName + chainNameDecoder = DictFromChainName.DictFromChainName() + # chain_names = ('HLT_j85', 'HLT_j35_0eta320') + chain_names = ('HLT_j0hs_vbenf',) + wid = max(len(c) for c in chain_names) + for chain_name in chain_names: + chain_dict = chainNameDecoder.getChainDict(chain_name) + tool = trigJetHypoToolFromDict(chain_dict) + self.assertIsNotNone(tool) + print '%s' % chain_name.rjust(wid), tool if __name__ == '__main__': unittest.main() diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py new file mode 100644 index 000000000000..89047bbe9e7f --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py @@ -0,0 +1,106 @@ +import re + +# substrings that cannot occur in any chainPartName for simple chains. +reject_substr = ( + 'gsc', + 'ion', + 'dphi', + 'deta', + 'invm', + '0i1', + '1i2', + 'dphi', + 'ht\d',) + +reject_substr_res = re.compile(r'%s' % '|'.join(reject_substr)) + + +def select_simple_chains(cd): + """Select chains for which to make an simple chain label. + + Chains selected by reuiring that the signature os 'Jet'. Chains are + vetoed if specific substrings occur in any of the chainPartNames""" + + + # print cd + # assert False + chain_parts = [c for c in cd['chainParts'] if c['signature'] == 'Jet'] + chain_name = cd['chainName'] + + for cp in chain_parts: + if reject_substr_res.search(cp['chainPartName']): + return [] + + return chain_parts + + +def make_simple_label(chain_dict): + """Marshal information deom the selected chainParts to create a + 'simple' label. + """ + + cps = select_simple_chains(chain_dict) + if not cps: + raise NotImplementedError( + 'chain fails substring selection: not "simple": %s' % ( + chain_dict['chainName'])) + + label = 'simple([' + for cp in cps: + smcstr = str(cp['smc']) + if smcstr == 'nosmc': + smcstr = '' + for i in range(int(cp['multiplicity'])): + # condition_str = '(%set,%s,%s)' % (str(cp['threshold']), + # str(cp['etaRange']), + # smcstr,) + condition_str = '(%set,%s' % (str(cp['threshold']), + str(cp['etaRange']),) + if smcstr: + condition_str += ',%s)' + else: + condition_str += ')' + label += condition_str + label += '])' + return label + + +def select_vbenf_chains(cd): + """Select chains for which to make a vbenf chain label. + Chains selected by reuiring that the signature os 'Jet'. Chains are + vetoed if specific substrings occur in any of the chainPartNames""" + + + # print cd + # assert False + chain_parts = [c for c in cd['chainParts'] if c['signature'] == 'Jet'] + return any(['vbenf' in cp['chainPartName'] for cp in chain_parts]) + +def make_vbenf_label(chain_dict): + """Marshal information from the selected chainParts to create a + vbenf label. + """ + + # toy label for developement: run simple and dijet independently. + # simple makes Et cuts on two jets. Independently (sharing possible) + # of jets choosean by simple, the dijet + # scenario requires a dijet of mass > 900, and opening angle in phi > 2.6 + + return 'and([] simple([(50et)(70et)])dijet([(900mass, 26dphi)]))' + +if __name__ == '__main__': + """Read chainDicts from files, cread simple label if possible""" + from chainDictSource import chainDictSource + + for cd in chainDictSource(): + f = cd['chainName'] + print '\n---------' + print f + try: + label = make_simple_label(cd) + except Exception, e: + print e + continue + + print 'chain label', label + print '-----------\n' diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py new file mode 100644 index 000000000000..608d8b49228b --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py @@ -0,0 +1,22 @@ +from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName +from TriggerMenuMT.HLTMenuConfig.Menu.SignatureDicts import JetChainParts +import sys + +from pprint import PrettyPrinter + +pp = PrettyPrinter(indent=4) +pp.pprint(JetChainParts) + +decodeChainName = DictFromChainName.DictFromChainName() + +def do_it(): + print '\n------------------\n' + chain_dict = decodeChainName.getChainDict(chain_name) + pp.pprint(chain_dict) + +if __name__ == '__main__': + chain_name = sys.argv[1] + do_it() + # chain_names = ('HLT_j85', 'j85', 'HLT_j55_0eta320_2j20_0eta320',) + # for chain_name in chain_names: + # do_it() diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py new file mode 100644 index 000000000000..33afe422d318 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py @@ -0,0 +1,6 @@ +lchars = 'abcdefghijklmnopqrstuvwxyz' +digits = '0123456789' +delims = '()[],' +logicals = ('and', 'or', 'not') +alphabet = lchars + digits + delims + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py new file mode 100644 index 000000000000..7ce56d947df5 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py @@ -0,0 +1,69 @@ +from constants import logicals + +class Node(object): + + def __init__(self, scenario): + self.scenario = scenario + self.parameters = '' + self.children = [] + self.conf_attrs = {} + self.tool = None + + # self.tree_top kludge carensure top level tools get chain name + # as Tool name + self.tree_top = False + + def add_child(self, c): + self.children.append(c) + + def accept(self, modifier): + "call self before children" + + modifier.mod(self) + for c in self.children: + c.accept(modifier) + + def accept_cf(self, modifier): + "call children before self" + + for c in self.children: + c.accept_cf(modifier) + modifier.mod(self) + + def makeTool(self): + if self.scenario not in logicals: + self.tool = DummyTool(self.toolName) + + def buildTree(self, treeVisitor): + if self.children: + if self.scenario in logicals: + treeVisitor.add(self.scenario + '(') + else: + treeVisitor.add(self.tool.name() + '(') + + for c in self.children: + c.buildTree(treeVisitor) + treeVisitor.add(') ') + + else: + treeVisitor.add(self.tool.name() + ' ') + + + + return s + + def dump(self, n_in=0): + indent = ' '*n_in + s = '\n' + s = indent + 'Node. scenario: %s \n' % self.scenario + s += indent + 'is tree top? %s \n' % self.tree_top + s += indent + 'parameters: %s\n' % str(self.parameters) + s += indent + 'conf_attrs: %s\n' % str(self.conf_attrs) + s += indent + 'AlgTool: %s\n' % str(self.tool) + # s += indent + 'AlgTool dict: %s\n' % str(self.tool.__dict__) + s += indent + 'No of children: %d\n\n' % len(self.children) + for c in self.children: + s += c.dump(n_in+5) + + return s + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py new file mode 100644 index 000000000000..549dc54109a0 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py @@ -0,0 +1,70 @@ +test_strings = [ + 'ijet([(10et, 0eta320)])', + 'ijet([(10et, 0eta320)(20et, 0eta320)])', + # 'or([] ijet([10et]) and([] ijet([20et]) ijet([30et])))', + 'or([] ijet([(10et)]) ijet([(20et)(40et)]))', + 'and([] ijet([(10et)]) ijet([(20et)]))', + 'not([] ijet([(10et)]) )', + 'not([] and([] ijet([(40et, 0eta320)]) ijet([(100et, 0eta320)])))', + 'or([] not([] ijet([(40et, 0eta320)])) not([] ijet([(100et, 0eta320)])))', + 'or([] and([] ijet([(40et, 0eta320)]) ijet([(40et, 0eta320)])) not([] ijet([(100et, 0eta320)])))', + + + +""" +partition +( + [(4,2)] # partition 6 input jets to 4, 2 + splitter # send the 4s to first 2 children, 2 to third. + assert len(o) == 1 + ( + [(1,1)(2)] + sum # mass cut on sum of input jets (ord.=4) + ( + [(800m900)] + ) + partition # partition 4 jets into non-overlapping + # sets ord 2, 2 + ( + [(2,2)] + pair # sum inputs, apply deta cut to the 2 sums + ( + [(40deta)] + sum # child gets two lists, applys mass cuts + ( + [(75m85)(80m90)] + partition # passes on 2 sum to regroup to single jets + ( + [() (1)] + ijet # apply aoverlapping mod, et cuts + ( + [(30width50, 30et) (35width45, 40et)] + ) + ) + ) + ) + ) + ) + + ijet([(p320etap500, 100et) (n500etan320)]), +)""", + + +# """cascade( +# [800m900] # conditions for cascade (only one here) +# dijet( # first daughter scenario +# [ 80m90] # condition(s) for first daughter scenario +# ijet([10et]) # grandaughter scenario 1 for first daugh scen. +# ijet([20et]) # grandaughter scenario 2 for first daugh scen. +# ) # end of first dijet scenario +# dijet( # second daughter scenario +# [85m95] +# ijet([30et]) +# ijet([40et]) +# ) # end of second dijet scenario +# ) # end of cascade scenario +# """ + + 'and([] ijet([(50et)(70et)]) dijet([(900mass, 26dphi)]))', + 'and([]simple([(50et)(70et)])dijet([(900m,26dphi)]))', +] diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py new file mode 100644 index 000000000000..5dcc580ce236 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py @@ -0,0 +1,392 @@ +from constants import lchars + +import re +import math + +from ToolSetter import ToolSetter +class Checker(object): + def __init__(self): + self.known = { + 'simple': ('Et'), + 'cascade': ('m') + } + + self.msgs = [] + self.nchecked = 0 + + def mod(self, node): + self.nchecked += 1 + if node.scenario not in self.known: + self.msgs.append('unknown scenario %s' % node.scenario) + + def report(self): + s = ['Checker: %d nodes checked' % self.nchecked] + s.extend(self.msgs) + return '\n'.join(s) + + +class TreeBuilder(object): + def __init__(self): + self.tree = '(' + + def add(self, s): + self.tree += s + + def report(self): + return self.tree + + +class TreeToBooleanExpression(object): + """visit a hypo tree. If boolean scenarios are present, build a + boolean expression string.""" + + def __init__(self): + self.stack = [] + + def mod(self, node): + if node.scenario == 'not': + self.stack.append(' ! ') + return + + if node.scenario == 'and': + self.stack.append(' x ') + return + + if node.scenario == 'or': + self.stack.append(' + ') + return + + self.stack.append(' %s ' %node.tool.name()) + + def report(self): + s = '%s: ' % self.__class__.__name__ + while self.stack: s += self.stack.pop() + return s.strip() + + +class TreeParameterExpander_simple(object): + """Convert parameter string into duction holding low, high window + cut vals. Specialistaion for the 'simple' scenario + + parameter strings look like '40et, 0eta320, nosmc' + """ + + window_re = re.compile( + r'^(?P<lo>\d*)(?P<attr>[%s]+)(?P<hi>\d*)' % lchars) + + defaults = {'etalo': 0.0, + 'etahi': 3.2, + } + + scale_factors = {'eta': 0.01, + 'et': 1000., + 'smc': 1000., + } + + def __init__(self): + self.msgs = [] + + def mod(self, node): + + def get_conditions(params): + """Split conditions string into list of condition strings + Condition string looks like + '(10et,0eta320)(20et,0eta320)(40et,0eta320)' + returned is ['10et,0eta320', '20et,0eta320', '40et,0eta320'] + """ + + alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789,' + pat = re.compile(r'(^\([%s]+\))'% alphabet ) + s = params + m = True + conditions = [] + while m: + m = pat.match(s) + if m is not None: + conditions.append(m.group(0)) + s = s[len(conditions[-1]):] + assert params == ''.join(conditions) + conditions = [c[1:-1] for c in conditions] # strip parens + return conditions + + + conditions = get_conditions(node.parameters) + + + node.conf_attrs['EtThresholds'] = [] + node.conf_attrs['eta_mins'] = [] + node.conf_attrs['eta_maxs'] = [] + node.conf_attrs['asymmetricEtas'] = [] + + for c in conditions: + toks = c.split(',') + toks = [t.strip() for t in toks] + + + for t in toks: + m = self.window_re.match(t) + if m is None: + self.msgs.append('match failed for parameter %s' % t) + return + group_dict = m.groupdict() + attr = group_dict['attr'] + lo = group_dict['lo'] + hi = group_dict['hi'] + if lo == '': + lo = self.defaults.get(attr+'lo', '') + if hi == '': + hi = self.defaults.get(attr+'hi', '') + + sf = self.scale_factors[attr] + if lo: + if attr == 'eta': + node.conf_attrs['eta_mins'].append(sf * float(lo)) + elif attr == 'et': + node.conf_attrs['EtThresholds'].append(sf * float(lo)) + if hi: + if attr == 'eta': + node.conf_attrs['eta_maxs'].append(sf * float(hi)) + + #01/01/2019 PS KLUDGE !! FIX ME!!! asymmetric eta hardwired to 0. + + [node.conf_attrs['asymmetricEtas'].append(0) for i in range( + len(conditions))] + self.msgs = ['All OK'] + + + def report(self): + return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) + + + + +class TreeParameterExpander_dijet(object): + """Convert parameter string into duction holding low, high window + cut vals. Specialistaion for the dijet scenario + + parameter strings look like '40m,100deta200, 50dphi300' + """ + + window_re = re.compile( + r'^(?P<lo>\d*)(?P<attr>[%s]+)(?P<hi>\d*)' % lchars) + + defaults = {'mass_mins': 0.0, + 'mass_maxs': 100000., + 'deta_mins': 0., + 'deta_maxs': 20., + 'dphi_mins': 0., + 'dphi_maxs': math.pi, + } + + scale_factors = {'deta': 0.01, + 'mass': 1000., + 'dphi': 0.01, + } + + def __init__(self): + self.msgs = [] + + def mod(self, node): + + def get_conditions(params): + """Split conditions string into list of condition strings + Condition string looks like + '(75m85,100dEta200, 50dphi200)(80m90, 110dEta210)' + returned is ['10et,0eta320', '20et,0eta320', '40et,0eta320'] + """ + + alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789,' + pat = re.compile(r'(^\([%s]+\))'% alphabet ) + s = params + m = True + conditions = [] + while m: + m = pat.match(s) + if m is not None: + conditions.append(m.group(0)) + s = s[len(conditions[-1]):] + assert params == ''.join(conditions) + conditions = [c[1:-1] for c in conditions] # strip parens + return conditions + + ok = True # status flag + conditions = get_conditions(node.parameters) + + bare_attrs = ['mass', 'deta', 'dphi'] + all_attrs = [] + for attr in bare_attrs: + all_attrs.extend([attr+'_mins', attr+'_maxs']) + + for attr in all_attrs: + node.conf_attrs[attr] = [] + + for c in conditions: + toks = c.split(',') + toks = [t.strip() for t in toks] + + + processed_attrs = [] + for t in toks: + m = self.window_re.match(t) + if m is None: + self.msgs.append('match failed for parameter %s' % t) + return + group_dict = m.groupdict() + attr = group_dict['attr'] + lo = group_dict['lo'] + hi = group_dict['hi'] + if lo == '': + lo = self.defaults.get(attr+'_min', '') + if hi == '': + hi = self.defaults.get(attr+'_max', '') + + sf = self.scale_factors[attr] + if lo: + if attr == 'mass': + node.conf_attrs['mass_mins'].append(sf * float(lo)) + elif attr == 'deta': + node.conf_attrs['deta_mins'].append(sf * float(lo)) + elif attr == 'dphi': + node.conf_attrs['dphi_mins'].append(sf * float(lo)) + + processed_attrs.append(attr+'_mins') + if hi: + if attr == 'mass': + node.conf_attrs['mass_maxs'].append(sf * float(lo)) + elif attr == 'deta': + node.conf_attrs['deta_maxs'].append(sf * float(lo)) + elif attr == 'dphi': + node.conf_attrs['dphi_maxs'].append(sf * float(lo)) + + processed_attrs.append(attr+'_maxs') + + + + for a in all_attrs: + if a not in processed_attrs: + node.conf_attrs[a].append(self.defaults[a]) + + for a in processed_attrs: + if a not in all_attrs: + self.msgs.append('Unknown attribute: %s' % a) + ok = False + + if ok: + self.msgs = ['All OK'] + else: + self.msgs.append('Error') + + + def report(self): + return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) + + +class TreeParameterExpander_null(object): + """Does nothing except check the parameter string is empty""" + + def __init__(self): + self.msgs = ['Do nothing paramter expander'] + + def mod(self, node): + assert node.parameters == '' + + def report(self): + return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) + + + +class TreeParameterExpander(object): + """Class to exapnder node.paramters string. Delegates to + specialised exanders.""" + + router = { + 'simple': TreeParameterExpander_simple, + 'dijet': TreeParameterExpander_dijet, + 'not': TreeParameterExpander_null, + 'and': TreeParameterExpander_null, + 'or': TreeParameterExpander_null, + } + + def __init__(self): + self.expander = None + + def mod(self, node): + self.expander = self.router[node.scenario]() + self.expander.mod(node) + print self.expander.report() + def report(self): + return self.expander.report() + + + +class TreeToCascade(object): + def __init__(self): + self.stack = [] + + def mod(self, node): + + self.stack.append( + '(%s < (%s))' %(node.tool.name(), + ' '.join([c.tool.name for c in node.children]))) + + def report(self): + s = '' + while self.stack: + s += self.stack.pop() + return s.strip() + + +def _test(s): + + from ChainLabelParser import ChainLabelParser + parser = ChainLabelParser(s) + tree = parser.parse() + print tree.dump() + # exapnd the window cuts (strings) obtained from the chain label + # to attributes and floating point numbers, set defaults + # for unspecified vallues + visitor = TreeParameterExpander() + tree.accept(visitor) + print visitor.report() + print tree.dump() + + + # set the node attribute node.tool to be the hypo Al\gTool. + print 'sending in the ToolSetter visitor' + ts_visitor = ToolSetter(s) + tree.accept_cf(ts_visitor) + print ts_visitor.report() + + + print tree.dump() + + +def test(index): + from test_cases import test_strings + import sys + c = sys.argv[1] + index = -1 + try: + index = int(c) + except: + print 'expected int in [1,%d] ]on comand line, got %s' % ( + len(test_strings), c) + sys.exit() + + print 'index', index + print '========== Test %d ==============' % index + s = test_strings[index] + print s + _test(s) + + +if __name__ == '__main__': + import sys + c = sys.argv[1] + ic = -1 + try: + ic = int(c) + except: + print 'expected int on command line, got ',c + sys.exit() + test(ic) diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx new file mode 100644 index 000000000000..8e1c5d29314c --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx @@ -0,0 +1,101 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h" +#include <sstream> +#include <stdexcept> +#include <TLorentzVector.h> +#include <limits> +// #include <iostream> +DijetMTCondition::DijetMTCondition(double massMin, + double massMax, + double detaMin, + double detaMax, + double dphiMin, + double dphiMax + ){ + m_massMin = massMin; + m_massMax = massMax; + m_detaMin = detaMin; + m_detaMax = detaMax; + m_dphiMin = dphiMin; + m_dphiMax = dphiMax; +} + + +bool DijetMTCondition::isSatisfied(const HypoJetVector& ips) const{ + if(ips.size() != 2){ + std::stringstream ss; + ss << "DijetMT::isSatisfied must see exactly 2 particles, but received " + << ips.size() + << '\n'; + + throw std::runtime_error(ss.str()); + } + + auto j0 = ips[0]; + auto j1 = ips[1]; + + auto rj0 = 0.001 * (j0 -> p4()); + auto rj1 = 0.001 * (j1 -> p4()); + + auto mass = (rj0 + rj1).M(); + if (m_massMin > mass or mass >= m_massMax){return false;} + + + auto eta0 = j0->eta(); + auto eta1 = j1->eta(); + auto adeta = std::abs(eta0 -eta1); + if (m_detaMin > adeta or adeta >= m_detaMax){return false;} + + + auto dphi = std::abs(rj0.DeltaPhi(rj1)); + if (m_dphiMin > dphi or dphi >= m_dphiMax){return false;} + + return true; + + /* + auto result = test(et0, et1, absEta0, absEta1, dEta, mass); + std::cout << "DijetMTCondition : " << std::boolalpha << result << '\n' + << std::setprecision(3) << std::scientific + << "jet 0 et " << m_etThreshold0 << " " << et0 << '\n' + << "jet 1 et " << m_etThreshold1 << " " << et1 << '\n' + << "jet 0 eta " << m_etaMin0 << " " << eta0 << " " << m_etaMax0 << '\n' + << "jet 1 eta " << m_etaMin1 << " " << eta1 << " " << m_etaMax1 << '\n' + << "dEta " << m_dEtaMin << " " << dEta << " " << m_dEtaMax << '\n' + << "mass " << m_massMin << " " << mass << " " <<m_massMax << '\n'; + + return result; + */ + +} + +std::string DijetMTCondition::toString() const noexcept { + std::stringstream ss; + ss << "DijetMTCondition: " + + << " mass min: " + << m_massMin + << " mass max: " + << m_massMax + + << " dEta min: " + << m_detaMin + << " dEta max: " + << m_detaMax + + << " dPhi min: " + << m_dphiMin + << " dPhi max: " + << m_dphiMax + + <<'\n'; + + return ss.str(); +} + + +double DijetMTCondition::orderingParameter() const noexcept { + return m_massMin; +} diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx index 20299f147eed..ce9babaa9a7a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx @@ -19,6 +19,7 @@ #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h" #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h" #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h" #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/HTCondition.h" #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TLACondition.h" #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h" @@ -104,6 +105,30 @@ Conditions conditionsFactoryDijet(const std::vector<double>& etThresholds1, return conditions; } + +Conditions conditionsFactoryDijetMT(const std::vector<double>& massMins, + const std::vector<double>& massMaxs, + const std::vector<double>& detaMins, + const std::vector<double>& detaMaxs, + const std::vector<double>& dphiMins, + const std::vector<double>& dphiMaxs){ + Conditions conditions; + + for(std::size_t i = 0; i < massMins.size(); ++i){ + std::shared_ptr<ICondition> + pCondition(new DijetMTCondition(massMins[i], + massMaxs[i], + detaMins[i], + detaMaxs[i], + dphiMins[i], + dphiMaxs[i])); + + conditions.push_back(ConditionBridge(pCondition)); + } + return conditions; +} + + Conditions conditionsFactoryDijetEtaMass(const std::vector<double>& etaMins, const std::vector<double>& etaMaxs, const std::vector<double>& etMins, diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx new file mode 100644 index 000000000000..4b169a56a5f0 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx @@ -0,0 +1,62 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TrigJetAndToolMT.cxx +// PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo +// +// +// ******************************************************************** + +#include "TrigJetAndToolMT.h" + +#include "GaudiKernel/StatusCode.h" + +#include "DecisionHandling/HLTIdentifier.h" +#include "DecisionHandling/TrigCompositeUtils.h" + +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionContainer; + +TrigJetAndToolMT::TrigJetAndToolMT(const std::string& type, + const std::string& name, + const IInterface* parent) : + base_class(type, name, parent), + m_decisionId(HLT::Identifier::fromToolName(name)) { +} + + +TrigJetAndToolMT::~TrigJetAndToolMT(){ +} + +StatusCode TrigJetAndToolMT::initialize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetAndToolMT::finalize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetAndToolMT::decide(const xAOD::JetContainer* jets, + bool& pass) const { + + m_lhs->decide(jets, pass); + if (pass){ + ATH_MSG_DEBUG("LHS passed"); + m_rhs->decide(jets, pass); + ATH_MSG_DEBUG("RHS " <<std::boolalpha << pass); + } else { + ATH_MSG_DEBUG("LHS failed"); + } + + + return StatusCode::SUCCESS; +} + + +const HLT::Identifier& TrigJetAndToolMT::getId() const{ + return m_decisionId; +} diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h new file mode 100644 index 000000000000..f2140fc2a757 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGJETANDTOOLMT_H +#define TRIGJETANDTOOLMT_H +/******************************************************************** + * + * NAME: TrigJetAndToolMT.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * + *********************************************************************/ + + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" + +#include "ITrigJetHypoToolMT.h" +#include "ITrigJetHypoToolConfig.h" + +class TrigJetAndToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> { + + public: + + TrigJetAndToolMT(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~TrigJetAndToolMT(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + + // ITrigJetHypoToolMT interface + virtual StatusCode + decide(const xAOD::JetContainer*, bool& pass) const override; + virtual const HLT::Identifier& getId() const override; + private: + + // Identifier is used to keep track of which tool made which decision. + // The information is stored in the event store. + HLT::Identifier m_decisionId; + + ToolHandle<ITrigJetHypoToolMT> m_lhs { + this, "lhs", {}, "LHS boolean binary expression"}; + ToolHandle<ITrigJetHypoToolMT> m_rhs { + this, "rhs", {}, "RHS boolean binary expression"}; + + + // Monitored variables... + /* + declareMonitoredVariable("NJet", m_njet); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +*/ + + +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx new file mode 100644 index 000000000000..c079a5328ca9 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx @@ -0,0 +1,94 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/* + Instatniation of JetHypo components for the DiMass scenario + */ +#include "TrigJetHypoToolConfig_dijet.h" + +#include "GaudiKernel/StatusCode.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/groupsMatcherFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TrigHLTJetHypoHelper2.h" + +#include "DecisionHandling/TrigCompositeUtils.h" + +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionContainer; + +TrigJetHypoToolConfig_dijet::TrigJetHypoToolConfig_dijet(const std::string& type, + const std::string& name, + const IInterface* parent) : + base_class(type, name, parent){ + +} + + +TrigJetHypoToolConfig_dijet::~TrigJetHypoToolConfig_dijet(){ +} + +StatusCode TrigJetHypoToolConfig_dijet::initialize() { + CHECK(checkVals()); + return StatusCode::SUCCESS; +} + + + + +Conditions TrigJetHypoToolConfig_dijet::getConditions() const { + auto conditions = conditionsFactoryDijetMT(m_massMins, + m_massMaxs, + m_dEtaMins, + m_dEtaMaxs, + m_dPhiMins, + m_dPhiMaxs); + + std::sort(conditions.begin(), conditions.end(), ConditionsSorter()); + + return conditions; +} + + +std::unique_ptr<IJetGrouper> TrigJetHypoToolConfig_dijet::getJetGrouper() const { + return std::make_unique<CombinationsGrouper>(2); +} + +StatusCode TrigJetHypoToolConfig_dijet::checkVals() const { + // check cionsistent sizes + + auto sz = m_massMins.size(); + if (sz != m_massMaxs.size() or + sz != m_dEtaMins.size() or + sz != m_dEtaMaxs.size() or + sz != m_dPhiMins.size() or + sz != m_dPhiMaxs.size()){ + ATH_MSG_ERROR(name() + << ": mismatch between number of thresholds " + << "and min, max fro mass, dEta, dPhi " + << m_massMins.size() << " " + << m_massMaxs.size() << " " + << m_dEtaMins.size() << " " + << m_dEtaMaxs.size() << " " + << m_dPhiMins.size() << " " + << m_dPhiMaxs.size() << " "); + + return StatusCode::FAILURE; + } + return StatusCode::SUCCESS; +} + +std::vector<std::shared_ptr<ICleaner>> +TrigJetHypoToolConfig_dijet::getCleaners() const { + std::vector<std::shared_ptr<ICleaner>> v; + return v; +} + + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h new file mode 100644 index 000000000000..0f47ee6b7ca5 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h @@ -0,0 +1,76 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGJETHYPOTOOLConfig_DIJET_H +#define TRIGJETHYPOTOOLConfig_DIJET_H +/******************************************************************** + * + * NAME: TrigJetHypoToolConfig_dijetTool.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * + *********************************************************************/ + + +#include "ITrigJetHypoToolConfig.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" + +class TrigJetHypoToolConfig_dijet: +public extends<AthAlgTool, ITrigJetHypoToolConfig> { + + public: + + TrigJetHypoToolConfig_dijet(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~TrigJetHypoToolConfig_dijet(); + + virtual StatusCode initialize() override; + virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const override; + virtual std::unique_ptr<IJetGrouper> getJetGrouper() const override; + virtual Conditions getConditions() const override; + + private: + + Gaudi::Property<std::vector<double>> + m_massMins{this, "mass_mins", {}, "min mass for each dijet"}; + + Gaudi::Property<std::vector<double>> + m_massMaxs{this, "mass_maxs", {}, "max mass for each dijet"}; + + Gaudi::Property<std::vector<double>> + m_dEtaMins{this, "deta_mins", {}, "min dEta for jets in each dijet"}; + + Gaudi::Property<std::vector<double>> + m_dEtaMaxs{this, "deta_maxs", {}, "max dEta for jets in each dijet"}; + + Gaudi::Property<std::vector<double>> + m_dPhiMins{this, "dphi_mins", {}, "min dPhi for jets in each dijet"}; + + Gaudi::Property<std::vector<double>> + m_dPhiMaxs{this, "dphi_maxs", {}, "max dPhi for jets in each dijet"}; + + virtual StatusCode checkVals() const override; + + // Monitored variables... + /* + declareMonitoredVariable("NJet", m_njet); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +*/ + + +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx new file mode 100644 index 000000000000..9eaa545f00f7 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx @@ -0,0 +1,92 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TrigJetHypoToolMT_simple.cxx +// PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo +// +// +// ******************************************************************** + +#include "TrigJetHypoToolConfig_simple.h" + +#include "GaudiKernel/StatusCode.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/groupsMatcherFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TrigHLTJetHypoHelper2.h" + +#include "DecisionHandling/TrigCompositeUtils.h" + +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionContainer; + +TrigJetHypoToolConfig_simple::TrigJetHypoToolConfig_simple(const std::string& type, + const std::string& name, + const IInterface* parent) : + base_class(type, name, parent){ + +} + + +TrigJetHypoToolConfig_simple::~TrigJetHypoToolConfig_simple(){ +} + +StatusCode TrigJetHypoToolConfig_simple::initialize() { + CHECK(checkVals()); + return StatusCode::SUCCESS; +} + + + + +Conditions TrigJetHypoToolConfig_simple::getConditions() const { + auto conditions = conditionsFactoryEtaEt(m_etaMins, + m_etaMaxs, + m_EtThresholds, + m_asymmetricEtas); + std::sort(conditions.begin(), conditions.end(), ConditionsSorter()); + + return conditions; +} + + +std::unique_ptr<IJetGrouper> +TrigJetHypoToolConfig_simple::getJetGrouper() const { + return std::make_unique<SingleJetGrouper>(); +} + +StatusCode TrigJetHypoToolConfig_simple::checkVals() const { + if (m_EtThresholds.size() != m_etaMins.size() or + m_EtThresholds.size() != m_etaMaxs.size() or + m_asymmetricEtas.size() != m_etaMaxs.size()){ + + ATH_MSG_ERROR(name() + << ": mismatch between number of thresholds " + << "and eta min, max boundaries or asymmetric eta flags: " + << m_EtThresholds.size() << " " + << m_etaMins.size() << " " + << m_etaMaxs.size() << " " + << m_asymmetricEtas.size() << " " + ); + + return StatusCode::FAILURE; + } + return StatusCode::SUCCESS; +} + +std::vector<std::shared_ptr<ICleaner>> +TrigJetHypoToolConfig_simple::getCleaners() const { + std::vector<std::shared_ptr<ICleaner>> v; + return v; +} + + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h new file mode 100644 index 000000000000..6f8b04e489d0 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGJETHYPOTOOLConfig_SIMPLE_H +#define TRIGJETHYPOTOOLConfig_SIMPLE_H +/******************************************************************** + * + * NAME: TrigJetHypoToolConfig_simple.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * + *********************************************************************/ + + +#include "ITrigJetHypoToolConfig.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" + +class TrigJetHypoToolConfig_simple: +public extends<AthAlgTool, ITrigJetHypoToolConfig> { + + public: + + TrigJetHypoToolConfig_simple(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~TrigJetHypoToolConfig_simple(); + + virtual StatusCode initialize() override; + virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const override; + virtual std::unique_ptr<IJetGrouper> getJetGrouper() const override; + virtual Conditions getConditions() const override; + + private: + + Gaudi::Property<std::vector<double>> + m_EtThresholds{this, "EtThresholds", {}, "Etthresholds by eta region"}; + + Gaudi::Property<std::vector<double>> + m_etaMins{this, "eta_mins", {}, "Eta min for eta regions"}; + + Gaudi::Property<std::vector<double>> + m_etaMaxs{this, "eta_maxs", {}, "Eta max for eta regions"}; + + Gaudi::Property<std::vector<int>> + m_asymmetricEtas{this, "asymmetricEtas", {}, "Apply asym. eta cuts"}; + + + virtual StatusCode checkVals() const override; + + // Monitored variables... + /* + declareMonitoredVariable("NJet", m_njet); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +*/ + + +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx index 4faa51b87fba..90fcef396941 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx @@ -71,7 +71,7 @@ StatusCode TrigJetHypoToolMT::decide(const xAOD::JetContainer* jets, std::move(matcher)); /* apply cleaning and hypothesis alg */ - ATH_MSG_DEBUG("hypo helper start... " << m_chainName + ATH_MSG_DEBUG("hypo helper start... " << " no of jets ... " << jets->size() << "..."); @@ -88,7 +88,7 @@ StatusCode TrigJetHypoToolMT::decide(const xAOD::JetContainer* jets, // accumulateTime(steady_clock::now() - t); - ATH_MSG_DEBUG("hypo testing done chain " << m_chainName + ATH_MSG_DEBUG("hypo testing done chain " << " no of input jets " << jets->size() << " pass " << pass ); @@ -144,12 +144,12 @@ void TrigJetHypoToolMT::writeDebug(bool pass, const HypoJetVector& passedJets, const HypoJetVector& failedJets ) const{ - ATH_MSG_INFO("Writing debug start" << m_chainName << "..."); + ATH_MSG_INFO("Writing debug start..."); if(pass){ - ATH_MSG_DEBUG(m_chainName<< " event passed"); + ATH_MSG_DEBUG(" event passed"); } else { - ATH_MSG_DEBUG(m_chainName<< " event failed"); + ATH_MSG_DEBUG(" event failed"); } for (auto j : passedJets) { diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h index 0b9fac33e1ee..0e3744f582bd 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h @@ -53,7 +53,7 @@ class TrigJetHypoToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> { // Paraphanalia needed for the Jet Hypo Helper class: Conditions m_conditions; - bool m_dumpJets{false}; + Gaudi::Property<bool> m_dumpJets{this, "dumpJets", {}, "verbose jet dump flag"}; void setCleaners(); @@ -152,9 +152,6 @@ class TrigJetHypoToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> { Gaudi::Property<float> m_avLarQFLlpThreshold{this, "AverageLArQFLlpThreshold", 0.8*65535, ""}; - Gaudi::Property<std::string> - m_chainName{this, "chain_name", {}, "chain name (dbg)"}; - Gaudi::Property<bool> m_acceptAll{this, "AcceptAll", false, "flag to turn of hypo"}; diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx new file mode 100644 index 000000000000..2ec75ba2f8c8 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx @@ -0,0 +1,63 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TrigJetNotToolMT.cxx +// PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo +// +// +// ******************************************************************** + +#include "TrigJetNotToolMT.h" + +#include "GaudiKernel/StatusCode.h" + +#include "DecisionHandling/HLTIdentifier.h" +#include "DecisionHandling/TrigCompositeUtils.h" + +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionContainer; + +TrigJetNotToolMT::TrigJetNotToolMT(const std::string& type, + const std::string& name, + const IInterface* parent) : + base_class(type, name, parent), + m_decisionId(HLT::Identifier::fromToolName(name)) { +} + + +TrigJetNotToolMT::~TrigJetNotToolMT(){ +} + +StatusCode TrigJetNotToolMT::initialize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetNotToolMT::finalize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetNotToolMT::decide(const xAOD::JetContainer* jets, + bool& pass) const { + + m_hypoTool->decide(jets, pass); + + if(pass){ + ATH_MSG_DEBUG("hypoTool passed"); + } else { + ATH_MSG_DEBUG("hypoTool failed"); + } + + pass = !pass; + + return StatusCode::SUCCESS; +} + + +const HLT::Identifier& TrigJetNotToolMT::getId() const{ + return m_decisionId; +} + diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h new file mode 100644 index 000000000000..05504bb51842 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h @@ -0,0 +1,66 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collabnotation +*/ + +#ifndef TRIGJETNOTTOOLMT_H +#define TRIGJETNOTTOOLMT_H +/******************************************************************** + * + * NAME: TrigJetNotToolMT.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * + *********************************************************************/ + + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" + +#include "ITrigJetHypoToolMT.h" +#include "ITrigJetHypoToolConfig.h" + +class TrigJetNotToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> { + + public: + + TrigJetNotToolMT(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~TrigJetNotToolMT(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + + // ITrigJetHypoToolMT interface + virtual StatusCode + decide(const xAOD::JetContainer*, bool& pass) const override; + virtual const HLT::Identifier& getId() const override; + private: + + // Identifier is used to keep track of which tool made which decision. + // The information is stored in the event store. + HLT::Identifier m_decisionId; + + ToolHandle<ITrigJetHypoToolMT> m_hypoTool { + this, "hypoTool", {}, "predicate to be inverted"}; + + + // Monitored variables... + /* + declareMonitoredVariable("NJet", m_njet); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +*/ + + +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx new file mode 100644 index 000000000000..80846e55aeab --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx @@ -0,0 +1,60 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TrigJetOrToolMT.cxx +// PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo +// +// +// ******************************************************************** + +#include "TrigJetOrToolMT.h" + +#include "GaudiKernel/StatusCode.h" + +#include "DecisionHandling/HLTIdentifier.h" +#include "DecisionHandling/TrigCompositeUtils.h" + +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionContainer; + +TrigJetOrToolMT::TrigJetOrToolMT(const std::string& type, + const std::string& name, + const IInterface* parent) : + base_class(type, name, parent), + m_decisionId(HLT::Identifier::fromToolName(name)) { +} + + +TrigJetOrToolMT::~TrigJetOrToolMT(){ +} + +StatusCode TrigJetOrToolMT::initialize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetOrToolMT::finalize(){ + return StatusCode::SUCCESS; +} + +StatusCode TrigJetOrToolMT::decide(const xAOD::JetContainer* jets, + bool& pass) const { + + m_lhs->decide(jets, pass); + if (not pass){ + m_rhs->decide(jets, pass); + ATH_MSG_DEBUG("LHS failed " << " RHS " <<std::boolalpha << pass); + } else { + ATH_MSG_DEBUG("LHS passed"); + } + + return StatusCode::SUCCESS; +} + + +const HLT::Identifier& TrigJetOrToolMT::getId() const{ + return m_decisionId; +} diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h new file mode 100644 index 000000000000..3af3941dc696 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGJETORTOOLMT_H +#define TRIGJETORTOOLMT_H +/******************************************************************** + * + * NAME: TrigJetOrToolMT.h + * PACKAGE: Trigger/TrigHypothesis/TrigHLTJetHypo + * + * + *********************************************************************/ + + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" + +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h" +#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h" + +#include "ITrigJetHypoToolMT.h" +#include "ITrigJetHypoToolConfig.h" + +class TrigJetOrToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> { + + public: + + TrigJetOrToolMT(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~TrigJetOrToolMT(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + + // ITrigJetOrToolMT interface + virtual StatusCode + decide(const xAOD::JetContainer*, bool& pass) const override; + virtual const HLT::Identifier& getId() const override; + private: + + // Identifier is used to keep track of which tool made which decision. + // The information is stored in the event store. + HLT::Identifier m_decisionId; + + ToolHandle<ITrigJetHypoToolMT> m_lhs { + this, "lhs", {}, "LHS boolean binary expression"}; + ToolHandle<ITrigJetHypoToolMT> m_rhs { + this, "rhs", {}, "RHS boolean binary expression"}; + + + // Monitored variables... + /* + declareMonitoredVariable("NJet", m_njet); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +*/ + + +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx index 6b4ad114a9a9..014d7bb1b888 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx @@ -10,6 +10,11 @@ #include "TrigHLTJetHypo/TrigHLTJetHypo_SMC.h" #include "../TrigJetHypoAlgMT.h" #include "../TrigJetHypoToolConfig_EtaEt.h" +#include "../TrigJetHypoToolConfig_simple.h" +#include "../TrigJetHypoToolConfig_dijet.h" +#include "../TrigJetNotToolMT.h" +#include "../TrigJetAndToolMT.h" +#include "../TrigJetOrToolMT.h" #include "../TrigJetHypoToolMT.h" DECLARE_COMPONENT( TrigHLTJetHypo2 ) @@ -19,7 +24,12 @@ DECLARE_COMPONENT( TrigEFDPhiMetJetAllTE ) DECLARE_COMPONENT( TrigHLTJetHypo_Dijet ) DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEta ) DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEtaDPhi ) -DECLARE_COMPONENT( TrigHLTJetHypo_EtaEt ) +DECLARE_COMPONENT( TrigJetHypoToolConfig_EtaEt ) +DECLARE_COMPONENT( TrigJetHypoToolConfig_simple ) +DECLARE_COMPONENT( TrigJetHypoToolConfig_dijet ) +DECLARE_COMPONENT( TrigJetNotToolMT) +DECLARE_COMPONENT( TrigJetAndToolMT) +DECLARE_COMPONENT( TrigJetOrToolMT) DECLARE_COMPONENT( TrigHLTJetHypo_SMC ) DECLARE_COMPONENT( TrigHLTJetHypo_HT ) DECLARE_COMPONENT( TrigHLTJetHypo_TLA ) diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py b/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py index 9393ed844a81..934c2ca704f1 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py @@ -7,8 +7,6 @@ from AthenaCommon.AppMgr import ServiceMgr as svcMgr from AthenaCommon.Constants import VERBOSE,DEBUG,INFO from AthenaCommon.CFElements import parOR, seqAND, seqOR, stepSeq - - ## def jetFSInputMaker( ): ## """ Creates the jet inputMaker for FS""" ## RoIs = jetCollections.L1RoIs diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py index 9e36ab4f49b3..00344d62048d 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py @@ -119,7 +119,7 @@ if (doJet): jetChains = [ Chain(name='HLT_j85', Seed="L1_J20", ChainSteps=[jetstep1] ), - Chain(name='HLT_j100', Seed="L1_J20", ChainSteps=[jetstep1] ) + Chain(name='HLT_j45', Seed="L1_J20", ChainSteps=[jetstep1] ) ] testChains += jetChains diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref index f235b86abb82..c3ef3fd3315e 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref @@ -1,23 +1,20 @@ TriggerSummaryStep1 0 0 DEBUG +++ HLT_xe30_L1XE10 ID#347649004 TriggerSummaryStep1 0 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 0 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 0 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 0 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 0 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 0 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 0 0 DEBUG +++ HLT_j85 ID#3478728990 TriggerSummaryStep2 0 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 0 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 0 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep2 0 0 DEBUG +++ HLT_e3_etcut ID#2711808158 TriggerSummaryStep1 1 0 DEBUG +++ HLT_xe30_L1XE10 ID#347649004 TriggerSummaryStep1 1 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 1 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 1 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 1 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 1 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 1 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 1 0 DEBUG +++ HLT_j85 ID#3478728990 +TriggerSummaryStep1 1 0 DEBUG +++ HLT_j45 ID#3664574289 TriggerSummaryStep2 1 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 1 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 1 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -33,12 +30,10 @@ TriggerSummaryStep2 2 0 DEBUG +++ HLT_e7_etcut ID#243 TriggerSummaryStep2 2 0 DEBUG +++ HLT_e3_etcut ID#2711808158 TriggerSummaryStep1 3 0 DEBUG +++ HLT_xe30_L1XE10 ID#347649004 TriggerSummaryStep1 3 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 3 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 3 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 3 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 3 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 3 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 3 0 DEBUG +++ HLT_j85 ID#3478728990 TriggerSummaryStep2 3 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 3 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 3 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -100,12 +95,11 @@ TriggerSummaryStep2 8 0 DEBUG +++ HLT_e7_etcut ID#243 TriggerSummaryStep2 8 0 DEBUG +++ HLT_e3_etcut ID#2711808158 TriggerSummaryStep1 9 0 DEBUG +++ HLT_xe30_L1XE10 ID#347649004 TriggerSummaryStep1 10 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 10 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 10 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 10 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 10 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 10 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 10 0 DEBUG +++ HLT_j85 ID#3478728990 +TriggerSummaryStep1 10 0 DEBUG +++ HLT_j45 ID#3664574289 TriggerSummaryStep2 10 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 10 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 10 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -129,12 +123,10 @@ TriggerSummaryStep2 12 0 DEBUG +++ HLT_g5_etcut ID#140 TriggerSummaryStep2 12 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep2 12 0 DEBUG +++ HLT_e3_etcut ID#2711808158 TriggerSummaryStep1 13 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 13 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 13 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 13 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 13 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 13 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 13 0 DEBUG +++ HLT_j85 ID#3478728990 TriggerSummaryStep2 13 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 13 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 13 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -173,12 +165,11 @@ TriggerSummaryStep1 18 0 DEBUG +++ HLT_e3_etcut ID#271 TriggerSummaryStep2 18 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 19 0 DEBUG +++ HLT_xe30_L1XE10 ID#347649004 TriggerSummaryStep1 19 0 DEBUG +++ HLT_e5_etcut ID#607406625 -TriggerSummaryStep1 19 0 DEBUG +++ HLT_j100 ID#625306965 TriggerSummaryStep1 19 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep1 19 0 DEBUG +++ HLT_e3_etcut1step ID#1509456583 TriggerSummaryStep1 19 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 19 0 DEBUG +++ HLT_e3_etcut ID#2711808158 -TriggerSummaryStep1 19 0 DEBUG +++ HLT_j85 ID#3478728990 +TriggerSummaryStep1 19 0 DEBUG +++ HLT_j45 ID#3664574289 TriggerSummaryStep2 19 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 19 0 DEBUG +++ HLT_g5_etcut ID#1407390618 TriggerSummaryStep2 19 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -199,10 +190,10 @@ TrigSignatureMoniMT INFO HLT_e7_etcut TrigSignatureMoniMT INFO HLT_e7_etcut decisions 36 205 TrigSignatureMoniMT INFO HLT_g5_etcut 20 20 17 17 17 TrigSignatureMoniMT INFO HLT_g5_etcut decisions 50 50 -TrigSignatureMoniMT INFO HLT_j100 20 20 6 0 6 -TrigSignatureMoniMT INFO HLT_j100 decisions 6 0 -TrigSignatureMoniMT INFO HLT_j85 20 20 6 0 6 -TrigSignatureMoniMT INFO HLT_j85 decisions 6 0 +TrigSignatureMoniMT INFO HLT_j45 20 20 3 0 3 +TrigSignatureMoniMT INFO HLT_j45 decisions 3 0 +TrigSignatureMoniMT INFO HLT_j85 20 20 0 0 0 +TrigSignatureMoniMT INFO HLT_j85 decisions 0 0 TrigSignatureMoniMT INFO HLT_mu6 20 20 3 0 3 TrigSignatureMoniMT INFO HLT_mu6 decisions 3 0 TrigSignatureMoniMT INFO HLT_mu6Comb 20 20 3 2 2 diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py index 936f01378a6d..668f87183b70 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py @@ -16,7 +16,7 @@ step1=ChainStep("Step1_jet", [jetSeq1]) testChains = [ Chain(name='HLT_j85', Seed="L1_J20", ChainSteps=[step1] ), - Chain(name='HLT_j100', Seed="L1_J20", ChainSteps=[step1] ) + Chain(name='HLT_j45', Seed="L1_J20", ChainSteps=[step1] ) ] diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref index ce932a38433d..f9072a28f116 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref @@ -1,16 +1,7 @@ -TriggerSummaryStep1 0 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 0 0 DEBUG +++ HLT_j85 ID#3478728990 -TriggerSummaryStep1 1 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 1 0 DEBUG +++ HLT_j85 ID#3478728990 -TriggerSummaryStep1 3 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 3 0 DEBUG +++ HLT_j85 ID#3478728990 -TriggerSummaryStep1 10 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 10 0 DEBUG +++ HLT_j85 ID#3478728990 -TriggerSummaryStep1 13 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 13 0 DEBUG +++ HLT_j85 ID#3478728990 -TriggerSummaryStep1 19 0 DEBUG +++ HLT_j100 ID#625306965 -TriggerSummaryStep1 19 0 DEBUG +++ HLT_j85 ID#3478728990 -TrigSignatureMoniMT INFO HLT_j100 20 20 6 6 -TrigSignatureMoniMT INFO HLT_j100 decisions 6 -TrigSignatureMoniMT INFO HLT_j85 20 20 6 6 -TrigSignatureMoniMT INFO HLT_j85 decisions 6 +TriggerSummaryStep1 1 0 DEBUG +++ HLT_j45 ID#3664574289 +TriggerSummaryStep1 10 0 DEBUG +++ HLT_j45 ID#3664574289 +TriggerSummaryStep1 19 0 DEBUG +++ HLT_j45 ID#3664574289 +TrigSignatureMoniMT INFO HLT_j45 20 20 3 3 +TrigSignatureMoniMT INFO HLT_j45 decisions 3 +TrigSignatureMoniMT INFO HLT_j85 20 20 0 0 +TrigSignatureMoniMT INFO HLT_j85 decisions 0 diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py b/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py index e5fb55effd12..b47021633789 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py @@ -27,7 +27,10 @@ if TriggerFlags.doCalo: # menu items - CTPToChainMapping = {"HLT_j85": "L1_J20" , "HLT_j100" : "L1_J20" } + CTPToChainMapping = { + "HLT_j85": "L1_J20" , + "HLT_j45" : "L1_J20" + } testChains =[x for x, y in CTPToChainMapping.items()] topSequence.L1DecoderTest.ChainToCTPMapping = CTPToChainMapping print testChains @@ -67,13 +70,20 @@ if TriggerFlags.doCalo: (recoSequence, sequenceOut) = jetRecoSequence(inputRoIs) from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoAlgMT - from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromName + from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromDict hypo = TrigJetHypoAlgMT("jethypo") hypo.OutputLevel = DEBUG hypo.Jets = sequenceOut hypo.HypoInputDecisions = hypoDecisions hypo.HypoOutputDecisions = "jetDecisions" - hypo.HypoTools = [ trigJetHypoToolFromName( c, c ) for c in testChains ] + + def make_dict(chain_name): + from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName + chainNameDecoder = DictFromChainName.DictFromChainName() + return chainNameDecoder.getChainDict(chain_name) + + hypo.HypoTools = [trigJetHypoToolFromDict(make_dict(c)) + for c in testChains] print hypo for tool in hypo.HypoTools: print tool diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py index 1637d01b074e..249691380e52 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py @@ -126,7 +126,9 @@ JetChainParts = { 'bTracking' : [], 'bConfig' : ['split',], 'bMatching' : ['antimatchdr05mu'], - 'trkopt' : [] + 'trkopt' : [], + 'hypoScenario' : ['simple', 'vbenf'], + 'smc' : ['30smcINF', '35smcINF', '40smcINF', '50smcINF', '60smcINF', 'nosmc'], } # ---- Jet Dictinary of default Values ---- @@ -153,6 +155,8 @@ JetChainParts_Default = { 'bMatching' : [], 'dataScouting' : '', 'trkopt' : 'notrk', + 'hypoScenario' : 'simple', + 'smc' : 'nosmc', } #========================================================== -- GitLab From c73b607dae2d15f2d9085b21f6ecd5ba59f545dc Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Fri, 8 Mar 2019 16:43:37 +0000 Subject: [PATCH 012/163] WIP for debugging RPC changes --- .../MuonByteStream/src/MuonCacheCreator.cxx | 1 + .../src/RPC_RawDataProviderTool.cxx | 133 ++++++------ .../src/RPC_RawDataProviderTool.h | 2 + .../MuonRPC_CnvTools/src/RpcROD_Decoder.cxx | 2 +- .../MuonRPC_CnvTools/src/RpcROD_Decoder.h | 204 +++++++++++------- .../src/RpcROD_Decoder_v302.C | 60 ++++-- 6 files changed, 242 insertions(+), 160 deletions(-) diff --git a/MuonSpectrometer/MuonCnv/MuonByteStream/src/MuonCacheCreator.cxx b/MuonSpectrometer/MuonCnv/MuonByteStream/src/MuonCacheCreator.cxx index ba1cd2df8a6b..9bf38bb166c3 100644 --- a/MuonSpectrometer/MuonCnv/MuonByteStream/src/MuonCacheCreator.cxx +++ b/MuonSpectrometer/MuonCnv/MuonByteStream/src/MuonCacheCreator.cxx @@ -63,6 +63,7 @@ StatusCode MuonCacheCreator::execute (const EventContext& ctx) const { // Create the CSC cache container ATH_CHECK(createContainer(m_CscCacheKey, m_cscIdHelper->module_hash_max(), ctx)); // Create the RPC cache container + // Max should match 600 (hardcoded in RPC_RawDataProviderTool) ATH_CHECK(createContainer(m_RpcCacheKey, m_rpcIdHelper->module_hash_max(), ctx)); // Create the TGC cache container ATH_CHECK(createContainer(m_TgcCacheKey, m_tgcIdHelper->module_hash_max(), ctx)); diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx index 66c2d78ab4a6..96f98cbef9e2 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx @@ -33,11 +33,13 @@ Muon::RPC_RawDataProviderTool::RPC_RawDataProviderTool( AthAlgTool(t, n, p), m_decoder("Muon::RpcROD_Decoder/RpcROD_Decoder", this), m_AllowCreation(false), - m_robDataProvider ("ROBDataProviderSvc",n) + m_robDataProvider ("ROBDataProviderSvc",n), + m_WriteOutRpcSectorLogic(true) { declareInterface<IMuonRawDataProviderTool>(this); declareProperty("Decoder", m_decoder); - declareProperty ("RpcContainerCacheKey", m_rdoContainerCacheKey, "Optional external cache for the RPC container"); + declareProperty("RpcContainerCacheKey", m_rdoContainerCacheKey, "Optional external cache for the RPC container"); + declareProperty("WriteOutRpcSectorLogic", m_WriteOutRpcSectorLogic, "Turn on/off RpcSectorLogic writing"); } @@ -59,6 +61,13 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() ATH_CHECK( m_rdoContainerCacheKey.initialize( !m_rdoContainerCacheKey.key().empty() ) ); + // We should only turn off the sector logic when running with cached data a la trigger mode + if(!m_rdoContainerCacheKey.key().empty() && m_WriteOutRpcSectorLogic){ + ATH_MSG_FATAL("Cannot write out RpcSectorLogic while running with cached RpcPad containers" + " as the RpcSectorLogic is not cached at the same time and the written containers will desync." + " Please turn off RpcSectorLogic writing when running with cached bytestream container"); + } + if (m_decoder.retrieve().isFailure()) { ATH_MSG_FATAL( "Failed to retrieve tool " << m_decoder ); @@ -154,11 +163,6 @@ StatusCode Muon::RPC_RawDataProviderTool::initialize() } } else has_bytestream = true; - //{ - // msg(MSG::FATAL) << "Cannot get the job configuration" << endmsg; - //return StatusCode::FAILURE; - //} - // register the container only when the imput from ByteStream is set up m_activeStore->setStore( &*evtStore() ); @@ -232,78 +236,85 @@ StatusCode Muon::RPC_RawDataProviderTool::convert(const std::vector<IdentifierHa } // the old one StatusCode Muon::RPC_RawDataProviderTool::convert(const ROBFragmentList& vecRobs, - const std::vector<IdentifierHash>& collections) + const std::vector<IdentifierHash>& collections) { //CALLGRIND_START_INSTRUMENTATION // retrieve the container through the MuonRdoContainerManager becasue // if the MuonByteStream CNV has to be used, the container must have been // registered there! - m_activeStore->setStore( &*evtStore() ); - - if(m_AllowCreation == false) - { - ATH_MSG_WARNING( "Container create disabled due to byte stream"); - + m_activeStore->setStore( &*evtStore() ); + + if(m_AllowCreation == false) + { + ATH_MSG_WARNING( "Container create disabled due to byte stream"); + return StatusCode::SUCCESS; // Maybe it should be false to stop the job // because the convert method should not // have been called .... but this depends // on the user experience - } + } - SG::WriteHandle<RpcPadContainer> rdoContainerHandle(m_containerKey); - if (rdoContainerHandle.isPresent()) - return StatusCode::SUCCESS; + SG::WriteHandle<RpcPadContainer> rdoContainerHandle(m_containerKey); + if (rdoContainerHandle.isPresent()) + return StatusCode::SUCCESS; - // Split the methods to have one where we use the cache and one where we just setup the container - const bool externalCacheRDO = !m_rdoContainerCacheKey.key().empty(); - if(!externalCacheRDO){ - ATH_CHECK( rdoContainerHandle.record(std::make_unique<RpcPadContainer> (padMaxIndex) ) ); - ATH_MSG_DEBUG( "Created RpcPadContainer" ); - } - else{ - SG::UpdateHandle<RpcPad_Cache> update(m_rdoContainerCacheKey); - ATH_CHECK(update.isValid()); - ATH_CHECK(rdoContainerHandle.record (std::make_unique<RpcPadContainer>( update.ptr() ))); - ATH_MSG_DEBUG("Created container using cache for " << m_rdoContainerCacheKey.key()); - } + // Split the methods to have one where we use the cache and one where we just setup the container + const bool externalCacheRDO = !m_rdoContainerCacheKey.key().empty(); + if(!externalCacheRDO){ + ATH_CHECK( rdoContainerHandle.record(std::make_unique<RpcPadContainer> (padMaxIndex) ) ); + ATH_MSG_DEBUG( "Created RpcPadContainer" ); + } + else{ + SG::UpdateHandle<RpcPad_Cache> update(m_rdoContainerCacheKey); + ATH_CHECK(update.isValid()); + ATH_CHECK(rdoContainerHandle.record (std::make_unique<RpcPadContainer>( update.ptr() ))); + ATH_MSG_DEBUG("Created container using cache for " << m_rdoContainerCacheKey.key()); + } + + RpcPadContainer* pad = rdoContainerHandle.ptr(); + + SG::WriteHandle<RpcSectorLogicContainer> logicHandle(m_sec); + auto logic = std::make_unique<RpcSectorLogicContainer>(); - RpcPadContainer* pad = rdoContainerHandle.ptr(); - - SG::WriteHandle<RpcSectorLogicContainer> logicHandle(m_sec); - auto logic = std::make_unique<RpcSectorLogicContainer>(); - - for (ROBFragmentList::const_iterator itFrag = vecRobs.begin(); itFrag != vecRobs.end(); itFrag++) + // Reset to a nullptr (logic.get() will pass this through to decoder) + if(!m_WriteOutRpcSectorLogic) logic.reset(); + + for (ROBFragmentList::const_iterator itFrag = vecRobs.begin(); itFrag != vecRobs.end(); itFrag++) + { + //convert only if data payload is delivered + if ( (**itFrag).rod_ndata()!=0 ) { - //convert only if data payload is delivered - if ( (**itFrag).rod_ndata()!=0 ) - { - std::vector<IdentifierHash> coll = - to_be_converted(**itFrag,collections); - - if (m_decoder->fillCollections(**itFrag, *pad, coll, logic.get()).isFailure()) - { - // store the error conditions into the StatusCode and continue - } - } - else - { - if(msgLvl(MSG::DEBUG)) - { - uint32_t sourceId= (**itFrag).source_id(); - msg(MSG::DEBUG) << " ROB " << MSG::hex << sourceId + std::vector<IdentifierHash> coll = to_be_converted(**itFrag,collections); + + if (m_decoder->fillCollections(**itFrag, *pad, coll, logic.get()).isFailure()) + { + // store the error conditions into the StatusCode and continue + } + } + else + { + if(msgLvl(MSG::DEBUG)) + { + uint32_t sourceId= (**itFrag).source_id(); + msg(MSG::DEBUG) << " ROB " << MSG::hex << sourceId << " is delivered with an empty payload" << MSG::dec << endmsg; - } - // store the error condition into the StatusCode and continue - } + } + // store the error condition into the StatusCode and continue } - // Unsure about this at the moment - //ATH_CHECK( rdoContainerHandle.record (std::move (pad)) ); + } + // Unsure about this at the moment + //ATH_CHECK( rdoContainerHandle.record (std::move (pad)) ); + ATH_MSG_DEBUG("After processing, number of collections in container : " << pad-> numberOfCollections() ); + if(m_WriteOutRpcSectorLogic){ + ATH_MSG_DEBUG("Writing out RpcSectorLogicContainer"); ATH_CHECK( logicHandle.record (std::move (logic)) ); - //in presence of errors return FAILURE -//CALLGRIND_STOP_INSTRUMENTATION - return StatusCode::SUCCESS; + } + + //in presence of errors return FAILURE + //CALLGRIND_STOP_INSTRUMENTATION + return StatusCode::SUCCESS; } diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h index 820755fecbba..5c0bcf140550 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.h @@ -72,6 +72,8 @@ private: /// RPC container cache key SG::UpdateHandleKey<RpcPad_Cache> m_rdoContainerCacheKey ; + /// Turn on/off RpcSectorConfig writing + bool m_WriteOutRpcSectorLogic; }; diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.cxx b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.cxx index 892c4619d5d9..ba82e4d2bc14 100755 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.cxx +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.cxx @@ -38,7 +38,7 @@ Muon::RpcROD_Decoder::RpcROD_Decoder ( const std::string& type, const std::strin m_decodeSL(false), //m_byteStreamErrSvc("RPC_ByteStreamErrorSvc",name), m_cabling(0), - m_pRpcIdHelper(0) //,m_bench("RpcROD_Decoder") + m_pRpcIdHelper(0) //,m_bench("RpcROD_Decoder"), { declareInterface< IRpcROD_Decoder >( this ); declareProperty("SpecialROBNumber",m_specialROBNumber=-1); diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h index b1bfc3c249b9..66dd7f1bdcb8 100755 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h @@ -400,6 +400,9 @@ namespace Muon return StatusCode::FAILURE; // error in fragment } + if(RPC_SECTORLOGIC == nullptr){ + ATH_MSG_DEBUG("RPC_SECTORLOGIC is null, so we will skip decoding the sector logic information"); + } // get the pointer to the data BS data; @@ -517,7 +520,7 @@ namespace Muon ATH_MSG_DEBUG ( "RPC RDO collection already exist with collection hash = " << static_cast<unsigned int>(*it) << " converting is skipped!"); } else{ - ATH_MSG_VERBOSE(" Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); + ATH_MSG_DEBUG(" Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); // create new collection - I should be doing this with unique_ptr but it requires changing downstream functions RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); @@ -547,22 +550,20 @@ namespace Muon //for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) { - // add collection into IDC using RpcPadCache functions - + // Get the write handle again, but note that lock.alreadyPresent() will be true BUT we have already checked + // for this hash that it was not present before processing, and we still need to attach to the container RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( ((*it).second)->identifyHash() ); + + // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle + StatusCode status_lock = lock.addOrDelete( std::move( std::unique_ptr<RpcPad>((*it).second))); - if ( !lock.alreadyPresent() ) - { - // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle - StatusCode status_lock = lock.addOrDelete( std::unique_ptr<RpcPad>( (*it).second ) ); - - if(status_lock != StatusCode::SUCCESS) - { - ATH_MSG_ERROR("Failed to add RPC PAD collection to container" ); - //report the error condition - } - else - ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); + if(status_lock != StatusCode::SUCCESS) + { + ATH_MSG_ERROR("Failed to add RPC PAD collection to container" ); + //report the error condition + } + else{ + ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); } } return cnv_sc; @@ -571,12 +572,16 @@ namespace Muon std::vector<IdentifierHash>::const_iterator it = collections.begin(); for( ; it!=collections.end(); ++it) { - RpcPadContainer::const_iterator itColl = rdoIdc.indexFind(*it); - if (itColl == rdoIdc.end()) - { - msg(MSG::VERBOSE) << " Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) << endmsg; - - // create new collection + // IDC_WriteHandle + RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( (*it) ); + + if(lock.alreadyPresent() ){ + ATH_MSG_DEBUG ( "RPC RDO collection already exist with collection hash = " << static_cast<unsigned int>(*it) << " converting is skipped!"); + } + else{ + ATH_MSG_VERBOSE(" Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); + + // create new collection - I should be doing this with unique_ptr but it requires changing downstream functions RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); //convert collection - note case3 will never be used due to statement above @@ -596,14 +601,18 @@ namespace Muon ATH_MSG_VERBOSE("Error into the RPC fillCollections decoding"); } + // Here need to implement writing for all the other fill methods + // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle + StatusCode status_lock = lock.addOrDelete( std::move( std::unique_ptr<RpcPad>( coll ) ) ); + // add collection into IDC - if (rdoIdc.addCollection(coll, *it).isFailure()) + if(status_lock != StatusCode::SUCCESS) { - msg(MSG::ERROR) << "Failed to add RPC PAD collection to container" << endmsg; + ATH_MSG_ERROR("Failed to add RPC PAD collection to container"); //report the error condition } else - ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)(*it)<<" to the RpcPad Container | size = "<<coll->size()); + ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)(*it)<<" to the RpcPad Container | size = " << coll->size()); } } return cnv_sc; @@ -619,6 +628,10 @@ namespace Muon RpcROD_Decoder::fillCollection_v302(BS data, const uint32_t data_size, RpcPad& v, const uint32_t& sourceId, RpcSectorLogicContainer* sectorLogicContainer ) const { + bool skipSectorLogicDecoding = (sectorLogicContainer == nullptr); + if(skipSectorLogicDecoding) + ATH_MSG_DEBUG("Skip SectorLogic decoding, so SLROC.decodeFragment is not being processed"); + /* for (unsigned int i = 0; i<1000; ++i) { */ /* //std::cout<<" aaa "<<std::endl; */ @@ -758,14 +771,16 @@ namespace Muon isPadPreFooter=false; isPadFooter =false; isSLHeader =false; - isSLSubHeader =false; + isSLSubHeader =false; isSLFooter =false; uint32_t currentWord = p[i]; RXROS.decodeFragment(currentWord,recField); PDROS.decodeFragment(currentWord,recField); - SLROS.decodeFragment(currentWord,recField); + if(!skipSectorLogicDecoding){ + SLROS.decodeFragment(currentWord,recField); + } if (RXROS.isHeader()) { isRXHeader=true; @@ -792,6 +807,14 @@ namespace Muon } else if (SLROS.isSubHeader() && isSLFragment) { isSLSubHeader=true; } + + // The SLROS functions still return values (based on default values) + if(skipSectorLogicDecoding){ + isSLHeader = false; + isSLSubHeader = false; + isSLFragment = false; + isSLFooter = false; + } if (msgLvl(MSG::VERBOSE) ) { @@ -1209,7 +1232,7 @@ namespace Muon uint16_t channel = matrixROS.channel(); firedChan = new RpcFiredChannel(bcid,time,ijk,channel); - ATH_MSG_VERBOSE ( + ATH_MSG_VERBOSE ( "Adding a fired channel, bcid=" << bcid << " time=" << " ijk=" << ijk << " channel=" << channel); @@ -1258,7 +1281,10 @@ namespace Muon RpcROD_Decoder::fillCollection_v301(BS data, const uint32_t data_size, RpcPad& v, const uint16_t& subDetector, RpcSectorLogicContainer* sectorLogicContainer ) const { - + bool skipSectorLogicDecoding = (sectorLogicContainer == nullptr); + if(skipSectorLogicDecoding) + ATH_MSG_DEBUG("Skip SectorLogic decoding, so SLROC.decodeFragment is not being processed"); + // unpack the 32 bits words into 16 bits // no ROD header and footer std::vector<uint16_t> p = get16bits_v301(data,data_size,0,0); @@ -1291,8 +1317,7 @@ namespace Muon bool foundPad=false; - if (msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "The offline ID request for conversion is " - << m_pRpcIdHelper->show_to_string(thisPadOfflineId) << endmsg; + ATH_MSG_VERBOSE( "The offline ID request for conversion is " << m_pRpcIdHelper->show_to_string(thisPadOfflineId) ); bool isSLHeader =false; @@ -1344,7 +1369,9 @@ namespace Muon RXROS.decodeFragment(currentWord,recField); PDROS.decodeFragment(currentWord,recField); - SLROS.decodeFragment(currentWord,recField); + if(!skipSectorLogicDecoding){ + SLROS.decodeFragment(currentWord,recField); + } if (RXROS.isHeader() && !isSLFragment) isRXHeader=true; else if (RXROS.isFooter() && !isSLFragment) isRXFooter=true; @@ -1354,26 +1381,33 @@ namespace Muon else if (PDROS.isFooter() && !isSLFragment) isPadFooter=true; else if (SLROS.isHeader()) isSLHeader=true; else if (SLROS.isFooter()) isSLFooter=true; + + // The SLROS functions still return values (based on default values) + if(skipSectorLogicDecoding){ + isSLHeader = false; + isSLFragment = false; + isSLFooter = false; + } //#ifndef NVERBOSE if (msgLvl(MSG::VERBOSE)) - { - msg(MSG::VERBOSE) <<" RX Header: "<<isRXHeader - <<" RX Footer: "<<isRXFooter - <<endmsg; - msg(MSG::VERBOSE) <<" Pad Header: "<<isPadHeader - <<" Pad SubHeader: "<<isPadSubHeader - <<" Pad PreFooter: "<<isPadPreFooter - <<" Pad Footer: "<<isPadFooter - <<endmsg; - msg(MSG::VERBOSE) <<" isPADFragment: "<<isPADFragment - <<endmsg; - msg(MSG::VERBOSE) <<" SL Header: "<<isSLHeader - <<" SL Footer: "<<isSLFooter - <<endmsg; - msg(MSG::VERBOSE) <<" isSLFragment: "<<isSLFragment - <<endmsg; - } + { + msg(MSG::VERBOSE) <<" RX Header: "<<isRXHeader + <<" RX Footer: "<<isRXFooter + <<endmsg; + msg(MSG::VERBOSE) <<" Pad Header: "<<isPadHeader + <<" Pad SubHeader: "<<isPadSubHeader + <<" Pad PreFooter: "<<isPadPreFooter + <<" Pad Footer: "<<isPadFooter + <<endmsg; + msg(MSG::VERBOSE) <<" isPADFragment: "<<isPADFragment + <<endmsg; + msg(MSG::VERBOSE) <<" SL Header: "<<isSLHeader + <<" SL Footer: "<<isSLFooter + <<endmsg; + msg(MSG::VERBOSE) <<" isSLFragment: "<<isSLFragment + <<endmsg; + } //#endif if(isRXHeader) { @@ -1398,39 +1432,39 @@ namespace Muon // Check the Sector Logic Fragment if(foundSL && msgLvl(MSG::VERBOSE)) - { + { //#ifndef NVERBOSE msg(MSG::VERBOSE) <<"SectorLogicReadOut checkFragment: " << myRPC.SLFragment()->checkFragment()<<endmsg; msg(MSG::VERBOSE) << myRPC.SLFragment()<<endmsg; //#endif - } + } if(isSLHeader) SLBodyWords=0; // Decode the sector logic footer else if(isSLFooter ) { - + //#ifndef NVERBOSE if (SLindex>1) { msg(MSG::ERROR) << "More than 2 SL fragments in sector " << sector << endmsg; } //#endif - if (msgLvl(MSG::VERBOSE)) - { - //#ifndef NVERBOSE - msg(MSG::VERBOSE) <<" Number of data words in SectorLogicReadOut= " - <<SLBodyWords<<endmsg; - msg(MSG::VERBOSE) <<" TEST SL: "<<foundSL<<endmsg; - //#endif - - //#ifndef NVERBOSE - // Print out a raw dump of the SL fragment - for(unsigned short j=0; j<SLBodyWords; j++) { - msg(MSG::VERBOSE) <<" SL data word "<<j<<" : "<<std::hex<<SLBuff[j]<<MSG::dec<<endmsg; - } - } + if (msgLvl(MSG::VERBOSE)) + { + //#ifndef NVERBOSE + msg(MSG::VERBOSE) <<" Number of data words in SectorLogicReadOut= " + <<SLBodyWords<<endmsg; + msg(MSG::VERBOSE) <<" TEST SL: "<<foundSL<<endmsg; + //#endif + + //#ifndef NVERBOSE + // Print out a raw dump of the SL fragment + for(unsigned short j=0; j<SLBodyWords; j++) { + msg(MSG::VERBOSE) <<" SL data word "<<j<<" : "<<std::hex<<SLBuff[j]<<MSG::dec<<endmsg; + } + } //#endif // Found the sector logic footer, the sector logic fragment @@ -1465,12 +1499,12 @@ namespace Muon uint16_t ptid = sectorLogic->ptid(ilink,igate); //#ifndef NVERBOSE ATH_MSG_VERBOSE ("SL: pt for link=" << ilink - << " gate=" << igate << " is: " << ptid); + << " gate=" << igate << " is: " << ptid); //#endif if (ptid != 0) { //#ifndef NVERBOSE ATH_MSG_VERBOSE ("SL: found an hit for link=" << ilink - << " gate=" << igate); + << " gate=" << igate); //#endif uint16_t cmadd = sectorLogic->cmadd(ilink,igate); @@ -1495,9 +1529,9 @@ namespace Muon } - if (msgLvl(MSG::VERBOSE)){ - msg(MSG::VERBOSE) << "Size of sector 55: " << sl2->size() << endmsg; - msg(MSG::VERBOSE) << "Size of sector 56: " << sl1->size() << endmsg; + if (msgLvl(MSG::VERBOSE)){ + msg(MSG::VERBOSE) << "Size of sector 55: " << sl2->size() << endmsg; + msg(MSG::VERBOSE) << "Size of sector 56: " << sl1->size() << endmsg; } // flag the two sectors as decoded //bool setSector1 = sectorLogicContainer->setSector(56,0); @@ -1643,12 +1677,12 @@ namespace Muon isPadFooter ? isPADFragment=false : isPADFragment=true; //#ifndef NVERBOSE - if (msgLvl(MSG::VERBOSE)) { - msg(MSG::VERBOSE) <<" current word "<<std::hex<<currentWord<<MSG::dec<<endmsg; - - msg(MSG::VERBOSE) <<" ==isPADFragment= "<<isPADFragment<<endmsg; - msg(MSG::VERBOSE) <<" calling pushword: "<<std::hex<<currentWord<<MSG::dec<<endmsg; - } + if (msgLvl(MSG::VERBOSE)) { + msg(MSG::VERBOSE) <<" current word "<<std::hex<<currentWord<<MSG::dec<<endmsg; + + msg(MSG::VERBOSE) <<" ==isPADFragment= "<<isPADFragment<<endmsg; + msg(MSG::VERBOSE) <<" calling pushword: "<<std::hex<<currentWord<<MSG::dec<<endmsg; + } //#endif int foundCM = 0; @@ -1697,7 +1731,7 @@ namespace Muon firedChan = new RpcFiredChannel(bcid,time,ijk,channel); //#ifndef NVERBOSE ATH_MSG_VERBOSE ("Adding a fired channel, bcid=" << bcid << " time=" - << " ijk=" << ijk << " channel=" << channel); + << " ijk=" << ijk << " channel=" << channel); //#endif // add the fired channel to the matrix @@ -1709,8 +1743,8 @@ namespace Muon firedChan = new RpcFiredChannel(bcid,time,ijk,threshold,overlap); //#ifndef NVERBOSE ATH_MSG_VERBOSE ("Adding a fired channel, bcid=" << bcid << " time=" - << " ijk=" << ijk << " overlap=" << overlap - << " threshold=" << threshold); + << " ijk=" << ijk << " overlap=" << overlap + << " threshold=" << threshold); //#endif // add the fired channel to the matrix @@ -1741,7 +1775,10 @@ namespace Muon RpcROD_Decoder::fillCollection_v300(BS data, const uint32_t data_size, RpcPad& v, const uint16_t& subDetector, RpcSectorLogicContainer* sectorLogicContainer ) const { - + bool skipSectorLogicDecoding = (sectorLogicContainer == nullptr); + if(skipSectorLogicDecoding) + ATH_MSG_DEBUG("Skip SectorLogic decoding, so SLROC.decodeFragment is not being processed"); + //#ifndef NVERBOSE if (msgLvl(MSG::VERBOSE)) { msg(MSG::VERBOSE) << "**********Decoder dumping the words******** " << endmsg; @@ -1829,6 +1866,13 @@ namespace Muon else if (SLROS.isHeader()) isSLHeader=true; else if (SLROS.isFooter()) isSLFooter=true; + // The SLROS functions still return values (based on default values) + if(skipSectorLogicDecoding){ + isSLHeader = false; + isSLFragment = false; + isSLFooter = false; + } + //#ifndef NVERBOSE if (msgLvl(MSG::VERBOSE)) { msg(MSG::VERBOSE) <<" RX Header: "<<isRXHeader diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder_v302.C b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder_v302.C index ab999037e721..255acd06daa0 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder_v302.C +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder_v302.C @@ -23,6 +23,10 @@ StatusCode Muon::RpcROD_Decoder::fillCollectionsFromRob_v302(BS data, const uint RpcSectorLogicContainer* sectorLogicContainer ) const { + bool skipSectorLogicDecoding = (sectorLogicContainer == nullptr); + if(skipSectorLogicDecoding) + ATH_MSG_DEBUG("Skip SectorLogic decoding, so SLROC.decodeFragment is not being processed"); + /* for (unsigned int i = 0; i<1000; ++i) { */ /* //std::cout<<" aaa "<<std::endl; */ /* msg(MSG::VERBOSE) << "try to increase cpu time "<<log(pow(((double)i+1.)/999.,3))<<endmsg; */ @@ -229,7 +233,9 @@ StatusCode Muon::RpcROD_Decoder::fillCollectionsFromRob_v302(BS data, const uint RXROS.decodeFragment(currentWord,recFieldROS); PDROS.decodeFragment(currentWord,recFieldPAD); - SLROS.decodeFragment(currentWord,recFieldSL); + if(!skipSectorLogicDecoding){ + SLROS.decodeFragment(currentWord,recFieldSL); + } if (RXROS.isHeader()) { isRXHeader=true; @@ -256,7 +262,26 @@ StatusCode Muon::RpcROD_Decoder::fillCollectionsFromRob_v302(BS data, const uint } else if (SLROS.isSubHeader() && isSLFragment) { isSLSubHeader=true; } + + // The SLROS functions still return values (based on default values) + if(skipSectorLogicDecoding){ + isSLHeader = false; + isSLSubHeader = false; + isSLFragment = false; + isSLFooter = false; + } + ATH_MSG_VERBOSE("\n isRXHeader " << isRXHeader << + "\n isRXFooter " << isRXFooter << + "\n isPadHeader " << isPadHeader << + "\n isPadSubHeader " << isPadSubHeader << + "\n isPADFragment " << isPADFragment << + "\n isPadPreFooter " << isPadPreFooter << + "\n isPadFooter " << isPadFooter << + "\n isSLHeader " << isSLHeader << + "\n isSLSubHeader " << isSLSubHeader << + "\n isSLFragment " << isSLFragment << + "\n isSLFooter " << isSLFooter ); @@ -297,27 +322,26 @@ StatusCode Muon::RpcROD_Decoder::fillCollectionsFromRob_v302(BS data, const uint //we must start with an RX Header: if (i==0 && (!isRXHeader)) - { - ATH_MSG_WARNING("Bad data from RPC ROD 0x" << MSG::hex << rodId << MSG::dec - << ". RX header not found at ROB fragment begin. Skipping this ROB fragment."); - return StatusCode::SUCCESS; //continue decoding data from other ROBs - //bsErrCheck_errorInRXHeader = true; - } + { + ATH_MSG_WARNING("Bad data from RPC ROD 0x" << MSG::hex << rodId << MSG::dec + << ". RX header not found at ROB fragment begin. Skipping this ROB fragment."); + return StatusCode::SUCCESS; //continue decoding data from other ROBs + //bsErrCheck_errorInRXHeader = true; + } if(isRXHeader) { - //bsErrCheck_errorInRXHeader = false; - //bsErrCheck_InRX = true; - // bsErrCheck_InSL = false; - // bsErrCheck_InPD = false; - // bsErrCheck_InCM = false; + //bsErrCheck_errorInRXHeader = false; + //bsErrCheck_InRX = true; + // bsErrCheck_InSL = false; + // bsErrCheck_InPD = false; + // bsErrCheck_InCM = false; - if (msgLvl(MSG::VERBOSE) ) - { - msg(MSG::VERBOSE) << " this is a RX Header " << endmsg; - msg(MSG::VERBOSE) <<" Sector ID=" <<RXROS.RXid()<<endmsg; - } + if (msgLvl(MSG::VERBOSE) ){ + msg(MSG::VERBOSE) << " this is a RX Header " << endmsg; + msg(MSG::VERBOSE) << " Sector ID=" <<RXROS.RXid()<<endmsg; + } // get the sector id according to the new format // not yet implemented in the readout classes @@ -327,7 +351,7 @@ StatusCode Muon::RpcROD_Decoder::fillCollectionsFromRob_v302(BS data, const uint uint16_t rxid = RXROS.RXid(); // range (presumably) 0-1 sectorForCabling = 2*rodId+rxid; // range 0-31 sector = side*32+sectorForCabling; // range 0-63 //side = 1 for side A or 0 for side C // side 1 corresponds to subDetID=65 (side 0 for subDetID=66) - if (msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << "RXid, sectorForCabling, sector = "<<rxid<<" "<<sectorForCabling<<" "<<sector<<std::endl; + if (msgLvl(MSG::VERBOSE) ) msg(MSG::VERBOSE) << "RXid, sectorForCabling, sector = "<<rxid<<" "<<sectorForCabling<<" "<<sector<<std::endl; //fix for M3 if ((rodId==3 || rodId==1) && (m_specialROBNumber > 0) ) { -- GitLab From 1f517a6c86edb05de7f2861a9af416db5d4289c8 Mon Sep 17 00:00:00 2001 From: sherwood <peter.sherwood@cern.ch> Date: Fri, 8 Mar 2019 18:55:26 +0100 Subject: [PATCH 013/163] Mended TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx. --- .../TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx index 014d7bb1b888..09251a1c4e1e 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx @@ -24,7 +24,7 @@ DECLARE_COMPONENT( TrigEFDPhiMetJetAllTE ) DECLARE_COMPONENT( TrigHLTJetHypo_Dijet ) DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEta ) DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEtaDPhi ) -DECLARE_COMPONENT( TrigJetHypoToolConfig_EtaEt ) +DECLARE_COMPONENT( TrigHLTJetHypo_EtaEt ) DECLARE_COMPONENT( TrigJetHypoToolConfig_simple ) DECLARE_COMPONENT( TrigJetHypoToolConfig_dijet ) DECLARE_COMPONENT( TrigJetNotToolMT) -- GitLab From 65b9a145bdef7ebd10493227f0bca12b38ef1086 Mon Sep 17 00:00:00 2001 From: Bertrand Martin <martindl@cern.ch> Date: Fri, 8 Mar 2019 19:52:00 +0100 Subject: [PATCH 014/163] Update packages:TrigTauRec tau from upstream/21.3 to upstream/master via pseudo-merge --- .../TrigTauRec/TrigTauRec/TrigTauRecMerged.h | 37 +- .../python/TrigTauAlgorithmsHolder.py | 191 ++- .../TrigTauRec/python/TrigTauRecConfig.py | 193 ++- .../TrigTauRec/python/TrigTauRecConfigMT.py | 205 +++- .../TrigTauRec/python/TrigTauRecMonitoring.py | 36 +- .../TrigTauRec/src/TrigTauRecMerged.cxx | 369 +++--- .../TrigTauRec/src/TrigTauRecMergedMT.cxx | 1034 ++++++++--------- .../TriggerMenu/python/tau/TauDef.py | 303 ++--- .../TriggerMenu/python/tau/TauDefIdTest.py | 2 - .../TriggerMenu/python/tau/TauHypoProvider.py | 142 ++- .../TriggerMenu/python/tau/TauSliceFlags.py | 7 +- 11 files changed, 1491 insertions(+), 1028 deletions(-) diff --git a/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h b/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h index 5b95de334dcc..856ed1415cbc 100755 --- a/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h +++ b/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h @@ -22,6 +22,7 @@ #include "TrigTimeAlgs/TrigTimerSvc.h" #include "GaudiKernel/ToolHandle.h" #include "tauRecTools/ITauToolBase.h" +//#include "tauRecTools/TauJetRNNEvaluator.h" #include "LumiBlockComps/ILuminosityTool.h" #include "BeamSpotConditionsData/BeamSpotData.h" @@ -205,14 +206,36 @@ class TrigTauRecMerged: public HLT::FexAlgo { std::vector<unsigned char> m_calo_errors; /** track errors */ std::vector<unsigned char> m_track_errors; - /** author */ - std::vector<unsigned char> m_author; - /** deltaZ0 core Trks*/ - std::vector<float> m_deltaZ0coreTrks; - - /** deltaZ0 wide Trks*/ - std::vector<float> m_deltaZ0wideTrks; + // RNN ID monitoring + // retrieved from tool handle, if tool exists + // needs migration of RNN tools to master + //TauJetRNNEvaluator* m_rnn_evaluator; + + float m_RNN_scalar_ptRatioEflowApprox; + float m_RNN_scalar_mEflowApprox; + float m_RNN_scalar_pt_jetseed_log; + + int m_RNN_Nclusters; + std::vector<double> m_RNN_cluster_et_log; + std::vector<double> m_RNN_cluster_dEta; + std::vector<double> m_RNN_cluster_dPhi; + std::vector<double> m_RNN_cluster_CENTER_LAMBDA; + std::vector<double> m_RNN_cluster_SECOND_LAMBDA; + std::vector<double> m_RNN_cluster_SECOND_R; + + int m_RNN_Ntracks; + std::vector<double> m_RNN_track_pt_log; + std::vector<double> m_RNN_track_dEta; + std::vector<double> m_RNN_track_dPhi; + std::vector<double> m_RNN_track_d0_abs_log; + std::vector<double> m_RNN_track_z0sinThetaTJVA_abs_log; + std::vector<double> m_RNN_track_nInnermostPixelHits; + std::vector<double> m_RNN_track_nPixelHits; + std::vector<double> m_RNN_track_nSCTHits; + + float m_RNNJetScore; + float m_RNNJetScoreSigTrans; }; #endif diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py index d9f76cf6859e..491fc8c3c849 100644 --- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py +++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py @@ -124,7 +124,6 @@ def getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='', ca from tauRecTools.tauRecToolsConf import TauCalibrateLC TauCalibrateLC = TauCalibrateLC(name = _name, - #calibrationFile = "EnergyCalibrationLC2012_retuned.root", calibrationFile = calibFileName, doEnergyCorrection = correctEnergy, doAxisCorrection = correctAxis) @@ -134,14 +133,46 @@ def getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='', ca cached_instances[_name] = TauCalibrateLC return TauCalibrateLC +######################################################################## +# MvaTESVariableDecorator +def getMvaTESVariableDecorator(): + + _name = sPrefix + 'MvaTESVariableDecorator' + + if _name in cached_instances: + return cached_instances[_name] + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import MvaTESVariableDecorator + MvaTESVariableDecorator = MvaTESVariableDecorator(name = _name) + + ToolSvc += MvaTESVariableDecorator + cached_instances[_name] = MvaTESVariableDecorator + return MvaTESVariableDecorator + +######################################################################## +# MvaTESEvaluator +def getMvaTESEvaluator(): + + _name = sPrefix + 'MvaTESEvaluator' + + if _name in cached_instances: + return cached_instances[_name] + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import MvaTESEvaluator + MvaTESEvaluator = MvaTESEvaluator(name = _name, + WeightFileName = 'OnlineMvaTES_BRT_v1.weights.root') + + ToolSvc += MvaTESEvaluator + cached_instances[_name] = MvaTESEvaluator + return MvaTESEvaluator + ######################################################################## # Tau cell variables calculation -def getCellVariables(cellConeSize=0.2, prefix=''): - #if prefix is not given, take global one - if not prefix: - prefix=sPrefix +def getCellVariables(cellConeSize=0.2): - _name = prefix + 'CellVariables' + _name = sPrefix + 'CellVariables' if _name in cached_instances: return cached_instances[_name] @@ -676,10 +707,11 @@ def getTrackToVertexTool(): ######################################################################## # Tau-Track Association def getTauTrackFinder(applyZ0cut=False, maxDeltaZ0=2, noSelector = False, prefix=''): - #if prefix is not given, take global one - if not prefix: - prefix=sPrefix - _name = sPrefix + 'TauTrackFinder' + + #if prefix is not given, take global one + if not prefix: + prefix=sPrefix + _name = prefix + 'TauTrackFinder' if _name in cached_instances: return cached_instances[_name] @@ -720,7 +752,144 @@ def getTauGenericPi0Cone(): cached_instances[_name] = TauGenericPi0Cone return TauGenericPi0Cone -#end +######################################################################## +# TauTrackClassifier +def getTauTrackClassifier(): + + _name = sPrefix + 'TauTrackClassifier' + + if _name in cached_instances: + return cached_instances[_name] + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import tauRecTools__TauTrackClassifier as TauTrackClassifier + from tauRecTools.tauRecToolsConf import tauRecTools__TrackMVABDT as TrackMVABDT + + import PyUtils.RootUtils as ru + ROOT = ru.import_root() + import cppyy + cppyy.loadDictionary('xAODTau_cDict') + + input_file_name = 'EFtracks_BDT_classifier_v0.root' + calibrationFolder = 'TrigTauRec/00-11-02/' + BDTcut = 0.45 + deltaZ0 = 1.0 + + # ========================================================================= + EFtrackBDT = TrackMVABDT( + name = _name + "_MVABDT", + InputWeightsPath = input_file_name, + Threshold = BDTcut, + DeltaZ0 = deltaZ0, + ExpectedFlag = ROOT.xAOD.TauJetParameters.unclassified, + inTrigger = True, + calibFolder = calibrationFolder + ) + + ToolSvc += EFtrackBDT + + classifier = TauTrackClassifier( + name=_name, + Classifiers=[EFtrackBDT] + ) + + cached_instances[_name] = classifier + return classifier + +######################################################################## +# TauIDVarCalculator +def getTauIDVarCalculator(): + + _name = sPrefix + 'TauIDVarCalculator' + + if _name in cached_instances: + return cached_instances[_name] + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import TauIDVarCalculator + TauIDVarCalculator = TauIDVarCalculator(name=_name) + + ToolSvc += TauIDVarCalculator + cached_instances[_name] = TauIDVarCalculator + return TauIDVarCalculator + +######################################################################## +# TauJetRNNEvaluator +def getTauJetRNNEvaluator(NetworkFile0P="", NetworkFile1P="", NetworkFile3P="", OutputVarname="RNNJetScore", + MaxTracks=10, MaxClusters=6, MaxClusterDR=1.0, + InputLayerScalar="scalar", InputLayerTracks="tracks", InputLayerClusters="clusters", + OutputLayer="rnnid_output", OutputNode="sig_prob"): + + _name = sPrefix + 'TauJetRNNEvaluator' + + if _name in cached_instances: + return cached_instances[_name] + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import TauJetRNNEvaluator + TauJetRNNEvaluator = TauJetRNNEvaluator(name=_name, + NetworkFile0P=NetworkFile0P, + NetworkFile1P=NetworkFile1P, + NetworkFile3P=NetworkFile3P, + OutputVarname=OutputVarname, + MaxTracks=MaxTracks, + MaxClusters=MaxClusters, + MaxClusterDR=MaxClusterDR, + InputLayerScalar=InputLayerScalar, + InputLayerTracks=InputLayerTracks, + InputLayerClusters=InputLayerClusters, + OutputLayer=OutputLayer, + OutputNode=OutputNode) + + ToolSvc += TauJetRNNEvaluator + cached_instances[_name] = TauJetRNNEvaluator + return TauJetRNNEvaluator + +######################################################################## +# TauWPDecoratorJetRNN +def getTauWPDecoratorJetRNN(): + + _name = sPrefix + 'TauWPDecoratorJetRNN' + + if _name in cached_instances: + return cached_instances[_name] + + import PyUtils.RootUtils as ru + ROOT = ru.import_root() + import cppyy + cppyy.loadDictionary('xAODTau_cDict') + + from AthenaCommon.AppMgr import ToolSvc + from tauRecTools.tauRecToolsConf import TauWPDecorator + TauWPDecorator = TauWPDecorator( name=_name, + flatteningFile0Prong = "rnnid_flat_0p_v4.root", + flatteningFile1Prong = "rnnid_flat_1p_v4.root", + flatteningFile3Prong = "rnnid_flat_mp_v4.root", + CutEnumVals = + [ ROOT.xAOD.TauJetParameters.JetRNNSigVeryLoose, ROOT.xAOD.TauJetParameters.JetRNNSigLoose, + ROOT.xAOD.TauJetParameters.JetRNNSigMedium, ROOT.xAOD.TauJetParameters.JetRNNSigTight ], + SigEff0P = [0.98, 0.90, 0.65, 0.50], + SigEff1P = [0.992, 0.99, 0.965, 0.94], + SigEff3P = [0.99, 0.98, 0.865, 0.80], + ScoreName = "RNNJetScore", + NewScoreName = "RNNJetScoreSigTrans", + DefineWPs = True, + ) + + ToolSvc += TauWPDecorator + cached_instances[_name] = TauWPDecorator + return TauWPDecorator + +# target efficiencies used for 2017 BDT: +# SigEff1P = [0.995, 0.99, 0.97, 0.90], +# SigEff3P = [0.995, 0.94, 0.88, 0.78], + + + +# end + + + """ obsolete methods diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py index b448439d97e4..0b6c7b4fa94a 100644 --- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py +++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ TrigTauRec """ @@ -56,7 +56,7 @@ class TrigTauRecMerged_Tau (TrigTauRecMerged) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass @@ -91,17 +91,17 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) : import TrigTauRec.TrigTauAlgorithmsHolder as taualgs tools = [] - taualgs.setPrefix("TrigTau_") + taualgs.setPrefix("TrigTau2012_") #what should run in trigger??? #same as tauRec (but without Pi0 cluster finder) tools.append(taualgs.getJetSeedBuilder()) tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default tools.append(taualgs.getTauAxis()) - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTau2012_")) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2)) tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTau2012_")) #cellConeSize 0.2!! + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) #cellConeSize 0.2!! #tools.append(taualgs.getElectronVetoVars()) #needed? tools.append(taualgs.getTauVertexVariables()) @@ -111,7 +111,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -126,6 +126,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) : class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) : + __slots__ = [ '_mytools'] def __init__(self, name = "TrigTauRecMerged_TauPreselection"): super( TrigTauRecMerged_TauPreselection , self ).__init__( name ) @@ -158,15 +159,12 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) : tools.append(taualgs.getTauAxis()) # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here # Insert bypass later? - # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845) - if TriggerFlags.run2Config == '2016': - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPreselection_", noSelector=False)) - else: - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPreselection_", noSelector=False)) + # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, noSelector=False)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPreselection_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Variables combining tracking and calorimeter information tools.append(taualgs.getTauCommonCalcVars()) @@ -178,7 +176,7 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -190,8 +188,8 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) : ## add beam type flag from AthenaCommon.BeamFlags import jobproperties self.BeamType = jobproperties.Beam.beamType() - - + + class TrigTauRecMerged_TauFTK (TrigTauRecMerged) : __slots__ = [ '_mytools'] def __init__(self, name = "TrigTauRecMerged_TauFTK"): @@ -226,11 +224,11 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMerged) : tools.append(taualgs.getTauAxis()) # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here # Insert bypass later? - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauFTK_", noSelector = False)) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, noSelector = False)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauFTK_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Variables combining tracking and calorimeter information tools.append(taualgs.getTauCommonCalcVars()) @@ -242,7 +240,7 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMerged) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -287,11 +285,59 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMerged) : # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True)) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauCaloOnly_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' + pass + + self.Tools = tools + + ## add beam type flag + from AthenaCommon.BeamFlags import jobproperties + self.BeamType = jobproperties.Beam.beamType() + +class TrigTauRecMerged_TauCaloOnlyMVA (TrigTauRecMerged) : + __slots__ = [ '_mytools'] + def __init__(self, name = "TrigTauRecMerged_TauCaloOnlyMVA"): + super( TrigTauRecMerged_TauCaloOnlyMVA , self ).__init__( name ) + self._mytools = [] + + # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] + from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring + validation = TrigTauRecValidationMonitoring() + online = TrigTauRecOnlineMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("Time") + self.AthenaMonTools = [ time, validation, online ] + + import TrigTauRec.TrigTauAlgorithmsHolder as taualgs + tools = [] + + taualgs.setPrefix("TrigTauCaloOnlyMVA_") + + # Collection name - not stored + self.OutputCollection = "TrigTauRecCaloOnly" + + # Only include tools needed for calo pre-selection + + # Set seedcalo energy scale (Full RoI) + tools.append(taualgs.getJetSeedBuilder()) + # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) + tools.append(taualgs.getTauAxis()) + # Calibrate to TES + tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True)) + # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) + # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt() + tools.append(taualgs.getMvaTESVariableDecorator()) + tools.append(taualgs.getMvaTESEvaluator()) + + for tool in tools: + tool.inTrigger = True + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -332,15 +378,12 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) : tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) tools.append(taualgs.getTauAxis()) - # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845) - if TriggerFlags.run2Config == '2016': - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPrecision_")) - else: - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPrecision_")) + # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPrecision_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Lifetime variables tools.append(taualgs.getTauVertexVariables()) @@ -353,7 +396,7 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -361,5 +404,101 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) : ## add beam type flag from AthenaCommon.BeamFlags import jobproperties self.BeamType = jobproperties.Beam.beamType() + + + +class TrigTauRecMerged_TauPrecisionMVA (TrigTauRecMerged) : + __slots__ = [ '_mytools'] + + def __init__(self, name = "TrigTauRecMerged_TauPrecisionMVA", doMVATES=False, doTrackBDT=False, doRNN=False): + + super( TrigTauRecMerged_TauPrecisionMVA , self ).__init__( name ) + + self._mytools = [] + + # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] + from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring + validation = TrigTauRecValidationMonitoring() + online = TrigTauRecOnlineMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("Time") + self.AthenaMonTools = [ time, validation, online ] + + import TrigTauRec.TrigTauAlgorithmsHolder as taualgs + tools = [] + + # using same prefix as in TauPrecision sequence should be safe if tools with different configurations have different names + # e.g. TauTrackFinder in 2016 using dz0=2mm instead of 1mm in 2017 + taualgs.setPrefix("TrigTau_") + + # Collection name + self.OutputCollection = "TrigTauRecMerged" + + # Include full set of tools + + # Set seedcalo energy scale (Full RoI) + tools.append(taualgs.getJetSeedBuilder()) + # Associate RoI vertex or Beamspot to tau - don't use TJVA + tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default + # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) + tools.append(taualgs.getTauAxis()) + + # for now, use 'doMVATES=False' to detect tracktwoEF, instead of introducing new flag + if not doMVATES: + # Count tracks with deltaZ0 cut of 1mm for tracktwoEF + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1)) + else: + # tightened to 0.75 mm for tracktwoMVA (until the track BDT can be used) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=0.75, prefix='TrigTauTightDZ_')) + + if doTrackBDT: + # BDT track classification + tools.append(taualgs.getTauTrackClassifier()) + + # Calibrate to calo TES + tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) + + if doMVATES: + # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt() + tools.append(taualgs.getMvaTESVariableDecorator()) + tools.append(taualgs.getMvaTESEvaluator()) + + # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) + # tools.append(taualgs.getElectronVetoVars()) + # Lifetime variables + tools.append(taualgs.getTauVertexVariables()) + # Variables combining tracking and calorimeter information + tools.append(taualgs.getTauCommonCalcVars()) + # Cluster-based sub-structure, with dRMax also + tools.append(taualgs.getTauSubstructure()) + # tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=False, correctAxis=True, postfix='_onlyAxis')) + tools.append(taualgs.getPileUpCorrection()) + + if doRNN: + # RNN tau ID + tools.append(taualgs.getTauJetRNNEvaluator(NetworkFile0P="rnnid_config_0p_v3.json", + NetworkFile1P="rnnid_config_1p_v3.json", + NetworkFile3P="rnnid_config_mp_v3.json", + MaxTracks=10, + MaxClusters=6, + MaxClusterDR=1.0)) + # flattened RNN score and WP + tools.append(taualgs.getTauWPDecoratorJetRNN()) + + + for tool in tools: + tool.inTrigger = True + tool.calibFolder = 'TrigTauRec/00-11-02/' + pass + + self.Tools = tools + + ## add beam type flag + from AthenaCommon.BeamFlags import jobproperties + self.BeamType = jobproperties.Beam.beamType() + + #end diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py index fa826a5d1821..ea725c603d1b 100644 --- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py +++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ TrigTauRec """ @@ -56,7 +56,7 @@ class TrigTauRecMerged_Tau (TrigTauRecMergedMT) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass @@ -91,17 +91,17 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMergedMT) : import TrigTauRec.TrigTauAlgorithmsHolder as taualgs tools = [] - taualgs.setPrefix("TrigTau_") + taualgs.setPrefix("TrigTau2012_") #what should run in trigger??? #same as tauRec (but without Pi0 cluster finder) tools.append(taualgs.getJetSeedBuilder()) tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default tools.append(taualgs.getTauAxis()) - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTau2012_")) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2)) tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTau2012_")) #cellConeSize 0.2!! + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) #cellConeSize 0.2!! #tools.append(taualgs.getElectronVetoVars()) #needed? tools.append(taualgs.getTauVertexVariables()) @@ -111,7 +111,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMergedMT) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -158,15 +158,12 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) : tools.append(taualgs.getTauAxis()) # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here # Insert bypass later? - # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845) - if TriggerFlags.run2Config == '2016': - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPreselection_", noSelector=False)) - else: - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPreselection_", noSelector=False)) + # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, noSelector=False)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPreselection_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Variables combining tracking and calorimeter information tools.append(taualgs.getTauCommonCalcVars()) @@ -178,7 +175,7 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -190,8 +187,8 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) : ## add beam type flag from AthenaCommon.BeamFlags import jobproperties self.BeamType = jobproperties.Beam.beamType() - - + + class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) : __slots__ = [ '_mytools'] def __init__(self, name = "TrigTauRecMerged_TauFTK"): @@ -226,11 +223,11 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) : tools.append(taualgs.getTauAxis()) # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here # Insert bypass later? - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauFTK_", noSelector = False)) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, noSelector = False)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauFTK_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Variables combining tracking and calorimeter information tools.append(taualgs.getTauCommonCalcVars()) @@ -242,7 +239,7 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -262,12 +259,13 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMergedMT) : self._mytools = [] # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] - from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring - validation = TrigTauRecValidationMonitoring() - online = TrigTauRecOnlineMonitoring() - - from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig - time = TrigTimeHistToolConfig("Time") + # not used for now? + #from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring + #validation = TrigTauRecValidationMonitoring() + #online = TrigTauRecOnlineMonitoring() + + #from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + #time = TrigTimeHistToolConfig("Time") #self.AthenaMonTools = [ time, validation, online ] import TrigTauRec.TrigTauAlgorithmsHolder as taualgs @@ -287,11 +285,59 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMergedMT) : # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True)) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauCaloOnly_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) + + for tool in tools: + tool.inTrigger = True + tool.calibFolder = 'TrigTauRec/00-11-02/' + pass + + self.Tools = tools + + ## add beam type flag + from AthenaCommon.BeamFlags import jobproperties + self.BeamType = jobproperties.Beam.beamType() + +class TrigTauRecMerged_TauCaloOnlyMVA (TrigTauRecMergedMT) : + __slots__ = [ '_mytools'] + def __init__(self, name = "TrigTauRecMerged_TauCaloOnlyMVA"): + super( TrigTauRecMerged_TauCaloOnlyMVA , self ).__init__( name ) + self._mytools = [] + + # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] + from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring + validation = TrigTauRecValidationMonitoring() + online = TrigTauRecOnlineMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("Time") + self.AthenaMonTools = [ time, validation, online ] + + import TrigTauRec.TrigTauAlgorithmsHolder as taualgs + tools = [] + + taualgs.setPrefix("TrigTauCaloOnlyMVA_") + + # Collection name - not stored + self.OutputCollection = "TrigTauRecCaloOnly" + + # Only include tools needed for calo pre-selection + + # Set seedcalo energy scale (Full RoI) + tools.append(taualgs.getJetSeedBuilder()) + # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) + tools.append(taualgs.getTauAxis()) + # Calibrate to TES + tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True)) + # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) + # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt() + tools.append(taualgs.getMvaTESVariableDecorator()) + tools.append(taualgs.getMvaTESEvaluator()) for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -332,15 +378,12 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) : tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) tools.append(taualgs.getTauAxis()) - # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845) - if TriggerFlags.run2Config == '2016': - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPrecision_")) - else: - tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPrecision_")) + # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1)) # Calibrate to TES tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies - tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPrecision_")) + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) # tools.append(taualgs.getElectronVetoVars()) # Lifetime variables tools.append(taualgs.getTauVertexVariables()) @@ -353,7 +396,7 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) : for tool in tools: tool.inTrigger = True - tool.calibFolder = 'TrigTauRec/00-11-01/' + tool.calibFolder = 'TrigTauRec/00-11-02/' pass self.Tools = tools @@ -361,5 +404,101 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) : ## add beam type flag from AthenaCommon.BeamFlags import jobproperties self.BeamType = jobproperties.Beam.beamType() + + + +class TrigTauRecMerged_TauPrecisionMVA (TrigTauRecMergedMT) : + __slots__ = [ '_mytools'] + + def __init__(self, name = "TrigTauRecMerged_TauPrecisionMVA", doMVATES=False, doTrackBDT=False, doRNN=False): + + super( TrigTauRecMerged_TauPrecisionMVA , self ).__init__( name ) + + self._mytools = [] + + # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] + from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring + validation = TrigTauRecValidationMonitoring() + online = TrigTauRecOnlineMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("Time") + self.AthenaMonTools = [ time, validation, online ] + + import TrigTauRec.TrigTauAlgorithmsHolder as taualgs + tools = [] + + # using same prefix as in TauPrecision sequence should be safe if tools with different configurations have different names + # e.g. TauTrackFinder in 2016 using dz0=2mm instead of 1mm in 2017 + taualgs.setPrefix("TrigTau_") + + # Collection name + self.OutputCollection = "TrigTauRecMerged" + + # Include full set of tools + + # Set seedcalo energy scale (Full RoI) + tools.append(taualgs.getJetSeedBuilder()) + # Associate RoI vertex or Beamspot to tau - don't use TJVA + tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default + # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger) + tools.append(taualgs.getTauAxis()) + + # for now, use 'doMVATES=False' to detect tracktwoEF, instead of introducing new flag + if not doMVATES: + # Count tracks with deltaZ0 cut of 1mm for tracktwoEF + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1)) + else: + # tightened to 0.75 mm for tracktwoMVA (until the track BDT can be used) + tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=0.75, prefix='TrigTauTightDZ_')) + + if doTrackBDT: + # BDT track classification + tools.append(taualgs.getTauTrackClassifier()) + + # Calibrate to calo TES + tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy')) + + if doMVATES: + # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt() + tools.append(taualgs.getMvaTESVariableDecorator()) + tools.append(taualgs.getMvaTESEvaluator()) + + # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies + tools.append(taualgs.getCellVariables(cellConeSize=0.2)) + # tools.append(taualgs.getElectronVetoVars()) + # Lifetime variables + tools.append(taualgs.getTauVertexVariables()) + # Variables combining tracking and calorimeter information + tools.append(taualgs.getTauCommonCalcVars()) + # Cluster-based sub-structure, with dRMax also + tools.append(taualgs.getTauSubstructure()) + # tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=False, correctAxis=True, postfix='_onlyAxis')) + tools.append(taualgs.getPileUpCorrection()) + + if doRNN: + # RNN tau ID + tools.append(taualgs.getTauJetRNNEvaluator(NetworkFile0P="rnnid_config_0p_v3.json", + NetworkFile1P="rnnid_config_1p_v3.json", + NetworkFile3P="rnnid_config_mp_v3.json", + MaxTracks=10, + MaxClusters=6, + MaxClusterDR=1.0)) + # flattened RNN score and WP + tools.append(taualgs.getTauWPDecoratorJetRNN()) + + + for tool in tools: + tool.inTrigger = True + tool.calibFolder = 'TrigTauRec/00-11-02/' + pass + + self.Tools = tools + + ## add beam type flag + from AthenaCommon.BeamFlags import jobproperties + self.BeamType = jobproperties.Beam.beamType() + + #end diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py index e23ecb7b552e..051a99cd3568 100644 --- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py +++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py @@ -7,8 +7,6 @@ errorcalolabels = 'NoROIDescr:NoCellCont:EmptyCellCont:NoClustCont:NoClustKey:Em errortracklabels = 'NoTrkCont:NoVtxCont' -authorlabels = 'AutauRec:Autau13p:AuBoth:AutauRecOnly:Autau13pOnly' - class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig): def __init__ (self, name="TrigTauRecOnlineMonitoring"): super(TrigTauRecOnlineMonitoring, self).__init__(name) @@ -61,8 +59,8 @@ class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig): self.Histograms += [ defineHistogram('EF_innerTrkAvgDist', type='TH1F', title=" EF inner track average distance; innerTrkAvgDist; nRoIs", xbins=40, xmin=-0.05, xmax=0.5) ] self.Histograms += [ defineHistogram('EF_SumPtTrkFrac', type='TH1F', title=" EF Sum Pt Track Fraction; SumPtTrkFrac; nRoIs", xbins=40, xmin=-0.5, xmax=1.1) ] - self.Histograms += [ defineHistogram('EF_ActualInteractions', type='TH1F', title=" Number of actual interaction per bunch crossing;ActualInteractions;nevents", xbins=50, xmin=0.0, xmax=50.) ] - self.Histograms += [ defineHistogram('EF_AvgInteractions', type='TH1F', title=" Number of average interaction per bunch crossing;AvgInteractions;nevents", xbins=50, xmin=0.0, xmax=50.) ] + self.Histograms += [ defineHistogram('EF_ActualInteractions', type='TH1F', title=" Number of actual interaction per bunch crossing;ActualInteractions;nevents", xbins=80, xmin=0.0, xmax=80.) ] + self.Histograms += [ defineHistogram('EF_AvgInteractions', type='TH1F', title=" Number of average interaction per bunch crossing;AvgInteractions;nevents", xbins=80, xmin=0.0, xmax=80.) ] self.Histograms += [ defineHistogram('EF_beamspot_x', type='TH1F', title=" Beamspot position;Beamspot x;nevents", xbins=50, xmin=-10.0, xmax=10.) ] self.Histograms += [ defineHistogram('EF_beamspot_y', type='TH1F', title=" Beamspot position;Beamspot y;nevents", xbins=50, xmin=-10.0, xmax=10.) ] @@ -71,11 +69,33 @@ class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig): self.Histograms += [ defineHistogram('EF_calo_errors', type='TH1F', title=" EF Calo Errors ; ; nRoIs", xbins=10, xmin=-0.5, xmax=9.5 , labels=errorcalolabels) ] self.Histograms += [ defineHistogram('EF_track_errors', type='TH1F', title=" EF Track Errors ; ; nRoIs", xbins=2, xmin=-0.5, xmax=2.5 , labels=errortracklabels) ] - self.Histograms += [ defineHistogram('EF_author', type='TH1F', title=" EF author ; ; nRoIs", xbins=5, xmin=0.5, xmax=5.5 , labels=authorlabels) ] - self.Histograms += [ defineHistogram('EF_deltaZ0coreTrks', type='TH1F', title=" EF delta Z0 coreTrks wrt leadTrk ; #Delta Z0 [mm]; nRoIs x nTracks", xbins=160, xmin=-20, xmax=20) ] - self.Histograms += [ defineHistogram('EF_deltaZ0wideTrks', type='TH1F', title=" EF delta Z0 wideTrks wrt leadTrk ; #Delta Z0 [mm]; nRoIs x nTracks", xbins=160, xmin=-20, xmax=20) ] - + # RNN ID + # scalar inputs + self.Histograms += [ defineHistogram('EF_RNN_scalar_ptRatioEflowApprox', type='TH1F', title=" EF RNN scalar ptRatioEflowApprox; min(ptRatioEflowApprox 4.)", xbins=50, xmin=0., xmax=4.) ] + self.Histograms += [ defineHistogram('EF_RNN_scalar_mEflowApprox', type='TH1F', title=" EF RNN scalar mEflowApprox; Log10(max(mEflowApprox 140.)", xbins=50, xmin=0., xmax=5.) ] + self.Histograms += [ defineHistogram('EF_RNN_scalar_pt_jetseed_log', type='TH1F', title=" EF RNN scalar pt_jetseed_log; Log10(tau.ptJetSeed)", xbins=50, xmin=3.5, xmax=7.) ] + # cluster inputs + self.Histograms += [ defineHistogram('EF_RNN_Nclusters', type='TH1F', title=" EF RNN Nclusters; Number of clusters", xbins=10, xmin=0., xmax=10.) ] + self.Histograms += [ defineHistogram('EF_RNN_cluster_et_log', type='TH1F', title=" EF RNN cluster et_log; Log10(cluster E_{T})", xbins=50, xmin=1., xmax=7.) ] + self.Histograms += [ defineHistogram('EF_RNN_cluster_dEta', type='TH1F', title=" EF RNN cluster dEta; #Delta#eta(cluster tau)", xbins=50, xmin=-0.5, xmax=0.5) ] + self.Histograms += [ defineHistogram('EF_RNN_cluster_dPhi', type='TH1F', title=" EF RNN cluster dPhi; #Delta#phi(cluster tau)", xbins=50, xmin=-0.5, xmax=0.5) ] + # track inputs + self.Histograms += [ defineHistogram('EF_RNN_Ntracks', type='TH1F', title=" EF RNN Ntracks; Number of tracks", xbins=12, xmin=0., xmax=12.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_pt_log', type='TH1F', title=" EF RNN track pt_log; Log10(track p_{T})", xbins=50, xmin=2.7, xmax=7.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_dEta', type='TH1F', title=" EF RNN track dEta; #Delta#eta(track tau)", xbins=50, xmin=-0.5, xmax=0.5) ] + self.Histograms += [ defineHistogram('EF_RNN_track_dPhi', type='TH1F', title=" EF RNN track dPhi; #Delta#phi(track xtau)", xbins=50, xmin=-0.5, xmax=0.5) ] + self.Histograms += [ defineHistogram('EF_RNN_track_d0_abs_log', type='TH1F', title=" EF RNN track d0_abs_log; Log10(Abs(track.d0()) + 1e-6)", xbins=50, xmin=-6.1, xmax=2.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_z0sinThetaTJVA_abs_log', type='TH1F', title=" EF RNN track z0sinThetaTJVA_abs_log; Log10(Abs(track.z0sinThetaTJVA(tau)) + 1e-6)", xbins=50, xmin=-6.1, xmax=4.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_nInnermostPixelHits', type='TH1F', title=" EF RNN track nInnermostPixelHits; nInnermostPixelHits", xbins=4, xmin=0., xmax=4.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_nPixelHits', type='TH1F', title=" EF RNN track nPixelHits; nPixelHits", xbins=11, xmin=0., xmax=11.) ] + self.Histograms += [ defineHistogram('EF_RNN_track_nSCTHits', type='TH1F', title=" EF RNN track nSCTHits; nSCTHits", xbins=20, xmin=0., xmax=20.) ] + # output + self.Histograms += [ defineHistogram('EF_RNNJetScore', type='TH1F', title=" EF RNNJetScore; RNNJetScore", xbins=50, xmin=0., xmax=1.) ] + self.Histograms += [ defineHistogram('EF_RNNJetScoreSigTrans', type='TH1F', title=" EF RNNJetScoreSigTrans; RNNJetScoreSigTrans", xbins=50, xmin=0., xmax=1.) ] + + + ########## add validation specific histograms class TrigTauRecValidationMonitoring(TrigTauRecOnlineMonitoring): def __init__ (self, name="TrigTauRecValidationMonitoring"): diff --git a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx index 3a1dc594e19d..0be526b23a84 100755 --- a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx +++ b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /******************************************************************** @@ -44,12 +44,13 @@ #include "LumiBlockComps/ILumiBlockMuTool.h" -#include "TrigTauRec/TrigTauRecMerged.h" +// needs migration to master of RNN tools in tauRecTools +//#include "tauRecTools/TauJetRNN.h" +#include "TrigTauRec/TrigTauRecMerged.h" using namespace std; - // Invokes base class constructor. TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLocator): HLT::FexAlgo(name, pSvcLocator), @@ -60,7 +61,8 @@ TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLoca m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), m_maxeta( 2.5 ), m_minpt( 10000 ), - m_trkcone( 0.2 ) + m_trkcone( 0.2 ) //, + //m_rnn_evaluator(0) { // The following properties can be specified at run-time @@ -193,14 +195,34 @@ TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLoca /** Errors */ declareMonitoredStdContainer("EF_track_errors",m_track_errors); - /** Author */ - declareMonitoredStdContainer("EF_author",m_author); - - /** deltaZ0 core Trks*/ - declareMonitoredStdContainer("EF_deltaZ0coreTrks",m_deltaZ0coreTrks); - - /** deltaZ0 wide Trks*/ - declareMonitoredStdContainer("EF_deltaZ0wideTrks",m_deltaZ0wideTrks); + // RNN inputs + // scalar + declareMonitoredVariable("EF_RNN_scalar_ptRatioEflowApprox", m_RNN_scalar_ptRatioEflowApprox); + declareMonitoredVariable("EF_RNN_scalar_mEflowApprox", m_RNN_scalar_mEflowApprox); + declareMonitoredVariable("EF_RNN_scalar_pt_jetseed_log", m_RNN_scalar_pt_jetseed_log); + + // clusters + declareMonitoredVariable("EF_RNN_Nclusters", m_RNN_Nclusters); + declareMonitoredStdContainer("EF_RNN_cluster_et_log", m_RNN_cluster_et_log); + declareMonitoredStdContainer("EF_RNN_cluster_dEta", m_RNN_cluster_dEta); + declareMonitoredStdContainer("EF_RNN_cluster_dPhi", m_RNN_cluster_dPhi); + declareMonitoredStdContainer("EF_RNN_cluster_CENTER_LAMBDA", m_RNN_cluster_CENTER_LAMBDA); + declareMonitoredStdContainer("EF_RNN_cluster_SECOND_LAMBDA", m_RNN_cluster_SECOND_LAMBDA); + declareMonitoredStdContainer("EF_RNN_cluster_SECOND_R", m_RNN_cluster_SECOND_R); + + // tracks + declareMonitoredVariable("EF_RNN_Ntracks", m_RNN_Ntracks); + declareMonitoredStdContainer("EF_RNN_track_pt_log", m_RNN_track_pt_log); + declareMonitoredStdContainer("EF_RNN_track_dEta", m_RNN_track_dEta); + declareMonitoredStdContainer("EF_RNN_track_dPhi", m_RNN_track_dPhi); + declareMonitoredStdContainer("EF_RNN_track_d0_abs_log", m_RNN_track_d0_abs_log); + declareMonitoredStdContainer("EF_RNN_track_z0sinThetaTJVA_abs_log", m_RNN_track_z0sinThetaTJVA_abs_log); + declareMonitoredStdContainer("EF_RNN_track_nInnermostPixelHits", m_RNN_track_nInnermostPixelHits); + declareMonitoredStdContainer("EF_RNN_track_nPixelHits", m_RNN_track_nPixelHits); + declareMonitoredStdContainer("EF_RNN_track_nSCTHits", m_RNN_track_nSCTHits); + // output + declareMonitoredVariable("EF_RNNJetScore", m_RNNJetScore); + declareMonitoredVariable("EF_RNNJetScoreSigTrans", m_RNNJetScoreSigTrans); } @@ -210,7 +232,7 @@ TrigTauRecMerged::~TrigTauRecMerged() HLT::ErrorCode TrigTauRecMerged::hltInitialize() { - msg() << MSG::INFO << "TrigTauRecMerged::initialize()" << endmsg; + ATH_MSG_INFO( "TrigTauRecMerged::initialize()" ); m_tauEventData.setInTrigger(true); //////////////////// @@ -218,7 +240,7 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize() //////////////////// // check tool names if ( m_tools.begin() == m_tools.end() ) { - msg() << MSG::ERROR << " no tools given for this algorithm." << endmsg; + ATH_MSG_ERROR( "No tools given for this algorithm." ); return HLT::BAD_JOB_SETUP; } @@ -226,43 +248,52 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize() //------------------------------------------------------------------------- ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin(); ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end(); - msg() << MSG::INFO << "List of tools in execution sequence:" << endmsg; - msg() << MSG::INFO << "------------------------------------" << endmsg; + ATH_MSG_INFO( "List of tools in execution sequence:" ); + ATH_MSG_INFO( "------------------------------------" ); for(; p_itT != p_itTE; ++p_itT ) { StatusCode p_sc = p_itT->retrieve(); if( p_sc.isFailure() ) { - msg() << MSG::WARNING << "Cannot find tool named <"; - msg() << *p_itT << ">" << endmsg; + ATH_MSG_WARNING( "Cannot find tool named <" << *p_itT << ">" ); return HLT::BAD_JOB_SETUP; } else { - msg() << MSG::INFO << "REGTEST "; - msg() <<" add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name() << endmsg; + ATH_MSG_INFO( "REGTEST " ); + ATH_MSG_INFO( "Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name() ); if( doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ; (*p_itT)->setTauEventData(&m_tauEventData); + + /* + // monitoring of RNN input variables + ToolHandle<ITauToolBase> handle = *p_itT; + TauJetRNNEvaluator* RNN_evaluator = dynamic_cast<TauJetRNNEvaluator*>(&(*handle)); + if(RNN_evaluator) { + ATH_MSG_INFO( "Retrieved TauJetRNNEvaluator for RNN inputs monitoring" ); + m_rnn_evaluator = RNN_evaluator; + } + */ } } - msg() << MSG::INFO << " " << endmsg; - msg() << MSG::INFO << "------------------------------------" << endmsg; + ATH_MSG_INFO( " " ); + ATH_MSG_INFO( "------------------------------------" ); + ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin(); ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end(); - msg() << MSG::INFO << "List of end tools in execution sequence:" << endmsg; - msg() << MSG::INFO << "------------------------------------" << endmsg; + ATH_MSG_INFO( "List of end tools in execution sequence:" ); + ATH_MSG_INFO( "------------------------------------" ); for(; p_itTe != p_itTEe; ++p_itTe ) { StatusCode p_sc = p_itTe->retrieve(); if( p_sc.isFailure() ) { - msg() << MSG::WARNING << "Cannot find tool named <"; - msg() << *p_itTe << ">" << endmsg; + ATH_MSG_WARNING( "Cannot find tool named <" << *p_itTe << ">" ); return HLT::BAD_JOB_SETUP; } else { - msg() << MSG::INFO << "REGTEST "; - msg() <<" add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name() << endmsg; + ATH_MSG_INFO( "REGTEST " ); + ATH_MSG_INFO( "Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name() ); if( doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ; ( *p_itTe )->setTauEventData(&m_tauEventData); } @@ -277,20 +308,20 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize() // } if (m_lumiBlockMuTool.retrieve().isFailure()) { - msg() << MSG::WARNING << "Unable to retrieve LumiBlockMuTool" << endmsg; + ATH_MSG_WARNING( "Unable to retrieve LumiBlockMuTool" ); } else { - msg() << MSG::DEBUG << "Successfully retrieved LumiBlockMuTool" << endmsg; + ATH_MSG_DEBUG( "Successfully retrieved LumiBlockMuTool" ); } // Retrieve beam conditions if(m_beamSpotKey.initialize().isFailure()) { - msg() << MSG::WARNING << "Unable to retrieve Beamspot key" << endmsg; + ATH_MSG_WARNING( "Unable to retrieve Beamspot key" ); } else { - msg() << MSG::DEBUG << "Successfully retrieved Beamspot key" << endmsg; + ATH_MSG_DEBUG( "Successfully retrieved Beamspot key" ); } - msg() << MSG::INFO << " " << endmsg; - msg() << MSG::INFO << "------------------------------------" << endmsg; + ATH_MSG_INFO( " " ); + ATH_MSG_INFO( "------------------------------------" ); return HLT::OK; } @@ -298,7 +329,6 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize() ///////////////////////////////////////////////////////////////// HLT::ErrorCode TrigTauRecMerged::hltFinalize() { - //msg() << MSG::DEBUG << "Finalizing TrigTauRecMerged" << endmsg; return HLT::OK; } @@ -344,7 +374,6 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, m_innerTrkAvgDist=-999; m_SumPtTrkFrac=-999; - m_author.clear(); m_calo_errors.clear(); m_track_errors.clear(); m_EtEm =-10.; @@ -356,19 +385,30 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, m_EtaEF = -99; m_PhiEF = -99; + // RNN variables monitoring + m_RNN_scalar_ptRatioEflowApprox = 0.; m_RNN_scalar_mEflowApprox = 0.; m_RNN_scalar_pt_jetseed_log = 0.; + m_RNN_Nclusters = -1; + m_RNN_cluster_et_log.clear(); m_RNN_cluster_dEta.clear(); m_RNN_cluster_dPhi.clear(); + m_RNN_cluster_CENTER_LAMBDA.clear(); m_RNN_cluster_SECOND_LAMBDA.clear(); m_RNN_cluster_SECOND_R.clear(); + m_RNN_Ntracks = -1; + m_RNN_track_pt_log.clear(); m_RNN_track_dEta.clear(); m_RNN_track_dPhi.clear(); + m_RNN_track_d0_abs_log.clear(); m_RNN_track_z0sinThetaTJVA_abs_log.clear(); + m_RNN_track_nInnermostPixelHits.clear(); m_RNN_track_nPixelHits.clear(); m_RNN_track_nSCTHits.clear(); + m_RNNJetScore = -999; m_RNNJetScoreSigTrans = -999.; + // Retrieve store. - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Executing TrigTauRecMerged" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Executing TrigTauRecMerged" ); // Get RoiDescriptor const TrigRoiDescriptor* roiDescriptor = 0; HLT::ErrorCode hltStatus = getFeature(inputTE, roiDescriptor); - if ( hltStatus==HLT::OK && roiDescriptor!= NULL ) { + if ( hltStatus==HLT::OK && roiDescriptor!= nullptr ) { if( msgLvl() <= MSG::DEBUG ) - msg() << MSG::DEBUG << "REGTEST: RoI " << *roiDescriptor<< endmsg; + ATH_MSG_DEBUG( "REGTEST: RoI " << *roiDescriptor ); } else { - msg() << MSG::ERROR << "Failed to find RoiDescriptor " << endmsg; + ATH_MSG_ERROR( "Failed to find RoiDescriptor " ); m_calo_errors.push_back(NoROIDescr); return hltStatus; } @@ -379,40 +419,30 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, hltStatus = getFeatures(inputTE, vectorCaloCellContainer); if(hltStatus!=HLT::OK ) { - msg() << MSG::ERROR << " No CaloCellContainers retrieved for the trigger element" << endmsg; + ATH_MSG_ERROR( " No CaloCellContainers retrieved for the trigger element" ); m_calo_errors.push_back(NoCellCont); return hltStatus; } if (vectorCaloCellContainer.size() < 1) { - msg() << MSG::ERROR - << "Size of vector CaloCell container is not 1. Is" - << vectorCaloCellContainer.size() - << endmsg; + ATH_MSG_ERROR( "Size of vector CaloCell container is not 1. Is " << vectorCaloCellContainer.size() ); m_calo_errors.push_back(NoCellCont); return HLT::ERROR; } const CaloCellContainer* RoICaloCellContainer = vectorCaloCellContainer.back(); - if(RoICaloCellContainer != NULL) { + if(RoICaloCellContainer != nullptr) { m_nCells = RoICaloCellContainer->size(); - - msg() << MSG::DEBUG - << "REGTEST: Size of vector CaloCell container is " - << RoICaloCellContainer->size() - << endmsg; + ATH_MSG_DEBUG("REGTEST: Size of vector CaloCell container is " << RoICaloCellContainer->size() ); if(RoICaloCellContainer->size()==0) { - msg() << MSG::INFO - << "Cannot proceed, size of vector CaloCell container is " - << RoICaloCellContainer->size() - << endmsg; + ATH_MSG_INFO( "Cannot proceed, size of vector CaloCell container is " << RoICaloCellContainer->size() ); m_calo_errors.push_back(EmptyCellCont); return HLT::OK; } } else { - msg() << MSG::ERROR << "no CaloCell container found "<< endmsg; + ATH_MSG_ERROR( "No CaloCell container found" ); m_calo_errors.push_back(NoCellCont); return HLT::ERROR; } @@ -422,21 +452,19 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, hltStatus = getFeatures(inputTE, vectorCaloClusterContainer); if(hltStatus!=HLT::OK ) { - msg() << MSG::ERROR << " No CaloClusterContainers retrieved for the trigger element" << endmsg; + ATH_MSG_ERROR( "No CaloClusterContainers retrieved for the trigger element" ); m_calo_errors.push_back(NoClustCont); return hltStatus; } if (vectorCaloClusterContainer.size() < 1) { - msg() << MSG::ERROR - << " CaloCluster container is empty" - << endmsg; + ATH_MSG_ERROR( "CaloCluster container is empty" ); m_calo_errors.push_back(NoClustCont); return HLT::ERROR; } if( msgLvl() <= MSG::DEBUG ) - msg() << MSG::DEBUG << " CaloCluster container size is " << vectorCaloClusterContainer.size() << endmsg; + ATH_MSG_DEBUG( "CaloCluster container size is " << vectorCaloClusterContainer.size() ); // Grab the last cluster collection attached const xAOD::CaloClusterContainer* RoICaloClusterContainer = vectorCaloClusterContainer.back(); @@ -445,13 +473,13 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, hltStatus = getStoreGateKey( RoICaloClusterContainer, collKey ); if(hltStatus!=HLT::OK ) { - msg() << MSG::ERROR << "Cluster has no key " << endmsg; + ATH_MSG_ERROR( "Cluster has no key" ); m_calo_errors.push_back(NoClustKey); return HLT::ERROR; } if( msgLvl() <= MSG::DEBUG ) - msg() << MSG::DEBUG << " cluster key for back cluster is " << collKey << endmsg; + ATH_MSG_DEBUG( "Cluster key for back cluster is " << collKey ); // Not necessary anymore @@ -491,45 +519,45 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, vector<const xAOD::TrackParticleContainer*> vectorTrackContainer; hltStatus = getFeatures(inputTE,vectorTrackContainer); - const xAOD::TrackParticleContainer* RoITrackContainer=NULL; + const xAOD::TrackParticleContainer* RoITrackContainer = nullptr; if (hltStatus!=HLT::OK) { - msg() << MSG::INFO << "REGTEST: No Track container found." << endmsg; + ATH_MSG_INFO( "REGTEST: No Track container found." ); m_track_errors.push_back(NoTrkCont); } else { if (vectorTrackContainer.size()<1) { - msg() << MSG::DEBUG << "Size of vector Track container is not 1. Is " << vectorTrackContainer.size() << endmsg; + ATH_MSG_DEBUG( "Size of vector Track container is not 1. Is " << vectorTrackContainer.size() ); m_track_errors.push_back(NoTrkCont); } if(vectorTrackContainer.size()>0) { RoITrackContainer = vectorTrackContainer.back(); if( msgLvl() <= MSG::DEBUG ) - msg() << MSG::DEBUG << "REGTEST: Size of vector Track container is " << RoITrackContainer->size() << endmsg; + ATH_MSG_DEBUG( "REGTEST: Size of vector Track container is " << RoITrackContainer->size() ); } - if(RoITrackContainer != NULL) m_nTracks = RoITrackContainer->size(); + if(RoITrackContainer != nullptr) m_nTracks = RoITrackContainer->size(); } // get Vertex Container vector<const xAOD::VertexContainer*> vectorVxContainer; hltStatus = getFeatures(inputTE,vectorVxContainer); - const xAOD::VertexContainer* RoIVxContainer = NULL; + const xAOD::VertexContainer* RoIVxContainer = nullptr; if(hltStatus!=HLT::OK) { - msg() << MSG::INFO << "No VxContainers retrieved for the trigger element" << endmsg; + ATH_MSG_INFO( "No VxContainers retrieved for the trigger element" ); m_track_errors.push_back(NoVtxCont); } else { if (vectorVxContainer.size() < 1) { - msg() << MSG::DEBUG << "Size of vector Vertex container is not 1. Is " << vectorVxContainer.size() << endmsg; + ATH_MSG_DEBUG( "Size of vector Vertex container is not 1. Is " << vectorVxContainer.size() ); m_track_errors.push_back(NoVtxCont); } if(vectorVxContainer.size() >0) { RoIVxContainer = vectorVxContainer.back(); if( msgLvl() <= MSG::DEBUG ) - msg() << MSG::DEBUG << "REGTEST: Size of vector Vertex container " << RoIVxContainer->size() << endmsg; + ATH_MSG_DEBUG( "REGTEST: Size of vector Vertex container " << RoIVxContainer->size() ); } } @@ -553,8 +581,8 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing(); m_ActualInteractions = mu; m_AvgInteractions = avg_mu; - msg() << MSG::DEBUG << "REGTEST: Retrieved Mu Value : " << mu << endmsg; - msg() << MSG::DEBUG << "REGTEST: Average Mu Value : " << avg_mu << endmsg; + ATH_MSG_DEBUG( "REGTEST: Retrieved Mu Value : " << mu ); + ATH_MSG_DEBUG( "REGTEST: Average Mu Value : " << avg_mu ); } @@ -622,12 +650,12 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, xAOD::CaloClusterContainer::const_iterator clusterIt; for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) { if( msgLvl() <= MSG::DEBUG ) - msg()<< MSG::DEBUG <<" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )" << endmsg; + ATH_MSG_DEBUG( "Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )" ); if((*clusterIt)->e() < 0) { if( msgLvl() <= MSG::DEBUG ) - msg()<< MSG::DEBUG <<" Negative energy cluster is rejected" << endmsg; + ATH_MSG_DEBUG( "Negative energy cluster is rejected" ); continue; } @@ -639,17 +667,17 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); - if( msgLvl() <= MSG::DEBUG ) msg() << MSG :: DEBUG << "jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Jet formed "<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() ); hltStatus=attachFeature(outputTE, theJetCollection, "TrigTauJet"); if (hltStatus!=HLT::OK ) { - msg() << MSG::ERROR << "Unable to record JetCollection in TDS" << endmsg; + ATH_MSG_ERROR( "Unable to record JetCollection in TDS" ); m_calo_errors.push_back(NoJetAttach); return hltStatus; } else { - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " JetCollection is recorded with key " << "HLT_" << "_" << "TrigTauJet" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "JetCollection is recorded with key " << "HLT_" << "_" << "TrigTauJet" ); } @@ -700,11 +728,11 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, processStatus = (*firstTool)->eventInitialize(); if( processStatus != StatusCode :: SUCCESS ) { - msg() << MSG :: ERROR << "tool "<<(*firstTool)->name()<< "failed in eventInitialize" << endmsg; + ATH_MSG_ERROR( "Tool "<<(*firstTool)->name()<< "failed in eventInitialize" ); return HLT :: TOOL_FAILURE; } } - if( msgLvl() <= MSG::DEBUG ) msg() << MSG ::DEBUG << " initialize all good " << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "initialize all good" ); //------------------------------------------------------------------------- // using Jet collection @@ -719,18 +747,17 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, m_tauEventData.seedContainer = theJetCollection; // This sets one track and link. Need to have at least 1 track linked to retrieve track container + // can't we instead implement in the EDM a function to retrieve the track container of a tau? setEmptyTauTrack(p_tau, pTrackContainer); if(p_seed->e()<=0) { - msg() << MSG::DEBUG << " Roi: changing eta due to energy " << p_seed->e() << endmsg; + ATH_MSG_DEBUG( "Roi: changing eta due to energy " << p_seed->e() ); p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); - msg() << MSG::DEBUG << "Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() - << endmsg; + ATH_MSG_DEBUG( "Roi: " << roiDescriptor->roiId() << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() ); } - if( msgLvl() <= MSG::DEBUG ) msg() << MSG ::DEBUG <<" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() ); m_tauEventData.setObject("JetCollection", theJetCollection ); @@ -741,13 +768,13 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, firstTool = m_tools.begin(); lastTool = m_tools.end(); processStatus = StatusCode::SUCCESS; - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Starting tool loop with seed jet" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Starting tool loop with seed jet" ); std::vector<TrigTimer* >::iterator itimer = m_mytimers.begin(); while ( ! processStatus.isFailure() && firstTool != lastTool ) { // loop stops only when Failure indicated by one of the tools if( msgLvl() <= MSG::DEBUG ) { - msg() << MSG::DEBUG << "Starting Tool: " << endmsg; - msg() << MSG::DEBUG << (*firstTool)->name() << endmsg; + ATH_MSG_DEBUG( "Starting Tool:"); + ATH_MSG_DEBUG( (*firstTool)->name() ); } // time in the various tools ++toolnum; @@ -762,14 +789,14 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, if ( !processStatus.isFailure() ) { if( msgLvl() <= MSG::DEBUG ) { - msg() << MSG::DEBUG << "REGTEST: "<< (*firstTool)->name() << " executed successfully " << endmsg; - msg() << MSG::DEBUG << "REGTEST: Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() - << " Tau pT : "<< p_tau->pt()<< endmsg; + ATH_MSG_DEBUG( "REGTEST: "<< (*firstTool)->name() << " executed successfully "); + ATH_MSG_DEBUG( "REGTEST: Roi: " << roiDescriptor->roiId() + << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() + << " Tau pT : "<< p_tau->pt() ); } } else { - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG <<"REGTEST: "<< (*firstTool)->name() << " execution failed " << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "REGTEST: "<< (*firstTool)->name() << " execution failed" ); } ++firstTool; ++itimer; @@ -778,7 +805,7 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, //check status if ( !processStatus.isSuccess() ) { // some problem - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "the tau object has NOT been registered in the tau container" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "The tau object has NOT been registered in the tau container" ); // ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin(); // for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData ); // (*tool)->cleanup( &m_tauEventData ); @@ -789,34 +816,33 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, pContainer->pop_back(); - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "clean up done after jet seed" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Clean up done after jet seed" ); } else if( processStatus.isSuccess()) { float fJetEnergy = (*p_tau->jetLink())->e(); - msg() << MSG::DEBUG << " Roi: jet e "<< fJetEnergy <<endmsg; + ATH_MSG_DEBUG( "Roi: jet e "<< fJetEnergy ); if( fJetEnergy < 0.00001 ) { - msg() << MSG::DEBUG << " Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)"<<endmsg; - msg() << MSG::DEBUG << " Roi: this is probably not needed anymore, method PxPyPzE has been corrected"<<endmsg; + ATH_MSG_DEBUG( "Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)" ); + ATH_MSG_DEBUG( "Roi: this is probably not needed anymore, method PxPyPzE has been corrected" ); //p_tau->setEta(roiDescriptor->eta0()); //p_tau->setPhi(roiDescriptor->phi0()); // Direct accessors not available anymore p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); - msg() << MSG::DEBUG << " Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() - << " Tau phi: " << p_tau->phi() - << " Tau pT : "<< p_tau->pt()<< endmsg; + ATH_MSG_DEBUG( " Roi: " << roiDescriptor->roiId() + << " Tau eta: " << p_tau->eta() + << " Tau phi: " << p_tau->phi() + << " Tau pT : "<< p_tau->pt() ); } // loop over end tools ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin(); ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end(); for (; p_itET != p_itETE; ++p_itET ) { - msg() << MSG::VERBOSE << "Invoking endTool "; - msg() << ( *p_itET )->name() << endmsg; + ATH_MSG_VERBOSE( "Invoking endTool " << ( *p_itET )->name() ); processStatus = ( *p_itET )->execute( *p_tau); if( processStatus.isFailure() ) break; @@ -868,26 +894,53 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, if(m_dPhi<-M_PI) m_dPhi += 2.0*M_PI; if(m_dPhi>M_PI) m_dPhi -= 2.0*M_PI; - // author variable removed. There are no different tau reco algs anymor - // write out delta Z0 + // uncomment when RNN tools migrated to master /* - * FF, March 2014: deactivated. - * If the output of these variables is still needed, drop me a line. - * We can either print them here as done before or put them into tauEDM to have them available globally - if (m_useTauPVTool) { - m_tauPVTool->getDeltaZ0Values(m_deltaZ0coreTrks, m_deltaZ0wideTrks); - - msg() << MSG::DEBUG << "REGTEST: deltaZ0 for core trk "; - for ( unsigned int i=0; i<m_deltaZ0coreTrks.size(); ++i) msg() << MSG::DEBUG << i << ": " << m_deltaZ0coreTrks[i] << ", "; - msg() << MSG::DEBUG << endmsg; - - msg() << MSG::DEBUG << "REGTEST: deltaZ0 for wide trk "; - for ( unsigned int i=0; i<m_deltaZ0wideTrks.size(); ++i) msg() << MSG::DEBUG << i << ": " << m_deltaZ0wideTrks[i] << ", "; - msg() << MSG::DEBUG << endmsg; - } - */ + // RNN monitoring + if(m_rnn_evaluator) { + TauJetRNN* rnn = 0; + if(m_numTrack==0) rnn = m_rnn_evaluator->get_rnn_0p(); + else if(m_numTrack==1) rnn = m_rnn_evaluator->get_rnn_1p(); + else rnn = m_rnn_evaluator->get_rnn_3p(); + + const std::map<std::string, std::map<std::string, double> >* rnn_scalar = rnn->getScalarInputs(); + const std::map<std::string, std::map<std::string, std::vector<double>> >* rnn_vector = rnn->getVectorInputs(); + + m_RNN_scalar_ptRatioEflowApprox = rnn_scalar->at("scalar").at("ptRatioEflowApprox"); + m_RNN_scalar_mEflowApprox = rnn_scalar->at("scalar").at("mEflowApprox"); + // this is obviously a scalar, but is stored in tracks and clusters + if(rnn_vector->at("tracks").at("pt_log").size()>0) m_RNN_scalar_pt_jetseed_log = rnn_vector->at("tracks").at("pt_jetseed_log")[0]; + else if(rnn_vector->at("clusters").at("et_log").size()>0) m_RNN_scalar_pt_jetseed_log = rnn_vector->at("clusters").at("pt_jetseed_log")[0]; + + m_RNN_Nclusters = rnn_vector->at("clusters").at("et_log").size(); + m_RNN_cluster_et_log = rnn_vector->at("clusters").at("et_log"); + m_RNN_cluster_dEta = rnn_vector->at("clusters").at("dEta"); + m_RNN_cluster_dPhi = rnn_vector->at("clusters").at("dPhi"); + m_RNN_cluster_CENTER_LAMBDA = rnn_vector->at("clusters").at("CENTER_LAMBDA"); + m_RNN_cluster_SECOND_LAMBDA = rnn_vector->at("clusters").at("SECOND_LAMBDA"); + m_RNN_cluster_SECOND_R = rnn_vector->at("clusters").at("SECOND_R"); + + m_RNN_Ntracks = rnn_vector->at("tracks").at("pt_log").size(); + m_RNN_track_pt_log = rnn_vector->at("tracks").at("pt_log"); + m_RNN_track_dEta = rnn_vector->at("tracks").at("dEta"); + m_RNN_track_dPhi = rnn_vector->at("tracks").at("dPhi"); + m_RNN_track_d0_abs_log = rnn_vector->at("tracks").at("d0_abs_log"); + m_RNN_track_z0sinThetaTJVA_abs_log = rnn_vector->at("tracks").at("z0sinThetaTJVA_abs_log"); + m_RNN_track_nInnermostPixelHits = rnn_vector->at("tracks").at("nIBLHitsAndExp"); + m_RNN_track_nPixelHits = rnn_vector->at("tracks").at("nPixelHitsPlusDeadSensors"); + m_RNN_track_nSCTHits = rnn_vector->at("tracks").at("nSCTHitsPlusDeadSensors"); + + if( !p_tau->hasDiscriminant(xAOD::TauJetParameters::RNNJetScore) || !p_tau->isAvailable<float>("RNNJetScore") ) + ATH_MSG_WARNING( "RNNJetScore not available. Should not happen when TauJetRNNEvaluator is run!" ); + else m_RNNJetScore = p_tau->discriminant(xAOD::TauJetParameters::RNNJetScore); + if( !p_tau->hasDiscriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans) || !p_tau->isAvailable<float>("RNNJetScoreSigTrans") ) + ATH_MSG_WARNING( "RNNJetScoreSigTrans not available. Make sure TauWPDecorator is run!" ); + else m_RNNJetScoreSigTrans = p_tau->discriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans); + } + */ + // // copy CaloOnly four vector, if present // @@ -897,11 +950,11 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, if( tmpCaloOnlyStatus != HLT::OK){ - msg() << MSG::DEBUG << "Can't get container TrigTauRecCaloOnly to copy four-vector" << endmsg; + ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector" ); } else { - msg() << MSG::DEBUG << "Got container TrigTauRecCaloOnly size :" << tempCaloOnlyContVec.size() << endmsg; + ATH_MSG_DEBUG( "Got container TrigTauRecCaloOnly size :" << tempCaloOnlyContVec.size() ); if ( tempCaloOnlyContVec.size() != 0 ) { @@ -912,7 +965,7 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyContVec.back()->begin(); tauIt != tempCaloOnlyContVec.back()->end(); tauIt++){ - msg() << MSG::DEBUG << "pT(tau) = " << (*tauIt)->pt() << " pT(caloOnly) = " << (*tauIt)->ptTrigCaloOnly() << endmsg; + ATH_MSG_DEBUG( "pT(tau) = " << (*tauIt)->pt() << " pT(caloOnly) = " << (*tauIt)->ptTrigCaloOnly() ); p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, (*tauIt)->ptTrigCaloOnly(), (*tauIt)->etaTrigCaloOnly(), (*tauIt)->phiTrigCaloOnly(), (*tauIt)->mTrigCaloOnly()); @@ -932,10 +985,10 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, - msg() << MSG::DEBUG << "REGTEST: Roi: " << roiDescriptor->roiId() - << " Tau being saved eta: " << m_EtaEF << " Tau phi: " << m_PhiEF - << " wrt L1 dEta "<< m_dEta<<" dPhi "<<m_dPhi - << " Tau Et (GeV): "<< m_EtFinal << endmsg; + ATH_MSG_DEBUG( "REGTEST: Roi: " << roiDescriptor->roiId() + << " Tau being saved eta: " << m_EtaEF << " Tau phi: " << m_PhiEF + << " wrt L1 dEta "<< m_dEta<<" dPhi "<<m_dPhi + << " Tau Et (GeV): "<< m_EtFinal ); ++m_Ncand; } @@ -945,18 +998,18 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end()); pContainer->pop_back(); - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "deleted tau done after jet seed" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Deleted tau done after jet seed" ); } // call eventFinalize on the booked tau tools for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) { processStatus = (*firstTool)->eventFinalize(); if( processStatus != StatusCode :: SUCCESS ) { - msg() << MSG :: INFO << "tool "<<(*firstTool)->name()<< "failed in eventFinalize" << endmsg; + ATH_MSG_INFO( "Tool "<<(*firstTool)->name()<< "failed in eventFinalize" ); return HLT :: TOOL_FAILURE; } } - msg() << MSG :: DEBUG << "tools succeed in eventFinalize" << endmsg; + ATH_MSG_DEBUG( "Tools succeed in eventFinalize" ); //------------------------------------------------------------------------- @@ -966,15 +1019,61 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE, hltStatus=attachFeature(outputTE, pContainer, m_outputName); hltStatus=attachFeature(outputTE, pTrackContainer, m_outputName+"Tracks"); if (hltStatus!=HLT::OK ) { - msg() << MSG::ERROR << "Unable to record tau Container in TDS" << endmsg; + ATH_MSG_ERROR( "Unable to record tau Container in TDS" ); m_calo_errors.push_back(NoHLTtauAttach); return hltStatus; } else { - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Recorded a tau container: " << "HLT_" << "TrigTauRecMerged" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Recorded a tau container: " << "HLT_" << "TrigTauRecMerged" ); } - if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "the tau object has been registered in the tau container" << endmsg; + if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "The tau object has been registered in the tau container" ); + + + // workaround to "fix" broken element links in data + + // skip bad taus which have been discarded + if(pContainer->size()==0) + return HLT::OK; + + static SG::AuxElement::Accessor< xAOD::TauJet::JetLink_t > jetAcc( "jetLink" ); + jetAcc( *p_tau ).toPersistent(); + + static SG::AuxElement::Accessor< xAOD::TauJet::VertexLink_t > vertexAcc( "vertexLink" ); + vertexAcc( *p_tau ).toPersistent(); + + xAOD::TauJet::TauTrackLinks_t new_tauTrackLinks; + static SG::AuxElement::Accessor< xAOD::TauJet::TauTrackLinks_t > tauTrackAcc( "tauTrackLinks" ); + static SG::AuxElement::Accessor< xAOD::TauTrack::TrackParticleLinks_t > trackAcc( "trackLinks" ); + + for( ElementLink< xAOD::TauTrackContainer > tautrack_link : tauTrackAcc( *p_tau ) ) { + + xAOD::TauTrack::TrackParticleLinks_t new_trackLinks; + + for( ElementLink< xAOD::TrackParticleContainer > track_link : trackAcc( *(*tautrack_link) ) ) { + track_link.toPersistent(); + + ElementLink< xAOD::TrackParticleContainer > newTrackLink; + newTrackLink.toPersistent(); + newTrackLink.resetWithKeyAndIndex( track_link.persKey(), track_link.persIndex() ); + new_trackLinks.push_back(newTrackLink); + } + + pTrackContainer->at(tautrack_link.index())->clearTrackLinks(); + pTrackContainer->at(tautrack_link.index())->setTrackLinks(new_trackLinks); + + tautrack_link.toPersistent(); + + ElementLink< xAOD::TauTrackContainer > newTauTrackLink; + newTauTrackLink.toPersistent(); + newTauTrackLink.resetWithKeyAndIndex( tautrack_link.persKey(), tautrack_link.persIndex() ); + new_tauTrackLinks.push_back(newTauTrackLink); + } + + p_tau->clearTauTrackLinks(); + p_tau->setAllTauTrackLinks(new_tauTrackLinks); + + // no action needs to be taken for tau -> clusters links // set status of TE to always true for FE algorithms return HLT::OK; diff --git a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx index 8a1cdf2d38a1..03ff7d3cf5cb 100644 --- a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx +++ b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /******************************************************************** @@ -10,13 +10,10 @@ * AUTHOR: E.Carquin * MODIFIED: Nov 23 2018 * - * Run a subset of the offline tauRec/tau1p3p routines in the EF + * Run a subset of the offline tauRec routines at the HLT *********************************************************************/ -//#include "GaudiKernel/IToolSvc.h" -//#include "GaudiKernel/ListItem.h" -//#include "GaudiKernel/StatusCode.h" -//#include "GaudiKernel/Property.h" +#include "GaudiKernel/SystemOfUnits.h" #include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h" #include "TrigSteeringEvent/TrigRoiDescriptor.h" @@ -53,10 +50,10 @@ using namespace std; // Invokes base class constructor. TrigTauRecMergedMT::TrigTauRecMergedMT(const std::string& name,ISvcLocator* pSvcLocator) :AthAlgorithm(name, pSvcLocator), - m_tools(this), - m_endtools(this), - m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), - m_beamSpotSvc("BeamCondSvc", name) + m_tools(this), + m_endtools(this), + m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), + m_beamSpotSvc("BeamCondSvc", name) { declareProperty("Tools", m_tools, "List of ITauToolBase tools" ); declareProperty("EndTools", m_endtools, "List of End ITauToolBase tools" ); @@ -69,574 +66,569 @@ TrigTauRecMergedMT::~TrigTauRecMergedMT() StatusCode TrigTauRecMergedMT::initialize() { - ATH_MSG_DEBUG("TrigTauRecMergedMT::initialize()"); - - m_tauEventData.setInTrigger(true); - if ( m_tools.begin() == m_tools.end() ) { - ATH_MSG_DEBUG(" no tools given for this algorithm."); + ATH_MSG_DEBUG("TrigTauRecMergedMT::initialize()"); + + m_tauEventData.setInTrigger(true); + if ( m_tools.begin() == m_tools.end() ) { + ATH_MSG_DEBUG(" no tools given for this algorithm."); + return StatusCode::FAILURE; + } + + ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin(); + ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end(); + ATH_MSG_DEBUG("List of tools in execution sequence:"); + + for(; p_itT != p_itTE; ++p_itT ) { + StatusCode p_sc = p_itT->retrieve(); + if( p_sc.isFailure() ) { + ATH_MSG_DEBUG("Cannot find tool named <" << *p_itT << ">"); return StatusCode::FAILURE; - } - - ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin(); - ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end(); - ATH_MSG_DEBUG("List of tools in execution sequence:"); - - for(; p_itT != p_itTE; ++p_itT ) { - StatusCode p_sc = p_itT->retrieve(); - if( p_sc.isFailure() ) { - ATH_MSG_DEBUG("Cannot find tool named <" << *p_itT << ">"); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG("Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name()); - //if( doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ; - (*p_itT)->setTauEventData(&m_tauEventData); - } - } - - ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin(); - ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end(); - - for(; p_itTe != p_itTEe; ++p_itTe ) { - StatusCode p_sc = p_itTe->retrieve(); - if( p_sc.isFailure() ) { - ATH_MSG_DEBUG("Cannot find tool named <" << *p_itTe << ">"); - return StatusCode::FAILURE; - } - else { - ATH_MSG_DEBUG(" Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name()); - //if( doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ; - ( *p_itTe )->setTauEventData(&m_tauEventData); - } - } - - if (m_lumiBlockMuTool.retrieve().isFailure()) { - ATH_MSG_WARNING("Unable to retrieve LumiBlockMuTool"); - } else { - ATH_MSG_DEBUG("Successfully retrieved LumiBlockMuTool"); - } - - // Retrieve beam conditions - if(m_beamSpotSvc.retrieve().isFailure()) { - ATH_MSG_WARNING("Unable to retrieve Beamspot service"); - } else { - ATH_MSG_WARNING("Successfully retrieved Beamspot service"); - } - - if ( not m_monTool.name().empty() ) { - ATH_CHECK( m_monTool.retrieve() ); - } - - ATH_MSG_DEBUG( "Initialising HandleKeys" ); - CHECK( m_roIInputKey.initialize() ); - CHECK( m_L1RoIKey.initialize() ); - CHECK( m_clustersKey.initialize() ); - CHECK( m_tracksKey.initialize() ); - CHECK( m_vertexKey.initialize() ); - CHECK( m_trigTauJetKey.initialize() ); - CHECK( m_trigtauSeedOutKey.initialize() ); - CHECK( m_trigtauRecOutKey.initialize() ); - CHECK( m_trigtauTrkOutKey.initialize() ); - - return StatusCode::SUCCESS; + } + else { + ATH_MSG_DEBUG("Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name()); + //if( doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ; + (*p_itT)->setTauEventData(&m_tauEventData); + } + } + + ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin(); + ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end(); + + for(; p_itTe != p_itTEe; ++p_itTe ) { + StatusCode p_sc = p_itTe->retrieve(); + if( p_sc.isFailure() ) { + ATH_MSG_DEBUG("Cannot find tool named <" << *p_itTe << ">"); + return StatusCode::FAILURE; + } + else { + ATH_MSG_DEBUG(" Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name()); + //if( doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ; + ( *p_itTe )->setTauEventData(&m_tauEventData); + } + } + + if (m_lumiBlockMuTool.retrieve().isFailure()) { + ATH_MSG_WARNING("Unable to retrieve LumiBlockMuTool"); + } + else { + ATH_MSG_DEBUG("Successfully retrieved LumiBlockMuTool"); + } + + // Retrieve beam conditions + if(m_beamSpotSvc.retrieve().isFailure()) { + ATH_MSG_WARNING("Unable to retrieve Beamspot service"); + } + else { + ATH_MSG_WARNING("Successfully retrieved Beamspot service"); + } + + if ( not m_monTool.name().empty() ) { + ATH_CHECK( m_monTool.retrieve() ); + } + + ATH_MSG_DEBUG( "Initialising HandleKeys" ); + CHECK( m_roIInputKey.initialize() ); + CHECK( m_L1RoIKey.initialize() ); + CHECK( m_clustersKey.initialize() ); + CHECK( m_tracksKey.initialize() ); + CHECK( m_vertexKey.initialize() ); + CHECK( m_trigTauJetKey.initialize() ); + CHECK( m_trigtauSeedOutKey.initialize() ); + CHECK( m_trigtauRecOutKey.initialize() ); + CHECK( m_trigtauTrkOutKey.initialize() ); + + return StatusCode::SUCCESS; } StatusCode TrigTauRecMergedMT::finalize() { - return StatusCode::SUCCESS; + return StatusCode::SUCCESS; } StatusCode TrigTauRecMergedMT::execute() { - ATH_MSG_DEBUG("Execution"); - - auto ctx = getContext(); - - // variables to initialize and keep values for monitoring variables - std::vector<unsigned char> calo_errors(0); - std::vector<unsigned char> track_errors(0); - std::vector<unsigned char> author(0); - std::vector<float> deltaZ0coreTrks(0); - std::vector<float> deltaZ0wideTrks(0); - - auto nCells = Monitored::Scalar<int>("nRoI_EFTauCells", 0); - auto nTracks = Monitored::Scalar<int>("nRoI_EFTauTracks", -10); - auto dEta = Monitored::Scalar<float>("dEtaEFTau_RoI", -10.); - auto dPhi = Monitored::Scalar<float>("dPhiEFTau_RoI", -10.); - auto emRadius = Monitored::Scalar<float>("EF_EMRadius", -0.099); - auto hadRadius = Monitored::Scalar<float>("EF_EMRadius", -0.099); - auto EtFinal = Monitored::Scalar<float>("EF_EtFinal", 0.); - auto Et = Monitored::Scalar<float>("EF_Et", 0.); - auto EtHad = Monitored::Scalar<float>("EF_EtHad",-10.); - auto EtEm = Monitored::Scalar<float>("EF_EtEm",-10.); - auto EMFrac = Monitored::Scalar<float>("EF_EMFrac",-10.); - auto IsoFrac = Monitored::Scalar<float>("EF_IsoFrac",-1.); - auto centFrac = Monitored::Scalar<float>("EF_centFrac",-10.); - auto nWideTrk = Monitored::Scalar<int>("EF_nWideTrk",0); - auto ipSigLeadTrk = Monitored::Scalar<float>("EF_ipSigLeadTrk",-1000.); - auto trFlightPathSig = Monitored::Scalar<float>("EF_trFlightPathSig",-10.); - auto massTrkSys = Monitored::Scalar<float>("EF_massTrkSys",-10.); - auto dRmax = Monitored::Scalar<float>("EF_dRmax",-10.); - auto numTrack = Monitored::Scalar<int>("EF_NTrk", -10); - auto trkAvgDist = Monitored::Scalar<float>("EF_TrkAvgDist",-1.0); - auto etovPtLead = Monitored::Scalar<float>("EF_EtovPtLead",-10.); - auto PSSFraction = Monitored::Scalar<float>("EF_PSSFraction",-999.9); - auto EMPOverTrkSysP = Monitored::Scalar<float>("EF_EMPOverTrkSysP",-999.9); - auto ChPiEMEOverCaloEME = Monitored::Scalar<float>("EF_ChPiEMEOverCaloEME",-999.9); - auto SumPtTrkFrac = Monitored::Scalar<float>("EF_SumPtTrkFrac",-999.9); - auto innerTrkAvgDist = Monitored::Scalar<float>("EF_innerTrkAvgDist",-1.0); - auto Ncand = Monitored::Scalar<int>("EF_nCand",0); - auto ActualInteractions = Monitored::Scalar<float>("EF_ActualInteractions",-999.9); - auto AvgInteractions = Monitored::Scalar<float>("EF_AvgInteractions",-999.9); - auto beamspot_x = Monitored::Scalar<float>("EF_beamspot_x",-999.9); - auto beamspot_y = Monitored::Scalar<float>("EF_beamspot_y",-999.9); - auto beamspot_z = Monitored::Scalar<float>("EF_beamspot_z",-999.9); - auto EtaL1 = Monitored::Scalar<float>("EtaL1",-99.9); - auto PhiL1 = Monitored::Scalar<float>("PhiL1",-99.9); - auto EtaEF = Monitored::Scalar<float>("EtaEF",-99.9); - auto PhiEF = Monitored::Scalar<float>("PhiEF",-99.9); - - auto EF_calo_errors = Monitored::Collection("calo_errors",calo_errors); - auto EF_track_errors = Monitored::Collection("track_errors",track_errors); - auto EF_author = Monitored::Collection("author",author); - auto EF_deltaZ0coreTrks = Monitored::Collection("deltaZ0coreTrks",deltaZ0coreTrks); - auto EF_deltaZ0wideTrks = Monitored::Collection("deltaZ0wideTrks",deltaZ0wideTrks); - - auto monitorIt = Monitored::Group( m_monTool, nCells, nTracks, dEta, dPhi, emRadius, hadRadius, - EtFinal, Et, EtHad, EtEm, EMFrac, IsoFrac, centFrac, nWideTrk, ipSigLeadTrk, trFlightPathSig, massTrkSys, - dRmax, numTrack, trkAvgDist, etovPtLead, PSSFraction, EMPOverTrkSysP, ChPiEMEOverCaloEME, SumPtTrkFrac, - innerTrkAvgDist, Ncand, ActualInteractions, AvgInteractions, beamspot_x, beamspot_y, beamspot_z, EtaL1, - PhiL1, EtaEF, PhiEF ); - - // Retrieve store. - ATH_MSG_DEBUG("Executing TrigTauRecMergedMT"); - - // Get RoiDescriptor - SG::ReadHandle< TrigRoiDescriptorCollection > roisHandle = SG::makeHandle( m_roIInputKey, ctx ); - if(roisHandle->size()==0){ - ATH_MSG_DEBUG("RoIHandle size = Zero"); - return StatusCode::SUCCESS; - } - const TrigRoiDescriptor *roiDescriptor = roisHandle->at(0); - - if ( roiDescriptor!= NULL ) { - ATH_MSG_DEBUG("REGTEST: RoI " << *roiDescriptor); - } - else { - ATH_MSG_DEBUG("Failed to find RoiDescriptor "); - calo_errors.push_back(NoROIDescr); - return StatusCode::SUCCESS; - } - - // Retrieve Calocluster container - SG::ReadHandle< xAOD::CaloClusterContainer > CCContainerHandle = SG::makeHandle( m_clustersKey,ctx ); - CHECK( CCContainerHandle.isValid() ); - - const xAOD::CaloClusterContainer *RoICaloClusterContainer = CCContainerHandle.get(); - ATH_MSG_DEBUG( "Found " << RoICaloClusterContainer->size() << " caloClusters, updating the corresponding RoI ... " ); - - if(RoICaloClusterContainer != NULL) { - ATH_MSG_DEBUG( "REGTEST: Size of vector CaloCluster container is " << RoICaloClusterContainer->size()); - if(RoICaloClusterContainer->size()==0) { - ATH_MSG_DEBUG( "Cannot proceed, size of vector CaloCluster container is " << RoICaloClusterContainer->size()); - return StatusCode::SUCCESS; - } - }else { - ATH_MSG_DEBUG( "no CaloCluster container found " ); - return StatusCode::SUCCESS; - } - - // get TrackContainer - SG::ReadHandle< xAOD::TrackParticleContainer > TPContainerHandle = SG::makeHandle( m_tracksKey,ctx ); - - const xAOD::TrackParticleContainer *RoITrackParticleContainer = NULL; - - if ( !TPContainerHandle.isValid() ) { - ATH_MSG_INFO("REGTEST: No Track container found."); - track_errors.push_back(NoTrkCont); - } - else { - RoITrackParticleContainer=TPContainerHandle.get(); - ATH_MSG_DEBUG("REGTEST: Size of vector Track container is " << RoITrackParticleContainer->size()); - if(RoITrackParticleContainer != NULL) nTracks = RoITrackParticleContainer->size(); - } - - // get Vertex Container - SG::ReadHandle< xAOD::VertexContainer > VertexContainerHandle = SG::makeHandle( m_vertexKey,ctx ); - - const xAOD::VertexContainer* RoIVxContainer = NULL; - - if( !VertexContainerHandle.isValid() ) { - ATH_MSG_INFO(" No VxContainers retrieved for the trigger element"); - track_errors.push_back(NoVtxCont); - } - else { - RoIVxContainer = VertexContainerHandle.get(); - ATH_MSG_DEBUG("REGTEST: Size of vector Vertex container " << RoIVxContainer->size()); - } - - double mu = 0.0; - double avg_mu = 0.0; - if(m_lumiBlockMuTool){ - mu = m_lumiBlockMuTool->actualInteractionsPerCrossing(); // (retrieve mu for the current BCID) - avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing(); - ActualInteractions = mu; - AvgInteractions = avg_mu; - ATH_MSG_DEBUG("REGTEST: Retrieved Mu Value : " << mu); - ATH_MSG_DEBUG("REGTEST: Average Mu Value : " << avg_mu); - } + ATH_MSG_DEBUG("Execution"); + + auto ctx = getContext(); + + // variables to initialize and keep values for monitoring variables + std::vector<unsigned char> calo_errors(0); + std::vector<unsigned char> track_errors(0); + + auto nCells = Monitored::Scalar<int>("nRoI_EFTauCells", 0); + auto nTracks = Monitored::Scalar<int>("nRoI_EFTauTracks", -10); + auto dEta = Monitored::Scalar<float>("dEtaEFTau_RoI", -10.); + auto dPhi = Monitored::Scalar<float>("dPhiEFTau_RoI", -10.); + auto emRadius = Monitored::Scalar<float>("EF_EMRadius", -0.099); + auto hadRadius = Monitored::Scalar<float>("EF_EMRadius", -0.099); + auto EtFinal = Monitored::Scalar<float>("EF_EtFinal", 0.); + auto Et = Monitored::Scalar<float>("EF_Et", 0.); + auto EtHad = Monitored::Scalar<float>("EF_EtHad",-10.); + auto EtEm = Monitored::Scalar<float>("EF_EtEm",-10.); + auto EMFrac = Monitored::Scalar<float>("EF_EMFrac",-10.); + auto IsoFrac = Monitored::Scalar<float>("EF_IsoFrac",-1.); + auto centFrac = Monitored::Scalar<float>("EF_centFrac",-10.); + auto nWideTrk = Monitored::Scalar<int>("EF_nWideTrk",0); + auto ipSigLeadTrk = Monitored::Scalar<float>("EF_ipSigLeadTrk",-1000.); + auto trFlightPathSig = Monitored::Scalar<float>("EF_trFlightPathSig",-10.); + auto massTrkSys = Monitored::Scalar<float>("EF_massTrkSys",-10.); + auto dRmax = Monitored::Scalar<float>("EF_dRmax",-10.); + auto numTrack = Monitored::Scalar<int>("EF_NTrk", -10); + auto trkAvgDist = Monitored::Scalar<float>("EF_TrkAvgDist",-1.0); + auto etovPtLead = Monitored::Scalar<float>("EF_EtovPtLead",-10.); + auto PSSFraction = Monitored::Scalar<float>("EF_PSSFraction",-999.9); + auto EMPOverTrkSysP = Monitored::Scalar<float>("EF_EMPOverTrkSysP",-999.9); + auto ChPiEMEOverCaloEME = Monitored::Scalar<float>("EF_ChPiEMEOverCaloEME",-999.9); + auto SumPtTrkFrac = Monitored::Scalar<float>("EF_SumPtTrkFrac",-999.9); + auto innerTrkAvgDist = Monitored::Scalar<float>("EF_innerTrkAvgDist",-1.0); + auto Ncand = Monitored::Scalar<int>("EF_nCand",0); + auto ActualInteractions = Monitored::Scalar<float>("EF_ActualInteractions",-999.9); + auto AvgInteractions = Monitored::Scalar<float>("EF_AvgInteractions",-999.9); + auto beamspot_x = Monitored::Scalar<float>("EF_beamspot_x",-999.9); + auto beamspot_y = Monitored::Scalar<float>("EF_beamspot_y",-999.9); + auto beamspot_z = Monitored::Scalar<float>("EF_beamspot_z",-999.9); + auto EtaL1 = Monitored::Scalar<float>("EtaL1",-99.9); + auto PhiL1 = Monitored::Scalar<float>("PhiL1",-99.9); + auto EtaEF = Monitored::Scalar<float>("EtaEF",-99.9); + auto PhiEF = Monitored::Scalar<float>("PhiEF",-99.9); + + auto EF_calo_errors = Monitored::Collection("calo_errors",calo_errors); + auto EF_track_errors = Monitored::Collection("track_errors",track_errors); + + auto monitorIt = Monitored::Group( m_monTool, nCells, nTracks, dEta, dPhi, emRadius, hadRadius, + EtFinal, Et, EtHad, EtEm, EMFrac, IsoFrac, centFrac, nWideTrk, ipSigLeadTrk, trFlightPathSig, massTrkSys, + dRmax, numTrack, trkAvgDist, etovPtLead, PSSFraction, EMPOverTrkSysP, ChPiEMEOverCaloEME, SumPtTrkFrac, + innerTrkAvgDist, Ncand, ActualInteractions, AvgInteractions, beamspot_x, beamspot_y, beamspot_z, EtaL1, + PhiL1, EtaEF, PhiEF ); + + // Retrieve store. + ATH_MSG_DEBUG("Executing TrigTauRecMergedMT"); + + // Get RoiDescriptor + SG::ReadHandle< TrigRoiDescriptorCollection > roisHandle = SG::makeHandle( m_roIInputKey, ctx ); + if(roisHandle->size() == 0){ + ATH_MSG_DEBUG("RoIHandle size = Zero"); + return StatusCode::SUCCESS; + } + const TrigRoiDescriptor *roiDescriptor = roisHandle->at(0); + + if ( roiDescriptor != nullptr ) { + ATH_MSG_DEBUG("REGTEST: RoI " << *roiDescriptor); + } + else { + ATH_MSG_DEBUG("Failed to find RoiDescriptor "); + calo_errors.push_back(NoROIDescr); + return StatusCode::SUCCESS; + } + + // Retrieve Calocluster container + SG::ReadHandle< xAOD::CaloClusterContainer > CCContainerHandle = SG::makeHandle( m_clustersKey,ctx ); + CHECK( CCContainerHandle.isValid() ); + + const xAOD::CaloClusterContainer *RoICaloClusterContainer = CCContainerHandle.get(); + ATH_MSG_DEBUG( "Found " << RoICaloClusterContainer->size() << " caloClusters, updating the corresponding RoI ... " ); + + if(RoICaloClusterContainer != nullptr) { + ATH_MSG_DEBUG( "REGTEST: Size of vector CaloCluster container is " << RoICaloClusterContainer->size()); + if(RoICaloClusterContainer->size() == 0) { + ATH_MSG_DEBUG( "Cannot proceed, size of vector CaloCluster container is " << RoICaloClusterContainer->size()); + return StatusCode::SUCCESS; + } + } + else { + ATH_MSG_DEBUG( "no CaloCluster container found " ); + return StatusCode::SUCCESS; + } + + // get TrackContainer + SG::ReadHandle< xAOD::TrackParticleContainer > TPContainerHandle = SG::makeHandle( m_tracksKey,ctx ); + + const xAOD::TrackParticleContainer *RoITrackParticleContainer = nullptr; + + if ( !TPContainerHandle.isValid() ) { + ATH_MSG_INFO("REGTEST: No Track container found."); + track_errors.push_back(NoTrkCont); + } + else { + RoITrackParticleContainer = TPContainerHandle.get(); + ATH_MSG_DEBUG("REGTEST: Size of vector Track container is " << RoITrackParticleContainer->size()); + if(RoITrackParticleContainer != nullptr) nTracks = RoITrackParticleContainer->size(); + } + + // get Vertex Container + SG::ReadHandle< xAOD::VertexContainer > VertexContainerHandle = SG::makeHandle( m_vertexKey,ctx ); + + const xAOD::VertexContainer* RoIVxContainer = nullptr; + + if( !VertexContainerHandle.isValid() ) { + ATH_MSG_INFO(" No VxContainers retrieved for the trigger element"); + track_errors.push_back(NoVtxCont); + } + else { + RoIVxContainer = VertexContainerHandle.get(); + ATH_MSG_DEBUG("REGTEST: Size of vector Vertex container " << RoIVxContainer->size()); + } + + double mu = 0.0; + double avg_mu = 0.0; + if(m_lumiBlockMuTool){ + mu = m_lumiBlockMuTool->actualInteractionsPerCrossing(); // (retrieve mu for the current BCID) + avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing(); + ActualInteractions = mu; + AvgInteractions = avg_mu; + ATH_MSG_DEBUG("REGTEST: Retrieved Mu Value : " << mu); + ATH_MSG_DEBUG("REGTEST: Average Mu Value : " << avg_mu); + } - //------------------------------------------------------------------------- - // Get beamspot - //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + // Get beamspot + //------------------------------------------------------------------------- - // Copy the first vertex from a const object - xAOD::Vertex theBeamspot; - theBeamspot.makePrivateStore(); - const xAOD::Vertex* ptrBeamspot = 0; + // Copy the first vertex from a const object + xAOD::Vertex theBeamspot; + theBeamspot.makePrivateStore(); + const xAOD::Vertex* ptrBeamspot = nullptr; - if(m_beamSpotSvc){ + if(m_beamSpotSvc){ - // Alter the position of the vertex - theBeamspot.setPosition(m_beamSpotSvc->beamPos()); + // Alter the position of the vertex + theBeamspot.setPosition(m_beamSpotSvc->beamPos()); - beamspot_x=theBeamspot.x(); - beamspot_y=theBeamspot.y(); - beamspot_z=theBeamspot.z(); - - // Create a AmgSymMatrix to alter the vertex covariance mat. - AmgSymMatrix(3) cov = m_beamSpotSvc->beamVtx().covariancePosition(); - theBeamspot.setCovariancePosition(cov); + beamspot_x=theBeamspot.x(); + beamspot_y=theBeamspot.y(); + beamspot_z=theBeamspot.z(); - ptrBeamspot = &theBeamspot; + // Create a AmgSymMatrix to alter the vertex covariance mat. + AmgSymMatrix(3) cov = m_beamSpotSvc->beamVtx().covariancePosition(); + theBeamspot.setCovariancePosition(cov); - } + ptrBeamspot = &theBeamspot; + } - //------------------------------------------------------------------------- - // Creating jet container used as "tau seed" for tau reconstruction - //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + // Creating jet container used as "tau seed" for tau reconstruction + //------------------------------------------------------------------------- - // Ensure that we are using a TrigAuxContainer - xAOD::JetContainer* theJetCollection = new xAOD::JetContainer(); - xAOD::JetTrigAuxContainer theJetContainer; - theJetCollection->setStore(&theJetContainer); + // Ensure that we are using a TrigAuxContainer + xAOD::JetContainer* theJetCollection = new xAOD::JetContainer(); + xAOD::JetTrigAuxContainer theJetContainer; + theJetCollection->setStore(&theJetContainer); - xAOD::Jet* aJet = new xAOD::Jet(); + xAOD::Jet* aJet = new xAOD::Jet(); - theJetCollection->push_back(aJet); + theJetCollection->push_back(aJet); - // Build the jet, also keep track of the kinematics by hand - // We are using calibrated clusters, we need to keep track of this - aJet->setConstituentsSignalState(xAOD::JetConstitScale::CalibratedJetConstituent); + // Build the jet, also keep track of the kinematics by hand + // We are using calibrated clusters, we need to keep track of this + aJet->setConstituentsSignalState(xAOD::JetConstitScale::CalibratedJetConstituent); - // Make a minimal effort to speed things up ;) - // Eventually, want to use FastJet here? - TLorentzVector myCluster; - TLorentzVector TauBarycenter(0., 0., 0., 0.); + // Make a minimal effort to speed things up ;) + // Eventually, want to use FastJet here? + TLorentzVector myCluster; + TLorentzVector TauBarycenter(0., 0., 0., 0.); - xAOD::CaloClusterContainer::const_iterator clusterIt; - for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) { - ATH_MSG_DEBUG(" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )"); + xAOD::CaloClusterContainer::const_iterator clusterIt; + for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) { + ATH_MSG_DEBUG(" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )"); - if((*clusterIt)->e() < 0) - { - ATH_MSG_DEBUG(" Negative energy cluster is rejected"); - continue; - } + if((*clusterIt)->e() < 0) + { + ATH_MSG_DEBUG(" Negative energy cluster is rejected"); + continue; + } - myCluster.SetPtEtaPhiE((*clusterIt)->pt(), (*clusterIt)->eta(), (*clusterIt)->phi(), (*clusterIt)->e()); - aJet->addConstituent(*clusterIt); + myCluster.SetPtEtaPhiE((*clusterIt)->pt(), (*clusterIt)->eta(), (*clusterIt)->phi(), (*clusterIt)->e()); + aJet->addConstituent(*clusterIt); - TauBarycenter += myCluster; - } + TauBarycenter += myCluster; + } - aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); - - ATH_MSG_DEBUG("jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() ); - - // Prepare Outputs - std::unique_ptr< xAOD::JetContainer > tauSeedContainer( new xAOD::JetContainer() ); - - // Save Outputs - SG::WriteHandle< xAOD::JetContainer > outTauSeedHandle = SG::makeHandle( m_trigtauSeedOutKey,ctx ); - CHECK( outTauSeedHandle.record( std::move( tauSeedContainer ) ) ); - - StatusCode processStatus = StatusCode::SUCCESS; - - // Save Outputs - SG::WriteHandle<xAOD::TauJetContainer> outTauJetHandle( m_trigtauRecOutKey ); - SG::WriteHandle<xAOD::TauTrackContainer> outTauTrackHandle( m_trigtauTrkOutKey ); - - //------------------------------------------------------------------------- - // setup TauCandidate data - //------------------------------------------------------------------------- - m_tauEventData.clear(); - xAOD::TauJetContainer *pContainer = new xAOD::TauJetContainer(); - xAOD::TauJetAuxContainer *pAuxContainer = new xAOD::TauJetAuxContainer(); - - xAOD::TauTrackContainer *pTrackContainer = new xAOD::TauTrackContainer(); - xAOD::TauTrackAuxContainer *pTrackAuxContainer = new xAOD::TauTrackAuxContainer(); - - pContainer->setStore(pAuxContainer); - pTrackContainer->setStore(pTrackAuxContainer); - - m_tauEventData.setObject("TauTrackContainer", pTrackContainer); - m_tauEventData.xAODTauContainer = pContainer; - m_tauEventData.tauAuxContainer = pAuxContainer; - - // Set the Objects that we can attach right now - m_tauEventData.setObject("TrackContainer", RoITrackParticleContainer); - m_tauEventData.setObject("VxPrimaryCandidate", RoIVxContainer); - if(m_lumiBlockMuTool) m_tauEventData.setObject("AvgInteractions", avg_mu); - if(m_beamSpotSvc) m_tauEventData.setObject("Beamspot", ptrBeamspot); - if(m_beamType == ("cosmics")) m_tauEventData.setObject("IsCosmics?", true ); - - - //------------------------------------------------------------------------- - // eventInitialize tauRec colls - //------------------------------------------------------------------------- - ToolHandleArray<ITauToolBase> ::iterator firstTool = m_tools.begin(); - ToolHandleArray<ITauToolBase> ::iterator lastTool = m_tools.end(); - for ( ; firstTool != lastTool; firstTool++ ) { - processStatus = (*firstTool)->eventInitialize(); - - if( processStatus != StatusCode :: SUCCESS ) { - ATH_MSG_ERROR("tool "<<(*firstTool)->name()<< "failed in eventInitialize"); - return StatusCode::FAILURE; - } - } - ATH_MSG_DEBUG(" initialize all good "); - - //------------------------------------------------------------------------- - // using Jet collection - // setup tau candidate structure - //------------------------------------------------------------------------- - xAOD::Jet* p_seed = (*theJetCollection->begin()); //there is only one jet stored - - xAOD::TauJet* p_tau = new xAOD::TauJet(); - pContainer->push_back(p_tau); - p_tau->setROIWord(roiDescriptor->roiWord()); - p_tau->setJet(theJetCollection, p_seed); - m_tauEventData.seedContainer = theJetCollection; - - // This sets one track and link. Need to have at least 1 track linked to retrieve track container - setEmptyTauTrack(p_tau, pTrackContainer); - - if(p_seed->e()<=0) { - msg() << MSG::DEBUG << " Roi: changing eta due to energy " << p_seed->e() << endmsg; - p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); + aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); + + ATH_MSG_DEBUG("jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() ); + + // Prepare Outputs + std::unique_ptr< xAOD::JetContainer > tauSeedContainer( new xAOD::JetContainer() ); + + // Save Outputs + SG::WriteHandle< xAOD::JetContainer > outTauSeedHandle = SG::makeHandle( m_trigtauSeedOutKey,ctx ); + CHECK( outTauSeedHandle.record( std::move( tauSeedContainer ) ) ); + + StatusCode processStatus = StatusCode::SUCCESS; + + // Save Outputs + SG::WriteHandle<xAOD::TauJetContainer> outTauJetHandle( m_trigtauRecOutKey ); + SG::WriteHandle<xAOD::TauTrackContainer> outTauTrackHandle( m_trigtauTrkOutKey ); + + //------------------------------------------------------------------------- + // setup TauCandidate data + //------------------------------------------------------------------------- + m_tauEventData.clear(); + xAOD::TauJetContainer *pContainer = new xAOD::TauJetContainer(); + xAOD::TauJetAuxContainer *pAuxContainer = new xAOD::TauJetAuxContainer(); + + xAOD::TauTrackContainer *pTrackContainer = new xAOD::TauTrackContainer(); + xAOD::TauTrackAuxContainer *pTrackAuxContainer = new xAOD::TauTrackAuxContainer(); + + pContainer->setStore(pAuxContainer); + pTrackContainer->setStore(pTrackAuxContainer); + + m_tauEventData.setObject("TauTrackContainer", pTrackContainer); + m_tauEventData.xAODTauContainer = pContainer; + m_tauEventData.tauAuxContainer = pAuxContainer; + + // Set the Objects that we can attach right now + m_tauEventData.setObject("TrackContainer", RoITrackParticleContainer); + m_tauEventData.setObject("VxPrimaryCandidate", RoIVxContainer); + if(m_lumiBlockMuTool) m_tauEventData.setObject("AvgInteractions", avg_mu); + if(m_beamSpotSvc) m_tauEventData.setObject("Beamspot", ptrBeamspot); + if(m_beamType == ("cosmics")) m_tauEventData.setObject("IsCosmics?", true ); + + + //------------------------------------------------------------------------- + // eventInitialize tauRec colls + //------------------------------------------------------------------------- + ToolHandleArray<ITauToolBase> ::iterator firstTool = m_tools.begin(); + ToolHandleArray<ITauToolBase> ::iterator lastTool = m_tools.end(); + for ( ; firstTool != lastTool; firstTool++ ) { + processStatus = (*firstTool)->eventInitialize(); + + if( processStatus != StatusCode :: SUCCESS ) { + ATH_MSG_ERROR("tool "<<(*firstTool)->name()<< "failed in eventInitialize"); + return StatusCode::FAILURE; + } + } + ATH_MSG_DEBUG(" initialize all good "); + + //------------------------------------------------------------------------- + // using Jet collection + // setup tau candidate structure + //------------------------------------------------------------------------- + xAOD::Jet* p_seed = (*theJetCollection->begin()); //there is only one jet stored + + xAOD::TauJet* p_tau = new xAOD::TauJet(); + pContainer->push_back(p_tau); + p_tau->setROIWord(roiDescriptor->roiWord()); + p_tau->setJet(theJetCollection, p_seed); + m_tauEventData.seedContainer = theJetCollection; + + // This sets one track and link. Need to have at least 1 track linked to retrieve track container + // Can't we instead implement in the EDM a function to retrieve the track container of a tau? + setEmptyTauTrack(p_tau, pTrackContainer); + + if(p_seed->e()<=0) { + ATH_MSG_DEBUG( "Roi: changing eta due to energy " << p_seed->e() ); + p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); - msg() << MSG::DEBUG << "Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() - << endmsg; - } - - ATH_MSG_DEBUG(" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() ); - - m_tauEventData.setObject("JetCollection", theJetCollection ); - - //------------------------------------------------------------------------- - // loop over booked tau tools - //------------------------------------------------------------------------- - int toolnum = 0; - firstTool = m_tools.begin(); - lastTool = m_tools.end(); - processStatus = StatusCode::SUCCESS; - ATH_MSG_DEBUG("Starting tool loop with seed jet"); - //std::vector<TrigTimer* >::iterator itimer = m_mytimers.begin(); - while ( ! processStatus.isFailure() && firstTool != lastTool ) { - // loop stops only when Failure indicated by one of the tools - ATH_MSG_DEBUG("Starting Tool: " << (*firstTool)->name() ); - // time in the various tools - ++toolnum; - //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->start(); - - processStatus = (*firstTool)->execute( *p_tau ); - if ( !processStatus.isFailure() ) { - ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " executed successfully "); - ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() - << " Tau pT : "<< p_tau->pt()); - } - else { - ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " execution failed "); - } - ++firstTool; - //++itimer; - //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->stop(); - } - - //check status - if ( !processStatus.isSuccess() ) { // some problem - ATH_MSG_DEBUG("the tau object has NOT been registered in the tau container"); - // ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin(); - // for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData ); - // (*tool)->cleanup( &m_tauEventData ); - - xAOD::TauJet* bad_tau = pContainer->back(); - ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: "); - pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end()); - - pContainer->pop_back(); - - ATH_MSG_DEBUG("clean up done after jet seed"); - } - else if( processStatus.isSuccess()) { - - float fJetEnergy = (*p_tau->jetLink())->e(); - ATH_MSG_DEBUG(" Roi: jet e "<< fJetEnergy); + ATH_MSG_DEBUG( "Roi: " << roiDescriptor->roiId() << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() ); + } + + ATH_MSG_DEBUG(" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() ); + + m_tauEventData.setObject("JetCollection", theJetCollection ); + + //------------------------------------------------------------------------- + // loop over booked tau tools + //------------------------------------------------------------------------- + int toolnum = 0; + firstTool = m_tools.begin(); + lastTool = m_tools.end(); + processStatus = StatusCode::SUCCESS; + ATH_MSG_DEBUG("Starting tool loop with seed jet"); + //std::vector<TrigTimer* >::iterator itimer = m_mytimers.begin(); + while ( ! processStatus.isFailure() && firstTool != lastTool ) { + // loop stops only when Failure indicated by one of the tools + ATH_MSG_DEBUG("Starting Tool: " << (*firstTool)->name() ); + // time in the various tools + ++toolnum; + //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->start(); + + processStatus = (*firstTool)->execute( *p_tau ); + if ( !processStatus.isFailure() ) { + ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " executed successfully "); + ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId() + << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() + << " Tau pT : "<< p_tau->pt()); + } + else { + ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " execution failed "); + } + ++firstTool; + //++itimer; + //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->stop(); + } + + //check status + if ( !processStatus.isSuccess() ) { // some problem + ATH_MSG_DEBUG("The tau object has NOT been registered in the tau container"); + // ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin(); + // for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData ); + // (*tool)->cleanup( &m_tauEventData ); + + xAOD::TauJet* bad_tau = pContainer->back(); + ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << " tracks associated with tau"); + pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end()); + + pContainer->pop_back(); + + ATH_MSG_DEBUG("Clean up done after jet seed"); + } + else { + + float fJetEnergy = (*p_tau->jetLink())->e(); + ATH_MSG_DEBUG("Roi: jet e "<< fJetEnergy); - if( fJetEnergy < 0.00001 ) { - ATH_MSG_DEBUG(" Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)"); - ATH_MSG_DEBUG(" Roi: this is probably not needed anymore, method PxPyPzE has been corrected"); + if( fJetEnergy < 0.00001 ) { + ATH_MSG_DEBUG("Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)"); + ATH_MSG_DEBUG("Roi: this is probably not needed anymore, method PxPyPzE has been corrected"); - //p_tau->setEta(roiDescriptor->eta0()); - //p_tau->setPhi(roiDescriptor->phi0()); - // Direct accessors not available anymore - p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); + p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m()); - ATH_MSG_DEBUG(" Roi: " << roiDescriptor->roiId() - << " Tau eta: " << p_tau->eta() - << " Tau phi: " << p_tau->phi() - << " Tau pT : "<< p_tau->pt()); - } + ATH_MSG_DEBUG("Roi: " << roiDescriptor->roiId() + << " Tau eta: " << p_tau->eta() + << " Tau phi: " << p_tau->phi() + << " Tau pT : "<< p_tau->pt()); + } - // loop over end tools - ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin(); - ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end(); - for (; p_itET != p_itETE; ++p_itET ) { - ATH_MSG_VERBOSE("Invoking endTool " << ( *p_itET )->name() ); + // loop over end tools + ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin(); + ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end(); + for (; p_itET != p_itETE; ++p_itET ) { + ATH_MSG_VERBOSE("Invoking endTool " << ( *p_itET )->name() ); - processStatus = ( *p_itET )->execute( *p_tau); - if( processStatus.isFailure() ) break; - } - // Get L1 RoiDescriptor - SG::ReadHandle< TrigRoiDescriptorCollection > L1roisHandle = SG::makeHandle( m_L1RoIKey, ctx ); - const TrigRoiDescriptor *roiL1Descriptor = L1roisHandle->at(0); - - EtaL1 = roiL1Descriptor->eta(); - PhiL1 = roiL1Descriptor->phi(); - - // get tau detail variables for Monitoring - numTrack = p_tau->nTracks(); - nWideTrk = p_tau->nTracksIsolation(); - p_tau->detail(xAOD::TauJetParameters::trkAvgDist, trkAvgDist); - p_tau->detail(xAOD::TauJetParameters::etOverPtLeadTrk, etovPtLead); - p_tau->detail(xAOD::TauJetParameters::EMRadius, emRadius); - p_tau->detail(xAOD::TauJetParameters::hadRadius, hadRadius); - p_tau->detail(xAOD::TauJetParameters::isolFrac, IsoFrac); - p_tau->detail(xAOD::TauJetParameters::centFrac, centFrac); - p_tau->detail(xAOD::TauJetParameters::ipSigLeadTrk, ipSigLeadTrk); - p_tau->detail(xAOD::TauJetParameters::trFlightPathSig, trFlightPathSig); - p_tau->detail(xAOD::TauJetParameters::dRmax, dRmax); - p_tau->detail(xAOD::TauJetParameters::massTrkSys, massTrkSys); + processStatus = ( *p_itET )->execute( *p_tau); + if( processStatus.isFailure() ) break; + } + + // Get L1 RoiDescriptor + SG::ReadHandle< TrigRoiDescriptorCollection > L1roisHandle = SG::makeHandle( m_L1RoIKey, ctx ); + + if ( L1roisHandle.isValid() && (L1roisHandle->size() != 0) ) { + const TrigRoiDescriptor *roiL1Descriptor = L1roisHandle->at(0); + EtaL1 = roiL1Descriptor->eta(); + PhiL1 = roiL1Descriptor->phi(); + } + else { + ATH_MSG_WARNING("Failed to retrieve L1 RoI descriptor!"); + } + + // get tau detail variables for Monitoring + numTrack = p_tau->nTracks(); + nWideTrk = p_tau->nTracksIsolation(); + p_tau->detail(xAOD::TauJetParameters::trkAvgDist, trkAvgDist); + p_tau->detail(xAOD::TauJetParameters::etOverPtLeadTrk, etovPtLead); + p_tau->detail(xAOD::TauJetParameters::EMRadius, emRadius); + p_tau->detail(xAOD::TauJetParameters::hadRadius, hadRadius); + p_tau->detail(xAOD::TauJetParameters::isolFrac, IsoFrac); + p_tau->detail(xAOD::TauJetParameters::centFrac, centFrac); + p_tau->detail(xAOD::TauJetParameters::ipSigLeadTrk, ipSigLeadTrk); + p_tau->detail(xAOD::TauJetParameters::trFlightPathSig, trFlightPathSig); + p_tau->detail(xAOD::TauJetParameters::dRmax, dRmax); + p_tau->detail(xAOD::TauJetParameters::massTrkSys, massTrkSys); - p_tau->detail(xAOD::TauJetParameters::PSSFraction, PSSFraction); - p_tau->detail(xAOD::TauJetParameters::EMPOverTrkSysP, EMPOverTrkSysP); - p_tau->detail(xAOD::TauJetParameters::ChPiEMEOverCaloEME, ChPiEMEOverCaloEME); - p_tau->detail(xAOD::TauJetParameters::innerTrkAvgDist, innerTrkAvgDist); - p_tau->detail(xAOD::TauJetParameters::SumPtTrkFrac, SumPtTrkFrac); - - massTrkSys /= 1000.; // make GeV - p_tau->detail(xAOD::TauJetParameters::etEMAtEMScale, EtEm); - EtEm /= 1000.; // make GeV - p_tau->detail(xAOD::TauJetParameters::etHadAtEMScale, EtHad); - EtHad /= 1000.; // make GeV - Et = EtEm + EtHad; - EtFinal = p_tau->pt()/1000.; - - EtaEF = p_tau->eta(); - PhiEF = p_tau->phi(); + p_tau->detail(xAOD::TauJetParameters::PSSFraction, PSSFraction); + p_tau->detail(xAOD::TauJetParameters::EMPOverTrkSysP, EMPOverTrkSysP); + p_tau->detail(xAOD::TauJetParameters::ChPiEMEOverCaloEME, ChPiEMEOverCaloEME); + p_tau->detail(xAOD::TauJetParameters::innerTrkAvgDist, innerTrkAvgDist); + p_tau->detail(xAOD::TauJetParameters::SumPtTrkFrac, SumPtTrkFrac); + + massTrkSys /= Gaudi::Units::GeV; + p_tau->detail(xAOD::TauJetParameters::etEMAtEMScale, EtEm); + EtEm /= Gaudi::Units::GeV; + p_tau->detail(xAOD::TauJetParameters::etHadAtEMScale, EtHad); + EtHad /= Gaudi::Units::GeV; + Et = EtEm + EtHad; + EtFinal = p_tau->pt()/Gaudi::Units::GeV; + + EtaEF = p_tau->eta(); + PhiEF = p_tau->phi(); - if( Et !=0) EMFrac = EtEm/ Et ; + if( Et !=0) EMFrac = EtEm/ Et ; - dEta = EtaEF - roiDescriptor->eta(); - dPhi = PhiEF - roiDescriptor->phi(); - if(dPhi<-M_PI) dPhi += 2.0*M_PI; - if(dPhi>M_PI) dPhi -= 2.0*M_PI; + dEta = EtaEF - roiDescriptor->eta(); + dPhi = PhiEF - roiDescriptor->phi(); + if(dPhi<-M_PI) dPhi += 2.0*M_PI; + if(dPhi>M_PI) dPhi -= 2.0*M_PI; - std::vector<const xAOD::TauJetContainer*> tempCaloOnlyContVec; + std::vector<const xAOD::TauJetContainer*> tempCaloOnlyContVec; - // get TauJetContainer - SG::ReadHandle< xAOD::TauJetContainer > TJContainerHandle = SG::makeHandle( m_trigTauJetKey,ctx ); - const xAOD::TauJetContainer *tempCaloOnlyCont=TJContainerHandle.get(); - tempCaloOnlyContVec.push_back(tempCaloOnlyCont); + // get TauJetContainer + SG::ReadHandle< xAOD::TauJetContainer > TJContainerHandle = SG::makeHandle( m_trigTauJetKey,ctx ); + const xAOD::TauJetContainer *tempCaloOnlyCont=TJContainerHandle.get(); + tempCaloOnlyContVec.push_back(tempCaloOnlyCont); - /*if( !tempCaloOnlyContVec.isValid()){ + /*if( !tempCaloOnlyContVec.isValid()){ - ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector"); + ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector"); - } else {*/ - if (tempCaloOnlyCont) { + } else {*/ + if (tempCaloOnlyCont) { - // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back(); - // for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyTauCont->begin(); tauIt != tempCaloOnlyTauCont->end(); tauIt++){ + // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back(); + // for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyTauCont->begin(); tauIt != tempCaloOnlyTauCont->end(); tauIt++){ - // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back(); + // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back(); - for(auto tauIt: *tempCaloOnlyCont){ - ATH_MSG_DEBUG("On the loop"); - ATH_MSG_DEBUG("pT(tau) = " << tauIt->pt() << " pT(caloOnly) = " << tauIt->ptTrigCaloOnly() ); + for(auto tauIt: *tempCaloOnlyCont){ + ATH_MSG_DEBUG("On the loop"); + ATH_MSG_DEBUG("pT(tau) = " << tauIt->pt() << " pT(caloOnly) = " << tauIt->ptTrigCaloOnly() ); - p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, tauIt->ptTrigCaloOnly(), tauIt->etaTrigCaloOnly(), tauIt->phiTrigCaloOnly(), tauIt->mTrigCaloOnly()); - - } + p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, tauIt->ptTrigCaloOnly(), tauIt->etaTrigCaloOnly(), tauIt->phiTrigCaloOnly(), tauIt->mTrigCaloOnly()); + } - //} + //} - }else{ - ATH_MSG_WARNING( "TauJetContainer not found :"); - } - - ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId() - << " Tau being saved eta: " << EtaEF << " Tau phi: " << PhiEF - << " wrt L1 dEta "<< dEta<<" dPhi "<<dPhi - << " Tau Et (GeV): "<< EtFinal); - - ++Ncand; - } - else { - xAOD::TauJet* bad_tau = pContainer->back(); - ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: "); - pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end()); - pContainer->pop_back(); + } + else{ + ATH_MSG_WARNING( "TauJetContainer not found :"); + } + + ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId() + << " Tau being saved eta: " << EtaEF << " Tau phi: " << PhiEF + << " wrt L1 dEta "<< dEta<<" dPhi "<<dPhi + << " Tau Et (GeV): "<< EtFinal); - ATH_MSG_DEBUG("deleted tau done after jet seed"); - } + ++Ncand; + } + - // call eventFinalize on the booked tau tools - for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) { - processStatus = (*firstTool)->eventFinalize(); - if( processStatus != StatusCode :: SUCCESS ) { - ATH_MSG_DEBUG("tool "<<(*firstTool)->name()<< "failed in eventFinalize"); - return StatusCode::FAILURE; - } - } - ATH_MSG_DEBUG("tools succeed in eventFinalize"); + // call eventFinalize on the booked tau tools + for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) { + processStatus = (*firstTool)->eventFinalize(); + if( processStatus != StatusCode :: SUCCESS ) { + ATH_MSG_DEBUG("tool "<<(*firstTool)->name()<< "failed in eventFinalize"); + return StatusCode::FAILURE; + } + } + ATH_MSG_DEBUG("Tools succeed in eventFinalize"); - //------------------------------------------------------------------------- - // all done, register the tau Container in TDS. - //------------------------------------------------------------------------- - - ATH_MSG_DEBUG("Output TauJetContainer size:"<< pContainer->size()); - ATH_MSG_DEBUG("Output TauTrackJetContainer size:"<< pTrackContainer->size()); - - CHECK( outTauJetHandle.record(std::unique_ptr<xAOD::TauJetContainer>{pContainer}, std::unique_ptr<xAOD::TauJetAuxContainer>{pAuxContainer}) ); - CHECK( outTauTrackHandle.record(std::unique_ptr<xAOD::TauTrackContainer>{pTrackContainer}, std::unique_ptr<xAOD::TauTrackAuxContainer>{pTrackAuxContainer}) ); - - ATH_MSG_DEBUG("Recorded a tau container: HLT_TrigTauRecMergedMT"); - ATH_MSG_DEBUG("the tau object has been registered in the tau container"); - - // set status of TE to always true for FE algorithms - return StatusCode::SUCCESS; + //------------------------------------------------------------------------- + // all done, register the tau Container in TDS. + //------------------------------------------------------------------------- + + ATH_MSG_DEBUG("Output TauJetContainer size:"<< pContainer->size()); + ATH_MSG_DEBUG("Output TauTrackJetContainer size:"<< pTrackContainer->size()); + + CHECK( outTauJetHandle.record(std::unique_ptr<xAOD::TauJetContainer>{pContainer}, std::unique_ptr<xAOD::TauJetAuxContainer>{pAuxContainer}) ); + CHECK( outTauTrackHandle.record(std::unique_ptr<xAOD::TauTrackContainer>{pTrackContainer}, std::unique_ptr<xAOD::TauTrackAuxContainer>{pTrackAuxContainer}) ); + + ATH_MSG_DEBUG("Recorded a tau container: HLT_TrigTauRecMergedMT"); + ATH_MSG_DEBUG("the tau object has been registered in the tau container"); + + + // the validity of element links in data will need to be checked in R22! (see TrigTauRecMerged.cxx) + + + // set status of TE to always true for FE algorithms + return StatusCode::SUCCESS; } void TrigTauRecMergedMT::setEmptyTauTrack(xAOD::TauJet* &pTau, - xAOD::TauTrackContainer* &tauTrackContainer) + xAOD::TauTrackContainer* &tauTrackContainer) { // Make a new tau track, add to container xAOD::TauTrack* pTrack = new xAOD::TauTrack(); diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py index c4a37f2a27f2..ed6f36146ee7 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration """ Tau slice signatures """ @@ -10,23 +10,19 @@ from AthenaCommon.Logging import logging logging.getLogger().info("Importing %s",__name__) log = logging.getLogger(__name__) -from InDetTrigParticleCreation.InDetTrigParticleCreationConf import InDet__TrigVertexxAODCnv -from InDetTrigRecExample.EFInDetConfig import TrigEFIDInsideOut_Tau from TrigCaloRec.TrigCaloRecConfig import TrigCaloCellMaker_tau, TrigCaloClusterMaker_topo from TrigFTK_RecAlgs.TrigFTK_RecAlgs_Config import TrigFTK_VxPrimary_EF from TrigInDetConf.TrigInDetFTKSequence import TrigInDetFTKSequence from TrigInDetConf.TrigInDetSequence import TrigInDetSequence -from TrigT2CaloTau.TrigT2CaloTauConfig import T2CaloTau_Tau_Med -from TrigT2IDTau.T2IDTauConfig import T2IDTau_Tau_1GeV_dZ02_dR0103 -from TrigT2Tau.T2TauFinalConfig import T2TauFinal_Tau_dR03_1GeV_dZ02 -from TrigTauDiscriminant.TrigTauDiscriGetter import TrigTauDiscriGetter, TrigTauDiscriGetter2015 +from TrigTauDiscriminant.TrigTauDiscriGetter import TrigTauDiscriGetter2015 from TrigTauHypo.TrigTauHypoBase import HLTTrackTauHypo_rejectNoTracks from TrigTauHypo.TrigTauHypoConf import HLTTauCaloRoiUpdater, HLTTauTrackRoiUpdater -from TrigTauRec.TrigTauRecConfig import (TrigTauRecMerged_Tau2012, - TrigTauRecMerged_TauCaloOnly, +from TrigTauRec.TrigTauRecConfig import (TrigTauRecMerged_TauCaloOnly, + TrigTauRecMerged_TauCaloOnlyMVA, TrigTauRecMerged_TauFTK, TrigTauRecMerged_TauPrecision, - TrigTauRecMerged_TauPreselection) + TrigTauRecMerged_TauPreselection, + TrigTauRecMerged_TauPrecisionMVA) from TrigTauRec.TrigTauRecCosmicsConfig import TrigTauRecCosmics_Tau2012 from TriggerMenu.menu.HltConfig import L2EFChainDef, mergeRemovingOverlap @@ -88,12 +84,11 @@ class L2EFChain_tau(L2EFChainDef): selection = self.chainPart['selection'] preselection = self.chainPart['preselection'] - if 'r1' in selection or 'r1' in preselection: - # Run-I set-up - self.setup_tauChainRunOne() - else: - # Run-II set-up - self.setup_tauChain() + # Run-I setup no longer supported + assert('r1' not in selection and 'r1' not in preselection), "Run-1 chains no longer supported! " + self.chainName + + # Run-II setup + self.setup_tauChain() L2EFChainDef.__init__(self, self.chainName, self.L2Name, self.chainCounter, chainDict['L1item'], self.EFName, self.chainCounter, self.L2InputTE) @@ -142,6 +137,16 @@ class L2EFChain_tau(L2EFChainDef): self.EFsequenceList += [[[ self.currentItem ], [caloRec], self.continueChain('L2', 'calorec')]] + + #create the TrigTauRec Calorimeter only sequence + def addTrigTauRecCaloOnlyMVASequence(self,threshold,selection,preselection): # MVA TES (ATR-17687) + + # Run TrigTauRec, calorimeter only (to get proper calibration, and cell-based vars) + caloRec = TrigTauRecMerged_TauCaloOnlyMVA() + + self.EFsequenceList += [[[ self.currentItem ], + [caloRec], + self.continueChain('L2', 'calorec')]] #create the Calorimeter hypo (selection) sequence def addCaloHypoSequence(self,threshold,selection,preselection): @@ -162,7 +167,7 @@ class L2EFChain_tau(L2EFChainDef): elif preselection == 'FTKRefit': [trkfast, trkprec[:]] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=["refit","PT"]).getSequence() elif preselection == 'FTKNoPrec': - [trkfast] = TrigInDetFTKSequence("Tau","tau","").getSequence() + [trkfast] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=[""]).getSequence() [trkprec[:]] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=["refit"]).getSequence() else: [trkfast, trkprec[:]] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence() @@ -191,28 +196,17 @@ class L2EFChain_tau(L2EFChainDef): theTrigFTK_VxPrimary_EF = TrigFTK_VxPrimary_EF("TauFTKVertex", "Tau") theTrigFTK_VxPrimary_EF.useRawTracks = False theTrigFTK_VxPrimary_EF.useRefittedTracks = False - - # to allow compatibility between release 20.11 and 21 -# from TrigInDetConf.TrigInDetSequence import vertexXAODCnvNeeded -# if vertexXAODCnvNeeded(): -# theTrigFTK_VxPrimary_EF.vxContainerName = 'PrimVxFTK' -# theTrigFTK_VxPrimary_EF.getVertexContainer = False -# theInDet__TrigVertexxAODCnv = InDet__TrigVertexxAODCnv(name="FTKTauVtxConversion") -# theInDet__TrigVertexxAODCnv.InputVxContainerKey = 'PrimVxFTK' -# theInDet__TrigVertexxAODCnv.OutputVxContainerKey = 'PrimVertexFTK' -# vertexAlgorithms = [theTrigFTK_VxPrimary_EF, theInDet__TrigVertexxAODCnv] -# self.EFsequenceList += [[[ self.currentItem ],vertexAlgorithms,self.continueChain('L2', 'vertex')]] -# else: theTrigFTK_VxPrimary_EF.vertexContainerName= 'PrimVertexFTK' theTrigFTK_VxPrimary_EF.getVertexContainer = True vertexAlgorithms = [theTrigFTK_VxPrimary_EF] + self.EFsequenceList += [[[ self.currentItem ], vertexAlgorithms, self.continueChain('L2', 'vertex')]] #create the TrigTauRec preselection sequence def addTrigTauRecTauPreselectionSequence(self,threshold,selection,preselection,idperf): # Run TrigTauRec to store pre-selected taus recPreselection = TrigTauRecMerged_TauPreselection() - + self.EFsequenceList += [[[ self.currentItem ], [recPreselection], self.continueChain('L2', 'storepre')]] @@ -238,11 +232,10 @@ class L2EFChain_tau(L2EFChainDef): # Here we load our new tau-specific RoI Updater tauRoiUpdater = HLTTauTrackRoiUpdater() # This will add up to a tolerance of 5 mm due to the extra 3mm tolerance from the FTF - # tauRoiUpdater.z0HalfWidth = 2.0 # Temporarily widened to 10 mm tauRoiUpdater.z0HalfWidth = 7.0 #ftracks = trkcore+[tauRoiUpdater]+trkiso - if not idperf: + if not idperf and preselection != 'tracktwoMVA': ftracks = trkcore + [tauRoiUpdater, tauRejectEmpty] + trkiso else : ftracks = trkcore+[tauRoiUpdater]+trkiso @@ -291,8 +284,6 @@ class L2EFChain_tau(L2EFChainDef): def setup_tauChain(self): threshold = self.chainPart['threshold'] - calibration = self.chainPart['calib'] - recoAlg = self.chainPart['recoAlg'] selection = self.chainPart['selection'] preselection= self.chainPart['preselection'] idperf = "idperf" in self.chainPart['trkInfo'] @@ -301,23 +292,37 @@ class L2EFChain_tau(L2EFChainDef): # Cleaner if-statements # Strategies which need calorimeter pre-selection needsCaloPre = ['calo', 'ptonly', 'mvonly', 'caloonly', - 'track', 'trackonly', 'tracktwo', + 'track', 'trackonly', 'tracktwo', 'tracktwoEF', 'trackcalo', 'tracktwocalo','tracktwo2015'] + needsCaloMVAPre = ['tracktwoEFmvaTES','tracktwoMVA'] # Strategies which need fast-track finding needsTrackTwoPre = ['tracktwo', 'tracktwoonly', 'tracktwocalo','tracktwo2015'] + needsTrackTwoNoPre = ['tracktwoEF','tracktwoEFmvaTES','tracktwoMVA'] needsTrackPre = ['track', 'trackonly', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec'] # Strategies which need Run-II final hypo - needsRun2Hypo = ['calo', 'ptonly', 'mvonly', 'caloonly', - 'trackonly', 'track', 'tracktwo', 'tracktwocalo', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec', 'tracktwo2015'] - fastTrackingUsed = needsTrackPre + needsTrackTwoPre + needsRun2Hypo = ['calo', 'ptonly', 'mvonly', 'caloonly', 'trackonly', 'track', 'tracktwo', 'tracktwoEF', 'tracktwoEFmvaTES', 'tracktwoMVA', 'tracktwocalo', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec', 'tracktwo2015'] + fastTrackingUsed = needsTrackPre + needsTrackTwoPre + needsTrackTwoNoPre + + + # 2018 preselection + preselection2018 = needsCaloMVAPre + needsTrackTwoNoPre + # MVA TES for preselection and precision steps + MVATES = preselection in needsCaloMVAPre + # track counting based on EF tracks + BDT classification for core tracks + #TrackBDT = preselection in ['tracktwoMVA'] + # can't afford to use track BDT unfortunately, rates too high (especially when including 0p) + TrackBDT = False + # evaluate RNN for triggers using RNN ID, and 2018 support triggers (even those using BDT ID, to avoid too many different precision sequences) + RNN = selection in ['verylooseRNN', 'looseRNN', 'mediumRNN', 'tightRNN'] or preselection in preselection2018 + # chains using 2018 features + needsAlgo2018 = (preselection in preselection2018) or MVATES or TrackBDT or RNN + # give unique name to precision sequence + use = {True:'', False:'no'} + MVAprefix = '{0}MVATES_{1}TrackBDT_{2}RNN'.format(use[MVATES], use[TrackBDT], use[RNN]) + #Set the default values [trkcore, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence() - - # Temporary hack to handle naming scheme - if 'r1' in selection: - preselection = 'r1' - selection = selection.replace('r1', '') # Overrule the final EF selection if idperf: @@ -337,15 +342,22 @@ class L2EFChain_tau(L2EFChainDef): self.addCaloSequence(threshold, selection, preselection) self.addTrigTauRecCaloOnlySequence(threshold,selection,preselection) self.addCaloHypoSequence(threshold,selection,preselection) + elif preselection in needsCaloMVAPre: + self.addCaloSequence(threshold, selection, preselection) + self.addTrigTauRecCaloOnlyMVASequence(threshold,selection,preselection) + self.addCaloHypoSequence(threshold,selection,preselection) # Two step fast-tracking if preselection in needsTrackTwoPre: self.addTwoStepTrackingSequence(threshold,selection,preselection,idperf, trkprec) - if preselection != 'tracktwo': - self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf) + if preselection == 'tracktwo': self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf) + self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf) else: - self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf) self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf) + self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf) + # Two-step tracking but no tau reco, no selection + if preselection in needsTrackTwoNoPre: + self.addTwoStepTrackingSequence(threshold,selection,preselection,idperf, trkprec) # One step fast-tracking if preselection in needsTrackPre: self.addTrackingSequence(threshold,selection,preselection,idperf,trkprec) @@ -362,9 +374,12 @@ class L2EFChain_tau(L2EFChainDef): # Change track selection if we're running on cosmics... if selection == 'cosmic': - recmerged_2012 = TrigTauRecCosmics_Tau2012() + recmerged = TrigTauRecCosmics_Tau2012() else: - recmerged_2012 = TrigTauRecMerged_TauPrecision() + if needsAlgo2018: + recmerged = TrigTauRecMerged_TauPrecisionMVA(name='TrigTauMVA_{}'.format(MVAprefix), doMVATES=MVATES, doTrackBDT=TrackBDT, doRNN=RNN) + else: + recmerged = TrigTauRecMerged_TauPrecision() efidinsideout = trkprec @@ -379,180 +394,38 @@ class L2EFChain_tau(L2EFChainDef): self.continueChain('EF', 'tr')]] # TrigTauRec and Hypo (no BDT) - if selection == 'kaonpi1' or selection == 'kaonpi2' or selection == 'dipion1' or selection=='dipion1loose' or selection == 'dipion2' or selection == 'dikaon' or selection == 'dikaontight' or selection == 'dikaonmass' or selection == 'dikaonmasstight' or selection == 'singlepion' or selection == 'singlepiontight': + if selection == 'kaonpi1' or selection == 'kaonpi2' or selection == 'dipion1' or selection=='dipion1loose' or selection == 'dipion2' or selection == 'dipion3' or selection == 'dikaon' or selection == 'dikaontight' or selection == 'dikaonmass' or selection == 'dikaonmasstight' or selection == 'singlepion' or selection == 'singlepiontight': self.EFsequenceList += [[[ self.currentItem ], - [recmerged_2012, theEFHypo], + [recmerged, theEFHypo], self.continueChain('EF', 'effinal')]] - else: - # TrigTauRec, BDT and Hypo - efmv = TrigTauDiscriGetter2015() - self.EFsequenceList += [[[ self.currentItem ], - [recmerged_2012, efmv, theEFHypo], - self.continueChain('EF', 'effinal')]] - - def setup_tauChainRunOne(self): - - threshold = self.chainPart['threshold'] - calibration = self.chainPart['calib'] - recoAlg = self.chainPart['recoAlg'] - selection = self.chainPart['selection'] - preselection= self.chainPart['preselection'] - idperf = "idperf" in self.chainPart['trkInfo'] - - # Handle Run-II naming scheme - if 'r1' in selection: - preselection = 'r1' - selection = selection.replace('r1', '') - - # Overrule the final EF selection - if idperf: - selection = 'perf' - - if preselection == 'r1': - # Try new hypo extraction method - theL2CaloHypo = self.hypoProvider.GetHypo('L2', threshold, selection, 'calo', 'r1') - theL2IDHypo = self.hypoProvider.GetHypo('L2', threshold, selection, 'id', 'r1') - theL2FinalHypo = self.hypoProvider.GetHypo('L2', threshold, selection, '', 'r1') - # Get the necessary fexes - - from TrigL2SiTrackFinder.TrigL2SiTrackFinder_Config import (TrigL2SiTrackFinder_TauA, - TrigL2SiTrackFinder_TauB, - TrigL2SiTrackFinder_TauC) - t2calo_2012 = T2CaloTau_Tau_Med() - l2sitrkfinder_tauB = TrigL2SiTrackFinder_TauB() - t2id_2012 = T2IDTau_Tau_1GeV_dZ02_dR0103() - t2final_2012 = T2TauFinal_Tau_dR03_1GeV_dZ02() - - if idperf: - l2sitrkfinder_tauA = TrigL2SiTrackFinder_TauA() - l2sitrkfinder_tauC = TrigL2SiTrackFinder_TauC() - - # L2 configuration - self.L2sequenceList += [[[ self.currentItem ], - [t2calo_2012, theL2CaloHypo], - self.continueChain('L2', 'calo')]] - - if idperf: - self.L2sequenceList += [[[ self.currentItem ], - [l2sitrkfinder_tauA, l2sitrkfinder_tauB, l2sitrkfinder_tauC, t2id_2012, theL2IDHypo], - self.continueChain('L2', 'id')]] - else: - self.L2sequenceList += [[[ self.currentItem ], - [l2sitrkfinder_tauB, t2id_2012, theL2IDHypo], - self.continueChain('L2', 'id')]] - - self.L2sequenceList += [[[ self.currentItem ], - [t2final_2012, theL2FinalHypo], - self.continueChain('L2', 'l2final')]] - - if preselection == 'r1': - - theEFHypo = self.hypoProvider.GetHypo('EF', threshold, selection, '', 'r1') - - # Get the necessary fexes - - cellmaker = TrigCaloCellMaker_tau() - clustermaker_topo = TrigCaloClusterMaker_topo() - efidinsideout = TrigEFIDInsideOut_Tau().getSequence() - recmerged_2012 = TrigTauRecMerged_Tau2012() - efmv = TrigTauDiscriGetter() - - self.EFsequenceList += [[[ self.currentItem ], - [cellmaker, clustermaker_topo], - self.continueChain('EF', 'clf0')]] - - self.EFsequenceList += [[[ self.currentItem ], - efidinsideout, - self.continueChain('EF', 'tr')]] - - self.EFsequenceList += [[[ self.currentItem ], - [recmerged_2012, efmv, theEFHypo], - self.continueChain('EF', 'effinal')]] - - - # Prototype for TwoStep configuration - def setup_tauChainTwoStep(self): - - threshold = self.chainPart['threshold'] - calibration = self.chainPart['calib'] - recoAlg = self.chainPart['recoAlg'] - selection = self.chainPart['selection'] - preselection= self.chainPart['preselection'] - idperf = "idperf" in self.chainPart['trkInfo'] - - # Overrule the final EF selection - if idperf: - selection = 'perf' - - if preselection == 'calo' or preselection == 'ptonly' or preselection == 'mvonly' or preselection == 'caloonly' or preselection == 'track' or preselection == 'trackonly': - # Test 2015 approach - log.info("Calo-based pre-selection configuration is not quite ready yet!") - log.info("Very preliminary version!!") - - cellmaker = TrigCaloCellMaker_tau() - clustermaker_topo = TrigCaloClusterMaker_topo() - - # Run topoclustering - self.EFsequenceList += [[[ self.currentItem ], - [cellmaker, clustermaker_topo], - self.continueChain('EF', 'clf0')]] + elif needsAlgo2018: + # don't evaluate BDT for RNN chains + EFsequence = [] + if selection not in ['verylooseRNN', 'looseRNN', 'mediumRNN', 'tightRNN']: + EFsequence.append( TrigTauDiscriGetter2015() ) - if preselection == 'track' or preselection == 'trackonly' or (preselection != 'r1' and idperf): - - # Get the necessary fexes - [trkfast, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence() - - # Run fast-tracking - self.EFsequenceList += [[[ self.currentItem ], - trkfast, - self.continueChain('EF', 'trfast')]] - - # Here we're running the TrigTauRec based on all the stuff that ran before. Uh-oh, this is dangerous... - # For now, assume fast-tracking is always run - - recPreselection = TrigTauRecMerged_TauPreselection() - - self.EFsequenceList += [[[ self.currentItem ], - recPreselection, - self.continueChain('EF', 'prefinal')]] - - - # Insert generic hypothesis - - - - if preselection == 'calo' or preselection == 'ptonly' or preselection == 'mvonly' or preselection == 'caloonly' or preselection == 'trackonly' or preselection == 'track': - # Only run tracking and tau-rec : no need for topoclustering - if preselection == 'caloonly' or preselection == 'trackonly' or selection == 'cosmic': - theEFHypo = self.hypoProvider.GetHypo('EF', threshold, 'perf', '', 'r1') - else: - theEFHypo = self.hypoProvider.GetHypo('EF', threshold, selection, '', 'r1') - - # Get the necessary fexes - [trkfast, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence() + EFsequence.append( theEFHypo ) + self.EFsequenceList += [[[ self.currentItem ], + [recmerged], + self.continueChain('EF', 'taurecef')]] - # Change track selection if we're running on cosmics... - if selection == 'cosmic': - recmerged_2012 = TrigTauRecCosmics_Tau2012() - else: - recmerged_2012 = TrigTauRecMerged_TauPrecision() + if not idperf: + theHLTTrackPre = self.hypoProvider.GetHypo('L2', threshold, selection, 'id', preselection) + self.EFsequenceList += [[[ self.currentItem ], + [theHLTTrackPre], + self.continueChain('EF', 'trackpre')]] - # Only run the fast-tracking if it wasn't run at pre-selection - if preselection != 'track' and preselection != 'trackonly' and not idperf: - efidinsideout = trkfast+trkprec + self.EFsequenceList += [[[ self.currentItem ], + EFsequence, + self.continueChain('EF', 'effinal')]] + else: - efidinsideout = trkprec - - efmv = TrigTauDiscriGetter2015() - - - self.EFsequenceList += [[[ self.currentItem ], - efidinsideout, - self.continueChain('EF', 'tr')]] + # TrigTauRec, BDT and Hypo + efmv = TrigTauDiscriGetter2015() + self.EFsequenceList += [[[ self.currentItem ], + [recmerged, efmv, theEFHypo], + self.continueChain('EF', 'effinal')]] - self.EFsequenceList += [[[ self.currentItem ], - [recmerged_2012, efmv, theEFHypo], - self.continueChain('EF', 'effinal')]] diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py index a7254eecdb42..4f035879bb73 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py @@ -121,8 +121,6 @@ class L2EFChain_tau(L2EFChainDef): def setup_tauChain(self): threshold = self.chainPart['threshold'] - calibration = self.chainPart['calib'] - recoAlg = self.chainPart['recoAlg'] selection = self.chainPart['selection'] preselection= self.chainPart['preselection'] idperf = "idperf" in self.chainPart['trkInfo'] diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py index fbaed18a3ad9..4c5cdb184798 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py @@ -38,7 +38,6 @@ class TauHypoProvider: theThresh = self.thresholdsL2Calo[(criteria, int(threshold))] currentHypo = T2CaloTauHypo(currentHypoKey, theVars, theThresh) - if part == 'id': if criteria== 'perf': from TrigTauHypo.TrigTauHypoBase import T2IDTauHypo_tauNoCut @@ -68,44 +67,45 @@ class TauHypoProvider: from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_tauNoCut currentHypo = EFTauMVHypo_tauNoCut(currentHypoKey.replace(threshold, '')) - elif criteria=='dikaon' or criteria=='dikaontight' or criteria=='dikaonmass' or criteria=='dikaonmasstight' or criteria=='kaonpi1' or criteria=='kaonpi2' or criteria=='dipion1' or criteria=='dipion1loose' or criteria=='dipion2': + elif criteria=='dikaon' or criteria=='dikaontight' or criteria=='dikaonmass' or criteria=='dikaonmasstight' or criteria=='kaonpi1' or criteria=='kaonpi2' or criteria=='dipion1' or criteria=='dipion1loose' or criteria=='dipion2' or criteria=='dipion3': from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo theVars = ['massTrkSysMin', 'massTrkSysMax', 'massTrkSysKaonMin', 'massTrkSysKaonMax', 'massTrkSysKaonPiMin', 'massTrkSysKaonPiMax', 'targetMassTrkSysKaonPi', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax'] theThresh = self.thresholdsEF_dikaon[(criteria, int(threshold))] currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh) -# elif criteria=='dikaonmass' or criteria=='dikaonmasstight': -# from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo -# theVars = ['massTrkSysKaonMin', 'massTrkSysKaonMax', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax','nWideTrackMax'] -# theThresh = self.thresholdsEF_dikaonmass[(criteria, int(threshold))] -# currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh) - elif criteria=='singlepion' or criteria=='singlepiontight': from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo theVars = ['leadTrkPtMin','EtCalibMin','nTrackMax','nWideTrackMax','dRmaxMax','etOverPtLeadTrkMin','etOverPtLeadTrkMax'] theThresh = self.thresholdsEF_singlepion[(criteria, int(threshold))] currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh) - elif criteria=='medium1HighptL' or criteria=='medium1HighptM' or criteria=='medium1HighptH': - from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_highpt - theVars = ['NTrackMax', 'EtCalibMin', 'Level','HighptTrkThr','HighptIDThr','HighptJetThr'] - theThresh = self.thresholdsEF[(criteria, int(threshold))] - theThresh.extend(self.thresholdsHighpt[(criteria)]) - currentHypo = EFTauMVHypo_highpt(currentHypoKey, theVars, theThresh) - elif criteria=='medium0': from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo theVars = ['NTrackMin','NTrackMax', 'EtCalibMin', 'Level','ApplyIDon0p'] theThresh = self.thresholdsEF_FTK[(criteria, int(threshold))] currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) + elif criteria=='medium1NoPt': + from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo + theVars = ['NTrackMax', 'EtCalibMin', 'Level'] + theThresh = self.thresholdsEF[('medium1', 0)] # do not apply pt cut at EF + currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) + + elif criteria=='verylooseRNN' or criteria=='looseRNN' or criteria=='mediumRNN' or criteria=='tightRNN': + from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo + theVars = ['NTrackMax', 'EtCalibMin', 'Level'] + theThresh = self.thresholdsEF[(criteria, int(threshold))] + theVars.extend(['Method','NTrackMin','HighptIDThr']) + theThresh.extend([3,0,280000.]) + currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) + else: from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo theVars = ['NTrackMax', 'EtCalibMin', 'Level'] theThresh = self.thresholdsEF[(criteria, int(threshold))] currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) - if strategy == 'calo' or strategy =='ptonly' or strategy == 'mvonly' or strategy == 'caloonly' or strategy == 'track' or strategy == 'trackonly' or strategy == 'tracktwo' or strategy == 'trackcalo' or strategy == 'tracktwocalo' or strategy == 'tracktwo2015' or strategy == 'FTK' or strategy == 'FTKRefit' or strategy == 'FTKNoPrec': + if strategy == 'calo' or strategy =='ptonly' or strategy == 'mvonly' or strategy == 'caloonly' or strategy == 'track' or strategy == 'trackonly' or strategy == 'tracktwo' or strategy == 'tracktwoEF' or strategy == 'tracktwoEFmvaTES' or strategy == 'tracktwoMVA' or strategy == 'trackcalo' or strategy == 'tracktwocalo' or strategy == 'tracktwo2015' or strategy == 'FTK' or strategy == 'FTKRefit' or strategy == 'FTKNoPrec': # Simple implementation of 2015 pre-selection currentHypoKey = 'l2'+part+'_tau'+threshold+'_'+criteria+'_'+strategy @@ -143,7 +143,6 @@ class TauHypoProvider: if part == 'id': from TrigTauHypo.TrigTauHypoBase import HLTTrackTauHypo from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo - from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_highpt # Important Note: the pT cut here is an unused dummy if criteria == 'cosmic': theVars = ['LowerPtCut', 'TracksInCoreCut', 'TracksInIsoCut', 'DeltaZ0Cut'] @@ -155,19 +154,18 @@ class TauHypoProvider: theThresh = [0,3,1,0.*self.GeV,-1111,0] currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) else: - if strategy != 'tracktwo' and strategy != 'FTK' and strategy != 'FTKRefit' and strategy != 'FTKNoPrec': + if strategy != 'tracktwo' and strategy != 'tracktwoEF' and strategy != 'tracktwoEFmvaTES' and strategy != 'tracktwoMVA' and strategy != 'FTK' and strategy != 'FTKRefit' and strategy != 'FTKNoPrec': theVars = ['LowerPtCut','LowerTrackPtCut'] theThresh = [int(threshold)*self.GeV,1.*self.GeV] currentHypo = HLTTrackTauHypo(currentHypoKey, theVars, theThresh) + elif strategy == 'tracktwoMVA': + theVars = ['NTrackMin','NTrackMax','NWideTrackMax','EtCalibMin', 'Level','Method'] + theThresh = [0,3,1,0.*self.GeV,-1111,0] + currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) else: theVars = ['NTrackMin','NTrackMax','NWideTrackMax','EtCalibMin', 'Level','Method'] theThresh = [1,3,1,0.*self.GeV,-1111,0] - if criteria=='medium1HighptL' or criteria=='medium1HighptM' or criteria=='medium1HighptH': - theVars.extend(['HighptTrkThr','HighptIDThr','HighptJetThr']) - theThresh.extend(self.thresholdsHighpt[(criteria)]) - currentHypo = EFTauMVHypo_highpt(currentHypoKey, theVars, theThresh) - else: - currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) + currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh) assert currentHypo, 'unable to find hypothesis algorithm: '+currentHypoKey @@ -258,6 +256,7 @@ class TauHypoProvider: ('medium1', 29): [3, 29.0*GeV, 2], ('medium1', 35): [3, 35.0*GeV, 2], ('medium1', 38): [3, 38.0*GeV, 2], + ('medium1', 40): [3, 40.0*GeV, 2], ('medium1', 50): [3, 50.0*GeV, 2], ('medium1', 60): [3, 60.0*GeV, 2], ('medium1', 80): [3, 80.0*GeV, 2], @@ -277,40 +276,58 @@ class TauHypoProvider: ('tight1', 125): [3, 125.0*GeV, 3], ('tight1', 160): [3, 160.0*GeV, 3], ('tight1', 200): [3, 200.0*GeV, 3], - ('medium1HighptL', 20): [3, 20.0*GeV, 2], - ('medium1HighptL', 25): [3, 25.0*GeV, 2], - ('medium1HighptL', 29): [3, 29.0*GeV, 2], - ('medium1HighptL', 35): [3, 35.0*GeV, 2], - ('medium1HighptL', 38): [3, 38.0*GeV, 2], - ('medium1HighptL', 50): [3, 50.0*GeV, 2], - ('medium1HighptL', 60): [3, 60.0*GeV, 2], - ('medium1HighptL', 80): [3, 80.0*GeV, 2], - ('medium1HighptL', 115): [3, 115.0*GeV, 2], - ('medium1HighptL', 125): [3, 125.0*GeV, 2], - ('medium1HighptL', 160): [3, 160.0*GeV, 2], - ('medium1HighptM', 20): [3, 20.0*GeV, 2], - ('medium1HighptM', 25): [3, 25.0*GeV, 2], - ('medium1HighptM', 29): [3, 29.0*GeV, 2], - ('medium1HighptM', 35): [3, 35.0*GeV, 2], - ('medium1HighptM', 38): [3, 38.0*GeV, 2], - ('medium1HighptM', 50): [3, 50.0*GeV, 2], - ('medium1HighptM', 60): [3, 60.0*GeV, 2], - ('medium1HighptM', 80): [3, 80.0*GeV, 2], - ('medium1HighptM', 115): [3, 115.0*GeV, 2], - ('medium1HighptM', 125): [3, 125.0*GeV, 2], - ('medium1HighptM', 160): [3, 160.0*GeV, 2], - ('medium1HighptH', 20): [3, 20.0*GeV, 2], - ('medium1HighptH', 25): [3, 25.0*GeV, 2], - ('medium1HighptH', 29): [3, 29.0*GeV, 2], - ('medium1HighptH', 35): [3, 35.0*GeV, 2], - ('medium1HighptH', 38): [3, 38.0*GeV, 2], - ('medium1HighptH', 50): [3, 50.0*GeV, 2], - ('medium1HighptH', 60): [3, 60.0*GeV, 2], - ('medium1HighptH', 80): [3, 80.0*GeV, 2], - ('medium1HighptH', 115): [3, 115.0*GeV, 2], - ('medium1HighptH', 125): [3, 125.0*GeV, 2], - ('medium1HighptH', 160): [3, 160.0*GeV, 2], - ('medium1HighptH', 200): [3, 200.0*GeV, 2] + ('verylooseRNN', 20): [3, 20.0*GeV, 0], + ('verylooseRNN', 25): [3, 25.0*GeV, 0], + ('verylooseRNN', 29): [3, 29.0*GeV, 0], + ('verylooseRNN', 35): [3, 35.0*GeV, 0], + ('verylooseRNN', 38): [3, 38.0*GeV, 0], + ('verylooseRNN', 50): [3, 50.0*GeV, 0], + ('verylooseRNN', 60): [3, 60.0*GeV, 0], + ('verylooseRNN', 80): [3, 80.0*GeV, 0], + ('verylooseRNN', 115): [3, 115.0*GeV, 0], + ('verylooseRNN', 125): [3, 125.0*GeV, 0], + ('verylooseRNN', 160): [3, 160.0*GeV, 0], + ('verylooseRNN', 200): [3, 200.0*GeV, 0], + ('looseRNN', 20): [3, 20.0*GeV, 1], + ('looseRNN', 25): [3, 25.0*GeV, 1], + ('looseRNN', 29): [3, 29.0*GeV, 1], + ('looseRNN', 35): [3, 35.0*GeV, 1], + ('looseRNN', 38): [3, 38.0*GeV, 1], + ('looseRNN', 50): [3, 50.0*GeV, 1], + ('looseRNN', 60): [3, 60.0*GeV, 1], + ('looseRNN', 80): [3, 80.0*GeV, 1], + ('looseRNN', 115): [3, 115.0*GeV, 1], + ('looseRNN', 125): [3, 125.0*GeV, 1], + ('looseRNN', 160): [3, 160.0*GeV, 1], + ('looseRNN', 200): [3, 200.0*GeV, 1], + ('mediumRNN', 0): [3, 0.0*GeV, 2], + ('mediumRNN', 12): [3, 12.0*GeV, 2], + ('mediumRNN', 20): [3, 20.0*GeV, 2], + ('mediumRNN', 25): [3, 25.0*GeV, 2], + ('mediumRNN', 29): [3, 29.0*GeV, 2], + ('mediumRNN', 35): [3, 35.0*GeV, 2], + ('mediumRNN', 38): [3, 38.0*GeV, 2], + ('mediumRNN', 40): [3, 40.0*GeV, 2], + ('mediumRNN', 50): [3, 50.0*GeV, 2], + ('mediumRNN', 60): [3, 60.0*GeV, 2], + ('mediumRNN', 80): [3, 80.0*GeV, 2], + ('mediumRNN', 115): [3, 115.0*GeV, 2], + ('mediumRNN', 125): [3, 125.0*GeV, 2], + ('mediumRNN', 160): [3, 160.0*GeV, 2], + ('mediumRNN', 200): [3, 200.0*GeV, 2], + ('tightRNN', 20): [3, 20.0*GeV, 3], + ('tightRNN', 25): [3, 25.0*GeV, 3], + ('tightRNN', 29): [3, 29.0*GeV, 3], + ('tightRNN', 35): [3, 35.0*GeV, 3], + ('tightRNN', 38): [3, 38.0*GeV, 3], + ('tightRNN', 40): [3, 40.0*GeV, 3], + ('tightRNN', 50): [3, 50.0*GeV, 3], + ('tightRNN', 60): [3, 60.0*GeV, 3], + ('tightRNN', 80): [3, 80.0*GeV, 3], + ('tightRNN', 115): [3, 115.0*GeV, 3], + ('tightRNN', 125): [3, 125.0*GeV, 3], + ('tightRNN', 160): [3, 160.0*GeV, 3], + ('tightRNN', 200): [3, 200.0*GeV, 3] } thresholdsEF_FTK = { @@ -329,12 +346,8 @@ class TauHypoProvider: ('medium0', 160): [0,3, 160.0*GeV, 2, False], ('medium0', 200): [0,3, 200.0*GeV, 2, False], } - thresholdsHighpt = { - ('medium1HighptL'):[250.0*GeV,330.0*GeV,410.0*GeV], - ('medium1HighptM'):[200.0*GeV,330.0*GeV,410.0*GeV], - ('medium1HighptH'):[160.0*GeV,330.0*GeV,410.0*GeV] - } +# 'massTrkSysMin', 'massTrkSysMax', 'massTrkSysKaonMin', 'massTrkSysKaonMax', 'massTrkSysKaonPiMin', 'massTrkSysKaonPiMax', 'targetMassTrkSysKaonPi', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax' thresholdsEF_dikaon = { ('dikaon', 25): [0.2*GeV, 0.45*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 15.0*GeV, 25.0*GeV, 1.5], ('dikaon', 35): [0.2*GeV, 0.45*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 35.0*GeV, 1.5], @@ -353,7 +366,8 @@ class TauHypoProvider: ('dipion1loose', 25): [0.475*GeV, 1.075*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 25.0*GeV, 1.5], ('dipion1loose', 35): [0.475*GeV, 1.075*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 35.0*GeV, 1.5], ('dipion2', 25): [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 15.0*GeV, 25.0*GeV, 1.0], - ('dipion2', 35): [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 35.0*GeV, 1.0] + ('dipion2', 35): [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 35.0*GeV, 1.0], + ('dipion3', 25): [0.279*GeV, 0.648*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 25.0*GeV, 2.2], #ATR-16600 } diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py index 32e809dfc4b0..164db119f1bf 100755 --- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py @@ -2,11 +2,8 @@ """ Tau slice specific flags """ - - -from AthenaCommon.Logging import logging -from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer, jobproperties -from TriggerMenu.menu.CommonSliceHelper import CommonSliceHelper, AllowedList +from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer +from TriggerMenu.menu.CommonSliceHelper import CommonSliceHelper __author__ = '' __version__="$Revision: 1.34 $" -- GitLab From 3df0f1a2d2d3de03657a69adeda07fbcdf718854 Mon Sep 17 00:00:00 2001 From: Charles Burton <cdb97@cornell.edu> Date: Fri, 8 Mar 2019 23:00:10 -0600 Subject: [PATCH 015/163] Support TEfficiency in AthenaMonitoring --- .../AthenaMonitoring/HistogramFiller.h | 26 +++- .../python/ExampleMonitorAlgorithm.py | 14 ++- .../src/ExampleMonitorAlgorithm.cxx | 17 ++- Control/AthenaMonitoring/src/HistogramDef.cxx | 2 +- .../AthenaMonitoring/src/HistogramFiller.cxx | 115 ++++++++++++++---- 5 files changed, 135 insertions(+), 39 deletions(-) diff --git a/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h b/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h index 39d043ac7dc8..e198594175bf 100644 --- a/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h +++ b/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h @@ -14,6 +14,7 @@ #include "TH2.h" #include "TProfile.h" #include "TProfile2D.h" +#include "TEfficiency.h" #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/ITHistSvc.h" @@ -29,8 +30,13 @@ namespace Monitored { public: HistogramFiller(TH1* hist, const HistogramDef& histDef) : m_hist(hist), m_mutex(std::make_shared<std::mutex>()), m_histDef(new HistogramDef(histDef)) {} + HistogramFiller(TEfficiency* eff, const HistogramDef& histDef) + : m_eff(eff), m_mutex(std::make_shared<std::mutex>()), m_histDef(new HistogramDef(histDef)) {} HistogramFiller(const HistogramFiller& hf) - : m_hist(hf.m_hist), m_mutex(hf.m_mutex), m_histDef(hf.m_histDef) {} + : m_hist(hf.m_hist) + , m_eff(hf.m_eff) + , m_mutex(hf.m_mutex) + , m_histDef(hf.m_histDef) {} HistogramFiller(HistogramFiller&&) = default; virtual ~HistogramFiller() {} @@ -49,6 +55,7 @@ namespace Monitored { virtual TH1* histogram() = 0; TH1* m_hist; + TEfficiency* m_eff; std::shared_ptr<std::mutex> m_mutex; std::shared_ptr<HistogramDef> m_histDef; std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> m_monVariables; @@ -81,7 +88,9 @@ namespace Monitored { TH1* create2D(const HistogramDef& def); template<class H> TH1* create2DProfile(const HistogramDef& def); + TEfficiency* createEfficiency(const HistogramDef& def); + std::string getFullName(const HistogramDef& def); static void setOpts(TH1* hist, const std::string& opt); static void setLabels(TH1* hist, const std::vector<std::string>& labels); @@ -167,6 +176,19 @@ namespace Monitored { protected: virtual TProfile2D* histogram() override { return static_cast<TProfile2D*>(m_hist); } }; + + /** + * @brief filler for TEfficiency histograms + */ + class HistogramFillerEfficiency : public HistogramFiller { + public: + HistogramFillerEfficiency(TEfficiency* eff, const HistogramDef& histDef) + : HistogramFiller(eff, histDef) {}; + virtual unsigned fill() override; + virtual HistogramFillerEfficiency* clone() override { return new HistogramFillerEfficiency(*this); }; + protected: + virtual TH1* histogram() { return m_hist; } // Keep the compiler happy + }; } - + #endif /* HistogramFiller */ diff --git a/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py b/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py index 0c50180230ce..d7412fc29dff 100644 --- a/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py +++ b/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py @@ -46,6 +46,7 @@ def ExampleMonitoringConfig(inputFlags): ### STEP 3 ### # Edit properties of a algorithm exampleMonAlg.TriggerChain = '' + # exampleMonAlg.RandomHist = True ### STEP 4 ### # Add some tools. N.B. Do not use your own trigger decion tool. Use the @@ -77,17 +78,18 @@ def ExampleMonitoringConfig(inputFlags): ### STEP 5 ### # Configure histograms - myGroup.defineHistogram('lumiPerBCID;lumiPerBCID', title='Luminosity;L/BCID;Events', + myGroup.defineHistogram('lumiPerBCID',title='Luminosity;L/BCID;Events', path='ToRuleThemAll',xbins=10,xmin=0.0,xmax=10.0) - myGroup.defineHistogram('lb;lb', title='Luminosity Block;lb;Events', + myGroup.defineHistogram('lb', title='Luminosity Block;lb;Events', path='ToFindThem',xbins=1000,xmin=-0.5,xmax=999.5) - myGroup.defineHistogram('random;random', title='LB;x;Events', + myGroup.defineHistogram('random', title='LB;x;Events', path='ToBringThemAll',xbins=30,xmin=0,xmax=1) + myGroup.defineHistogram('pT_passed,pT',type='TEfficiency',title='Test TEfficiency;x;Eff', + path='AndInTheDarkness',xbins=100,xmin=0.0,xmax=50.0) - - anotherGroup.defineHistogram('lbWithFilter;lbWithFilter',title='Lumi;lb;Events', + anotherGroup.defineHistogram('lbWithFilter',title='Lumi;lb;Events', path='top',xbins=1000,xmin=-0.5,xmax=999.5) - anotherGroup.defineHistogram('run;run',title='Run Number;run;Events', + anotherGroup.defineHistogram('run',title='Run Number;run;Events', path='top',xbins=1000000,xmin=-0.5,xmax=999999.5) ### STEP 6 ### diff --git a/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx b/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx index ed0bfd7abca7..1c712557e09e 100644 --- a/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx +++ b/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx @@ -26,17 +26,28 @@ StatusCode ExampleMonitorAlgorithm::fillHistograms( const EventContext& ctx ) co auto lb = Monitored::Scalar<int>("lb",0); auto run = Monitored::Scalar<int>("run",0); auto random = Monitored::Scalar<float>("random",0.0); + + // Two variables (value and passed) needed for TEfficiency + auto pT = Monitored::Scalar<float>("pT",0.0); + auto pT_passed = Monitored::Scalar<float>("pT_passed",false); + // Set the values of the monitored variables for the event lumiPerBCID = lbAverageInteractionsPerCrossing(); lb = GetEventInfo(ctx)->lumiBlock(); run = GetEventInfo(ctx)->runNumber(); + + TRandom3 r(ctx.eventID().event_number()); + // Example of using flags if (m_doRandom) { - TRandom r(ctx.eventID().event_number()); - random = r.Rndm(); + random = r.Rndm(); } + // Fake efficiency calculator + pT = r.Landau(15); + pT_passed = pT>r.Poisson(15); + // Fill. First argument is the tool name, all others are the variables to be saved. - fill("ExampleMonitor",lumiPerBCID,lb,random); + fill("ExampleMonitor",lumiPerBCID,lb,random,pT,pT_passed); // Alternative fill method. Get the group yourself, and pass it to the fill function. auto tool = getGroup("ExampleMonitor"); diff --git a/Control/AthenaMonitoring/src/HistogramDef.cxx b/Control/AthenaMonitoring/src/HistogramDef.cxx index 12403f3219e9..d9fbd06f91f7 100644 --- a/Control/AthenaMonitoring/src/HistogramDef.cxx +++ b/Control/AthenaMonitoring/src/HistogramDef.cxx @@ -52,7 +52,7 @@ const HistogramDef HistogramDef::parse(const std::string& jobOpts) { itr = histProperty.erase(itr); - if (histPar.type.find("TH2") == 0 || histPar.type == "TProfile") { + if (histPar.type.find("TH2") == 0 || histPar.type == "TProfile" || histPar.type == "TEfficiency") { histPar.name.push_back(*itr); itr = histProperty.erase(itr); } diff --git a/Control/AthenaMonitoring/src/HistogramFiller.cxx b/Control/AthenaMonitoring/src/HistogramFiller.cxx index bb0f3057c5c2..9dfd91bbc773 100644 --- a/Control/AthenaMonitoring/src/HistogramFiller.cxx +++ b/Control/AthenaMonitoring/src/HistogramFiller.cxx @@ -21,6 +21,7 @@ HistogramFiller* HistogramFillerFactory::create(const HistogramDef& def) { TProfile* histoProfile(0); TH2* histo2D(0); TProfile2D* histo2DProfile(0); + TEfficiency* histoEfficiency(0); if (def.type == "TH1F") { histo1D = histo = create1D<TH1F>(def); @@ -43,16 +44,21 @@ HistogramFiller* HistogramFillerFactory::create(const HistogramDef& def) { } else if (def.type == "TProfile2D") { histo = create2DProfile<TProfile2D>(def); histo2DProfile = dynamic_cast<TProfile2D*>(histo); + } else if (def.type == "TEfficiency") { + histoEfficiency = createEfficiency(def); } - if (histo == 0) { + if (histo == 0 && histoEfficiency == 0) { throw HistogramFillerCreateException("Can not create yet histogram of type: >" + def.type + "<\n" + - "Try one of: TH1[F,D,I], TH2[F,D,I], TProfile, TProfile2D"); + "Try one of: TH1[F,D,I], TH2[F,D,I], TProfile, TProfile2D, " + + "TEfficiency."); + } else if (histo!=0) { + // magic shift to make histograms readable even if no post-procesing is done + histo->GetYaxis()->SetTitleOffset( 1.25 ); + + setLabels(histo, def.labels); + setOpts(histo, def.opt); } - histo->GetYaxis()->SetTitleOffset( 1.25 );// magic shift to make histograms readable even if no post-procesing is done - - setLabels(histo, def.labels); - setOpts(histo, def.opt); HistogramFiller* result(0); @@ -72,11 +78,43 @@ HistogramFiller* HistogramFillerFactory::create(const HistogramDef& def) { result = new HistogramFiller2DProfile(histo2DProfile, def); } else if ( histo2D ) { result = new HistogramFiller2D(histo2D, def); + } else if ( histoEfficiency ) { + result = new HistogramFillerEfficiency(histoEfficiency,def); } return result; } +/** + * Invent path name + * + * If def path contains any of: EXPERT, SHIFT, DEBUG, RUNSTAT, EXPRES this is online + * convention this becomes the first element of the path followed by the group name. + * Else if the def.path is DEFAULT then only the group name is used if the path yet + * different is concatenated with the group name. + */ +std::string HistogramFillerFactory::getFullName(const HistogramDef& def) { + const static std::set<std::string> online( { "EXPERT", "SHIFT", "DEBUG", "RUNSTAT", "EXPRES" } ); + + std::string path; + if( online.count( def.path) != 0 ) { + path = "/" + def.path + "/" + m_groupName; + } else if ( def.path == "DEFAULT" ) { + path = "/" + m_groupName; + } else { + path = "/" + m_groupName + "/"+def.path; + } + + // remove duplicate + std::string fullName = path + "/" + def.alias; + fullName.erase( std::unique( fullName.begin(), fullName.end(), + [](const char a, const char b) { + return a == b and a == '/'; + } ), fullName.end() ); + + return fullName; +} + /** * Create and register histogram * @@ -87,27 +125,9 @@ HistogramFiller* HistogramFillerFactory::create(const HistogramDef& def) { */ template<class H, class HBASE, typename... Types> HBASE* HistogramFillerFactory::create(const HistogramDef& def, Types&&... hargs) { - // invent path name - // if def path contains any of: EXPERT, SHIFT, DEBUG, RUNSTAT, EXPRES this is online convention - // this becomes the first element of the path followed by the group name - // else if the def.path is DEFAULT then only the group name is used - // if the path yet different is concatenated with the group name - // - const static std::set<std::string> online( { "EXPERT", "SHIFT", "DEBUG", "RUNSTAT", "EXPRES" } ); - std::string path; - if( online.count( def.path) != 0 ) - path = "/" + def.path + "/" + m_groupName; - else if ( def.path == "DEFAULT" ) - path = "/" + m_groupName; - else - path = "/" + m_groupName + "/"+def.path; - // remove duplicate // - std::string fullName = path + "/" + def.alias; - fullName.erase( std::unique( fullName.begin(), fullName.end(), - [](const char a, const char b){ - return a == b and a == '/'; - } ), fullName.end() ); - + + std::string fullName = getFullName(def); + // Check if histogram exists already HBASE* histo = nullptr; if ( m_histSvc->exists( fullName ) ) { @@ -149,6 +169,30 @@ TH1* HistogramFillerFactory::create2DProfile(const HistogramDef& def) { def.ybins, def.ymin, def.ymax, def.zmin, def.zmax); } +TEfficiency* HistogramFillerFactory::createEfficiency(const HistogramDef& def) { + + std::string fullName = getFullName(def); + + // Check if efficiency exists already + TEfficiency* e = nullptr; + if ( m_histSvc->exists(fullName) ) { + TGraph* g = reinterpret_cast<TGraph*>(e); + if ( !m_histSvc->getGraph(fullName,g) ) { + throw HistogramFillerCreateException("Histogram >"+ fullName + "< seems to exist but can not be obtained from THistSvc"); + } + return e; + } + + // Otherwise, create the efficiency and register it + e = new TEfficiency(def.alias.c_str(),def.title.c_str(),def.xbins,def.xmin,def.xmax); + TGraph* g = reinterpret_cast<TGraph*>(e); + if ( !m_histSvc->regGraph(fullName,g) ) { + delete e; + throw HistogramFillerCreateException("Histogram >"+ fullName + "< can not be registered in THistSvc"); + } + return e; +} + void HistogramFillerFactory::setOpts(TH1* hist, const std::string& opt) { // try to apply an option if ( opt.find("kCanRebin") != std::string::npos ) { @@ -351,3 +395,20 @@ unsigned HistogramFiller2D::fill() { return i; } + +unsigned HistogramFillerEfficiency::fill() { + if (m_monVariables.size() != 2) { + return 0; + } + + unsigned i(0); + auto valuesVector1 = m_monVariables[0].get().getVectorRepresentation(); + auto valuesVector2 = m_monVariables[1].get().getVectorRepresentation(); + std::lock_guard<std::mutex> lock(*(this->m_mutex)); + + for (i = 0; i < valuesVector1.size(); ++i) { + m_eff->Fill(valuesVector1[i],valuesVector2[i]); + } + + return i; +} -- GitLab From c5dfdfce6b729403713fbd3de6e4cbef93ada607 Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Sun, 10 Mar 2019 02:06:28 +0100 Subject: [PATCH 016/163] update the ringer hypo code to the MT version and update the egamma emulator code. --- .../Root/TrigEgammaEFCaloSelectorTool.cxx | 24 +- .../Root/TrigEgammaEFElectronSelectorTool.cxx | 28 +- .../Root/TrigEgammaEFPhotonSelectorTool.cxx | 16 +- .../Root/TrigEgammaEmulationTool.cxx | 170 ++++++-- .../Root/TrigEgammaIsolationSelectorTool.cxx | 43 +- .../Root/TrigEgammaL1SelectorTool.cxx | 25 +- .../TrigEgammaL2CaloRingerSelectorTool.cxx | 161 +------ .../Root/TrigEgammaSelectorBaseTool.cxx | 4 +- .../ITrigEgammaEmulationTool.h | 5 +- .../ITrigEgammaSelectorBaseTool.h | 5 +- .../TrigEgammaEFCaloSelectorTool.h | 7 +- .../TrigEgammaEFElectronSelectorTool.h | 4 +- .../TrigEgammaEFPhotonSelectorTool.h | 4 +- .../TrigEgammaEmulationTool.h | 52 ++- .../TrigEgammaEmulationTool/TrigEgammaInfo.h | 6 +- .../TrigEgammaIsolationSelectorTool.h | 5 +- .../TrigEgammaL1SelectorTool.h | 5 +- .../TrigEgammaL2CaloRingerSelectorTool.h | 17 +- .../TrigEgammaSelectorBaseTool.h | 39 +- .../python/TrigEgammaEmulationEFConfig.py | 6 +- .../TrigEgammaEmulationIsolationConfig.py | 3 +- .../python/TrigEgammaEmulationL2Config.py | 99 +++-- .../TrigEgammaEmulationPidToolsConfig.py | 2 +- .../python/TrigEgammaEmulationToolConfig.py | 23 +- .../TrigEgammaEmulationTool_entries.cxx | 3 + .../TrigMultiVarHypo/CMakeLists.txt | 33 +- .../TrigMultiVarHypo/TrigL2CaloRingerFex.h | 25 +- .../TrigMultiVarHypo/TrigL2CaloRingerHypo.h | 18 +- .../preproc/TrigRingerPreprocessor.h | 78 ---- .../tools/MultiLayerPerceptron.h | 68 --- .../tools/RingerSelectorTool.h | 117 +++++ .../tools/TrigL2CaloRingerReader.h | 66 --- .../TrigMultiVarHypo/tools/TrigRingerHelper.h | 125 ------ .../tools/common/RingerHelper.h | 36 ++ .../tools/common/RingerReader.h | 103 +++++ .../tools/procedures/IModel.h | 59 +++ .../tools/procedures/INormalization.h | 50 +++ .../tools/procedures/IThresholds.h | 57 +++ .../tools/procedures/MultiLayerPerceptron.h | 49 +++ .../TrigMultiVarHypo/tools/procedures/Norm1.h | 28 ++ .../tools/procedures/Thresholds.h | 43 ++ .../python/TrigL2CaloRingerConstants.py | 20 - .../python/TrigL2CaloRingerCutDefs.py | 110 ----- .../python/TrigL2CaloRingerFexMTInit.py | 58 --- .../python/TrigL2CaloRingerHypoConfig.py | 194 +++------ .../python/TrigL2CaloRingerHypoMonitoring.py | 26 +- .../python/TrigL2CaloRingerHypoTool.py | 143 ++++++ .../python/TrigRingerPreprocessorDefs.py | 57 --- .../TrigMultiVarHypo/python/__init__.py | 2 +- .../share/convert2version1.py | 2 +- .../TrigMultiVarHypo/share/switch_tuning.py | 2 +- .../src/TrigL2CaloRingerFex.cxx | 152 ++----- .../src/TrigL2CaloRingerFexMT.cxx | 253 ----------- .../src/TrigL2CaloRingerFexMT.h | 106 ----- .../src/TrigL2CaloRingerHypo.cxx | 64 +-- .../src/TrigL2CaloRingerHypoAlgMT.cxx | 105 +++-- .../src/TrigL2CaloRingerHypoAlgMT.h | 25 +- .../src/TrigL2CaloRingerHypoToolMT.cxx | 144 +++--- .../src/TrigL2CaloRingerHypoToolMT.h | 91 ++-- .../components/TrigMultiVarHypo_entries.cxx | 10 +- .../src/preproc/TrigRingerPreprocessor.cxx | 213 --------- .../src/tools/MultiLayerPerceptron.cxx | 267 ------------ .../src/tools/RingerSelectorTool.cxx | 412 ++++++++++++++++++ .../src/tools/TrigL2CaloRingerReader.cxx | 216 --------- .../RingerHelper.cxx} | 6 +- .../src/tools/common/RingerReader.cxx | 318 ++++++++++++++ .../tools/procedures/MultiLayerPerceptron.cxx | 266 +++++++++++ .../src/tools/procedures/Norm1.cxx | 36 ++ 68 files changed, 2475 insertions(+), 2534 deletions(-) delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/MultiLayerPerceptron.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/RingerSelectorTool.h delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigRingerHelper.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerHelper.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerReader.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IModel.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/INormalization.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IThresholds.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Norm1.h create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Thresholds.h delete mode 100755 Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerConstants.py delete mode 100755 Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerCutDefs.py delete mode 100755 Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerFexMTInit.py create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoTool.py delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigRingerPreprocessorDefs.py delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.cxx delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.h mode change 100644 => 100755 Trigger/TrigHypothesis/TrigMultiVarHypo/src/components/TrigMultiVarHypo_entries.cxx delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/preproc/TrigRingerPreprocessor.cxx delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/MultiLayerPerceptron.cxx create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/RingerSelectorTool.cxx delete mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigL2CaloRingerReader.cxx rename Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/{TrigRingerHelper.cxx => common/RingerHelper.cxx} (81%) create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerReader.cxx create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/MultiLayerPerceptron.cxx create mode 100644 Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/Norm1.cxx diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx index 1a2f2b2479b9..fb2b2a9af71f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** * AsgTool: TrigEgammaEFCaloSelectorTool @@ -12,11 +12,11 @@ * **********************************************************************/ #include "TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h" -#include "PATCore/AcceptData.h" #include <boost/foreach.hpp> #include <boost/tokenizer.hpp> #include "boost/algorithm/string.hpp" #include <boost/dynamic_bitset.hpp> +#include "PATCore/AcceptData.h" using namespace std; using namespace Trig; @@ -108,35 +108,35 @@ bool TrigEgammaEFCaloSelectorTool::ApplyCaloPid(const xAOD::Egamma *eg, const st bool passSel=false; //float lhValue=0.0; //eg->passSelection(passSel,pidname); - + // If Alg becomes Reentrant this needs to change const EventContext ctx = Gaudi::Hive::currentContext(); if (pidname == "Tight") { - passTool = (bool) m_electronCaloIsEMTool[0]->accept(ctx, eg); + passTool = (bool)m_electronCaloIsEMTool[0]->accept(ctx,eg); } else if (pidname == "Medium") { - passTool = (bool) m_electronCaloIsEMTool[1]->accept(ctx, eg); + passTool = (bool)m_electronCaloIsEMTool[1]->accept(ctx,eg); } else if (pidname == "Loose") { - passTool = (bool) m_electronCaloIsEMTool[2]->accept(ctx, eg); + passTool = (bool)m_electronCaloIsEMTool[2]->accept(ctx,eg); } else if (pidname == "VLoose") { - passTool = (bool) m_electronCaloIsEMTool[3]->accept(ctx, eg); + passTool = (bool)m_electronCaloIsEMTool[3]->accept(ctx,eg); } else if (pidname == "LHTight") { - passTool = (bool) m_electronCaloLHTool[0]->accept(ctx, eg, avg_mu); + passTool = (bool)m_electronCaloLHTool[0]->accept(ctx,eg,avg_mu); //lhValue = m_electronCaloLHTool[0]->getTResult().getResult(0); } else if (pidname == "LHMedium") { - passTool = (bool) m_electronCaloLHTool[1]->accept(ctx, eg, avg_mu); + passTool = (bool)m_electronCaloLHTool[1]->accept(ctx,eg,avg_mu); //lhValue = m_electronCaloLHTool[1]->getTResult().getResult(0); } else if (pidname == "LHLoose") { - passTool = (bool) m_electronCaloLHTool[2]->accept(ctx, eg, avg_mu); + passTool = (bool)m_electronCaloLHTool[2]->accept(ctx,eg,avg_mu); //lhValue = m_electronCaloLHTool[2]->getTResult().getResult(0); } else if (pidname == "LHVLoose") { - passTool = (bool) m_electronCaloLHTool[3]->accept(ctx, eg, avg_mu); + passTool = (bool)m_electronCaloLHTool[3]->accept(ctx,eg,avg_mu); //lhValue = m_electronCaloLHTool[3]->getTResult().getResult(0); } else { diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFElectronSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFElectronSelectorTool.cxx index c522043d9060..ca556b59a216 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFElectronSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFElectronSelectorTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** @@ -13,12 +13,11 @@ * **********************************************************************/ #include "TrigEgammaEmulationTool/TrigEgammaEFElectronSelectorTool.h" -#include "PATCore/AcceptData.h" #include <boost/foreach.hpp> #include <boost/tokenizer.hpp> #include "boost/algorithm/string.hpp" #include <boost/dynamic_bitset.hpp> - +#include "PATCore/AcceptData.h" using namespace std; using namespace Trig; //********************************************************************** @@ -85,11 +84,13 @@ bool TrigEgammaEFElectronSelectorTool::emulation(const xAOD::IParticleContainer boost::dynamic_bitset<> bitAccept(elContainer->size()); unsigned bit = 0; float etthr = info.thrHLT; - // auto avgmu = getAverageMu(); auto avgmu = getOnlAverageMu(); for(const auto& el : *elContainer){ bit++; + ATH_MSG_INFO("Size = " << el->trackParticle()->numberOfParameters()); + //auto maxParameters = el->trackParticle()->numberOfParameters(); + //emulate electron cuts if (info.idperf || info.etcut || info.perf ) { //ATH_MSG_DEBUG("Apply Et cut " << etthr << " cluster Et " << el->caloCluster()->et()); @@ -130,28 +131,28 @@ bool TrigEgammaEFElectronSelectorTool::ApplyElectronPid(const xAOD::Electron *eg const EventContext ctx = Gaudi::Hive::currentContext(); if (pidname == "Tight") { - passTool = (bool) m_electronOnlIsEMTool[0]->accept(ctx, eg); + passTool = (bool)m_electronOnlIsEMTool[0]->accept(ctx,eg); } else if (pidname == "Medium") { - passTool = (bool) m_electronOnlIsEMTool[1]->accept(ctx, eg); + passTool = (bool)m_electronOnlIsEMTool[1]->accept(ctx,eg); } else if (pidname == "Loose") { - passTool = (bool) m_electronOnlIsEMTool[2]->accept(ctx, eg); + passTool = (bool)m_electronOnlIsEMTool[2]->accept(ctx,eg); } else if (pidname == "VLoose") { - passTool = (bool) m_electronOnlIsEMTool[3]->accept(ctx, eg); + passTool = (bool)m_electronOnlIsEMTool[3]->accept(ctx,eg); } else if (pidname == "LHTight") { - passTool = (bool) m_electronOnlLHTool[0]->accept(ctx, eg,avgmu); + passTool = (bool)m_electronOnlLHTool[0]->accept(ctx,eg,avgmu); }// Tight else if (pidname == "LHMedium") { - passTool = (bool) m_electronOnlLHTool[1]->accept(ctx, eg,avgmu); + passTool = (bool)m_electronOnlLHTool[1]->accept(ctx,eg,avgmu); }// Medium else if (pidname == "LHLoose") { - passTool = (bool) m_electronOnlLHTool[2]->accept(ctx, eg,avgmu); + passTool = (bool)m_electronOnlLHTool[2]->accept(ctx,eg,avgmu); }// Loose else if (pidname == "LHVLoose") { - passTool = (bool) m_electronOnlLHTool[3]->accept(ctx, eg,avgmu); + passTool = (bool)m_electronOnlLHTool[3]->accept(ctx,eg,avgmu); }// VeryLoose else { ATH_MSG_DEBUG("No Pid tool, continue without PID"); @@ -189,7 +190,6 @@ bool TrigEgammaEFElectronSelectorTool::ApplyIsolation(const xAOD::Electron *el, ATH_MSG_DEBUG("No Isolation tool, continue without ISO"); return true; } - if (!status) ATH_MSG_WARNING("Problem to emulate the isolation selector."); diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFPhotonSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFPhotonSelectorTool.cxx index 842250076386..bab501ff6743 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFPhotonSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFPhotonSelectorTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** * AsgTool: TrigEgammaEFPhotonSelectorTool @@ -12,11 +12,10 @@ * **********************************************************************/ #include "TrigEgammaEmulationTool/TrigEgammaEFPhotonSelectorTool.h" -#include "PATCore/AcceptData.h" #include <boost/foreach.hpp> #include <boost/tokenizer.hpp> #include "boost/algorithm/string.hpp" - +#include "PATCore/AcceptData.h" using namespace std; using namespace Trig; //********************************************************************** @@ -82,14 +81,17 @@ bool TrigEgammaEFPhotonSelectorTool::ApplyPhotonPid(const xAOD::Photon *eg, cons bool passTool=false; bool passSel=false; eg->passSelection(passSel,pidname); + //If Alg becomes Reentrant this needs to change + const EventContext ctx = Gaudi::Hive::currentContext(); + if (pidname == "Tight") { - passTool = (bool) m_photonOnlIsEMTool[0]->accept(eg); + passTool = (bool)m_photonOnlIsEMTool[0]->accept(ctx,eg); } else if (pidname == "Medium") { - passTool = (bool) m_photonOnlIsEMTool[1]->accept(eg); + passTool = (bool)m_photonOnlIsEMTool[1]->accept(ctx,eg); } else if (pidname == "Loose") { - passTool = (bool) m_photonOnlIsEMTool[2]->accept(eg); + passTool = (bool)m_photonOnlIsEMTool[2]->accept(ctx,eg); } else { ATH_MSG_DEBUG("No Pid tool, continue without PID"); diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEmulationTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEmulationTool.cxx index ada6347b3556..421d8e0cee07 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEmulationTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEmulationTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** @@ -57,9 +57,11 @@ TrigEgammaEmulationTool( const std::string& myname ) declareProperty("EFCaloSelectorTool" , m_efCaloSelector ); declareProperty("EFElectronSelectorTools" , m_efElectronSelector ); declareProperty("EFPhotonSelectorTools" , m_efPhotonSelector ); + // for expert: use this flags to switch and custo your menu declareProperty("DoL2ElectronFex" , m_doL2ElectronFex=false ); declareProperty("DoRinger" , m_doRinger=false ); + declareProperty("DoRingerBelow15GeV" , m_doRingerBelow15GeV=false); declareProperty("DoEFCaloPid" , m_doEFCaloPid=false ); @@ -75,7 +77,7 @@ TrigEgammaEmulationTool( const std::string& myname ) m_emTauRois =nullptr; m_storeGate =nullptr; m_l1Cont =nullptr; - + // just for compile HLT::TriggerElement* t = nullptr; const xAOD::TrigElectronContainer* a = getFeature<xAOD::TrigElectronContainer>(t); @@ -96,8 +98,8 @@ StatusCode TrigEgammaEmulationTool::initialize() { if ( (m_trigdec.retrieve()).isFailure() ){ ATH_MSG_ERROR("Could not retrieve Trigger Decision Tool! Can't work"); return StatusCode::FAILURE; - } - + } + ATH_MSG_INFO("Initialising Selectors tool..."); //Enable expert methods m_trigdec->ExperimentalAndExpertMethods()->enable(); @@ -111,7 +113,7 @@ StatusCode TrigEgammaEmulationTool::initialize() { return sc; } } - + ATH_MSG_INFO("Initialising L2 Selectors tool..."); if(m_l2Selector){ m_l2Selector->setParents(m_trigdec, m_storeGate); @@ -121,7 +123,7 @@ StatusCode TrigEgammaEmulationTool::initialize() { return sc; } } - + ATH_MSG_INFO("Initialising EFCalo Selectors tool..."); if(m_efCaloSelector){ m_efCaloSelector->setParents(m_trigdec, m_storeGate); @@ -151,16 +153,18 @@ StatusCode TrigEgammaEmulationTool::initialize() { return sc; } } - + ATH_MSG_INFO("Initialising accept..."); - //add cuts into AcceptInfo + //add cuts into TAccept m_accept.addCut("L1Calo" , "Trigger L1Calo step" ); m_accept.addCut("L2Calo" , "Trigger L2Calo step" ); m_accept.addCut("L2" , "Trigger L2Electron step" ); m_accept.addCut("EFCalo" , "Trigger EFCalo step" ); m_accept.addCut("EFTrack" , "Trigger EFTrack step" ); m_accept.addCut("HLT" , "Trigger HLT decision" ); - + m_accept.addCut("L1_matched" , "L1 Trigger object Matched" ); + m_accept.addCut("TE_full" , "The Trigger Element has all objects needed by the emulation" ); + ATH_MSG_INFO("Initialising trigMap..."); auto trigList = m_trigList; @@ -173,8 +177,16 @@ StatusCode TrigEgammaEmulationTool::initialize() { }//Loop over trigger list ATH_MSG_INFO("Initialising supporting trigger..."); - std::vector<std::string> chains = m_trigdec->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); + std::vector<std::string> supportingTrigList; + auto chains = m_trigdec->getListOfTriggers("HLT_e.*"); + + + ATH_MSG_INFO("Supporting trigger before cleaner..."); + for(const auto trigName:m_supportingTrigList){ + ATH_MSG_INFO(" Suppot: " << trigName); + } + // All support triggers must be inside of the xaod for(const auto trigName:m_supportingTrigList){ if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ @@ -183,11 +195,23 @@ StatusCode TrigEgammaEmulationTool::initialize() { supportingTrigList.push_back(trigName); setTrigInfo(trigName); } + // To avoid that loose some chain in support trigger list + else{ + supportingTrigList.push_back(trigName); + } } - } + } + // Overwrite all support list m_supportingTrigList.clear(); m_supportingTrigList.insert(m_supportingTrigList.end(), supportingTrigList.begin(), supportingTrigList.end()); + + ATH_MSG_INFO("Supporting trigger after cleaner..."); + for(const auto trigName:m_supportingTrigList){ + ATH_MSG_INFO(" Suppot: " << trigName); + } + + return sc; } //!========================================================================== @@ -205,7 +229,7 @@ StatusCode TrigEgammaEmulationTool::finalize() { return sc; } } - + if(m_l2Selector){ sc = m_l2Selector->finalize(); if(sc.isFailure()){ @@ -213,7 +237,7 @@ StatusCode TrigEgammaEmulationTool::finalize() { return sc; } } - + if(m_efCaloSelector){ sc = m_efCaloSelector->finalize(); if(sc.isFailure()){ @@ -297,32 +321,42 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * if(m_trigInfo.count(trigger) != 0){ Trig::Info info = getTrigInfo(trigger); - bool passedL1Calo = false; - bool passedL2Calo = false; + bool passedL1Calo = false; + bool passedL2Calo = false; bool passedL2 = false; - bool passedEFCalo = false; - bool passedEFTrack= false; + bool passedEFCalo = false; + bool passedEFTrack= false; bool passedHLT = false; // Trigger Element holder const HLT::TriggerElement *te=nullptr; bool isGoodToGo=false; + + // Here, if the te_external does not have the Electron object means that this te is not completed. + // We need to match objects with this RoI to complete the chain. if(!getFeature<xAOD::ElectronContainer>(te_external)){ + const auto* l1 = getFeature<xAOD::EmTauRoI>(te_external); - if(!l1){ + if(!l1){// Its not possible to match because this TE does not have EmTauRoI, abort ATH_MSG_WARNING("Can not retrieve the support element because the current TE does not has xAOD::EmTauRoI object!"); return acceptData; } + + // There is L1 object in this RoI + acceptData.setCutResult("L1_matched", true); + // This object is not fully completed, try to found other. for (const auto &fctrigger : m_supportingTrigList){ + ATH_MSG_DEBUG("Searching for EL objects in "<< fctrigger); // Retrieve all trigger elements for this fctrigger auto fc = m_trigdec->features(fctrigger, TrigDefs::alsoDeactivateTEs); // Only TEs with all objects auto vec = fc.get<xAOD::ElectronContainer>(); // Try to match by roiword - + ATH_MSG_DEBUG("VEC SIZE IS "<< vec.size()); for(const auto &feat : vec){ if(l1->roiWord() == getFeature<xAOD::EmTauRoI>(feat.te())->roiWord()){ + ATH_MSG_DEBUG("Searching for EL objects in "<< fctrigger << ": FOUND"); te = feat.te(); isGoodToGo=true; break; @@ -330,9 +364,10 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * }// Loop over Trigger elements if(isGoodToGo) break; - }// Loop over support trigger + }// Loop over support trigger }else{ // The current TE has all objects needed by the emulation + acceptData.setCutResult("L1_matched", true); isGoodToGo=true; te=te_external; setTEMatched(te); @@ -345,7 +380,7 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * setTEMatched(te); }else{ ATH_MSG_WARNING("This Trigger Element does not have all features needed by the emulation tool. The external match is " << - " not possible! Maybe the support trigger list not attend all requirements."); + " not possible! Maybe the support trigger list not attend all requirements."); setTEMatched(nullptr); return acceptData; } @@ -355,6 +390,9 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * ATH_MSG_DEBUG("getFeatures from TE..."); + // The TE has RoI and now have all objects needed by the emulatio. + acceptData.setCutResult("TE_full", true); + const auto* l1 = getFeature<xAOD::EmTauRoI>(te); const auto* emCluster = getFeature<xAOD::TrigEMCluster>(te); const auto* trigElCont = getFeature<xAOD::TrigElectronContainer>(te); @@ -363,12 +401,13 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * //const auto* phCont = getFeature<xAOD::PhotonContainer>(te); if(elCont){ - for(auto& tool : m_efElectronSelector) + for(auto& tool : m_efElectronSelector) tool->setTe(te); //Must be passed to config track isolation } - //Level 1 + // Level 1 m_l1Selector->emulation( l1, passedL1Calo , info); + // passedL1Calo = ancestorPassed<xAOD::EmTauRoI>(te_external); acceptData.setCutResult("L1Calo", passedL1Calo); if( (passedL1Calo ) && !info.isL1 ){ @@ -399,7 +438,7 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * if (passedL2){ m_efCaloSelector->emulation( elCont, passedEFCalo, info); acceptData.setCutResult("EFCalo", passedEFCalo); - + if(passedEFCalo){ passedEFTrack=true; acceptData.setCutResult("EFTrack" , passedEFTrack); @@ -412,7 +451,7 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * acceptData.setCutResult("HLT" , passedHLT); } }//EFTrack - }//EFCalo + }//EFCalo }//L2 }//L2Calo }//L1Calo @@ -427,14 +466,14 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const HLT::TriggerElement * asg::AcceptData TrigEgammaEmulationTool::executeTool(const std::string &trigger) { clearDecorations(); asg::AcceptData acceptData (&m_accept); - + if( m_trigInfo.count(trigger) != 0){ Trig::Info info = getTrigInfo(trigger); - bool passedL1Calo = false; - bool passedL2Calo = false; + bool passedL1Calo = false; + bool passedL2Calo = false; bool passedL2 = false; - bool passedEFCalo = false; - bool passedEFTrack= false; + bool passedEFCalo = false; + bool passedEFTrack= false; bool passedHLT = false; boost::dynamic_bitset<> bitL1Accept(m_emTauRois->size()); @@ -458,10 +497,10 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const std::string &trigger) bitL2CaloAccept.set(bit, pass); bit++; } - + if(bitL2CaloAccept.count()>0) passedL2Calo=true; acceptData.setCutResult("L2Calo", passedL2Calo); - + if(passedL2Calo) { if(info.perf){//bypass L2 Electron/Photon Level passedL2=true; @@ -486,12 +525,12 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const std::string &trigger) m_efCaloSelector->emulation(m_onlElectrons, passedEFCalo, info); acceptData.setCutResult("EFCalo", passedEFCalo); - + if(passedEFCalo){ //TODO: running the EF track step passedEFTrack=true; acceptData.setCutResult("EFTrack", passedEFTrack); - + if(passedEFTrack){ if(!emulationHLT(m_onlElectrons, passedHLT, info)){ acceptData.clear(); @@ -501,7 +540,7 @@ asg::AcceptData TrigEgammaEmulationTool::executeTool(const std::string &trigger) } }//EFTrack - }//EFCalo + }//EFCalo }//L2 }//L2Calo }//L1Calo @@ -544,7 +583,7 @@ bool TrigEgammaEmulationTool::isPassed(const std::string &trigger, const std::st ATH_MSG_DEBUG("isPassed()::L2 = " << acceptData.getCutResult("L2")); ATH_MSG_DEBUG("isPassed()::EFCalo = " << acceptData.getCutResult("EFCalo")); ATH_MSG_DEBUG("isPassed()::EFTrack= " << acceptData.getCutResult("EFTrack")); - ATH_MSG_DEBUG("isPassed()::HLT = " << acceptData.getCutResult("HLT")); + ATH_MSG_DEBUG("isPassed()::HLT = " << acceptData.getCutResult("HLT")); } bool pass=false; if(bitAccept.count()>0) pass=true; @@ -565,7 +604,7 @@ void TrigEgammaEmulationTool::clearDecorations(){ //!========================================================================== bool TrigEgammaEmulationTool::emulationHLT(const xAOD::IParticleContainer *container, bool &pass, const Trig::Info &info){ - + if(info.type == "electron"){ for( auto& tool : m_efElectronSelector){ if( tool->emulation(container, pass, info) ) @@ -583,6 +622,23 @@ bool TrigEgammaEmulationTool::emulationHLT(const xAOD::IParticleContainer *conta return true; } +bool TrigEgammaEmulationTool::emulationL2Calo(const xAOD::TrigEMCluster *emCluster, std::string pidname) +{ + bool pass=false; + Trig::Info info; + info.ringer=false; + info.etcut=false; + info.perf = false; + info.hltcalo=false; + info.idperf=false; + info.thrL2Calo=0.0; + info.thrHLT=emCluster->et()*1e-3; + info.pidname=pidname; + m_l2Selector->emulation(emCluster, pass, info); + return pass; +} + + //!========================================================================== void TrigEgammaEmulationTool::setTrigInfo(const std::string trigger){ ATH_MSG_DEBUG("setTrigInfo::trigger = "<< trigger); @@ -603,19 +659,23 @@ void TrigEgammaEmulationTool::setTrigInfo(const std::string trigger){ parseTriggerName(trigger,"Loose",isL1,type,etthr,l1thr,l1type,l1item,pidname,etcut,perf); // Determines probe PID from trigger - std::string decorator="is"+pidname; + std::string decorator="is"+pidname; // isolation types - if (boost::contains(trigger,"iloose") || boost::contains(trigger, "ivarloose") || - boost::contains(trigger,"ivarmedium") || boost::contains(trigger, "ivartight") || + if (boost::contains(trigger,"iloose") || boost::contains(trigger, "ivarloose") || + boost::contains(trigger,"ivarmedium") || boost::contains(trigger, "ivartight") || boost::contains(trigger,"icaloloose") || boost::contains(trigger, "icalomedium") || boost::contains(trigger,"icalotight") ) isolation = true; if (boost::contains(trigger,"idperf") ) idperf = true; if (boost::contains(trigger,"HLTCalo")) hltcalo = true; - + // Apply L2Calo ringer? - if (boost::contains(trigger,"noringer") ) + if (boost::contains(trigger,"noringer") ) ringer = false; - else if ( boost::contains(trigger,"ringer") || m_doRinger) + else if ( boost::contains(trigger,"ringer") ) + ringer = true; + else if ( etthr >= 15.0 && m_doRinger ) + ringer = true; + else if ( etthr < 15.0 && m_doRinger && m_doRingerBelow15GeV ) ringer = true; else ringer =false; @@ -634,7 +694,7 @@ void TrigEgammaEmulationTool::setTrigInfo(const std::string trigger){ if(isL1) etthr=l1thr; // Should be handled elsewhere std::string strEtthr = boost::lexical_cast<std::string>(etthr); Trig::Info info{trigger,type,strEtthr,l1item,l1type,pidname,decorator,lhinfo,isolation,isL1,perf, - idperf,hltcalo,ringer,etcut,m_doL2ElectronFex,m_doEFCaloPid,etthr,l1thr}; + idperf,hltcalo,ringer,etcut,m_doL2ElectronFex,m_doEFCaloPid,etthr,l1thr,etthr}; m_trigInfo.insert(std::pair<std::string,Trig::Info>(trigger, info)); ATH_MSG_DEBUG("Inserting trigger: " << trigger << ", completed."); } @@ -703,7 +763,7 @@ void TrigEgammaEmulationTool::parseTriggerName(const std::string trigger, std::s //Get the L1 information if(!boost::contains(strs.back(),"L1")) strs.push_back(l1item); - + if(boost::contains(strs.back(),"L1")){ std::string l1info = strs.back(); @@ -731,7 +791,7 @@ std::string TrigEgammaEmulationTool::getL1Item(std::string trigger){ std::string L1_seed = ""; if(trig_conf != nullptr){ ATH_MSG_DEBUG("TrigConf available"); - L1_seed = trig_conf->lower_chain_name(); //L1 trigger seed + L1_seed = trig_conf->lower_chain_name(); //L1 trigger seed boost::replace_all( L1_seed, "_", "" ); }else{ ATH_MSG_WARNING("There is no L1 Seed for this trigger "<< trigger); @@ -767,17 +827,26 @@ void TrigEgammaEmulationTool::match(const xAOD::Egamma *el, const HLT::Trigger unsigned nobj1,nobj2; nobj1=nobj2=0; + for(auto& trigItem : m_supportingTrigList){ // Trigger match using Matching tool m_matchTool->match(el, trigItem, feat); if(feat){// If has a match! + + ATH_MSG_DEBUG("AKI, match with " << trigItem ); + if(te_external){ nobj2=0; if(getFeature<xAOD::ElectronContainer>(feat) ) nobj2++; // HLT + ATH_MSG_DEBUG("Electron " << nobj2); if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj2++; // EFCalo + ATH_MSG_DEBUG("Calo " << nobj2); if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj2++; // L2 + ATH_MSG_DEBUG("TrigElectron " << nobj2); if(getFeature<xAOD::TrigEMCluster>(feat) ) nobj2++; // L2Calo + ATH_MSG_DEBUG("Cluster " << nobj2); if(getFeature<xAOD::EmTauRoI>(feat) ) nobj2++; // L2Calo + ATH_MSG_DEBUG("L1 " << nobj2); if(nobj2>nobj1){ te_external=feat; nobj1=nobj2; @@ -785,15 +854,20 @@ void TrigEgammaEmulationTool::match(const xAOD::Egamma *el, const HLT::Trigger //ATH_MSG_INFO("ET = " << getFeature<xAOD::TrigEMCluster>(te_external)->et()); }else{ if(getFeature<xAOD::ElectronContainer>(feat) ) nobj1++; // HLT + ATH_MSG_DEBUG("Electron " << nobj1); if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj1++; // EFCalo + ATH_MSG_DEBUG("Calo " << nobj1); if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj1++; // L2 + ATH_MSG_DEBUG("TrigElectron " << nobj1); if(getFeature<xAOD::TrigEMCluster>(feat) ) nobj1++; // L2Calo + ATH_MSG_DEBUG("Cluster " << nobj1); if(getFeature<xAOD::EmTauRoI>(feat) ) nobj1++; // L2Calo + ATH_MSG_DEBUG("L1 " << nobj1); te_external=feat; } } - ATH_MSG_DEBUG("Electron with ET = " << el->pt()*1e-3 << " GeV match with " << trigItem + ATH_MSG_DEBUG("Electron with ET = " << el->pt()*1e-3 << " GeV match with " << trigItem << " is good? " << (te_external?"yes":"no") << " and has " << nobj1 << " features."); // All objects is needed diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaIsolationSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaIsolationSelectorTool.cxx index eb83a570723f..f86173461940 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaIsolationSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaIsolationSelectorTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** @@ -105,10 +105,10 @@ StatusCode TrigEgammaIsolationSelectorTool::initialize() { if (!m_trackIsolationTool.empty()){ ATH_MSG_DEBUG("Retrieve TrackIsolationTool"); if(m_trackIsolationTool.retrieve().isFailure()){ - ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool); - return StatusCode::FAILURE; + ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool); + return StatusCode::FAILURE; } else { - ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool); + ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool); } } @@ -149,7 +149,7 @@ bool TrigEgammaIsolationSelectorTool::emulation(const xAOD::IParticle* part, boo //} // Declare vectors of isolation variables for different cone sizes - std::vector<float> EtCone, PtCone_xAOD, PtCone, recalc_PtCone, recalc_PtVarCone, PtCone_recalculated; //, PtCone_recalculated_fixed; + std::vector<float> EtCone, PtCone_xAOD, PtCone, _m_PtCone, _m_PtVarCone, PtCone_recalculated; //, PtCone_recalculated_fixed; float val=-99; el->isolationValue(val,xAOD::Iso::etcone20); //ATH_MSG_DEBUG("el->isolationValue(val,xAOD::Iso::etcone20) = " << val); @@ -205,8 +205,8 @@ bool TrigEgammaIsolationSelectorTool::emulation(const xAOD::IParticle* part, boo //const ElementLink< TrackParticleContainer* > link = el->trackParticleLink( /*0 this is the index of trackparticle*/ ); //then I think it is // std::str ld = link.dataID(); - std::string trk_container = el->trackParticleLink().dataID(); - ATH_MSG_DEBUG("TRacks linked to " << trk_container << " container"); + std::string m_trk_container = el->trackParticleLink().dataID(); + ATH_MSG_DEBUG("TRacks linked to " << m_trk_container << " container"); ////that @brief Return the SG key that we reference, as a string. // const std::set<const xAOD::TrackParticle*> tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(el, false); @@ -216,37 +216,37 @@ bool TrigEgammaIsolationSelectorTool::emulation(const xAOD::IParticle* part, boo const xAOD::TrackParticleContainer *TrackParticleContainer=0; - if ( (m_storeGate->retrieve(TrackParticleContainer,trk_container)).isFailure() ){ + if ( (m_storeGate->retrieve(TrackParticleContainer,m_trk_container)).isFailure() ){ ATH_MSG_ERROR("Failed to retrieve EF ID trackParticles "); return false; } else { - ATH_MSG_DEBUG("Retrieved EF ID trackParticles " << trk_container << " of size " << TrackParticleContainer->size()); + ATH_MSG_DEBUG("Retrieved EF ID trackParticles " << m_trk_container << " of size " << TrackParticleContainer->size()); } std::vector<const xAOD::TrackParticleContainer*> vectorTrackParticleContainer; vectorTrackParticleContainer.push_back(TrackParticleContainer); xAOD::TrackIsolation result; - recalc_PtCone.clear(); - recalc_PtVarCone.clear(); + _m_PtCone.clear(); + _m_PtVarCone.clear(); if(m_trackIsolationTool->trackIsolation(result, *el, isoTypes, corrlist, leadTrkVtx, &tracksToExclude, TrackParticleContainer)){ for(unsigned int i=0; i<isoTypes.size(); i++){ - recalc_PtCone.push_back(result.ptcones[i]); - recalc_PtVarCone.push_back(result.ptvarcones_10GeVDivPt[i]); + _m_PtCone.push_back(result.ptcones[i]); + _m_PtVarCone.push_back(result.ptvarcones_10GeVDivPt[i]); } } else { ATH_MSG_ERROR("Hey!!!! Something wrong! Couldn't run TrackIsolationTool " << m_trackIsolationTool); } - // So recalc_PtCone has the result of ptcone40,30,20 and recalc_PtVarCone result of ptvarcone40,30,20 (requested in this order by the tool). So lets build PtCone_recalculated to have (as PtCone) results of ptcone20 30 40 and ptvarcone20 30 40 + // So _m_PtCone has the result of ptcone40,30,20 and _m_PtVarCone result of ptvarcone40,30,20 (requested in this order by the tool). So lets build PtCone_recalculated to have (as PtCone) results of ptcone20 30 40 and ptvarcone20 30 40 - PtCone_recalculated.push_back( recalc_PtCone[2] ); - PtCone_recalculated.push_back( recalc_PtCone[1] ); - PtCone_recalculated.push_back( recalc_PtCone[0] ); - PtCone_recalculated.push_back( recalc_PtVarCone[2] ); - PtCone_recalculated.push_back( recalc_PtVarCone[1] ); - PtCone_recalculated.push_back( recalc_PtVarCone[0] ); + PtCone_recalculated.push_back( _m_PtCone[2] ); + PtCone_recalculated.push_back( _m_PtCone[1] ); + PtCone_recalculated.push_back( _m_PtCone[0] ); + PtCone_recalculated.push_back( _m_PtVarCone[2] ); + PtCone_recalculated.push_back( _m_PtVarCone[1] ); + PtCone_recalculated.push_back( _m_PtVarCone[0] ); if (m_useTrackIsolationTool){ // If we decide to use rRackIsolation Tool then instead of stored ptCone we will use this recalculated @@ -411,4 +411,3 @@ bool TrigEgammaIsolationSelectorTool::emulation(const xAOD::IParticle* part, boo return true; } - diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL1SelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL1SelectorTool.cxx index a360862f2f80..277d26062fca 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL1SelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL1SelectorTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ /********************************************************************** * AsgTool: TrigEgammaL1SelectorTool @@ -26,15 +26,14 @@ TrigEgammaL1SelectorTool( const std::string& myname ) : TrigEgammaSelectorBaseTool(myname) { // L1 configuration parameters - declareProperty( "WPNames" , m_wpNames ); // must be: ["T","M","L"] (Tight,Medium and Loose) - declareProperty( "HadCoreCutMin", m_hadCoreCutMin ); // must be a list with for values: (default,tight,medium and loose) - declareProperty( "HadCoreCutOff", m_hadCoreCutOff ); - declareProperty( "HadCoreSlope" , m_hadCoreSlope ); - declareProperty( "EmIsolCutMin" , m_emIsolCutMin ); - declareProperty( "EmIsolCutOff" , m_emIsolCutOff ); - declareProperty( "EmIsolSlope" , m_emIsolCutSlope ); - declareProperty( "IsolCutMax" , m_isolMaxCut = 50 ); - + declareProperty( "WPNames" , m_wpNames ); // must be: ["T","M","L"] (Tight,Medium and Loose) + declareProperty( "HadCoreCutMin", m_hadCoreCutMin ); // must be a list with for values: (default,tight,medium and loose) + declareProperty( "HadCoreCutOff", m_hadCoreCutOff ); + declareProperty( "HadCoreSlope" , m_hadCoreSlope ); + declareProperty( "EmIsolCutMin" , m_emIsolCutMin ); + declareProperty( "EmIsolCutOff" , m_emIsolCutOff ); + declareProperty( "EmIsolSlope" , m_emIsolCutSlope ); + declareProperty( "IsolCutMax" , m_isolMaxCut = 50 ); } //********************************************************************** StatusCode TrigEgammaL1SelectorTool::initialize() { @@ -61,6 +60,8 @@ bool TrigEgammaL1SelectorTool::emulation( const xAOD::EmTauRoI* l1, bool &pass, return false; } + + //Retrieve L1 informations std::string l1type = info.L1Type; std::string L1Item = info.L1Item; @@ -70,6 +71,8 @@ bool TrigEgammaL1SelectorTool::emulation( const xAOD::EmTauRoI* l1, bool &pass, ATH_MSG_DEBUG("L1 type = " << l1type); ATH_MSG_DEBUG("L1 Item = " << L1Item); + + unsigned c=0; if(boost::contains(l1type,m_wpNames[0])) c=1; // Tight if(boost::contains(l1type,m_wpNames[1])) c=2; // Medium diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL2CaloRingerSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL2CaloRingerSelectorTool.cxx index e4fb9df3e559..e6ec98c95d39 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL2CaloRingerSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaL2CaloRingerSelectorTool.cxx @@ -26,11 +26,8 @@ using namespace Trig; TrigEgammaL2CaloRingerSelectorTool:: TrigEgammaL2CaloRingerSelectorTool( const std::string& myname ) : TrigEgammaSelectorBaseTool(myname), - m_reader("TrigCaloRingerReader") + m_selectorTool() { - declareProperty("NormalisationRings", m_normRings ); - declareProperty("SectionRings" , m_sectionRings ); - declareProperty("NRings" , m_nRings ); declareProperty("CalibPathConstants", m_calibPath_constants="" ); declareProperty("CalibPathThresholds", m_calibPath_thresholds="" ); @@ -47,76 +44,19 @@ StatusCode TrigEgammaL2CaloRingerSelectorTool::initialize() { ATH_MSG_WARNING("TrigEgammaSelectorBaseTool::initialize() failed"); return StatusCode::FAILURE; } + m_selectorTool.setConstantsCalibPath( m_calibPath_constants ); + m_selectorTool.setThresholdsCalibPath( m_calibPath_thresholds ); - if(!m_calibPath_thresholds.empty()){ - if(!m_reader.retrieve(m_calibPath_thresholds, m_cutDefs)){ - ATH_MSG_ERROR("Can not retrieve the information from " << m_calibPath_thresholds); - return StatusCode::FAILURE; - } - // retrieve metadata - m_useNoActivationFunctionInTheLastLayer = m_reader.useNoActivationFunctionInTheLastLayer(); - m_doPileupCorrection = m_reader.doPileupCorrection(); - m_lumiCut = m_reader.lumiCut(); - } - - // Retrieve the NeuralNetwork list - if(!m_calibPath_constants.empty()){ - if(!m_reader.retrieve(m_calibPath_constants, m_discriminators)){ - ATH_MSG_ERROR("Can not retrieve all information from " << m_calibPath_constants); - return StatusCode::FAILURE; - } - m_useLumiVar = m_reader.useLumiVar(); - m_useEtaVar = m_reader.useEtaVar(); - } - - if(m_nRings.size() != m_normRings.size()){ - ATH_MSG_ERROR("Preproc nRings list dont match with the number of discriminators found"); + if(!m_selectorTool.initialize()) return StatusCode::FAILURE; - } - - if(m_sectionRings.size() != m_normRings.size()){ - ATH_MSG_ERROR("Preproc section rings list dont match with the number of discriminators found"); - return StatusCode::FAILURE; - } - - ///TODO: This is default for now, apply this into the conf file for future - ///Initialize all discriminators - for(unsigned i=0; i<m_discriminators.size(); ++i) - { - TrigRingerPreprocessor *preproc; - try{ - preproc = new TrigRingerPreprocessor(m_nRings,m_normRings,m_sectionRings); - }catch(const std::bad_alloc& xa){ - ATH_MSG_ERROR( "Bad alloc for TrigRingerPrepoc." ); - return StatusCode::FAILURE; - } - ///Hold the pointer configuration - m_preproc.push_back(preproc); - }///Loop over discriminators - - ATH_MSG_INFO("Using the Luminosity tool? " << (m_useLumiTool ? "Yes":"No") ); - ATH_MSG_INFO("Using lumiVar? " << (m_useLumiVar ? "Yes":"No") ); - ATH_MSG_INFO("Using etaVar? " << (m_useEtaVar ? "Yes":"No") ); - ATH_MSG_INFO("Using the activation function in the last layer? " << (m_useNoActivationFunctionInTheLastLayer ? "No":"Yes") ); - ATH_MSG_INFO("Using the Correction? " << (m_doPileupCorrection ? "Yes":"No") ); - ATH_MSG_INFO("Using lumi threshold equal: " << m_lumiCut); - ATH_MSG_INFO("TrigL2CaloRingerHypo initialization completed successfully." ); + return StatusCode::SUCCESS; } //!========================================================================== StatusCode TrigEgammaL2CaloRingerSelectorTool::finalize() { - //release memory - for(unsigned i=0; i<m_discriminators.size();++i){ - if(m_preproc.at(i)) delete m_preproc.at(i); - if(m_discriminators.at(i)) delete m_discriminators.at(i); - }//Loop over all discriminators and prepoc objects - - for(unsigned i=0; i < m_cutDefs.size();++i){ - if(m_cutDefs.at(i)) delete m_cutDefs.at(i); - }//Loop over all cutDefs objects ATH_MSG_DEBUG("TrigL2CaloRingerHypo finalization completed successfully."); return StatusCode::SUCCESS; @@ -147,9 +87,6 @@ bool TrigEgammaL2CaloRingerSelectorTool::emulation(const xAOD::TrigEMCluster* em ///It's ready to select the correct eta/et bin - MultiLayerPerceptron *discr = nullptr; - TrigRingerPreprocessor *preproc = nullptr; - float eta = std::fabs(emCluster->eta()); if(eta>2.50) eta=2.50;///fix for events out of the ranger float et = emCluster->et()*1e-3; ///in GeV @@ -159,86 +96,20 @@ bool TrigEgammaL2CaloRingerSelectorTool::emulation(const xAOD::TrigEMCluster* em ATH_MSG_DEBUG("Event reproved by Et threshold. Et = " << et << ", EtCut = "<< m_etCut); return true; } + auto avgmu = getOnlAverageMu(); + + const std::vector<float> rings = ringer->rings(); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + + + m_output = m_selectorTool.calculate( refRings, et, eta, avgmu ); + pass = m_selectorTool.accept(m_output, et,eta,avgmu); + + emCluster->auxdecor<float>("TrigEgammaL2CaloRingerSelectorTool_rnnOutput")=m_output; - if(m_discriminators.size() > 0){ - unsigned discr_index=0; - for(unsigned i=0; i<m_discriminators.size(); ++i){ - discr_index++; - if(et > m_discriminators[i]->etmin() && et <= m_discriminators[i]->etmax()){ - if(eta > m_discriminators[i]->etamin() && eta <= m_discriminators[i]->etamax()){ - discr = m_discriminators[i]; - preproc = m_preproc[i]; - break; - }///eta conditions - }///Et conditions - }///Loop over discriminators - - ///get shape - const std::vector<float> rings = ringer->rings(); - ATH_MSG_DEBUG( "ringer->rings().size() is: " <<rings.size()); - std::vector<float> refRings(rings.size()); - refRings.assign(rings.begin(), rings.end()); - ATH_MSG_DEBUG("Et = " << et << " GeV, |eta| = " << eta); - - if(preproc) preproc->ppExecute(refRings); - ///Apply the discriminator - if(discr){ - - float avgmu = getOnlAverageMu(); - float threshold=0.0; - - // Add extra variables in this order! Do not change this!!! - if(m_useEtaVar){ - if(preproc){ - refRings.push_back(preproc->normalize_eta(emCluster->eta(), discr->etamin(), discr->etamax())); - } - } - - if(m_useLumiVar){ - if(preproc){ - refRings.push_back(preproc->normalize_mu(avgmu, m_lumiCut)); - } - } - - m_output = discr->propagate(refRings); - if(m_useNoActivationFunctionInTheLastLayer){ - // overwrite the output value to before the tansig function - m_output = discr->getOutputBeforeTheActivationFunction(); - } - - //Apply cut - for(unsigned i=0; i < m_cutDefs.size(); ++i){ - if((et > m_cutDefs[i]->etmin()) && (et <= m_cutDefs[i]->etmax())){ - if((eta > m_cutDefs[i]->etamin()) && (eta <= m_cutDefs[i]->etamax())){ - - if(m_doPileupCorrection){ - // Limited Pileup - if(avgmu>m_lumiCut) - avgmu=m_lumiCut; - ATH_MSG_DEBUG("Apply avgmu == " << avgmu); - threshold = m_cutDefs[i]->threshold(avgmu); - ATH_MSG_DEBUG("With correction, thr = "<<threshold); - }else{ - threshold = m_cutDefs[i]->threshold(); - ATH_MSG_DEBUG("Without correction, thr = "<<threshold); - } - } - } - }// Loop over cutDefs - - emCluster->auxdecor<float>("TrigEgammaL2CaloRingerSelectorTool_rnnOutput")=m_output; - - if(m_output < threshold){ - ATH_MSG_DEBUG("Event reproved by discriminator."); - return true; - } - } - }else{ - ATH_MSG_DEBUG("There is no discriminator into this Fex."); - }// ATH_MSG_DEBUG("Et = " << et << " GeV, |eta| = " << eta << " and rnnoutput = " << m_output ); - pass=true; return true; } //!=========================================================================== diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaSelectorBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaSelectorBaseTool.cxx index ad99a4a35afd..44204e010ce5 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaSelectorBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaSelectorBaseTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #include "TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h" diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaEmulationTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaEmulationTool.h index 33c6287e062b..e38aab429f6a 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaEmulationTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaEmulationTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef ITrigEgammaEmulationTool_H_ @@ -52,6 +52,7 @@ namespace Trig{ virtual void ExperimentalAndExpertMethods()=0; virtual void match( const xAOD::Egamma *, const HLT::TriggerElement *&)=0; virtual const HLT::TriggerElement* getTEMatched()=0; + virtual bool emulationL2Calo(const xAOD::TrigEMCluster *, std::string)=0; private: }; } diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h index 295ede74a2fc..b0eef13fb15e 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef ITrigEgammaSelectorBaseTool_H_ @@ -35,7 +35,6 @@ #include "boost/any.hpp" - namespace Trig{ class ITrigEgammaSelectorBaseTool : public virtual asg::IAsgTool { ASG_TOOL_INTERFACE( Trig::ITrigEgammaSelectorBaseTool ) diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h index 75cb56f730c6..1a7de4802d59 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaEFCaloSelectorTool_H @@ -10,7 +10,10 @@ #include "TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h" #include "AsgTools/AsgTool.h" #include "EgammaAnalysisInterfaces/IAsgElectronIsEMSelector.h" +//#include "ElectronPhotonSelectorTools/IAsgPhotonIsEMSelector.h" #include "EgammaAnalysisInterfaces/IAsgElectronLikelihoodTool.h" +//#include "egammaInterfaces/IEMFourMomBuilder.h" +//#include "egammaInterfaces/IEMShowerBuilder.h" #include <vector> namespace Trig{ diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFElectronSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFElectronSelectorTool.h index b7fada3b823b..1e8726c342f8 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFElectronSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFElectronSelectorTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaEFElectronSelectorTool_H diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFPhotonSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFPhotonSelectorTool.h index 3490d2ae5e7c..1a5fe620ee25 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFPhotonSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFPhotonSelectorTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaEFPhotonSelectorTool_H diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h index 5b7432c13378..d0946b0e49cf 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaEmulationTool_H @@ -9,8 +9,6 @@ #include "TrigEgammaEmulationTool/ITrigEgammaEmulationTool.h" #include "TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h" #include "AsgTools/AsgTool.h" -#include "PATCore/AcceptInfo.h" -#include "PATCore/AcceptData.h" #include "AthContainers/AuxElement.h" #include "TrigDecisionTool/TrigDecisionTool.h" #include "TrigEgammaMatchingTool/ITrigEgammaMatchingTool.h" @@ -40,28 +38,30 @@ class TrigEgammaEmulationTool //****************************************************************************** TrigEgammaEmulationTool(const std::string& myname); - virtual ~TrigEgammaEmulationTool() {}; + ~TrigEgammaEmulationTool() {}; - virtual StatusCode initialize() override; - virtual StatusCode execute() override; - virtual StatusCode finalize() override; + StatusCode initialize() override; + StatusCode execute() override; + StatusCode finalize() override; //execute all emulators - virtual asg::AcceptData executeTool( const std::string &) override; - virtual asg::AcceptData executeTool( const HLT::TriggerElement *, const std::string &) override; - virtual const asg::AcceptInfo& getAccept() const override {return m_accept;} - - virtual bool EventWiseContainer() override; - virtual bool isPassed(const std::string&) override; - virtual bool isPassed(const std::string&, const std::string&) override; + asg::AcceptData executeTool( const std::string &) override; + asg::AcceptData executeTool( const HLT::TriggerElement *, const std::string &) override; + const asg::AcceptInfo& getAccept() const override{return m_accept;}; + + bool EventWiseContainer() override; + bool isPassed(const std::string&) override; + bool isPassed(const std::string&, const std::string&) override; - /* Experimental methods */ - virtual void ExperimentalAndExpertMethods() override {m_experimentalAndExpertMethods=true;}; + void ExperimentalAndExpertMethods() override {m_experimentalAndExpertMethods=true;}; - virtual void match( const xAOD::Egamma *, const HLT::TriggerElement *&) override; - virtual const HLT::TriggerElement* getTEMatched() override {return m_teMatched;}; + void match( const xAOD::Egamma *, const HLT::TriggerElement *&) override; + const HLT::TriggerElement* getTEMatched() override {return m_teMatched;}; + + // expert usage + bool emulationL2Calo(const xAOD::TrigEMCluster *emCluster, std::string pidname) override; private: @@ -71,6 +71,7 @@ class TrigEgammaEmulationTool /* Retrieve features from trigger element */ template<class T> const T* getFeature(const HLT::TriggerElement* te, const std::string key=""); + template<class T> bool ancestorPassed(const HLT::TriggerElement* te,const std::string key=""); /* Set trigInfo into the map*/ void setTrigInfo(const std::string ); /*! get trigInfo obj */ @@ -88,12 +89,12 @@ class TrigEgammaEmulationTool bool m_doL2ElectronFex; bool m_doEFCaloPid; bool m_doRinger; + bool m_doRingerBelow15GeV; bool m_experimentalAndExpertMethods; std::string m_offElContKey; std::vector<std::string> m_trigList; std::vector<std::string> m_supportingTrigList; std::map<std::string, Trig::Info> m_trigInfo; - asg::AcceptInfo m_accept; StoreGateSvc *m_storeGate; ToolHandle<Trig::TrigDecisionTool> m_trigdec; @@ -127,6 +128,17 @@ class TrigEgammaEmulationTool return NULL; return ( (m_trigdec->ancestor<T>(te)).cptr() ); } + + template<class T> + bool + TrigEgammaEmulationTool::ancestorPassed(const HLT::TriggerElement* te,const std::string key){ + if ( te == NULL ) return false; + if ( (m_trigdec->ancestor<T>(te,key)).te() == NULL ) + return false; + return ( (m_trigdec->ancestor<T>(te)).te()->getActiveState()); + } + + //************************************************************************************************ }//namespace diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaInfo.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaInfo.h index 3a739a405715..05e1e7e632e0 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaInfo.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaInfo.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaEmulationTool_TrigEgammaInfo_H #define TrigEgammaEmulationTool_TrigEgammaInfo_H @@ -29,7 +29,7 @@ namespace Trig{ bool applyEFCaloPid; float thrHLT; // HLT Et threshold float thrL1; // L1 Et threshold - + float thrL2Calo; }; } #endif diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaIsolationSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaIsolationSelectorTool.h index 073668a02efe..b30b78504e49 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaIsolationSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaIsolationSelectorTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaIsolationSelectorTool_H @@ -61,3 +61,4 @@ class TrigEgammaIsolationSelectorTool: }//namespace #endif + diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL1SelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL1SelectorTool.h index 394b5a179c10..40b77b2c806b 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL1SelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL1SelectorTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaL1SelectorTool_H @@ -45,7 +45,6 @@ class TrigEgammaL1SelectorTool: std::vector<float> m_emIsolCutOff; std::vector<float> m_emIsolCutSlope; std::vector<std::string> m_wpNames; - }; }//namespace diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL2CaloRingerSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL2CaloRingerSelectorTool.h index 5422c5201f8a..78c87a545fd7 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL2CaloRingerSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaL2CaloRingerSelectorTool.h @@ -8,10 +8,7 @@ #include "TrigEgammaEmulationTool/ITrigEgammaSelectorBaseTool.h" #include "TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h" -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" -#include "TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" +#include "TrigMultiVarHypo/tools/RingerSelectorTool.h" #include "AsgTools/AsgTool.h" #include <vector> @@ -33,14 +30,8 @@ class TrigEgammaL2CaloRingerSelectorTool: bool emulation( const xAOD::TrigEMCluster*, bool &, const Trig::Info &); private: - ///Thresholds Holder - std::vector<TrigCaloRingsHelper::CutDefsHelper*> m_cutDefs; - ///Discriminator holder - std::vector<MultiLayerPerceptron*> m_discriminators; - ///Pre-processing holder - std::vector<TrigRingerPreprocessor*> m_preproc; - TrigL2CaloRingerReader m_reader; + Ringer::RingerSelectorTool m_selectorTool; /* Helper method to retrieve the bins from an index */ //void index_to_et_eta_bins(unsigned, unsigned &, unsigned &); @@ -55,10 +46,6 @@ class TrigEgammaL2CaloRingerSelectorTool: bool m_useNoActivationFunctionInTheLastLayer; bool m_useLumiTool; - //Prepoc configuration - std::vector<unsigned int> m_nRings; - std::vector<unsigned int> m_normRings; - std::vector<unsigned int> m_sectionRings; //Discriminator configuration std::string m_calibPath_constants, m_calibPath_thresholds; diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h index c7fa707f925d..d6c743d035bd 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ + * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * */ #ifndef TrigEgammaSelectorBaseTool_H_ @@ -22,17 +22,6 @@ //#include "xAODCaloRings/tools/getCaloRingsDecorator.h" // - -//define RINGER_OFFLINE_PACKAGES -#ifdef RINGER_OFFLINE_PACKAGES -//////////////////////// Ringer Offline ////////////////////////// -#include "xAODCaloRings/RingSetContainer.h" // -#include "xAODCaloRings/CaloRingsContainer.h" // -#include "xAODCaloRings/tools/getCaloRingsDecorator.h" // -////////////////////////////////////////////////////////////////// -#endif - - namespace Trig{ class TrigEgammaSelectorBaseTool: public asg::AsgTool, @@ -43,25 +32,25 @@ namespace Trig{ //using ITrigEgammaSelectorBaseTool::emulation; TrigEgammaSelectorBaseTool(const std::string& myname); - virtual ~TrigEgammaSelectorBaseTool(){;} + ~TrigEgammaSelectorBaseTool(){;} - virtual StatusCode initialize() override; - virtual StatusCode finalize() override; + StatusCode initialize(); + StatusCode finalize(); //FIXME: static_cast for IParticleContainer to EmTau and emCluster //doent work. Because this I add these extra methods. Need to check //how generate this for these levels. - virtual bool emulation(const xAOD::EmTauRoI *, bool&, const Trig::Info &) override {return true;} - virtual bool emulation(const xAOD::TrigEMCluster *, bool&, const Trig::Info &) override {return true;} - virtual bool emulation(const xAOD::IParticle *, bool&, const Trig::Info &) override {return true;} - virtual bool emulation(const xAOD::IParticleContainer *, bool&, const Trig::Info &) override {return true;} + bool emulation(const xAOD::EmTauRoI *, bool&, const Trig::Info &){return true;}; + bool emulation(const xAOD::TrigEMCluster *, bool&, const Trig::Info &){return true;}; + bool emulation(const xAOD::IParticle *, bool&, const Trig::Info &){return true;}; + bool emulation(const xAOD::IParticleContainer *, bool&, const Trig::Info &){return true;}; //parser TDT tool as a pointer - virtual void setParents(ToolHandle<Trig::TrigDecisionTool> &t, StoreGateSvc *s) override - { m_trigdec=&(*t); m_storeGate=s;} - virtual void setParents(Trig::TrigDecisionTool *t, StoreGateSvc *s) override - { m_trigdec=t; m_storeGate=s;} - virtual void setTe(const HLT::TriggerElement *te) override {m_te=te;} + void setParents(ToolHandle<Trig::TrigDecisionTool> &t, StoreGateSvc *s) + { m_trigdec=&(*t); m_storeGate=s;}; + void setParents(Trig::TrigDecisionTool *t, StoreGateSvc *s) + { m_trigdec=t; m_storeGate=s;}; + void setTe(const HLT::TriggerElement *te){m_te=te;}; protected: /* dress decision */ diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationEFConfig.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationEFConfig.py index b639b090cee4..32bad9c316e8 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationEFConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationEFConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration from AthenaCommon import CfgMgr from AthenaCommon.AppMgr import ToolSvc @@ -17,7 +17,11 @@ ElectronPidTools() PhotonPidTools() #*********************************************************************** +OutputLevel=0 +# Track isolation -- remember to add TrackIsolation as a property of the class +#from IsolationTool.IsolationToolConf import xAOD__CaloIsolationTool,xAOD__TrackIsolationTool +#TrackIsolationTool = ToolFactory(xAOD__TrackIsolationTool, name = 'TrigEgammaTrackIsolationTool') #TrkIsoCfg = CfgMgr.xAOD__TrackIsolationTool('TrigEgammaTrackIsolationTool') #TrkIsoCfg.TrackSelectionTool.maxZ0SinTheta = 3. #TrkIsoCfg.TrackSelectionTool.minPt = 1000. diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py index e99c6a8ad1de..652d2222337e 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py @@ -1,5 +1,3 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration - def createIsoToolElectronSelector(): from AthenaCommon.AppMgr import ToolSvc @@ -58,3 +56,4 @@ def createIsoToolElectronSelector(): RelPtConeCut = isolation_dict[wp] if trkiso else [-1,-1,-1,-1,-1,-1], return IsoToolSelectors + diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationL2Config.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationL2Config.py index 906067a63294..75e49f2fd786 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationL2Config.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationL2Config.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration from egammaRec.Factories import ToolFactory,FcnWrapper,AlgFactory, getPropertyValue @@ -11,49 +11,68 @@ from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import OutputLevel from TrigEgammaHypo.TrigL2CaloHypoCutDefs import L2CaloCutMaps # define eta bins EtaBins = [0.00, 0.60, 0.80, 1.15, 1.37, 1.52, 1.81, 2.01, 2.37, 2.47] -theCutMaps = L2CaloCutMaps(22) -# create L2Calo tool -EgammaL2CaloLooseEmulator = ToolFactory(Trig__TrigEgammaL2CaloSelectorTool, - OutputLevel = OutputLevel, - name = "TrigEgammaL2CaloLooseEmulator", - HADETthr = theCutMaps.MapsHADETthr["loose"], - CARCOREthr = theCutMaps.MapsCARCOREthr["loose"], - CAERATIOthr = theCutMaps.MapsCAERATIOthr["loose"], - EtaBins = EtaBins , - dETACLUSTERthr = 0.1, - dPHICLUSTERthr = 0.1, - ET2thr = 90.0*GeV, - F1thr = 0.005) -#******************************************************************************** -# VeryLoose -EgammaL2CaloVeryLooseEmulator = EgammaL2CaloLooseEmulator.copy( - name = "TrigEgammaL2CaloVeryLooseEmulator", - OutputLevel = OutputLevel, - HADETthr = theCutMaps.MapsHADETthr['vloose'], - CARCOREthr = theCutMaps.MapsCARCOREthr['vloose'], - CAERATIOthr = theCutMaps.MapsCAERATIOthr['vloose']) - -#******************************************************************************** -# Medium -EgammaL2CaloMediumEmulator = EgammaL2CaloLooseEmulator.copy( - name = "TrigEgammaL2CaloMediumEmulator", - OutputLevel = OutputLevel, - HADETthr = theCutMaps.MapsHADETthr['medium'], - CARCOREthr = theCutMaps.MapsCARCOREthr['medium'], - CAERATIOthr = theCutMaps.MapsCAERATIOthr['medium']) +# Do not change this order. +#etBins = [0,22,999] +etBins = [0.0,15.0,28.] # Same from rDev Selector + +EgammaL2CaloSelectors = [] + +for idx, et in enumerate(etBins): + + theCutMaps = L2CaloCutMaps(et) + # create L2Calo tool + EgammaL2CaloLooseEmulator = ToolFactory(Trig__TrigEgammaL2CaloSelectorTool, + OutputLevel = OutputLevel, + name = "TrigEgammaL2CaloLooseEmulator_etBin_"+str(idx), + HADETthr = theCutMaps.MapsHADETthr["loose"], + CARCOREthr = theCutMaps.MapsCARCOREthr["loose"], + CAERATIOthr = theCutMaps.MapsCAERATIOthr["loose"], + EtaBins = EtaBins , + dETACLUSTERthr = 0.1, + dPHICLUSTERthr = 0.1, + ET2thr = 90.0*GeV, + F1thr = 0.005) + + + #******************************************************************************** + # VeryLoose + EgammaL2CaloVeryLooseEmulator = EgammaL2CaloLooseEmulator.copy( + name = "TrigEgammaL2CaloVeryLooseEmulator_etBin_"+str(idx), + OutputLevel = OutputLevel, + HADETthr = theCutMaps.MapsHADETthr['vloose'], + CARCOREthr = theCutMaps.MapsCARCOREthr['vloose'], + CAERATIOthr = theCutMaps.MapsCAERATIOthr['vloose']) + + + #******************************************************************************** + # Medium + EgammaL2CaloMediumEmulator = EgammaL2CaloLooseEmulator.copy( + name = "TrigEgammaL2CaloMediumEmulator_etBin_"+str(idx), + OutputLevel = OutputLevel, + HADETthr = theCutMaps.MapsHADETthr['medium'], + CARCOREthr = theCutMaps.MapsCARCOREthr['medium'], + CAERATIOthr = theCutMaps.MapsCAERATIOthr['medium']) + + + #******************************************************************************** + # Tight + EgammaL2CaloTightEmulator = EgammaL2CaloLooseEmulator.copy( + name = "TrigEgammaL2CaloTightEmulator_etBin_"+str(idx), + OutputLevel = OutputLevel, + HADETthr = theCutMaps.MapsHADETthr['tight'], + CARCOREthr = theCutMaps.MapsCARCOREthr['tight'], + CAERATIOthr = theCutMaps.MapsCAERATIOthr['tight']) + + + # Do not change this order. + EgammaL2CaloSelectors.append( EgammaL2CaloTightEmulator ) + EgammaL2CaloSelectors.append( EgammaL2CaloMediumEmulator ) + EgammaL2CaloSelectors.append( EgammaL2CaloLooseEmulator ) + EgammaL2CaloSelectors.append( EgammaL2CaloVeryLooseEmulator ) #******************************************************************************** -# Tight -EgammaL2CaloTightEmulator = EgammaL2CaloLooseEmulator.copy( - name = "TrigEgammaL2CaloTightEmulator", - OutputLevel = OutputLevel, - HADETthr = theCutMaps.MapsHADETthr['tight'], - CARCOREthr = theCutMaps.MapsCARCOREthr['tight'], - CAERATIOthr = theCutMaps.MapsCAERATIOthr['tight']) - -#******************************************************************************** # L2 Electron configurations EgammaL2ElectronEmulator = ToolFactory(Trig__TrigEgammaL2ElectronSelectorTool, name = "TrigEgammaL2ElectronEmulator", diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationPidToolsConfig.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationPidToolsConfig.py index 91b2f77e62ed..2f8a02f37784 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationPidToolsConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationPidToolsConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration # # TrigEgammaPidTools # Add all pid selectors to ToolSvc diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationToolConfig.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationToolConfig.py index 5dd18d40e96d..3c963ab8750f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationToolConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationToolConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration #******************************************************************************** # @@ -9,7 +9,7 @@ # #******************************************************************************** -OutputLevel = 3 +OutputLevel = 0 from AthenaCommon.Logging import logging logger = logging.getLogger("TrigEgammaEmulationToolConfig") @@ -31,8 +31,8 @@ from ElectronPhotonSelectorTools.ElectronIsEMSelectorMapping import Electro #ToolSvc += EgammaMatchTool #***************************************************************************** -from egammaMVACalib.egammaMVACalibConf import egammaMVACalibTool -mvatool = egammaMVACalibTool("mvatool",folder="egammaMVACalib/v1") +from egammaMVACalib.egammaMVACalibConf import egammaMVATool +mvatool = egammaMVATool("mvatool",folder="egammaMVACalib/v1") ToolSvc += mvatool #***************************************************************************** @@ -72,8 +72,7 @@ EgammaL1Emulator = ToolFactory( Trig__TrigEgammaL1SelectorTool, #***************************************************************************** # L2 staff (all Asgs will be imported from the current relase) from TrigEgammaEmulationTool.TrigEgammaEmulationToolConf import Trig__TrigEgammaL2SelectorTool -from TrigEgammaEmulationTool.TrigEgammaEmulationL2Config import EgammaL2CaloVeryLooseEmulator, EgammaL2CaloLooseEmulator,\ - EgammaL2CaloMediumEmulator, EgammaL2CaloTightEmulator, EgammaL2ElectronEmulator +from TrigEgammaEmulationTool.TrigEgammaEmulationL2Config import EgammaL2CaloSelectors, EgammaL2ElectronEmulator from TrigEgammaEmulationTool.TrigEgammaEmulationL2Config import EgammaL2RingerVeryLooseEmulator, EgammaL2RingerLooseEmulator,\ EgammaL2RingerMediumEmulator, EgammaL2RingerTightEmulator @@ -81,10 +80,7 @@ from TrigEgammaEmulationTool.TrigEgammaEmulationL2Config import EgammaL2RingerVe EgammaL2Emulator = ToolFactory(Trig__TrigEgammaL2SelectorTool, name = "TrigEgammaL2EmulatorTool", OutputLevel = OutputLevel, - CaloCutIDSelectors = [ EgammaL2CaloTightEmulator , - EgammaL2CaloMediumEmulator, - EgammaL2CaloLooseEmulator, - EgammaL2CaloVeryLooseEmulator], + CaloCutIDSelectors = EgammaL2CaloSelectors , CaloRingerSelectors = [ EgammaL2RingerTightEmulator , EgammaL2RingerMediumEmulator, EgammaL2RingerLooseEmulator, @@ -96,8 +92,8 @@ from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig import EgammaEFCaloDefa EgammaEFPhotonEmulator, EgammaEFElectronNoD0Emulator -from TrigEgammaAnalysisTools.TrigEgammaProbelist import supportingTriggerList - +from TrigEgammaAnalysisTools.TrigEgammaProbelist import supportingTriggerList, monitoringTP_electron +supportingTriggerList+=monitoringTP_electron # Emulator tool # (all Asgs will be imported from the current relase) @@ -117,9 +113,10 @@ TrigEgammaEmulationTool = ToolFactory( Trig__TrigEgammaEmulationTool, #EgammaEFElectronNoDphiResEmulator, #EgammaEFElectronSmoothEmulator, ], - EFPhotonSelectorTools = [ EgammaEFPhotonEmulator], + EFPhotonSelectorTools = [ EgammaEFPhotonEmulator ], DoL2ElectronFex = True, # V7 menu DoRinger = True, # V7 menu + DoRingerBelow15GeV = False, DoEFCaloPid = False, # V7 menu ) diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/src/components/TrigEgammaEmulationTool_entries.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/src/components/TrigEgammaEmulationTool_entries.cxx index 34ac185a9d3a..5347d9bd071e 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/src/components/TrigEgammaEmulationTool_entries.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/src/components/TrigEgammaEmulationTool_entries.cxx @@ -1,3 +1,5 @@ + + #include "TrigEgammaEmulationTool/TrigEgammaEmulationTool.h" #include "TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h" #include "TrigEgammaEmulationTool/TrigEgammaL1SelectorTool.h" @@ -22,6 +24,7 @@ DECLARE_COMPONENT( Trig::TrigEgammaL2CaloRingerSelectorTool ) DECLARE_COMPONENT( Trig::TrigEgammaEFCaloSelectorTool ) DECLARE_COMPONENT( Trig::TrigEgammaEFElectronSelectorTool ) DECLARE_COMPONENT( Trig::TrigEgammaEFPhotonSelectorTool ) +DECLARE_COMPONENT( Trig::TrigEgammaIsolationSelectorTool ) DECLARE_COMPONENT( Trig::TrigEgammaEmulationToolTest ) DECLARE_COMPONENT( Trig::TrigEgammaEmulationToolAlg ) DECLARE_COMPONENT( Trig::TrigEgammaIsolationSelectorTool ) diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/CMakeLists.txt b/Trigger/TrigHypothesis/TrigMultiVarHypo/CMakeLists.txt index 70931bd15fd0..2139e2f935da 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/CMakeLists.txt +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration ################################################################################ # Package: TrigMultiVarHypo @@ -20,26 +20,33 @@ atlas_depends_on_subdirs( PUBLIC Trigger/TrigSteer/DecisionHandling LumiBlock/LumiBlockComps Tools/PathResolver - GaudiKernel - Control/AthViews ) + PRIVATE + GaudiKernel + Control/AthViews + Control/AthContainers + Control/AthenaMonitoring + ) # Component(s) in the package: atlas_add_library( TrigMultiVarHypoLib src/*.cxx src/tools/*.cxx - src/preproc/*.cxx + src/tools/procedures/*.cxx + src/tools/common/*.cxx PUBLIC_HEADERS TrigMultiVarHypo - LINK_LIBRARIES AsgTools xAODTrigCalo xAODTrigRinger TrigCaloEvent - TrigSteeringEvent TrigInterfacesLib TrigTimeAlgsLib - LumiBlockCompsLib PathResolver DecisionHandlingLib + LINK_LIBRARIES AsgTools xAODTrigCalo xAODTrigRinger TrigCaloEvent + TrigSteeringEvent TrigInterfacesLib TrigTimeAlgsLib + DecisionHandlingLib LumiBlockCompsLib PathResolver + AthenaMonitoringLib PRIVATE_LINK_LIBRARIES GaudiKernel AthViews ) -atlas_add_component( TrigMultiVarHypo - src/components/*.cxx - LINK_LIBRARIES AsgTools xAODTrigCalo xAODTrigRinger TrigCaloEvent - TrigSteeringEvent TrigInterfacesLib TrigTimeAlgsLib - GaudiKernel TrigMultiVarHypoLib PathResolver - LumiBlockCompsLib DecisionHandlingLib) + +atlas_add_component( TrigMultiVarHypo + src/components/*.cxx + LINK_LIBRARIES AsgTools xAODTrigCalo xAODTrigRinger TrigCaloEvent + TrigSteeringEvent TrigInterfacesLib TrigTimeAlgsLib GaudiKernel + TrigMultiVarHypoLib DecisionHandlingLib LumiBlockCompsLib + PathResolver AthenaMonitoringLib) # Install files from the package: atlas_install_python_modules( python/*.py ) diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerFex.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerFex.h index a9c834cde862..a337252438c4 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerFex.h +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerFex.h @@ -19,10 +19,13 @@ /// Luminosity tool #include "LumiBlockComps/ILumiBlockMuTool.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" -#include "TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h" -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" +// ringer libs +#include "TrigMultiVarHypo/tools/procedures/IModel.h" +#include "TrigMultiVarHypo/tools/procedures/INormalization.h" +#include "TrigMultiVarHypo/tools/common/RingerReader.h" + +#include<memory> class TrigL2CaloRingerFex: public HLT::FexAlgo { @@ -40,7 +43,8 @@ class TrigL2CaloRingerFex: public HLT::FexAlgo { ///Time monitoring TrigTimer* m_storeTimer; TrigTimer* m_normTimer; - TrigTimer* m_decisionTimer; + TrigTimer* m_totalTimer; + TrigTimer* m_propagateTimer; private: @@ -58,20 +62,15 @@ class TrigL2CaloRingerFex: public HLT::FexAlgo { float m_lumiCut; float m_output; bool m_useLumiTool; - bool m_useEtaVar; - bool m_useLumiVar; //LumiTool ToolHandle<ILumiBlockMuTool> m_lumiBlockMuTool; - ///Prepoc configuration - std::vector<unsigned int> m_nRings; - std::vector<unsigned int> m_normRings; - std::vector<unsigned int> m_sectionRings; ///Discriminator holder - std::vector<MultiLayerPerceptron*> m_discriminators; - std::vector<TrigRingerPreprocessor*> m_preproc; - TrigL2CaloRingerReader m_reader; + std::vector<std::shared_ptr<Ringer::IModel>> m_discriminators; + std::vector<std::shared_ptr<Ringer::INormalization>> m_preproc; + + Ringer::RingerReader m_reader; }; //!=============================================================================================== diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerHypo.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerHypo.h index 6ffc6039e219..b35e7907ae46 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerHypo.h +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/TrigL2CaloRingerHypo.h @@ -4,18 +4,19 @@ #ifndef TRIGL2CALORINGERHYPO_H #define TRIGL2CALORINGERHYPO_H -///std include(s) +// std include(s) #include <string> #include <vector> -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" -#include "TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h" +// ringer libs +#include "TrigMultiVarHypo/tools/common/RingerReader.h" +#include "TrigMultiVarHypo/tools/procedures/IThresholds.h" -///Base from trigger +// Base from trigger #include "TrigInterfaces/HypoAlgo.h" #include "TrigTimeAlgs/TrigTimer.h" -///xAOD include(s) +// xAOD include(s) #include "xAODTrigRinger/TrigRingerRings.h" #include "xAODTrigRinger/TrigRNNOutput.h" #include "xAODTrigCalo/TrigEMCluster.h" @@ -34,7 +35,7 @@ class TrigL2CaloRingerHypo: public HLT::HypoAlgo { private: bool m_acceptAll; - bool m_useNoActivationFunctionInTheLastLayer; + bool m_removeOutputTansigTF; bool m_doPileupCorrection; double m_emEtCut; int m_lumiCut; @@ -46,13 +47,14 @@ class TrigL2CaloRingerHypo: public HLT::HypoAlgo { std::string m_feature; std::string m_key; + TrigTimer* m_totalTimer; - TrigL2CaloRingerReader m_reader; + Ringer::RingerReader m_reader; /* Helper functions for feature extraction */ const xAOD::TrigRNNOutput* get_rnnOutput(const HLT::TriggerElement* te); - std::vector<TrigCaloRingsHelper::CutDefsHelper*> m_cutDefs; + std::vector<std::shared_ptr<Ringer::IThresholds>> m_cutDefs; }; //!=============================================================================================== /// get the cluster inside of container diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h deleted file mode 100644 index 58f46e06e062..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - - -#ifndef PREPROC_TRIGRINGERPREPROC_H -#define PREPROC_TRIGRINGERPREPROC_H - -///std librarys -#include <vector> -///Local includes -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" - - - -class TrigRingerPreprocessor{ - - private: - - // RingSet properties: - std::vector<unsigned int> m_nRings; - std::vector<unsigned int> m_normRings; - std::vector<unsigned int> m_sectionRings; - double m_energyThreshold;///Defines the energy threshlod for divisions, in MeV's - /// RingSet object - std::vector<TrigCaloRingsHelper::RingSet*> m_ringsSet; - unsigned int m_maxRingsAccumulated; - - public: - - TrigRingerPreprocessor(std::vector<unsigned int> &nRings, - std::vector<unsigned int> &normRings, - std::vector<unsigned int> §ionRings); - - ~TrigRingerPreprocessor(); - - bool ppExecute( Pattern &rings ); - - void setEnergyThreshold( double e ){ m_energyThreshold = e;}; - - double getEnergyThreshold(){ return m_energyThreshold;}; - - float normalize_eta( float, float etamin, float etamax ); - - float normalize_mu( float, float mumax ); - - /* - * Calculates and applies the sequential normalisation vector that results - * from the following arithmetic: - * - * @f[ - * N0 = E - * N1 = E - E0 - * N2 = E - E0 - E1 = N1 - E1 - * N3 = E - E0 - E1 - E2 = N2 - E2 - * ... - * NX = N(X-1) - E(X-1) - * @f] - * - * Where Ni are the normalisation factors, E is the total layer energy and Ei - * are the energy values for each ring. - * - * @param rings The calculated ring values one wishes to normalise - * @param stop_energy The threshold to judge when to stop this normalisation - * strategy and start using the total layer energy instead, in MeV. - */ - void sequential (Pattern& rings, const Feature& stop_energy = 100.0); - - /** - * Apply normalization based on the ring set configuration - * - * @param rset The ring set configuration to use for creating the rings - */ - void normalize_rings(std::vector<TrigCaloRingsHelper::RingSet*>& rset); - -}; -#endif /* TrigRingerPreproc */ - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/MultiLayerPerceptron.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/MultiLayerPerceptron.h deleted file mode 100644 index 667aed440494..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/MultiLayerPerceptron.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - - -/* - * Neural Network Implementation v3.0 - * Developed by: Dhiana Deva Cavalcanti Rocha - * Contact: dhiana.deva@gmail.com - * Laboratorio de Processamento de Sinais - * Universidade Federal do Rio de Janeiro - * - * Adapt by Joao victor da Fonseca Pinto: - * jodafons@cern.ch - */ - -#ifndef TOOLS_MULTILAYERPERCEPTRON_H -#define TOOLS_MULTILAYERPERCEPTRON_H - -#define BAD_WEIGHT_SIZE 101 -#define BAD_BIAS_SIZE 102 - -#include <vector> - -typedef double REAL; - -class MultiLayerPerceptron { - - private: - - std::vector<unsigned int> m_nodes; - REAL ***m_weights; - REAL **m_bias; - REAL **m_layerOutputs; - REAL **m_neuronOutputs; // Use this to hold the neuron sum values before to apply the tansig function - std::vector<REAL> m_threshold; - REAL m_etmin; - REAL m_etmax; - REAL m_etamin; - REAL m_etamax; - REAL m_mumin; - REAL m_mumax; - - - public: - - MultiLayerPerceptron(std::vector<unsigned int> &, - std::vector<REAL> &, std::vector<REAL> &, - REAL etmin, REAL etmax, - REAL etamin, REAL etamax, REAL mumin, REAL mumax); - - ~MultiLayerPerceptron(); - - float propagate(std::vector<float> &input); - - float getOutput(); - - float getOutputBeforeTheActivationFunction(); - - REAL etamin(){ return m_etamin;}; - REAL etamax(){ return m_etamax;}; - REAL etmin(){ return m_etmin;}; - REAL etmax(){ return m_etmax;}; - REAL mumin(){ return m_mumin;}; - REAL mumax(){ return m_mumax;}; - -}; -#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/RingerSelectorTool.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/RingerSelectorTool.h new file mode 100644 index 000000000000..0a187c9eaad3 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/RingerSelectorTool.h @@ -0,0 +1,117 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGMULTIVARHYPO_RINGERSELECTORTOOL_H +#define TRIGMULTIVARHYPO_RINGERSELECTORTOOL_H + + +#include "GaudiKernel/StatusCode.h" + +// interfaces +#include "TrigMultiVarHypo/tools/procedures/IModel.h" +#include "TrigMultiVarHypo/tools/procedures/IThresholds.h" +#include "TrigMultiVarHypo/tools/procedures/INormalization.h" + +// file header lib +#include "TrigMultiVarHypo/tools/common/RingerReader.h" + +// models lib +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" +#include "TrigMultiVarHypo/tools/procedures/Norm1.h" + +#include "AthenaMonitoring/MonitoredTimer.h" +#include "AsgTools/AsgMessaging.h" +#include <memory> +#include <string> + + +namespace Ringer{ + + class RingerSelectorTool: public asg::AsgMessaging + { + + public: + /// Standard constructor + RingerSelectorTool(); + + /// Standard destructor + ~RingerSelectorTool(); + + StatusCode initialize(); + + StatusCode finalize(); + + bool accept( double discriminant, double et, double eta, double mu) const; + + double calculate( double et, double eta, double mu, + double deltaeta1, double deltaPoverP, double deltaPhiReescaled, + double d0significance, double d0pvunbiased, double eProbabilityHT) const; + + double calculate( std::vector<float>& rings, double et, double eta, double mu) const; + + double calculate( std::vector<float>& rings, double et, double eta, double mu, + Monitored::Timer &propagate_time, + Monitored::Timer &preproc_time) const; + + double calculate( std::vector<float>& rings, double et, double eta, double mu, + double deltaeta1, double deltaPoverP, double deltaPhiReescaled, + double d0significance, double d0pvunbiased, double eProbabilityHT) const; + + double calculate( std::vector<float>& rings, double et, double eta, double mu, + double eratio, double reta, double rphi, double rhad, double weta2, + double f1, double f3) const; + + double calculate( std::vector<float>& rings, double et, double eta, double mu, + double eratio, double reta, double rphi, double rhad, double weta2, + double f1, double f3, double deltaeta1, double deltaPoverP, + double deltaPhiReescaled, double d0significance, double d0pvunbiased, + double eProbabilityHT) const; + + + std::string getWP( void ) const {return m_wp;}; + bool useCaloRings() const {return m_useCaloRings;}; + bool useTrack() const {return m_useTrack;}; + bool useShowerShape() const {return m_useShowerShape;}; + bool useTileCal() const {return m_useTileCal;}; + void setConstantsCalibPath(std::string s){m_constantsCalibPath=s;}; + void setThresholdsCalibPath(std::string s){m_thresholdsCalibPath=s;}; + + + + + + private: + + bool retrieve(double et, double eta, double mu, std::shared_ptr<Ringer::IModel> &discr, + std::shared_ptr<Ringer::INormalization> &preproc ) const; + + std::vector<std::shared_ptr<Ringer::INormalization>> m_preprocs; + std::vector<std::shared_ptr<Ringer::IModel>> m_discriminators; + std::vector<std::shared_ptr<Ringer::IThresholds>> m_cutDefs; + + Ringer::RingerReader m_reader; + + + double m_etCut; + double m_lumiCut; + + bool m_useTrack; + bool m_useCaloRings; + bool m_useShowerShape; + bool m_removeOutputTansigTF; + bool m_doPileupCorrection; + bool m_useTileCal; + + //Discriminator configuration + std::string m_constantsCalibPath, m_thresholdsCalibPath; + std::string m_wp; // working point + + + + + };// end class + +} + + +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h deleted file mode 100644 index 71ff2a8f5163..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TOOLS_TRIGL2CALORINGERREADER_H -#define TOOLS_TRIGL2CALORINGERREADER_H - -//#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" - -#include "AsgTools/AsgMessaging.h" -#include "PathResolver/PathResolver.h" -#include <vector> -#include <string> -#include "TTree.h" -#include "TFile.h" - -class TrigL2CaloRingerReader : public asg::AsgMessaging { - - public: - /* constructor */ - TrigL2CaloRingerReader(const std::string& name); - /* destructor */ - ~TrigL2CaloRingerReader(); - /* use this methods to retrieve the tools from the archieve */ - bool retrieve(std::string &, std::vector<MultiLayerPerceptron*> &); - bool retrieve(std::string &, std::vector<TrigCaloRingsHelper::CutDefsHelper*> &); - /* return the current class name */ - std::string name(){return m_name;}; - /* return luminosity flag */ - bool useLumiVar(){return m_useLumiVar;}; - /* return eta var flag */ - bool useEtaVar(){return m_useEtaVar;}; - /* if true, we will no use the activation function in the last layer */ - bool useNoActivationFunctionInTheLastLayer(){return m_useNoActivationFunctionInTheLastLayer;}; - /* if true, apply the pileup correction */ - bool doPileupCorrection(){return m_doPileupCorrection;}; - /* return the threshold lumi */ - int lumiCut(){return m_lumiCut;}; - - private: - // Use this to retrieve all branch values - template <class T> - void InitBranch(TTree* fChain, std::string branch_name, T* param); - - std::string m_name; - - int m_version; - - // archieve variables holder - int m_lumiCut; - bool m_useEtaVar; - bool m_useLumiVar; - bool m_useNoActivationFunctionInTheLastLayer; - bool m_doPileupCorrection; - - std::vector<unsigned int> *m_nodes; - std::vector<double> *m_weights; - std::vector<double> *m_bias; - std::vector<double> *m_thresholds; - std::vector<double> *m_etaBins; - std::vector<double> *m_etBins; - std::vector<double> *m_muBins; - -};//End of classi -#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigRingerHelper.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigRingerHelper.h deleted file mode 100644 index cc262d6bbb95..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/TrigRingerHelper.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef PREPROC_TRIGRINGERHELPER_H -#define PREPROC_TRIGRINGERHELPER_H - -#include <vector> -#include <string> - -typedef float Feature; -typedef std::vector<Feature> Pattern; - -namespace TrigCaloRingsHelper{ - - enum CaloRingsLayer{ - PS = 0, - EM1 = 1, - EM2 = 2, - EM3 = 3, - HAD1 = 4, - HAD2 = 5, - HAD3 = 6 - }; - /* - * rings map into std::vector - * 0:7 PS; 8:71 EM1; 72:79 EM2; 80:87 EM3 - * 88:91 HAD1; 92:95 HAD2; 96:99 HAD3 - */ - void parseTrigCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, - std::string &caloLayerName); - - class RingSet { - - public: //interface - - enum Normalisation { - EVENT = 0, ///< normalises the ring energies with the total event energy - SECTION = 1, ///< normalises the ring energies with the section energy - SET = 2, ///< normalises the ring energies with the set energy - SEQUENTIAL = 3, ///< normalises the ring energies with a special scheme - NONE = 4 ///< no normalisation is applied - }; - - enum Section { - EM = 0, ///< electromagnetic section of the ATLAS calorimetry - HADRONIC = 1 ///< hadronic section of the ATLAS calorimetry - }; - - RingSet (unsigned int max, const Normalisation &norm, const Section §ion) - : m_max(max), - m_norm(norm), - m_section(section), - m_val(max) - {;} - - ~RingSet() - {;} - - inline unsigned int max(void) const { return m_max; } - inline Normalisation normalisation(void) const { return m_norm; } - inline Section section(void) const { return m_section; } - - ///Returns the (current) ring values. - inline Pattern& pattern (void) { return m_val; } - - ///Resets all current values - inline void reset (void) { m_val.clear(); } - - ///Appends ring to ringset - inline void add ( double ring) { m_val.push_back(ring); } - - private: //representation - - unsigned int m_max; - Normalisation m_norm; ///< the normalisation scheme for this ring set - Section m_section; ///< the section this ring set belongs to - Pattern m_val; ///< my current values - }; - - - ///Helper class - class CutDefsHelper{ - public: - CutDefsHelper(std::vector<double> th, double etamin, double etamax, - double etmin, double etmax, double mumin, double mumax) - { - m_threshold=th; - m_etamin=etamin; - m_etamax=etamax; - m_etmin=etmin; - m_etmax=etmax; - m_mumin=mumin; - m_mumax=mumax; - } - - ~CutDefsHelper() - {;} - - double threshold(){return m_threshold[2];}; - double threshold(float avgmu){return (avgmu*m_threshold[0] + m_threshold[1]);}; - double etamin(){return m_etamin;}; - double etamax(){return m_etamax;}; - double etmin(){return m_etmin;}; - double etmax(){return m_etmax;}; - double mumin(){return m_mumin;}; - double mumax(){return m_mumax;}; - - private: - double m_etamin; - double m_etamax; - double m_etmin; - double m_etmax; - double m_mumin; - double m_mumax; - - // Define as [a, b, b0] where a and b came from y = ax+b and b0 is the cut without any correction - std::vector<double> m_threshold; - - - };///end of configuration - - -} // namespace TrigCaloRingsHelper -#endif /* TrigCaloRingerHelper */ diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerHelper.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerHelper.h new file mode 100644 index 000000000000..3ce29f3b5a03 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerHelper.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGMULTIVARHYPO_RINGERHELPER_H +#define TRIGMULTIVARHYPO_RINGERHELPER_H + +#include <vector> +#include <string> + + +namespace Ringer{ + + enum CaloRingsLayer{ + PS = 0, + EM1 = 1, + EM2 = 2, + EM3 = 3, + HAD1 = 4, + HAD2 = 5, + HAD3 = 6 + }; + /* + * rings map into std::vector + * 0:7 PS; 8:71 EM1; 72:79 EM2; 80:87 EM3 + * 88:91 HAD1; 92:95 HAD2; 96:99 HAD3 + */ + void parseTrigCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, + std::string &caloLayerName); + + + + + +} // namespace TrigCaloRingsHelper +#endif /* TrigCaloRingerHelper */ diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerReader.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerReader.h new file mode 100644 index 000000000000..a8aacc1500a7 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/common/RingerReader.h @@ -0,0 +1,103 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGMULTIVARHYPO_RINGERREADER_H +#define TRIGMULTIVARHYPO_RINGERREADER_H + +#include "TrigMultiVarHypo/tools/procedures/IModel.h" +#include "TrigMultiVarHypo/tools/procedures/IThresholds.h" +#include "TrigMultiVarHypo/tools/procedures/INormalization.h" +#include "TrigMultiVarHypo/tools/procedures/Thresholds.h" +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" + +#include "PathResolver/PathResolver.h" +#include <vector> +#include <string> +#include "TTree.h" +#include "TFile.h" +#include <TROOT.h> +#include <memory> + + +#include "AsgTools/AsgMessaging.h" + +namespace Ringer{ + + + class RingerReader: public asg::AsgMessaging{ + + public: + /* constructor */ + RingerReader( std::string ); + /* destructor */ + ~RingerReader(); + + /* use this methods to retrieve the tools from the archieve */ + bool retrieve(std::string &, std::vector<std::shared_ptr<Ringer::IModel>> &); + bool retrieve(std::string &, std::vector<std::shared_ptr<Ringer::IThresholds>> &); + + + + int lumiCut() const {return m_lumiCut;}; + bool doPileupCorrection() const {return m_doPileupCorrection;}; + bool removeOutputTansigTF() const {return m_removeOutputTansigTF;}; + bool useTrack() const {return m_useTrack;}; + bool useCaloRings() const {return m_useCaloRings;}; + bool useShowerShape() const {return m_useShowerShape;}; + bool useTileCal() const {return m_useTileCal;}; + + std::string name() const {return m_name;}; + + + + + + private: + // Use this to retrieve all branch values + template <class T> + void InitBranch(TTree* fChain, std::string branch_name, T* param); + + + std::string m_name; + int m_version; + + // archieve variables holder + int m_lumiCut; + bool m_useCaloRings; + bool m_useTrack; + bool m_useShowerShape; + bool m_useTileCal; + bool m_removeOutputTansigTF; + bool m_doPileupCorrection; + + // Dense Model + std::vector<unsigned int> *m_nodes; + std::vector<double> *m_weights; + std::vector<double> *m_bias; + std::vector<double> *m_thresholds; + std::vector<std::string> *m_tfnames; + + // Convolutional Model + std::vector<bool> *m_useConvLayer; + std::vector<unsigned int> *m_conv_nodes; + std::vector<unsigned int> *m_conv_kernel_i; + std::vector<unsigned int> *m_conv_kernel_j; + std::vector<double> *m_conv_kernel; + std::vector<double> *m_conv_bias; + std::vector<unsigned int> *m_conv_input_i; + std::vector<unsigned int> *m_conv_input_j; + std::vector<std::string> *m_conv_tfnames; + std::vector<unsigned int> *m_conv_frame; + + // Common parans + std::vector<double> *m_etaBins; + std::vector<double> *m_etBins; + std::vector<double> *m_muBins; + + + + };//End of classi + +} +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IModel.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IModel.h new file mode 100644 index 000000000000..84bcbe4e9261 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IModel.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + + +#ifndef TRIGMULTIVARHYPO_IMODEL_H +#define TRIGMULTIVARHYPO_IMODEL_H + +#include <vector> + + +#define BAD_WEIGHT_SIZE 101 +#define BAD_BIAS_SIZE 102 + + +namespace Ringer{ + + struct RnnOutInfo{ + float output; + float outputBeforeTheActivationFunction; + }; + + + + class IModel{ + + private: + + double m_etmin; + double m_etmax; + double m_etamin; + double m_etamax; + double m_mumin; + double m_mumax; + + public: + + + // Constructor + IModel( double etmin, double etmax, double etamin, double etamax, double mumin, double mumax): + m_etmin(etmin),m_etmax(etmax),m_etamin(etamin),m_etamax(etamax),m_mumin(mumin),m_mumax(mumax) + {;}; + + // Destructor + virtual ~IModel() + {;}; + + virtual RnnOutInfo propagate( std::vector<float> & ) const=0; + double etamin() const{ return m_etamin;}; + double etamax() const{ return m_etamax;}; + double etmin() const{ return m_etmin;}; + double etmax() const{ return m_etmax;}; + double mumin() const{ return m_mumin;}; + double mumax() const{ return m_mumax;}; + + }; + +} +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/INormalization.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/INormalization.h new file mode 100644 index 000000000000..9b821b9f1ba1 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/INormalization.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGMULTIVARHYPO_INORMALIZATION_H +#define TRIGMULTIVARHYPO_INORMALIZATION_H + +#include <vector> + + + +namespace Ringer{ + + + class INormalization{ + + private: + + double m_etmin; + double m_etmax; + double m_etamin; + double m_etamax; + double m_mumin; + double m_mumax; + + public: + + + // Constructor + INormalization( double etmin, double etmax, double etamin, double etamax, double mumin, double mumax): + m_etmin(etmin),m_etmax(etmax),m_etamin(etamin),m_etamax(etamax),m_mumin(mumin),m_mumax(mumax) + {;}; + + // Destructor + virtual ~INormalization() + {;}; + + virtual void execute( std::vector<float> & ) const=0; + + double etamin() const{ return m_etamin;}; + double etamax() const{ return m_etamax;}; + double etmin() const{ return m_etmin;}; + double etmax() const{ return m_etmax;}; + double mumin() const{ return m_mumin;}; + double mumax() const{ return m_mumax;}; + + }; + +} +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IThresholds.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IThresholds.h new file mode 100644 index 000000000000..7eabbdbdda55 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/IThresholds.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGMULTIVARHYPO_ITHRESHOLDS_H +#define TRIGMULTIVARHYPO_ITHRESHOLDS_H + +#include <vector> +#include <string> + + +namespace Ringer{ + + class IThresholds{ + + protected: + double m_etamin; + double m_etamax; + double m_etmin; + double m_etmax; + double m_mumin; + double m_mumax; + std::vector<double> m_values; + + public: + + IThresholds(std::vector<double> th, + double etamin, + double etamax, + double etmin, + double etmax, + double mumin, + double mumax): + m_etamin(etamin),m_etamax(etamax),m_etmin(etmin),m_etmax(etmax),m_mumin(mumin),m_mumax(mumax),m_values(th) + {;} + + virtual ~IThresholds() + {;} + + virtual double threshold() const=0; + virtual double threshold(double) const=0; + + double etamin() const {return m_etamin;}; + double etamax() const {return m_etamax;}; + double etmin() const {return m_etmin; }; + double etmax() const {return m_etmax; }; + double mumin() const {return m_mumin; }; + double mumax() const {return m_mumax; }; + + std::vector<double> values() const {return m_values;}; + + + }; + +} + +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h new file mode 100644 index 000000000000..2e51dfe7bd6a --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + + + +#ifndef TRIGMULTIVARHYPO_MULTILAYERPERCEPTRON_H +#define TRIGMULTIVARHYPO_MULTILAYERPERCEPTRON_H + +#include <string> +#include <vector> +#include "TrigMultiVarHypo/tools/procedures/IModel.h" + + +namespace Ringer{ + + class MultiLayerPerceptron: public IModel { + + private: + + + std::vector<unsigned int> m_nodes; + double ***m_weights; + double **m_bias; + std::vector<std::string> m_tfnames; + + //inline double activation( double, std::string & ); + inline void release(double**, double**) const; + + public: + + MultiLayerPerceptron( std::vector<unsigned int> &, + std::vector<double> &, + std::vector<double> &, + std::vector<std::string> &, + double etmin, + double etmax, + double etamin, + double etamax, + double mumin, + double mumax); + + ~MultiLayerPerceptron(); + + Ringer::RnnOutInfo propagate(std::vector<float> &input) const; + }; + +} +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Norm1.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Norm1.h new file mode 100644 index 000000000000..67f9db466425 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Norm1.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + + +#ifndef TRIGMULTIVARHYPO_NORM1_H +#define TRIGMULTIVARHYPO_NORM1_H + +#include <vector> +#include "TrigMultiVarHypo/tools/procedures/INormalization.h" + +namespace Ringer{ + + class Norm1 : public INormalization{ + + public: + Norm1(double etmin, double etmax, double etamin, double etamax, double mumin, double mumax, bool usetilecal); + ~Norm1(){;}; + void execute( std::vector<float> &rings ) const; + + private: + bool m_useTileCal; + }; + +} + +#endif /* TrigRingerPreproc */ + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Thresholds.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Thresholds.h new file mode 100644 index 000000000000..f82b47f4598c --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/TrigMultiVarHypo/tools/procedures/Thresholds.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGMULTIVARHYPO_THRESHOLDS_H +#define TRIGMULTIVARHYPO_THRESHOLDS_H + +#include "TrigMultiVarHypo/tools/procedures/IThresholds.h" +#include <vector> +#include <string> + + + +namespace Ringer{ + + class Thresholds : public IThresholds{ + + public: + + Thresholds(std::vector<double> th, + double etamin, + double etamax, + double etmin, + double etmax, + double mumin, + double mumax): + IThresholds(th,etamin,etamax,etmin,etmax,mumin,mumax) + {;} + + + ~Thresholds(){;} + + double threshold() const {return beta0();}; + double threshold(double avgmu) const {return (avgmu*alpha() + beta());}; + double alpha() const {return m_values[0];}; + double beta() const {return m_values[1];}; + double beta0() const {return m_values[2];}; + + };///end of configuration + +} + +#endif diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerConstants.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerConstants.py deleted file mode 100755 index 370295abf8b5..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerConstants.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration - -# Universidade Federal do Rio de Janeiro -# Authors: -# Joao Victor da Fonseca Pinto, jodafons@cern.ch -# Werner Freund, wsfreund@cern.ch -# Ryan White, rwhite@cern.ch -# Denis Damazio, damazio@cern.ch -# -# MC16 Tuning presented here: -# https://indico.cern.ch/event/576269/contributions/2332041/attachments/1352705/2042960/20161011_egammaMeeting.pdf -# This tuning using MC15c to training 20 neural networks. -# Relax parameters: Tight = -0.45, Medium = -0.3, Loose = -0.1 and VeryLoose = -0.3 -def SignaturesMap(): - signatures=dict() - signatures["ElectronHighEnergyTightConf"]={'et3_eta2': {'discriminator': {'threshold': 0.52499841451644902, 'nodes': [100, 5, 1], 'bias': [-0.03404608368873596, -0.0632418766617775, -0.0069054546765983105, 0.020593134686350822, -0.2521449327468872, 0.016750043258070946], 'weights': [0.4703431725502014, -0.09695211797952652, -1.7062618732452393, -1.7950844764709473, -1.5752053260803223, -1.5195577144622803, -1.0668883323669434, -0.9694873690605164, 0.15751956403255463, 1.960694432258606, 2.0984318256378174, 1.9061888456344604, 1.0200971364974976, 0.32337525486946106, 0.3146933317184448, 0.35614654421806335, -3.87273907661438, 0.04691654443740845, 0.1703878790140152, -1.8183751106262207, -4.0419816970825195, -2.691319465637207, -0.9311197400093079, -1.5393428802490234, -1.9127061367034912, -2.0619184970855713, -2.2820775508880615, -1.875126600265503, -1.9300029277801514, -1.940091609954834, -1.477725863456726, -1.3720479011535645, -1.8444932699203491, -1.6420280933380127, -1.7008205652236938, -1.9253499507904053, -4.584053993225098, -2.1500840187072754, -1.296797275543213, -1.845773458480835, -1.719006061553955, -3.953913927078247, -2.0874006748199463, -1.457442045211792, -0.9740849137306213, -2.08292818069458, -1.9235605001449585, -1.1207565069198608, -2.043537139892578, -1.8446439504623413, -1.597627878189087, -1.8782378435134888, -2.8899118900299072, -2.1076903343200684, -1.8747576475143433, -1.961047649383545, -1.0844285488128662, -1.6172173023223877, -1.1107652187347412, -1.0789729356765747, 1.1585743427276611, -0.3794723451137543, -0.6536436676979065, -1.573157787322998, -1.1959367990493774, -1.1892831325531006, -1.0667911767959595, -2.1755447387695312, -1.845846176147461, -6.773364543914795, -1.6112593412399292, -1.5740151405334473, 0.769822359085083, 0.4261709153652191, -2.261221170425415, -1.9437546730041504, -1.8926950693130493, -1.7906838655471802, -1.8505183458328247, -1.8123387098312378, 0.3296405076980591, -1.1944637298583984, -2.2528421878814697, -1.993539810180664, -1.5635275840759277, -0.6428982019424438, -1.654792070388794, -1.634527564048767, 1.1783809661865234, -1.511512041091919, -1.2514039278030396, -1.1372365951538086, -3.225945472717285, -3.4711992740631104, -0.255437970161438, -1.661489486694336, 0.04046904295682907, 0.11920715868473053, -0.9848525524139404, -1.9816033840179443, 0.39178165793418884, -0.222597137093544, -1.4305715560913086, -1.5519620180130005, -1.2010095119476318, -1.3291617631912231, -0.9976070523262024, -0.7786450386047363, 0.0013313444796949625, 3.769132614135742, 1.9853181838989258, 1.8109837770462036, 0.8675318360328674, 0.43654513359069824, 0.2612902820110321, 0.3261204659938812, -3.6511151790618896, -0.10662383586168289, 0.14573165774345398, -1.8760493993759155, -6.953881740570068, -3.3156826496124268, -0.8301648497581482, -0.9680281281471252, -1.645704746246338, -4.893914699554443, -2.782379627227783, -1.8480205535888672, -1.8941502571105957, -2.4906749725341797, -0.15624096989631653, -1.651524305343628, -1.68096125125885, -1.3215241432189941, -1.8222824335098267, -1.9439116716384888, -4.718743801116943, -4.76596736907959, -0.08982709050178528, -0.6884569525718689, -1.802567481994629, -4.605197429656982, -2.41015362739563, -1.4588706493377686, -0.7951393723487854, -1.9884803295135498, -2.247915267944336, -1.0868651866912842, -2.1585001945495605, -2.204909563064575, -1.4571914672851562, -1.7820578813552856, -2.8570802211761475, -2.1592586040496826, -2.078396797180176, -4.92418098449707, -1.1851047277450562, -1.3947882652282715, -0.7543351650238037, -0.9022685885429382, 4.902259349822998, -0.22408047318458557, 0.7281573414802551, -1.4075641632080078, -0.715082585811615, -0.9525408744812012, -1.1099210977554321, -2.0706253051757812, -1.281381607055664, -13.391276359558105, -1.6157174110412598, -1.3400325775146484, 0.4457109570503235, 0.4530270993709564, -2.8723087310791016, -1.8866392374038696, -1.9237309694290161, -1.9212015867233276, -1.7973734140396118, -1.8382846117019653, -0.00027607381343841553, -3.3417277336120605, -2.477571964263916, -2.0472254753112793, -1.4952001571655273, -0.4540436863899231, -1.615282654762268, -0.8411869406700134, 1.0563337802886963, -1.2980713844299316, -0.7343506217002869, -0.7194597721099854, -1.9239697456359863, -3.9020168781280518, 2.364347457885742, -1.1776623725891113, 0.01981297880411148, 0.07497745007276535, -0.8942105770111084, -4.8766350746154785, 0.475401371717453, -0.09648885577917099, -1.5122263431549072, -1.6838487386703491, -1.1105148792266846, -1.3744908571243286, -0.9601327776908875, -0.8057340979576111, 0.021039912477135658, 3.751394271850586, 2.0616366863250732, 1.7273722887039185, 0.8787944912910461, 0.46091437339782715, 0.24818670749664307, 0.43636125326156616, -4.1876091957092285, 0.07805332541465759, 0.19747062027454376, -1.6799999475479126, -6.877641201019287, -3.3294928073883057, -0.8415812849998474, -1.139517903327942, -1.6007468700408936, -4.9306817054748535, -2.7383718490600586, -1.8440966606140137, -1.8537633419036865, -2.523174285888672, -0.12742355465888977, -1.5189168453216553, -1.5959528684616089, -1.3657605648040771, -1.8129609823226929, -1.7598079442977905, -4.570714950561523, -4.956765651702881, -0.17040660977363586, -0.5293206572532654, -1.773510217666626, -4.618059158325195, -2.5722224712371826, -1.6561448574066162, -0.7750309705734253, -2.1722538471221924, -2.259584665298462, -0.9980576038360596, -2.1489956378936768, -2.380957841873169, -1.409928798675537, -1.7049132585525513, -3.038337469100952, -3.5699002742767334, -1.9351481199264526, -4.8228864669799805, -1.1860252618789673, -1.4451255798339844, -0.6577172875404358, -0.8714030981063843, 4.828023433685303, -0.09004434943199158, 0.6540361046791077, -1.6343858242034912, -0.11864355206489563, -1.0188268423080444, -0.9150443077087402, -2.0789918899536133, -1.3079864978790283, -13.514573097229004, -1.7025418281555176, -1.3289794921875, 0.26978325843811035, 0.4417278468608856, -2.8209352493286133, -1.7564946413040161, -1.8812094926834106, -1.8900986909866333, -1.816015601158142, -1.794859528541565, 0.09237288683652878, -3.304506301879883, -2.5945963859558105, -1.8982394933700562, -1.6683275699615479, -0.4192184507846832, -1.602596640586853, -1.0238356590270996, 1.0494225025177002, -1.4263620376586914, -0.877532958984375, -0.8092076182365417, -1.909623622894287, -3.8817265033721924, -0.2928352952003479, -1.319711685180664, -0.024696294218301773, -0.046715836971998215, -1.0360255241394043, -4.939148902893066, -0.35044461488723755, 0.1329326182603836, 1.5021412372589111, 1.6484538316726685, 1.3356163501739502, 1.3763805627822876, 0.9870052337646484, 0.754561185836792, -0.2256736159324646, -3.6136341094970703, -2.1328065395355225, -1.8531798124313354, -0.8785865902900696, -0.3169863224029541, -0.3868444561958313, -0.24436858296394348, 4.012304782867432, 0.02375192381441593, -0.24277639389038086, 1.8004950284957886, 6.935372829437256, 3.426699161529541, 0.8592419624328613, 1.032814383506775, 1.7134208679199219, 4.780606746673584, 2.86541748046875, 1.7310099601745605, 1.9240026473999023, 2.5437889099121094, 0.27860119938850403, 1.4710638523101807, 1.6389554738998413, 1.2638041973114014, 1.743768572807312, 1.7848631143569946, 4.71369743347168, 4.928501605987549, 0.15834453701972961, 0.7107180953025818, 1.8689508438110352, 4.777875900268555, 2.3847639560699463, 1.508744478225708, 0.835726797580719, 2.089186429977417, 2.0611276626586914, 1.1264986991882324, 1.9246842861175537, 2.274366617202759, 1.415815830230713, 1.7813833951950073, 3.043009042739868, 3.579392671585083, 2.3239729404449463, 4.92617654800415, 1.0594977140426636, 1.541938066482544, 0.8909697532653809, 1.058164119720459, -4.953646183013916, 0.2314254343509674, -0.5010726451873779, 1.565821886062622, -0.08498072624206543, 1.0906447172164917, 1.1145848035812378, 2.2613987922668457, 1.3353822231292725, 13.459002494812012, 1.8276127576828003, 1.2087664604187012, -0.40858638286590576, -0.5224865078926086, 2.7963709831237793, 1.9214364290237427, 1.9604321718215942, 1.9101260900497437, 1.8663493394851685, 1.8928200006484985, 0.06411264836788177, 3.117678165435791, 2.5259783267974854, 2.0453412532806396, 1.50504732131958, 0.3203665614128113, 1.6099389791488647, 0.9770769476890564, -1.0374064445495605, 1.4239075183868408, 0.7744860053062439, 0.6815458536148071, 1.8055014610290527, 3.9175875186920166, 0.33965864777565, 1.2550137042999268, -0.11277629435062408, 0.05003013089299202, 0.9106857776641846, 4.843127250671387, 0.1744583249092102, -0.37111008167266846, -0.35408395528793335, -0.41920167207717896, -0.36892133951187134, -0.2612716853618622, -0.14953355491161346, -0.1300797462463379, -0.09386436641216278, 0.761993944644928, 0.4514209032058716, 0.2590124309062958, 0.22955216467380524, 0.08110851049423218, 0.01636931672692299, 0.1712530255317688, -0.9473946690559387, -0.07730364799499512, -0.16367153823375702, -0.32336774468421936, -0.5637524724006653, -0.6568450331687927, -0.28498411178588867, -0.15401208400726318, -0.32957980036735535, -1.0395737886428833, -0.49654823541641235, -0.4513591229915619, -0.3642613887786865, -0.5568627715110779, -0.0648648738861084, -0.2386358231306076, -0.2566433846950531, -0.16444730758666992, -0.46484479308128357, -0.5066210627555847, -1.0130572319030762, -0.9108573198318481, 0.012854591012001038, -0.18211284279823303, -0.4209402799606323, -1.1025869846343994, -0.542112410068512, -0.45608821511268616, -0.11394987255334854, -0.41872701048851013, -0.36886587738990784, -0.13483592867851257, -0.4383373558521271, -0.5084582567214966, -0.28491610288619995, -0.2893811762332916, -0.7073707580566406, -0.43783071637153625, -0.39699429273605347, -0.9675461649894714, -0.1085149496793747, -0.32067587971687317, -0.06519453227519989, -0.1662413477897644, 1.094576358795166, -0.08060134202241898, 0.12996505200862885, -0.28078484535217285, -0.2166997492313385, -0.20002377033233643, -0.13120070099830627, -0.42927756905555725, -0.28649941086769104, -2.780503273010254, -0.2695549428462982, -0.1906566619873047, 0.30543598532676697, 0.164018914103508, -0.5054414868354797, -0.3729121685028076, -0.33963578939437866, -0.3565989136695862, -0.4127393364906311, -0.4575944244861603, -0.09176865220069885, -4.205863952636719, -0.6541123986244202, -0.4885105490684509, -0.30788320302963257, -0.04713185131549835, -0.2438165545463562, -0.17967073619365692, 0.15327642858028412, -0.26989424228668213, -0.22979912161827087, -0.28838005661964417, -0.48686540126800537, -0.7482866048812866, 0.019190819934010506, -0.29602205753326416, -0.026977213099598885, 0.04035473242402077, -0.08245032280683517, -0.9105329513549805, -2.2175211906433105, 6.651045322418213, 2.1264047622680664, -1.8714848756790161, 0.7427754402160645]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (1.37, 1.54)}}, 'et0_eta0': {'discriminator': {'threshold': -0.29000082314014436, 'nodes': [100, 5, 1], 'bias': [-0.2670447528362274, -0.05183012783527374, -0.04433061555027962, -0.01940568909049034, 0.12205582112073898, -0.06483051925897598], 'weights': [3.3673596382141113, 0.9538314938545227, 0.12469179928302765, 0.14793643355369568, 0.12292370945215225, 0.14244332909584045, 0.05363531783223152, 0.2727659046649933, 0.20127421617507935, 5.471673488616943, -2.2917232513427734, -56.35588836669922, -7.483811855316162, 238.3892364501953, 23.928579330444336, -0.6855018138885498, -0.6985949873924255, -0.7719336152076721, -0.9904337525367737, -0.7493525147438049, -0.5686030387878418, -0.3108186721801758, -0.3364672362804413, -0.5717927813529968, -0.4712197780609131, -0.5751597285270691, 0.02359110116958618, -0.14523304998874664, -0.4195497930049896, -0.2937079966068268, -0.3265480399131775, -0.11184488981962204, -0.05166345834732056, -0.36686262488365173, -0.035324838012456894, -0.07183662056922913, 0.023579295724630356, -0.2239261269569397, 1.9652268886566162, 0.3540093004703522, 0.10157498717308044, -0.0472295768558979, -0.10854905098676682, -6.528909206390381, 0.4770190119743347, -5.920959949493408, -0.02509407512843609, 0.22881318628787994, 0.006710990332067013, 0.0423034206032753, 0.14291903376579285, 0.0028798754792660475, -0.06435569375753403, -0.09297280013561249, -0.01750238984823227, 0.16881519556045532, 0.013577342964708805, 0.3107413947582245, 0.5289624929428101, 0.05295141041278839, 0.002214140724390745, 0.7793008685112, 0.18886373937129974, 0.1399174928665161, 0.6809924244880676, 0.42242231965065, 0.23942527174949646, 0.17712023854255676, 0.19137126207351685, 0.30833229422569275, 0.5223438739776611, 0.2528019845485687, 0.03141295164823532, -0.2613995373249054, 0.002613998018205166, -0.12414177507162094, -0.1906363070011139, 0.15977433323860168, -0.010347102768719196, 0.1317352056503296, -2.0228161811828613, -0.733443558216095, -0.5982164740562439, 0.9739988446235657, -0.08812043070793152, -0.0462716706097126, 0.14372354745864868, 0.2767515778541565, -0.5808297991752625, 1.0944346189498901, 0.5372741222381592, 0.26997098326683044, 33.65594482421875, -0.10441919416189194, 0.10954698920249939, 0.39139625430107117, -0.5889819264411926, -0.13627903163433075, 0.031897131353616714, 0.402034729719162, -2.0622398853302, -0.47971126437187195, 0.05248516798019409, 0.5396581888198853, 0.11854470521211624, -0.03221516311168671, -0.17516742646694183, 0.07521197944879532, -1.1585129499435425, -2.037691116333008, 0.15316523611545563, 2.930943250656128, 4.300116062164307, 6.325833797454834, 3.688586711883545, 3.7707881927490234, 1.9932185411453247, 2.1685900688171387, 2.4550859928131104, 2.3979403972625732, 1.65420663356781, 1.431644082069397, 1.121984601020813, 1.3598629236221313, 1.3334085941314697, 1.4652296304702759, 0.41984719038009644, 0.6867101788520813, 0.9859870672225952, 0.8796342611312866, 1.1492809057235718, 0.9294144511222839, 0.6806155443191528, 0.9390397667884827, 0.6808654069900513, 0.2863014042377472, 0.49021103978157043, 0.6875697374343872, 0.43727371096611023, 0.6431524753570557, 0.4541271924972534, 0.3779536783695221, 0.32298752665519714, 0.1940022110939026, -0.3520684540271759, 0.4393394887447357, 0.23620043694972992, 0.15122626721858978, 0.36370429396629333, 0.2137497365474701, 0.032892245799303055, 0.43780162930488586, 0.358362078666687, 0.3809700608253479, 0.25069960951805115, 0.18334415555000305, 0.11974256485700607, -0.1486794501543045, -0.789038360118866, 0.17166413366794586, 0.04614442586898804, -0.13616326451301575, 0.15864013135433197, 0.13319332897663116, -0.9418767690658569, -0.4598008692264557, 0.17115722596645355, 0.04908979684114456, -0.3070511221885681, -0.46989622712135315, -0.2992255389690399, 0.0446004793047905, -0.3222765326499939, 0.027071138843894005, 0.5913528203964233, 0.5946903824806213, 0.8207100629806519, 0.5013989806175232, 0.24765194952487946, 0.07745945453643799, 4.8783698081970215, 1.909494161605835, 1.50694739818573, 0.8237159252166748, 0.681323766708374, 0.6196965575218201, 0.6132150292396545, -0.29694995284080505, 1.573716402053833, 1.286145567893982, 0.42683544754981995, -0.18397630751132965, 1.587890386581421, 0.8797012567520142, 0.24249505996704102, -0.3894813060760498, 1.8243526220321655, 0.7878984808921814, 0.34737083315849304, -0.28171148896217346, 2.1819846630096436, 0.6837678551673889, -0.11844699829816818, 0.11501149833202362, 0.10053221136331558, 0.10499868541955948, 0.09244313091039658, 0.0955471470952034, 1.1564537286758423, 1.933864712715149, 0.10591151565313339, -1.899510145187378, -4.402230739593506, -6.009922027587891, -3.5053625106811523, -3.7243921756744385, -2.1733078956604004, -2.4498023986816406, -2.705738067626953, -2.582272529602051, -1.610629916191101, -1.3316141366958618, -1.1391551494598389, -1.4406028985977173, -1.411054253578186, -1.4956468343734741, -0.6153815984725952, -0.7629891633987427, -1.0301345586776733, -0.7873314023017883, -1.2381641864776611, -1.1041938066482544, -0.6400653123855591, -0.8345872759819031, -0.5066656470298767, -0.6872684955596924, -0.5841124653816223, -0.8501527309417725, -0.2372208535671234, -0.4529244303703308, -0.46652692556381226, -0.4378315806388855, -0.5341199040412903, -0.32230648398399353, 0.5129676461219788, -0.21320122480392456, -0.059549931436777115, 0.08367621153593063, -0.27304521203041077, -0.01009787991642952, -0.23602382838726044, -0.341096967458725, -0.3086916208267212, -0.3472224175930023, -0.3764722943305969, -0.22513264417648315, -0.10309196263551712, 0.0815345048904419, 0.6847986578941345, -0.2124079018831253, -0.007125559262931347, 0.2023378312587738, -0.12009096145629883, -0.30767735838890076, 1.0986933708190918, 0.41850510239601135, -0.09262259304523468, -0.19774480164051056, 0.3572198152542114, 0.5051928758621216, 0.33715784549713135, -0.02062220871448517, 0.31153354048728943, 0.053906094282865524, -0.4416230022907257, -0.6985936760902405, -0.7678687572479248, -0.4290647804737091, -0.3711625337600708, -0.15430736541748047, -4.864480495452881, -1.9816323518753052, -1.3885812759399414, -1.0061266422271729, -0.4656505584716797, -0.6132838129997253, -0.5853897333145142, 0.27578455209732056, -1.6483615636825562, -1.1072192192077637, -0.23469579219818115, 0.13465337455272675, -1.596671462059021, -0.9030832052230835, -0.21226856112480164, 0.28404566645622253, -1.6349564790725708, -0.6653254628181458, -0.3474262058734894, 0.2672330141067505, -2.147552490234375, -0.6583167314529419, 0.01303065288811922, 0.5524669885635376, 0.06811608374118805, -0.07579807192087173, -0.17176733911037445, -0.10420197993516922, -1.009429931640625, -1.8512049913406372, -0.08785201609134674, 1.987621784210205, 4.3664469718933105, 6.418051719665527, 3.560272216796875, 3.686209201812744, 2.0355031490325928, 2.2862768173217773, 2.5611984729766846, 2.3746848106384277, 1.81546151638031, 1.4301809072494507, 1.157996654510498, 1.3695895671844482, 1.5349611043930054, 1.4142025709152222, 0.4753105938434601, 0.7501814961433411, 0.943249523639679, 0.871303379535675, 1.143628716468811, 1.036559820175171, 0.5004879832267761, 0.8888629674911499, 0.5656195282936096, 0.5616952180862427, 0.6064168810844421, 0.8109273910522461, 0.24027834832668304, 0.4154175817966461, 0.5288015007972717, 0.4328177571296692, 0.33573034405708313, 0.3299432098865509, -0.4288945496082306, 0.31871163845062256, 0.05238587036728859, 0.11161775141954422, 0.3658129870891571, 0.13098779320716858, 0.20487791299819946, 0.31112128496170044, 0.27915164828300476, 0.353778213262558, 0.3688020706176758, 0.07108382135629654, 0.27720776200294495, -0.21031315624713898, -0.6032363772392273, 0.0506373792886734, 0.21133626997470856, -0.19123466312885284, 0.13970975577831268, 0.12329836189746857, -1.0521756410598755, -0.35878661274909973, 0.16087280213832855, 0.05987543240189552, -0.31787461042404175, -0.4419977366924286, -0.2635335624217987, 0.10338404029607773, -0.2344905287027359, -0.15982739627361298, 0.55088210105896, 0.6106911301612854, 0.7485193610191345, 0.5122960805892944, 0.45970186591148376, 0.2425527274608612, 4.819601535797119, 2.057878017425537, 1.310017704963684, 0.9128594994544983, 0.5672999620437622, 0.7760669589042664, 0.5864931344985962, -0.24902451038360596, 1.663435697555542, 1.207999348640442, 0.3486822843551636, -0.16429470479488373, 1.6904305219650269, 1.0178347826004028, 0.24724605679512024, -0.39276033639907837, 1.8282784223556519, 0.7873908877372742, 0.34983429312705994, -0.28356850147247314, -2.0456159114837646, -0.6278152465820312, 0.23125514388084412, 0.024553675204515457, 0.1432483047246933, -0.18588314950466156, -0.15102198719978333, 0.03273387253284454, -1.2207673788070679, -2.109090566635132, -0.24524728953838348, 1.9536356925964355, 4.376587867736816, 6.384340286254883, 3.6282994747161865, 3.685394763946533, 2.0502471923828125, 2.4934184551239014, 2.5604565143585205, 3.4589407444000244, 1.7075806856155396, 1.4917783737182617, 1.1893131732940674, 1.3703690767288208, 1.5095096826553345, 1.4892301559448242, 2.300849199295044, 0.6193945407867432, 1.090956211090088, 0.7602118253707886, 1.2824450731277466, 1.0779026746749878, 0.6622447371482849, 0.9970871806144714, 0.6264367699623108, 0.6854411959648132, 0.6597336530685425, 0.9048330783843994, 0.37142258882522583, 0.4627552628517151, 0.4762515425682068, 0.4325876533985138, 0.5053542852401733, 0.30256161093711853, -0.47468701004981995, 0.2963486909866333, 0.2587302625179291, 0.09204568713903427, 0.10675150901079178, 0.23103202879428864, 0.14975279569625854, 0.2691170573234558, 0.4239700436592102, 0.25140300393104553, 0.23678719997406006, 0.13798175752162933, 0.2639019191265106, 0.09032312035560608, -0.6554651856422424, 0.15702813863754272, 0.1864757388830185, -0.12346725910902023, 0.044918108731508255, 0.24728088080883026, -1.1188005208969116, -0.38047513365745544, 0.036939334124326706, 0.24591459333896637, -0.2568366229534149, -0.43444153666496277, -0.2768213152885437, 0.12258082628250122, -0.23953522741794586, -0.1821790635585785, 0.5271991491317749, 0.8022661209106445, 1.0044928789138794, 0.4672382175922394, 0.41317373514175415, 0.10818641632795334, 4.848023891448975, 1.9197083711624146, 1.2731341123580933, 0.8431903719902039, 0.5690756440162659, 0.8230016827583313, 0.5954012274742126, -0.27462753653526306, 1.6079009771347046, 1.28499174118042, 0.4452112317085266, -0.2728967070579529, 1.7170624732971191, 1.031516432762146, 0.27498331665992737, -0.19250011444091797, 1.8049074411392212, 0.6921998858451843, 0.4936983585357666, -0.2593942880630493, 0.26210880279541016, -1.2625597715377808, 1.5303987264633179, -1.5684280395507812, -1.0793853998184204]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (0, 0.8)}}, 'et0_eta1': {'discriminator': {'threshold': -0.3000008136034012, 'nodes': [100, 5, 1], 'bias': [0.07912710309028625, -0.16592642664909363, 0.055430684238672256, -0.014784482307732105, -0.11522287130355835, -0.12357601523399353], 'weights': [1.2840709686279297, 1.0852738618850708, -1.369315505027771, -1.0972867012023926, -1.0591846704483032, -0.5868259072303772, -0.5033472180366516, 0.45805636048316956, 3.0219221115112305, 6.521931171417236, 0.7696393132209778, -1.1207029819488525, -9.013591766357422, -8.786622047424316, -16.484954833984375, -8.003006935119629, -11.550616264343262, -7.426932334899902, -14.481563568115234, -9.667226791381836, -6.513081073760986, -14.283663749694824, -7.581745624542236, -3.855841875076294, -6.146892547607422, -4.966252326965332, -3.899606227874756, -8.743027687072754, -9.825140953063965, -4.15073299407959, -3.7676351070404053, -8.134994506835938, -1.7930970191955566, -2.957526445388794, -7.309337139129639, -2.869568347930908, -1.2411209344863892, -0.4964625835418701, -0.6609916090965271, -8.12388801574707, 0.07207289338111877, -0.7860850691795349, -0.11284670233726501, -1.487958312034607, -0.020855560898780823, -0.8731772303581238, -0.8096827268600464, 0.0732320249080658, -0.3150261640548706, 0.02905810996890068, -0.995207667350769, -1.0919345617294312, -0.15127159655094147, -1.3341938257217407, -0.8651060461997986, -0.3385183811187744, -1.0255811214447021, -1.0689022541046143, -1.055164098739624, -1.282610297203064, -1.202532172203064, -1.0187021493911743, -0.0031027160584926605, 0.4577540159225464, 1.0728589296340942, -1.665403127670288, 0.27040785551071167, 1.377341628074646, -1.037282943725586, -1.1434032917022705, -1.0827538967132568, -0.23808342218399048, 0.2897590100765228, 0.23347310721874237, -1.439068078994751, -2.127610206604004, -2.681788444519043, -1.8412806987762451, -0.6987819075584412, -0.674576461315155, -18.550996780395508, -35.748653411865234, -5.584532737731934, -4.5014142990112305, -1.9423075914382935, -1.8683924674987793, -2.301374912261963, -2.0529160499572754, -3.8626766204833984, -1.3899667263031006, -0.4271785020828247, 0.06509584188461304, -5.1670026779174805, -7.045017242431641, -0.6467087864875793, -0.08863567560911179, 0.6757574081420898, -4.818759441375732, -1.6520500183105469, -0.1650698035955429, -1.3969467878341675, -1.0588984489440918, 1.201957106590271, 1.0305925607681274, 0.5654529929161072, 0.7016580104827881, 0.5683532357215881, -0.4255702793598175, -0.6322590708732605, -6.661533355712891, -0.8094892501831055, 1.136033058166504, 8.776829719543457, 8.133058547973633, 15.86755084991455, 11.914630889892578, 11.58179759979248, 7.319742679595947, 7.704929828643799, 4.131524562835693, 6.025197505950928, 8.556721687316895, 6.642760276794434, 4.042305946350098, 8.797414779663086, 4.97426700592041, 3.0041821002960205, 4.278590679168701, 3.5625953674316406, 4.250214099884033, 3.4392945766448975, 3.757570505142212, 1.6601496934890747, 2.351585865020752, 6.8001484870910645, 2.0337579250335693, 0.347318559885025, 0.35584232211112976, 0.5493640899658203, 3.4181058406829834, -1.800899624824524, 0.8725427985191345, -0.6859787106513977, 0.375021368265152, -0.017898498103022575, -0.76921546459198, 1.0174942016601562, -0.204852893948555, -0.18405576050281525, -0.04502330720424652, 1.0492870807647705, 1.1943683624267578, 0.16519154608249664, 1.198194146156311, 0.9113389253616333, 0.2884261906147003, 0.8527284860610962, 0.9921883940696716, 1.1452449560165405, 1.091947317123413, 1.2275621891021729, 1.0474659204483032, -0.02204449288547039, -0.3030826449394226, -1.834603190422058, 2.953547477722168, -0.25386515259742737, -3.2523655891418457, 0.9597296714782715, 1.0528501272201538, 1.0732698440551758, 0.29469817876815796, -0.2843596339225769, 0.08665354549884796, 1.3373972177505493, 2.6264841556549072, 2.9760782718658447, 1.5219119787216187, 0.28468286991119385, 0.65105801820755, 29.478986740112305, 19.256484985351562, 3.654445171356201, 3.2975962162017822, 1.9612878561019897, 1.9934256076812744, 2.1262357234954834, 2.747645616531372, 2.1848957538604736, 0.9484288692474365, 0.42111948132514954, 0.011531686410307884, 1.7289865016937256, 4.474213600158691, 0.5794274806976318, 0.14325931668281555, -0.6980209946632385, 1.689314842224121, 1.680753231048584, 0.43043363094329834, 1.4198896884918213, 1.1724351644515991, -1.2676851749420166, -1.0225167274475098, -1.1697516441345215, -0.652888298034668, -0.4285288155078888, 0.46871963143348694, 6.038356304168701, 7.608031272888184, 0.7189407348632812, -0.7749762535095215, -8.64765739440918, -8.643425941467285, -16.62508201599121, -7.422845363616943, -7.396313190460205, -7.358218669891357, -20.10141372680664, -9.51939582824707, -6.677906036376953, -8.46608829498291, -6.1652679443359375, -4.059062480926514, -4.127655982971191, -4.611688613891602, -4.166707992553711, -8.83194637298584, -5.011529445648193, -4.232881546020508, -3.480527639389038, -8.003325462341309, -1.9020739793777466, -5.648332118988037, -7.834463119506836, -3.0236034393310547, -1.3015278577804565, -0.5348185300827026, -0.575002133846283, -8.022153854370117, 0.053185638040304184, -1.0732767581939697, -1.2053927183151245, -14.197378158569336, 0.12662771344184875, -0.7601639628410339, -0.9760968089103699, 0.1690288484096527, -0.44749560952186584, -0.09660908579826355, -0.8458526134490967, -1.0971641540527344, -0.15835420787334442, -1.3222320079803467, -0.7642360329627991, -0.14284765720367432, -1.093598484992981, -1.0231292247772217, -1.1242387294769287, -1.3498948812484741, -1.354475498199463, -0.9810306429862976, 0.04331092908978462, 0.1815822720527649, 1.2831919193267822, -2.0378880500793457, 0.20876015722751617, 1.4835833311080933, -0.8552014231681824, -1.1035544872283936, -1.0856980085372925, -0.313055157661438, 0.472921222448349, 0.016651004552841187, -1.32878577709198, -1.4505106210708618, -2.7862777709960938, -1.927201271057129, -1.9413669109344482, -0.671669065952301, -19.203067779541016, -43.51567459106445, -5.260374546051025, -3.8644309043884277, -1.9614670276641846, -2.033909559249878, -2.29429030418396, -1.7797765731811523, -5.82073974609375, -3.339376926422119, -0.2603709101676941, -0.09782269597053528, -7.246058464050293, -7.146083831787109, -0.7044716477394104, -0.05370618402957916, -0.5264856219291687, -9.590896606445312, -1.8590527772903442, -0.3807181715965271, -3.4317924976348877, -2.387251138687134, -1.1785171031951904, 0.16945688426494598, 0.023112919181585312, 0.125418558716774, -0.058877550065517426, -0.1212882325053215, -0.5480054020881653, -1.3482944965362549, -0.5728951096534729, 4.2049431800842285, 4.665281772613525, 7.559491157531738, -1.0751097202301025, 4.99504280090332, 3.9325902462005615, 5.595550060272217, 5.287074089050293, 0.6213304996490479, 1.1315468549728394, 0.9817242622375488, 0.4577907621860504, -3.5285890102386475, 0.7720510959625244, -0.01893536001443863, 0.10369762778282166, 0.7110373973846436, 0.6112645268440247, 0.5180173516273499, 0.6054081916809082, 0.5625311136245728, 0.1062650978565216, 0.3081289827823639, 0.3381759226322174, 0.030843429267406464, -1.1930210590362549, -0.6945692300796509, 0.14775222539901733, 0.17419017851352692, -1.1252453327178955, -0.16901077330112457, -0.7228468060493469, -0.6231184005737305, -0.2387773096561432, 0.02976912632584572, 0.2557046711444855, -0.11299484223127365, -1.6002718210220337, 0.08276022225618362, 0.10218506306409836, 0.35337337851524353, -0.09017346054315567, 0.3069175183773041, 0.125926673412323, 0.1369849443435669, -0.06943865865468979, 0.30263787508010864, 0.1388980746269226, 0.3707877993583679, 0.18670988082885742, 0.29261356592178345, 0.009834211319684982, -0.10565973073244095, -0.3551506996154785, 0.23803870379924774, -0.1629188060760498, -0.8372681736946106, 0.26768946647644043, 0.1463763266801834, 0.19380158185958862, -0.025454001501202583, -0.16451886296272278, 0.10199533402919769, -0.19431482255458832, 0.2841373085975647, -1.5142260789871216, -0.15219049155712128, 0.0282551571726799, -0.29358410835266113, -15.149063110351562, -51.47811508178711, -2.3692684173583984, -2.042296886444092, 0.25086161494255066, 0.07330512255430222, 0.3385659158229828, 0.4951131045818329, -1.3850706815719604, -0.48017585277557373, 0.2557167112827301, -0.26179957389831543, -4.3300371170043945, -6.841148376464844, -0.3751208782196045, -0.09754855930805206, -0.39967072010040283, -4.620398044586182, 0.3564530909061432, 0.20330394804477692, -1.2459572553634644, -56.96366882324219, -0.7495980262756348, 0.011348708532750607, 0.11209464818239212, 9.955830574035645, -0.06092618405818939, -13.085612297058105, -0.2878324091434479, -0.2512703537940979, -0.49577951431274414, 1.1158549785614014, 7.858916759490967, 7.4706292152404785, 1.018741250038147, -7.3854756355285645, -2.5500779151916504, 0.9552017450332642, 0.4499334692955017, -0.04558247700333595, 0.29995816946029663, 0.3665873110294342, 0.10671399533748627, -1.1987484693527222, -0.5400920510292053, -0.6814135909080505, 0.13564755022525787, 0.1608869880437851, -104.66850280761719, -169.39642333984375, 0.07884839177131653, -102.97691345214844, 0.02893991209566593, 0.05247867479920387, 0.07826483249664307, 0.022828275337815285, -0.11322685331106186, -0.13274729251861572, 0.01461065374314785, 0.1906159669160843, -0.2515842914581299, 0.07994776964187622, -0.07447956502437592, -0.002124455524608493, -0.06016562134027481, 0.022761227563023567, 0.1023334488272667, 0.03907359391450882, -0.32530465722084045, -0.023200180381536484, 0.17184220254421234, -0.8465481400489807, -0.026417547836899757, 0.05951248109340668, 0.0580524280667305, 0.16763614118099213, -0.5651357173919678, 0.18924766778945923, -0.04362701624631882, 56.32249069213867, 0.03974832594394684, 0.09963121265172958, -0.0235025342553854, 0.0804140567779541, 60.060550689697266, 0.12103980034589767, 0.1095990240573883, 0.0033664556685835123, -41.487667083740234, 0.022729652002453804, 0.1605251133441925, -27.0974178314209, 0.06675954163074493, 0.3092840015888214, 3.8759312629699707, -0.061421528458595276, -0.3207261264324188, 0.06679592281579971, 0.15752357244491577, -0.27046674489974976, 0.6729123592376709, 15.326720237731934, -0.3765791356563568, -0.45191535353660583, 0.03407667577266693, 0.11166712641716003, 0.04790399968624115, 7.216158866882324, -6.869367599487305, -0.8730899691581726, 0.1303199678659439, 0.4529549777507782, -7.460299015045166, -4.544906139373779, -0.011660169810056686, -0.3016832172870636, -3.282896041870117, -3.0215036869049072, 0.21493300795555115, -0.25750163197517395, 1.067456841468811, -0.8189592361450195, 0.5232970118522644, -1.397671103477478, -0.22574138641357422]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (0.8, 1.37)}}, 'et1_eta1': {'discriminator': {'threshold': 0.21499871015548705, 'nodes': [100, 5, 1], 'bias': [0.07878746837377548, 0.08677341043949127, -0.09062515199184418, 0.10544684529304504, -0.1438593566417694, -0.21356718242168427], 'weights': [1.5659047365188599, 0.9648809432983398, -0.7304093241691589, -0.8659931421279907, -0.5332820415496826, -0.6363723874092102, -0.6183121204376221, 0.5051336884498596, 1.8755152225494385, 4.341065883636475, 1.1710530519485474, -6.505293846130371, -17.135475158691406, -13.428292274475098, -6.281867980957031, -5.9451751708984375, -7.6033735275268555, -4.792149066925049, -10.520689964294434, -6.9343976974487305, -6.146981239318848, -5.211281776428223, -4.789704322814941, -5.944562911987305, -4.862949371337891, -3.8030171394348145, -2.786053419113159, -2.33024001121521, -2.247626543045044, -4.0970234870910645, -4.164268493652344, -2.3015685081481934, -1.5032230615615845, -2.2909789085388184, -1.96016263961792, -1.5655924081802368, -1.4894702434539795, -1.505671739578247, -2.519827365875244, -1.4610744714736938, -1.9143593311309814, -2.332859992980957, -0.9403269290924072, -0.46448612213134766, -0.41769787669181824, -1.0052388906478882, -1.2059849500656128, -0.8606165051460266, -0.9873995184898376, -1.755239725112915, -0.9632722735404968, -1.0134726762771606, -0.6971625685691833, 0.7132185697555542, -0.92207270860672, 0.5220871567726135, -1.1433005332946777, -0.9014135599136353, -1.107071042060852, 0.7974112629890442, -1.0199843645095825, -0.7142215967178345, -0.13026972115039825, 0.556758463382721, -0.4890362024307251, -0.26106613874435425, -0.5221725702285767, 1.1105656623840332, 0.45916321873664856, 0.863219141960144, 1.188941478729248, 1.289387822151184, 0.41741055250167847, 0.2294377237558365, -0.863728404045105, -1.2451235055923462, -1.4489322900772095, -1.1300575733184814, -0.676684558391571, 0.04219311475753784, -11.073896408081055, -5.958713054656982, -3.7205474376678467, -2.2830512523651123, -2.058666706085205, -1.5542536973953247, -1.684546709060669, -1.4801374673843384, -1.6644035577774048, -1.1295888423919678, -0.1065991148352623, -0.06916838884353638, -2.6380465030670166, -2.2330574989318848, -0.6323823928833008, -0.09574839472770691, -3.526456117630005, -1.6932258605957031, -0.7307733297348022, -0.07618052512407303, 1.6140717267990112, 0.9083461761474609, -0.7463324069976807, -0.8311288952827454, -0.6001104712486267, -0.7199063301086426, -0.5407007932662964, 0.4181956350803375, 1.8925896883010864, 4.2272419929504395, 1.1489477157592773, -6.5041584968566895, -17.399843215942383, -13.281804084777832, -6.325334548950195, -6.1422038078308105, -7.677373886108398, -4.601325511932373, -10.71367073059082, -6.997285842895508, -5.289201736450195, -5.228020668029785, -4.903777599334717, -5.832911491394043, -4.8241472244262695, -3.728384017944336, -2.610104560852051, -2.2858636379241943, -2.1417181491851807, -4.03259801864624, -4.108504295349121, -2.1530563831329346, -1.5008083581924438, -2.2566938400268555, -2.0193371772766113, -1.3875036239624023, -1.532289981842041, -1.4816795587539673, -2.671248197555542, -1.4923733472824097, -1.7616122961044312, -2.263819456100464, -1.3079100847244263, -0.4640495777130127, -0.444748193025589, -0.8307403326034546, -1.1547013521194458, -0.9561236500740051, -0.8646517992019653, -1.9384024143218994, -0.8790929913520813, -0.8918765783309937, -0.6544865369796753, 0.6777697801589966, -0.9317110180854797, 0.36096832156181335, -1.1082967519760132, -0.9093438982963562, -0.9813116788864136, 0.9327680468559265, -0.9579432010650635, -0.5382611751556396, -0.08897580206394196, 0.6081376671791077, -0.5213435888290405, -0.2733864188194275, -0.5167144536972046, 1.2780096530914307, 0.6490981578826904, 0.9599391222000122, 1.0825730562210083, 3.2302823066711426, 0.3404315114021301, 0.340251088142395, -0.7044371366500854, -1.343554139137268, -1.4054852724075317, -1.162047028541565, -0.6280338168144226, -0.03413762152194977, -11.0466947555542, -6.0684685707092285, -3.680893659591675, -2.2185206413269043, -1.9613081216812134, -1.766802430152893, -1.538538932800293, -1.5903377532958984, -1.6422985792160034, -1.1004009246826172, -0.3240223526954651, 0.019039610400795937, -2.675464630126953, -2.0370731353759766, -0.715338945388794, 0.07707063108682632, -3.4667811393737793, -1.5985088348388672, -0.6330763101577759, -0.2528696060180664, -1.8960459232330322, -1.0027258396148682, 0.5067305564880371, 0.9527478218078613, 0.5965510010719299, 0.6773747801780701, 0.6360541582107544, -0.37760090827941895, -1.856453776359558, -4.162657737731934, -1.2584235668182373, 4.1336212158203125, 17.259607315063477, 13.476606369018555, 4.914238929748535, 6.1066155433654785, 4.895866394042969, 4.815507888793945, 6.058750152587891, 6.964010715484619, 5.503296852111816, 5.141127586364746, 4.798845291137695, 5.95290994644165, 4.833743572235107, 3.675502061843872, 2.635925531387329, 2.3094918727874756, 2.1458842754364014, 4.1145734786987305, 4.103004455566406, 2.2598516941070557, 1.585964322090149, 2.247837543487549, 2.005201578140259, 1.464837670326233, 1.4872993230819702, 1.401034951210022, 2.5492796897888184, 1.5010583400726318, 1.9074424505233765, 2.2760417461395264, 0.9120607972145081, 0.3335728943347931, 0.4092237949371338, 0.8501002788543701, 0.988400399684906, 0.9440240263938904, 0.8589757680892944, 1.9261723756790161, 0.8281877636909485, 0.8581674695014954, 0.5785379409790039, -0.6083903908729553, 0.7873806953430176, -0.4215870499610901, 1.148308277130127, 1.0334372520446777, 0.8644837141036987, -0.8941318392753601, 0.9214351773262024, 0.7328749895095825, 0.23996219038963318, -0.5538854598999023, 0.4644482731819153, 0.16767346858978271, 0.4057011008262634, -1.1372860670089722, -0.4897937476634979, -0.9502201676368713, -1.1757266521453857, -2.9842140674591064, -0.31299638748168945, -0.22618018090724945, 0.6952820420265198, 1.340942144393921, 1.2970201969146729, 0.9921518564224243, 0.6076508164405823, -0.07443709671497345, 10.887611389160156, 6.003010272979736, 3.7811877727508545, 2.2261946201324463, 1.977461814880371, 1.7278523445129395, 1.7282135486602783, 1.4463237524032593, 1.7224303483963013, 1.0049279928207397, 0.18181076645851135, 0.030149556696414948, 2.480088710784912, 2.040257692337036, 0.5761620998382568, -0.03482672944664955, 3.369814157485962, 1.586854100227356, 0.8215991854667664, 0.1370849609375, -1.9574146270751953, -1.4521090984344482, 0.5122400522232056, 1.244722604751587, 0.46037474274635315, 0.6663198471069336, -0.4412102699279785, -0.40150901675224304, -2.0123469829559326, -4.304135322570801, -1.124223232269287, 1.647291660308838, 0.6924226880073547, 2.7552714347839355, 4.283718109130859, 5.832663536071777, 4.807033061981201, 4.5992112159729, 5.247172832489014, 7.131104946136475, 8.728988647460938, 5.158673286437988, 4.692447662353516, 2.9892163276672363, 4.940555572509766, 3.655928611755371, 2.8859896659851074, 2.2362890243530273, 2.1317646503448486, 4.200026988983154, 4.107665061950684, 2.2438814640045166, 1.4463459253311157, 2.302215099334717, 1.9755080938339233, 1.4332865476608276, 1.5041675567626953, 1.2268800735473633, 2.7608890533447266, 1.5800702571868896, 1.8395700454711914, 2.3027749061584473, 0.9759875535964966, 0.28785842657089233, 0.4544990360736847, 0.9149465560913086, 1.1415576934814453, 0.7402114868164062, 0.9559215307235718, 4.758305072784424, 1.0376139879226685, 0.820446252822876, 0.7723636627197266, 0.11163204908370972, 0.9046827554702759, -0.36732906103134155, 0.9617301821708679, 0.9629319310188293, 0.8458541035652161, -0.8507170081138611, 0.3376142680644989, 0.6558126211166382, 0.265159547328949, -0.6776720881462097, 0.6683129072189331, 0.5833651423454285, 0.494357705116272, -1.1640784740447998, -0.4030939042568207, -0.8857857584953308, -1.1221160888671875, -1.3282568454742432, -0.42802050709724426, -0.38321736454963684, 0.8942076563835144, 1.3892022371292114, 1.4553353786468506, 1.089930534362793, 0.6936759352684021, 0.21910341084003448, 9.287567138671875, 6.0840277671813965, 3.7529306411743164, 2.204075336456299, 2.13480806350708, 1.546316385269165, 1.7612775564193726, 1.529960036277771, 1.7187312841415405, 1.0184004306793213, 0.343377947807312, -0.47148779034614563, 2.7142953872680664, 2.209083318710327, 0.70292729139328, 0.10405966639518738, 3.4039182662963867, 1.7822790145874023, 0.6875117421150208, 0.23780299723148346, -32.8738899230957, -37.81534194946289, -12.075221061706543, -11.468256950378418, 0.1232815831899643, 0.1510644257068634, 0.1675015687942505, -0.1855236440896988, -0.2837938964366913, -0.9961743354797363, -0.08889590948820114, 129.31890869140625, 36.529449462890625, -51.88301467895508, -0.763431191444397, 14.546732902526855, 0.9965766668319702, 0.9104911088943481, 1.0545297861099243, 1.5091228485107422, 1.1056817770004272, 1.0016740560531616, 0.9258796572685242, 0.6225981712341309, 0.44181889295578003, 0.5954463481903076, 0.43079787492752075, 0.5151424407958984, 0.5330643057823181, 0.8831751346588135, 0.5037179589271545, 0.4067386984825134, 0.28257647156715393, 0.37684744596481323, 0.4513453245162964, 0.3809264004230499, 0.2865481674671173, 0.20386245846748352, 0.4507436156272888, 0.21807721257209778, 0.29659008979797363, 0.24266064167022705, 0.20065656304359436, 0.08314323425292969, 0.17437247931957245, 0.2457980513572693, 0.32229387760162354, 0.12069272994995117, 0.30228695273399353, 0.39774054288864136, 0.29997503757476807, -0.38129720091819763, 0.22167706489562988, -4.299506664276123, 0.15059468150138855, 0.01656518317759037, 0.32797038555145264, 0.22446657717227936, 0.23864319920539856, 16.24289321899414, 0.11468687653541565, 0.05124553665518761, -0.009889920242130756, -0.0911027267575264, 0.058842312544584274, 0.1794758290052414, 51.05099868774414, -0.15405355393886566, -0.14565473794937134, 65.0590591430664, -0.10797565430402756, -0.3192015290260315, 0.034379709511995316, 0.10224781185388565, 0.31473875045776367, 0.21954958140850067, 0.21234479546546936, 0.26896044611930847, -2.2880539894104004, -0.40903541445732117, 2.2169198989868164, -10.6796293258667, 0.8226518630981445, 0.36855462193489075, 0.3180898427963257, 0.2192901372909546, 0.23922139406204224, 0.434328556060791, 0.22227689623832703, 0.29848235845565796, 0.09666231274604797, -0.0003206164692528546, 0.6237031817436218, 0.3524901866912842, 0.08637594431638718, -0.07169216871261597, 0.588862419128418, 0.26130980253219604, -0.273329496383667, -0.024277890101075172, 0.9060134887695312, 0.4790574610233307, -1.419803261756897, -2.179589033126831, -0.4510728120803833]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0.8, 1.37)}}, 'et1_eta0': {'discriminator': {'threshold': 0.28999863862991332, 'nodes': [100, 5, 1], 'bias': [-0.14838357269763947, 0.25144878029823303, -0.11652927845716476, 0.13229498267173767, -0.07578805834054947, 0.13491149246692657], 'weights': [95.19129943847656, 11.741856575012207, 16.02507781982422, 0.10011348128318787, -0.02626211754977703, -0.26236891746520996, 0.1921187937259674, 0.4249992370605469, 0.7690505385398865, 7.012474060058594, 0.19285306334495544, -52.06716537475586, -3.558515787124634, -1.7555186748504639, -2.833900213241577, 0.13553743064403534, -1.0423412322998047, -1.1745504140853882, -1.8256951570510864, -0.9797239899635315, -10.708517074584961, -1.3077757358551025, -0.8748009204864502, -0.7803052663803101, -1.2832530736923218, -1.6770447492599487, -1.9737194776535034, -0.8626661896705627, -0.8816892504692078, -0.7034444212913513, -0.6762866973876953, -0.635657012462616, -0.6396099925041199, -0.3468100130558014, -0.5341374278068542, -0.11195473372936249, -0.40212300419807434, -0.2480846792459488, -0.325020432472229, -3.855881452560425, 0.07648580521345139, 2.0059103965759277, 0.38595050573349, -0.28606802225112915, -0.1911175400018692, 0.0496709980070591, -0.20416133105754852, -0.13591425120830536, -0.21782056987285614, -0.14982694387435913, -0.3458673357963562, 2.685936212539673, 0.0830884650349617, -0.2343558520078659, -0.02893759496510029, -0.23814614117145538, -0.15646962821483612, -0.36947208642959595, -0.644164502620697, -0.2825821340084076, 2.2481906414031982, -0.44918546080589294, -0.40254706144332886, -0.24485482275485992, -0.3470233678817749, -0.6762277483940125, -0.3632008135318756, -0.2105434387922287, -0.2939314544200897, -0.46783432364463806, 0.10626179724931717, -0.16687007248401642, -0.4400171637535095, -0.8531773686408997, -0.17114804685115814, -0.43476438522338867, 8.49741268157959, -0.1664600819349289, 9.129036903381348, -0.08669326454401016, -3.7099428176879883, -1.9276771545410156, -1.057891607284546, -0.5976185202598572, -0.26905229687690735, -0.1107390746474266, -0.38286274671554565, -0.5918667912483215, 11.096704483032227, 1.0739575624465942, -0.24779626727104187, -2.242649555206299, 5.053264141082764, -0.8903695940971375, 0.8266764879226685, -1.0125495195388794, -1.3823695182800293, -27.63068962097168, -2.53593111038208, -8.042662620544434, -2.737989902496338, -1.0389459133148193, 0.4913625419139862, 0.10595270246267319, 0.13811925053596497, -0.19078178703784943, -0.21392704546451569, -0.6970409154891968, -2.3928592205047607, -2.9218931198120117, 2.389368772506714, 1.0842325687408447, 8.03018856048584, 4.644124984741211, 6.77893590927124, 5.495616912841797, 4.594947338104248, 3.778296709060669, 4.166909694671631, 3.835531711578369, 3.7985637187957764, 2.952554225921631, 2.3199124336242676, 3.3626532554626465, 3.175717830657959, 2.214024305343628, 2.5483808517456055, 2.8874990940093994, 1.8591904640197754, 1.4633781909942627, 2.016352415084839, 1.6907203197479248, 1.1530073881149292, 1.0271637439727783, 1.25846266746521, 0.5229665637016296, 1.8052173852920532, 0.6280537247657776, 1.2053626775741577, 1.6536502838134766, 1.254310965538025, 0.31223177909851074, 1.107873558998108, 0.6442340016365051, 0.6684360504150391, 0.021251684054732323, 0.701140820980072, 0.699420154094696, 0.7883498072624207, 0.674681544303894, 0.9158751964569092, -0.0821174755692482, 0.285078227519989, 0.40715131163597107, 0.3526609241962433, 0.5237181782722473, 0.4306817352771759, -0.8004676699638367, 1.0787967443466187, -0.9037007093429565, 0.10453902184963226, 0.5124558210372925, -0.8510817289352417, 0.5017541646957397, -0.6077107787132263, 2.1264536380767822, -0.9079309701919556, 0.3165406882762909, -0.9242562055587769, 2.0951483249664307, -0.3876737058162689, -0.18814775347709656, -0.579097330570221, -0.4602149426937103, 0.5520136952400208, 1.4085649251937866, 1.6525052785873413, 0.8659822344779968, 0.7131392955780029, 0.17101585865020752, 9.001567840576172, 3.801792860031128, 2.7835278511047363, 1.6930255889892578, 1.703271746635437, 0.7098519206047058, 1.3761498928070068, 1.8842169046401978, 3.7300264835357666, 2.490417242050171, 1.1095693111419678, -0.08724035322666168, 3.7904562950134277, 2.062978982925415, 0.7154816389083862, -0.371543288230896, 4.978955268859863, 2.01200532913208, 0.10207057744264603, -0.2757415771484375, 2.7562854290008545, 1.1481013298034668, 2.4806113243103027, -0.13878732919692993, -0.13191728293895721, 0.29225191473960876, 0.09628856927156448, 0.47339704632759094, 2.2541606426239014, 2.7372288703918457, -2.2985401153564453, -1.172971487045288, -8.135680198669434, -4.71184778213501, -6.749009132385254, -5.21626615524292, -4.5369486808776855, -3.824171304702759, -4.156552314758301, -3.7673161029815674, -3.903435230255127, -2.910134792327881, -2.4492738246917725, -3.3961477279663086, -3.1751935482025146, -2.3678030967712402, -2.574861526489258, -2.817983865737915, -2.059072494506836, -1.6089917421340942, -1.9422978162765503, -1.6940301656723022, -1.7977452278137207, -1.5840034484863281, -1.2880768775939941, -1.0989676713943481, -1.7105618715286255, -0.5255144238471985, -1.1470330953598022, -2.075187921524048, -1.1716173887252808, -0.411764919757843, -1.7554481029510498, -0.672191321849823, -0.8301509022712708, -0.0434354729950428, -0.7817392945289612, -0.8091703057289124, -0.8585111498832703, -0.7360691428184509, -0.9522177577018738, 0.13340355455875397, -0.3006344735622406, -0.5779744982719421, -0.6740109920501709, -0.5372864603996277, -0.5184283256530762, -0.7861366868019104, -0.9753947257995605, 0.6817193627357483, -0.2591269016265869, -0.8696759939193726, 0.6915005445480347, -0.5585052371025085, 0.5093518495559692, -2.310509204864502, 0.850063681602478, -0.32538288831710815, 0.9049855470657349, -1.4595438241958618, 0.497938334941864, 0.026875782757997513, 0.47351351380348206, 0.3532848060131073, -0.5181555151939392, -1.4200944900512695, -1.74879789352417, -0.9060390591621399, -0.5860204696655273, -0.31095582246780396, -9.100980758666992, -3.7149252891540527, -3.2036616802215576, -1.8167163133621216, -1.7820651531219482, -1.1369755268096924, -1.2624938488006592, -1.7861624956130981, -3.9490883350372314, -2.5219972133636475, 0.013021562248468399, 0.09003457427024841, -3.8627545833587646, -2.1616156101226807, -0.7725381851196289, 0.1400979608297348, -4.973443508148193, -1.877490520477295, -0.38001173734664917, 0.22719255089759827, -2.6791460514068604, -1.0740805864334106, 0.6742224097251892, 0.2183074653148651, 0.24098700284957886, -0.2630571126937866, -0.14663521945476532, -0.6423366069793701, -2.112431764602661, -4.136777877807617, 2.4870362281799316, 1.4848414659500122, 8.121408462524414, 4.807705402374268, 6.898557662963867, 5.348454475402832, 4.5023345947265625, 3.8281822204589844, 4.318142890930176, 3.7068848609924316, 3.9023501873016357, 3.069344997406006, 2.3145384788513184, 2.688652753829956, 3.284595012664795, 2.31209659576416, 2.4553372859954834, 2.807197093963623, 1.8894648551940918, 1.5708591938018799, 2.62680983543396, 1.7795666456222534, 1.8132777214050293, 1.741929531097412, 1.3996309041976929, 0.6534087061882019, 1.8329761028289795, 0.5905709266662598, 1.1026984453201294, 1.4855315685272217, 1.2832627296447754, 0.33725202083587646, 2.0967719554901123, 0.7504424452781677, 0.8471408486366272, 0.022409165278077126, 0.7526841759681702, 0.7959187626838684, 0.8463996052742004, 0.632745087146759, 0.8736437559127808, -0.14266042411327362, 0.34806883335113525, 0.6010323166847229, 0.5680012702941895, 0.4543585777282715, 0.4858270287513733, -0.8253456950187683, 1.1311039924621582, -0.8435128927230835, 0.2741364538669586, 0.909307599067688, -0.9468972682952881, 0.584182858467102, -0.5513917207717896, 1.9260207414627075, -0.9443435072898865, 0.46451103687286377, -0.9175392389297485, 1.5605148077011108, -0.27525851130485535, -0.16740450263023376, -0.45197272300720215, -0.3012372553348541, 0.6997389793395996, 1.4629709720611572, 1.7846672534942627, 0.8147075772285461, 0.6206318736076355, 0.09512259066104889, 8.920882225036621, 3.9832763671875, 2.9573493003845215, 1.4843014478683472, 1.7643756866455078, 1.1718899011611938, 1.2684293985366821, 1.5955935716629028, 3.8892362117767334, 2.9177746772766113, 1.0332192182540894, -0.059792354702949524, 3.819514274597168, 2.138584613800049, 0.7816184163093567, -0.27615463733673096, 3.9615116119384766, 2.031785488128662, 0.10081794857978821, -0.10329484939575195, 2.569387435913086, 1.3086349964141846, 0.45039135217666626, -0.13960394263267517, -0.22413140535354614, -0.08052155375480652, 0.09547892957925797, -0.1618652641773224, 0.48517608642578125, 1.152969479560852, -1.8770301342010498, -5.145897388458252, -6.518013000488281, -4.695010662078857, 0.7889900803565979, -0.9573135375976562, -0.5719367861747742, -0.6067541837692261, -0.874249279499054, -0.5320576429367065, -0.6982170939445496, -0.662816047668457, -0.587698221206665, -0.463765412569046, -0.648121178150177, -0.8131048679351807, -0.5987052321434021, -1.097834825515747, -0.39535051584243774, -0.4116835594177246, -0.33606502413749695, -0.5002649426460266, -0.43801525235176086, -0.3365999162197113, -0.3694484531879425, -0.13577018678188324, -0.42855143547058105, -0.23667606711387634, -0.17177703976631165, -0.7949079275131226, -0.18176163733005524, 0.8906658887863159, -0.25346076488494873, -0.22299210727214813, -0.01927288807928562, 0.02859361842274666, -0.08741401880979538, -0.20356565713882446, -0.2601315975189209, -0.20806293189525604, -0.13253656029701233, -0.09619174152612686, -0.036301594227552414, -0.13379035890102386, -0.11062785983085632, -0.238739475607872, -0.26680827140808105, -0.1274007260799408, -0.20274396240711212, 0.5608354806900024, 0.272896945476532, -0.23260410130023956, -0.17474469542503357, -0.27110347151756287, 0.06125000864267349, -0.3960183560848236, 0.14882424473762512, -0.08174638450145721, -0.19581131637096405, -0.2543712854385376, -0.015106226317584515, -0.11259234696626663, 0.2796128988265991, 0.30497807264328003, -0.46281594038009644, -0.3996846079826355, -0.2621391713619232, -0.2377009093761444, -0.0989050567150116, -0.03724947199225426, -1.7369047403335571, -1.0734820365905762, -0.4958740174770355, -0.062190599739551544, -0.2812640368938446, -0.19974268972873688, -0.28775131702423096, -0.26564815640449524, 0.3730814754962921, -0.16685444116592407, 0.07420745491981506, 0.3034503161907196, 1.0472584962844849, -0.38392573595046997, 0.39567098021507263, 0.21045194566249847, -0.6231736540794373, -0.3825681507587433, -0.00195758743211627, 0.38315948843955994, 0.3620164096355438, -1.560401201248169, 0.8041791319847107, -1.574544906616211, 1.7111692428588867]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0, 0.8)}}, 'et3_eta1': {'discriminator': {'threshold': 0.40499852895736693, 'nodes': [100, 5, 1], 'bias': [0.08400861918926239, 0.2620103359222412, 0.24071946740150452, 0.19827689230442047, -0.21444356441497803, -0.16269882023334503], 'weights': [1.3870303630828857, 1.545779824256897, -0.1211574450135231, -0.1604125052690506, 0.003455043537542224, 0.0373167023062706, -0.0008176243281923234, -0.1041955053806305, 1.9358210563659668, 1.1951357126235962, 0.10143648833036423, -25.354907989501953, -0.6181513071060181, -0.6878902912139893, -0.28270137310028076, -0.26728931069374084, 0.09674908220767975, -0.04723811149597168, -0.10195126384496689, -0.09748301655054092, -0.08096246421337128, -0.11469700187444687, -0.18720217049121857, -0.15647678077220917, -0.10083829611539841, -0.09872053563594818, -0.08260013908147812, -0.19229328632354736, -0.17390254139900208, -0.013552741147577763, -0.04412402585148811, -0.020637324079871178, -0.06556025892496109, 0.010761035606265068, 0.007332846987992525, -0.09549709409475327, 0.0055735427886247635, -0.04326797276735306, -0.026291750371456146, -0.012747513130307198, -0.11395005136728287, -0.08593226224184036, -0.18707366287708282, -0.17402325570583344, 0.03683244064450264, -0.08664781600236893, -0.048864684998989105, -0.043266694992780685, -0.13139894604682922, -0.1760513335466385, -0.0735984519124031, 0.033980291336774826, -0.05367200821638107, 0.04039214923977852, -0.13830821216106415, -0.17115141451358795, -0.16189970076084137, 0.006275412626564503, -0.15192170441150665, -0.13326263427734375, -0.0323016531765461, 0.03400120884180069, 0.048464350402355194, -0.10741231590509415, -0.0037862390745431185, 0.018620189279317856, -0.022172946482896805, -0.019969813525676727, 0.03648371994495392, -0.06694190204143524, -0.07595319300889969, 0.03042070008814335, -0.09400361031293869, -0.08751234412193298, 0.23960021138191223, 0.010954230092465878, -0.011702854186296463, -0.09963168203830719, -0.00548516632989049, -0.16506044566631317, -0.04024888202548027, 1.709905982017517, -0.009197653271257877, -0.20769701898097992, 0.00027013005455955863, -0.15704846382141113, -0.18527181446552277, 0.028678344562649727, 0.027525002136826515, -0.1432519257068634, -0.13393062353134155, -0.02212144061923027, -0.22258269786834717, -0.1720305234193802, 0.03878394514322281, 0.007031652610749006, -0.20320329070091248, -0.05397924408316612, -0.09084600955247879, -0.030423659831285477, 1.8000046014785767, 1.5978862047195435, -1.9218839406967163, -1.8942296504974365, -0.8629290461540222, -0.5792128443717957, -0.05435245856642723, 0.03689047321677208, 2.4350266456604004, 3.194561004638672, 0.44461438059806824, -9.256474494934082, -0.9887266159057617, -4.604175090789795, -9.85036563873291, -9.955562591552734, -4.12244176864624, -9.302202224731445, -7.7895073890686035, -7.782469749450684, -7.924829483032227, -6.798374652862549, -6.597860813140869, -4.442999839782715, -4.796265602111816, -5.3657636642456055, -6.788576126098633, -3.9174540042877197, -2.8785464763641357, -3.409435272216797, -3.828425645828247, -3.0410830974578857, -4.328237056732178, -4.840612888336182, -3.2818822860717773, -2.694267749786377, -2.799024820327759, -2.5303401947021484, -2.8014657497406006, -2.3828911781311035, -2.671236276626587, -2.8098084926605225, -2.375687599182129, -1.5008713006973267, -0.8590118288993835, 1.332993507385254, 2.859013319015503, -2.7545406818389893, -1.90874183177948, -1.5139425992965698, -0.9410613775253296, -1.0205518007278442, -1.034328579902649, 7.021887302398682, -0.550938069820404, -1.2195676565170288, -1.3496793508529663, -1.1987366676330566, -0.7768914103507996, -0.7735779285430908, -1.1650207042694092, 2.5105559825897217, -0.5942962765693665, -0.061837270855903625, -1.202467679977417, -1.9875118732452393, -2.077728271484375, 0.023267388343811035, 0.5732965469360352, -0.47423866391181946, -0.9673288464546204, -1.1379636526107788, 0.3638814091682434, 0.3653498888015747, -1.3761401176452637, -3.0876646041870117, -2.8285109996795654, -2.564142942428589, -1.7563674449920654, -0.7710369229316711, -8.261331558227539, -9.57934856414795, -7.496679306030273, -4.245700836181641, -3.300792932510376, -2.7256243228912354, -3.2882378101348877, -2.9284284114837646, -3.1938936710357666, -1.7253892421722412, -0.5164909958839417, 0.20818915963172913, -5.838634490966797, -4.411934852600098, -2.0533292293548584, -1.2924243211746216, -5.335330486297607, -4.256328582763672, -2.877652883529663, -0.3888950049877167, 1.6076847314834595, 1.5545684099197388, -1.8873270750045776, -1.8025767803192139, -0.8662094473838806, -1.142563819885254, -0.0529746375977993, -0.13299113512039185, 2.3590879440307617, 3.2289724349975586, 0.5835632681846619, -9.185218811035156, -0.9604030847549438, -4.507839679718018, -10.056012153625488, -9.956707000732422, -4.040421485900879, -9.494743347167969, -7.678216457366943, -7.771495819091797, -7.840197563171387, -6.653186321258545, -6.669130802154541, -4.495187759399414, -4.7033796310424805, -5.266236305236816, -6.804109573364258, -4.041956424713135, -3.045346736907959, -3.474898338317871, -4.017399787902832, -3.159050703048706, -4.450016021728516, -4.641916751861572, -3.3199379444122314, -2.578796148300171, -2.8245441913604736, -2.554020404815674, -2.6153576374053955, -2.471339225769043, -2.6475069522857666, -2.725276231765747, -2.379896640777588, -1.4618204832077026, -0.9186662435531616, 1.3636624813079834, 2.909921646118164, -2.7451729774475098, -1.3279407024383545, -1.3647207021713257, -0.928147554397583, -1.0977929830551147, -0.9804644584655762, 6.970958232879639, -0.439843088388443, -1.059820532798767, -1.3140761852264404, -1.0901777744293213, -0.9821703433990479, -0.6636222004890442, -1.134922981262207, 2.334444522857666, -0.6153058409690857, -0.1405148059129715, -1.3018606901168823, -2.033582925796509, -2.0539443492889404, -0.08865343034267426, 0.7440711259841919, -0.2513491213321686, -0.9271875023841858, -0.9564580917358398, 0.4307788610458374, 0.38828444480895996, -1.396104097366333, -3.0934195518493652, -2.78790545463562, -2.5201985836029053, -1.7397568225860596, -0.6647769808769226, -8.308713912963867, -9.542397499084473, -7.708185195922852, -4.226221084594727, -3.327768087387085, -2.585510730743408, -3.122009038925171, -2.928595781326294, -3.1857454776763916, -1.7513740062713623, -0.3979124128818512, 0.2594325840473175, -5.800276756286621, -4.5548930168151855, -2.093766927719116, -1.3664616346359253, -5.283833980560303, -4.259984493255615, -2.8230862617492676, -0.4071483314037323, 1.699032187461853, 2.4416637420654297, -1.8492661714553833, -1.9438350200653076, -0.9471112489700317, 0.3965320587158203, 0.4386395514011383, -0.17594856023788452, 2.4020628929138184, 3.2416229248046875, 0.48300525546073914, -8.711160659790039, -0.028571004047989845, -0.9841560125350952, -10.014693260192871, -10.013465881347656, -4.2019124031066895, -9.446413040161133, -7.7291083335876465, -7.722021579742432, -7.922181129455566, -6.6611857414245605, -6.584670543670654, -4.470090866088867, -4.754766464233398, -3.2413151264190674, -6.723607063293457, -3.8558523654937744, -2.9753382205963135, -3.41188907623291, -3.83762264251709, -3.247236490249634, -4.454031944274902, -4.693950176239014, -3.2998342514038086, -2.669220447540283, -2.5948688983917236, -2.634884834289551, -2.752702236175537, -2.44820237159729, -2.719721555709839, -2.7137038707733154, -1.983793020248413, -0.9862497448921204, -0.9923154711723328, 1.2447136640548706, 9.625431060791016, -2.73079252243042, -1.4025661945343018, -1.4989519119262695, -0.8381300568580627, -1.004886269569397, -0.8731553554534912, 6.873755931854248, -0.5713590979576111, -1.253420352935791, -1.3982919454574585, -0.7301944494247437, -0.9856669902801514, -0.6818344593048096, -1.122927188873291, 2.863640546798706, -0.4517926275730133, -0.13653726875782013, -0.7909726500511169, -1.7048566341400146, -1.890999674797058, -0.012608615681529045, 9.152520179748535, -0.4751805365085602, -1.0773954391479492, -0.9502674341201782, 0.4680348336696625, 0.09042961150407791, -1.4125020503997803, -3.125809907913208, -2.7144336700439453, -2.627927780151367, -1.6304054260253906, -0.661928117275238, -7.867833614349365, -9.178266525268555, -7.608427047729492, -4.360863208770752, -3.37911319732666, -2.6212716102600098, -3.2007334232330322, -2.8146395683288574, -3.2725203037261963, -1.8375976085662842, -0.5516853332519531, 0.18065145611763, -5.989046096801758, -4.561517238616943, -2.1645686626434326, -0.069617360830307, -5.382036209106445, -4.417229652404785, -2.8349673748016357, -0.8898947238922119, -1.6094502210617065, -2.661825180053711, 1.7281036376953125, 1.8384814262390137, 0.7556837797164917, -0.3615821897983551, -0.062011729925870895, 0.06735330075025558, -2.481142520904541, -3.130866527557373, -0.5814651846885681, 8.928794860839844, 0.9175635576248169, 4.564447402954102, 9.970992088317871, 10.053274154663086, 4.205488204956055, 9.293432235717773, 7.655348300933838, 7.757172584533691, 7.794203758239746, 6.767029285430908, 6.596225261688232, 4.353512763977051, 4.562531471252441, 5.278942108154297, 6.729154586791992, 3.8607726097106934, 3.0463004112243652, 3.556260824203491, 3.828110933303833, 3.1530776023864746, 4.38740348815918, 4.552087306976318, 3.3550286293029785, 2.6658520698547363, 2.7426342964172363, 2.469050407409668, 2.631613254547119, 2.5260581970214844, 2.6577532291412354, 2.748791456222534, 2.0346450805664062, 1.4344130754470825, 1.0039559602737427, -1.2467317581176758, -1.9087446928024292, 2.736844539642334, 1.5022457838058472, 1.411020278930664, 0.9106569290161133, 0.9674198627471924, 0.8818994760513306, -7.0665154457092285, 0.4264790117740631, 1.0790997743606567, 1.2363909482955933, 1.2605414390563965, 0.8254251480102539, 0.845571756362915, 1.127962589263916, -2.4217958450317383, 0.5122345685958862, 0.06578044593334198, 1.3833636045455933, 1.980806589126587, 2.071420669555664, 0.08308499306440353, -0.6231350898742676, 0.27991509437561035, 0.9711769223213196, 1.0928012132644653, -0.37353163957595825, -0.39586418867111206, 1.2463382482528687, 2.9772725105285645, 2.9024198055267334, 2.6931049823760986, 1.8739650249481201, 0.694912850856781, 8.26921272277832, 9.65395450592041, 7.613109588623047, 4.346840858459473, 3.348928689956665, 2.7357542514801025, 3.2670624256134033, 2.881432056427002, 3.2476694583892822, 1.734588384628296, 0.523329496383667, -0.20963075757026672, 5.959713459014893, 4.338916778564453, 2.07399582862854, 1.3437578678131104, 5.273766994476318, 4.252528667449951, 2.7896552085876465, 0.25933343172073364, 1.6186773777008057, 2.1224305629730225, 1.5090688467025757, 0.6439090967178345, -1.478746771812439]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0.8, 1.37)}}, 'et0_eta3': {'discriminator': {'threshold': -0.080001008510589611, 'nodes': [100, 5, 1], 'bias': [-0.06872621923685074, 0.03307996317744255, -0.23921453952789307, -0.06494033336639404, -0.18441444635391235, 0.31420576572418213], 'weights': [1.1976479291915894, 1.1918416023254395, -0.1382010132074356, -0.6023399829864502, -0.7240791320800781, -0.6505488157272339, -0.6093899607658386, -0.34861627221107483, 1.8854871988296509, 2.6244194507598877, 2.654365301132202, -0.14100617170333862, -0.5267295241355896, -0.28703752160072327, -7.191267967224121, -4.465005397796631, -3.7317757606506348, -8.905920028686523, -4.735798358917236, -7.743622779846191, -3.4018361568450928, -0.05608991160988808, -6.728381633758545, -8.23458194732666, -3.9403929710388184, -3.006030321121216, -2.711745500564575, -3.346447467803955, -2.326688051223755, -2.109919548034668, -0.5147548913955688, -1.968123197555542, -3.480151891708374, -6.054640769958496, -1.142769694328308, -1.98679780960083, 0.1615237295627594, 0.3403989374637604, 0.2695309817790985, -1.0647729635238647, 0.0740254819393158, 1.0841532945632935, -2.926279306411743, -1.5454617738723755, -0.5176843404769897, 0.11136742681264877, -6.313849449157715, 1.3565044403076172, -0.2605409324169159, -0.990673840045929, -0.3235543668270111, -1.599892020225525, 0.3980337381362915, 0.9674480557441711, 0.5569025278091431, -1.3428746461868286, -0.2748319208621979, -0.9134907722473145, 0.4903411567211151, -0.6930826902389526, 0.2818569540977478, -0.5017110109329224, 1.5692251920700073, -1.2303651571273804, 0.6028472185134888, -0.2740112841129303, 0.6013957262039185, -0.6984028220176697, 1.0342010259628296, -0.5773690938949585, 1.8782917261123657, 1.2547498941421509, 0.509377121925354, 0.47140994668006897, -1.8850581645965576, -2.933959484100342, -2.1245598793029785, -1.9417221546173096, -1.2160096168518066, -0.347282737493515, -15.758408546447754, -10.45015811920166, -4.259603500366211, -0.8548963069915771, -2.0923585891723633, -2.778348445892334, 0.9994131922721863, -1.1098016500473022, -0.5933070182800293, -1.4944028854370117, -0.4275020956993103, -0.1313917636871338, -5.532641887664795, -2.516216993331909, -0.07028330117464066, -0.04767567291855812, -0.4112379252910614, -0.07741036266088486, 0.13981930911540985, -2.760042428970337, -1.0493351221084595, -1.1243500709533691, 0.09304428100585938, 0.5045327544212341, 0.9096773266792297, 0.8408878445625305, 0.5277706980705261, 0.37105610966682434, -1.742631435394287, -2.5432610511779785, -2.5564956665039062, 0.22631721198558807, 0.32676345109939575, 0.10996110737323761, 7.247534275054932, 4.458943843841553, 3.710369110107422, 8.79906177520752, 4.917060852050781, 7.606398582458496, 3.7535743713378906, -0.07122580707073212, 4.889994144439697, 4.466143608093262, 4.046082973480225, 2.8723483085632324, 2.6209402084350586, 3.3939313888549805, 2.310600519180298, 2.2353200912475586, 0.5538920760154724, 2.1038951873779297, 3.440603494644165, 6.052570343017578, 1.1919294595718384, 2.1146488189697266, -0.22042077779769897, -0.36891189217567444, -0.2156139463186264, 1.1432558298110962, -0.14311255514621735, -1.227011799812317, 3.0968141555786133, 1.6369976997375488, 0.444904088973999, -0.1313966065645218, 6.40336799621582, -1.095916986465454, 0.39591464400291443, 1.0142964124679565, 0.34312161803245544, 1.5967074632644653, -0.49618256092071533, -0.9082210063934326, -0.6603153944015503, 1.3480644226074219, 0.4634259045124054, 0.9664291143417358, -0.4353172481060028, 0.6172215938568115, -0.35067519545555115, 0.3126639425754547, -1.5804325342178345, 1.1032880544662476, -0.5260769724845886, 0.14027687907218933, -0.6014657020568848, 0.48444801568984985, -0.9492918848991394, 0.6320152878761292, -2.009819984436035, -1.370741367340088, -0.5803539752960205, -0.4363330006599426, 1.8976479768753052, 3.0311591625213623, 2.1435470581054688, 2.006779432296753, 0.9773839712142944, 0.25403234362602234, 15.85167121887207, 10.469559669494629, 4.446294784545898, 0.9400776624679565, 1.938518762588501, 2.1135571002960205, -1.0013408660888672, 1.1384257078170776, 0.6940092444419861, 1.5435560941696167, 0.41838473081588745, 0.16723643243312836, 5.6759467124938965, 2.291001796722412, -0.024860527366399765, 0.035911526530981064, 0.29944905638694763, 0.23417073488235474, 0.019712600857019424, 2.7292098999023438, 2.481264591217041, 2.2801291942596436, 0.03779413551092148, -0.15724125504493713, -0.3424062430858612, -0.07547106593847275, -0.19199736416339874, -0.13443736732006073, 2.9475345611572266, 4.062973976135254, 2.8576979637145996, -6.101906776428223, -4.60906982421875, -3.58305287361145, -13.704071998596191, -8.596972465515137, -1.4450905323028564, 0.3064310550689697, 5.7766618728637695, -2.8282039165496826, 10.69840145111084, 4.800511837005615, -1.0980195999145508, -0.7566824555397034, -1.2969902753829956, 13.995598793029785, 5.0080156326293945, -1.2548549175262451, 6.736884593963623, -0.7117260694503784, 0.3949907422065735, 1.6167668104171753, 2.5928537845611572, -0.7386620044708252, 3.2658324241638184, -0.6925867199897766, 2.491560935974121, -0.6414268612861633, 0.7591795325279236, -0.2912251949310303, 0.34800097346305847, 0.6302226185798645, 0.1096944659948349, -0.7213243842124939, -0.1988636702299118, 0.08903734385967255, -0.7325190305709839, -0.09340585023164749, -0.25363677740097046, -0.6349132061004639, -0.01584606058895588, -0.7670139670372009, -0.4896441102027893, -0.5210203528404236, 0.2845474183559418, -0.7244967222213745, -0.5089740753173828, -0.5387217998504639, 0.028853239491581917, -0.4429834187030792, 0.07197647541761398, -0.4443061649799347, 0.8580699563026428, -0.6266505718231201, 0.46683478355407715, 0.15394212305545807, 0.4302699863910675, -0.058980174362659454, 0.4415808618068695, -0.23434093594551086, 1.8533775806427002, 0.4833405315876007, 0.9036070108413696, -0.021586187183856964, -0.6983773112297058, 3.4084079265594482, -1.4845311641693115, 0.4992196559906006, 1.0107059478759766, -0.39281514286994934, 2.7710535526275635, 13.816033363342285, -1.2146410942077637, 0.7918723225593567, -0.9272428750991821, -0.8534931540489197, 0.8947334289550781, 0.23085364699363708, 0.054398681968450546, 0.6441670656204224, 0.05373748391866684, 0.13250936567783356, 16.56742286682129, 9.95398235321045, 0.104967400431633, 0.9624089002609253, -0.24892404675483704, 0.17906038463115692, 0.29125577211380005, -0.6022586226463318, 1.0461007356643677, 1.2559155225753784, -0.2712388336658478, -0.7925508618354797, -0.7904696464538574, -0.773720920085907, -0.6248278617858887, -0.33554568886756897, 1.926790714263916, 2.6211698055267334, 2.6149191856384277, -0.2234211564064026, -0.4709564745426178, -0.3294180631637573, -7.170814514160156, -4.5053019523620605, -3.768587350845337, -8.872048377990723, -4.84211540222168, -7.6050190925598145, -3.7526473999023438, -0.1937699317932129, -6.744506359100342, -8.201873779296875, -3.965329170227051, -2.9055325984954834, -2.9496583938598633, -3.3750367164611816, -2.481515884399414, -2.2055130004882812, -0.5830821394920349, -2.023529291152954, -3.169849157333374, -6.016546249389648, -1.138245701789856, -2.0847153663635254, 0.05548820644617081, 0.3221282958984375, 0.2844690680503845, -1.108593225479126, 0.05557818338274956, 1.0521198511123657, -3.0607361793518066, -1.759029746055603, -0.5845960378646851, -0.009794293902814388, -6.410668849945068, 1.5034576654434204, -0.34046921133995056, -1.107670545578003, -0.2885671555995941, -1.5469094514846802, 0.48042571544647217, 1.0087361335754395, 0.5187746286392212, -1.278538465499878, -0.39988186955451965, -0.8841748237609863, 0.518634557723999, -0.7211765050888062, 0.2082178145647049, -0.2982442080974579, 1.4779547452926636, -1.077598214149475, 0.5938440561294556, -0.11019671708345413, 0.6488816142082214, -0.5492929220199585, 1.1870932579040527, -0.765427827835083, 1.9755843877792358, 1.381844401359558, 0.539974570274353, 0.4430347979068756, -1.7137421369552612, -2.9629628658294678, -2.2744812965393066, -2.0315017700195312, -1.3616678714752197, -0.33355197310447693, -15.714582443237305, -10.561205863952637, -4.430583477020264, -1.5568273067474365, -1.9205622673034668, -2.749734878540039, 0.9319148659706116, -1.3123542070388794, -0.7859432101249695, -1.5262622833251953, -0.4076409339904785, -0.14709152281284332, -5.614198684692383, -4.337588310241699, -0.18380026519298553, -0.14298123121261597, -0.31882938742637634, -0.13607220351696014, 0.06291235238313675, -2.765294313430786, 1.0509060621261597, 1.1357561349868774, -0.23168998956680298, -0.7986505031585693, -0.911983072757721, -0.6026881337165833, -0.3487003445625305, -0.2430620640516281, 3.532968759536743, 2.7017366886138916, 3.2690911293029785, -0.049583256244659424, -5.7912702560424805, -0.15426784753799438, -7.08832311630249, -4.573992729187012, -3.6989920139312744, -8.832311630249023, -3.2778313159942627, -7.796597957611084, -3.9504647254943848, -0.061321038752794266, -4.086387634277344, -4.368222236633301, -8.766107559204102, -2.0128304958343506, -2.9654664993286133, -3.388563632965088, -2.374119281768799, -2.233457565307617, -3.259967803955078, -1.9256590604782104, -3.1171300411224365, -2.5134668350219727, -1.2914636135101318, -2.106252431869507, 0.15445803105831146, 0.3821030557155609, 0.10667312890291214, -1.3149912357330322, 0.5084645748138428, 1.0869834423065186, -3.0970544815063477, -1.7119749784469604, -0.08680596202611923, 0.06258155405521393, -6.444218635559082, 0.3502236008644104, -0.21242330968379974, -1.0951319932937622, -0.2546929717063904, -1.606440544128418, 0.6145179271697998, 1.2103277444839478, 0.632448673248291, -1.3314791917800903, -0.0811661034822464, -1.034975528717041, 0.45937249064445496, -0.6499652862548828, 0.35213348269462585, -0.09756776690483093, 1.6599781513214111, -0.6064563989639282, 0.6383776068687439, -0.09063489735126495, 0.5485105514526367, -0.6656373739242554, 1.0177799463272095, -0.7947140336036682, 1.8756357431411743, 1.259620189666748, 0.5371514558792114, 0.5279979705810547, -1.2278653383255005, -3.1675608158111572, -2.074094772338867, -2.1427104473114014, -1.2348092794418335, -0.25406548380851746, -15.822690963745117, -10.370782852172852, -7.007852554321289, -1.590886116027832, -2.1699070930480957, -2.151991605758667, 1.3791866302490234, -1.2901591062545776, -0.7935076951980591, -2.3366434574127197, -0.09357325732707977, -0.04536448419094086, -5.623207092285156, -4.124639987945557, -0.20916515588760376, -0.07281368225812912, -0.2750243842601776, -0.27089807391166687, 0.14563024044036865, -2.7404072284698486, 0.4495205879211426, -0.24960488080978394, 0.8472018837928772, 0.7588435411453247, 1.0934642553329468]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (1.54, 2.5)}}, 'et3_eta3': {'discriminator': {'threshold': 0.3399985909461975, 'nodes': [100, 5, 1], 'bias': [-0.012690101750195026, -0.019296301528811455, 0.2097368985414505, 0.06169872730970383, -0.08923499286174774, -0.13771609961986542], 'weights': [-1.0130535364151, -1.8695361614227295, 0.7134630084037781, 1.8104948997497559, -0.7769774198532104, 1.1319326162338257, -0.34492456912994385, 0.2091120481491089, -1.3856807947158813, -1.4976760149002075, -0.45986637473106384, 2.477525234222412, 0.44421905279159546, 0.39680153131484985, 2.725558042526245, 5.971437931060791, 1.461711049079895, 4.885514259338379, 4.06856107711792, 3.039273977279663, 1.7291306257247925, 1.2302244901657104, 0.8806228637695312, 2.2270586490631104, 5.4806976318359375, 3.9692296981811523, 1.9382259845733643, 1.9462071657180786, 1.371470332145691, 2.7120168209075928, -1.0630080699920654, 2.0336625576019287, -0.011746625415980816, 2.02740478515625, 1.28681218624115, 1.6846039295196533, 1.4978781938552856, 1.9039198160171509, 1.0996514558792114, 2.8797121047973633, -0.14438579976558685, 2.8182151317596436, 0.6362091898918152, 1.2808767557144165, 0.30955183506011963, 1.104913592338562, 0.5786794424057007, -1.0642706155776978, -0.5983864068984985, 1.5646374225616455, 0.2665879428386688, -0.12011317908763885, 0.24322356283664703, 0.8991612792015076, 0.3495424687862396, 0.642586886882782, -1.724165678024292, 0.8794919848442078, -0.05641467496752739, 0.6110295653343201, 0.24256294965744019, -0.5348894596099854, 0.3241155743598938, 0.39218923449516296, 0.25385260581970215, 0.8626371622085571, 0.21854034066200256, 0.4821946620941162, -2.757903575897217, -2.4015214443206787, 0.41514235734939575, 0.6938744187355042, -0.5162703990936279, -0.38473138213157654, 1.259438157081604, 1.9376729726791382, 1.9331270456314087, 1.6959307193756104, 1.0981101989746094, 0.393974244594574, 2.5199520587921143, 4.543359756469727, 6.702901363372803, 1.917405128479004, 1.785683512687683, 1.8674720525741577, 0.7402540445327759, 1.2851225137710571, 0.5095517039299011, 1.432073712348938, 0.2314925193786621, 0.26483821868896484, 4.011752128601074, 1.488372564315796, 0.2861795723438263, 0.7558533549308777, -0.42731773853302, 0.08657048642635345, -0.11479514837265015, 0.5595415830612183, 0.9943864941596985, 1.861403465270996, -0.488151878118515, -1.819808006286621, 0.8041013479232788, -0.9673154354095459, 0.3596230745315552, -0.34904325008392334, 1.5636812448501587, 1.3463267087936401, 0.3882506489753723, -2.5864310264587402, -0.37640848755836487, -0.08460839837789536, -2.8409440517425537, -2.2391180992126465, -1.646734356880188, -4.8574018478393555, -3.9293041229248047, -3.0070812702178955, -1.7790387868881226, -1.367472767829895, -0.8723230361938477, -2.208461046218872, -5.511495590209961, -3.8584446907043457, -2.0234076976776123, -1.972678542137146, -1.4766250848770142, -2.6760246753692627, 1.1823527812957764, -2.1563398838043213, -0.19935442507266998, -1.9214961528778076, -1.1798454523086548, -1.6296238899230957, -1.4663089513778687, -1.783396601676941, -1.1834534406661987, -2.90910005569458, 0.35251420736312866, -2.9747719764709473, -0.5355457067489624, -1.2439055442810059, 0.21942633390426636, -1.12078058719635, -0.5544575452804565, 1.09528648853302, 0.37167519330978394, -1.6401143074035645, -0.2022491693496704, 0.0824509784579277, -0.21699126064777374, -0.8275657296180725, -0.1296526938676834, -0.6483139395713806, 1.667501449584961, -0.7002888321876526, 0.02536276914179325, -0.771704375743866, -0.309673011302948, 0.6220327019691467, -0.3685165047645569, -0.43144354224205017, -0.2997533082962036, -0.755573034286499, -0.2039588987827301, -0.49767041206359863, 2.9409961700439453, 2.571258306503296, -0.22105011343955994, -0.541606605052948, 0.5305947065353394, 0.44053080677986145, -1.3091496229171753, -1.9451225996017456, -1.8920503854751587, -1.72027587890625, -1.3297384977340698, -0.34065186977386475, -2.380805253982544, -4.455440521240234, -6.688385486602783, -1.9913265705108643, -1.6251119375228882, -1.8720210790634155, -0.8184264898300171, -1.1800707578659058, -0.3793899714946747, -1.3023432493209839, -0.28825998306274414, -0.20292825996875763, -4.033830165863037, -1.5883941650390625, -0.5024857521057129, -0.8226898312568665, 0.38987159729003906, -0.04933639243245125, 0.27144038677215576, -0.6528551578521729, 1535.697998046875, -7.566563129425049, -0.3362034559249878, 6.127004623413086, -134.8846893310547, -6.747729778289795, -0.31549271941185, 0.07968517392873764, -0.7109286785125732, -2.9991564750671387, -0.30329811573028564, 0.8413170576095581, 0.4325571656227112, 0.5640086531639099, 5.954688549041748, -83.07160949707031, 1.0855607986450195, 1.268211007118225, 1.658875584602356, -12.775851249694824, -22.435882568359375, -37.19643783569336, -13.573686599731445, 0.7745075821876526, 9.296792984008789, 1.3591676950454712, 0.6424844861030579, -1.655385971069336, -0.7611486911773682, 1.0870839357376099, -40.96883773803711, 0.7365546822547913, 0.4251643419265747, 0.6069502234458923, 0.3278835415840149, -8.132231712341309, 0.35062435269355774, 0.7988054156303406, 0.17850881814956665, 1.1966577768325806, -33.727779388427734, 1.230722427368164, 0.12097921967506409, 0.40310707688331604, -0.8750306963920593, 0.25021082162857056, -0.7543154358863831, -0.6889739036560059, -0.6603612899780273, 0.550871729850769, -0.06920773535966873, -0.15402205288410187, -0.140425443649292, 0.37455567717552185, 0.034115295857191086, 0.2779487073421478, -0.9593930244445801, 0.06621801853179932, -0.15528415143489838, 0.1394530087709427, -0.023600447922945023, -0.49678799510002136, -0.031357940286397934, -0.10219594091176987, 0.003180968575179577, 0.16807036101818085, 0.08215972781181335, 0.020174076780676842, -1.4432637691497803, -1.3084853887557983, 0.08324480056762695, 0.09515362977981567, -0.2500286400318146, -0.8727518916130066, 0.3113517165184021, 0.5977798700332642, 0.7640846967697144, 0.35935232043266296, -0.02200903370976448, -7.775704383850098, -54.3456916809082, 1.1809536218643188, -26.941221237182617, -46.51435852050781, 0.5088420510292053, 0.6364379525184631, -6.804378032684326, 0.33359062671661377, 81.87478637695312, 13.988085746765137, 0.05279451981186867, 0.08597724139690399, 1.7450703382492065, 0.6333150863647461, -0.21519257128238678, 22.23067855834961, -0.361352801322937, 0.019824333488941193, -0.19054675102233887, 7.7622904777526855, -0.9553853869438171, -1.9790019989013672, 0.5479722619056702, 1.915626049041748, -0.6678287982940674, 1.0792224407196045, -0.3149227499961853, 0.21716639399528503, -1.57701575756073, -1.4115947484970093, -0.7912191152572632, 2.488992691040039, 0.5176383852958679, 0.01846897043287754, 2.7182116508483887, 2.052654981613159, 1.5176335573196411, 4.779162406921387, 4.020149230957031, 3.04656720161438, 1.6076387166976929, 1.3088711500167847, 0.722421407699585, 2.3629753589630127, 5.461034774780273, 3.9888439178466797, 1.9581758975982666, 1.9494673013687134, 1.4768699407577515, 2.715693473815918, -1.1274176836013794, 2.202514171600342, 0.1283680945634842, 2.0431790351867676, 1.3149093389511108, 1.687981367111206, 1.4551576375961304, 1.9562345743179321, 1.1168626546859741, 2.8915462493896484, -0.2518756091594696, 2.875753164291382, 0.6652914881706238, 1.2410328388214111, -0.13984006643295288, 1.1208654642105103, 0.6098634600639343, -0.9000683426856995, -0.44290071725845337, 1.5416271686553955, 0.19222044944763184, -0.08033270388841629, 0.3046439588069916, 0.9124664664268494, 0.27935412526130676, 0.678560197353363, -1.6970304250717163, 0.5400169491767883, -0.011399169452488422, 0.7493487000465393, 0.1959983855485916, -0.5600623488426208, 0.3854066729545593, 0.23985278606414795, 0.23866842687129974, 0.662785530090332, 0.3154675364494324, 0.6701787114143372, -2.8678765296936035, -2.5332682132720947, 0.36906805634498596, 0.722297728061676, -0.5846952199935913, -0.4075091779232025, 1.2422224283218384, 1.725866675376892, 1.932085394859314, 1.7156829833984375, 1.3126379251480103, 0.3025326132774353, -0.862578809261322, 4.421380996704102, 6.645453929901123, 1.975903868675232, 1.6827961206436157, 1.986254334449768, 0.8401743173599243, 1.2442317008972168, 0.3258878290653229, 1.331126093864441, 0.29475200176239014, 0.2804960012435913, 4.131514072418213, 1.6180126667022705, 0.3953876793384552, 0.6145429015159607, -0.45996928215026855, 0.04682048037648201, -0.06234857439994812, 0.6628056764602661, 2.127974271774292, 1.985389232635498, -0.38232356309890747, -1.8470115661621094, 0.6693946123123169, -0.9231640696525574, 0.3261265754699707, -0.26342663168907166, 1.5610474348068237, 2.36187744140625, 0.8890228271484375, -2.466416120529175, 0.0437474399805069, -0.14612063765525818, -2.8271305561065674, -2.0611588954925537, -1.614615559577942, -4.63505220413208, -3.9273998737335205, -3.0702903270721436, -1.7724934816360474, -1.3545821905136108, -0.8219886422157288, -2.3168623447418213, -5.385948181152344, -3.9424924850463867, -1.921940565109253, -1.8809678554534912, -1.5144342184066772, -2.715623378753662, 1.1057642698287964, -2.192107915878296, -0.11941102147102356, -1.9921188354492188, -1.2446421384811401, -1.5735543966293335, -1.497243046760559, -1.8772114515304565, -1.111895203590393, -2.9471487998962402, 0.1457953006029129, -3.022235870361328, -0.4490777552127838, -1.1532342433929443, 0.1689779907464981, -1.2627816200256348, -0.19056522846221924, 1.0272307395935059, 0.41163158416748047, -1.6163190603256226, -0.3166213631629944, 0.12512139976024628, -0.17593805491924286, -0.9084994792938232, -0.18266268074512482, -0.7239826917648315, 1.7450309991836548, -0.65630704164505, 0.036941517144441605, -0.7366587519645691, -0.30975276231765747, 0.5614961981773376, -0.3711090087890625, -0.3471120297908783, -0.1886523813009262, -0.5806968808174133, -0.41220366954803467, -0.6597930788993835, 2.779768705368042, 2.4390182495117188, -0.41673988103866577, -0.6784767508506775, 0.5946556329727173, 0.3268611431121826, -1.3597277402877808, -1.7449132204055786, -1.9054521322250366, -1.7488070726394653, -1.1858036518096924, -0.3096122145652771, 1.0038888454437256, -4.458991527557373, -6.601884841918945, -1.9536596536636353, -1.7140873670578003, -1.835755467414856, -0.8624218702316284, -1.225271224975586, -0.7705239057540894, -1.330305576324463, -0.2822434604167938, -0.36786168813705444, -4.126810073852539, -1.5721787214279175, -0.34080711007118225, -0.8090224862098694, 0.3387714624404907, -0.09142432361841202, 0.12747538089752197, -0.6229060888290405, -1.822013258934021, 2.5561587810516357, -0.4319113790988922, -2.575791597366333, 1.3640925884246826]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (1.54, 2.5)}}, 'et0_eta2': {'discriminator': {'threshold': 0.18499873876571654, 'nodes': [100, 5, 1], 'bias': [0.0740942507982254, -0.06007218360900879, -0.1473710834980011, 0.05597534030675888, 0.16750994324684143, 0.13012652099132538], 'weights': [-1.0517817735671997, 0.16802196204662323, 1.4663076400756836, 0.5150785446166992, 0.05381222441792488, -2.4991824626922607, 0.3861342966556549, 0.40877765417099, 0.3886667490005493, -4.764517307281494, -3.8488268852233887, -3.8950982093811035, 0.17801228165626526, 1.6459916830062866, -1.1683205366134644, -1.0275481939315796, 5.77476692199707, -0.7624878287315369, -0.6606208682060242, 0.10978063941001892, 0.3314365744590759, 0.07557008415460587, 0.15490660071372986, 0.1983821988105774, 5.682046890258789, 1.5119644403457642, -0.24050761759281158, 3.012197494506836, 1.6698909997940063, 1.3211976289749146, 1.192269206047058, -0.8016904592514038, -0.07198423892259598, 1.3374708890914917, 1.7376724481582642, 1.429010272026062, 2.991372585296631, -1.08458411693573, 1.5429770946502686, -0.1538407951593399, 0.7634674310684204, 1.589094638824463, 1.8881877660751343, 1.3931552171707153, 1.4151959419250488, 1.2364542484283447, 0.8870375156402588, 0.7702187895774841, 0.6562994122505188, -0.9327248334884644, 0.3231920897960663, -1.8087104558944702, -0.23685550689697266, -0.5095539093017578, 0.6654106378555298, 2.7219882011413574, 2.6291749477386475, 1.3117403984069824, 1.3167848587036133, -0.2446056604385376, 0.7839341759681702, 1.005422830581665, 1.1950101852416992, 0.5214614868164062, 0.6100043058395386, -0.14294259250164032, -0.1940220445394516, -0.09250375628471375, 0.268110454082489, 0.16667549312114716, 0.6472163796424866, 0.353894978761673, 0.11717498302459717, -0.26599404215812683, 2.2951481342315674, 1.4448944330215454, 1.3319092988967896, 0.7411403656005859, 0.2963654696941376, 0.5021078586578369, -0.4632536768913269, 0.12948644161224365, -0.2519250512123108, 0.8176892995834351, 0.011637754738330841, -0.8079516291618347, 0.6551357507705688, 0.9359511733055115, -1.1770851612091064, 0.6528220176696777, 0.36740297079086304, -0.0789426937699318, 1.2961506843566895, -0.13571062684059143, 1.1442545652389526, 0.8163948059082031, -0.10180128365755081, 0.05880006030201912, -0.5211548805236816, -0.025255680084228516, 0.7313673496246338, -0.023635799065232277, -1.4468293190002441, -0.5934876203536987, 0.028543543070554733, 2.471452474594116, -0.4158157408237457, -0.206592857837677, -0.42895710468292236, 4.87015962600708, 3.961115837097168, 3.9524145126342773, -0.16786685585975647, -1.7249547243118286, 1.3116413354873657, 1.0748337507247925, -5.628201007843018, 0.7234885096549988, 0.528411328792572, -0.08875851333141327, -0.48572736978530884, -0.04377308487892151, -0.19493216276168823, -0.22066588699817657, -5.675931453704834, -1.656412959098816, 0.08158548176288605, -3.0232291221618652, -1.5874756574630737, -1.3444639444351196, -1.088882327079773, 0.8675150871276855, -0.05585324019193649, -1.4837809801101685, -1.7422865629196167, -1.2255347967147827, -3.157442092895508, 1.0423179864883423, -1.4748142957687378, 0.5054079294204712, -0.9231109619140625, -1.5690603256225586, -1.796244502067566, -1.5765613317489624, -1.4661540985107422, -1.2501475811004639, -0.7742009162902832, -0.6825814843177795, -0.7123939990997314, 0.9213225841522217, -0.4634900689125061, 1.6017268896102905, 3.362010955810547, 0.4920344352722168, -0.6457204222679138, -2.7114193439483643, -2.783172607421875, -1.4685192108154297, -1.3092772960662842, 0.42198076844215393, -0.9464324116706848, -1.0311115980148315, -1.2007677555084229, -0.562839925289154, -0.6815787553787231, 0.12460021674633026, 0.10716179013252258, 0.10381709039211273, -0.2235778272151947, -0.10480333864688873, -0.6012762188911438, -0.5561167001724243, -0.027298057451844215, 0.41184794902801514, -2.2188587188720703, -1.4139460325241089, -1.448706030845642, -0.800971269607544, -0.169809490442276, -0.6715972423553467, 0.38404980301856995, -0.15119865536689758, 0.12440945953130722, -0.635511577129364, -0.042899079620838165, 0.9490835666656494, -0.711346447467804, -0.8722526431083679, 1.1789851188659668, -0.709495484828949, -0.3752867579460144, 0.16730168461799622, -1.2621474266052246, 0.13003967702388763, -1.1052442789077759, -0.8459954261779785, 0.0857585072517395, -0.1146206185221672, 0.4948970675468445, -0.051395487040281296, 1.0251373052597046, 0.016275638714432716, -1.4731965065002441, -0.6171716451644897, 0.07966549694538116, 0.8737134337425232, -0.4731327295303345, -0.21301203966140747, -0.49674496054649353, 4.876373767852783, 3.839005470275879, 3.970517635345459, -0.31511154770851135, -1.6029869318008423, 1.2853161096572876, 1.1723881959915161, -5.832032203674316, 0.6789003610610962, 0.5669936537742615, -0.22379152476787567, -2.703939914703369, -0.26078152656555176, -0.03886079415678978, -0.05921908840537071, -5.719845771789551, -1.4597879648208618, 0.1876167505979538, -2.9879355430603027, -1.5303400754928589, -1.2714322805404663, -1.1109195947647095, 0.17933915555477142, 0.06089244410395622, -1.5081650018692017, -2.1941347122192383, -1.3107925653457642, -3.0754287242889404, 1.0042310953140259, -1.5626887083053589, -0.0424615740776062, -0.9771183133125305, -1.5259199142456055, -1.7639156579971313, -1.5246882438659668, -1.5541713237762451, -1.2403414249420166, -0.8519608974456787, -0.7213048338890076, -0.4986189901828766, 0.8783422708511353, -0.4468894898891449, 1.8087834119796753, 0.24241626262664795, 0.5605027675628662, -0.5243880152702332, -2.758394479751587, -2.7712044715881348, -1.4942808151245117, -1.331079363822937, -0.43571221828460693, -0.8953598737716675, -0.9362175464630127, -1.0887501239776611, -0.64814692735672, -0.46633851528167725, 0.2558480501174927, 0.18972228467464447, 0.14794549345970154, -0.23139016330242157, -0.10631468892097473, -0.54292231798172, -0.28567084670066833, 0.010528460144996643, 0.26116883754730225, -2.3366875648498535, -1.4603341817855835, -1.3482171297073364, -0.8471848964691162, -0.25872334837913513, -0.6058900356292725, 0.40240827202796936, -0.15694114565849304, 0.14404788613319397, -0.6278192400932312, 0.016024403274059296, 0.8369290232658386, -0.7468264698982239, -0.8051637411117554, 1.294194221496582, -0.5073345899581909, -0.48841679096221924, 0.08045808225870132, -1.326612949371338, 0.12512488663196564, -1.024269700050354, -0.9496513605117798, -0.04103377088904381, 0.052717145532369614, 0.6898003220558167, -0.08502696454524994, -0.20346179604530334, -0.03822952136397362, 0.40131279826164246, 0.1455945521593094, -0.07592715322971344, -0.633560299873352, 0.035675495862960815, 0.12471090257167816, 0.1971966028213501, -0.9159044027328491, -0.7121442556381226, -0.7494999170303345, -0.3949147164821625, -0.017569195479154587, -0.2903302013874054, -0.2198190987110138, 1.2864097356796265, -0.6672621369361877, -0.5154792070388794, 0.02528120018541813, 0.029193036258220673, 0.05742155760526657, -0.07700039446353912, -0.11946730315685272, 1.0597705841064453, 0.3729591965675354, -0.315964937210083, 0.2608327567577362, 0.386926531791687, 0.31351959705352783, 0.22049051523208618, -0.26232215762138367, -0.08213891834020615, 0.25315216183662415, 0.46439608931541443, 0.3727787137031555, 0.47078341245651245, -0.3124822974205017, 0.29903683066368103, -0.5561538338661194, 0.28215062618255615, 0.32795819640159607, 0.45523399114608765, 0.23146629333496094, 0.27856290340423584, 0.15756061673164368, 0.1869899183511734, 0.051989633589982986, 0.11555256694555283, -1.0412371158599854, -0.1433800905942917, -0.27964872121810913, -0.7687907814979553, -0.1628597527742386, -0.10891093313694, 0.4335108697414398, 0.2663184404373169, 0.18936417996883392, 0.24984174966812134, -0.002863943576812744, 0.05787845700979233, 0.17259660363197327, 0.3342285752296448, 0.16786420345306396, 0.16896598041057587, -0.7396526336669922, -0.4266115725040436, -0.3917669653892517, 0.1585039347410202, -0.15686000883579254, 0.06313836574554443, 0.2203729748725891, 0.14582298696041107, -0.3306969404220581, 1.9998338222503662, 0.18168263137340546, 0.24534966051578522, 0.27740049362182617, 0.04354019835591316, 0.228676438331604, -0.5850859880447388, -0.11512702703475952, 0.017273183912038803, 0.1502695381641388, 0.07620467245578766, -4.7901482582092285, 0.0630778893828392, 0.2729451358318329, -0.1265430897474289, 0.15690813958644867, 0.10327841341495514, 0.09922023117542267, 0.2520003020763397, -0.03963897004723549, 0.2640717923641205, 0.1446908712387085, -0.029449956491589546, -0.06772083044052124, -0.21415816247463226, 0.11655840277671814, -0.943658709526062, 0.02269618585705757, 1.3181378841400146, 0.6930207014083862, -0.08716018497943878, -0.9004027247428894, 0.4529569447040558, 0.2732076644897461, 0.5646275281906128, -4.850162506103516, -3.9099855422973633, -4.004771709442139, 0.11823239177465439, 1.615481972694397, -1.2820082902908325, -1.017562747001648, 5.716000556945801, -0.5544209480285645, -0.5670633912086487, 0.1728491187095642, 2.6101267337799072, 0.17946380376815796, 0.0825703889131546, 0.05516641214489937, 5.656416416168213, 1.5453623533248901, -0.13238242268562317, 2.9986424446105957, 1.5294057130813599, 1.4885174036026, 1.3557413816452026, -0.823494553565979, -0.05741948261857033, 1.3422154188156128, 2.3505282402038574, 1.31316077709198, 3.138502597808838, -1.1237257719039917, 1.5431022644042969, -0.08229468017816544, 0.8902245759963989, 1.5175034999847412, 1.860618233680725, 1.4966278076171875, 1.5646395683288574, 1.3467416763305664, 0.7230137586593628, 0.6093513369560242, 0.720161497592926, -0.7516468167304993, 0.5397064685821533, -1.6844969987869263, -0.20342838764190674, -0.6796891093254089, 0.6512815356254578, 1.8926186561584473, 2.7439825534820557, 0.8015068769454956, 1.3173447847366333, -0.31828993558883667, 0.783147394657135, 0.9115920662879944, 1.1475279331207275, 0.5457974076271057, 0.5314759612083435, -0.2963891327381134, -0.03399105370044708, -0.013344421982765198, 0.3270668685436249, 0.07528689503669739, 0.5463772416114807, 0.2880639135837555, 0.20573976635932922, -0.41672393679618835, 2.3174102306365967, 1.4313582181930542, 1.2926722764968872, 0.9546725153923035, 0.3735062777996063, 0.5191226005554199, -0.4239376485347748, 0.10882848501205444, -0.10013893991708755, 0.6388878226280212, 0.07238941639661789, -0.9218392968177795, 0.7462332844734192, 0.8599657416343689, -1.196976661682129, 0.48661670088768005, 0.26573923230171204, -0.08906308561563492, 1.2876594066619873, -0.033311765640974045, 1.1690279245376587, 0.9809199571609497, 0.09869571030139923, -0.007940351963043213, -0.5290152430534363, -0.01734699308872223, -0.811394989490509, 0.4709327220916748, 0.8561391830444336, -0.9403699040412903, -0.6039953827857971]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (1.37, 1.54)}}, 'et4_eta1': {'discriminator': {'threshold': 0.44499849081039428, 'nodes': [100, 5, 1], 'bias': [-0.04944121092557907, 0.04430503398180008, -0.17589996755123138, -0.04322429746389389, -0.033914901316165924, -0.3649325668811798], 'weights': [-1.0533475875854492, -4.960731506347656, -0.11462786793708801, -0.08051441609859467, 0.327058345079422, 0.9261538982391357, 0.9139630794525146, -1.5477986335754395, -2.7880916595458984, -3.127249002456665, 8.849225997924805, 0.9189647436141968, 2.5857772827148438, 5.538350582122803, 3.593130350112915, 5.4971089363098145, 5.557611465454102, 5.419483184814453, 6.3237457275390625, 7.038089275360107, 6.987907886505127, 6.842195987701416, 6.503592491149902, 6.325817584991455, 6.310937404632568, 6.3516926765441895, 6.195782661437988, 12.231324195861816, 6.420176982879639, 6.28207540512085, 4.799248695373535, 3.6904053688049316, 3.125208616256714, 2.9491443634033203, 2.520265817642212, 1.551713466644287, -0.14539076387882233, 2.5132787227630615, 2.754492998123169, 2.6617257595062256, -1.3799049854278564, 2.0000052452087402, 2.373865842819214, -0.48153719305992126, -7.9264020919799805, 5.072999954223633, -3.5379605293273926, -0.8016290664672852, 1.5370779037475586, -1.1268091201782227, -5.815518856048584, -0.6431751251220703, 6.390225887298584, 0.6136425733566284, 0.7596197724342346, 0.8415015339851379, 0.820252001285553, -1.7454701662063599, 0.9705983996391296, 1.0002537965774536, 0.6966873407363892, 0.3825032114982605, 0.9537915587425232, 12.97507095336914, 1.2517129182815552, 1.4221700429916382, 1.2482069730758667, 2.5883913040161133, 1.5484122037887573, 3.5056564807891846, -3.9746973514556885, 6.019525051116943, -0.4408854842185974, -0.40181291103363037, 1.1502372026443481, 3.0455968379974365, 4.79755163192749, 2.417346239089966, 0.9206371307373047, -0.08390868455171585, 3.050239324569702, 6.684665203094482, 6.6558051109313965, 5.875985622406006, 5.231296539306641, 1.4017248153686523, 2.5045998096466064, 4.597629070281982, 2.7267191410064697, 2.204145908355713, -0.257466197013855, 0.2739356756210327, 11.07122802734375, 4.34131383895874, 2.6431703567504883, 1.7330855131149292, 1.3199973106384277, 4.005731582641602, 0.48041751980781555, 1.6581690311431885, -0.8882415294647217, -0.2837415933609009, -0.1148887574672699, -0.12893220782279968, 0.010817923583090305, 0.027232317253947258, 0.08438871800899506, -0.43880653381347656, -0.8631213903427124, -0.5920184850692749, 2.2215394973754883, 0.1444978415966034, 0.6214796304702759, 1.1106393337249756, 3.1795196533203125, 1.3473886251449585, 5.22688102722168, 5.079331874847412, 1.1166990995407104, 1.4405477046966553, 1.4643628597259521, 1.3061424493789673, 1.2960573434829712, 1.2337698936462402, 1.1048407554626465, 1.1752914190292358, 1.1453886032104492, 2.510662794113159, 1.256697416305542, 1.3206971883773804, 0.8113711476325989, 0.439316064119339, 0.5039782524108887, 0.5507089495658875, 0.3218839466571808, 0.26522988080978394, -0.06579999625682831, 0.40335318446159363, 0.4419555366039276, 0.4951551854610443, -0.30802643299102783, 0.3927514851093292, 0.39081552624702454, -1.9454296827316284, -1.7610629796981812, 0.9781860709190369, -0.33280229568481445, -0.34309712052345276, 0.20731191337108612, -0.20004616677761078, -1.2053170204162598, -0.30718016624450684, 1.2052510976791382, -0.009037010371685028, 0.1409582495689392, 0.0468304418027401, 0.13052237033843994, -0.3239031732082367, 0.010680961422622204, 0.010477098636329174, 0.1628199815750122, -1.3150930404663086, 0.2301451861858368, 0.2888815402984619, 0.2545737028121948, 0.31536102294921875, 0.08720514178276062, 0.4105963408946991, 0.18502122163772583, 0.6155917048454285, -0.7690315842628479, 1.04706609249115, -0.34599512815475464, -0.39205202460289, 0.9817249178886414, 0.8604590892791748, 0.673933207988739, 0.4357556104660034, 0.09062683582305908, -0.010316171683371067, 1.0658905506134033, 1.2388548851013184, 1.3948793411254883, 1.183418869972229, 1.0338551998138428, 0.25307247042655945, 0.3510879576206207, 0.820881724357605, 0.5232108235359192, 0.2504698932170868, -0.14596788585186005, -0.9058675765991211, 2.17889666557312, 0.7428072690963745, 0.46675950288772583, 0.16106386482715607, 0.10857223719358444, 0.7520046234130859, -1.4653366804122925, 0.2758690416812897, 4.312921047210693, 1.1824429035186768, -0.09142965078353882, -1.8700180053710938, -0.26498135924339294, 1.2881745100021362, -1.0926264524459839, 1.1183371543884277, 4.033883571624756, 3.1037802696228027, -0.25055763125419617, -4.450815677642822, -2.6000101566314697, -5.531732559204102, -13.59540843963623, -5.578421115875244, -5.564455986022949, -5.565529823303223, -6.2331929206848145, -7.012181758880615, -6.9557294845581055, -6.835890769958496, -6.470211029052734, -6.1226067543029785, -6.211691379547119, -6.362425804138184, -6.327195644378662, -12.241724014282227, -6.542065143585205, -6.264378070831299, -4.969686508178711, 4.533326625823975, -6.366821765899658, -6.328834533691406, -3.595522403717041, -1.0085445642471313, 0.14215277135372162, -2.419379234313965, -2.666376829147339, -2.5424044132232666, 1.3114145994186401, -2.1734628677368164, -2.2009105682373047, 1.8521612882614136, -0.31155356764793396, -1.1938470602035522, 1.5211749076843262, 0.8266581296920776, -2.045912027359009, 1.192134976387024, 5.870670795440674, 0.6605153679847717, -6.553929805755615, -0.5716003179550171, 2.539950132369995, -0.6127597093582153, -0.7832842469215393, 1.8389278650283813, -0.8064548969268799, 1.8784267902374268, 2.566817045211792, 4.7225470542907715, 1.210046410560608, -1.1247453689575195, -1.3806527853012085, -0.119940847158432, -1.436501383781433, -6.662543296813965, -1.4934906959533691, -3.3701982498168945, 0.8845202326774597, -1.7395645380020142, 1.2993745803833008, 0.2521582245826721, -1.20425283908844, -2.669802665710449, -3.7791428565979004, -2.2830471992492676, -0.8884074091911316, -0.11100753396749496, -3.0859479904174805, -6.561391353607178, -6.598057746887207, -5.686880111694336, -5.302574634552002, 1.0235528945922852, -4.100517272949219, -4.595377445220947, -2.8082916736602783, -1.8729438781738281, -1.4939301013946533, -0.24779225885868073, -10.932708740234375, -4.199324131011963, -3.10957407951355, -1.9400962591171265, -1.2673074007034302, -4.026810169219971, -0.6247025728225708, -1.5338613986968994, 1.1100951433181763, 1.1665518283843994, 0.12421714514493942, 0.11102984845638275, -0.33227279782295227, -1.1237115859985352, -0.9166012406349182, 1.7339065074920654, 3.916808605194092, 3.1300225257873535, -2.1336519718170166, -0.8837668299674988, -2.623211145401001, -5.4205451011657715, -3.561551809310913, -5.4753499031066895, -5.540642738342285, -5.460385799407959, -6.376492500305176, -6.922759532928467, -6.925884246826172, -6.637295246124268, -6.540719985961914, -6.246999263763428, -6.362174034118652, -6.152751445770264, -6.105291843414307, -12.212980270385742, -6.607662200927734, -6.197385311126709, -4.879158973693848, -2.284531831741333, -3.0351200103759766, -2.9112417697906494, -2.406902551651001, -1.4472754001617432, 0.2170599102973938, -2.420147657394409, -2.6974053382873535, -2.5806961059570312, -0.6764609217643738, -2.005291223526001, -2.2450711727142334, 1.9639124870300293, 7.808681011199951, -5.587013244628906, 1.6307839155197144, 0.7189077734947205, -1.6309432983398438, 1.1541657447814941, 5.830270767211914, 0.5934906005859375, -6.3893818855285645, -0.40460774302482605, -0.7126460671424866, -0.6581454277038574, -0.6585305333137512, 1.8650702238082886, -1.0026404857635498, -1.0289264917373657, -0.7238054275512695, 5.628936290740967, -1.113128900527954, -3.9180262088775635, -1.3258835077285767, -1.2367022037506104, -0.9189690947532654, -2.6087000370025635, -1.5012307167053223, -3.514204502105713, 3.8040013313293457, -5.876565456390381, 0.444823682308197, 0.377777099609375, -1.180335283279419, -1.1370363235473633, -3.942268133163452, -2.4030489921569824, -0.9437010288238525, -0.10503961890935898, -3.2399961948394775, -6.6350016593933105, -6.663013935089111, -5.680294990539551, -5.203977584838867, -1.593369483947754, -2.5124847888946533, -4.625247478485107, -2.780906915664673, -1.8100066184997559, 0.2190827876329422, 0.4663642346858978, -10.991830825805664, -4.305461406707764, -2.679348945617676, -1.7457140684127808, -1.332257866859436, -3.85837721824646, -0.49550768733024597, -1.6103028059005737, -0.8992785215377808, -1.1767441034317017, -0.11871474236249924, -0.07303480803966522, 0.1519879549741745, 1.1246464252471924, 0.9333445429801941, -1.6379239559173584, -4.007765293121338, -3.041372537612915, 2.2097861766815186, 0.835145890712738, 2.722548246383667, 5.448756694793701, 3.6146490573883057, 5.605247974395752, 5.417119026184082, 5.421097278594971, 6.324037551879883, 6.927212238311768, 6.9888200759887695, 6.815331935882568, 6.630133628845215, 6.332214832305908, 6.136437892913818, 6.333812713623047, 6.15930700302124, 12.285018920898438, 6.558304786682129, 6.389136791229248, 4.83615779876709, 2.199603319168091, 2.9702954292297363, 2.9945969581604004, 2.362839698791504, 1.4485538005828857, -0.12990351021289825, 2.389958143234253, 2.7917966842651367, 2.574023485183716, 0.7320513129234314, 1.929429292678833, 2.192650079727173, -1.8061151504516602, -7.859200954437256, 5.590559005737305, -3.5589044094085693, -0.6465646624565125, 1.5923240184783936, -1.1624454259872437, -5.9998626708984375, -0.5720399022102356, 6.556267261505127, 0.5708186626434326, 0.822184145450592, 0.8456826210021973, 0.7594335675239563, -1.9479042291641235, 1.0158330202102661, 0.8340901732444763, 0.8298597931861877, 0.23620949685573578, 1.0797489881515503, 3.7128658294677734, 1.3794223070144653, 1.405644416809082, 1.3387466669082642, 2.746525287628174, 1.3935980796813965, 3.4047136306762695, -3.9192328453063965, 5.827391147613525, -0.3837888240814209, -0.2990424633026123, 1.2860881090164185, 1.150420904159546, 3.7557263374328613, 2.303722620010376, 0.78304123878479, -0.1005493775010109, 3.1295223236083984, 6.551143646240234, 6.725265026092529, 5.739577770233154, 5.283452987670898, 1.5187712907791138, 2.5129172801971436, 4.559238433837891, 2.8698642253875732, 1.8264973163604736, -0.23354597389698029, 0.32074859738349915, 10.978507995605469, 4.260485649108887, 2.6691994667053223, 1.783060908317566, 1.209847092628479, 3.893599033355713, 0.673551082611084, 1.6266344785690308, -1.943715214729309, -2.344973564147949, 1.1479488611221313, 2.110046148300171, -1.8749566078186035]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0.8, 1.37)}}, 'et4_eta3': {'discriminator': {'threshold': 0.38999854326248168, 'nodes': [100, 5, 1], 'bias': [-0.048734571784734726, 0.12641683220863342, -0.10319222509860992, -0.11600282788276672, 0.15744265913963318, -0.5986704230308533], 'weights': [1.489107608795166, 1.724515438079834, -0.2765308618545532, -1.6453315019607544, -0.21027891337871552, -0.20602554082870483, 0.5383106470108032, -0.8038612008094788, 1.7179598808288574, 1.4568285942077637, 0.8245131373405457, -0.5622129440307617, -0.6026278138160706, 0.39992600679397583, -2.7379024028778076, -4.853421211242676, -1.2196292877197266, -3.644157648086548, -4.464820384979248, -7.975650310516357, -5.083973407745361, 0.38998836278915405, -3.331301689147949, -8.42818546295166, -3.026576042175293, -2.88356876373291, -2.214590549468994, -7.139639854431152, -3.199021339416504, -2.4674696922302246, 0.24747680127620697, -3.017328977584839, -2.142301082611084, -5.159522533416748, -2.2962796688079834, -4.501381874084473, -1.645451545715332, -1.3673712015151978, -1.8717037439346313, -3.5510478019714355, -0.7411429286003113, -2.4653854370117188, -0.9555882811546326, -2.6397929191589355, 1.060547947883606, -2.5249483585357666, -1.437869668006897, -2.229560375213623, 3.980008840560913, -2.3240387439727783, 1.3334760665893555, -1.5189234018325806, 2.3470098972320557, 0.9187018275260925, 2.4415249824523926, 3.757972240447998, 3.246690034866333, -1.3531960248947144, 1.9973145723342896, -2.346579074859619, -0.18471047282218933, -0.818747878074646, 3.9583687782287598, 0.030996698886156082, 4.460407733917236, -0.7802447080612183, -0.016633836552500725, -2.2098493576049805, -2.7068231105804443, -0.935962438583374, 1.554163932800293, -1.6539173126220703, 0.6438606381416321, 0.5441612005233765, -1.3060957193374634, -1.4065288305282593, -1.4749877452850342, -1.0665733814239502, -1.7078192234039307, -1.0966951847076416, -0.37618157267570496, -3.0378973484039307, -4.626641273498535, -3.6512129306793213, -2.7534379959106445, -1.8836853504180908, -2.201690435409546, -1.0649908781051636, -0.3226732313632965, -2.448376178741455, -0.6887656450271606, -0.43390387296676636, -6.017397880554199, -2.6499719619750977, -0.49148544669151306, -1.7078983783721924, -0.5322701930999756, -0.11754774302244186, 0.10815437883138657, -1.056339979171753, -1.6629281044006348, -1.5980372428894043, 0.11593876034021378, 1.5261839628219604, 0.2071867138147354, 0.1955910623073578, -0.6961594820022583, 0.8233086466789246, -1.7356479167938232, -1.4943840503692627, -0.8582726716995239, 0.6608161926269531, 0.6234508752822876, -0.4115613102912903, 2.6869311332702637, 4.751109600067139, 1.206948161125183, 3.6823651790618896, 2.9429678916931152, 6.475310325622559, 5.1590399742126465, -0.4134208559989929, 3.188952922821045, 8.408431053161621, 3.0563151836395264, 5.409724235534668, 2.31276535987854, 7.252096176147461, 3.0659987926483154, 2.3733129501342773, -0.3197944462299347, 2.9546256065368652, 2.013441562652588, 5.170455455780029, 2.3582658767700195, 4.627410888671875, 1.642845630645752, -0.42225381731987, 1.566131830215454, 3.544184446334839, 0.8546712398529053, 2.5705087184906006, 1.0504372119903564, 2.5333847999572754, -1.2105087041854858, 2.571927309036255, 1.5176814794540405, 2.063802480697632, -3.8979246616363525, 2.20339298248291, -1.2640695571899414, 1.4322503805160522, -2.2504422664642334, -0.9932040572166443, -2.30411434173584, -3.872314453125, -3.149369716644287, 1.3449445962905884, -2.0023064613342285, 2.314568042755127, -0.7109601497650146, 0.7445508241653442, -4.056469917297363, -0.007392288185656071, -4.279834270477295, 0.7472338676452637, 0.16936682164669037, 2.3908958435058594, 1.4853827953338623, 0.8461674451828003, -1.623788595199585, 1.8801069259643555, -0.9429315328598022, -0.5220457911491394, 1.1812620162963867, 1.41241455078125, 1.3002620935440063, 1.0183937549591064, 1.7927227020263672, 1.0071781873703003, 0.4512437582015991, 2.919395685195923, 14.041594505310059, 3.8291432857513428, 2.8332457542419434, 1.7189116477966309, 2.021446943283081, 0.9982815980911255, 0.5194767713546753, 2.231724739074707, 0.5866437554359436, 0.5114965438842773, 6.004909515380859, 2.6935973167419434, 0.6125931143760681, 1.6291757822036743, 0.539778470993042, 0.14756469428539276, -0.005939469672739506, 0.9380841255187988, 0.7313734889030457, 0.6238921880722046, -0.05606410652399063, -3.4576642513275146, -0.7394446730613708, -0.5056309103965759, 1.1708277463912964, -0.07838332653045654, 1.4636929035186768, 0.3365824818611145, 0.7694878578186035, -10.08647632598877, -0.11698932200670242, -0.010649384930729866, -1.4873687028884888, -0.8243563175201416, -38.86589050292969, -3.5834689140319824, -10.238457679748535, -40.11923599243164, -2.096503257751465, -2.5557754039764404, -1.2065658569335938, -3.7377657890319824, -1.3167790174484253, -1.1332790851593018, -0.8548119068145752, -3.3813157081604004, -1.3726880550384521, -0.8461487889289856, 1.0748355388641357, -1.3134803771972656, -0.7024919390678406, -2.119335889816284, -0.989439070224762, -1.8101933002471924, -0.9571784138679504, 0.49077108502388, -0.7323948740959167, -1.5321048498153687, 15.670473098754883, -0.8998259902000427, 2.567972183227539, -1.013662576675415, 7.016937255859375, -0.8518349528312683, -0.08405768871307373, -0.8864167332649231, 1.9270480871200562, -0.5945520997047424, 1.146668791770935, -0.6261212825775146, 1.051482915878296, 6.600464344024658, 1.2396928071975708, 1.6438459157943726, 0.14079098403453827, 3.602713108062744, 1.0004342794418335, -1.3551424741744995, 0.6277632117271423, -0.036265917122364044, 0.2190929800271988, 0.012133530341088772, 2.0729174613952637, 0.06852515786886215, 0.008781003765761852, -0.8805752992630005, -3.921480417251587, -0.09866628795862198, 0.09090970456600189, -0.6310464143753052, 0.35451918840408325, 0.3166377544403076, -0.6870806217193604, -3.3407504558563232, -3.329881191253662, -2.710155963897705, 4.222609996795654, -0.19457216560840607, 0.14979341626167297, -0.9626338481903076, -1.571986436843872, -1.5206676721572876, -1.0208123922348022, -0.3517363369464874, -0.5923582315444946, -0.24676944315433502, 0.054774485528469086, -0.9463720321655273, -0.2548476755619049, -0.3125629723072052, -2.0656211376190186, -1.0765247344970703, -0.025250207632780075, -0.14637288451194763, -0.20536333322525024, 0.19710904359817505, 0.14765994250774384, -0.2625049352645874, 1.5341681241989136, 1.7524620294570923, -0.10970014333724976, -1.5440655946731567, -0.3015003800392151, -0.2794300317764282, 0.5884311199188232, -0.8277735710144043, 1.6549763679504395, 1.4094862937927246, 2.1838538646698, -0.7344938516616821, -0.514830470085144, 0.35000818967819214, -2.7248005867004395, -4.628044605255127, -1.014535665512085, -3.6895315647125244, -2.8926315307617188, -6.404745578765869, -5.048038959503174, -0.6299965977668762, -3.3444137573242188, -8.45513916015625, -3.1140575408935547, -2.953204870223999, -2.3598601818084717, -6.4780473709106445, -3.1285459995269775, -2.258157730102539, 0.2953149080276489, -2.898334503173828, -2.005582809448242, -5.118051052093506, -2.3204307556152344, -4.4843549728393555, -1.6756892204284668, -1.3451989889144897, -1.8508540391921997, -3.6583309173583984, -0.7622156739234924, -2.5833017826080322, -0.9906833171844482, -2.577165365219116, 1.1367939710617065, -2.550694227218628, -1.4421054124832153, -2.1926791667938232, 3.912644624710083, -2.3250620365142822, 1.4524301290512085, -1.5569703578948975, 2.2569525241851807, 1.0268765687942505, 2.355769157409668, 3.8217110633850098, 3.2897284030914307, -1.3397530317306519, 1.8762733936309814, -2.23738694190979, 0.873782753944397, -0.6474822759628296, 0.16729366779327393, -0.09846816211938858, 4.426638126373291, -0.16099195182323456, -0.13280081748962402, -2.2775659561157227, -1.632291555404663, -0.6697500348091125, 1.623593807220459, -1.6896445751190186, 0.8589785099029541, 0.23151010274887085, -1.2829310894012451, -1.2888672351837158, -1.4663902521133423, -1.0433361530303955, -1.8323240280151367, -0.9110105037689209, -0.35080310702323914, -3.0115251541137695, -4.326592922210693, -3.72282338142395, -2.8973615169525146, -1.6929476261138916, -2.212578773498535, -0.9214056730270386, -0.48895588517189026, -2.3020389080047607, -0.6801794767379761, -0.37743180990219116, -5.978786468505859, -2.6536450386047363, -0.5682191252708435, -1.7038291692733765, -0.5761532783508301, -0.06598766148090363, 0.045243971049785614, -0.8737918138504028, -1.6567168235778809, -1.6992138624191284, 0.11865392327308655, 1.5675640106201172, 0.34421461820602417, 0.2133748084306717, -0.6436053514480591, 0.7672744393348694, -1.5915262699127197, -1.4994463920593262, -0.8917014598846436, 0.548654317855835, 0.5257238149642944, -0.5165659785270691, 2.6777701377868652, 4.766880989074707, 1.0924832820892334, 3.570284605026245, 4.55461311340332, 7.964165687561035, 5.054891586303711, 0.6123438477516174, 3.2275891304016113, 8.300087928771973, 3.0806758403778076, 2.8538706302642822, 2.4023661613464355, 7.0856475830078125, 3.0447909832000732, 2.401578426361084, -0.30921295285224915, 2.937774658203125, 1.9423860311508179, 5.117636203765869, 2.3809406757354736, 4.480501174926758, 1.8529014587402344, -0.3488796055316925, 2.0322256088256836, 3.6463782787323, 0.9211287498474121, 2.5814568996429443, 1.0386147499084473, 2.50089168548584, -1.0598489046096802, 2.549089193344116, 1.4544233083724976, 2.1018590927124023, -3.7877278327941895, 2.188398599624634, -1.4739162921905518, 1.4401271343231201, -2.162353754043579, -0.9193229079246521, -2.406433582305908, -3.761199474334717, -3.2782623767852783, 1.3340801000595093, -1.812551498413086, 1.7757724523544312, 0.3416861891746521, 0.699795126914978, -3.9801878929138184, -0.06104814261198044, -4.3792619705200195, 0.18610496819019318, -0.03304402530193329, 2.256460189819336, 2.7502853870391846, 0.6877647638320923, -1.6541996002197266, 1.8761110305786133, -0.8456857204437256, -0.459907591342926, 1.1474002599716187, 1.4152284860610962, 1.482133150100708, 1.1663758754730225, -0.5718396306037903, 1.0541284084320068, 0.5823667645454407, 3.0226240158081055, 4.504027843475342, 3.8000710010528564, 2.7362895011901855, 1.6714212894439697, 2.312886953353882, 1.0175235271453857, 0.45927074551582336, 2.260281801223755, 0.6990354061126709, 0.48493561148643494, 5.986856460571289, 2.6371665000915527, 0.514274537563324, 1.5165174007415771, 0.5823063850402832, 0.0919175073504448, -0.010943679139018059, 0.90785813331604, 4.302499294281006, -2.4323830604553223, 0.6809970140457153, 0.6679200530052185, -0.9922124147415161]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (1.54, 2.5)}}, 'et3_eta0': {'discriminator': {'threshold': 0.40999852418899535, 'nodes': [100, 5, 1], 'bias': [-0.0677146464586258, 0.01704608090221882, -0.3257580101490021, 0.33917805552482605, 0.34711459279060364, -0.3129195272922516], 'weights': [-55.02075958251953, -11.980169296264648, -8.812077522277832, 0.057916201651096344, -0.45083141326904297, -0.7015589475631714, -0.23670551180839539, -1.2097795009613037, -2.539445400238037, -2.6720333099365234, 1.1308411359786987, 0.39122942090034485, 6.559852123260498, 2.8712520599365234, 2.9141130447387695, 2.9044928550720215, 2.243557929992676, 3.6076762676239014, 3.6763367652893066, 3.462643623352051, 3.8531761169433594, 4.0217742919921875, 2.884087324142456, 3.310631036758423, 3.005481004714966, 2.478203058242798, 2.9754574298858643, 2.5338714122772217, 2.6201016902923584, 2.6889524459838867, 2.264381170272827, 1.0531092882156372, 2.303163766860962, 1.9610322713851929, 1.8308334350585938, 1.5624895095825195, 1.4677995443344116, 1.5363810062408447, 1.3023184537887573, 1.5705058574676514, 18.088268280029297, 2.747138738632202, -0.5428839921951294, -0.3703663647174835, -0.3785107731819153, 2.779938220977783, 1.4333616495132446, 1.568895936012268, 0.428409606218338, 1.2578153610229492, 1.317581295967102, -1.5397913455963135, 0.5036625862121582, -2.423191547393799, 0.6797366738319397, 1.2985190153121948, 0.6452349424362183, -0.7516332268714905, 3.133150100708008, 3.204082727432251, 0.47348833084106445, -0.3011056184768677, -0.39402440190315247, -0.8659201860427856, -1.802432894706726, -1.8288511037826538, 0.5907695889472961, -0.6233327984809875, 0.22252286970615387, 0.815199613571167, -1.9177621603012085, -1.6068177223205566, -0.49719715118408203, -0.28497713804244995, 1.3481165170669556, 1.220120906829834, 2.4768738746643066, 1.220518946647644, 1.2663979530334473, 0.3111969828605652, 1.609475016593933, 1.8878488540649414, 3.8263957500457764, 2.5961267948150635, 0.9094277620315552, 2.31742262840271, 1.451043963432312, 4.934955596923828, 4.559588432312012, 3.2284741401672363, 1.3086919784545898, -0.38509032130241394, -3.622605800628662, 3.0023610591888428, 1.4413317441940308, -0.1998918354511261, 3.6725356578826904, 2.5428428649902344, -0.8858456015586853, -0.6001783013343811, 57.897064208984375, 12.017651557922363, 7.696766376495361, 0.03296565264463425, 0.6304057240486145, 0.6800051927566528, 0.15519164502620697, 1.19718337059021, 2.437086343765259, 4.496309757232666, -1.3664907217025757, -0.4344746768474579, -6.53448486328125, -2.892951488494873, -2.8867318630218506, -2.9650864601135254, -2.3744089603424072, -3.7998151779174805, -3.6700632572174072, -3.2800090312957764, -3.8432140350341797, -3.9181973934173584, -3.1030828952789307, -3.168778657913208, -3.078685998916626, -2.58035945892334, -2.8544163703918457, -2.682767629623413, -2.6830108165740967, -2.5776331424713135, -2.1327083110809326, -0.900214433670044, -2.173473834991455, -2.0470988750457764, -1.8375910520553589, -1.5037643909454346, -1.552957534790039, -1.3741053342819214, -1.2668365240097046, -1.5077086687088013, -18.038610458374023, -1.601119875907898, 0.5604377388954163, 0.13186807930469513, 0.3623488247394562, -2.7222962379455566, -1.4819079637527466, -1.4771692752838135, -0.4879170060157776, -1.292600393295288, -1.2937439680099487, 1.5008662939071655, -0.6854048371315002, 2.478614091873169, -0.8579885363578796, -1.3029316663742065, -0.5043449401855469, 0.9267913103103638, -3.1233668327331543, -1.25843346118927, -0.4559805393218994, 0.2791209816932678, 0.7067294716835022, 1.0025086402893066, 1.9448896646499634, 1.8024455308914185, -0.6460127234458923, 0.6700329184532166, -0.3372054994106293, -0.8243141174316406, 1.7772880792617798, 1.729379415512085, 0.481143593788147, 0.18227368593215942, -1.215772271156311, -1.2753404378890991, -2.540102005004883, -1.1450990438461304, -1.2187203168869019, -0.3705129623413086, -1.55818772315979, -1.8268511295318604, -3.676107406616211, -2.4574849605560303, -1.045733094215393, -2.2315969467163086, -1.5858746767044067, -4.938912868499756, -4.310708045959473, -3.0374510288238525, -1.2027181386947632, 0.24889717996120453, 3.4594502449035645, -2.9479782581329346, -1.4303020238876343, 0.031895071268081665, -3.6551425457000732, -2.3365187644958496, 0.7751843929290771, 0.513533890247345, 2.818881034851074, 1.7155451774597168, -0.7982422113418579, 0.2636367976665497, 0.9222109317779541, 0.7520069479942322, 0.6573650240898132, 1.2842695713043213, 2.503244638442993, 2.3954808712005615, -1.1094049215316772, -2.8555734157562256, -1.4840770959854126, -3.0204551219940186, -2.8042595386505127, -2.7689924240112305, -3.1320712566375732, -3.7152786254882812, -3.52154803276062, -3.5151376724243164, -3.8585214614868164, -4.058757305145264, -2.9470889568328857, -3.183985710144043, -3.0328783988952637, -2.617356538772583, -2.590102195739746, -2.6782138347625732, -2.683642625808716, -2.5790631771087646, 1.2367427349090576, -0.8425788879394531, -2.023442268371582, -1.594313621520996, -1.558278203010559, -1.415696620941162, -1.5444902181625366, -1.4593127965927124, -1.3179001808166504, -1.2771642208099365, -2.5638015270233154, -1.325626015663147, 1.7976620197296143, 0.249821275472641, 0.41884806752204895, -2.6822097301483154, -1.4065210819244385, -1.0397224426269531, -0.5948566198348999, -1.3588923215866089, -1.401363492012024, 1.3737119436264038, -0.4631251096725464, 2.5272862911224365, -1.5698579549789429, -1.4154775142669678, -0.46269166469573975, 2.992039918899536, -2.9625604152679443, -2.3306517601013184, -0.4629423916339874, 0.6999631524085999, 0.6064558029174805, 0.8948763608932495, 1.8590259552001953, 2.355193853378296, -0.3445756733417511, 0.5104489922523499, 0.03441718965768814, -0.6162105202674866, 1.779867172241211, 1.8767695426940918, 0.9110656380653381, 0.5424016714096069, -0.6345865726470947, -1.8272885084152222, -2.2392795085906982, -0.7266373634338379, -1.2709898948669434, -0.246825709939003, -1.6157077550888062, -1.547071099281311, -3.6486704349517822, -2.412764072418213, -1.0306228399276733, -2.143760919570923, -1.458570122718811, -5.052695274353027, -4.211669445037842, -3.145329713821411, -0.7986577153205872, 0.3417644798755646, -3.6237759590148926, -3.022977113723755, -1.4649693965911865, -0.035447005182504654, -3.619277000427246, -2.3928732872009277, 1.1435751914978027, 0.9424856305122375, -2.73766827583313, -1.704036831855774, 0.3971812427043915, -0.21477511525154114, -0.8080562353134155, -0.8217794299125671, -0.47060322761535645, -1.203309178352356, -2.568970203399658, -2.5404233932495117, 6.292684078216553, 2.947788953781128, 1.4641928672790527, 3.1286380290985107, 2.837716579437256, 2.857640504837036, 2.967209577560425, 3.803098201751709, 3.7022595405578613, 3.3665242195129395, 4.005894184112549, 4.081570625305176, 2.954195737838745, 3.050560235977173, 3.077486991882324, 2.4677562713623047, 2.420515775680542, 2.5797646045684814, 2.707798480987549, 2.4894731044769287, -1.093558669090271, 0.9331942200660706, 1.9610410928726196, 1.5238404273986816, 1.7181380987167358, 1.4524877071380615, 1.3850703239440918, -1.5304865837097168, 1.4504464864730835, 1.3073198795318604, 2.4940080642700195, 1.4651581048965454, -1.6607904434204102, -0.32477012276649475, -0.42646878957748413, 2.5879030227661133, 1.4349029064178467, 0.7061697244644165, 0.6092514991760254, 1.3131141662597656, 0.6447135806083679, -1.5033351182937622, 0.32984453439712524, -2.586721181869507, 1.5963002443313599, 1.3415871858596802, 0.50895756483078, -2.879276990890503, 3.035945415496826, 2.3233251571655273, 0.5005916953086853, -0.4830448627471924, -0.6859027743339539, -0.9342104196548462, -2.2226526737213135, -2.2951338291168213, 0.35681870579719543, -0.522974967956543, -0.14108940958976746, 0.48208749294281006, -1.7474632263183594, -1.7982937097549438, -0.8968064785003662, -0.38790363073349, 0.6533034443855286, 1.8519915342330933, 2.0535101890563965, 0.7590082287788391, 1.3900814056396484, 0.3306892216205597, 1.6168193817138672, 1.5958890914916992, 3.6224141120910645, 2.536128044128418, 1.0388962030410767, 2.1587774753570557, 1.4933043718338013, 4.852158546447754, 4.084129810333252, 3.012596607208252, 0.6639731526374817, -0.33184030652046204, 3.061025619506836, 3.0687358379364014, 1.3361337184906006, 0.006485926453024149, 3.7103233337402344, 2.5270721912384033, -1.2000093460083008, -1.0881695747375488, -2.8638813495635986, -1.7297691106796265, 0.3566191494464874, -0.11082221567630768, -0.8280302882194519, -0.7154039740562439, -0.42737245559692383, -1.134792447090149, -2.432609796524048, -2.4447786808013916, 6.2556562423706055, 2.7751049995422363, 1.6699426174163818, 3.1209113597869873, 2.956786632537842, 2.8774077892303467, 3.1412899494171143, 3.878533124923706, 3.669942617416382, 3.3664700984954834, 4.059711933135986, 4.137976169586182, 3.0100901126861572, 3.249464750289917, 2.9256374835968018, 2.4683899879455566, 2.479074239730835, 2.7487406730651855, 2.7077996730804443, 2.6429502964019775, -1.2666351795196533, 1.0618983507156372, 1.833869457244873, 1.5651453733444214, 1.6958791017532349, 1.5602469444274902, 1.5479367971420288, -1.4943513870239258, 1.3717821836471558, 1.3516325950622559, 2.64095139503479, 1.364629864692688, -1.8042676448822021, -0.22699344158172607, -0.27980726957321167, 2.5786023139953613, 1.2975306510925293, 0.7719959020614624, 0.660222053527832, 1.3979945182800293, 0.6953219771385193, -1.3833836317062378, 0.4862965941429138, -2.465054988861084, 1.6602401733398438, 1.3310189247131348, 0.6160938143730164, -2.771939516067505, 2.939441680908203, 2.4456262588500977, 0.5064876079559326, -0.49765634536743164, -0.6898133158683777, -0.8005670309066772, -2.1807708740234375, -2.306140184402466, 0.343305379152298, -0.5731406807899475, -0.10079710185527802, 0.4287020266056061, -2.080275774002075, -1.8659745454788208, -0.8194320201873779, -0.5372909307479858, 0.6682360172271729, 1.8211109638214111, 2.14973783493042, 0.8914849162101746, 1.40985906124115, 0.22297127544879913, 1.5792601108551025, 1.6765486001968384, 3.649811267852783, 2.4001193046569824, 0.9910076856613159, 2.2349510192871094, 1.6016310453414917, 4.926762104034424, 4.282641887664795, 3.039583206176758, 0.8457143902778625, -0.3821832537651062, 3.088564395904541, 2.991649866104126, 1.4345979690551758, -0.17900963127613068, 3.637394905090332, 2.3571064472198486, -1.1807541847229004, -1.1359692811965942, -0.627993643283844, 0.3810631334781647, 1.6050859689712524, -1.7380315065383911, -2.641709566116333]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0, 0.8)}}, 'et4_eta0': {'discriminator': {'threshold': 0.44999848604202269, 'nodes': [100, 5, 1], 'bias': [-0.10006356239318848, 0.1718388795852661, 0.1917187124490738, 0.12616270780563354, 0.2410246878862381, -0.14420321583747864], 'weights': [1.3129212856292725, 1.9736900329589844, -0.05472411587834358, -0.012819326482713223, 0.6576101183891296, -0.18957450985908508, 0.2618473768234253, 0.8116065859794617, 1.5089197158813477, 1.6602896451950073, -2.324342966079712, -2.6335017681121826, -3.753807544708252, -3.131269931793213, -3.1132469177246094, -3.0287232398986816, -3.71518874168396, -3.115664482116699, -1.7347663640975952, -3.263540029525757, -3.8394622802734375, -3.6420950889587402, -3.2358949184417725, -4.110813140869141, -2.3162546157836914, -2.3050897121429443, -2.138559341430664, -1.8476779460906982, -2.891035556793213, -1.6965510845184326, -1.8116403818130493, -1.7551342248916626, -3.103017568588257, -1.8355472087860107, -1.1184914112091064, 0.20531444251537323, -0.8951571583747864, -1.864946722984314, -1.0165525674819946, -1.0111479759216309, -0.6755116581916809, -1.2885771989822388, -1.6300872564315796, -1.4723033905029297, -1.5038915872573853, -1.082114577293396, -1.7087018489837646, -2.156355381011963, -0.33264705538749695, 1.0099273920059204, 4.122315883636475, -0.7196881175041199, -0.08137873560190201, -0.7342121005058289, -0.1646161526441574, -1.172550916671753, -0.4540753960609436, -0.5100690126419067, 0.29078614711761475, 0.3207652270793915, -0.41364768147468567, 0.6090594530105591, 0.7108191251754761, -0.9547742009162903, 0.17599211633205414, -0.1000346764922142, 1.3198931217193604, -0.39284616708755493, 0.5073610544204712, -0.23496878147125244, -0.4607142508029938, 2.786182165145874, 0.5491321086883545, 0.43314892053604126, -0.9519550800323486, -1.8739690780639648, -1.863187551498413, -1.6626156568527222, -0.4910593330860138, -0.2357858121395111, -0.8017576336860657, -3.384251594543457, -4.843245983123779, -3.461277723312378, -1.8609352111816406, -1.5307388305664062, -0.9863808751106262, -0.48077061772346497, -2.9560184478759766, -3.449439764022827, -0.9360039234161377, -0.05590256303548813, -3.1869900226593018, -2.9260408878326416, -1.2129029035568237, -0.17934133112430573, -3.176992177963257, -2.972210645675659, -0.20930150151252747, 0.3028154671192169, -1.1506836414337158, -1.2522287368774414, -0.05205778032541275, -0.15614837408065796, -0.5083153247833252, 0.20868319272994995, -0.3071171045303345, -0.7897494435310364, -1.6538289785385132, -0.9413822293281555, -0.8270339965820312, 2.773322582244873, 3.700944185256958, 3.0007646083831787, 3.786634922027588, 3.1493468284606934, 3.906508684158325, 2.977834939956665, 3.101003885269165, 3.054391860961914, 3.711411237716675, 3.765735626220703, 3.1184146404266357, 4.00459098815918, 2.410898447036743, 2.38869571685791, 2.058542251586914, 2.011187791824341, 2.767580509185791, 1.6639628410339355, 1.7150696516036987, 1.6797326803207397, 2.8663787841796875, 1.8851468563079834, 1.125571608543396, -0.0986524224281311, 0.9621352553367615, 1.82829749584198, 0.8707053661346436, 0.9323490858078003, 0.814997136592865, 1.2820088863372803, 1.720960021018982, 1.5272647142410278, 1.598755955696106, 0.963066041469574, 1.6235756874084473, 2.122020959854126, 0.3347413241863251, -0.9579721689224243, -4.046114921569824, 0.7782506346702576, -0.0035737596917897463, 0.6455525755882263, 0.19317804276943207, 1.1521235704421997, 0.4930703341960907, 0.4550166130065918, -0.37901899218559265, -0.3270445466041565, 0.3274492025375366, -0.539054274559021, -0.5395851731300354, 0.7178611755371094, -0.05988440290093422, 0.01733865961432457, -1.281239628791809, 0.31611427664756775, -0.3575558364391327, 0.38146933913230896, 0.5645953416824341, 0.12982402741909027, -0.6677186489105225, -0.49713197350502014, 0.7682026624679565, 1.85271155834198, 1.6783770322799683, 1.6524136066436768, 0.49185889959335327, 0.3126184046268463, 0.8408320546150208, 3.202183485031128, 5.248801231384277, 3.417248487472534, 1.6360862255096436, 1.5080029964447021, 0.9480173587799072, 0.5543376207351685, 4.750268936157227, 3.3250675201416016, 0.7527222037315369, -0.10813198983669281, 3.389779567718506, 2.9021639823913574, 1.2450960874557495, 0.23857314884662628, 3.071561574935913, 3.0360007286071777, 0.19459818303585052, -0.2696147859096527, -3.9927499294281006, -1.939612627029419, -0.4994182586669922, 0.028192076832056046, -0.6179304122924805, 0.25054115056991577, -0.3669547438621521, -0.8525370955467224, -2.438474655151367, -1.521085500717163, 2.2427875995635986, 2.5307037830352783, 3.7332987785339355, 2.959458351135254, 1.3376234769821167, 3.193125009536743, 3.7558045387268066, 3.129946708679199, 1.8431442975997925, 3.163658857345581, 3.683605194091797, 3.7931203842163086, 1.9662631750106812, 4.037752151489258, 2.372846841812134, 2.2352535724639893, 2.064286470413208, 1.8608046770095825, 2.984282970428467, 1.7023789882659912, 1.595791220664978, 1.8516281843185425, 3.015812635421753, 1.723741054534912, 1.242802619934082, -0.12586787343025208, 1.0458545684814453, 1.867552638053894, 1.0384708642959595, 0.9822914004325867, 0.8339194655418396, 1.2455378770828247, 1.5150314569473267, 1.3689765930175781, 1.5302659273147583, 0.9511551260948181, 1.7531790733337402, 2.206747531890869, 0.2325689047574997, -1.0982974767684937, -4.15520715713501, 0.5602730512619019, -0.09719135612249374, 0.7061708569526672, 0.06024713069200516, 0.4242868721485138, 0.37279364466667175, 0.5726522207260132, -0.1750050038099289, -0.32539764046669006, 0.2408335953950882, -0.6925297975540161, -0.6065151691436768, 0.8218656182289124, -0.16971458494663239, 0.08742441982030869, -1.3567569255828857, 0.5332053899765015, -0.5007674098014832, 0.46124863624572754, 0.5888156890869141, -1.0300825834274292, -0.6071169972419739, -0.43670082092285156, 0.7580206394195557, 1.8257606029510498, 1.7451869249343872, 1.7521692514419556, 0.5098414421081543, 0.2590177655220032, 0.8195390105247498, 0.9641978144645691, 4.837606906890869, 3.2868900299072266, 1.818782091140747, 1.434892177581787, 0.9448391795158386, 0.5985550284385681, 2.9061574935913086, 3.282453775405884, 0.8079367876052856, -0.15017493069171906, 3.1777594089508057, 2.918867349624634, 1.1166198253631592, 0.15977276861667633, 3.140610456466675, 3.0788114070892334, 0.5319637656211853, -0.09137807041406631, -3.8286354541778564, -1.8639181852340698, -0.3282071352005005, 0.03373199328780174, -0.5669344663619995, 0.1712816059589386, -0.3243235945701599, -0.7091904282569885, -1.5042436122894287, -1.5100328922271729, 2.3604214191436768, 2.6083874702453613, 3.782924175262451, 2.9372596740722656, 1.348618507385254, 3.170527458190918, 3.721116065979004, 2.9574031829833984, 1.8501274585723877, 3.079943895339966, 3.801483631134033, 3.753190040588379, 1.9131923913955688, 4.159276008605957, 2.2047579288482666, 2.3334434032440186, 2.010338068008423, 1.9682223796844482, 2.9828591346740723, 1.5857744216918945, 1.5884212255477905, 1.7733629941940308, 3.097590684890747, 1.8600695133209229, 1.1620550155639648, -0.11578207463026047, 0.9058087468147278, 1.8416117429733276, 0.9550999999046326, 0.7730740308761597, 0.8068558573722839, 1.2676256895065308, 1.6203006505966187, 1.3793630599975586, 1.5423306226730347, 1.079593539237976, 1.753143310546875, 2.1962993144989014, 0.42526790499687195, -1.1035255193710327, -4.01256799697876, 0.4669577181339264, 0.0944533720612526, 0.5589342713356018, 0.018742764368653297, 1.3275293111801147, 0.5605528354644775, 0.48937758803367615, -0.2686607241630554, -0.37586772441864014, 0.2777574956417084, -0.5567525625228882, -0.7432703971862793, 0.8178793787956238, -0.09472329169511795, 0.1067245826125145, -1.3628329038619995, 0.4803270399570465, -0.5195837616920471, 0.38397789001464844, 0.5635223388671875, -1.0637869834899902, -0.42549702525138855, -0.5935278534889221, 0.9692766666412354, 1.7826426029205322, 1.7046242952346802, 1.7288154363632202, 0.4440993368625641, 0.1743515431880951, 0.7787818312644958, 1.8653441667556763, 4.836453914642334, 3.446953773498535, 1.7484431266784668, 1.631474494934082, 1.1314585208892822, 0.4791748821735382, 2.7826619148254395, 3.36324143409729, 0.8748834133148193, 5.427852374850772e-05, 3.1575212478637695, 3.085869550704956, 1.0245845317840576, 0.22670163214206696, 3.0901100635528564, 2.9943532943725586, 0.09074182063341141, -0.14851932227611542, -3.8536388874053955, -1.9751213788986206, -0.3170393705368042, -0.15329600870609283, -0.7010417580604553, 0.14065495133399963, -0.30106979608535767, -0.8721114993095398, -2.3661348819732666, -1.574155330657959, 2.1652674674987793, 2.594222068786621, 3.715742588043213, 3.151733875274658, 3.2799744606018066, 3.0608577728271484, 3.883697032928467, 2.992830753326416, 1.6733113527297974, 3.0903360843658447, 3.8979997634887695, 3.671541690826416, 1.9134854078292847, 4.185734272003174, 2.2828707695007324, 2.4042184352874756, 1.9913012981414795, 1.959373950958252, 3.063638687133789, 1.744260549545288, 1.6557472944259644, 1.8335329294204712, 2.9002888202667236, 1.6939785480499268, 1.2797813415527344, -0.20260648429393768, 0.9536758065223694, 1.7380074262619019, 0.949938952922821, 0.9702340960502625, 0.88371342420578, 1.3118950128555298, 1.5587106943130493, 1.393432855606079, 1.5564903020858765, 0.9284602999687195, 1.6531496047973633, 2.128455877304077, 0.30516692996025085, -0.9542091488838196, -0.3036510944366455, 0.4477669298648834, -0.08246328681707382, 0.501778244972229, 0.03040405549108982, 0.7563915252685547, 0.5697754621505737, 0.47760865092277527, -0.37631285190582275, -0.28147146105766296, 0.17988988757133484, -0.6014727354049683, -0.5843101739883423, 0.7672945857048035, -0.06094977259635925, 0.1388266533613205, -1.2556575536727905, 0.3173829913139343, -0.3465014696121216, 0.2414076328277588, 0.5933444499969482, -1.0584315061569214, -0.5281916856765747, -0.6209016442298889, 0.984308123588562, 1.6985013484954834, 1.7707003355026245, 1.6482473611831665, 0.5366992950439453, 0.36491066217422485, 0.8519235253334045, 0.8394411206245422, 4.763238430023193, 3.338785171508789, 1.7220418453216553, 1.565526008605957, 0.9244861006736755, 0.4663880169391632, 2.709338903427124, 3.2932019233703613, 0.7119160294532776, -0.17552845180034637, 3.287346124649048, 3.077460765838623, 1.0444767475128174, 0.1457153707742691, 3.118197202682495, 3.115549325942993, 0.534492552280426, -0.19193445146083832, 3.1368231773376465, 1.769403338432312, -4.284468173980713, -1.2055637836456299, -1.4457236528396606]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0, 0.8)}}, 'et1_eta3': {'discriminator': {'threshold': 0.21999870538711547, 'nodes': [100, 15, 1], 'bias': [-0.13548153638839722, -0.01683751679956913, -0.15725652873516083, 0.020923443138599396, -0.22614873945713043, -0.07646181434392929, -0.0734737291932106, 0.03853830322623253, -0.0010249352781102061, 0.020581664517521858, -0.12911821901798248, 0.08714920282363892, -0.06384588778018951, -0.03104345127940178, 0.18710413575172424, 0.03918536379933357], 'weights': [0.27311113476753235, -3.3759491443634033, -34.237274169921875, 0.328409880399704, -1.6261165142059326, 0.12471484392881393, 0.22774195671081543, -0.08361603319644928, -3.9591116905212402, -2.887002468109131, -1.541354775428772, 12.612893104553223, 29.523591995239258, 14.900782585144043, 10.443582534790039, -2.4962613582611084, 14.925068855285645, 0.03808491304516792, -3.5481462478637695, -8.93346881866455, -1.7305678129196167, -127.41497802734375, -65.80328369140625, -118.23959350585938, -295.6422119140625, -112.67206573486328, 1.144241452217102, -129.81878662109375, 22.81308937072754, -1.1874958276748657, 0.1742313802242279, 0.31636714935302734, 0.17071932554244995, 0.17372311651706696, 0.17733557522296906, 0.11163213849067688, 0.2852659821510315, -27.671287536621094, 0.45829784870147705, 0.18090751767158508, 0.5364158153533936, -15.83011245727539, 0.3233906328678131, 0.1439550220966339, 45.5847282409668, 0.09570784121751785, 1.4064524173736572, 0.0847150906920433, 0.05467672646045685, -70.02899932861328, 0.31328120827674866, 0.06496551632881165, 0.17603614926338196, 0.1412815898656845, 0.29800865054130554, 0.10240066051483154, 0.3294409513473511, -42.32052230834961, 0.2729935050010681, 0.018774917349219322, -0.13918672502040863, 1.7130153179168701, 0.19946470856666565, 0.09577897936105728, -0.017680292949080467, 0.25769948959350586, 1.0012086629867554, 0.11215098202228546, 0.09600920230150223, 0.40539315342903137, -0.20910269021987915, 0.2664446532726288, -0.30915671586990356, -0.42805078625679016, -0.9886420369148254, -8.625041961669922, 0.07689287513494492, -19.628448486328125, 0.28120774030685425, -2.2956244945526123, -40.68057632446289, -1.3853145837783813, -7.991135597229004, 0.1776903122663498, 0.31694063544273376, 0.10814964026212692, 0.17714503407478333, 0.0908486470580101, 0.08341775834560394, -0.7722832560539246, 0.15229634940624237, -1.2476352453231812, 35.65205383300781, 12.39472770690918, 0.014613754115998745, 0.07040692120790482, 0.22843848168849945, -0.06899148225784302, 0.00725973816588521, 0.05561147257685661, -0.4600379467010498, -0.6870471239089966, 0.408429890871048, 0.2508889138698578, 0.42010918259620667, -0.04579785466194153, 0.3904893398284912, 0.177372545003891, -0.7680620551109314, -0.892344057559967, -0.9540162086486816, 0.8645449280738831, 1.7521226406097412, 0.11230751127004623, 1.8163622617721558, 0.8675570487976074, 1.1688916683197021, 1.4678305387496948, 1.3472119569778442, 2.3290131092071533, 1.6482445001602173, 1.476757287979126, 0.6951602697372437, 1.7490801811218262, 4.456609725952148, 1.4942911863327026, 0.44262081384658813, 1.493670105934143, 0.910380482673645, 0.9890121817588806, 0.6399824023246765, 1.084384560585022, 0.68205726146698, 1.1336181163787842, 0.5933999419212341, 0.6526542901992798, 0.06795722246170044, 0.2801143527030945, 0.5119915008544922, 0.4993996322154999, 0.43809401988983154, 0.6876974701881409, 0.7441638708114624, 0.953073263168335, -0.47077476978302, 0.7663732171058655, 0.1420237272977829, 0.5246594548225403, -0.01110218558460474, 0.6920081973075867, 0.02887999825179577, 0.8462351560592651, -0.013490594923496246, 0.6587589383125305, 0.6666980385780334, 0.7191452383995056, 0.08141835033893585, 0.5353701114654541, 0.7466838359832764, -0.3038295805454254, -0.3849813640117645, 0.6442101001739502, 0.20662878453731537, -0.13836604356765747, -0.4729679822921753, 1.0059210062026978, 0.7994219660758972, 0.4501248896121979, -0.4794921576976776, -0.4212397634983063, -0.4803358316421509, -0.09829515963792801, -0.08503026515245438, 0.015857914462685585, 0.4961414039134979, 0.8615308403968811, 0.8257706165313721, 0.9702783226966858, 0.42256346344947815, 0.2524668872356415, 2.6660189628601074, 2.423447847366333, 1.9388025999069214, 0.844959020614624, 0.862026035785675, 0.7074673175811768, 0.30425840616226196, 0.24387919902801514, 0.16472911834716797, 0.7374336123466492, 0.15187427401542664, 0.1066104918718338, 1.6170693635940552, 0.7130842208862305, 0.2786671221256256, 0.4103098511695862, 0.30292952060699463, -0.01162293553352356, 0.018419107422232628, 1.6280436515808105, 260.2229919433594, 40.98914337158203, -9.259502410888672, 0.0716453343629837, 30.521841049194336, 0.053640056401491165, -2.0894179344177246, -0.12951870262622833, 0.21377700567245483, 0.138141468167305, -14.587696075439453, -44.362998962402344, 0.8160845041275024, -24.441612243652344, -20.646194458007812, -0.8131147623062134, 0.022992365062236786, -1.4554532766342163, -18.1925048828125, -83.29716491699219, -15.137067794799805, -82.07763671875, -0.15907622873783112, -0.28447389602661133, -34.728179931640625, 0.21393011510372162, -30.264799118041992, 0.019381016492843628, -0.038311224430799484, 0.1416430026292801, -5.1106109619140625, 0.13753269612789154, 13.506304740905762, 0.04869315028190613, -0.8316936492919922, -0.3174999952316284, -10.717031478881836, -0.11511392891407013, -82.73733520507812, -0.03938367962837219, 0.19481924176216125, 0.042442355304956436, -0.5166676640510559, -0.8231828808784485, 0.13947834074497223, 0.06059665605425835, 0.24069757759571075, 0.15347082912921906, 0.08259840309619904, 0.07090720534324646, 0.18815860152244568, 0.09103582799434662, 0.031159624457359314, 0.23961825668811798, -4.05682373046875, 0.28540360927581787, 0.18856042623519897, 0.2756196856498718, 0.767066478729248, 0.2137691229581833, 0.3667939305305481, 0.3547183871269226, 0.5839437246322632, 0.20705580711364746, 0.5050367712974548, 0.3099561333656311, 1.0168322324752808, 21.976741790771484, 0.13946032524108887, 0.2326180636882782, -62.532962799072266, 0.15546873211860657, -1.069101333618164, -0.47236382961273193, 4.534162998199463, 9.276572227478027, -0.03356550261378288, 7.737133502960205, -0.646903395652771, 0.11770778894424438, -19.07710075378418, -4.1830549240112305, 6.380957126617432, 0.03252365067601204, 0.12861032783985138, 0.34352266788482666, -0.09262091666460037, 0.22853399813175201, 73.98128509521484, 13.444624900817871, 0.09797342121601105, 6.109785556793213, -25.42735481262207, 0.30582383275032043, 0.7534922957420349, -25.422847747802734, 0.44558507204055786, 0.10153661668300629, 6.7417893409729, -81.96536254882812, -0.4475506842136383, -0.7685667276382446, 0.42536941170692444, 0.018292490392923355, 0.49354490637779236, 0.03125429525971413, 0.2981216609477997, 0.16212353110313416, -0.5965925455093384, -1.0961010456085205, -0.8986480832099915, 0.8294762969017029, 1.7315998077392578, 0.05017974227666855, 0.9368739128112793, 0.9250475168228149, 1.3568384647369385, 1.41081702709198, 1.4092081785202026, 2.3188436031341553, 1.5868051052093506, 1.5713979005813599, 0.8672316670417786, 1.7744754552841187, 4.4507341384887695, 1.5550717115402222, 0.46468648314476013, 1.4008857011795044, 0.8533420562744141, 1.0730996131896973, 0.6826199889183044, 1.1055177450180054, 0.6800651550292969, 1.188631534576416, 0.7294071316719055, 0.7286663055419922, -0.041002046316862106, 0.31920814514160156, 0.33175235986709595, 0.5573563575744629, 0.2779914438724518, 0.813319742679596, 0.7715116143226624, 1.0134650468826294, -0.4107332229614258, 0.6400874257087708, -0.13267318904399872, 0.7420524954795837, -0.1898316740989685, 0.626278281211853, -0.004900864791125059, 0.8470655679702759, -0.22561566531658173, 0.5965075492858887, 0.6883066296577454, 0.7371395230293274, 0.0753268375992775, 0.58357834815979, 0.6673306226730347, -0.12595801055431366, -0.248131662607193, 0.6029223799705505, -0.06962700188159943, 0.0010590306483209133, -0.6980670690536499, 1.104503870010376, 0.7738651037216187, 0.3541146218776703, -0.5828201174736023, -0.3860311210155487, -0.5130126476287842, -0.12079442292451859, -0.16519854962825775, 0.006086415145546198, 0.5295384526252747, 0.8368332982063293, 0.9307098388671875, 0.883460283279419, 0.3742440938949585, 0.17408856749534607, 2.756160259246826, 2.5823588371276855, 1.85627019405365, 0.9639574885368347, 0.717703640460968, 0.6514616012573242, 0.4047655165195465, 0.33446961641311646, 0.18162378668785095, 0.5493860244750977, 0.17933794856071472, -0.009808511473238468, 1.6288830041885376, 0.6881378293037415, 0.06067885458469391, 0.4358510375022888, 0.38695546984672546, -0.014165611937642097, -0.05582132190465927, 1.613330602645874, -0.004286932293325663, -4.7066121101379395, -0.12000785768032074, 0.242215096950531, -15.010812759399414, 0.027960803359746933, 0.37214863300323486, 0.1014244481921196, -8.68445110321045, -3.99629545211792, -0.4290243089199066, 16.896896362304688, 31.628252029418945, 12.017682075500488, 17.945066452026367, 0.356751024723053, -21.800493240356445, 7.176410675048828, -2.8248772621154785, 0.5219097137451172, 0.8123272061347961, 1.7116408348083496, 7.593018054962158, 0.4899737238883972, -16.07001495361328, 2.604401111602783, 0.39833924174308777, 0.36492183804512024, 0.14455756545066833, 0.31431129574775696, 10.885016441345215, 0.19592495262622833, -0.12833021581172943, 0.27526408433914185, 8.488813400268555, 0.08350221067667007, 9.375109672546387, 0.14156050980091095, 2.2691996097564697, 0.1520390808582306, 0.12032973021268845, 0.04873843118548393, 0.18690000474452972, 0.21026185154914856, 0.23697248101234436, 0.25504329800605774, 0.41612088680267334, 0.2565062642097473, 9.369866371154785, 0.13409647345542908, 43.341434478759766, 0.3932494819164276, 0.0896831825375557, 0.18505431711673737, 0.7346369624137878, 0.03387029096484184, 0.19374465942382812, 0.0705668032169342, 0.3003753125667572, 0.04298543557524681, 0.028996208682656288, -21.588180541992188, 0.11444854736328125, 0.13216161727905273, 4.773996829986572, 0.2832426130771637, 1.239473819732666, 0.2596017122268677, 12.176838874816895, 0.30314216017723083, -0.16596490144729614, 0.15720663964748383, -0.3566511273384094, 0.29557859897613525, -0.8388762474060059, -8.197958946228027, 0.10206726938486099, 0.12351687997579575, 0.19624237716197968, -1.6721720695495605, -27.545869827270508, -33.93985366821289, -15.668135643005371, -0.061052244156599045, 0.14876647293567657, 0.21657399833202362, 1.6471359729766846, 0.0860208198428154, -3.840632200241089, -7.525681972503662, 0.21275527775287628, 0.003266764571890235, -74.7641830444336, -21.594890594482422, 0.026560189202427864, -3.802018404006958, -15.33237075805664, -0.04104163497686386, 0.1169440820813179, -83.81757354736328, -0.5532897710800171, -0.8165198564529419, 0.34723711013793945, 0.27336299419403076, 0.47944629192352295, -0.07525037229061127, 0.2102240025997162, 0.17436525225639343, -0.6565780639648438, -1.0357780456542969, -0.44414329528808594, 0.7365843653678894, 1.6262153387069702, 0.03683947026729584, 1.7672659158706665, 3.134526252746582, 1.296297311782837, 1.5506997108459473, 1.3813825845718384, 2.2278246879577637, 1.6421846151351929, 1.4956694841384888, 0.7642945647239685, 1.7988592386245728, 4.489080429077148, 1.6430108547210693, 0.5391472578048706, 1.313070297241211, 0.9294195175170898, 1.0620927810668945, 0.6183980703353882, 1.0131871700286865, 0.8591032028198242, 1.0539237260818481, 0.7781015634536743, 0.6556150913238525, -0.04422974959015846, 0.2875678539276123, 0.707500696182251, 0.5017414093017578, 0.441723495721817, 0.8089386820793152, 0.6186651587486267, 0.9224994778633118, -0.4255253076553345, 0.8238158226013184, 0.08539765328168869, 0.7022716403007507, -0.1042095348238945, 0.6725255250930786, -0.12811416387557983, 0.7501046657562256, -0.0164378359913826, 0.4521348178386688, 0.6233397126197815, 0.7517130970954895, 0.2569166421890259, 0.5855529308319092, 0.6016921401023865, -0.10625948011875153, -0.26472845673561096, 0.7111026048660278, 0.33000805974006653, 0.499904602766037, -0.4827410578727722, 1.0805922746658325, 0.8632523417472839, 0.32516244053840637, -0.40037772059440613, -0.3574633300304413, -0.6059770584106445, -0.15426747500896454, -0.13341660797595978, -0.0032433196902275085, 0.6430386304855347, 0.8613996505737305, 0.8671399354934692, 0.8271334767341614, 0.3666239082813263, 0.20373180508613586, 2.736769199371338, 2.4440689086914062, 2.2921786308288574, 0.9166236519813538, 0.6728659868240356, 0.7497067451477051, 0.4107432961463928, 0.23322728276252747, 0.2601834833621979, 0.6962424516677856, 0.33579221367836, 0.08892210572957993, 1.6454521417617798, 0.7869789004325867, 0.09144618362188339, 0.42588698863983154, 0.45452365279197693, 0.09841546416282654, 0.1424616128206253, 1.0783820152282715, -0.7544552087783813, -0.7049180865287781, 0.41296079754829407, 0.55269455909729, 0.9070733189582825, 0.08183086663484573, 0.3689192533493042, 0.18148919939994812, -0.8073729872703552, -1.0684634447097778, -0.47660985589027405, 0.7094019651412964, 0.49947571754455566, 0.03986681252717972, 1.7131321430206299, 3.3250179290771484, 1.196668028831482, 1.4955694675445557, 1.250733733177185, 2.3139359951019287, 1.5271682739257812, 1.5264679193496704, 0.7613242864608765, 1.7532535791397095, 4.44857931137085, 1.5567858219146729, 0.4529055655002594, 1.428321361541748, 0.8504418134689331, 1.1516315937042236, 0.4522314667701721, 1.2195693254470825, 0.823298454284668, 1.1904023885726929, 0.5974008440971375, 0.6955486536026001, 0.07535363733768463, 0.5025022029876709, 0.5175940990447998, 0.48822325468063354, 0.3870915472507477, 0.8235669732093811, 0.5947208404541016, 0.7944426536560059, -0.6435062885284424, 0.7523051500320435, 0.1543126106262207, 0.7438613176345825, -0.23742346465587616, 0.6042104959487915, -0.008056694641709328, 0.7388272285461426, -0.047206368297338486, 0.5764167308807373, 0.8084863424301147, 0.6737048029899597, 0.05795464664697647, 0.6910982131958008, 0.6323676705360413, -0.1472538411617279, -0.3065909147262573, 0.5821704864501953, 0.2584359645843506, 0.41564640402793884, -0.4817456007003784, 1.0652761459350586, 0.8255042433738708, 0.45221972465515137, -0.4376998841762543, -0.3481597602367401, -0.4858693778514862, -0.009239261969923973, -0.10277857631444931, -0.14427503943443298, 0.6663879156112671, 0.8964037299156189, 0.8917728662490845, 0.9129073619842529, 0.436646431684494, 0.3320651650428772, 2.7604668140411377, 2.6407289505004883, 2.173305034637451, 0.9030668139457703, 0.7806549668312073, 0.6201235055923462, 0.3125680387020111, 0.35518062114715576, 0.1873771846294403, 0.6393232941627502, 0.17978760600090027, 0.21121342480182648, 2.346524477005005, 0.7971459031105042, 0.12291496247053146, 0.48052775859832764, 0.4420459270477295, 0.09912591427564621, 0.08721273392438889, 1.0219604969024658, -1.5588719844818115, -0.8675257563591003, 0.43477699160575867, 0.17809949815273285, 0.39835870265960693, -0.07163010537624359, 0.3103600740432739, 0.1386711746454239, 0.012463404797017574, -0.9493471384048462, -0.8898952603340149, 4.420409202575684, 1.76506507396698, 0.007498225662857294, 0.7084828019142151, 0.7218790650367737, 1.2075223922729492, 2.518134355545044, 1.185468316078186, 2.416799783706665, 3.962573766708374, 1.5983606576919556, 0.5702595114707947, 2.5679867267608643, 4.308701515197754, 1.4534597396850586, 0.2023158073425293, 1.5285755395889282, 2.3904953002929688, 0.9831451177597046, 0.5509435534477234, 1.1178311109542847, 0.7470869421958923, 1.4570659399032593, 0.6495356559753418, 0.7716516256332397, 5.241714000701904, 0.4222685396671295, 0.3064238429069519, 0.5635898113250732, 0.3062441945075989, 0.7924647331237793, 0.769102156162262, 0.8049970269203186, -0.47052067518234253, 0.6423972845077515, 0.03492344915866852, 0.5288445353507996, -0.05428708717226982, 0.8105145692825317, 0.06847403198480606, 0.8278687596321106, 0.05261142551898956, 0.4925355911254883, 0.8063614368438721, 0.5461177825927734, 0.11853044480085373, 0.5793411731719971, 0.600203812122345, -0.24961908161640167, -0.5832216143608093, 0.6533504724502563, 0.05589477717876434, -0.01924298331141472, -0.519298255443573, 0.9155225157737732, 0.7516279816627502, 0.3422444760799408, -0.5943817496299744, -0.4218832552433014, -0.5159735679626465, 0.34190821647644043, 0.018661558628082275, -0.0035139613319188356, 0.5830861330032349, 0.990135908126831, 1.601207971572876, 0.846612274646759, 0.5302431583404541, 0.2794918417930603, 2.652611494064331, 2.4696712493896484, 1.9371932744979858, 0.8131229877471924, 0.863625705242157, 0.6439306735992432, 0.23416277766227722, 0.2500298321247101, 0.37679553031921387, 0.6365455389022827, 0.22417716681957245, 0.07263913750648499, 1.771836757659912, 0.6203403472900391, 0.13748224079608917, 0.5088329315185547, 0.3803195357322693, 0.0439189150929451, 0.0008213225519284606, 4.312965393066406, 0.47734394669532776, 0.898761510848999, -0.2667087912559509, -0.0973474457859993, -0.5189624428749084, -0.0027940624859184027, -0.22998450696468353, 0.006554126739501953, 0.6445546746253967, 0.9255807995796204, 0.8313505053520203, -0.7014707922935486, -1.6359919309616089, -0.09600502252578735, -1.7021762132644653, -1.07358980178833, -1.1469436883926392, -1.3964389562606812, -1.2294076681137085, -2.353041887283325, -1.6063669919967651, -1.5430361032485962, -1.5466598272323608, -1.730797290802002, -4.369347095489502, -1.6390761137008667, -1.048595666885376, -1.4899080991744995, -2.3193399906158447, -1.0470846891403198, -0.6717123985290527, -1.0923277139663696, -0.7636577486991882, -1.024825096130371, -0.6830265522003174, -0.8583815097808838, -0.006527409888803959, -0.44446861743927, -0.2985711097717285, -0.5627002716064453, -0.3339860737323761, -0.8321446776390076, -0.6431950330734253, -0.9680547714233398, 0.574874997138977, -0.785204291343689, -0.12786348164081573, -0.6352939009666443, 0.06486734747886658, -0.7952043414115906, 0.07168187946081161, -0.6917932033538818, 0.0032862673979252577, -0.44765427708625793, -0.729211688041687, -0.5623509287834167, -0.2503095865249634, -0.5446416139602661, -0.5873317122459412, 0.17994065582752228, 0.3188384473323822, -0.7518025636672974, -0.3372591435909271, 0.2258499711751938, 0.47296226024627686, -0.9909543991088867, -0.9164610505104065, -0.38671085238456726, 0.5653322339057922, 0.2823928892612457, 0.714866042137146, 0.002476212102919817, 0.03695942088961601, 0.08442013710737228, -0.5575993657112122, -0.8062451481819153, -0.7455276250839233, -0.7823361754417419, -0.4767151474952698, -0.35367774963378906, -2.582487106323242, -2.6122488975524902, -1.886770248413086, -0.9308995604515076, -0.8385047316551208, -0.7167344093322754, -0.46863192319869995, -0.39046525955200195, -0.1844811737537384, -0.7411055564880371, -0.18712273240089417, -0.19130800664424896, -1.7296782732009888, -0.6437389850616455, -0.27467143535614014, -0.5217215418815613, -0.45382773876190186, -0.10261315852403641, -0.0684165507555008, -1.6919090747833252, -0.5155209898948669, -0.806369423866272, 0.34330156445503235, 0.3117218613624573, 0.42117294669151306, 0.17210544645786285, 0.35956382751464844, 0.18745771050453186, -0.5982280373573303, -0.8673656582832336, -0.7998253703117371, 0.6799397468566895, 1.7396693229675293, 0.01018490269780159, 1.6810013055801392, 1.0715056657791138, 1.1658540964126587, 1.482855200767517, 1.381729245185852, 2.2737245559692383, 1.488803744316101, 1.5996567010879517, 1.504366159439087, 1.8581136465072632, 4.268971920013428, 1.5788429975509644, 0.43393415212631226, 1.3380517959594727, 0.8981566429138184, 0.9955989122390747, 0.5538982152938843, 1.0904697179794312, 0.8144991397857666, 1.2277960777282715, 0.6513231992721558, 0.7951213121414185, -0.04602808132767677, 0.2981453239917755, 0.419134259223938, 0.5462741851806641, 0.23252877593040466, 0.7400702834129333, 0.6167660355567932, 0.9804249405860901, -0.5190922021865845, 0.7475981116294861, 0.1279441863298416, 0.72017502784729, -0.00586538715288043, 0.7034057974815369, -0.07630114257335663, 0.6230475902557373, -0.04864570125937462, 0.6449492573738098, 0.7979609966278076, 0.6658101677894592, 0.14317752420902252, 0.6638975143432617, 0.7831434011459351, -0.18051059544086456, -0.2411264032125473, 0.5855880379676819, 0.3468589782714844, -0.10748782753944397, -0.4463851749897003, 0.9568179845809937, 0.7273586392402649, 0.3716861307621002, -0.5015804171562195, -0.3407506048679352, -0.5029046535491943, -0.030073730275034904, -0.19758975505828857, -0.14465086162090302, 0.5322308540344238, 0.9455856680870056, 0.8921026587486267, 0.7468627691268921, 0.4567381739616394, 0.3669756054878235, 2.6993584632873535, 2.5978264808654785, 2.2640504837036133, 0.7590308785438538, 0.8010215163230896, 0.6861289143562317, 0.40964117646217346, 0.2118472009897232, 0.2549050748348236, 0.6341936588287354, 0.25215160846710205, 0.09524977952241898, 1.700262188911438, 0.706306517124176, 0.30715879797935486, 0.5290684103965759, 0.49244269728660583, -0.06418915838003159, 0.04975152760744095, 1.5500500202178955, -1.5834076404571533, -0.6954337954521179, 0.4650103747844696, 0.6577455401420593, 0.7889395356178284, 0.2049560397863388, 0.24486322700977325, -0.009022560901939869, -0.8666000962257385, -2.045853614807129, -0.3314337134361267, 0.8435583114624023, 0.4882270395755768, 0.15437184274196625, 1.7063837051391602, 3.206918716430664, 0.9475841522216797, 1.4774812459945679, 1.4013478755950928, 2.3738999366760254, 1.4100584983825684, 1.4283572435379028, 0.5761522054672241, 1.80962336063385, 4.321674346923828, 1.503580927848816, 0.11723089963197708, 1.3861414194107056, 0.9546619653701782, 1.11725652217865, 0.4995439648628235, 1.0666526556015015, 0.8333861231803894, 0.9895994067192078, 0.806423544883728, 0.8427911400794983, 0.04865162447094917, 0.3299253582954407, 0.3943425118923187, 0.6798813343048096, 0.4510830342769623, 0.8055926561355591, 0.6687991619110107, 0.8349362015724182, -0.5585463643074036, 0.8295691013336182, 0.1171579658985138, 0.6989243626594543, -0.19033868610858917, 0.6959813833236694, -0.01686459593474865, 0.6791707277297974, -0.04172997549176216, 0.8151465058326721, 0.8120613098144531, 0.5411016345024109, 0.08975402265787125, 0.518225371837616, 0.7131763100624084, -0.2667398452758789, -0.47982117533683777, 0.7223711609840393, 0.22968675196170807, 0.5080359578132629, -0.24779611825942993, 1.000519037246704, 0.8114537000656128, -0.11329104751348495, -0.41926029324531555, -0.40734976530075073, -0.5976492166519165, -0.18224789202213287, -0.19198033213615417, -0.1957840472459793, 1.4571523666381836, 0.9041946530342102, 0.9303934574127197, 1.0009019374847412, 0.3874715566635132, 0.14946575462818146, 2.6844358444213867, 2.594773292541504, 2.9927315711975098, 0.8210042715072632, 0.8316763043403625, 0.6037126183509827, 0.35337916016578674, 0.434031218290329, 0.10066181421279907, 0.8302664756774902, 0.13174991309642792, -0.03273296356201172, 2.895599365234375, 1.068758249282837, 0.14242731034755707, 0.7807971835136414, 0.3119576573371887, 0.11482574790716171, 0.0237018670886755, 4.427016735076904, -0.21071253716945648, -0.8135926723480225, 0.07525352388620377, 0.13170583546161652, 0.13392695784568787, -0.12049801647663116, 0.2329808473587036, 0.08609888702630997, -0.733835756778717, -0.7725173830986023, -0.7070527672767639, 0.9170985221862793, 1.566633939743042, 1.1905206441879272, 0.25901028513908386, 0.2332691103219986, 0.18001867830753326, 0.35527628660202026, 0.3007403612136841, 0.7856625318527222, 0.858182430267334, 0.48666107654571533, 0.18681484460830688, 0.5598626136779785, 1.880743384361267, 0.5172922611236572, 0.07522614300251007, 0.26447904109954834, 0.3308875858783722, 0.24684658646583557, 0.15553691983222961, 0.27314358949661255, 0.2199666053056717, 0.35521450638771057, 0.17764829099178314, 0.32060080766677856, 0.16585780680179596, 0.07454758137464523, 0.4575614929199219, 0.20994345843791962, 0.09051110595464706, 0.15978366136550903, 0.1526365578174591, 0.2779275178909302, -0.05156323313713074, 0.262028306722641, 0.22761356830596924, 0.3378054201602936, 0.16382645070552826, 0.20788058638572693, 0.0802481472492218, 0.20867034792900085, 0.0066891745664179325, 0.2572157680988312, 0.24560415744781494, 0.23787380754947662, 0.15692050755023956, 0.30082717537879944, 0.25108829140663147, -0.06754092127084732, -0.07401895523071289, 0.31813082098960876, 0.10019975900650024, 0.18728357553482056, 0.01887519098818302, 0.3369506597518921, 0.21679000556468964, 0.0318223275244236, 0.24033045768737793, 0.03164844959974289, -0.038366131484508514, 0.17063111066818237, 0.05540268495678902, 0.06684154272079468, 0.19353178143501282, 0.21182721853256226, 0.25729668140411377, 0.29491865634918213, 0.08781300485134125, 0.08205510675907135, 0.5169978141784668, 0.6391630172729492, 0.9494807720184326, 0.21649667620658875, 0.21951161324977875, 0.13263729214668274, 0.23807696998119354, 0.2754165232181549, -0.06839940696954727, 0.12042684853076935, 0.014029202982783318, -0.07188686728477478, 0.4520670175552368, 0.2932055592536926, 0.17542415857315063, 0.2527690827846527, 0.06127519533038139, -0.022234877571463585, -0.05630284547805786, 0.5495284199714661, -0.7811673879623413, -0.7133728861808777, 0.325501948595047, 0.5077052116394043, 0.8142783641815186, 0.20586371421813965, 0.23996958136558533, 0.16510328650474548, -0.6711987257003784, -0.9623690247535706, -0.4198915660381317, 0.7259751558303833, 0.30565518140792847, -0.0015063342871144414, 1.7810285091400146, 3.1886672973632812, 1.2207406759262085, 1.529780626296997, 1.247734546661377, 2.2516720294952393, 1.572585105895996, 1.468340277671814, 0.896185040473938, 1.6687573194503784, 4.2895989418029785, 1.5172935724258423, 0.45110300183296204, 1.326554536819458, 0.7773633003234863, 0.9641960859298706, 0.6486456990242004, 1.1244882345199585, 0.8756487369537354, 1.0511130094528198, 0.7055808901786804, 0.6503958702087402, 0.06480731070041656, 0.48645368218421936, 0.7077053189277649, 0.6091352701187134, 0.4724169671535492, 0.8187442421913147, 0.7369297742843628, 0.934201717376709, -0.44145146012306213, 0.7141538858413696, 0.16243413090705872, 0.7112907767295837, -0.24607394635677338, 0.6046221256256104, -0.10760464519262314, 0.7803038358688354, -0.10037544369697571, 0.6164449453353882, 0.770185112953186, 0.709969699382782, 0.05377931892871857, 0.6557050943374634, 0.8151196837425232, -0.21981477737426758, -0.28117895126342773, 0.7130841612815857, 0.3390423357486725, 0.4887005388736725, -0.49483630061149597, 1.0058166980743408, 0.8581113219261169, 0.43329522013664246, -0.51792973279953, -0.3770964443683624, -0.6321234703063965, 0.0005693019484169781, -0.14124834537506104, -0.15304464101791382, 0.5677072405815125, 0.8117382526397705, 0.849564790725708, 0.8176353573799133, 0.5676758885383606, 0.28594401478767395, 2.6703193187713623, 2.4239425659179688, 2.1639206409454346, 0.755211353302002, 0.8521448969841003, 0.8206840753555298, 0.44922077655792236, 0.427205353975296, 0.347832053899765, 0.7104714512825012, 0.17453518509864807, 0.14883162081241608, 2.288850784301758, 0.6242515444755554, 0.12886682152748108, 0.42596322298049927, 0.45793795585632324, 0.14197134971618652, 0.009008275344967842, 0.9529098868370056, 0.6105706095695496, 0.8994865417480469, -0.2882499396800995, 0.0026537529192864895, -0.5568832159042358, 0.07504217326641083, -0.284760057926178, -0.033087119460105896, 0.757278561592102, 0.8757665753364563, 0.8105220198631287, -0.6944780945777893, -1.7204450368881226, -0.18176758289337158, -1.7297269105911255, -0.9945343136787415, -1.1272376775741577, -1.4987133741378784, -1.383665919303894, -2.27018404006958, -1.4616681337356567, -1.4117454290390015, -1.0605192184448242, -1.8895319700241089, -4.472772121429443, -1.5155271291732788, -0.4828284978866577, -1.5075507164001465, -0.7342935800552368, -0.9939765334129333, -0.5512580275535583, -1.0616636276245117, -0.7082603573799133, -1.15836763381958, -0.6550585031509399, -0.8128366470336914, -0.060651060193777084, -0.471890926361084, -0.5251023173332214, -0.5056780576705933, -0.40958496928215027, -0.8470943570137024, -0.6003419756889343, -0.8957931399345398, 0.48357486724853516, -0.7695818543434143, 0.1736222207546234, -0.7057920694351196, 0.21066366136074066, -0.7980027198791504, 0.08247004449367523, -0.6937388181686401, 0.20614998042583466, -0.4705154001712799, -0.657437264919281, -0.5454309582710266, -0.14805318415164948, -0.5605241060256958, -0.5896328687667847, 0.1796286404132843, 0.35764482617378235, -0.632087230682373, -0.07106995582580566, 0.08762283623218536, 0.6918275356292725, -0.9348177909851074, -0.7766962051391602, -0.45545628666877747, 0.5924744009971619, 0.4280684292316437, 0.702368974685669, 0.006207578349858522, 0.16611775755882263, 0.11652491986751556, -0.5337023138999939, -1.001293420791626, -0.9304237365722656, -0.8409886956214905, -0.5098109245300293, -0.16034263372421265, -2.645500659942627, -2.6329870223999023, -1.9278244972229004, -0.8661825060844421, -0.6496831774711609, -0.6844520568847656, -0.3846784830093384, -0.3318297863006592, -0.16965413093566895, -0.6580185294151306, -0.13038940727710724, -0.1360854208469391, -1.7591766119003296, -0.7724975347518921, -0.12524476647377014, -0.3341684341430664, -0.30901074409484863, -0.045865777879953384, 0.04960915446281433, -1.51837158203125, 0.6167348623275757, 0.908183217048645, -0.26645487546920776, -0.6154975891113281, -0.8339879512786865, -0.3118394613265991, -0.25443458557128906, -0.12542937695980072, 0.6716971397399902, 0.9846269488334656, 0.24460136890411377, -0.8001673221588135, -0.48054420948028564, -0.07605305314064026, -1.7801909446716309, -3.2340381145477295, -1.2085442543029785, -1.4202587604522705, -1.3088916540145874, -2.2815284729003906, -1.480787992477417, -1.3882213830947876, -1.354114055633545, -1.7049531936645508, -4.347880840301514, -1.5492618083953857, -0.09061096608638763, -1.5195504426956177, -0.884406328201294, -1.0363097190856934, -0.6562923192977905, -1.1936662197113037, -0.7976014018058777, -1.1915693283081055, -0.6323226690292358, -0.8368862271308899, -0.09856187552213669, -0.42488792538642883, -0.6060835719108582, -0.6438119411468506, -0.38996773958206177, -0.7583129405975342, -0.5945144891738892, -1.0253342390060425, 0.42649489641189575, -0.8225446939468384, -0.04797378182411194, -0.7268449664115906, 0.24587993323802948, -0.8029035925865173, 0.0598384365439415, -0.685704231262207, 0.23384113609790802, -0.7581852674484253, -0.7104252576828003, -0.6334607601165771, -0.08708751201629639, -0.638883113861084, -0.6799800992012024, 0.08077347278594971, 0.43152016401290894, -0.5869405269622803, -0.28378742933273315, -0.5119267702102661, 0.44015106558799744, -0.8890959024429321, -0.8228159546852112, 0.24728941917419434, 0.4445188343524933, 0.5092743039131165, 0.5089160203933716, 0.009787028655409813, 0.08222697675228119, 0.17141316831111908, -1.5617766380310059, -0.8879087567329407, -0.9387885332107544, -0.7866247892379761, -0.40774354338645935, -0.35046839714050293, -2.5858256816864014, -2.5634875297546387, -2.9169323444366455, -0.789149820804596, -0.7400845885276794, -0.7203811407089233, -0.4053010940551758, -0.3471130132675171, -0.26618143916130066, -0.7336236238479614, -0.23484459519386292, -0.16824816167354584, -2.5584895610809326, -0.9378114938735962, -0.173076793551445, -0.7307318449020386, -0.35818803310394287, -0.14998823404312134, -0.0995444506406784, -0.9278904795646667, -0.3869398236274719, -0.7789960503578186, -0.5578797459602356, -0.5961406230926514, -0.5441072583198547, -0.6550984978675842, -0.6509705781936646, -0.7267401218414307, 0.9178454279899597, -1.5306267738342285, -1.1753522157669067, -1.7548272609710693, -0.49652668833732605, 1.5947051048278809, 1.0934933423995972]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (1.54, 2.5)}}, 'et4_eta2': {'discriminator': {'threshold': 0.5199984192848206, 'nodes': [100, 5, 1], 'bias': [0.11384682357311249, 0.07971647381782532, 0.00465692114084959, 0.14804889261722565, 0.07417404651641846, -0.15167193114757538], 'weights': [0.6251861453056335, -0.25750094652175903, -1.4020317792892456, -1.9289140701293945, -1.4157609939575195, 0.7055711150169373, 2.6523208618164062, -2.1011979579925537, 0.24038240313529968, 3.469379425048828, 2.972240447998047, 2.8049957752227783, 0.20326152443885803, 0.15728873014450073, 0.06024700775742531, 0.3360233008861542, -3.758897066116333, 0.13258475065231323, -0.0711980015039444, -1.3375860452651978, -2.8546996116638184, -2.1204047203063965, -0.0684124231338501, -1.1662191152572632, -3.9746084213256836, -1.0908246040344238, -1.5160080194473267, -2.889890670776367, -14.977043151855469, -2.253124952316284, -0.5126926302909851, -2.403907060623169, -1.6736992597579956, -0.4774019420146942, -1.9160369634628296, -2.1402039527893066, -5.9225053787231445, -5.899019718170166, -2.9991397857666016, -1.7249592542648315, -2.759883403778076, -3.162008285522461, -2.819316864013672, -2.0431363582611084, -1.1833516359329224, -0.9951058626174927, -2.0029408931732178, -1.358102560043335, -1.2570563554763794, -2.632812023162842, -0.09633296728134155, -1.6623297929763794, -2.981348752975464, -1.144919514656067, -1.7122328281402588, -1.0567208528518677, -0.340715616941452, -0.0395011305809021, 4.134775161743164, -1.4652589559555054, -0.9998790621757507, -0.7249534130096436, -1.9020615816116333, -1.8155207633972168, -3.1696438789367676, -1.7908531427383423, -3.229954481124878, -1.1272858381271362, -1.7559943199157715, -1.478967308998108, -1.6906861066818237, -1.5628578662872314, -0.10204700380563736, 0.19444040954113007, -3.63988995552063, -2.79940128326416, -2.708991765975952, -2.542445421218872, -2.79022479057312, -0.935571014881134, -0.002755355555564165, -0.4136531949043274, -2.970228672027588, -2.9139859676361084, -0.38378262519836426, -0.0933181643486023, -2.0412769317626953, -2.5171377658843994, 0.28245818614959717, -1.205154299736023, -1.112125277519226, -1.1050453186035156, -6.2303595542907715, -4.387772560119629, -2.4998362064361572, -1.7652161121368408, -0.03794768080115318, 0.11009768396615982, -0.5096169710159302, -0.8096550107002258, 0.5915060639381409, -0.31160369515419006, -1.4410845041275024, -1.9716180562973022, -1.4967429637908936, 1.1953855752944946, 2.7177886962890625, -2.1049180030822754, 0.00336395762860775, 3.55454158782959, 2.871202230453491, 2.7526512145996094, 0.19635173678398132, 0.03252992033958435, -0.003478707978501916, 0.16407446563243866, -3.764557123184204, 0.021522747352719307, -0.11380399018526077, -1.2975307703018188, -2.8535287380218506, -2.1596531867980957, -0.16350385546684265, -1.370679497718811, -4.070925235748291, -1.0803465843200684, -1.4905263185501099, -1.8689175844192505, -14.856679916381836, -2.042728900909424, -0.44669172167778015, -2.5588366985321045, -1.7590190172195435, -0.44044268131256104, -1.8720570802688599, -2.316516876220703, -5.842219352722168, -6.031185150146484, -2.9375598430633545, -1.6400786638259888, -2.5652737617492676, -3.211477756500244, -3.0283939838409424, -2.0970494747161865, -1.1159669160842896, -1.026295781135559, -1.9871904850006104, -1.2863669395446777, -1.1576951742172241, -2.669677972793579, 0.02546912431716919, -1.5517867803573608, -3.047452449798584, -1.128219723701477, -1.5645371675491333, -0.9775280356407166, -0.3035266101360321, -0.10793682187795639, 4.014409065246582, -1.540910005569458, -1.099531650543213, -0.76930832862854, -1.8994382619857788, -1.7588801383972168, -3.1870510578155518, -1.7342389822006226, -3.5911006927490234, -1.306019902229309, -1.5899324417114258, -1.5370594263076782, -1.7945507764816284, -1.4437994956970215, 0.03200437128543854, 0.1231115534901619, -3.8163578510284424, -2.8395779132843018, -2.801499128341675, -2.7131733894348145, -2.74865460395813, -0.9187059998512268, 0.03126358240842819, -0.2602922320365906, -2.8528318405151367, -2.9360594749450684, -0.20371052622795105, -0.06983864307403564, -1.9941691160202026, -2.541489839553833, 0.5262741446495056, -1.2684019804000854, -1.2105265855789185, -1.2496538162231445, -6.347973346710205, -4.473539352416992, -2.59781551361084, -1.6586239337921143, -0.07711153477430344, -0.10755360871553421, -0.34014564752578735, -0.9243701100349426, -0.41914936900138855, 0.28987643122673035, 1.356941819190979, 1.801226019859314, 1.6319600343704224, -1.184754729270935, -2.6590523719787598, 1.9787702560424805, -0.147994726896286, -3.571326732635498, -2.9122657775878906, -2.95862078666687, -0.01838676631450653, -0.031033098697662354, 0.0009070431115105748, -0.23096223175525665, 3.6497247219085693, -0.09984730184078217, -0.06267618387937546, 1.335605263710022, 1.4932795763015747, 2.082561492919922, 0.029438436031341553, 1.165748953819275, 4.107476234436035, 1.1520142555236816, 1.4163860082626343, 1.9165958166122437, 14.928508758544922, 2.095465660095215, -1.8835598230361938, 2.5578415393829346, 1.8803852796554565, 0.55727618932724, 1.9458516836166382, 2.327918767929077, 5.9761271476745605, 2.116595983505249, 3.0638883113861084, 1.6357983350753784, 2.6810195446014404, 3.0515615940093994, 2.8117008209228516, 2.1455790996551514, 0.9639905691146851, 0.8134739995002747, 1.9752752780914307, 1.2647392749786377, 1.1117299795150757, 2.611677885055542, -0.0025792717933654785, 1.671108603477478, 2.890641689300537, 1.0106009244918823, 1.3091106414794922, 1.1024497747421265, 0.2640187442302704, 0.18692582845687866, -4.086989402770996, 1.3441048860549927, 0.9860759973526001, 0.8977031707763672, 1.9307650327682495, 1.7732338905334473, 3.187098264694214, 1.8458033800125122, 3.4542462825775146, 1.1947933435440063, 1.6121084690093994, 1.6891437768936157, 1.6726008653640747, 1.5584595203399658, -0.9686614871025085, -0.21657349169254303, 3.7343661785125732, 2.67976975440979, 2.740396738052368, 2.612823486328125, 2.8123998641967773, 1.0568197965621948, -0.03107505291700363, 0.2964842915534973, 2.865086317062378, 2.8443613052368164, 0.1727270781993866, -0.0035155415534973145, 2.020949363708496, 2.316814422607422, -0.5141962766647339, 1.2290443181991577, 1.1659139394760132, 1.1418333053588867, 14.972591400146484, 4.466696262359619, 2.497905731201172, 1.7477083206176758, -0.06334817409515381, 0.033399637788534164, 0.32444649934768677, 0.7828245162963867, 0.5186731219291687, -0.4153514802455902, -1.2743417024612427, -1.7805110216140747, -1.4916870594024658, 0.6390983462333679, 2.610316753387451, -2.179161787033081, 0.12987308204174042, 3.4104957580566406, 2.7692294120788574, 2.7714321613311768, 0.11519055813550949, 0.0358150452375412, 0.016958579421043396, 0.25681251287460327, -3.5997579097747803, 0.05228642374277115, -0.010508648119866848, -1.3458880186080933, -2.8736653327941895, -2.1644716262817383, -0.19539210200309753, -1.2642103433609009, -4.032081127166748, -0.9764151573181152, -1.407490611076355, -2.8966383934020996, -14.771591186523438, -2.234963893890381, -0.30873292684555054, -2.551069498062134, -1.798890471458435, -0.39185231924057007, -1.9292949438095093, -2.3558194637298584, -5.888930320739746, -5.939783573150635, -3.046618938446045, -2.318540573120117, -2.613430976867676, -3.166398525238037, -2.9298148155212402, -2.2308549880981445, -1.0631154775619507, -0.9027920961380005, -2.023770570755005, -1.3248271942138672, -1.259539246559143, -2.607450246810913, -0.056861281394958496, -1.6692801713943481, -2.98555588722229, -0.986327052116394, -1.571074366569519, -1.1328989267349243, -0.3138138949871063, -0.035925328731536865, 4.066348075866699, -1.4790066480636597, -0.9636436700820923, -0.8355212211608887, -1.8168715238571167, -1.9189748764038086, -3.209160804748535, -1.7044228315353394, -3.3029239177703857, -1.1187292337417603, -1.7248260974884033, -1.584917664527893, -1.7880603075027466, -1.3707389831542969, 0.033712632954120636, 0.23266825079917908, -3.8815901279449463, -2.7895054817199707, -2.8245503902435303, -2.5588746070861816, -2.7325551509857178, -1.0391143560409546, -0.008321125991642475, -0.3310103416442871, -2.8346221446990967, -2.9092605113983154, -0.38864755630493164, -0.06265318393707275, -1.8666296005249023, -2.33286190032959, 0.30220067501068115, -1.3450342416763306, -1.07483971118927, -1.2951676845550537, -6.234707355499268, -4.511396884918213, -2.5473127365112305, -1.8235788345336914, -0.0896400660276413, 0.004149979911744595, -0.31332308053970337, -0.8156808018684387, 0.2771662175655365, -0.28466126322746277, -0.20923909544944763, -0.3346168100833893, -0.3393081724643707, 0.1554879993200302, 0.6477275490760803, -0.5276710987091064, 0.14617805182933807, 0.6768221855163574, 0.5229899287223816, 0.5495777130126953, -0.16318246722221375, 0.03908932954072952, -0.044825054705142975, 0.08439066261053085, -0.7099238634109497, 0.17296727001667023, 0.14014579355716705, -0.3523086905479431, -0.504760205745697, -0.3444230556488037, 0.09295668452978134, -0.34142163395881653, -0.9474895596504211, -0.10424963384866714, -0.3451277017593384, -0.566091001033783, -2.973419666290283, -0.3708055317401886, -0.06908171623945236, -0.6337583661079407, -0.4447052776813507, -0.13014893233776093, -0.3230210244655609, -0.44186750054359436, -1.2416123151779175, -1.1950196027755737, -0.5668541193008423, -0.3936935067176819, -0.4376339912414551, -0.5428186058998108, -0.5488232970237732, -0.32608091831207275, -0.14937427639961243, -0.28508633375167847, -0.41678473353385925, -0.26756778359413147, -0.35104164481163025, -0.5719276666641235, 0.01534741185605526, -0.25155511498451233, -0.6990581154823303, -0.1951550394296646, -0.4632768929004669, -0.2816784083843231, -0.056665461510419846, -0.0514071062207222, 0.9201054573059082, -0.31505677103996277, -0.3039117157459259, -0.19591976702213287, -0.3981074392795563, -0.4253137707710266, -0.5865145325660706, -0.45107176899909973, -0.6190328598022461, -0.3312896192073822, -0.27753961086273193, -0.305428683757782, -0.33897289633750916, -0.2503662109375, 0.17906412482261658, 0.13978268206119537, -0.7322458624839783, -0.6223763823509216, -0.5979492664337158, -0.6093989014625549, -0.5092815160751343, -0.22469232976436615, -0.006311587058007717, -0.018393786624073982, -0.6541185975074768, -0.5530127882957458, 0.06178972125053406, -0.07105831801891327, -0.29003018140792847, -0.5140512585639954, 0.2868286371231079, -0.20026011765003204, -0.13964718580245972, -0.17647787928581238, -1.3856056928634644, -0.9703487753868103, -0.615807831287384, -0.2486661672592163, -0.008055219426751137, 0.11634911596775055, -0.18856817483901978, -0.22616185247898102, 1.2099193334579468, 1.2411690950393677, -3.630277156829834, 1.3775845766067505, 0.7710458636283875]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (1.37, 1.54)}}, 'et2_eta1': {'discriminator': {'threshold': 0.3399985909461975, 'nodes': [100, 5, 1], 'bias': [0.01651812717318535, -0.13926127552986145, -0.040732357650995255, -0.009756160899996758, -0.29181867837905884, -0.4230961203575134], 'weights': [1.875033974647522, 2.0099172592163086, -0.5074464082717896, -2.495497465133667, -1.0318567752838135, -0.7896673679351807, -0.2378595620393753, 0.5792592167854309, 2.938339948654175, 8.890474319458008, -0.532684326171875, -18.24800682067871, -18.9058780670166, -14.747689247131348, -7.902640342712402, -7.967686653137207, -6.793240547180176, -7.97316312789917, -9.228382110595703, -9.145288467407227, -9.112112045288086, -10.092705726623535, -7.893771171569824, -4.651278495788574, -6.06505012512207, -6.173068523406982, -6.152647972106934, -5.818607330322266, -5.289919853210449, -5.819891452789307, -4.619137763977051, -4.689252853393555, -4.811014652252197, -4.7560272216796875, -2.8098294734954834, -4.896507740020752, -4.993577480316162, -3.830761671066284, -4.694208145141602, -3.8559305667877197, -3.3577558994293213, -2.611325979232788, -4.220177173614502, -2.7146458625793457, -1.4415576457977295, -0.45799875259399414, -0.7690829038619995, -2.3446853160858154, -0.7103240489959717, -1.2909417152404785, -1.6097453832626343, -1.7639966011047363, -1.841646432876587, -1.6420782804489136, -1.927522897720337, -2.005403518676758, -2.0604324340820312, 3.914365530014038, -0.19394399225711823, 0.1269225925207138, -0.20041842758655548, 0.08027685433626175, -1.241581916809082, 0.06853470206260681, -0.09779223799705505, -2.2489190101623535, -1.3971054553985596, -5.576432228088379, 0.5969211459159851, -0.3907736539840698, -1.1042678356170654, 0.18262019753456116, 0.5975922346115112, 0.6410396099090576, -1.4719958305358887, -2.119999885559082, -2.290353775024414, -3.3577818870544434, -0.9585183262825012, 0.26148417592048645, -6.424568176269531, -11.081985473632812, -7.275393009185791, -3.5975587368011475, -3.9083404541015625, -3.923099994659424, -3.650902032852173, -4.444343566894531, -3.868506908416748, -1.9987303018569946, -0.4727465510368347, 0.3047374188899994, -5.564382076263428, -5.015488624572754, -2.1893959045410156, 0.19184020161628723, -4.05333137512207, -3.4744656085968018, -2.894695281982422, -0.7358078360557556, -2.138406276702881, -2.1084015369415283, 2.217794895172119, 2.211237907409668, 2.003390073776245, 0.6395075917243958, 3.2420156002044678, -0.5694631934165955, -6.568490505218506, -1.949573040008545, 0.0870925784111023, 0.10387485474348068, 2.600078821182251, -0.5635790824890137, 7.718987464904785, 7.940392017364502, 6.6331071853637695, 7.73748779296875, 9.142827033996582, 9.24535083770752, 9.17730712890625, 17.04285430908203, 8.021662712097168, 6.606634616851807, 6.263670444488525, 6.101632118225098, 6.188879013061523, 5.973971843719482, 5.535314559936523, 5.92577600479126, 4.529201507568359, 4.721100330352783, 4.92861270904541, 4.721924781799316, 2.6550912857055664, 4.823751449584961, 4.089519500732422, 3.688180446624756, 4.67854118347168, 3.862563133239746, 3.344815492630005, 2.5502986907958984, 4.892500400543213, 2.546252965927124, 1.0911672115325928, 0.5148735642433167, 0.661919891834259, 2.4120805263519287, 0.6641308069229126, 1.1648428440093994, 1.5213446617126465, 1.7666157484054565, 1.9570605754852295, 1.680923342704773, 1.7595739364624023, 1.936344861984253, 2.027358055114746, -1.1101638078689575, 0.050265029072761536, -2.9353713989257812, 0.17144542932510376, -0.07678882777690887, 1.1279786825180054, 0.026984181255102158, 0.2516421675682068, 2.2205400466918945, 1.4446486234664917, 5.618035793304443, -0.36655744910240173, 0.3977486491203308, 1.1562607288360596, -0.20263980329036713, -0.6418544054031372, -0.6007882356643677, 1.5365338325500488, 2.2242352962493896, 2.3907716274261475, 3.0281808376312256, 0.8847504258155823, -0.07347764819860458, 6.601446151733398, 11.989531517028809, 7.993586540222168, 4.378693103790283, 4.753905773162842, 4.062860488891602, 3.789716958999634, 4.379395484924316, 3.883258819580078, 1.9905461072921753, 0.6629481315612793, -0.17608526349067688, 5.91093111038208, 4.856051445007324, 2.4011356830596924, 0.621196448802948, 5.4287824630737305, 3.6132724285125732, 2.8917300701141357, 0.7561365962028503, -7.66136360168457, -1.9566045999526978, 0.3413742184638977, -0.3169025480747223, 0.5612906217575073, 0.4738326668739319, 0.1280367225408554, -0.12908461689949036, -1.1089599132537842, -1.9495981931686401, 2.013185501098633, 0.695721447467804, 0.6664884090423584, -0.14383120834827423, -9.105535507202148, 8.88395881652832, 8.194418907165527, 8.118362426757812, 8.983386039733887, 15.847192764282227, 9.080297470092773, 8.025168418884277, 7.77787446975708, 4.049498081207275, 1.3205116987228394, 1.168777346611023, 1.2252341508865356, 1.249016523361206, 1.1255091428756714, 1.1996506452560425, 0.873487114906311, 0.9698370695114136, 0.9200482964515686, 1.0909960269927979, 0.5028417706489563, 1.0498082637786865, 0.8409689664840698, 0.7649657726287842, 0.9360293745994568, 0.6182217001914978, 0.4167337119579315, 0.5612971186637878, 0.6037231087684631, 0.43913084268569946, 0.2243342399597168, -0.01672550104558468, 0.2234622836112976, 0.46163004636764526, 0.03487828001379967, 0.466035932302475, 0.2541402280330658, 0.27434128522872925, 0.4476529657840729, 0.33774513006210327, 0.2865992784500122, 0.41252678632736206, 0.0024880252312868834, -0.1497209519147873, -0.05175769329071045, 0.02815801091492176, -0.02226218208670616, -0.0940958634018898, 0.17749682068824768, -0.02062593586742878, -0.0573367178440094, 0.38121798634529114, 0.2868680953979492, 1.1785837411880493, -0.014893853105604649, 0.13186797499656677, 0.13619869947433472, 0.03653286397457123, -0.21514317393302917, -0.08329702168703079, 1.2553131580352783, 2.1381380558013916, 2.320967435836792, -0.41384172439575195, 0.11922239512205124, 0.45126280188560486, 6.225594997406006, 2.408634662628174, 1.5509283542633057, 0.9759238362312317, 1.0082924365997314, 0.9345251321792603, 0.5880155563354492, 0.7158787846565247, 0.7399909496307373, 0.40702295303344727, -1.1001580953598022, 0.35878878831863403, 1.2574044466018677, 0.4741046726703644, 0.2246377170085907, 0.732416570186615, 1.0169740915298462, 0.19388526678085327, 0.4463232159614563, 1.0903161764144897, 1.9588959217071533, 2.0055527687072754, -0.5232058167457581, -1.4236847162246704, -1.114205002784729, -0.668312668800354, -0.34685468673706055, 0.9589683413505554, 3.631110429763794, 8.939948081970215, -0.6087762117385864, -18.4229793548584, -19.081100463867188, -14.776923179626465, -7.913535118103027, -8.15082836151123, -6.779226779937744, -7.945987224578857, -9.141851425170898, -9.244330406188965, -9.020554542541504, -10.115320205688477, -8.003589630126953, -4.196896553039551, -6.096635341644287, -6.21701717376709, -6.039369583129883, -5.785327434539795, -5.356564044952393, -5.819376468658447, -4.627766132354736, -4.676516056060791, -4.818751811981201, -4.782943248748779, -2.7727344036102295, -4.7456440925598145, -4.903599739074707, -3.6520440578460693, -4.829325199127197, -3.8416976928710938, -3.3797433376312256, -2.57191801071167, -4.130296230316162, -2.635913610458374, -1.4358590841293335, -0.3851478695869446, -0.6225800514221191, -2.3373053073883057, -0.6042454242706299, -1.3116786479949951, -1.6941758394241333, -1.8377108573913574, -1.8894476890563965, -1.8108415603637695, -1.9193819761276245, -2.0803050994873047, -0.1968514323234558, 1.080369234085083, -0.25416451692581177, 0.09270862489938736, 0.37445470690727234, 0.022953210398554802, -1.2585912942886353, 0.388694167137146, -0.09433546662330627, -2.2391977310180664, -1.6332571506500244, -5.5706467628479, 0.5404409766197205, -0.5114344358444214, -1.079782485961914, 0.10880546271800995, 0.7669867873191833, 0.5048133134841919, -1.471364140510559, -2.1953790187835693, -2.358229637145996, -3.336958885192871, -1.0056511163711548, -1.7114458084106445, -6.5532612800598145, -8.860387802124023, -7.310863018035889, -3.5234227180480957, -3.9534409046173096, -3.954491138458252, -3.653003454208374, -4.453188896179199, -3.7787857055664062, -2.045616388320923, -0.5202841758728027, 0.2658776342868805, -5.66404914855957, -4.829433441162109, -2.0338897705078125, -0.6546768546104431, -4.102285385131836, -3.3845913410186768, -2.822138547897339, -0.8365621566772461, -17.016807556152344, -24.641345977783203, -5.130126476287842, -2.6904189586639404, 0.39799928665161133, 0.47398641705513, -1.0647181272506714, -0.24866724014282227, -0.34161901473999023, -0.7105128169059753, 39.95035934448242, 2.831878900527954, 7.3188252449035645, 6.504739284515381, 0.9948558807373047, 0.9732303619384766, 0.7425878047943115, 0.710248589515686, 4.312987804412842, 3.9676079750061035, 4.369531154632568, 3.851053476333618, 3.876281261444092, 1.9084614515304565, 0.41528618335723877, 0.5398150682449341, 0.47171592712402344, 0.3831786811351776, 0.45285871624946594, 0.29007259011268616, 0.2538950443267822, -8.46192455291748, 0.3442690670490265, 0.2527095675468445, -1.525955080986023, 0.3919203281402588, 0.43289631605148315, -29.407472610473633, -34.61700439453125, 0.28793323040008545, 0.2892102003097534, 0.027027809992432594, -0.018104124814271927, 0.20092955231666565, 0.013346636667847633, -5.996646404266357, 0.04622534662485123, 0.061857908964157104, -0.10581143200397491, 0.023072782903909683, 0.1636875867843628, -0.05943959206342697, 0.1661878079175949, 0.019204935058951378, 0.1275356560945511, -5.327498435974121, -8.087818145751953, -0.23204822838306427, -0.09201974421739578, -0.28036248683929443, -0.15590937435626984, -0.02909776009619236, 0.21613207459449768, -16.89828872680664, -0.2723367512226105, 0.016883550211787224, 0.03379444405436516, 0.4741160273551941, -1.589136004447937, -0.06749897450208664, 0.007448224350810051, -0.17390163242816925, -0.4933198392391205, 0.307824045419693, 0.15898436307907104, 1.2082656621932983, 1.1240794658660889, 0.08820491284132004, 0.09730509668588638, -1.6231003999710083, 5.8778181076049805, 1.2579982280731201, 0.5310705900192261, 0.34640851616859436, 0.22184106707572937, 0.15819622576236725, 0.3268556594848633, 0.24989232420921326, 0.20530015230178833, 0.041499461978673935, -0.359250009059906, 0.03036625310778618, 0.38248410820961, 0.2977536618709564, 0.07914634048938751, 0.048560768365859985, 0.42851319909095764, 0.3707250952720642, 0.08794607222080231, 0.2513819634914398, 1.2807483673095703, -1.2921901941299438, -0.5568666458129883, 1.1083723306655884, -0.4744262099266052]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0.8, 1.37)}}, 'et2_eta2': {'discriminator': {'threshold': 0.49499844312667846, 'nodes': [100, 14, 1], 'bias': [0.1707249879837036, 0.10174738615751266, -0.20840246975421906, -0.13732850551605225, -0.09614444524049759, -0.019201381132006645, -0.05365116894245148, 0.09345933794975281, 0.08465275913476944, -0.06451258808374405, -0.02800479345023632, 0.019362030550837517, 0.11334354430437088, -0.00887064728885889, -0.13140974938869476], 'weights': [-0.06606043875217438, -0.8367270827293396, 0.115146704018116, 0.060741081833839417, -0.12235406041145325, -0.12245986610651016, -0.5687753558158875, 0.07358133047819138, 0.049203649163246155, -0.2521652281284332, -0.33001652359962463, -0.15812957286834717, -0.03010108321905136, 0.15555064380168915, -0.03557691350579262, -0.07275908440351486, 0.20077049732208252, 0.0018325630808249116, -0.07096224278211594, 0.9507601857185364, 0.09167873114347458, 0.22424428164958954, 0.04948459565639496, 0.6701226830482483, 0.11170085519552231, 0.2555394768714905, 0.2628246247768402, 0.2324056476354599, 0.8863117098808289, 0.1258459985256195, 0.10018187016248703, 0.044367656111717224, -0.4146184027194977, 0.2901155948638916, 0.09137792140245438, 0.04646814242005348, 0.6117924451828003, 0.17880254983901978, -0.5643086433410645, 0.20871685445308685, 0.18893471360206604, -0.21214157342910767, -0.37722790241241455, 0.39325931668281555, -0.15624672174453735, 0.24026773869991302, 0.22241196036338806, 0.17107123136520386, 0.14922232925891876, 0.2174467295408249, 0.10440286248922348, 0.19777287542819977, 0.1190444678068161, 0.12006296217441559, 0.20567160844802856, 0.2485208511352539, -0.04509178549051285, -0.6319347023963928, 0.07937153428792953, 0.0029797209426760674, 0.008058306761085987, 0.20494073629379272, -0.5568835735321045, -0.042290471494197845, -0.19626261293888092, -0.3394336402416229, -0.4649706184864044, -0.0005577346892096102, 0.08033037930727005, 0.20553575456142426, -0.657164454460144, 0.2305898517370224, -1.3261137008666992, -0.0024184423964470625, 4.489981651306152, 0.007991298101842403, 0.30681970715522766, 0.09137896448373795, 0.23328344523906708, 0.0060869562439620495, 0.13291841745376587, 2.194983720779419, 0.47018519043922424, 0.19108444452285767, 0.24352893233299255, 0.25093379616737366, 0.120008684694767, 0.08596907556056976, -0.15536849200725555, 0.15211153030395508, -0.012470908463001251, -0.05239341780543327, 0.46831536293029785, 0.23476940393447876, 0.08228341490030289, 0.08897280693054199, -0.06520887464284897, -0.013113612309098244, 0.16094890236854553, 0.05680893734097481, -0.15846510231494904, 0.023007133975625038, 0.4805394411087036, 0.7386955618858337, -0.05893643945455551, -0.07832388579845428, -0.489437997341156, 0.47066015005111694, 0.1497558206319809, -1.8187565803527832, -1.6817665100097656, -1.1312881708145142, -0.32791370153427124, 0.2686810791492462, -0.008977537043392658, -0.36380159854888916, 1.0248287916183472, -0.3592522144317627, 0.7478768825531006, 0.20873740315437317, 0.9317304491996765, 1.0154422521591187, 0.5308752059936523, 0.11958597600460052, 0.4139981269836426, 0.6401083469390869, 0.23358310759067535, 1.049261450767517, 4.3114800453186035, -0.11783634126186371, 0.8505382537841797, 0.5602614283561707, 0.35944584012031555, 0.9598845839500427, 0.7539865374565125, 0.617914617061615, 2.306867837905884, 0.6926198601722717, -2.9448094367980957, 0.6613332033157349, 0.6128464341163635, -0.8588602542877197, -1.8161532878875732, 2.143770933151245, -0.34903040528297424, 0.5341959595680237, 0.5151445865631104, 0.5737042427062988, 0.44619157910346985, 0.5914949178695679, 0.6390184760093689, 0.6983092427253723, 0.5768938660621643, 0.5351735949516296, 0.4607420563697815, 0.606026828289032, -0.2518922686576843, -3.109715223312378, 0.24683162569999695, 0.40903013944625854, 0.6581448316574097, 0.736084520816803, -2.4797914028167725, 0.28890854120254517, -1.101582646369934, -1.7910212278366089, -1.8346189260482788, -0.02027696929872036, 0.6025895476341248, 0.7256069779396057, -0.003613272914662957, 0.5578451156616211, -0.09166557341814041, -0.2378983199596405, 1.2032734155654907, 0.40869900584220886, 1.38259756565094, 0.8871416449546814, 0.7678374648094177, 0.4686409533023834, -0.033244144171476364, 0.3854514956474304, 1.9655872583389282, 0.9753177762031555, 0.9666259288787842, 0.865003764629364, 0.8214084506034851, 0.631327211856842, -0.42855533957481384, 0.11512231081724167, 0.07901459187269211, -0.09313514083623886, 2.1921839714050293, 0.8013532757759094, 0.5820163488388062, 0.7382540702819824, 0.03615826368331909, 0.09214795380830765, 0.34498289227485657, -0.04927142336964607, 0.19020627439022064, 0.008593279868364334, -0.7456904649734497, -0.7370827198028564, 0.048972953110933304, 0.009786338545382023, 0.4844837188720703, -0.30438879132270813, 0.10197588056325912, 1.8126013278961182, 1.8784635066986084, 1.1388660669326782, 0.23827698826789856, -0.34036093950271606, 0.20426660776138306, 0.18955275416374207, -1.008536696434021, 0.19251389801502228, -1.9256455898284912, -0.22562791407108307, -0.81178879737854, -0.8803373575210571, -0.7104411721229553, -0.25053662061691284, -0.589969277381897, -0.6647329330444336, -0.14198221266269684, -1.145090937614441, -4.348331928253174, -0.4134097993373871, -0.7745955586433411, -0.5676944851875305, -0.3689371645450592, -0.7786082625389099, -0.7569590210914612, -0.6402170062065125, -2.444904088973999, -0.44976791739463806, 2.8380000591278076, -0.8476167917251587, -0.6269283890724182, 0.6979691982269287, 1.88822603225708, -1.996711015701294, 0.3672381341457367, -0.5176037549972534, -0.5451810359954834, -0.5420520901679993, -0.5934973955154419, -0.5964339375495911, -0.621378481388092, -0.4748944640159607, -0.6849404573440552, -0.44632139801979065, -0.6190561056137085, -0.6392660140991211, 0.3132791817188263, 3.045849561691284, -0.37874794006347656, -0.38165152072906494, -0.5151529908180237, -0.7892104983329773, 2.50258469581604, -0.4062046408653259, 1.22688889503479, 1.8079942464828491, 1.9457989931106567, 0.010394269600510597, -0.5935432314872742, -0.7183888554573059, 0.058225493878126144, -0.5600332021713257, 0.18877120316028595, 0.11380460113286972, -1.3091801404953003, -0.8055684566497803, -1.4872583150863647, -0.7723063826560974, -0.8688029050827026, -0.46983107924461365, -0.10763821005821228, -0.47162461280822754, -1.9941385984420776, -0.9734681844711304, -0.9610986709594727, -0.8010903000831604, -0.6020194292068481, -0.5672622323036194, 0.4257555305957794, -0.27838170528411865, 0.01527438871562481, -0.01565510593354702, -2.1571640968322754, -0.9350494742393494, -0.5590060949325562, -0.829379677772522, 0.0978970006108284, 0.044757384806871414, -0.44883647561073303, 0.19522066414356232, 0.32063028216362, 0.06757009029388428, -0.5263333916664124, -0.5997104644775391, 0.23974613845348358, 0.12665528059005737, 0.3190617263317108, -0.2815082371234894, -0.09226834028959274, 1.7589316368103027, 1.7040865421295166, 1.109808325767517, 0.31404614448547363, -0.2686191499233246, 0.1794172078371048, 0.40101712942123413, -0.9511715769767761, 0.33520907163619995, -0.7663508057594299, -0.0857110470533371, -0.9366382956504822, -0.8773107528686523, -0.6620772480964661, -0.16531887650489807, -0.5222448110580444, -0.6641812920570374, -0.24093161523342133, -1.1190019845962524, -4.3045501708984375, -0.10023340582847595, -0.8655656576156616, -0.6361765265464783, -0.47832223773002625, -0.7756959795951843, -0.6823001503944397, -0.5645976662635803, -2.3193576335906982, -0.5462998747825623, 2.9422686100006104, -0.8613454103469849, -0.5349677205085754, 0.8700229525566101, 1.8396708965301514, -2.071143388748169, 0.36887139081954956, -0.5852486491203308, -0.6503114104270935, -0.7252158522605896, -0.5126715898513794, -0.5001258850097656, -0.6588872075080872, -0.5246867537498474, -0.5924035310745239, -0.44123491644859314, -0.5778620839118958, -0.721166729927063, 0.31314197182655334, 3.2302563190460205, -0.440328449010849, -0.3322342038154602, -0.5106637477874756, -0.6995989084243774, 2.489288568496704, -0.2689201235771179, 1.077247142791748, 1.8635884523391724, 1.9165407419204712, -0.007932139560580254, -0.6287121176719666, -0.6376098394393921, 0.02040170505642891, -0.4974731504917145, 0.19944177567958832, 0.2695881426334381, -1.315283179283142, -0.5260916352272034, -1.3933442831039429, -0.8893085718154907, -0.7917318344116211, -0.30085721611976624, -0.12256361544132233, -0.43783098459243774, -1.8691908121109009, -0.9016252756118774, -0.9164499044418335, -0.87711101770401, -0.6178460717201233, -0.7649113535881042, 0.5283727645874023, -0.35002005100250244, -0.12718641757965088, 0.09723836183547974, -2.145632743835449, -0.8486443758010864, -0.551122784614563, -0.7246545553207397, -0.002265618648380041, 0.029283616691827774, -0.3682063817977905, 0.0656578466296196, 0.36016353964805603, -0.0007007680833339691, -0.6836897134780884, -0.6444767117500305, 0.16020667552947998, -0.015924349427223206, 0.36518192291259766, -0.4724082350730896, 0.07465436309576035, 1.7346022129058838, 1.7319612503051758, 1.0755726099014282, 0.3566262722015381, -0.40479740500450134, 0.1838752180337906, 0.1851578652858734, -0.8637793660163879, 0.38351744413375854, -0.6452786922454834, -0.07175610214471817, -1.0273109674453735, -0.8811048865318298, -0.6363034844398499, -0.1745043396949768, -0.515251874923706, -0.772562563419342, -0.34472760558128357, -1.1246644258499146, -4.334987163543701, -0.09588155895471573, -0.805990993976593, -0.6273394823074341, -0.3068254292011261, -0.874455451965332, -0.7172515392303467, -0.7080560922622681, -2.3252809047698975, -0.5361090302467346, 2.8433258533477783, -0.6993681788444519, -0.5500839352607727, 0.7979773283004761, 1.731996774673462, -1.9894617795944214, 0.3960632085800171, -0.6874868869781494, -0.5490732192993164, -0.6096540689468384, -0.5656237602233887, -0.5132312178611755, -0.5283927917480469, -0.6692894101142883, -0.6083277463912964, -0.5203819870948792, -0.560654878616333, -0.7291178703308105, 0.1246354728937149, 3.2071101665496826, -0.454919695854187, -0.3157617747783661, -0.5304358005523682, -0.6555932760238647, 2.515575885772705, -0.35261106491088867, 1.0234708786010742, 1.853946566581726, 1.9248071908950806, 0.1677820235490799, -0.6271855235099792, -0.7273083329200745, 0.12267974019050598, -0.5100845098495483, 0.0386752225458622, 0.26321420073509216, -1.245235800743103, -0.42425069212913513, -1.5009785890579224, -0.9534385204315186, -0.8097448348999023, -0.48836183547973633, -0.061183150857686996, -0.560765266418457, -1.9399421215057373, -0.9947825074195862, -0.8831158876419067, -0.8652569651603699, -0.719931960105896, -0.6846681237220764, 0.5161029696464539, -0.23132792115211487, -0.02949303202331066, 0.0643598660826683, -2.2183046340942383, -0.9600793719291687, -0.6648999452590942, -0.8520799875259399, 0.1120728924870491, -0.07524948567152023, -0.32089558243751526, 0.18250079452991486, -0.29079487919807434, -0.07297219336032867, 0.5702992677688599, 0.6717420816421509, -0.17416059970855713, -0.07274244725704193, -0.42527180910110474, 0.3661322295665741, 0.08494842797517776, -1.7563726902008057, -1.8056137561798096, -0.932685911655426, -0.34595435857772827, 0.3874710202217102, -0.15931148827075958, -0.3592854142189026, 0.9126657843589783, -0.2059498280286789, 0.6499573588371277, 0.25811678171157837, 0.8527059555053711, 1.006898045539856, 0.7086886763572693, 0.12712575495243073, 0.4048194885253906, 0.5554826259613037, 1.0318541526794434, 0.9682132601737976, 4.507060527801514, 0.0813729539513588, 0.8449249267578125, 0.6335337162017822, 0.4526536762714386, 0.7994703650474548, 0.7515231966972351, 0.6182287335395813, 2.3965904712677, 0.5085525512695312, -2.8044607639312744, 0.6953141093254089, 0.7357233762741089, -0.8332928419113159, -1.8281304836273193, 1.9508066177368164, -0.39061909914016724, 0.6164454221725464, 0.5712622404098511, 0.5961549282073975, 0.43718281388282776, 0.5406273603439331, 0.4760308563709259, 0.601210355758667, 0.52655029296875, 0.5405638813972473, 0.6801670789718628, 0.5374364852905273, -0.08619681000709534, -3.260143756866455, 0.3417535722255707, 0.5257258415222168, 0.6978602409362793, 0.5808326005935669, -2.5340828895568848, 0.4318539798259735, -1.172688364982605, -1.8387123346328735, -1.9359201192855835, -0.010723121464252472, 0.6153915524482727, 0.7555891871452332, -0.20464158058166504, 0.44896411895751953, -0.045181505382061005, -0.2063431590795517, 1.1459882259368896, 0.5995404124259949, 1.48733651638031, 0.8769084811210632, 0.7463125586509705, 0.3198077976703644, 0.24702170491218567, 0.4455000162124634, 1.9642187356948853, 2.784557342529297, 0.7878943681716919, 0.7740758657455444, 0.6323056817054749, 0.6273369789123535, -0.4253511130809784, 0.26550713181495667, -0.052820831537246704, -0.0411500558257103, 2.4064958095550537, 0.8597870469093323, 0.5323863625526428, 0.6622788906097412, 0.037835054099559784, -0.06784868985414505, 0.5231173038482666, -0.27935290336608887, 0.1702578216791153, -0.0879364088177681, -0.4510855972766876, -0.7305835485458374, 0.14052385091781616, 0.13172666728496552, 0.35174769163131714, -0.47032755613327026, -0.09911150485277176, 1.7761969566345215, 1.898987054824829, 1.0423544645309448, 0.15041637420654297, -0.18931657075881958, 0.17707087099552155, 0.3138219118118286, -1.047913908958435, 0.15693987905979156, -0.845788300037384, -0.11595940589904785, -0.9816012382507324, -0.9386141896247864, -0.6105013489723206, -0.11443363130092621, -0.4670078754425049, -0.6465014219284058, -1.1085788011550903, -0.9356372952461243, -4.396286487579346, -0.01927894353866577, -0.6921009421348572, -0.6369092464447021, -0.31054243445396423, -0.7693153023719788, -0.5718578100204468, -0.7383718490600586, -2.3138387203216553, -0.6455010771751404, 2.822006940841675, -0.868607759475708, -0.610965371131897, 0.7023298740386963, 1.770892858505249, -2.0151991844177246, 0.27454274892807007, -0.6623110771179199, -0.6875004768371582, -0.6642158627510071, -0.5256713628768921, -0.6108142137527466, -0.6438130736351013, -0.5768171548843384, -0.522066056728363, -0.36864665150642395, -0.6493601202964783, -0.6015281081199646, 0.16107843816280365, 3.2206101417541504, -0.3796566128730774, -0.33368271589279175, -0.6816871166229248, -0.7077940106391907, 2.480868101119995, -0.26622551679611206, 1.069494366645813, 1.7232807874679565, 1.7395228147506714, -0.01610647700726986, -0.6258893609046936, -0.6925578117370605, 0.010905720293521881, -0.5765857696533203, 0.2191324383020401, 0.19725224375724792, -1.0961204767227173, -0.6066678166389465, -1.3004108667373657, -0.9496663808822632, -0.8151091933250427, -0.46325525641441345, -0.1480841040611267, -0.4401959776878357, -1.8412818908691406, -1.0023319721221924, -0.8521648645401001, -0.8622179627418518, -0.5929754376411438, -0.6103581786155701, 0.5395578145980835, -0.2704674303531647, 0.019960513338446617, -0.07035263627767563, -2.0682854652404785, -0.9522494673728943, -0.7201429605484009, -0.649121880531311, -0.0038468684069812298, -0.07442273944616318, -0.5431778430938721, 0.06096126139163971, -0.29913827776908875, -0.22480252385139465, 0.09798271954059601, 0.19686107337474823, -0.10142997652292252, -0.01850486360490322, -0.056461725383996964, 0.04583180323243141, -0.014286689460277557, -0.2753530740737915, -0.25825822353363037, -0.182356059551239, -0.1693047285079956, 0.35080114006996155, -0.12958882749080658, -0.11810768395662308, 0.13752485811710358, -0.08831862360239029, 0.9072059392929077, 0.05624870955944061, 0.195160910487175, 0.30208247900009155, 0.09255675971508026, 0.044305942952632904, 0.22604481875896454, 0.09186547249555588, -0.03759370371699333, 0.12795966863632202, 0.865724503993988, -0.0796608254313469, 0.25136440992355347, 0.11571536958217621, 0.07202447950839996, 0.11920921504497528, 0.0466068759560585, 0.19320273399353027, 0.5513982772827148, 0.18247893452644348, -0.6959736347198486, 0.19032639265060425, 0.1625700145959854, -0.2796567380428314, -0.4264359176158905, 0.3779034912586212, -0.10993436723947525, 0.08465975522994995, 0.0441151037812233, 0.16275198757648468, 0.02497279644012451, 0.2354019433259964, 0.05402551591396332, 0.18359331786632538, 0.22359558939933777, 0.11925652623176575, 0.07583490759134293, 0.2166750133037567, 0.07254905253648758, -0.6614377498626709, -0.047521889209747314, 0.03054985962808132, 0.16570903360843658, 0.23583261668682098, -0.46240824460983276, -0.013800681568682194, -0.32688790559768677, -0.2729969024658203, -0.28373590111732483, 0.07514017820358276, 0.15985046327114105, 0.2615641951560974, -0.02122042514383793, 0.03300300985574722, -0.030884999781847, -0.009869243018329144, 1.0417768955230713, 0.0588308647274971, 0.19089223444461823, 0.23361755907535553, 0.28113341331481934, 0.03868701681494713, 0.19222161173820496, 0.2460033893585205, 0.2862215042114258, 0.2148064523935318, 0.2555864453315735, 0.14327861368656158, 0.12096571922302246, 0.20990554988384247, -0.24028895795345306, 0.03277208283543587, -0.1116698831319809, 0.010837419889867306, 0.38927748799324036, 0.24378836154937744, 0.18102321028709412, 0.14603978395462036, 0.030626164749264717, 0.0230767410248518, 0.04298524186015129, -0.10658033192157745, -0.19822491705417633, 0.017320921644568443, 0.5835795402526855, 0.7346124649047852, -0.01011297944933176, 0.0779673159122467, -0.35347360372543335, 0.41597625613212585, 0.10790515691041946, -1.9020323753356934, -1.8129451274871826, -1.1516002416610718, -0.33691829442977905, 0.4159109890460968, -0.017693812027573586, -0.2744523286819458, 0.93325275182724, -0.236153244972229, 0.7452064752578735, 0.25735118985176086, 0.9640774726867676, 0.8334521651268005, 0.5171111822128296, 0.17464125156402588, 0.5816508531570435, 0.6847097873687744, 0.992009162902832, 1.0032310485839844, 4.498451232910156, -0.04158192127943039, 0.8977311849594116, 0.7140900492668152, 0.4246344268321991, 0.8618710041046143, 0.6554875373840332, 0.7373062372207642, 2.3705198764801025, 0.4818362891674042, -2.8747222423553467, 0.6885142922401428, 0.5670339465141296, -0.6717050075531006, -1.8146638870239258, 2.030334234237671, -0.26289185881614685, 0.5323486924171448, 0.739303708076477, 0.563902735710144, 0.5620641708374023, 0.5647371411323547, 0.6821945309638977, 0.598387598991394, 0.6163954138755798, 0.3165642321109772, 0.7284366488456726, 0.5649319887161255, -0.17787878215312958, -3.255401611328125, 0.4079532027244568, 0.4217488169670105, 0.5833332538604736, 0.6961525678634644, -2.5614712238311768, 0.28466498851776123, -1.2341487407684326, -1.722955346107483, -1.7248502969741821, -0.09456807374954224, 0.7081184983253479, 0.6572163105010986, -0.05610523745417595, 0.6121820211410522, -0.2205866277217865, -0.2835213840007782, 1.1495531797409058, 0.3707353174686432, 1.3297477960586548, 0.8093340396881104, 0.7244362831115723, 0.28341665863990784, 0.20724299550056458, 0.3906059265136719, 1.9285820722579956, 0.9102513790130615, 0.7475860118865967, 0.7830262184143066, 0.7098676562309265, 0.7345274090766907, -0.4079727232456207, 0.1700875610113144, -0.05329349637031555, 0.10088243335485458, 2.2018327713012695, 0.8356118202209473, 0.5235437750816345, 0.8635833263397217, -0.10976390540599823, -0.10480258613824844, 0.40139588713645935, -0.09504438191652298, 0.20081157982349396, 0.022383054718375206, -0.5264620184898376, -0.7780746221542358, 0.01499555166810751, 0.06694962829351425, 0.38671499490737915, -0.41949936747550964, 0.062368832528591156, 1.776449203491211, 1.8990669250488281, 1.1483021974563599, 0.3557695746421814, -0.3786681294441223, 0.004178141243755817, 0.2850566506385803, -0.9128211736679077, 0.33649688959121704, -0.8529667854309082, -0.08126382529735565, -0.8022549748420715, -1.0481257438659668, -0.5515504479408264, -0.20266515016555786, -0.5846991539001465, -0.6260547041893005, -0.24197988212108612, -1.089626669883728, -4.49760627746582, -0.06574679166078568, -0.7407722473144531, -0.7130200266838074, -0.2517540752887726, -0.8882997035980225, -0.7002393007278442, -0.5619049668312073, -2.492542028427124, -0.49571049213409424, 2.8060951232910156, -0.6426241993904114, -0.7041294574737549, 0.6915614604949951, 1.8596177101135254, -2.146216869354248, 0.3176295757293701, -0.5032723546028137, -0.6040768027305603, -0.7389822602272034, -0.43028202652931213, -0.5396321415901184, -0.6690815091133118, -0.5451828837394714, -0.5654584169387817, -0.3402523100376129, -0.700999915599823, -0.5194050669670105, 0.21520762145519257, 3.171365737915039, -0.44645997881889343, -0.3859562277793884, -0.5341928005218506, -0.5800620317459106, 2.595991611480713, -0.3031494617462158, 1.0833052396774292, 1.7150837182998657, 1.8841289281845093, 0.06221012771129608, -0.7275026440620422, -0.5689263939857483, 0.07199674099683762, -0.5281565189361572, 0.08878869563341141, 0.10386119037866592, -1.1837722063064575, -0.4507181644439697, -1.477969765663147, -0.9488312005996704, -0.7292497158050537, -0.3022158443927765, -0.081123948097229, -0.38466811180114746, -1.8919235467910767, -0.9737066030502319, -0.762954592704773, -0.7212927341461182, -0.7254342436790466, -0.7102254033088684, 0.388031929731369, -0.2265177071094513, -0.127097487449646, -0.06932099908590317, -2.13981556892395, -0.7409772276878357, -0.512828528881073, -0.7119044065475464, -0.04397844150662422, 0.03429115191102028, -0.5225852727890015, 0.16242296993732452, 0.2575269639492035, 0.07200753688812256, -0.4803715944290161, -0.6726734042167664, 0.12117724120616913, 0.021430684253573418, 0.49125218391418457, -0.33259275555610657, -0.0640081837773323, 1.857168197631836, 1.7706904411315918, 0.9879328608512878, 0.21545445919036865, -0.19425088167190552, 0.010440086014568806, 0.1935741901397705, -1.0045486688613892, 0.2712439298629761, -0.7702683806419373, -0.08033265173435211, -0.9034497141838074, -0.9321777820587158, -0.6487780809402466, -0.1797831505537033, -0.5308007001876831, -0.7778226733207703, -1.0102791786193848, -1.141680121421814, -4.491288661956787, -0.049505144357681274, -0.7399912476539612, -0.643155574798584, -0.43086275458335876, -0.8482596278190613, -0.7699534893035889, -0.6280007362365723, -2.5048470497131348, -0.4540512263774872, 2.8200747966766357, -0.7744748592376709, -0.5885825157165527, 0.8221393823623657, 1.8123719692230225, -2.177816152572632, 0.32903507351875305, -0.5374247431755066, -0.7203271389007568, -0.7675209641456604, -0.5365190505981445, -0.5663529634475708, -0.7035203576087952, -0.5076393485069275, -0.7212063074111938, -0.46486249566078186, -0.6474089622497559, -0.6144232749938965, 0.1835792511701584, 3.0708260536193848, -0.3485568165779114, -0.40443551540374756, -0.6116595268249512, -0.7263526320457458, 2.40240216255188, -0.3147500455379486, 1.222029447555542, 1.696759819984436, 1.7996011972427368, 0.1954583376646042, -0.7109985947608948, -0.6326432228088379, 0.06656544655561447, -0.3892747461795807, 0.14881843328475952, 0.04435308277606964, -1.321463704109192, -0.5656430125236511, -1.3266555070877075, -0.9577986001968384, -0.865882158279419, -0.5280560255050659, -0.10998094081878662, -0.5489081144332886, -1.8093022108078003, -0.9133367538452148, -0.807054877281189, -0.830051839351654, -0.7669137120246887, -0.7927852272987366, 0.4237079918384552, -0.1632678508758545, 0.016838181763887405, 0.133863165974617, -2.2296829223632812, -0.7837997674942017, -0.5662199258804321, -0.6562159061431885, -0.11195629090070724, -0.11045905202627182, -0.3404770791530609, 0.11778045445680618, 0.19456304609775543, -0.08189252763986588, -0.6308972835540771, -0.791385293006897, 0.09273719042539597, 0.0036272697616368532, 0.5182820558547974, -0.37931039929389954, 0.025979122146964073, 1.6895132064819336, 1.6942105293273926, 1.156462550163269, 0.3703320622444153, -0.21862953901290894, 0.13437162339687347, 0.24404951930046082, -1.0609395503997803, 0.3134382963180542, -0.6866099238395691, -0.08308583498001099, -0.9590905904769897, -0.89156174659729, -0.5632089376449585, -0.28201451897621155, -0.5454007387161255, -0.5649509429931641, -1.1785639524459839, -1.0518543720245361, -4.340404033660889, -0.014029682613909245, -0.8648631572723389, -0.5603560209274292, -0.3028838336467743, -0.8772537708282471, -0.8007323741912842, -0.7871732711791992, -2.305241107940674, -0.4620078504085541, 2.8605880737304688, -0.7312850952148438, -0.758791446685791, 0.780769944190979, 1.7776882648468018, -1.9467439651489258, 0.26868966221809387, -0.6945803165435791, -0.6851882934570312, -0.6378538012504578, -0.40507644414901733, -0.6939588785171509, -0.5712036490440369, -0.6783473491668701, -0.5617929100990295, -0.4198080599308014, -0.6738392114639282, -0.7160131931304932, 0.19510199129581451, 3.1225147247314453, -0.36572355031967163, -0.4884119927883148, -0.5298979878425598, -0.6219878792762756, 2.4063267707824707, -0.3514130711555481, 1.0509965419769287, 1.6644905805587769, 1.85016930103302, -0.02237199805676937, -0.7458216547966003, -0.7879654765129089, 0.13832825422286987, -0.5997087955474854, 0.19853012263774872, 0.0868348553776741, -1.2954236268997192, -0.570874035358429, -1.4467319250106812, -0.902022123336792, -0.7468485832214355, -0.5112848281860352, -0.1872190535068512, -0.5439612865447998, -1.9685388803482056, -2.9982452392578125, -0.7624760866165161, -0.769315242767334, -0.786322295665741, -0.7312611937522888, 0.5307304859161377, -0.20524565875530243, -0.011036472395062447, 0.07624375075101852, -2.3901426792144775, -0.8131526112556458, -0.6550995111465454, -0.7648617625236511, 0.07282546907663345, 0.09763270616531372, -0.4205498993396759, 0.26233625411987305, -0.37611302733421326, -0.08324261009693146, 0.6071580648422241, 0.6471080780029297, -0.21982400119304657, 0.05470181256532669, -0.39522844552993774, 0.36093834042549133, 0.03826794773340225, -1.7457695007324219, -1.7008426189422607, -0.9608684778213501, -0.4164491891860962, 0.4119073450565338, -0.06853660196065903, -0.2800791263580322, 0.8721845149993896, -0.16048695147037506, 0.7411051988601685, 0.24324552714824677, 0.916198194026947, 0.8727718591690063, 0.5156030654907227, 0.10147415101528168, 0.5175137519836426, 0.6858924031257629, 0.3416300117969513, 1.016345500946045, 4.301539897918701, 0.09222541004419327, 0.770401656627655, 0.5787761807441711, 0.454497367143631, 0.7615010738372803, 0.6721530556678772, 0.5608392357826233, 2.486370325088501, 0.4601303040981293, -2.866741180419922, 0.7381085157394409, 0.6982096433639526, -0.7911074161529541, -1.8138234615325928, 2.131837844848633, -0.38291674852371216, 0.721832275390625, 0.5956947803497314, 0.6320390701293945, 0.5877281427383423, 0.6565127372741699, 0.4869954586029053, 0.5795533657073975, 0.5080023407936096, 0.3591185510158539, 0.633054256439209, 0.6318902373313904, -0.1372980922460556, -3.138641834259033, 0.2485397756099701, 0.5049035549163818, 0.5944145917892456, 0.6488954424858093, -2.6102490425109863, 0.3289903700351715, -1.1422898769378662, -1.7584465742111206, -1.8603731393814087, -0.1263447403907776, 0.6475401520729065, 0.7691603302955627, -0.04166875034570694, 0.4432939887046814, -0.22522474825382233, -0.26486334204673767, 1.0855494737625122, 0.48611900210380554, 1.2984036207199097, 0.8412072062492371, 0.8948315382003784, 0.5172223448753357, -0.0054000187665224075, 0.605288565158844, 1.9040675163269043, 0.9255096912384033, 0.7655420303344727, 0.6665104031562805, 0.7887030243873596, 0.7897029519081116, -0.41110989451408386, 0.3289906680583954, 0.08841802924871445, -0.132473886013031, 2.073997735977173, 0.9251646399497986, 0.575813353061676, 0.8242260217666626, -0.05232124403119087, 0.05143008381128311, 0.3336430490016937, -0.10156107693910599, 0.38737282156944275, 0.089800626039505, -0.5030906796455383, -0.8163917064666748, 0.026236554607748985, -0.03604865446686745, 0.31367209553718567, -0.3890906274318695, -0.10957267135381699, 1.6989452838897705, 1.8146543502807617, 0.9518905282020569, 0.2548595666885376, -0.21066339313983917, 0.061901625245809555, 0.30497509241104126, -0.9035953283309937, 0.21303154528141022, -0.8366042375564575, -0.15224449336528778, -1.0235093832015991, -1.0237081050872803, -0.5104204416275024, -0.09374441206455231, -0.5089720487594604, -0.6223663687705994, -1.177372932434082, -1.0981420278549194, -4.324347972869873, 0.09347625076770782, -0.7191993594169617, -0.5926507711410522, -0.264563649892807, -0.8446622490882874, -0.6168825626373291, -0.5744748711585999, -2.3124473094940186, -0.48288026452064514, 2.822627305984497, -0.6331642866134644, -0.5293529033660889, 0.8631312847137451, 1.6713590621948242, -2.0736570358276367, 0.3591391146183014, -0.6325008273124695, -0.5102968215942383, -0.6211955547332764, -0.4435254633426666, -0.6689399480819702, -0.6333258748054504, -0.5403361916542053, -0.6690417528152466, -0.5028167963027954, -0.5884392261505127, -0.5459544658660889, 0.29578161239624023, 3.2089860439300537, -0.48283153772354126, -0.3715743124485016, -0.5767995119094849, -0.5935538411140442, 2.4912924766540527, -0.3598725199699402, 1.112144112586975, 1.6924365758895874, 1.813529133796692, 0.031690891832113266, -0.7386263012886047, -0.6216872930526733, 0.04963300749659538, -0.6039538383483887, 0.20572999119758606, 0.1326891928911209, -1.1857028007507324, -0.4725421667098999, -1.338919997215271, -0.8582887053489685, -0.8824808597564697, -0.41585978865623474, -0.11858848482370377, -0.5008370280265808, -2.0019214153289795, -2.7959845066070557, -0.8022576570510864, -0.7174177765846252, -0.6548818349838257, -0.6702412962913513, 0.42822059988975525, -0.19103501737117767, -0.07403820008039474, -0.07304581254720688, -2.3473761081695557, -0.7913103103637695, -0.5719696283340454, -0.6610695719718933, -0.11826533079147339, -0.09675638377666473, -0.5035718679428101, 0.07831930369138718, -0.32215631008148193, -2.055145025253296, 0.23507830500602722, 3.2227416038513184, 2.51741099357605, -0.2583579123020172, 1.2599904537200928, -0.21254514157772064, -0.5419886112213135, 0.9281531572341919, 1.5625057220458984, 0.2760341465473175, -1.4887807369232178, 0.2906089425086975]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (1.37, 1.54)}}, 'et2_eta3': {'discriminator': {'threshold': 0.32499860525131224, 'nodes': [100, 5, 1], 'bias': [0.00788446981459856, -0.0552411712706089, -0.04461474344134331, 0.028316013514995575, -0.03182104974985123, -0.10394201427698135], 'weights': [0.8866645693778992, 2.556509256362915, 1.2605292797088623, -0.7053293585777283, -0.5666756629943848, -1.1770684719085693, -0.14521314203739166, -0.47434401512145996, 1.3796004056930542, 3.112575054168701, 1.2103172540664673, -1.5549136400222778, -3.153865337371826, 0.10194616764783859, -4.306671619415283, -4.400684356689453, -3.415825366973877, -5.797379970550537, -4.162384510040283, -4.917461395263672, -2.887441396713257, -3.600128412246704, -2.3367486000061035, -3.3575918674468994, -11.457368850708008, -3.3863959312438965, -0.9010925889015198, -0.8031396865844727, -0.8098471164703369, -2.9547371864318848, -1.7250993251800537, -3.0472469329833984, -1.5851689577102661, -1.8912644386291504, -2.7962486743927, -0.48974359035491943, -0.3226456344127655, -1.8864710330963135, -1.194448471069336, -1.169174313545227, -0.7021977305412292, -1.9675836563110352, -3.0658020973205566, -1.9403047561645508, -0.5956904888153076, -1.4021230936050415, -0.9376400709152222, -3.788919687271118, 1.4170138835906982, -0.08359036594629288, -0.5999832153320312, 1.758783221244812, -0.8053829669952393, 0.7376378178596497, -2.768646240234375, -0.3445039987564087, 0.05063493549823761, -2.8349437713623047, -0.5258631706237793, -0.3931165337562561, -0.2657352089881897, -1.0838490724563599, -0.2015194296836853, -0.3336443305015564, -0.23711436986923218, 0.29125750064849854, -0.7750683426856995, -0.11601141095161438, 2.4019272327423096, -2.0096275806427, -0.9388010501861572, -3.814708948135376, 0.6594949960708618, 0.4011780321598053, -2.027766466140747, -2.077592372894287, -2.1469509601593018, -1.7370887994766235, -1.1557564735412598, -0.8719875812530518, -0.2641344666481018, -4.4357523918151855, -6.516595840454102, -3.170814275741577, -1.7167738676071167, -1.5650434494018555, -1.9787112474441528, -0.14804628491401672, -0.21691787242889404, -1.089533805847168, -0.3562376797199249, 0.3281002938747406, -4.176568031311035, -1.744714379310608, -0.1050671711564064, -2.076401472091675, -0.802380383014679, -0.03973992541432381, 0.28620898723602295, -12.925882339477539, 1.9419426918029785, 2.602848529815674, 1.2153435945510864, -0.6900002956390381, -0.5655251145362854, -0.952894926071167, 0.022272460162639618, -0.4958982467651367, 3.1198890209198, 3.025790214538574, 1.1861860752105713, -6.007218360900879, -3.1722805500030518, -0.2640519440174103, -4.331332206726074, -1.5999140739440918, -1.0840733051300049, -5.8222222328186035, -4.18679666519165, -4.853883743286133, -2.191801071166992, -3.1507978439331055, -2.288870096206665, -3.1576733589172363, -5.327248573303223, -3.352508306503296, -0.8761668801307678, -0.7575724124908447, -0.9277490973472595, -2.8850743770599365, -1.7238850593566895, -3.2047336101531982, -1.5239962339401245, -1.922297716140747, -2.9028563499450684, -0.43713223934173584, -0.39689573645591736, -2.063551425933838, -1.1043701171875, -1.0973916053771973, -0.7553235292434692, -0.34111839532852173, -3.1869847774505615, -1.9442647695541382, -0.5365073680877686, 1.1823997497558594, -1.2664458751678467, -2.7871766090393066, 1.4006975889205933, -0.12241924554109573, -0.7445502877235413, 0.02595626749098301, -0.8430140018463135, -0.6031336784362793, -2.808506488800049, 0.9689239859580994, 0.09706023335456848, -2.8670475482940674, -0.5151947140693665, 0.6677565574645996, -0.35322022438049316, -1.0831847190856934, -0.15348589420318604, -0.3028882145881653, -0.27966588735580444, 0.242187961935997, -0.6819342374801636, 1.2050498723983765, 2.4093573093414307, -2.0193686485290527, -0.874685525894165, -3.843883991241455, 0.5974795818328857, 0.29570522904396057, -1.3750430345535278, -2.129608154296875, -2.071500062942505, -1.7880357503890991, -0.9439229369163513, -0.9380764961242676, 1.075730562210083, -5.608274459838867, -6.570926189422607, -3.06646728515625, -1.8419228792190552, -1.6471420526504517, -1.7074791193008423, -0.21474198997020721, -0.15032127499580383, -1.3652732372283936, -0.48098471760749817, 0.1757192760705948, -4.199511528015137, -1.6398017406463623, -0.30331021547317505, -2.008441925048828, -0.6796550154685974, -0.02432888373732567, 0.25832536816596985, -13.047375679016113, 2.3015670776367188, 2.652259588241577, -0.04276109114289284, -1.6898763179779053, -0.5282547473907471, -1.1373041868209839, -0.16041436791419983, -0.7841352820396423, 3.0586726665496826, 3.285292863845825, 1.0829966068267822, -5.959018707275391, -3.2016642093658447, -0.25804877281188965, -4.159054756164551, -1.7311261892318726, -1.02461576461792, -5.719105243682861, -4.177931308746338, -4.913457870483398, -2.2203776836395264, -3.33137845993042, -2.2118284702301025, -3.2683162689208984, -5.3131103515625, -3.458804130554199, -0.8601236343383789, -0.9852460026741028, -0.794578492641449, -2.736215114593506, -1.7377876043319702, -3.0413286685943604, -1.5192049741744995, -2.0579564571380615, -2.9968316555023193, -0.40051767230033875, -0.4610377848148346, -2.084721803665161, -1.3372961282730103, -1.2142082452774048, -0.40443119406700134, -0.4215956926345825, -3.0003607273101807, -2.0365712642669678, -0.6028772592544556, 1.2844709157943726, -1.2248389720916748, -2.9994821548461914, 1.350193977355957, -0.06382647901773453, -0.7288849949836731, 0.16878457367420197, -0.90683513879776, -0.5223371386528015, -2.730466604232788, -0.31337636709213257, -0.8087965250015259, -2.7802727222442627, -0.4862459599971771, 0.7656293511390686, -0.3730849623680115, -1.0599578619003296, -0.14788918197155, -0.3234267830848694, -0.13641361892223358, 0.39424484968185425, -0.6739417314529419, 0.7168844938278198, 2.547192335128784, -1.9886322021484375, -0.915225625038147, -3.7405431270599365, 0.5558382868766785, 0.31367701292037964, -1.4577981233596802, -2.2457375526428223, -2.0853188037872314, -1.725975751876831, -1.016640305519104, -0.7467007637023926, 0.9459208250045776, -4.523372650146484, -6.458606243133545, -3.009582996368408, -1.8142799139022827, -1.4648798704147339, -1.2455072402954102, 0.16857734322547913, -0.31852027773857117, -1.2851754426956177, -0.4370708763599396, 0.17729100584983826, -4.101103782653809, -1.7085094451904297, -0.3303433954715729, -2.0256736278533936, -0.9063255190849304, -0.05150369554758072, 0.32025256752967834, -12.878612518310547, 8.361672401428223, 6.350287914276123, -0.19913531839847565, 1.5666073560714722, -0.7337610125541687, -1.0386338233947754, -0.00976614374667406, -0.6988812685012817, 1.131079912185669, 1.5748971700668335, 0.8122682571411133, -21.16731071472168, -11.693875312805176, -0.09097612649202347, -4.067779541015625, -4.6730451583862305, -3.5514535903930664, -5.725566864013672, -4.2891340255737305, -4.80296516418457, -2.525132894515991, -5.988006591796875, -2.218318462371826, -3.2977683544158936, -11.515636444091797, -3.4829905033111572, -0.8902175426483154, -0.9074594378471375, -5.001034259796143, -3.233494758605957, -1.6442557573318481, -3.4007623195648193, -1.5793441534042358, -2.005068063735962, -2.0826714038848877, -1.2316325902938843, -0.23147350549697876, -2.4398794174194336, -1.248934268951416, -1.172889232635498, -0.5631307363510132, 0.2539132237434387, -1.9099215269088745, -1.8873746395111084, -0.5123938322067261, -1.5539332628250122, -0.6213929057121277, -3.8233139514923096, 0.4135018289089203, -0.46119144558906555, -0.2959749102592468, -0.5910411477088928, -9.713387489318848, 0.6432381868362427, -2.776925802230835, 14.407981872558594, 0.10814400017261505, -2.965383768081665, -0.49891337752342224, -0.7406617403030396, -0.14934559166431427, -0.982591986656189, -0.2709519565105438, -0.41164958477020264, -0.25321534276008606, -1.4062607288360596, -0.6443464756011963, -0.3202524185180664, 2.5272762775421143, -2.1843132972717285, 0.06493590027093887, -3.794705629348755, 0.6113260388374329, 0.6873775124549866, -4.210161209106445, -2.237816333770752, -2.09950590133667, -1.8381483554840088, -0.844685435295105, -0.8206974267959595, 3.839216709136963, -4.1806864738464355, -6.32426118850708, -3.149077892303467, -1.7862660884857178, -1.6609349250793457, -1.84271240234375, -0.1596592366695404, 0.06947872787714005, 0.6660725474357605, -0.5717366933822632, 0.30210867524147034, -4.775027275085449, -1.7132046222686768, -0.1530657559633255, -2.0644919872283936, 1.193641185760498, -0.09290184080600739, 0.4423705041408539, -22.962764739990234, 361.2158203125, 53.927001953125, 1.1349157094955444, -23.825899124145508, -11.452814102172852, -52.039695739746094, 0.19839875400066376, -30.636899948120117, 4.653786659240723, 4.191861152648926, -2.7073757648468018, -63.682273864746094, -47.79704666137695, -15.64342975616455, -133.45928955078125, -45.834197998046875, -4.262157917022705, -21.25887680053711, -20.2669677734375, -98.93568420410156, 0.08636799454689026, -19.482770919799805, -38.57852554321289, 3.319154739379883, 18.212064743041992, 3.307018995285034, -86.56903839111328, -1.7849090099334717, -0.49602311849594116, 2.808689832687378, 0.7876392006874084, -6.89988374710083, 1.4884074926376343, -68.577392578125, 1.9276267290115356, -54.111846923828125, -42.21574783325195, 1.9889826774597168, 0.6460270881652832, -16.113811492919922, -25.492910385131836, -3.291553258895874, 1.687590479850769, 53.678897857666016, -9.812946319580078, 28.589740753173828, -27.197240829467773, 48.462615966796875, -1.9507153034210205, -42.17255401611328, 0.018531514331698418, -3.102607250213623, -34.584964752197266, -0.6322385668754578, 2.4058563709259033, 58.15827178955078, -0.16933637857437134, 3.1508588790893555, 0.7075089812278748, 0.7235881686210632, -6.518099784851074, 1.0705773830413818, -0.7424505352973938, -2.3129723072052, -61.94121170043945, 2.5413455963134766, 0.7139628529548645, -11.017036437988281, -2.411630868911743, 2.198167085647583, -0.15526176989078522, 3.858042001724243, -0.04248121753334999, -2.9395751953125, 6.370877265930176, 2.2874696254730225, 2.1906070709228516, -0.2640475928783417, -1.9064992666244507, 0.6887487173080444, 0.7354648113250732, 4.258697032928467, 6.53880500793457, 2.7215805053710938, 1.8767728805541992, 1.5336604118347168, 1.995628833770752, -0.35732460021972656, 100.3153305053711, 34.34101867675781, 0.7588233351707458, -6.39007043838501, 4.54166316986084, 1.7927271127700806, -1.3286956548690796, 4.079582691192627, -7.721810817718506, 9.561965942382812, 0.2421628087759018, 11.420624732971191, 1.8032723665237427, 1.3724095821380615, 2.0775630474090576, 0.5677655935287476, -0.7045931816101074]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (1.54, 2.5)}}, 'et2_eta0': {'discriminator': {'threshold': 0.37499855756759642, 'nodes': [100, 5, 1], 'bias': [-0.12483435124158859, -0.10226479172706604, 0.048882145434617996, 0.038836244493722916, -0.01681659184396267, -0.5366148352622986], 'weights': [-2.793397903442383, -2.0708250999450684, -0.12229000777006149, 0.8238522410392761, -0.3435535132884979, -0.256517618894577, -0.7208641767501831, -0.3458976149559021, -2.815298080444336, -2.6088621616363525, 9.818424224853516, 6.140866756439209, 5.1284027099609375, 4.434843063354492, 3.377664566040039, 3.5065627098083496, 4.381206512451172, 4.839986801147461, 4.87090539932251, 4.245048999786377, 3.8784537315368652, 1.2294416427612305, 3.250715970993042, 3.597304105758667, 2.49294114112854, 2.365709066390991, 2.4510326385498047, 2.2781221866607666, 2.178699254989624, 2.5074031352996826, 2.4789459705352783, 2.2593629360198975, 1.8417326211929321, 2.192194938659668, 1.156245231628418, 1.6384360790252686, 1.3636661767959595, 1.8540456295013428, 1.6184887886047363, 1.2148140668869019, 4.523613929748535, 1.379786491394043, 0.8362826108932495, 1.0319654941558838, 0.4607721269130707, 1.8506715297698975, 0.5708651542663574, 0.8524535894393921, 0.6334859728813171, 1.703233242034912, 0.7955631613731384, 0.5439462065696716, 1.0977370738983154, 0.8602331876754761, 0.7803763747215271, 0.3837242126464844, 0.3050194978713989, -0.693212628364563, -0.026346081867814064, -0.10011033713817596, 0.27786558866500854, -2.296379566192627, 0.8622558116912842, 0.9686951041221619, 2.5341148376464844, 0.591350257396698, -0.5353699326515198, 0.24722714722156525, -0.09872029721736908, 0.101466104388237, 0.20784813165664673, 0.7859892845153809, -0.34786561131477356, -0.3296988606452942, 0.9464410543441772, 1.69089937210083, 1.810727834701538, 1.1499561071395874, 0.7949889898300171, 0.4261282682418823, 1.4265332221984863, 3.416452407836914, 3.928701639175415, 2.8075332641601562, 2.246126890182495, 2.06162428855896, 1.5765190124511719, 2.2075164318084717, 4.171732425689697, 2.984755277633667, 1.2704678773880005, -0.08430518209934235, 4.1573028564453125, 2.586057662963867, 0.9398143291473389, -0.08532904833555222, 5.309053897857666, 2.886584997177124, -0.04642226919531822, 0.3016264736652374, -2.867333173751831, -2.1695499420166016, -0.03658750280737877, 0.9950780868530273, -0.28693675994873047, -0.4561077356338501, -0.8755659461021423, -0.2419799417257309, -2.572260856628418, -2.5080058574676514, 1.1113929748535156, 6.15207576751709, 5.238799095153809, 4.4171671867370605, 3.5503005981445312, 3.353978395462036, 4.037023544311523, 4.748635768890381, 4.7074456214904785, 3.9648070335388184, 3.9109761714935303, 1.194137454032898, 3.2328951358795166, 3.6757659912109375, 2.463534355163574, 2.2345802783966064, 2.3462588787078857, 2.1334471702575684, 2.289325714111328, 2.2671759128570557, 2.349083662033081, 2.2873375415802, 1.7560956478118896, 2.1562016010284424, 1.189494013786316, 1.7418874502182007, 1.2189451456069946, 1.7114077806472778, 1.5721211433410645, 1.2133005857467651, 2.3140811920166016, 1.3934723138809204, 0.8478716611862183, 0.858556866645813, 0.4489583671092987, 1.4045780897140503, 0.5139455795288086, 0.9397397637367249, 0.7417899370193481, 1.7360533475875854, 0.7101461291313171, 0.43147456645965576, 1.1987477540969849, 0.6520602703094482, 0.7820590138435364, 0.4597562253475189, 0.2058124840259552, -0.787979781627655, -0.10290277004241943, -0.08104969561100006, 0.19602854549884796, -2.2484934329986572, 0.6557759642601013, 0.5840897560119629, 2.5371146202087402, 0.9443176984786987, -0.354851633310318, 0.11332384496927261, 0.09240604937076569, -0.017222372815012932, -0.04544787108898163, 0.6892842054367065, -0.6388503313064575, -0.264209121465683, 0.9446303248405457, 1.8191293478012085, 1.8631620407104492, 1.3452131748199463, 0.7568941712379456, 0.3343203365802765, 2.2058260440826416, 3.6997323036193848, 3.7718918323516846, 2.6268272399902344, 2.2566885948181152, 2.1196448802948, 1.2812962532043457, 1.7839045524597168, 4.143006801605225, 3.06341290473938, 1.2008962631225586, 0.040645208209753036, 3.5784356594085693, 2.5634822845458984, 0.8994272351264954, -0.23019644618034363, 5.359469890594482, 3.019563913345337, 0.17618286609649658, 0.2883881628513336, 2.899857521057129, 2.116607666015625, 0.1694803237915039, -0.5699676275253296, 0.25827163457870483, 0.3286980986595154, 0.7058380246162415, 0.36074674129486084, 2.721364974975586, 2.8344156742095947, -4.058346271514893, -6.07627010345459, -5.073841094970703, -4.5377516746521, -3.428837776184082, -3.4128808975219727, -4.339926719665527, -4.788172721862793, -4.874410629272461, -4.249608516693115, -3.8050436973571777, -1.4409184455871582, -3.361682891845703, -3.702193021774292, -2.5246670246124268, -2.3703951835632324, -2.346682548522949, -2.3345654010772705, -2.3508732318878174, -2.265964984893799, -2.493600606918335, -2.067065477371216, -1.812131404876709, -2.163743495941162, -1.2848223447799683, -1.6534150838851929, -1.3361858129501343, -1.744596242904663, -1.614638090133667, -1.0458617210388184, -2.3976354598999023, -1.3682587146759033, -0.8607611060142517, -1.0060675144195557, -0.5463474988937378, -1.5456016063690186, -0.47304219007492065, -0.8900745511054993, -0.657384991645813, -1.6128746271133423, -0.8337711691856384, -0.49045294523239136, -1.2162104845046997, -0.654731810092926, -0.8609652519226074, -0.5365229845046997, -0.3158026337623596, 0.7128595113754272, 0.07463615387678146, -0.0866665244102478, -0.27436989545822144, 2.3399839401245117, -0.8527559041976929, -0.9321187734603882, -2.471670389175415, -0.992064356803894, 0.5545194149017334, -0.18364526331424713, 0.07635891437530518, -0.07546298205852509, -0.23272883892059326, -0.8539066314697266, 0.38907569646835327, 0.34044012427330017, -1.0106858015060425, -1.740762710571289, -1.678263545036316, -1.3743884563446045, -0.8785580396652222, -0.3136010766029358, -2.0672335624694824, -3.6953282356262207, -3.76662015914917, -2.7978014945983887, -2.2587356567382812, -1.9841508865356445, -1.3074575662612915, -1.8920390605926514, -4.0868353843688965, -3.0864996910095215, -1.2271597385406494, -0.06890691816806793, -3.4301679134368896, -2.5371673107147217, -1.0599160194396973, 0.07654707878828049, -5.384040832519531, -2.9845688343048096, 0.028007717803120613, -0.39498600363731384, 2.894604444503784, 2.007709264755249, 0.25683602690696716, -0.21122033894062042, 0.39200714230537415, 0.377647340297699, 0.7413645386695862, 0.3037513494491577, 2.7625021934509277, 2.8480918407440186, -3.9391050338745117, -6.1844611167907715, -5.138907432556152, -4.472313404083252, -3.341977834701538, -3.4090447425842285, -4.185109615325928, -4.835573673248291, -4.921023368835449, -4.378082752227783, -3.946549892425537, -1.4151043891906738, -3.3548827171325684, -3.9185268878936768, -2.4399335384368896, -2.343597173690796, -2.3997440338134766, -2.2009403705596924, -2.376821756362915, -2.374126672744751, -2.4936389923095703, -2.0932562351226807, -1.8051066398620605, -2.3353333473205566, -1.270889163017273, -1.7716227769851685, -1.1999213695526123, -1.6901016235351562, -1.5309314727783203, -1.1273698806762695, -2.3344998359680176, -1.4242279529571533, -0.7915508151054382, -1.0130161046981812, -0.21237780153751373, -1.3941518068313599, -0.47113651037216187, -0.9896991848945618, -0.8126494288444519, -1.652553677558899, -0.8029531836509705, -0.5246216654777527, -0.9711614847183228, -0.6120882034301758, -0.8542482852935791, -0.4656551480293274, -0.30433517694473267, 0.6715402007102966, 0.02021043561398983, -0.0961250364780426, -0.19976705312728882, 2.2925503253936768, -0.6294881105422974, -0.645936131477356, -2.4337940216064453, -1.0137776136398315, 0.518383264541626, -0.26841872930526733, 0.11415611952543259, -0.033375706523656845, -0.1401006132364273, -0.7579989433288574, 0.37016838788986206, 0.24336440861225128, -0.9167090058326721, -1.7502012252807617, -1.8832005262374878, -1.2835309505462646, -0.7286996245384216, -0.4148959517478943, -2.0210800170898438, -3.773575782775879, -2.572765588760376, -2.7644879817962646, -2.299356460571289, -2.104538917541504, -1.1992779970169067, -1.9161784648895264, -3.989630937576294, -3.028036117553711, -1.2557291984558105, 0.09787507355213165, -3.415801763534546, -2.601398468017578, -1.0754554271697998, 0.14755693078041077, -5.211055755615234, -2.7777810096740723, -0.004522908478975296, -0.18922926485538483, 89.03077697753906, 2.3583521842956543, 0.22802753746509552, -0.4225406050682068, 0.3274199068546295, -0.46226534247398376, 0.7620492577552795, 0.275595486164093, 1.1721338033676147, 4.720905780792236, -0.3402784764766693, -8.5315523147583, -5.094398021697998, -4.414702415466309, -3.350191593170166, -3.4861297607421875, -4.263932228088379, -4.15658712387085, -4.889211654663086, -4.410982131958008, -3.746927499771118, -1.2398223876953125, -3.3772714138031006, -2.5240836143493652, -2.525944232940674, -2.314347267150879, -2.3537135124206543, -2.34065318107605, -2.1246447563171387, -2.381328582763672, -2.1760499477386475, -2.0389981269836426, -1.7698246240615845, -2.2524526119232178, -1.0231820344924927, -1.6013200283050537, -1.1646803617477417, -1.6595957279205322, -1.6458975076675415, -1.4603694677352905, -23.424835205078125, -1.5524637699127197, -0.48657140135765076, -1.0107505321502686, -0.24458591639995575, -1.4714767932891846, -0.5501672625541687, -0.8516602516174316, -0.6569918394088745, -1.711924433708191, -0.9581290483474731, -0.4091308116912842, -1.1068185567855835, -0.7904523611068726, -0.8864606022834778, -0.08041489869356155, -0.19343386590480804, 0.6008324027061462, 0.18428513407707214, 0.009013629518449306, -0.1985223889350891, 2.3083319664001465, -0.731610119342804, -0.2947554588317871, -2.3407135009765625, -0.5611312389373779, 0.5728114247322083, -0.12982980906963348, 0.38089731335639954, -0.1917320042848587, 0.23497192561626434, -0.9523701071739197, -0.5421914458274841, 0.27556195855140686, -1.0049506425857544, -1.7986860275268555, -1.7369427680969238, -1.1883553266525269, -0.8711710572242737, -0.39014410972595215, -1.3751457929611206, -3.514843225479126, -2.4473252296447754, -2.8868446350097656, -2.227773666381836, -2.0074734687805176, -1.220835566520691, -2.020509719848633, -4.13227653503418, -3.0723884105682373, -1.2278621196746826, -0.04893263801932335, -3.550140619277954, -2.702178716659546, -0.5072920322418213, 0.07932291179895401, -5.395234107971191, -2.9332804679870605, -10.063755989074707, -0.9217438697814941, -0.970908522605896, -1.2322032451629639, 1.2674349546432495, 1.7228236198425293, 0.4633990228176117]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0, 0.8)}}, 'et1_eta2': {'discriminator': {'threshold': 0.40499852895736693, 'nodes': [100, 5, 1], 'bias': [0.031178778037428856, -0.005701406858861446, 0.06699232012033463, -0.09580881148576736, 0.06976906210184097, -0.3832928538322449], 'weights': [-0.40617069602012634, 0.05059850588440895, 0.7499252557754517, 1.7611161470413208, 0.23170766234397888, -1.2198233604431152, 0.16876749694347382, -1.72450590133667, 0.4692983031272888, -4.854949951171875, -7.062108993530273, -2.755744218826294, 1.1222169399261475, 0.11763948202133179, -0.4704238176345825, -0.8519705533981323, 5.247742176055908, -0.3749392032623291, -0.38789743185043335, 0.7320082187652588, 5.949556827545166, 3.3279502391815186, 0.6024587154388428, -0.039334774017333984, 0.2483900785446167, 0.6808249354362488, 7.891293525695801, 4.757511615753174, 5.602342128753662, 2.357527256011963, 2.0638976097106934, 0.636166512966156, -1.0997508764266968, 1.996119737625122, 2.1897733211517334, 1.8743704557418823, 3.117839813232422, 1.882676124572754, 1.143105387687683, -1.7836204767227173, 1.8928104639053345, 1.6177157163619995, -5.095090866088867, 1.873120903968811, 1.0769466161727905, 0.19071130454540253, 1.863064169883728, 1.8593698740005493, 1.6756086349487305, 1.9361631870269775, 0.6674870252609253, 1.7194768190383911, -3.507887840270996, 0.13539540767669678, 1.7885146141052246, 2.014915943145752, -0.24403142929077148, 1.2357548475265503, -6.062086582183838, 0.692834734916687, -3.851337432861328, 0.5615318417549133, 0.8464506268501282, -9.340394973754883, -3.418257236480713, -1.5114721059799194, -3.7737162113189697, 1.9229724407196045, 1.2763211727142334, 1.6491320133209229, 1.822506070137024, 1.30263090133667, -0.2916940450668335, -0.2541484534740448, 5.1021270751953125, 0.9038171172142029, 2.0575029850006104, 2.1997158527374268, 1.3800668716430664, 0.022755717858672142, -0.18469934165477753, 0.1612725555896759, 3.159061908721924, 1.8917431831359863, 2.060302734375, 1.653403401374817, 1.4466991424560547, 1.6136881113052368, -1.116693139076233, 0.7213726043701172, 0.39923396706581116, -0.17739258706569672, 8.318849563598633, 1.0747276544570923, -0.12139942497015, 1.8680284023284912, 0.03930806741118431, 0.007090954575687647, 0.5568574666976929, 1.4138871431350708, -0.5221264958381653, 0.07864288240671158, 0.8875758647918701, 1.7647874355316162, 0.12986072897911072, -1.1525318622589111, 0.7669426798820496, -1.7278828620910645, 1.1270194053649902, -4.611599445343018, -6.873719692230225, -2.7103631496429443, 1.0788089036941528, 0.26390406489372253, -0.3970734477043152, -0.24662776291370392, 5.283209323883057, -0.4962141811847687, -0.3492560386657715, 3.580881357192993, 6.061509609222412, 3.2536110877990723, 0.6525206565856934, 0.03408323600888252, 0.20668579638004303, 0.8124776482582092, 7.943572998046875, 1.9401533603668213, 5.636268138885498, 2.3818295001983643, 1.8514511585235596, 0.5609391927719116, -1.0832350254058838, 2.1581053733825684, 2.114447593688965, 2.0574190616607666, 3.1099600791931152, 1.7302532196044922, 1.0794622898101807, -1.5705474615097046, 1.761475920677185, 1.5851939916610718, -4.662375450134277, 1.9355350732803345, 0.9535320997238159, 0.08234860748052597, 1.8737255334854126, 1.7760297060012817, 1.621549367904663, 1.9808591604232788, 0.7491893172264099, 1.5175353288650513, -3.54213809967041, 0.26255255937576294, 1.897148609161377, 2.1748507022857666, -0.22237850725650787, 1.1595104932785034, -6.2182745933532715, 1.1302920579910278, -3.8986756801605225, 0.41321614384651184, 1.057801604270935, -9.344603538513184, -3.711775064468384, -1.6040369272232056, -3.8320343494415283, 1.9287633895874023, 1.2905747890472412, 1.8224948644638062, 2.647129535675049, 1.4227070808410645, -0.43910646438598633, -0.4198903441429138, 5.047460556030273, 0.8692330718040466, 3.626905918121338, 2.1514782905578613, 1.2575359344482422, 0.1689063310623169, -0.18400628864765167, 0.3576008975505829, 3.340428352355957, 2.0828359127044678, 2.1466312408447266, 1.7111241817474365, 1.5730745792388916, 1.7262765169143677, -1.13548743724823, 0.9122538566589355, 0.3348509967327118, -0.24802319705486298, 8.366022109985352, 0.9931071400642395, 0.040810056030750275, 1.9288711547851562, 0.10228022187948227, 0.11558893322944641, 0.6280979514122009, 1.4865061044692993, 0.5954208374023438, 0.024291472509503365, -0.9524036645889282, -1.7906547784805298, -0.06166830658912659, 0.847691535949707, -0.11259515583515167, -0.6423404812812805, -1.1712872982025146, 4.613446235656738, 6.780219554901123, 2.716954231262207, -1.2891643047332764, -0.258861780166626, 0.3887266516685486, 0.40966740250587463, -5.262836456298828, 0.35567229986190796, 0.38748103380203247, -3.5495169162750244, -5.864482402801514, -3.3234176635742188, -0.4793376624584198, -0.6022841334342957, -0.2556999623775482, -0.7792379260063171, -8.043661117553711, -2.107996702194214, -5.692515850067139, -2.237635612487793, -1.8771570920944214, -0.698318362236023, 1.0879309177398682, -2.006584882736206, -2.0324463844299316, -1.9851945638656616, -2.618317127227783, -1.893907904624939, -0.981057345867157, 1.5212393999099731, -1.922104001045227, -1.5093594789505005, 4.769593715667725, -2.06408953666687, -0.9250784516334534, -0.13341204822063446, -1.6680256128311157, -1.6747766733169556, -1.570725440979004, -1.979363203048706, 1.1579514741897583, -1.5347920656204224, 3.4744927883148193, 0.46436595916748047, -1.9164373874664307, -2.0490810871124268, 0.2818984389305115, -1.2782217264175415, 6.193326473236084, -1.1276849508285522, 3.9064526557922363, -0.48137369751930237, -0.9492633938789368, 10.150104522705078, 3.482677459716797, 1.5422648191452026, 3.6920034885406494, -2.2099697589874268, -1.2735788822174072, -1.8647860288619995, -2.6665146350860596, -1.3239099979400635, 0.3149753212928772, 0.3675116002559662, -5.076552391052246, -0.7541475296020508, -3.6901917457580566, -2.217299461364746, -1.2836296558380127, 0.01051655039191246, 0.30887287855148315, -1.2350393533706665, -3.178927421569824, -1.9682862758636475, -2.0522491931915283, -1.5633717775344849, -1.5799410343170166, -1.5730394124984741, 1.158988356590271, -0.7181025147438049, -0.42143598198890686, 0.2971124053001404, -8.24048137664795, -0.9713696241378784, 0.03768090158700943, -1.9632744789123535, 0.10011440515518188, 0.06530074030160904, -0.632578432559967, -1.5095447301864624, -0.6202589869499207, 0.055398184806108475, 0.8856496810913086, 1.9541689157485962, 0.10527031868696213, -0.8016684651374817, 0.162770077586174, 0.6263285279273987, 1.1864070892333984, -4.627506256103516, -6.863159656524658, -2.6275277137756348, 1.1898293495178223, 0.2936306297779083, -0.45190536975860596, -0.3680380880832672, 5.278356075286865, -0.5131756663322449, -0.3179140090942383, 3.51579213142395, 5.865565776824951, 3.1924924850463867, 0.5801934003829956, 0.6347711682319641, 0.21062399446964264, 0.8465264439582825, 8.034653663635254, 1.9977561235427856, 5.756322383880615, 2.452772378921509, 1.9034985303878784, 0.486421138048172, -1.0439702272415161, 2.2170379161834717, 1.9762922525405884, 2.0805277824401855, 2.623927593231201, 1.8956996202468872, 1.0526084899902344, -1.492738127708435, 1.9020651578903198, 1.4901982545852661, -4.902531147003174, 1.936944603919983, 0.8798261880874634, 0.18816129863262177, 1.8333758115768433, 1.7059041261672974, 1.718836784362793, 1.9634146690368652, -1.1527780294418335, 1.6917577981948853, -3.3705008029937744, -0.6092022657394409, 1.8550374507904053, 2.100226402282715, -0.10858079046010971, 1.2000430822372437, -6.001556873321533, 1.1139436960220337, -4.020358562469482, 0.44861915707588196, 0.9744906425476074, -9.193859100341797, -3.555845022201538, -1.5654202699661255, -3.666616678237915, 2.3932785987854004, 1.2444441318511963, 1.7108584642410278, 2.5939762592315674, 1.2669651508331299, -0.23719820380210876, -0.288639098405838, 5.143328666687012, 0.8475322127342224, 3.5729475021362305, 2.1985599994659424, 1.4159128665924072, 0.012579534202814102, -0.3513320982456207, 1.1216301918029785, 3.108123540878296, 2.0375897884368896, 2.0448694229125977, 1.6820334196090698, 1.449524164199829, 1.4881113767623901, -1.1107341051101685, 0.7716842293739319, 0.33053794503211975, -0.3705365061759949, 8.26908016204834, 0.8979277610778809, -0.1810518056154251, 1.9264767169952393, 0.054153893142938614, 0.06758151948451996, 0.5282236337661743, 1.4046988487243652, 0.4678749144077301, 0.015833666548132896, -0.8261371850967407, -1.7698715925216675, -0.22459372878074646, 0.7016385197639465, -0.10252054035663605, -0.5075404644012451, -1.1515045166015625, 4.717494010925293, 6.9447855949401855, 2.5476489067077637, -1.16715669631958, -0.14301659166812897, 0.3680901825428009, 0.256634920835495, -5.2634406089782715, 0.3471165895462036, 0.25105351209640503, -3.6982624530792236, -5.870053768157959, -3.3316798210144043, -0.4750809371471405, -0.45219749212265015, -0.23547150194644928, -0.78541100025177, -7.949777603149414, -1.8862528800964355, -5.806520938873291, -2.23911452293396, -2.073884963989258, -0.6894677877426147, 1.0706872940063477, -2.0697386264801025, -1.995505690574646, -1.9149621725082397, -2.5771231651306152, -1.8541995286941528, -1.0264265537261963, 1.5749093294143677, -1.7710412740707397, -1.6405638456344604, 4.904359340667725, -2.0414209365844727, -0.9331305623054504, -0.26968395709991455, -1.791082501411438, -1.6907402276992798, -1.7082462310791016, -1.9873732328414917, 1.2436439990997314, -1.6851905584335327, 3.4644546508789062, 0.5470081567764282, -1.9240694046020508, -2.031583547592163, 0.10837056487798691, -1.1846634149551392, 6.182166576385498, -1.165220856666565, 3.991225004196167, -0.4388599693775177, -0.9706416130065918, 9.19190502166748, 3.4547300338745117, 1.5505200624465942, 3.8297646045684814, -2.1353302001953125, -1.218308448791504, -1.7797008752822876, -2.5995984077453613, -1.367978572845459, 0.27616310119628906, 0.3187924325466156, -5.090645790100098, -0.8083189129829407, -3.6247811317443848, -2.1036736965179443, -1.3610713481903076, -0.054286811500787735, 0.16263972222805023, -1.2340954542160034, -3.1437277793884277, -1.874155879020691, -2.219064235687256, -1.5284968614578247, -1.4756200313568115, -1.6633855104446411, 1.2801142930984497, -0.875342845916748, -0.29891642928123474, 0.25260913372039795, -8.362515449523926, -1.1206303834915161, 0.06070593744516373, -1.862853765487671, -0.033583734184503555, -0.02431468665599823, -0.5189112424850464, -1.3375707864761353, -0.7346506714820862, -0.6322120428085327, 0.8534530401229858, -0.9359687566757202, 1.1447808742523193]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (1.37, 1.54)}}} - signatures["ElectronHighEnergyMediumConf"]={'et3_eta2': {'discriminator': {'threshold': 0.66999841928482051, 'nodes': [100, 5, 1], 'bias': [-0.048671018332242966, -0.15978042781352997, -0.11082698404788971, -0.16210871934890747, -0.17141708731651306, 0.19882182776927948], 'weights': [-0.3632931113243103, -0.01923835650086403, 1.1369900703430176, 0.6106459498405457, 1.1179195642471313, 0.8601119518280029, 0.15297159552574158, -1.2484897375106812, 0.04611027240753174, -1.791911244392395, -1.8554701805114746, -1.3258225917816162, -0.2647069990634918, -0.08365557342767715, 0.11529789865016937, -0.09376391023397446, 2.986898183822632, 0.04890431836247444, 0.14163194596767426, 1.3693817853927612, 2.7048888206481934, 1.698973536491394, -1.705853819847107, 1.041193962097168, 0.25598371028900146, 7.544079780578613, 2.643533945083618, 1.6536102294921875, 5.720820903778076, 1.3112801313400269, 0.4527432322502136, 1.1032109260559082, 0.40891873836517334, 0.6918326616287231, 1.7678627967834473, 1.2772915363311768, 3.531491756439209, 7.55782413482666, -1.8549127578735352, 0.25631117820739746, 1.107606053352356, 3.053387403488159, 1.3774820566177368, 1.091949462890625, -1.6798309087753296, 1.0967626571655273, 1.4026769399642944, -9.189362525939941, 0.7396649122238159, 2.7333266735076904, 0.7341042757034302, 1.249634027481079, 1.3394824266433716, 1.0249660015106201, 0.9889784455299377, 2.6513044834136963, 0.47440028190612793, 0.6699808239936829, -7.892445087432861, -0.20485791563987732, -3.0982911586761475, 0.60731041431427, -0.36252856254577637, 0.8766266107559204, 0.6254453659057617, 0.8613975644111633, -1.8762989044189453, 2.843782663345337, 1.9625056982040405, 9.164314270019531, 1.3218309879302979, 0.8237579464912415, -0.48010700941085815, -0.5016670823097229, 2.4927468299865723, 1.4995578527450562, 1.4353219270706177, 1.452754020690918, 1.2446411848068237, 1.4280821084976196, -0.2531065046787262, 0.4549713432788849, 1.59420907497406, 1.7902405261993408, 1.1301854848861694, 0.9125373959541321, 1.1771483421325684, 1.200839877128601, -0.8419439196586609, 0.8306178450584412, 0.6647038459777832, 0.048682115972042084, 0.8149041533470154, 2.753098726272583, -2.0759215354919434, 0.9654955267906189, -0.01617790013551712, -0.09517361968755722, 1.0762320756912231, -0.00576699199154973, 0.7799210548400879, -0.1299242228269577, -1.183490514755249, -0.5373464822769165, -1.0393232107162476, -0.5487764477729797, 0.013535041362047195, 1.2695026397705078, 0.010570468381047249, 3.1929681301116943, 1.6318724155426025, 1.809260368347168, 0.2041422426700592, 0.014497988857328892, 0.1008622869849205, 0.12331648170948029, -3.006898880004883, 0.006142372731119394, -0.10549131780862808, -0.5938358306884766, -2.7045400142669678, -0.7485429644584656, 1.7333658933639526, -1.156059980392456, -0.168192058801651, -7.555694103240967, -2.571162223815918, -1.6956462860107422, -5.67071008682251, -1.3260585069656372, -0.42301642894744873, -1.1530144214630127, -0.5906983017921448, -0.47045034170150757, -1.7386970520019531, -1.1423187255859375, -3.392827272415161, -7.625503063201904, -0.13216927647590637, -0.299122154712677, -1.0236870050430298, -1.4116584062576294, -1.517985224723816, -1.062925100326538, -0.5166425704956055, -1.2592618465423584, -1.3381396532058716, 1.5529818534851074, -0.6767204999923706, -2.6625189781188965, -0.8845092058181763, -1.424497127532959, -1.2011646032333374, -1.1535289287567139, -1.0405513048171997, -2.663351058959961, -0.6089074611663818, -0.6435121893882751, 7.84403133392334, 0.11479156464338303, 3.115651845932007, -0.36264458298683167, 0.4608149230480194, -0.7632660865783691, -0.42274901270866394, -0.9721015095710754, 1.8468523025512695, -2.7405776977539062, -1.9027326107025146, -9.037775039672852, -1.2557668685913086, -0.9182220101356506, 0.30087828636169434, 0.4215577244758606, -2.552516460418701, -1.33924400806427, -1.4397741556167603, -1.4536564350128174, -1.2354272603988647, -1.3639198541641235, 0.31734171509742737, -0.6018325686454773, -1.4667538404464722, -1.8258435726165771, -1.1674538850784302, -1.0748112201690674, -0.9866417050361633, -1.134459376335144, 0.7004688382148743, -0.9266799092292786, -0.6827194690704346, 0.05578913539648056, -0.9296520948410034, -2.9109840393066406, 2.0142033100128174, -1.1157033443450928, -0.014255393296480179, -0.0016610812162980437, -0.8850783705711365, -0.20304937660694122, 0.3480747640132904, -0.04769037291407585, -1.1761839389801025, -0.5469955205917358, -1.1071943044662476, -0.7038381695747375, 0.17196261882781982, 1.3797177076339722, -0.05204556882381439, 3.123474597930908, 1.79933500289917, 1.7915098667144775, 0.08041452616453171, -0.034891948103904724, -0.03786701709032059, -0.06639504432678223, -3.0744247436523438, -0.11333347856998444, -0.0804920494556427, -0.77297443151474, -2.6863858699798584, -0.7284291982650757, 1.696494460105896, -1.1224133968353271, -0.14744749665260315, -7.652820587158203, -2.5320777893066406, -1.823235273361206, -5.778429985046387, -1.3135641813278198, -0.5306881666183472, -1.1715729236602783, -0.5008342266082764, -0.5659509897232056, -1.771768569946289, -1.3576762676239014, -3.4060394763946533, -7.495283126831055, -0.24217566847801208, -0.37981462478637695, -1.2003105878829956, -1.3493379354476929, -1.3790780305862427, -1.1259262561798096, -0.49884796142578125, -1.2639484405517578, -1.3535021543502808, 1.2641304731369019, -0.7960184812545776, -2.6480181217193604, -0.8808931112289429, -1.2882907390594482, -1.1612993478775024, -1.181920051574707, -1.1080485582351685, -2.607605457305908, -0.49707499146461487, -0.6767892241477966, 8.009539604187012, 0.1237686350941658, 3.332219362258911, -0.3096736967563629, 0.4560976028442383, -0.6941847801208496, -0.4604146182537079, -1.0147546529769897, 1.9379265308380127, -2.7963199615478516, -1.8103015422821045, -9.05184268951416, -1.1548514366149902, -1.0072784423828125, 0.344266414642334, 0.4240301847457886, -2.467223882675171, -1.5154114961624146, -1.4371238946914673, -1.3788623809814453, -1.2288399934768677, -1.4854320287704468, 0.16928674280643463, -0.5867647528648376, -1.4471951723098755, -1.9388976097106934, -1.1759127378463745, -0.8853994011878967, -1.0390863418579102, -1.268436074256897, 0.8614676594734192, -0.8184821009635925, -0.5703690648078918, -0.038250721991062164, -0.7636191248893738, -2.8082151412963867, 1.9861506223678589, -0.9922001361846924, 0.05072460696101189, 0.06622473150491714, -1.0546678304672241, -0.05050240457057953, 0.7958235740661621, 0.014700939878821373, -1.0782191753387451, -0.6174961924552917, -1.1872469186782837, -0.5487807393074036, 0.10296972095966339, 1.364011287689209, -0.11685320734977722, 3.1712324619293213, 1.6476316452026367, 1.7377903461456299, 0.15083622932434082, -0.05724570155143738, -0.09545081853866577, -0.04088487848639488, -2.9213497638702393, -0.06669792532920837, 0.09497135877609253, -0.7412750124931335, -2.537299633026123, -0.6484242081642151, 1.8854727745056152, -1.103590726852417, -0.3239821195602417, -7.570978164672852, -2.684921979904175, -1.7028319835662842, -5.630488872528076, -1.3201934099197388, -0.5880939364433289, -1.0932011604309082, -0.4365180730819702, -0.53394615650177, -1.7553434371948242, -1.3648583889007568, -3.4526374340057373, -7.556405067443848, -0.03140399605035782, -0.25756001472473145, -1.2051204442977905, -1.2988239526748657, -1.5442034006118774, -1.068868637084961, -0.7043478488922119, -1.2529971599578857, -1.2794886827468872, 1.4453657865524292, -0.746985912322998, -2.6322014331817627, -0.6765123605728149, -1.3238325119018555, -1.299523949623108, -1.022221326828003, -1.1162136793136597, -2.6887047290802, -0.48919427394866943, -0.6041378378868103, 7.815181732177734, 0.045929841697216034, 3.164581060409546, -0.32777538895606995, 0.44807639718055725, -0.7889524698257446, -0.45506545901298523, -0.9977965950965881, 1.8274224996566772, -2.829014778137207, -1.8630194664001465, -8.960129737854004, -1.2989521026611328, -0.8311460614204407, 0.4950481057167053, 0.34846460819244385, -2.467694044113159, -1.5615752935409546, -1.510292649269104, -1.3138728141784668, -1.1023229360580444, -1.5010136365890503, 0.2586469352245331, -0.48952725529670715, -1.5068730115890503, -1.7541017532348633, -1.1526366472244263, -0.9617965221405029, -1.1690497398376465, -1.2287248373031616, 0.8491680026054382, -0.9091412425041199, -0.6170509457588196, -0.2096344530582428, -0.8809341192245483, -2.8543641567230225, 1.9536592960357666, -1.0956120491027832, 0.012979736551642418, -0.08532464504241943, -0.9571139216423035, -0.13241112232208252, 0.7505656480789185, -0.12238308787345886, -1.215778112411499, -0.744321882724762, -1.0964082479476929, -0.7366512417793274, 0.14085832238197327, 1.2977362871170044, 0.051823511719703674, 3.188023090362549, 1.658905029296875, 1.7734878063201904, 0.10579323023557663, 0.13964533805847168, -0.03720500320196152, 0.07405760884284973, -2.8514065742492676, 0.02813662588596344, -0.02393478713929653, -0.7721337676048279, -2.7159698009490967, -0.7076488733291626, 1.7448610067367554, -1.0958189964294434, -0.1937636435031891, -7.587071418762207, -2.7165181636810303, -1.7180616855621338, -5.784889221191406, -1.4275482892990112, -0.4315950274467468, -1.061868667602539, -0.4499662518501282, -0.5091215372085571, -1.6198458671569824, -1.2933523654937744, -3.384692668914795, -7.614009380340576, -0.02028832584619522, -0.25192928314208984, -1.2518190145492554, -1.5074256658554077, -1.50875985622406, -1.1547255516052246, -0.7219434380531311, -1.1534230709075928, -1.2445183992385864, 1.2667229175567627, -0.7835680246353149, -2.7220218181610107, -0.8801294565200806, -1.3080940246582031, -1.2175785303115845, -1.1354594230651855, -1.0985878705978394, -2.707531213760376, -0.3875346779823303, -0.6122236847877502, 8.012117385864258, -0.01269548013806343, 3.2801311016082764, -0.20533286035060883, 0.4266683757305145, -0.6927353143692017, -0.5387892723083496, -0.8895917534828186, 2.001030206680298, -2.8506782054901123, -1.8065345287322998, -9.006397247314453, -1.3208692073822021, -0.8154750466346741, 0.471169650554657, 0.3678755760192871, -2.543764591217041, -1.3720585107803345, -1.6222983598709106, -1.3490889072418213, -1.0855642557144165, -1.418610692024231, 0.3646010458469391, -0.44539517164230347, -1.402847170829773, -1.7971928119659424, -1.2276273965835571, -1.0711355209350586, -0.999976634979248, -1.207940697669983, 0.7376274466514587, -0.774124801158905, -0.6490070819854736, 0.02274652197957039, -0.854465901851654, -2.9136130809783936, 2.0538861751556396, -0.9218764305114746, 0.06782027333974838, -0.04248097911477089, -1.036033034324646, -0.026970257982611656, -0.1598840206861496, 2.7159435749053955, 3.600578784942627, 2.63897442817688, 2.504344940185547]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (1.37, 1.54)}}, 'et0_eta0': {'discriminator': {'threshold': -0.86000041961669926, 'nodes': [100, 6, 1], 'bias': [-0.01136678084731102, -0.1782160997390747, 0.054464004933834076, 0.04060710594058037, 0.07186396420001984, -0.1458592414855957, 0.30292394757270813], 'weights': [9.01987075805664, -0.03518577292561531, -0.46884268522262573, 0.15588437020778656, 0.31432536244392395, 1.1719588041305542, 0.621452808380127, -0.12481377273797989, 2.6661553382873535, 3.120647430419922, 20.042564392089844, 4.001049518585205, -0.4691924750804901, -4.405073642730713, -12.167277336120605, -4.039999961853027, -2.834879159927368, -4.690690040588379, -6.594064235687256, -3.0145294666290283, -4.962020397186279, -2.6768598556518555, -0.4535619616508484, -2.684878349304199, -2.111410140991211, -1.890016794204712, -2.464111328125, -2.4439945220947266, -2.3755640983581543, -2.397362470626831, -3.345147132873535, -1.345889687538147, -0.9984797239303589, -0.29491767287254333, -1.250179648399353, -21.641355514526367, -1.229132056236267, -1.5000431537628174, -1.8025377988815308, -1.0384272336959839, -16.716285705566406, -0.8255010843276978, -1.0276564359664917, -0.537658154964447, 0.2807220220565796, 0.57619309425354, -0.5989243388175964, -0.6295759081840515, -0.745419442653656, -0.8610708117485046, 0.3153530955314636, 21.523473739624023, 1.5775901079177856, -0.7692492008209229, -0.6981480121612549, -0.42572879791259766, -0.384321928024292, 0.09645713865756989, -0.46849438548088074, -0.6688112020492554, -0.37966063618659973, 1.7942391633987427, -0.5020682215690613, 0.17839659750461578, 0.7165035605430603, 0.3030983507633209, 0.39278408885002136, -0.41801556944847107, -0.7241864204406738, 0.4044226408004761, -0.18019112944602966, -3.6531472206115723, 1.939813256263733, 7.395075798034668, -0.4404732584953308, -1.0175961256027222, -1.206782579421997, -6.643551826477051, -3.6062512397766113, -4.67418098449707, -1.7125831842422485, -0.06102985143661499, -2.4709413051605225, -1.6413654088974, -1.4180688858032227, -1.5595781803131104, -1.1826645135879517, -0.5493459701538086, -2.8270368576049805, -1.0286604166030884, -5.24298620223999, -2.8239104747772217, -0.7543736696243286, -1.9295884370803833, -2.497220277786255, 0.4698377847671509, -2.427469491958618, -1.1779704093933105, -1.1535083055496216, 0.4579063355922699, 3.681973457336426, 0.8046421408653259, -0.49003419280052185, -0.20977216958999634, -0.10569418221712112, 0.5196964144706726, -0.038742005825042725, -0.019086414948105812, 3.136380910873413, 4.6013383865356445, 0.24897688627243042, -3.8071939945220947, -9.356066703796387, -5.3722004890441895, -9.773921012878418, -7.942467212677002, -9.558570861816406, -8.850022315979004, -7.337759494781494, -7.268890380859375, -3.1062941551208496, -3.7530319690704346, -2.819653272628784, -3.0603721141815186, -10.741296768188477, -2.474848747253418, -2.4643959999084473, -2.3311655521392822, -2.493574857711792, -3.0792882442474365, -5.52104377746582, -2.0570449829101562, -1.7622098922729492, -3.4724388122558594, -0.6378179788589478, -1.331749439239502, -1.3443167209625244, -1.5802240371704102, -1.4302741289138794, -0.6937366724014282, -1.29665207862854, -0.5291470885276794, -1.0695449113845825, -0.8558090329170227, -0.0695672556757927, -1.08797287940979, -0.4912714660167694, -0.7099616527557373, -0.6885566115379333, -0.7720600366592407, 0.19422847032546997, -2.0356953144073486, -1.2078481912612915, -0.7959491014480591, -0.733663022518158, -0.1765640825033188, -0.5480073094367981, 0.1288779377937317, 1.3124580383300781, -0.5015966892242432, -0.22093239426612854, 0.49837827682495117, -0.21850049495697021, -0.1739213913679123, 1.0254299640655518, 0.1101001426577568, 0.4242246150970459, -0.3589154779911041, -0.339095801115036, 1.0370818376541138, -0.0009136381559073925, -0.06344874203205109, 0.3598265051841736, -0.15946713089942932, -0.7707175016403198, -2.1223952770233154, -1.8511649370193481, -1.8694562911987305, -1.2677456140518188, -0.7573164701461792, -16.54351806640625, -6.4279866218566895, -3.00040864944458, -1.7074041366577148, -1.2595458030700684, -1.4322413206100464, -1.1505391597747803, -0.33996301889419556, -7.54207706451416, -3.8208913803100586, -1.3557288646697998, 0.39237499237060547, -6.8621625900268555, -4.759374141693115, -0.7991504669189453, 0.5344062447547913, -2.4636857509613037, -0.8247212171554565, -0.8689799904823303, 0.40556246042251587, -2.2983672618865967, -0.40858766436576843, -0.1691615879535675, -0.05508086457848549, -0.18790024518966675, -0.23666058480739594, -0.16220496594905853, -0.15269269049167633, -0.23917309939861298, -2.0612709522247314, -0.3885083794593811, -0.25118622183799744, 2.0046181678771973, 6.578591346740723, -2.2192814350128174, -0.31168967485427856, -2.1611480712890625, -1.8496649265289307, -1.2020740509033203, -1.6346501111984253, -0.21165145933628082, -0.1735413521528244, -0.28899896144866943, -0.029980747029185295, 0.0648520290851593, 0.10884208977222443, -0.17157121002674103, -1.1487562656402588, -0.8360415101051331, -0.04847188666462898, 0.9123522043228149, -0.633462131023407, -0.26276636123657227, -0.07286661118268967, -0.22363461554050446, -0.4531567394733429, -1.063921332359314, -0.07878665626049042, -0.023129576817154884, -0.14414668083190918, 0.05295134708285332, -0.40469470620155334, -0.3811474144458771, 0.015043376013636589, -1.1566005945205688, -0.05888320878148079, -0.12097274512052536, -0.01265923772007227, -0.10554582625627518, -0.12560421228408813, -0.38562315702438354, -0.11268538981676102, -0.001007283921353519, 0.07936564832925797, -0.06253787130117416, -0.13419751822948456, -0.07085855305194855, -0.0798681303858757, -0.15192435681819916, -0.06100115925073624, -0.017935331910848618, -0.8524407148361206, -0.028408104553818703, -0.005268263630568981, -0.1929444819688797, -0.019991155713796616, -0.22417044639587402, -0.009491882286965847, -0.21192045509815216, -0.10742053389549255, 0.024758635088801384, -0.0636126771569252, -0.35273227095603943, -0.2769015431404114, 0.8114498853683472, -0.7977434992790222, -0.18997128307819366, -1.1608176231384277, -0.360253244638443, -0.4729072153568268, 3.8734652996063232, -5.678352355957031, -0.2599145174026489, -0.5669599175453186, -0.23816123604774475, -0.010319755412638187, -0.08687549829483032, -0.05709803104400635, -2.598600387573242, -3.256776809692383, -0.4089433252811432, -0.028902392834424973, -5.788078308105469, -2.420192003250122, -0.19718678295612335, -0.35650065541267395, 0.050737980753183365, -1.4753522872924805, -0.060320205986499786, -0.16610264778137207, -4.135383605957031, -0.1069088950753212, 0.362106591463089, 0.17960122227668762, 0.14129745960235596, -0.48702356219291687, 0.1761319786310196, 0.05973678082227707, -3.193812131881714, -2.102048635482788, -0.27130937576293945, 6.771458148956299, 8.337845802307129, 4.801966667175293, 9.312788963317871, 7.583322525024414, 6.088551998138428, 6.638938903808594, 10.206466674804688, 6.823215961456299, 3.1751976013183594, 2.9218509197235107, 3.3843002319335938, 2.9952006340026855, 3.364917755126953, 2.5241050720214844, 2.353303909301758, 2.5631401538848877, 2.436708450317383, 2.7848753929138184, 3.227890968322754, 1.6638038158416748, 1.670957326889038, 3.5906875133514404, 0.7348370552062988, 1.4496045112609863, 1.2641363143920898, 1.5086523294448853, 1.499687910079956, 1.119602084159851, 1.1404856443405151, 1.035091519355774, 1.160691738128662, 0.9853762984275818, 0.023800093680620193, 0.909044623374939, 0.6199456453323364, 0.6726546287536621, 0.824012279510498, 0.9742962718009949, -0.3959726095199585, 1.8761155605316162, 1.0572471618652344, 0.8336468935012817, 0.7681624889373779, 0.3390689194202423, 0.54653000831604, -0.22937266528606415, -1.015300989151001, 0.5612056851387024, 0.19758827984333038, -1.6588265895843506, 0.3724830448627472, 0.15912692248821259, -0.8954120874404907, -0.15293125808238983, -0.619022011756897, 0.6916226148605347, 0.5226624608039856, -1.0737968683242798, -0.0770862028002739, -0.13126160204410553, -0.5001769065856934, -0.045417748391628265, 0.5876344442367554, 2.2558538913726807, 2.401465892791748, 1.823835015296936, 1.0194467306137085, 0.6076213121414185, 3.994291067123413, 6.166980743408203, 3.8464877605438232, 1.332905650138855, 1.229944109916687, 1.4130218029022217, 1.0766500234603882, 0.41440293192863464, 3.074331760406494, 5.47773551940918, 0.7946798801422119, -0.2935554087162018, 12.233807563781738, 3.601130247116089, 0.7054237723350525, -0.47403693199157715, 2.435894012451172, 0.7125208377838135, 1.0286706686019897, -0.28793734312057495, -3.9683053493499756, -0.14426389336585999, 0.4341489374637604, 0.1832311898469925, 0.20478136837482452, -0.3127519190311432, 0.0590548999607563, -0.00019025674555450678, -3.245378255844116, -2.1758551597595215, -0.456599622964859, 6.952091217041016, 8.26875114440918, 4.635740280151367, 9.365004539489746, 7.7002458572387695, 6.121082782745361, 7.563103199005127, 10.276198387145996, 6.908629417419434, 3.0921669006347656, 2.9263715744018555, 3.385561466217041, 2.936856269836426, 3.1792619228363037, 2.511370897293091, 2.35496187210083, 2.3895580768585205, 2.4292025566101074, 2.909292221069336, 3.2825124263763428, 1.4810638427734375, 1.6027350425720215, 3.62443470954895, 0.7888603210449219, 1.4236286878585815, 1.2817354202270508, 1.4375942945480347, 1.6879193782806396, 1.0937803983688354, 1.2003239393234253, 1.0144010782241821, 1.0534071922302246, 0.9542540907859802, 0.07949057221412659, 0.806453287601471, 0.46324774622917175, 0.5182538032531738, 0.8175613880157471, 0.8954757452011108, -0.22423702478408813, 1.7782195806503296, 1.2254350185394287, 0.7767571210861206, 0.7505975961685181, 0.31346067786216736, 0.48678913712501526, -0.23716974258422852, -0.9710901379585266, 0.48548635840415955, 0.19500727951526642, -1.652909278869629, 0.3563382625579834, 0.0732271820306778, -0.863884687423706, -0.10678214579820633, -0.4851662814617157, 0.7486752271652222, 0.4894939363002777, -1.0258220434188843, -0.05377648025751114, -0.09645101428031921, -0.48305970430374146, -0.12129934132099152, 0.5895178318023682, 2.109104871749878, 2.2148983478546143, 1.6714695692062378, 0.9397296905517578, 0.6571053862571716, 4.008462905883789, 8.20163631439209, 4.04057502746582, 1.668599009513855, 1.2664713859558105, 1.3478388786315918, 1.2298848628997803, 0.3989931046962738, 3.008673667907715, 5.428922176361084, 0.9467208981513977, -0.36967578530311584, 14.033687591552734, 3.659334182739258, 0.7833492755889893, -0.474465936422348, 2.366950511932373, 0.9190989136695862, 1.070186972618103, -0.3821124732494354, 3.0633015632629395, 0.8150948882102966, -0.41906359791755676, -0.20512688159942627, -0.5525700449943542, 0.36142969131469727, 0.03444362059235573, -0.12303842604160309, 2.5672919750213623, 5.61810302734375, -0.05225738510489464, -3.5295486450195312, -9.482361793518066, -5.27308464050293, -10.127195358276367, -8.47729778289795, -9.685062408447266, -8.817888259887695, -7.538350582122803, -10.319197654724121, -3.1412336826324463, -3.7200396060943604, -2.7665517330169678, -2.7302675247192383, -5.089662551879883, -2.6372063159942627, -2.277743101119995, -2.2320876121520996, -2.3880703449249268, -3.054008960723877, -6.318255424499512, -1.9425923824310303, -1.7222853899002075, -3.4248640537261963, -0.7689271569252014, -1.4545224905014038, -1.285597324371338, -1.3321398496627808, -1.5888707637786865, -1.2224270105361938, -3.181523323059082, -0.8500968813896179, -1.0883302688598633, -0.8908826112747192, 0.05608029291033745, -1.0544918775558472, -0.6303791999816895, -0.5882346630096436, -0.8089964389801025, -0.87647545337677, 0.2349333018064499, -2.088914394378662, -1.0309410095214844, -0.9465101361274719, -0.7140549421310425, -0.36977818608283997, -0.5340608954429626, 0.3402877151966095, 1.2501572370529175, -0.6743406653404236, -0.22704602777957916, 1.7960454225540161, -0.026403190568089485, -0.1975802779197693, 0.9950613379478455, 0.1580113172531128, 0.587617039680481, -0.3259707987308502, -0.3312339186668396, 0.980118989944458, 0.06564810872077942, 0.058355655521154404, 0.8956661224365234, -0.10214731842279434, -0.694542407989502, -2.2803661823272705, -1.758186936378479, -2.7518928050994873, -1.3518487215042114, -0.61531662940979, -15.511337280273438, -8.048812866210938, -3.084141492843628, -1.6935824155807495, -1.217545509338379, -1.4837414026260376, -1.0506166219711304, -0.36436375975608826, -8.56169605255127, -5.784923076629639, -0.8517770171165466, 0.25702813267707825, -5.408534526824951, -4.901888370513916, -0.86708003282547, 0.47227075695991516, -2.4072721004486084, -0.7340108156204224, -0.8928924202919006, 0.4653438925743103, -0.37404778599739075, 0.8757453560829163, -1.8297946453094482, -0.6319535970687866, -0.358705073595047, 0.7328855991363525]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (0, 0.8)}}, 'et0_eta1': {'discriminator': {'threshold': -0.75000052452087407, 'nodes': [100, 5, 1], 'bias': [0.13810545206069946, -0.18201099336147308, 0.021036244928836823, -0.009202640503644943, 0.07187016308307648, 0.46104055643081665], 'weights': [-1.8925094604492188, -1.2238150835037231, 0.6562626361846924, 0.9511800408363342, 0.36389872431755066, 0.6864233613014221, 0.18824709951877594, -0.2274571657180786, -1.6624797582626343, -5.2217116355896, -1.4616903066635132, -0.5122133493423462, 5.8331427574157715, 1.8483517169952393, 20.57921028137207, 7.102513790130615, 7.527975082397461, 5.936316013336182, 14.643430709838867, 6.8599138259887695, 9.316164016723633, 7.187514781951904, 4.620754241943359, 3.413209915161133, 6.658180236816406, 4.85620641708374, 4.100029945373535, 5.566649436950684, 3.731907844543457, 3.060131072998047, 4.659031867980957, 5.583804607391357, 2.7307114601135254, 2.994131088256836, 8.642337799072266, 2.289883613586426, 0.6494693160057068, 2.0231640338897705, 1.0012233257293701, 1.081325888633728, -0.5261492133140564, 0.3800708055496216, 0.34528055787086487, 6.915417194366455, -1.0193991661071777, -0.14056496322155, -0.09725432842969894, -0.173580139875412, -2.483555555343628, 0.9920685291290283, -0.26640722155570984, 0.3975827693939209, -0.25772494077682495, 1.210814356803894, 0.9771003723144531, -0.8578104376792908, 0.3760906159877777, 0.8532245755195618, 0.27929580211639404, 1.2646905183792114, 0.3316922187805176, 0.9337028861045837, 0.1462925225496292, -0.3613526225090027, 0.5072650909423828, 1.0561286211013794, 0.22868841886520386, 0.1604975163936615, 0.17903226613998413, 0.7918182015419006, -0.3503126800060272, 0.45072266459465027, -0.20369163155555725, -0.2662750482559204, 0.49260711669921875, 2.1276614665985107, 4.565790176391602, 2.230461359024048, 1.02570378780365, 0.07946263998746872, 11.287789344787598, 11.458906173706055, 7.035044193267822, 3.392335891723633, 1.8007370233535767, 1.7647638320922852, 2.2105367183685303, 2.268641948699951, 2.29552960395813, 1.3446894884109497, 0.20554538071155548, -0.26203346252441406, 4.533621788024902, 5.401577949523926, 0.4493290185928345, -0.024416958913207054, -2.289726734161377, 1.5831325054168701, 1.9929925203323364, 0.2930375337600708, 1.952457308769226, 1.2462477684020996, -1.0876314640045166, -0.9175639152526855, -0.32505589723587036, -0.7088087797164917, -0.1336529403924942, 0.3321419060230255, 2.536004066467285, 5.79353141784668, 1.459064245223999, 0.33216339349746704, -14.200791358947754, -1.8836852312088013, -7.968325138092041, -6.980250358581543, -5.158376216888428, -5.871337413787842, -9.588560104370117, -6.664106369018555, -5.1132612228393555, -7.1706647872924805, -4.576247215270996, -2.6326558589935303, -4.7970709800720215, -3.771188259124756, -3.8895199298858643, -5.623331546783447, -3.0061848163604736, -2.9450266361236572, -4.479562282562256, -5.576552391052246, -2.870198965072632, -3.0367915630340576, -3.4783716201782227, -2.390235185623169, -0.5095173120498657, -1.5458441972732544, -1.0594172477722168, -3.532752752304077, 0.49488940834999084, -0.3730463981628418, -0.4775383770465851, -1.6226712465286255, 1.2465732097625732, 0.1816977709531784, 0.052189912647008896, 0.2135578989982605, 2.517794609069824, -0.9796221256256104, 0.19435077905654907, -0.3447989225387573, 0.26036354899406433, -1.0289835929870605, -0.6525987386703491, 0.8082085847854614, -0.24394521117210388, -0.29113930463790894, -0.3918320834636688, -1.1734482049942017, -0.38091614842414856, -0.8932517766952515, -0.3040578365325928, 0.42996177077293396, -0.5035845041275024, -0.901124119758606, -0.24702927470207214, -0.03485172614455223, -0.039679765701293945, -0.8138376474380493, 0.787928581237793, -0.34799909591674805, 0.2127179205417633, 0.08500823378562927, -0.49812158942222595, -2.0146515369415283, -2.5852603912353516, -2.0965754985809326, -0.6987488269805908, -0.157260924577713, -11.415349960327148, -8.285144805908203, -6.790378093719482, -4.310431957244873, -1.3116488456726074, -1.6353237628936768, -1.6259948015213013, -3.199120283126831, -5.152630805969238, -2.2409863471984863, -0.2359311282634735, 0.18523359298706055, -9.14281177520752, -4.135699272155762, -0.3192756175994873, -0.08470670878887177, 0.24450591206550598, -5.539525985717773, -1.854263424873352, -0.1801915019750595, -1.8780862092971802, -1.2834389209747314, 0.7041327953338623, 1.0591145753860474, 0.4457995593547821, 0.5730429887771606, 2.018894672393799, -0.039033442735672, -2.2105350494384766, -5.289902210235596, -1.3138792514801025, -0.5064011216163635, 8.338859558105469, 6.455643653869629, 20.42310905456543, 7.121894359588623, 6.050099849700928, 7.905551433563232, 14.820043563842773, 7.19402551651001, 9.163422584533691, 7.031611442565918, 4.7066168785095215, 3.2067506313323975, 6.8134307861328125, 4.760343551635742, 4.175156593322754, 5.316094398498535, 2.9997072219848633, 2.9315690994262695, 5.05702018737793, 5.6292829513549805, 2.824653387069702, 3.010867118835449, 9.389309883117676, 2.191251516342163, 0.5466648936271667, 2.022000312805176, 1.1206458806991577, 2.507119655609131, -0.04510550945997238, 0.32944920659065247, 0.4817630648612976, 1.4827300310134888, -1.1729286909103394, -0.14405271410942078, -0.1474020630121231, -0.11235252767801285, -2.3419976234436035, 1.054763674736023, -0.2517300546169281, 0.45212826132774353, -0.3218640983104706, 1.0747690200805664, 1.0433205366134644, -0.9130086302757263, 0.40176406502723694, 0.9110763669013977, 0.2630470395088196, 1.3611962795257568, 0.5164622068405151, 0.7935552000999451, 0.2779427170753479, -0.3644547760486603, 0.37541812658309937, 0.8469223380088806, 0.11413981765508652, 0.4625149071216583, 0.19138678908348083, 0.9879692196846008, -0.8283549547195435, 0.3583611845970154, -1.2395589351654053, -0.20304115116596222, 1.4783496856689453, 2.1369123458862305, 3.2162489891052246, 2.189713716506958, 1.1040245294570923, 0.06041760370135307, 17.903512954711914, 11.216879844665527, 5.829072952270508, 2.9720444679260254, 1.7591387033462524, 1.8255236148834229, 2.283552408218384, 3.0886728763580322, 3.9979867935180664, 5.058059215545654, 0.2873322069644928, -0.2054530382156372, 2.1999025344848633, 4.702675819396973, 0.6885371208190918, 0.03910418227314949, -2.3075804710388184, 1.5203689336776733, 1.6801518201828003, 0.2807612717151642, -19.431434631347656, -0.7079209685325623, 2.009190797805786, 6.4891791343688965, 7.062210559844971, 0.6609626412391663, -1.3742560148239136, -0.17222720384597778, -27.03448486328125, -61.39654541015625, -5.1306376457214355, -6.9397125244140625, 8.774383544921875, -1.95246422290802, 60.87514877319336, 20.223072052001953, 9.3819580078125, 38.12455368041992, 18.46353530883789, 7.2530412673950195, -2.2757513523101807, -29.10565185546875, 19.837278366088867, 13.1071195602417, 5.815578937530518, 0.5362417697906494, 7.16448974609375, 53.5877799987793, 3.04994535446167, 0.8775137066841125, 3.0282115936279297, 18.61113739013672, 13.23752498626709, 5.090209007263184, 67.30415344238281, 33.3084831237793, 6.271228313446045, 3.4189741611480713, 1.6367242336273193, 38.8242301940918, 0.3753618001937866, 0.8644266128540039, 1.065105676651001, 1.6667332649230957, -0.2638069689273834, 58.8161735534668, 4.232236385345459, 75.44316101074219, -3.066237211227417, 0.5389311909675598, -0.266434907913208, 0.47315940260887146, 0.9555960893630981, 1.1678986549377441, 0.7565997242927551, -0.7215517163276672, 0.18236379325389862, 0.5382163524627686, 0.31355616450309753, 1.0017755031585693, 1.3976796865463257, 1.2884217500686646, 0.2909504175186157, -0.22075514495372772, 0.546885073184967, 0.880285918712616, 0.242771178483963, 0.36143794655799866, 0.13656610250473022, 1.0381686687469482, -0.6763685345649719, 0.30215805768966675, -12.381731033325195, -8.0579195022583, 6.540484428405762, 2.4167001247406006, 4.042524337768555, 15.822314262390137, 2.4656457901000977, 10.052105903625488, 8.63068675994873, 36.50438690185547, 3.510387420654297, 5.914213180541992, 14.6420316696167, 43.4828987121582, 2.3191707134246826, 0.3620098829269409, 6.536006450653076, 1.9789578914642334, 0.37560588121414185, -3.4471843242645264, 1.8010627031326294, 2.6052134037017822, 20.492565155029297, -0.0290924571454525, 0.09737208485603333, 8.648964881896973, 1.8274562358856201, 0.14330635964870453, -0.9631259441375732, -1.3539581298828125, -0.07848529517650604, -0.04655064269900322, -0.16150283813476562, -0.20293954014778137, -0.19901928305625916, -0.2585231065750122, -0.6610293388366699, -2.7294886112213135, -0.8143680691719055, -0.2913510501384735, 2.6277952194213867, 12.974698066711426, -2.7927517890930176, 2.4714112281799316, 1.9590502977371216, 1.6951347589492798, -0.5213738679885864, -3.7651565074920654, -1.9073591232299805, -0.2620479166507721, -0.5145399570465088, -0.7107497453689575, 0.07638556510210037, -0.22756987810134888, -0.10972726345062256, 0.2400413453578949, 0.2121530920267105, -0.0002191988460253924, -0.8328074216842651, -0.07249060273170471, -0.9831439256668091, -0.0514051727950573, -0.25581061840057373, 0.07119639962911606, -0.6884536147117615, -0.09830063581466675, -0.024550490081310272, -0.16045953333377838, -0.43433311581611633, -0.24456320703029633, -0.41793352365493774, -0.3608315587043762, -0.36864084005355835, -0.4849030673503876, -0.1755562126636505, -0.40205124020576477, -0.299599826335907, -0.16571997106075287, -0.3376643657684326, -0.20545193552970886, -0.26081135869026184, -0.015347293578088284, -0.13775987923145294, -0.5051273703575134, -0.09726136177778244, -0.06344534456729889, -0.20437148213386536, 0.03775722160935402, -0.007660008035600185, 0.0008244303753599524, -0.23009449243545532, -0.25706928968429565, -0.18932904303073883, -0.15042315423488617, -0.03665834292769432, -0.12307917326688766, -0.14365243911743164, -0.0026790336705744267, -0.20218591392040253, -0.1664867103099823, -0.2635151743888855, -0.23800744116306305, 0.4642724096775055, -0.8392537832260132, -2.3402488231658936, -1.4726476669311523, -0.2590694725513458, -0.32754141092300415, -0.541354238986969, -0.5725244879722595, -5.093498229980469, -1.117193579673767, -0.7368503212928772, -0.34520789980888367, 0.061895254999399185, -0.038676101714372635, -2.568580389022827, -2.366105556488037, 0.035846397280693054, -0.07814716547727585, -6.107456207275391, -4.432236671447754, -0.25411027669906616, -0.9613468647003174, -0.6015036106109619, -1.5356148481369019, 0.030305882915854454, -0.3353346884250641, -1.0183240175247192, 1.2881017923355103, -0.5610806941986084, 0.3517586290836334, -1.7679719924926758]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (0.8, 1.37)}}, 'et1_eta1': {'discriminator': {'threshold': 0.019999039173126232, 'nodes': [100, 6, 1], 'bias': [0.10486491769552231, -0.12511692941188812, -0.15801553428173065, 0.19460082054138184, 0.19272653758525848, -0.19290275871753693, 0.21625825762748718], 'weights': [-24.875232696533203, -35.52052307128906, -1.6133642196655273, -0.008624027483165264, -0.05626048892736435, -0.3086847960948944, -0.020699650049209595, -0.36371681094169617, -0.7491006851196289, 9.88141918182373, 3.7016844749450684, 47.948612213134766, 29.423078536987305, 3.0021779537200928, 2.617471218109131, 1.5538839101791382, 1.6353963613510132, 1.3132680654525757, 8.18600845336914, 3.481529474258423, 2.213709831237793, 2.721906900405884, 1.4094911813735962, 1.842166781425476, 2.055157423019409, 1.02581787109375, -32.34109115600586, 0.5193427205085754, 1.0854448080062866, 0.7986941337585449, 0.7937002778053284, -39.9202995300293, 0.6154786944389343, 1.2842981815338135, 0.8223607540130615, 0.35938817262649536, 0.27384892106056213, 0.3549516201019287, 1.0272786617279053, 0.556393027305603, 0.9667421579360962, -27.509204864501953, 0.6893214583396912, -0.22417894005775452, 0.18357644975185394, -0.03378888964653015, 0.2211812287569046, 0.0843660831451416, 0.870056688785553, 0.9310393929481506, -41.212486267089844, -7.586906909942627, 0.02240859530866146, -0.34544894099235535, -0.013609317131340504, 0.05311030149459839, 0.39030352234840393, -2.412696123123169, 0.323057621717453, -0.0783422514796257, 0.420240581035614, 0.30666735768318176, -0.010727977380156517, -0.2036086767911911, -0.939023494720459, -14.801352500915527, 0.0008461455581709743, -0.320068895816803, 0.18558304011821747, -0.7366596460342407, -0.5172358155250549, -1.1228679418563843, -0.8335043787956238, -0.0874503031373024, 0.17609955370426178, 1.084976315498352, 0.3574119806289673, 0.28965112566947937, 0.5148221850395203, -4.263965129852295, 7.01619291305542, 2.117969512939453, 1.4213595390319824, 0.7547821998596191, 0.8998038172721863, 0.4079223573207855, 0.6221122145652771, 0.6246194839477539, 0.6907567977905273, 0.34567877650260925, 0.04977800324559212, -1.0399022102355957, 1.166904330253601, 0.7002080082893372, 0.20356878638267517, -0.2037377655506134, 0.9589799046516418, -0.1373915672302246, 0.1627029925584793, 0.13170559704303741, 2.0245139598846436, 0.8271703720092773, -0.22186963260173798, -0.5199185609817505, -0.5545067191123962, -0.7945814728736877, -0.09759623557329178, 0.5519661903381348, 2.107658863067627, 5.196192264556885, 0.636294960975647, -5.638603210449219, -3.7636923789978027, -7.1080121994018555, -5.876524925231934, -4.993096351623535, -7.033196926116943, -4.254160404205322, -3.846722364425659, -9.72186279296875, -6.007926940917969, -5.542205333709717, -3.613792657852173, -4.872674465179443, -4.930007457733154, -3.872875690460205, -3.002730369567871, -1.7604550123214722, -2.6564693450927734, -4.5585126876831055, -3.900041341781616, -1.9911246299743652, -2.1886584758758545, -2.9386982917785645, -2.142312526702881, -1.4066506624221802, -0.9322798848152161, -1.4100180864334106, -2.4112284183502197, -1.2949612140655518, -2.606065511703491, -2.0816357135772705, -1.8875538110733032, 0.3693794310092926, -0.11105670034885406, -0.11997859179973602, -0.9382053017616272, 0.05954858288168907, -1.991539716720581, -2.060246467590332, -0.9869577288627625, -1.0988168716430664, -0.13669247925281525, -0.1764475703239441, 0.3320315182209015, -0.4457632899284363, -0.972248911857605, -2.120349884033203, -0.877682626247406, -0.0973014310002327, -0.44584837555885315, -0.8447644114494324, 0.1244892030954361, 0.3315380811691284, -0.1593199521303177, -1.2802783250808716, -0.8253623247146606, 0.5115103125572205, -0.33466649055480957, 1.0827850103378296, 0.6420692801475525, 2.7061526775360107, 0.385178804397583, 0.24092887341976166, -0.592490553855896, -2.7468035221099854, -1.1873877048492432, -1.0082688331604004, 0.2514231204986572, -0.18529607355594635, -10.175785064697266, -6.061328411102295, -3.4879937171936035, -2.02803897857666, -2.090017080307007, -1.4665274620056152, -1.8255035877227783, -1.5488629341125488, -1.5534313917160034, -0.9540573358535767, -0.01422670017927885, 0.1602276712656021, -3.031005859375, -2.1862339973449707, -0.614523708820343, 0.27786076068878174, -2.9442219734191895, -1.6134992837905884, -0.8152170777320862, -0.36227500438690186, 2.0914957523345947, 0.8605437874794006, -0.21348552405834198, -0.42250150442123413, -0.4221906065940857, -0.7759079337120056, -0.09413494169712067, 0.7776044607162476, 2.0629820823669434, 5.058802127838135, 0.6398661732673645, -5.7220234870910645, -3.8140790462493896, -7.059181213378906, -6.043213844299316, -4.332267761230469, -7.06245756149292, -4.410898208618164, -3.8616888523101807, -8.815730094909668, -6.082442283630371, -5.471698760986328, -3.761535882949829, -4.784187316894531, -5.023107528686523, -4.105536460876465, -3.0269956588745117, -1.7105648517608643, -2.7417643070220947, -4.617550373077393, -4.103362083435059, -2.0788066387176514, -2.2058041095733643, -2.8836936950683594, -2.062774181365967, -1.3000037670135498, -1.1085129976272583, -1.3346741199493408, -2.3267407417297363, -1.2659637928009033, -2.6595935821533203, -1.9944506883621216, -1.933461308479309, 0.2566291391849518, -0.22493742406368256, -0.10066007077693939, -0.9923979640007019, 0.16629832983016968, -2.091920852661133, -2.1379387378692627, -1.9406322240829468, -1.2982583045959473, -0.1721581220626831, -0.1789523810148239, 0.22955913841724396, -0.3632001280784607, -0.95749831199646, -1.9993577003479004, -0.7545385360717773, 0.05745566636323929, -1.3660675287246704, -0.6751365065574646, 0.28486204147338867, 0.33897238969802856, -0.18478795886039734, -1.2895563840866089, -1.054251790046692, 0.5599813461303711, -0.5184959769248962, 1.0679672956466675, 0.41148513555526733, 2.236036777496338, 0.4061366319656372, 0.272536963224411, -0.7011982202529907, -0.6965756416320801, -1.3738293647766113, -0.9214045405387878, -1.2908315658569336, 0.002735928865149617, -10.121125221252441, -6.16944694519043, -3.2490994930267334, -2.747593879699707, -2.122638463973999, -1.343381404876709, -1.9829074144363403, -1.558193564414978, -1.554426908493042, -0.9791358113288879, -0.1586589217185974, 0.22117124497890472, -3.136153221130371, -2.1134538650512695, -0.5171348452568054, 0.13903111219406128, -3.1306419372558594, -1.8257617950439453, -0.6556441187858582, -0.48264211416244507, -0.4650673270225525, -2.025869369506836, -0.08367107063531876, 0.06120254099369049, 0.1299218237400055, 0.304646372795105, 0.024342473596334457, -0.47125324606895447, -0.655540943145752, -2.0782227516174316, -0.9083961248397827, 3.9407615661621094, 16.185447692871094, 2.990055799484253, 2.026270627975464, 1.4965132474899292, 2.0964038372039795, 1.7466181516647339, 14.329285621643066, 3.412203788757324, 2.1346399784088135, 2.927086353302002, 1.5311397314071655, 2.0526013374328613, 2.0255112648010254, 1.7447408437728882, 1.3085241317749023, 0.6297897100448608, 1.064219355583191, 0.968110978603363, 1.0392800569534302, 0.6658504605293274, 0.634518563747406, 0.7891107201576233, 0.9030886292457581, 0.5654179453849792, 0.22177866101264954, 0.46843838691711426, 0.8789970874786377, 0.29611310362815857, 1.1163743734359741, 0.8881351351737976, 0.7998219728469849, -0.3377310633659363, 0.03779512643814087, -0.003236232791095972, 0.2820183336734772, -0.1648709625005722, 0.15052199363708496, 1.0259461402893066, 0.41772717237472534, 0.19212758541107178, 0.01985853537917137, 0.08016595244407654, 0.10540862381458282, 0.18772593140602112, 0.445149302482605, 0.9478403329849243, 0.14493513107299805, -0.04540832340717316, 0.07517718523740768, 0.26397761702537537, -0.12919968366622925, -0.09367705136537552, -0.06310030817985535, 0.5289011001586914, 0.07312864065170288, -0.18277166783809662, 0.13392755389213562, -0.5700629353523254, -0.6822415590286255, -1.121700406074524, -0.819206714630127, -0.6899083852767944, 0.06360030174255371, 1.2203261852264404, 0.5286192297935486, 0.4246649742126465, 0.608282208442688, 0.169428288936615, 5.529989719390869, 0.22635023295879364, 1.2797627449035645, 0.641566276550293, 0.7311424016952515, 0.6146060228347778, 0.6039493083953857, 0.7468789219856262, 0.5795114040374756, 0.14851737022399902, 0.003916430752724409, -0.8177333474159241, 1.1558339595794678, 0.8150486350059509, 0.28721505403518677, -0.08295724540948868, 0.8663042783737183, -0.12019255012273788, 0.21481435000896454, -0.006899334955960512, -1.9006359577178955, -0.930885374546051, 0.2417631298303604, 0.4728584885597229, 0.35391226410865784, 0.5776044726371765, 0.05797308683395386, -0.6158409118652344, -2.571823835372925, -5.077270984649658, -0.6109508275985718, 5.852639675140381, 3.8164560794830322, 7.093533039093018, 5.847262859344482, 4.422942638397217, 7.051522731781006, 4.403559684753418, 3.741119146347046, 8.884323120117188, 6.005716800689697, 5.438824653625488, 3.7669293880462646, 4.6668925285339355, 4.958282470703125, 4.039247512817383, 3.050180673599243, 1.744162917137146, 2.618724822998047, 4.599602699279785, 3.1491522789001465, 1.8947088718414307, 2.128077507019043, 2.850562572479248, 2.1813929080963135, 1.4062283039093018, 0.968116819858551, 1.4218378067016602, 2.3448917865753174, 1.3854869604110718, 2.4763386249542236, 1.6235952377319336, 1.926133632659912, -0.18555384874343872, 0.3139816224575043, 0.1395268440246582, 0.9016680121421814, -0.47601744532585144, 0.47541648149490356, 2.1785831451416016, 0.6198124289512634, 1.2655575275421143, 0.15374556183815002, -0.022515274584293365, -0.2487664520740509, 0.3061142563819885, 1.0221470594406128, 1.9954326152801514, 0.7287238836288452, 0.11155026406049728, 0.31069719791412354, 0.8503714799880981, -0.2865869104862213, -0.21749991178512573, 0.07167358696460724, 1.154962182044983, 0.6785088777542114, -0.5581897497177124, 0.46549561619758606, -1.0355132818222046, -0.6002509593963623, -2.211726665496826, -0.38301149010658264, -0.15297500789165497, 0.7663475871086121, 0.5997673273086548, 1.2928448915481567, 0.9078907370567322, -0.08547566086053848, -0.061220988631248474, 7.299069404602051, 5.294886589050293, 3.4102556705474854, 1.757995843887329, 2.118530035018921, 1.4748600721359253, 1.9860522747039795, 1.3780364990234375, 1.6924394369125366, 0.9677131175994873, 0.159409761428833, -0.10508045554161072, 3.048171281814575, 2.0720133781433105, 0.5233007073402405, -0.08477571606636047, 3.0193474292755127, 1.8385801315307617, 0.7011741995811462, 0.32417529821395874, 2.037968635559082, 0.7316104769706726, -0.07307479530572891, -0.37979012727737427, -0.5682746767997742, -0.5587223172187805, -0.1056552603840828, 0.6538429260253906, 2.6420161724090576, 4.95098352432251, 0.6947001814842224, -5.681090354919434, -3.669278621673584, -7.030954837799072, -6.037749290466309, -5.058415412902832, -7.002641677856445, -4.334777355194092, -3.892927646636963, -8.844118118286133, -6.0192766189575195, -5.647950649261475, -3.7604215145111084, -4.970141410827637, -4.995177745819092, -4.099310874938965, -3.0438473224639893, -1.7268157005310059, -2.638028144836426, -4.484391212463379, -2.984726905822754, -2.0249733924865723, -2.1979408264160156, -2.7437589168548584, -1.9702707529067993, -1.4418545961380005, -1.0907553434371948, -1.4923373460769653, -2.3664932250976562, -1.4237343072891235, -2.596942186355591, -1.5654140710830688, -1.8069599866867065, 0.22664067149162292, -0.1594325304031372, 0.24011728167533875, -0.8582908511161804, 0.4311347007751465, -0.41843128204345703, -4.925808429718018, -0.6386445164680481, -1.207939624786377, -0.20867477357387543, 0.025181923061609268, 0.37170419096946716, -0.33662962913513184, -1.0937501192092896, -2.111860990524292, -0.7560731172561646, 0.04591921344399452, -0.2978529632091522, -0.6991146206855774, 0.29959744215011597, 0.1464262157678604, -0.06530778855085373, -1.1791579723358154, -0.7995136380195618, 0.6936266422271729, -0.32824814319610596, 1.1511420011520386, 0.39860597252845764, 2.251163959503174, 0.30454736948013306, 0.13520225882530212, -0.719683051109314, -0.7680479884147644, -1.3224217891693115, -1.043531894683838, 0.120638407766819, -0.16004304587841034, -12.51164722442627, -6.186787128448486, -3.325183153152466, -1.8037481307983398, -2.099346876144409, -1.5151959657669067, -1.814008116722107, -1.4446308612823486, -1.6001267433166504, -0.8087900280952454, -0.012988340109586716, 0.19559377431869507, -2.9863476753234863, -2.2022581100463867, -0.5182163119316101, 0.17054039239883423, -2.9254534244537354, -1.7060649394989014, -0.7282992005348206, -0.32495301961898804, -0.31928423047065735, 0.8333481550216675, 1.3106924295425415, -0.9618647694587708, -1.4151382446289062, 0.9778494238853455]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0.8, 1.37)}}, 'et1_eta0': {'discriminator': {'threshold': 0.089998972415924083, 'nodes': [100, 5, 1], 'bias': [0.13026855885982513, -0.26550668478012085, 0.10098384320735931, 0.2817646265029907, -0.24148190021514893, 0.28516680002212524], 'weights': [6.899774074554443, 16.352725982666016, 0.5933220386505127, 2.4192605018615723, 0.11743052303791046, 4.809587001800537, -0.343030720949173, -0.24318425357341766, 0.03658125922083855, -3.1363468170166016, -0.11848730593919754, -133.99517822265625, 5.193421363830566, 5.081463813781738, 34.88224792480469, 2.887279987335205, 4.678894996643066, 2.649254560470581, 5.661073684692383, 12.021714210510254, 2.9697964191436768, 2.6748416423797607, 1.496754765510559, 2.3502867221832275, 2.18495512008667, 2.2296648025512695, 4.823065280914307, 1.9415361881256104, 1.8471628427505493, 1.553573727607727, 1.784615159034729, 1.7211287021636963, 0.866039514541626, 0.6766988635063171, 1.4916530847549438, 1.1342616081237793, 0.9869433045387268, -2.0301432609558105, 0.6865469813346863, 1.4280389547348022, 0.7327931523323059, 0.2371402084827423, 1.8007099628448486, 1.1863741874694824, -0.014120065607130527, -0.2791396677494049, 0.7089519500732422, 0.4246557950973511, 1.2188538312911987, 0.5817012786865234, 0.499347060918808, 0.15267817676067352, 0.14925161004066467, -23.053922653198242, -7.309223175048828, 0.5530054569244385, 0.7288325428962708, -0.48038211464881897, 0.6218819618225098, -0.20887674391269684, -0.8501588106155396, 1.2204691171646118, -0.4112662374973297, 1.3383499383926392, -7.248931884765625, 0.6939977407455444, -0.5631090998649597, 0.2956172227859497, -0.09469417482614517, 0.9803329110145569, -0.6680454611778259, -0.5637686252593994, -0.40396279096603394, -0.23399324715137482, 0.7935812473297119, 5.329383373260498, 1.2227143049240112, 0.8110776543617249, 1.0557469129562378, -0.09967409074306488, 7.470627307891846, 2.7973663806915283, 12.985594749450684, 10.80945110321045, 5.312950134277344, 1.4698386192321777, 1.2358468770980835, 1.7002789974212646, 2.332430124282837, 1.9757977724075317, 1.008349061012268, -0.3452204167842865, 2.5461506843566895, 1.5805330276489258, -2.5452659130096436, -0.2858031392097473, 4.327240467071533, 1.6949045658111572, -0.5474514365196228, -1.0070194005966187, 3.1365036964416504, 1.4264229536056519, 0.46255072951316833, -0.06407009065151215, -0.08005370944738388, 0.21678487956523895, 0.3651900887489319, 0.5949395298957825, 2.2012155055999756, 2.7517831325531006, -4.617430210113525, -7.510282516479492, -6.630491733551025, -4.501444339752197, -5.261494159698486, -3.223292350769043, -4.61243200302124, -2.772080659866333, -2.796226978302002, -3.223543405532837, -3.2556803226470947, -2.647357702255249, -2.1666717529296875, -2.266063690185547, -2.1483471393585205, -2.18593692779541, -1.7709323167800903, -1.8062844276428223, -1.743281364440918, -1.4827731847763062, -1.8574687242507935, -1.648593783378601, -0.9516342878341675, -0.7328382134437561, -1.3366445302963257, -0.9306458830833435, -0.9237238764762878, -0.926608681678772, -0.7026310563087463, -1.3953449726104736, -0.8315156102180481, 0.021193236112594604, -1.6468673944473267, -0.3374200165271759, 0.08506361395120621, 0.29782259464263916, -0.7337348461151123, -0.44007250666618347, -1.2420686483383179, -0.6445106863975525, -0.31814923882484436, -0.5961984395980835, -0.16995586454868317, -1.443328619003296, -0.191337451338768, -0.580639660358429, -0.25931718945503235, 0.3832920491695404, -0.5014948844909668, 0.15482033789157867, 0.794733464717865, -1.4419859647750854, 0.5691285133361816, -1.1889307498931885, -0.4611969292163849, -0.6314657330513, 0.6613544821739197, -0.21968477964401245, 0.07686891406774521, -1.1416877508163452, 0.5154832601547241, 0.459480345249176, 0.5681905746459961, 0.4546891748905182, -0.5072559118270874, -1.0298582315444946, -1.1796760559082031, -0.716462254524231, -0.13588790595531464, 0.055263034999370575, -8.00947093963623, -2.617304563522339, -2.155120611190796, -0.8165661096572876, -1.546573519706726, -0.6795950531959534, -1.1418935060501099, -1.5697532892227173, -2.318981885910034, -2.0122148990631104, -0.2781384587287903, 0.1994207799434662, -2.535902738571167, -1.5865310430526733, -0.20114310085773468, 0.29925528168678284, -4.517794132232666, -1.6401015520095825, -0.16101348400115967, 0.34219953417778015, -4.2039713859558105, -2.2228593826293945, -0.36036258935928345, 0.006430026143789291, 0.00564979761838913, -0.2846749424934387, -0.1690729856491089, -0.713566780090332, -2.1880154609680176, -2.8614342212677, 1.3553072214126587, -0.09500797837972641, 6.485579967498779, 4.338515758514404, 4.054488182067871, 2.1393210887908936, 4.3361616134643555, 2.6636030673980713, 2.965369462966919, 3.042334794998169, 3.0481913089752197, 2.8283920288085938, 2.3292248249053955, 2.269939661026001, 2.2794978618621826, 2.1206231117248535, 1.8981077671051025, 1.9247421026229858, 1.8147590160369873, 1.5951828956604004, 1.841043472290039, 1.699897050857544, 1.0185341835021973, 0.8176997900009155, 1.804958701133728, 0.9224161505699158, 0.9395413994789124, 0.9981505870819092, 0.5674375891685486, 1.4063092470169067, 0.8281000852584839, 0.13445372879505157, 1.7218259572982788, 1.3947255611419678, 0.12177100032567978, -0.2041916400194168, 0.669011116027832, 0.5964751243591309, 1.2814091444015503, 0.5093510746955872, 0.11234066635370255, 0.6185265779495239, 0.21782174706459045, 1.4358878135681152, 0.2166738212108612, 0.7268922924995422, 0.7358065843582153, -0.2957155704498291, 0.5267340540885925, 0.018530720844864845, -0.8329143524169922, 1.4509282112121582, -0.4544578790664673, 1.213326096534729, 0.5540860295295715, 0.6212376952171326, -0.6449874639511108, 0.33839884400367737, -0.015398956835269928, 1.0235668420791626, -0.635717511177063, -0.4007470905780792, -0.5329344272613525, -0.037641871720552444, 0.5998761057853699, 0.9821504950523376, 1.2193130254745483, 0.5014228224754333, 1.4592225551605225, 0.0007539120269939303, 7.4821882247924805, 2.9073970317840576, 2.234830617904663, 1.2812618017196655, 1.4794807434082031, 1.4617334604263306, 1.226047158241272, 1.664346694946289, 2.2560362815856934, 1.880759835243225, 1.8559043407440186, 0.30874988436698914, 2.4118285179138184, 1.7293230295181274, 0.37950506806373596, -0.32922399044036865, 4.410937309265137, 2.077910900115967, -0.5310007929801941, -0.8569069504737854, -3.2046031951904297, -1.878570556640625, -0.4966791272163391, -0.041915521025657654, 0.0010237264214083552, -0.35946255922317505, -0.16862881183624268, -0.6730135679244995, -2.2084267139434814, -2.830782175064087, 1.444815993309021, 7.311896800994873, 6.746527671813965, 4.426757335662842, 5.439311981201172, 3.1424455642700195, 4.659900188446045, 2.7016937732696533, 2.9734232425689697, 3.1668307781219482, 3.2199769020080566, 2.7241642475128174, 2.252969264984131, 2.3151626586914062, 2.0955772399902344, 2.339506149291992, 1.7223293781280518, 1.7967665195465088, 1.7298623323440552, 1.7324773073196411, 1.7900738716125488, 1.5840544700622559, 0.933102011680603, 0.8880665898323059, 1.4224761724472046, 1.1536072492599487, 0.9202759265899658, 0.9527393579483032, 0.5907071232795715, 1.382846713066101, 0.7373377680778503, 0.11727926880121231, 1.6933280229568481, 0.37634551525115967, -0.05939439311623573, -0.32975059747695923, 0.6748769879341125, 0.5615000128746033, 1.1567221879959106, 0.506033182144165, 0.08262698352336884, 0.458146333694458, 0.12529253959655762, 1.3546130657196045, 0.35908567905426025, 0.7352120280265808, 0.30408918857574463, -0.2514974772930145, 0.6668548583984375, -0.22145557403564453, -1.1797659397125244, 1.2833958864212036, -0.6023738980293274, 1.2626928091049194, 0.44070497155189514, 0.7011858224868774, -0.6213901042938232, 0.2127763330936432, 0.0018709421856328845, 0.7595801949501038, -0.5178589820861816, -0.4579158425331116, -0.5081691741943359, -0.4273574948310852, 0.530954122543335, 1.1548372507095337, 1.1909937858581543, 0.6980268955230713, -0.21412287652492523, -0.14805613458156586, 8.138078689575195, 2.6744754314422607, 2.1828529834747314, 0.854567289352417, 0.9787827730178833, 0.8920714855194092, 1.081211805343628, 1.5808980464935303, 3.3566043376922607, 1.8604305982589722, 0.3846227824687958, -0.25873804092407227, 2.4828872680664062, 1.646903157234192, 0.1991197019815445, -0.35633036494255066, 4.391186714172363, 1.694061517715454, -0.010804381221532822, -0.13379591703414917, 3.142569065093994, 1.885544776916504, 0.42330726981163025, -0.02307279221713543, 0.03883444890379906, 0.22803469002246857, 0.15954458713531494, 0.6746170520782471, 2.1230428218841553, 2.7047719955444336, -1.42130708694458, -7.3318586349487305, -6.713561534881592, -4.5120673179626465, -5.326016426086426, -3.2210566997528076, -4.770684242248535, -2.7039825916290283, -2.9834811687469482, -3.2463696002960205, -3.198507308959961, -2.676010847091675, -2.2476842403411865, -2.3895657062530518, -2.085507392883301, -2.3317718505859375, -1.8416802883148193, -1.9407689571380615, -1.777759313583374, -1.641348123550415, -1.8573496341705322, -1.6751770973205566, -0.8691015243530273, -0.7737262845039368, -1.3237534761428833, -1.0309513807296753, -0.956010103225708, -0.8817286491394043, -0.7214582562446594, -1.485176920890808, -0.8006212115287781, 0.03045649640262127, -1.7968178987503052, -0.15167224407196045, 0.10287018120288849, 0.32076430320739746, -0.7837929129600525, -0.6078547835350037, -1.1492019891738892, -0.6437928676605225, -0.2273150086402893, -0.4479551315307617, -0.19615353643894196, -1.475245475769043, -0.16832801699638367, -0.7806887030601501, -0.43588489294052124, 0.3417947590351105, -0.5984894633293152, 0.18171395361423492, 1.3271015882492065, -1.3004610538482666, 0.567756712436676, -1.3063372373580933, -0.595904529094696, -0.6181480288505554, 0.6816067695617676, -0.3874245882034302, -0.10277097672224045, -0.8113201856613159, 0.4958667755126953, 0.5487250089645386, 0.5853757262229919, 0.28303003311157227, -0.47044941782951355, -1.012993574142456, -1.0892679691314697, -0.7276430130004883, -0.0545482262969017, 0.0023131719790399075, -8.050432205200195, -2.7260515689849854, -2.2996180057525635, -0.8566168546676636, -0.8960089683532715, -0.7992809414863586, -1.1440401077270508, -1.6487165689468384, -2.2422666549682617, -1.8732126951217651, -0.3583516776561737, 0.31507444381713867, -2.49290132522583, -1.6364563703536987, -0.20403233170509338, 0.4427047073841095, -4.316447734832764, -1.6208338737487793, -0.05867146700620651, 0.1259959191083908, -0.49012619256973267, 1.3664380311965942, -0.9122105836868286, -1.5342460870742798, 1.4196211099624634]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0, 0.8)}}, 'et3_eta1': {'discriminator': {'threshold': 0.37499870061874391, 'nodes': [100, 5, 1], 'bias': [0.08650511503219604, -0.055272262543439865, 0.10310862213373184, 0.016909923404455185, -0.12306475639343262, -0.13866235315799713], 'weights': [-1.8073946237564087, -1.5411490201950073, 0.5207444429397583, 0.9707058668136597, 0.25348761677742004, 0.04366215318441391, -0.24979205429553986, -0.27689307928085327, -2.309197187423706, -3.3570711612701416, 1.4562300443649292, 7.651455879211426, 0.36543744802474976, 2.8513708114624023, 2.6874794960021973, 6.057408809661865, 6.057231426239014, 5.669864177703857, 4.801469326019287, 12.592092514038086, 4.3951287269592285, 3.525283098220825, 3.761875629425049, 2.5921874046325684, 2.918700933456421, 2.418201208114624, 3.809760093688965, 2.845146417617798, 1.6797908544540405, 2.6805214881896973, 2.7352213859558105, 2.2525758743286133, 2.9871532917022705, 2.7930495738983154, 2.393132448196411, 0.47632381319999695, 1.7430351972579956, 1.497951865196228, 2.175682544708252, 1.54957914352417, 2.5405402183532715, 1.7708392143249512, 0.7371238470077515, 0.6540555357933044, 0.7026950120925903, 0.46482789516448975, -0.3877534866333008, 1.530444860458374, 1.3411180973052979, 0.5750821828842163, 0.39422816038131714, -0.08476825058460236, 0.8233877420425415, -3.1044533252716064, 0.5614856481552124, 0.21811482310295105, 0.895219624042511, 0.2259756177663803, 0.8229779005050659, -0.4962327480316162, 0.42732468247413635, -0.17410647869110107, 0.41408899426460266, 0.30640730261802673, 0.708544135093689, 0.9880279302597046, 0.616394579410553, -0.7441698908805847, -2.3464620113372803, -0.3689490556716919, -1.6319341659545898, 0.1698792278766632, -0.44919198751449585, -0.4705634117126465, 0.9533016681671143, 1.566569447517395, 2.190119743347168, 1.4812970161437988, 1.2188771963119507, 0.043788351118564606, 2.7045044898986816, 6.087611198425293, 3.965449333190918, 2.5000901222229004, 3.1309781074523926, 2.265713691711426, 3.033586263656616, 2.9956352710723877, 2.1402223110198975, 1.0625516176223755, 0.13269169628620148, -0.4519107937812805, 4.085275173187256, 2.943455219268799, 1.3587406873703003, 0.6337225437164307, 4.183228015899658, 3.148148536682129, 2.5254170894622803, 0.5404440760612488, 1.4453608989715576, 1.6564768552780151, -0.4487656354904175, -0.9476009607315063, -0.09270484745502472, 0.045866623520851135, 0.2483207732439041, 0.1396970897912979, 2.2485430240631104, 3.079014778137207, -1.2493622303009033, -7.264638423919678, -1.4254909753799438, -2.8907840251922607, -2.5356640815734863, -6.107833385467529, -6.015527725219727, -5.6949782371521, -4.718616485595703, -12.774330139160156, -4.4238810539245605, -3.4205734729766846, -3.7510557174682617, -2.7808003425598145, -2.836054563522339, -2.5392425060272217, -3.7995500564575195, -2.768383502960205, -1.7824243307113647, -2.5556480884552, -2.804090738296509, -2.346342086791992, -2.9805829524993896, -2.7800140380859375, -2.4737284183502197, -0.5426251888275146, -1.8741132020950317, -1.5899451971054077, -2.1455368995666504, -1.5076541900634766, -2.534780979156494, -1.767467975616455, -0.6016656160354614, -0.7123382091522217, -0.7486628293991089, -0.754169225692749, 0.28897523880004883, -1.5247836112976074, -1.3225271701812744, -0.5810943841934204, -0.3371606469154358, 0.3082497715950012, -0.958335816860199, 3.1822664737701416, -0.7602589726448059, -0.2604738175868988, -0.7048048973083496, -0.4244652986526489, -0.7984673976898193, 0.3503713309764862, -0.26729831099510193, 0.13962948322296143, -0.4200628101825714, -0.373464971780777, -0.7399169206619263, -1.0845354795455933, -0.7398272156715393, 0.8153616786003113, 2.39160418510437, 0.5093047022819519, 1.5113933086395264, -0.033965103328228, 0.3592761754989624, 0.49540650844573975, -0.9408409595489502, -1.692526936531067, -2.3452839851379395, -1.5775525569915771, -1.105531096458435, -0.17043983936309814, -2.573122978210449, -6.150838375091553, -4.102262020111084, -2.51358962059021, -3.126319408416748, -2.367657423019409, -3.0993878841400146, -3.0342042446136475, -2.2070131301879883, -1.0939661264419556, -0.35196807980537415, 0.3115089237689972, -4.141249656677246, -2.8903026580810547, -1.332562804222107, -0.48742029070854187, -4.5644211769104, -3.011760711669922, -2.541569471359253, -0.5386564135551453, -1.9346240758895874, -1.5834821462631226, 0.4096720814704895, 1.0849721431732178, 0.17380240559577942, 0.027415642514824867, -0.030130337923765182, -0.15520454943180084, -2.299142360687256, -3.3818070888519287, 1.3688827753067017, 7.676735877990723, 1.605080246925354, 3.000534772872925, 2.678732395172119, 5.935696125030518, 6.06373405456543, 5.805450439453125, 4.718634128570557, 12.794767379760742, 4.594069957733154, 3.5172908306121826, 3.708810329437256, 2.7571866512298584, 2.722099781036377, 2.40950608253479, 3.974444627761841, 2.799480438232422, 1.6455305814743042, 2.7383944988250732, 2.6431944370269775, 2.323991298675537, 2.9935028553009033, 2.82285475730896, 2.345909595489502, 0.3938029110431671, 1.7474058866500854, 1.4374860525131226, 2.2240378856658936, 1.5731925964355469, 2.464531660079956, 1.7226593494415283, 0.5531126260757446, 0.5788571238517761, 0.5707744359970093, 0.8479485511779785, -0.35176020860671997, 1.6379313468933105, 1.2839455604553223, 0.7611449956893921, 0.47148340940475464, -0.17590422928333282, 0.9922735095024109, -3.0894510746002197, 0.6261608004570007, 0.4233037829399109, 0.9107146859169006, 0.22243081033229828, 0.7495966553688049, -0.5241858959197998, 0.2487483024597168, -0.10661022365093231, 0.4667392075061798, 0.3670872747898102, 0.5729408860206604, 1.0026434659957886, 0.585365355014801, -0.8662146925926208, -2.383124828338623, -0.34243500232696533, -1.4974608421325684, 0.04802016168832779, -0.48004579544067383, -0.5292894244194031, 0.989148736000061, 1.6366991996765137, 2.1623520851135254, 1.5623252391815186, 1.163589358329773, 0.1917525827884674, 2.7386865615844727, 6.100390911102295, 4.013089179992676, 2.4702577590942383, 2.9258551597595215, 2.3872175216674805, 2.9061832427978516, 3.0389115810394287, 2.267369270324707, 0.9224342107772827, 0.13882692158222198, -0.27043575048446655, 4.245561122894287, 3.0114283561706543, 1.367991328239441, 0.42549777030944824, 4.6043925285339355, 3.1355578899383545, 2.4280529022216797, 0.5863694548606873, 1.4754598140716553, 1.5698059797286987, -0.4823726713657379, -0.9748214483261108, -0.2041388303041458, 0.08785350620746613, 0.199985533952713, 0.17536546289920807, 2.2290570735931396, 3.3302524089813232, -1.426261067390442, -7.453845500946045, -1.5029581785202026, -2.8574960231781006, -2.51312518119812, -6.05672025680542, -6.044571399688721, -5.634576797485352, -4.779540061950684, -12.704353332519531, -4.59316873550415, -3.5367848873138428, -3.756740093231201, -2.6343228816986084, -2.704092025756836, -2.5194485187530518, -3.8116281032562256, -2.658090353012085, -1.6250009536743164, -2.5274710655212402, -2.6961114406585693, -2.4041428565979004, -3.039490222930908, -4.3730998039245605, -2.557791233062744, -0.40343430638313293, -1.7577539682388306, -1.4783707857131958, -2.2146480083465576, -1.6547660827636719, -2.558105707168579, -1.7695081233978271, -0.510453999042511, -0.5691689848899841, -0.7173045873641968, -0.6408175230026245, 0.23928460478782654, -1.5225844383239746, -1.1491734981536865, -0.6912940740585327, -0.26458418369293213, 0.3127172291278839, -0.940774142742157, 3.005188465118408, -0.6097161173820496, -0.35493654012680054, -0.8616894483566284, -0.28624242544174194, -0.7830718755722046, 0.3505081832408905, -0.34502825140953064, 0.2634536921977997, -0.4759857952594757, -0.2661202847957611, -0.541718065738678, -0.9805392026901245, -0.7372620701789856, 0.8859495520591736, 2.363197088241577, 0.4431571066379547, 1.67885422706604, -0.16037490963935852, 0.5349763035774231, 0.3455374836921692, -1.0929559469223022, -1.7298650741577148, -2.2176284790039062, -1.5353748798370361, -1.5175400972366333, -0.5990257859230042, -2.6407501697540283, -6.11340856552124, -4.0411529541015625, -2.5640499591827393, -3.0219898223876953, -2.3999757766723633, -3.000324010848999, -2.844813823699951, -2.1008665561676025, -0.9790552854537964, -0.23401658236980438, 0.3395158052444458, -4.146481513977051, -2.998228073120117, -1.1968015432357788, -0.5384282469749451, -4.567948818206787, -3.1174044609069824, -2.522387981414795, -0.570985734462738, 1.9201645851135254, 1.625332236289978, -0.4284254312515259, -0.9992616772651672, -0.15117469429969788, 0.019743775948882103, 0.09398511052131653, 0.2782013416290283, 2.1579794883728027, 3.469564199447632, -1.3766605854034424, -7.3433756828308105, -0.28918886184692383, -2.934257745742798, -2.506077766418457, -5.9221601486206055, -5.87907075881958, -5.6570539474487305, -4.644432067871094, -12.650253295898438, -4.3996124267578125, -3.56400203704834, -3.7642898559570312, -2.7329769134521484, -2.7007155418395996, -2.4277775287628174, -4.000192642211914, -2.8354525566101074, -1.6353849172592163, -2.692246437072754, -2.6824562549591064, -2.333967685699463, -2.899958372116089, -2.886532783508301, -2.5179288387298584, -0.5252694487571716, -1.7582615613937378, -1.5399903059005737, -2.2383580207824707, -1.4774408340454102, -1.805370569229126, -1.7390944957733154, -0.674606204032898, -0.7607637047767639, -0.7686880826950073, -0.4594736695289612, 0.4311450123786926, -1.4034266471862793, -1.3378093242645264, -0.6132334470748901, -0.34021979570388794, 0.28610631823539734, -0.8854137659072876, 2.952155113220215, -0.7034514546394348, 0.01109424326568842, -0.8532021045684814, -0.31980711221694946, -0.6572751402854919, 0.34408852458000183, -0.2943135201931, 0.15395930409431458, -0.4090576469898224, -0.3246546685695648, -0.5836114883422852, -0.8692274689674377, -0.6687362790107727, 0.8390278220176697, 2.4083733558654785, 0.49250155687332153, 1.5603394508361816, -0.037518538534641266, 0.36591941118240356, 0.47634559869766235, -0.912810206413269, -1.700984001159668, -2.164130687713623, -1.4122774600982666, -1.2411245107650757, -0.2530621886253357, -2.6884801387786865, -6.040997505187988, -4.175899982452393, -2.5609495639801025, -3.0327723026275635, -2.379563093185425, -2.868626356124878, -2.8405611515045166, -2.1093356609344482, -1.0403660535812378, -0.11491069942712784, 0.3772459030151367, -4.0683913230896, -2.9354939460754395, -1.2130905389785767, -0.506747841835022, -4.071317195892334, -3.0696909427642822, -2.5421555042266846, -0.3517703413963318, -1.0184422731399536, 1.6149846315383911, -1.1489373445510864, 2.899430274963379, 0.9671260714530945]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0.8, 1.37)}}, 'et0_eta3': {'discriminator': {'threshold': -0.31500081177800893, 'nodes': [100, 7, 1], 'bias': [-0.2698359191417694, -0.021040206775069237, -0.10066322982311249, -0.008700813166797161, -0.0809217244386673, -0.09307112544775009, 0.002951504662632942, -0.055201806128025055], 'weights': [0.20225106179714203, -0.9006369709968567, 0.03466144949197769, -0.2889445722103119, 0.07475759088993073, -0.13977815210819244, 0.04881351813673973, 0.02957393415272236, -0.24632103741168976, -0.4430311918258667, -3.228940725326538, 0.20872461795806885, 1.6354045867919922, -6.902615547180176, 1.333670735359192, 0.8173291087150574, 0.44339412450790405, 0.9221566319465637, 0.30203866958618164, 0.8357586860656738, -374.33819580078125, -100.91007232666016, 0.40322041511535645, -105.98914337158203, 35.8812255859375, -291.89166259765625, 0.17422837018966675, -76.4021987915039, -491.6601257324219, -0.16425257921218872, -0.13429200649261475, 0.20934633910655975, 0.01121070422232151, 0.22853007912635803, 0.014218064956367016, 0.10473887622356415, -0.03651595488190651, 0.07260922342538834, -0.34782665967941284, -0.009246349334716797, -0.039252765476703644, -0.07105270773172379, -0.06934697180986404, 0.10464552789926529, 0.1353124976158142, -0.13408182561397552, 0.031428251415491104, -0.00043547828681766987, -0.12158826738595963, 0.16264048218727112, -0.0336020365357399, 56.602081298828125, -0.14486771821975708, 25.081844329833984, -0.14430655539035797, -0.028534093871712685, 0.12397117167711258, 0.4500467777252197, -0.18105795979499817, 0.0884188562631607, -0.08558822423219681, -0.01410595327615738, -0.2034880816936493, -0.00359709863550961, -0.023490779101848602, -0.13555382192134857, -0.19149203598499298, -0.0329434908926487, -0.03576066344976425, 0.1175893172621727, -2.5838210582733154, -0.3766530454158783, 0.0775269940495491, -0.18933957815170288, 0.0820411816239357, 0.03480014577507973, 0.2163989096879959, 0.0517808236181736, -0.10070717334747314, 12.077496528625488, 4.14965295791626, -0.1262219250202179, 86.37357330322266, -4.0285162925720215, 0.25238341093063354, 0.173043355345726, -0.4014592170715332, 0.2288466840982437, -0.07247157394886017, 0.4948960244655609, -0.04976343736052513, -0.3145294189453125, 0.2821393609046936, 6.633347034454346, -0.10303610563278198, -0.18202932178974152, -0.31121909618377686, -0.16638228297233582, -0.3183334171772003, 51.533748626708984, -1.0530906915664673, -0.9841030836105347, 0.29775214195251465, 0.5295977592468262, 0.8868358135223389, 0.3516679108142853, 0.21565701067447662, 0.0794435515999794, -2.2470850944519043, -1.9531877040863037, -2.1994662284851074, 0.20457442104816437, 2.939715623855591, 0.3507762849330902, 7.303609848022461, 4.734809875488281, 1.9167451858520508, 5.447176933288574, 1.738074541091919, 4.827472686767578, 1.8147984743118286, 1.2954773902893066, 2.951904773712158, 2.7711808681488037, 5.329275608062744, 1.5482845306396484, 1.5833131074905396, 2.7048208713531494, 1.9742443561553955, 1.1318703889846802, 1.0929538011550903, 1.749925136566162, 0.7001661062240601, 2.305717945098877, 0.05212286114692688, 1.4895020723342896, 0.3556216359138489, 0.9450576901435852, -0.6107288002967834, 0.649321973323822, -0.023156901821494102, -0.1220313087105751, 0.6576177477836609, 0.4568925201892853, 0.5959261655807495, -0.33617663383483887, 2.443324327468872, 0.10611805319786072, 0.24280813336372375, 0.5849461555480957, -0.1503051519393921, 0.7810186743736267, -0.027534402906894684, 0.4089702367782593, 0.014316439628601074, 0.3819413185119629, 0.446049302816391, 0.7746580243110657, -0.421926349401474, 0.5414602160453796, -0.21584512293338776, 0.01064643356949091, -0.4630609154701233, 0.42981064319610596, -0.28911176323890686, 0.13013294339179993, -0.663794755935669, 0.5548304915428162, -0.03197551518678665, 0.6406247019767761, -3.3596580028533936, -1.2676362991333008, -0.6108476519584656, -0.19657936692237854, 1.2165848016738892, 1.669739842414856, 1.698229193687439, 1.3538898229599, 0.702858030796051, 0.3418480157852173, 6.1677141189575195, 4.947031497955322, 2.064474105834961, 1.4611104726791382, 1.4244046211242676, 1.2800779342651367, 0.5524511933326721, 1.1216765642166138, 0.5202028751373291, 0.9660008549690247, 0.0637206956744194, 0.18642033636569977, 2.2422211170196533, 0.9906512498855591, 0.08027803152799606, -0.4177014231681824, -0.23565077781677246, 0.1196693554520607, 0.06809215992689133, 4.783222198486328, 1.1031341552734375, 0.9078258872032166, -0.22757139801979065, -0.47363269329071045, -0.6869458556175232, -0.3318561613559723, -0.33094659447669983, -0.29374340176582336, 2.0499820709228516, 2.239422559738159, 2.078904390335083, -0.21715745329856873, -1.245003581047058, -0.4031929075717926, -6.946435451507568, -4.712887287139893, -1.9018898010253906, -5.241952896118164, -1.8523764610290527, -4.795210361480713, -1.8940085172653198, -1.2504463195800781, -7.217137813568115, -2.7899413108825684, -5.231794357299805, -1.6275787353515625, -1.6051292419433594, -3.8509366512298584, -3.8491742610931396, -1.1744351387023926, -0.8577916026115417, -1.7116165161132812, -0.36539626121520996, -4.793726921081543, -0.08205004781484604, -1.5022155046463013, -0.5438974499702454, -0.7923613786697388, 0.5673443078994751, -0.7924880385398865, 0.11560714989900589, 0.02123773843050003, -0.8034487366676331, -0.5616395473480225, -0.5233768224716187, -0.2722334861755371, -2.5108327865600586, -0.5720518231391907, -0.4061076045036316, -0.7818689346313477, 0.019294343888759613, -0.7768457531929016, 0.13501304388046265, -0.47803908586502075, -0.029811006039381027, -0.42356646060943604, -0.34774869680404663, -0.7984080910682678, 0.3588971793651581, -0.6726347804069519, -0.5343213081359863, -0.4000171422958374, 0.357125461101532, -0.46829697489738464, 0.39098119735717773, -0.2298913598060608, 0.8594713807106018, -0.7110618352890015, -0.061636701226234436, -0.6693058609962463, 1.1489728689193726, 0.3318289518356323, 0.7837057113647461, 0.1749361902475357, -1.3185076713562012, -1.516122579574585, -1.7037216424942017, -1.2789870500564575, -0.4620683789253235, -0.26407337188720703, -6.04487419128418, -4.833531856536865, -1.9617811441421509, -1.4752931594848633, -1.3945602178573608, -1.2135614156723022, -0.3616400957107544, -0.9785630106925964, -0.7223881483078003, -1.228663444519043, -0.06690476834774017, -0.1908154934644699, -2.6066627502441406, -0.9647290706634521, -0.10820335149765015, 0.2571292519569397, -0.1646440029144287, 0.03318246826529503, -0.053327761590480804, -4.849867343902588, -0.9206339120864868, -0.9598978757858276, 0.002367813605815172, 0.6184605360031128, 0.7723608613014221, 0.20745083689689636, 0.23745183646678925, 0.20646026730537415, -2.1763594150543213, -2.0287892818450928, -2.282665967941284, 0.19380436837673187, 1.2973726987838745, 0.42046311497688293, 6.772983551025391, 4.822548866271973, 1.8652130365371704, 5.3888702392578125, 1.7751623392105103, 4.914341926574707, 1.8140294551849365, 1.39537513256073, 1.8427232503890991, 2.7229926586151123, 2.17301607131958, 1.5756100416183472, 1.5816236734390259, 2.6944282054901123, 1.9131555557250977, 1.321346402168274, 0.9164560437202454, 1.57354736328125, 0.4657553434371948, 2.363318920135498, 0.21329212188720703, 1.4519634246826172, 0.5176462531089783, 0.8253650665283203, -0.7699162364006042, 0.6339988708496094, -0.10295349359512329, -0.1282825767993927, 0.6225374937057495, 0.3867333233356476, 0.6584811210632324, 0.10895311087369919, 2.4481003284454346, 0.1392822414636612, 0.39405396580696106, 0.6399299502372742, -0.027020787820219994, 0.6829317808151245, -0.1337304562330246, 0.3378160893917084, 0.11674128472805023, 0.3012418746948242, 0.38937267661094666, 0.8625653386116028, -0.46745651960372925, 0.6723899245262146, -0.18008916079998016, 0.0021010921336710453, -0.2173125147819519, 0.5533600449562073, -0.25419265031814575, 0.34476810693740845, -0.8264703750610352, 0.5261073708534241, -0.023064417764544487, 0.5674001574516296, -3.2025935649871826, -1.2528597116470337, -0.4238010048866272, -0.0675603374838829, 1.3090697526931763, 1.6422717571258545, 1.7788664102554321, 1.2009772062301636, 0.5008041262626648, 0.3263235092163086, 6.060380458831787, 4.866382122039795, 1.925684928894043, 1.4962143898010254, 1.5213629007339478, 1.2689807415008545, 0.49399247765541077, 0.9131807684898376, 0.6098441481590271, 1.0815221071243286, 0.2259044200181961, 0.06316171586513519, 2.099392890930176, 1.1164296865463257, 0.06768371164798737, -0.2768418788909912, 0.19758757948875427, 0.1930726021528244, -0.09152580052614212, 4.797698497772217, 1.0277148485183716, -2.22694993019104, -0.04415075108408928, -0.12518760561943054, 0.16564080119132996, -0.05261689051985741, -0.03446321561932564, 0.08158248662948608, -0.5113720893859863, -0.3788033127784729, -0.5971873998641968, 0.13953155279159546, 4.506430625915527, 0.2659728229045868, 1.3502607345581055, 0.9779933094978333, 0.351772278547287, 0.9250448942184448, 0.41677066683769226, 0.9519994854927063, 0.2502197027206421, -9.120316505432129, 0.3444167375564575, 0.3123454451560974, 0.40910106897354126, 0.0916995108127594, 0.2373439073562622, 0.43546077609062195, -14.573567390441895, 0.15171678364276886, -0.055674199014902115, 0.3707161545753479, -0.05302024260163307, 0.358106404542923, -0.07901870459318161, 0.2045583873987198, 0.0697036162018776, 0.10527680069208145, -0.2687459886074066, 0.15632261335849762, -0.11626090854406357, -0.14377674460411072, 0.05710787698626518, 0.19631843268871307, 0.18389847874641418, -0.08253363519906998, 0.10760928690433502, -0.2127053141593933, 0.07326456159353256, 0.040400728583335876, -0.06481891125440598, 0.23098519444465637, 0.05147608742117882, 0.1465410590171814, 0.0579967275261879, 0.10700484365224838, 0.14924295246601105, 0.037807874381542206, -0.12092505395412445, 0.21576111018657684, -0.09722263365983963, 0.0056007616221904755, -0.03826138749718666, 0.06926880776882172, 0.01470389124006033, 0.09834640473127365, -0.11117671430110931, 0.04086750000715256, 0.06830863654613495, 0.18669994175434113, -1.8611273765563965, -0.19118912518024445, -0.00022084862575866282, -0.43339014053344727, 0.2761912941932678, 0.18247313797473907, -0.3071092367172241, -0.030098382383584976, 0.15324388444423676, 0.07706119120121002, 1.089043378829956, -0.3839241862297058, 0.4835626780986786, -4.151394367218018, 0.14189095795154572, 0.32883313298225403, 0.05562252178788185, 0.3006491959095001, 0.15693596005439758, 0.10109970718622208, 0.07931047677993774, -0.059077147394418716, 0.3848729133605957, 0.1263601928949356, -0.020419638603925705, -0.11904185265302658, -0.20301781594753265, -0.07345139235258102, -0.012471398338675499, 0.9680086970329285, -0.9358425736427307, -0.8182768821716309, 0.32609692215919495, 0.2679734230041504, 0.9349111914634705, 0.23690611124038696, 0.19807754456996918, 0.25633737444877625, -2.16581392288208, -2.012897253036499, -2.118820905685425, 0.3466905951499939, 2.1918342113494873, 0.469011127948761, 7.494755744934082, 4.930378437042236, 1.8796205520629883, 5.377964496612549, 1.7996736764907837, 4.8660888671875, 1.8072516918182373, 1.36774480342865, 2.0416035652160645, 2.8872687816619873, 2.3359196186065674, 1.5760948657989502, 1.7236955165863037, 1.9696800708770752, 1.7144217491149902, 1.3210614919662476, 0.9248697757720947, 1.7599890232086182, 0.8116555213928223, 2.4698283672332764, 0.2059156745672226, 1.3981654644012451, 0.41586068272590637, 0.8404405117034912, -0.7753180861473083, 0.6789394617080688, 0.022743070498108864, 0.010476325638592243, 0.6788951754570007, 0.37160664796829224, 0.6302220821380615, -0.3735024034976959, 2.5426855087280273, 0.11551742255687714, 0.3873821198940277, 0.7570158839225769, -0.11191364377737045, 0.6684703826904297, -0.034952033311128616, 0.4980826675891876, 0.033552736043930054, 0.451158732175827, 0.3124142587184906, 0.6837500333786011, -0.5132716298103333, 0.6350975632667542, -0.3610364496707916, 0.0016025649383664131, -0.3483062982559204, 0.6467903256416321, -0.3843829035758972, 0.15782345831394196, -0.8129379153251648, 0.5089651346206665, 0.14174644649028778, 0.6021339893341064, -3.525460720062256, -1.2975656986236572, -0.470624715089798, -0.08992313593626022, 1.3491078615188599, 1.552371621131897, 1.755676031112671, 1.3366750478744507, 0.6237494349479675, 0.29452434182167053, 6.071795463562012, 4.917517185211182, 2.1172122955322266, 1.364637851715088, 1.4950215816497803, 1.3792357444763184, 0.5199951529502869, 1.0476226806640625, 0.5393630862236023, 1.0928481817245483, 0.08544348925352097, 0.04950239509344101, 2.109650135040283, 1.1252402067184448, -0.09029020369052887, -0.39486026763916016, -0.3239646255970001, 0.07521496713161469, 0.03412073478102684, 4.873011589050293, -0.8586660623550415, -1.0525412559509277, 0.07509074360132217, 0.4819488525390625, 0.7972657084465027, 0.13409405946731567, 0.10143954306840897, 0.31604617834091187, -2.063786745071411, -2.093536138534546, -2.2159135341644287, 0.26373958587646484, 1.229822039604187, 0.3812316358089447, 6.935065746307373, 4.815906524658203, 1.8225938081741333, 5.333498954772949, 1.7477914094924927, 4.78044319152832, 1.9142042398452759, 1.3428295850753784, 1.9110363721847534, 2.8914854526519775, 2.352703809738159, 1.6458407640457153, 1.5780705213546753, 2.5145366191864014, 1.8319544792175293, 1.3093864917755127, 0.9795845150947571, 1.798264503479004, 0.35299715399742126, 2.2552196979522705, 0.05755537748336792, 1.3722851276397705, 0.3443555533885956, 0.8321239948272705, -0.7481610178947449, 0.8172251582145691, -0.16909922659397125, -0.0316196084022522, 0.6316993236541748, 0.5031779408454895, 0.4719659686088562, -0.40451106429100037, 2.313936471939087, 0.1540975123643875, 0.31803032755851746, 0.722418487071991, 0.09785754233598709, 0.6992901563644409, -0.11194178462028503, 0.2870538532733917, 0.0576513297855854, 0.25876832008361816, 0.4169984757900238, 0.8080670833587646, -0.4458756148815155, 0.6269686818122864, -0.2547069787979126, 0.09498245269060135, -0.28197652101516724, 0.6099480390548706, -0.2612399458885193, 0.1162339448928833, -0.8577127456665039, 0.5897204279899597, -0.0008873241604305804, 0.5660701394081116, -3.1996941566467285, -1.2886680364608765, -0.5724131464958191, -0.04713967815041542, 1.3978859186172485, 1.5510962009429932, 1.7785773277282715, 1.147539496421814, 0.6683967709541321, 0.2418586015701294, 6.097591400146484, 4.914902210235596, 2.101524829864502, 1.5633659362792969, 1.52678644657135, 1.1417715549468994, 0.5268220901489258, 0.9385673403739929, 0.6720860600471497, 0.8914452791213989, 0.21402402222156525, 0.04264415055513382, 2.2466981410980225, 1.0317379236221313, 0.11190563440322876, -0.38053470849990845, 0.12831388413906097, -0.03789529576897621, 0.11234768480062485, 4.994553565979004, -0.1770661175251007, -0.5325038433074951, 0.8114240169525146, -0.9086681604385376, -0.36800312995910645, -0.8545414805412292, -1.0581774711608887]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (1.54, 2.5)}}, 'et3_eta3': {'discriminator': {'threshold': 0.35999871492385865, 'nodes': [100, 5, 1], 'bias': [0.5159038305282593, -0.013890129514038563, -0.14351433515548706, -0.06087241694331169, -0.035346969962120056, -0.11732066422700882], 'weights': [-8.92424201965332, -14.35389518737793, -3.5922393798828125, 0.5395880341529846, -0.2549460828304291, 0.19084329903125763, -0.2808282673358917, -0.3631875514984131, -0.7719464302062988, -0.5012274980545044, 0.4520082473754883, 14.744214057922363, 1.4734541177749634, 0.09389933943748474, 1.219815969467163, 0.8421317338943481, 0.36871182918548584, 2.3683958053588867, 0.8821505308151245, 2.182751178741455, 0.773385763168335, 0.5395814180374146, 0.52494877576828, 0.9898393750190735, 0.6274219751358032, 0.8716437816619873, 0.4428722560405731, 1.572168231010437, 0.5276930332183838, 0.521804928779602, 0.4996563494205475, 1.8987674713134766, 0.5535033941268921, 0.5482311844825745, 46.47129821777344, 0.6383989453315735, 0.46053922176361084, 0.49767550826072693, 0.5004040598869324, 0.6187031269073486, 0.40190207958221436, 1.501409649848938, 0.47336840629577637, -65.14677429199219, 48.5474739074707, 0.5614616274833679, 0.4142259359359741, 0.5373347401618958, -1.566516637802124, 0.5767366290092468, 0.11587122827768326, -88.1963882446289, 0.21070167422294617, 0.3519592583179474, -0.1482011377811432, 0.18854816257953644, -0.58920818567276, 0.4348776936531067, -0.16200405359268188, 0.4969814121723175, -0.19106420874595642, 0.24878983199596405, -0.07973922044038773, -0.4645341634750366, -0.2678266167640686, 0.2965974807739258, 73.08518981933594, -0.25330105423927307, -2.0161304473876953, -0.5542007684707642, 0.09175889194011688, 0.4748390316963196, 4.518786430358887, -0.4171540141105652, 0.5947842001914978, 1.0116089582443237, 6.692963123321533, 4.287669658660889, 0.5925718545913696, 0.19356606900691986, 0.8634646534919739, 189.3330078125, 3.5947797298431396, 0.9175381064414978, 0.8372741341590881, 21.873180389404297, 62.2232666015625, 54.95687484741211, -9.891582489013672, -6.173172473907471, -0.7017567157745361, -12.107324600219727, -2.0871500968933105, 0.5723487138748169, 0.05632268637418747, 0.5136232376098633, 1.210272192955017, 0.08626605570316315, -0.27492398023605347, -1.8608883619308472, -1.069946527481079, -0.6936960220336914, 0.7365202307701111, 1.546463966369629, -0.4239451289176941, 0.8776395916938782, -0.5269442200660706, -0.041200943291187286, -1.6542311906814575, -1.5785257816314697, -0.5987526774406433, 1.5775848627090454, 0.4962875545024872, 0.31063947081565857, 3.2284812927246094, 2.8709609508514404, 1.9071259498596191, 5.294119834899902, 2.4774889945983887, 3.8454742431640625, 1.8301663398742676, 1.4755433797836304, 1.4741829633712769, 1.5041122436523438, 5.954089641571045, 3.0636110305786133, 1.4296730756759644, 1.675854206085205, 1.4774678945541382, 3.569460868835449, 0.1801801323890686, 3.2323882579803467, 1.336500644683838, 2.6678333282470703, 1.4733026027679443, 1.3343086242675781, 1.4705220460891724, 1.984933614730835, 1.0672568082809448, 3.389904499053955, -0.23274369537830353, 2.797027587890625, 0.9999473094940186, 1.198522686958313, 0.704962968826294, 1.4565412998199463, 1.1679123640060425, -0.5551745891571045, -1.7960987091064453, 2.2441368103027344, 0.40111762285232544, -0.49642348289489746, 0.7734733819961548, 1.341956377029419, 0.06617511063814163, 0.6418896317481995, -0.4321531355381012, 1.1610125303268433, -0.03851023688912392, 1.2840443849563599, -0.21741485595703125, 0.36016517877578735, 0.4743955433368683, -0.7105668783187866, -0.09740454703569412, 0.7039214372634888, -0.27873697876930237, -0.39580559730529785, -0.8952370285987854, -0.9746796488761902, 0.462026447057724, 1.1764204502105713, -0.619096040725708, -0.30376991629600525, 1.3786150217056274, 1.437181830406189, 1.7358534336090088, 1.3875480890274048, 1.0958871841430664, 0.35188084840774536, 0.8891122341156006, 3.9632816314697266, 6.857825756072998, 1.146546721458435, 2.0841546058654785, 2.112961769104004, 0.3354015648365021, 1.4218417406082153, 0.6604508757591248, 1.4536211490631104, 0.3090585172176361, 0.200468510389328, 3.744932174682617, 1.5200996398925781, 0.46393081545829773, 1.4258904457092285, -1.3119555711746216, 0.2614569664001465, -0.33304330706596375, -4.066699028015137, -973.1559448242188, 3.3467745780944824, -1.0383483171463013, -1.4209433794021606, 49.040775299072266, -1.0063509941101074, -14.254961967468262, 0.011091030202805996, 3.3505191802978516, 12.669255256652832, 1.293007731437683, -1.4403539896011353, -0.35303956270217896, 13.725162506103516, -3.2876007556915283, -2.262681245803833, -1.8829076290130615, 179.36973571777344, -2.442866563796997, 30.570972442626953, -1.9086859226226807, 0.5755576491355896, -1.3558117151260376, -1.5759135484695435, -2.749817132949829, -3.0641396045684814, -1.3838152885437012, -1.4915021657943726, -1.3418519496917725, -3.343719720840454, 1.986281156539917, -3.031704902648926, -1.1426877975463867, -2.207475185394287, -1.4450491666793823, -1.2727844715118408, -1.4799542427062988, -1.4137312173843384, -0.5670992136001587, -3.2650339603424072, 7.378058433532715, -2.9638445377349854, -1.081111192703247, -1.4430744647979736, -0.12499462813138962, -1.3237614631652832, -1.2641364336013794, 25.407005310058594, 4.2790398597717285, -2.311258554458618, -0.5953714847564697, 0.41318225860595703, -0.7834321856498718, -1.1685887575149536, 0.010291636921465397, -0.6072435975074768, 0.9716203212738037, -1.2918939590454102, 0.2121473252773285, -1.2694240808486938, 0.3396367132663727, -0.41624337434768677, -83.09402465820312, 0.7709457278251648, -37.80040740966797, -0.7723330855369568, 0.23276476562023163, 0.30428317189216614, 1.0283234119415283, 1.0044687986373901, -0.6878232955932617, -1.282426118850708, 0.9166584014892578, 0.30262649059295654, -1.3853543996810913, -1.4059345722198486, -1.9089149236679077, -1.4865010976791382, -1.0912668704986572, -0.3329261541366577, 5.820478439331055, -1.8723522424697876, 226.25360107421875, -1.0601497888565063, -2.2278172969818115, -1.8809983730316162, 18.64459991455078, -1.324453353881836, -185.19593811035156, -1.604863166809082, -0.3450887203216553, -0.23873785138130188, -4.564448833465576, 8.61242961883545, -0.44296693801879883, -2.0209810733795166, 1.2588388919830322, 18.957509994506836, 0.22489280998706818, 2.67502760887146, -0.2524420917034149, -1.750198245048523, -0.0713535025715828, 0.38324564695358276, -0.1691664308309555, 0.20342226326465607, -0.17250482738018036, -0.0994173139333725, -0.4241909980773926, -0.6622026562690735, -0.2032008022069931, 7.643695831298828, 0.36516329646110535, 0.022505857050418854, 1.0914068222045898, 0.6613244414329529, 0.5960760116577148, 1.1830830574035645, 0.9505797624588013, -0.2137775868177414, 0.3852855861186981, 0.20131807029247284, 0.37725454568862915, 0.2860073149204254, 1.1712936162948608, 0.7631077766418457, 0.36484646797180176, 0.9126747250556946, 0.2872623801231384, 0.6495153903961182, -0.9618628025054932, 0.7487784028053284, 0.23168718814849854, 0.7674897313117981, 0.385774165391922, 0.5935032367706299, 0.2931688129901886, 0.4898456633090973, -0.4582892954349518, 0.7778542637825012, -1.5934091806411743, 0.6740440726280212, -0.1486721932888031, 0.30820193886756897, 0.021947376430034637, 0.3179631233215332, 0.31545159220695496, -1.4557726383209229, -0.49720868468284607, 0.5027399063110352, 0.10336340218782425, 0.011729179881513119, 0.23809954524040222, 0.22493137419223785, -0.03418179601430893, 0.05231905356049538, -0.09845005720853806, 0.14920184016227722, 0.13844291865825653, 0.294969379901886, -0.11790864169597626, 0.0743807926774025, 0.11044170707464218, 0.019919605925679207, -0.13124306499958038, 0.11282692849636078, 0.018924791365861893, -0.06314593553543091, -0.28759080171585083, -0.31913653016090393, 0.08792795985937119, 0.2088247835636139, 0.5437398552894592, -0.7424893975257874, 0.22678695619106293, 0.4331795573234558, 0.6034470796585083, 0.38848546147346497, 0.30855226516723633, 0.09634286165237427, -6.851980686187744, 2.4281129837036133, 0.5386146306991577, -0.0704117864370346, 0.4102773368358612, 0.5053914785385132, -0.66060471534729, 0.3391190767288208, 0.26782163977622986, 0.2698085308074951, -0.07950277626514435, 0.15187831223011017, 0.37309354543685913, 0.33137819170951843, 0.16375945508480072, 0.28786933422088623, -0.3265060782432556, 0.09181403368711472, -0.15623581409454346, -0.8607839941978455, 1.155824065208435, 0.7093499898910522, -0.8884782791137695, -1.3143787384033203, 0.16392965614795685, -1.4178332090377808, 0.29729264974594116, 0.15227840840816498, 1.5919283628463745, 1.741304874420166, 0.5151142477989197, -1.4512939453125, -0.5040929913520813, -0.2583470046520233, -3.2900969982147217, -2.8938028812408447, -1.691943883895874, -5.340921401977539, -2.6091971397399902, -3.921100616455078, -1.714521050453186, -1.2627499103546143, -1.4050501585006714, -3.1522951126098633, -5.809540271759033, -3.2042012214660645, -1.4069846868515015, -1.6261558532714844, -1.6122939586639404, -3.523986577987671, -0.2875919044017792, -3.206855535507202, -1.2767186164855957, -2.688906192779541, -1.4667103290557861, -2.3743109703063965, -1.4705839157104492, -1.9569519758224487, -1.1054956912994385, -3.44683575630188, 0.1697864979505539, -3.02618145942688, -1.019812822341919, -1.266537070274353, -0.8594977855682373, -1.4542962312698364, -1.2575082778930664, -0.39963796734809875, 1.6845989227294922, -2.2143306732177734, -0.5011420845985413, 0.5701939463615417, -0.7805647850036621, -1.3741850852966309, -0.1352086067199707, -0.7554540038108826, 0.9084997177124023, -1.1479547023773193, 0.2256636768579483, -1.2273677587509155, 0.274618536233902, -0.27907174825668335, -0.3908369541168213, 0.5765394568443298, 0.15607663989067078, -0.8647779226303101, 0.2562597095966339, 0.45738667249679565, 1.0133880376815796, 0.9238247275352478, -0.4612041413784027, -1.3823575973510742, 0.7870680689811707, 0.41245537996292114, -1.3887417316436768, -1.3906465768814087, -1.9199610948562622, -1.4885333776474, -1.3261096477508545, -0.32818204164505005, -0.9589434862136841, -4.042566776275635, -7.011380672454834, -1.224815011024475, -1.9445774555206299, -2.026455879211426, -0.274452805519104, -1.2027039527893066, -0.811894953250885, -1.4582953453063965, -0.2804015874862671, -0.12942883372306824, -3.720458984375, -1.6627962589263916, -0.4425341784954071, -1.2907965183258057, 1.2594455480575562, -0.26118844747543335, 0.2786886394023895, 3.8813130855560303, -0.7261561751365662, -3.593240976333618, 0.3302586078643799, -1.7936766147613525, 4.231797218322754]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (1.54, 2.5)}}, 'et0_eta2': {'discriminator': {'threshold': 0.1499989151954651, 'nodes': [100, 7, 1], 'bias': [0.02897539548575878, -0.060969915241003036, 0.06634701788425446, 0.0544699989259243, -0.09812245517969131, -0.05099761113524437, 0.07674534618854523, 0.15951259434223175], 'weights': [-0.31444844603538513, -0.007974973879754543, 0.9767981171607971, 0.35912060737609863, 0.35773709416389465, -0.5487702488899231, 0.09982731938362122, 0.12788008153438568, 1.032709002494812, -1.904083013534546, -2.248551607131958, -1.6217820644378662, -0.23122698068618774, 0.29727718234062195, -0.7643448710441589, -0.6755456328392029, 2.9860918521881104, -0.6813769340515137, -0.7880873084068298, 0.0075999656692147255, 0.6813167333602905, -0.06051838770508766, 0.052355457097291946, 0.08054331690073013, 2.4868640899658203, 0.5442368984222412, 0.2716333568096161, 1.094430685043335, 2.226045608520508, 0.7167837023735046, 1.3470226526260376, -0.8734205961227417, -2.338249683380127, 0.5108520984649658, 0.9323012232780457, 0.8195506930351257, 1.7410813570022583, 0.2120186984539032, 0.9207930564880371, -1.0934228897094727, 0.3437107503414154, 0.5938838124275208, 0.6561219692230225, 1.4730861186981201, 0.8714040517807007, 0.8451336026191711, 0.66062331199646, 0.505739152431488, 1.5044615268707275, -1.7701197862625122, -0.028650322929024696, 0.5727477669715881, -3.205003023147583, 0.7880567312240601, 0.7176578044891357, 1.824846625328064, 1.4142401218414307, 0.8913534879684448, -1.9818415641784668, -2.3631978034973145, -0.07163838297128677, 0.33649447560310364, 0.4653497338294983, 0.31566813588142395, 0.37186628580093384, 0.4869270622730255, 0.04481872171163559, -6.84542989730835, -0.46517127752304077, -0.7622383236885071, 0.5973423719406128, 0.010064831003546715, -0.05368892475962639, -0.07345297932624817, 1.43589448928833, 0.4998248219490051, 0.8684946894645691, 0.5807375907897949, 0.3104188144207001, 0.10302061587572098, -0.2189861536026001, -0.372873455286026, 0.3355155885219574, 0.6526758074760437, -1.0521202087402344, -4.109001159667969, -0.13541299104690552, -0.18932859599590302, -0.6796913146972656, 0.5462668538093567, -0.1074884757399559, -0.18989868462085724, 0.814207911491394, -0.1715472787618637, 0.6011205315589905, 0.6105196475982666, 0.06973204761743546, -0.09578269720077515, -0.31661465764045715, 0.617203950881958, -0.19265924394130707, 0.12053674459457397, 0.974147617816925, 0.1614314615726471, 0.4581965506076813, -0.7592872977256775, 0.19167475402355194, 0.21580862998962402, 1.0244218111038208, -1.6844286918640137, -2.3509373664855957, -1.646841049194336, 0.5595585703849792, 0.3063804805278778, -0.7776933312416077, -0.7148526310920715, 3.0630366802215576, -0.749292254447937, -0.6619084477424622, 0.17203514277935028, 0.8771023750305176, -0.08928745239973068, 0.11115219444036484, 0.23463912308216095, 2.544220447540283, 0.5153621435165405, 0.3094092607498169, 1.1637088060379028, 2.124666690826416, 0.7888297438621521, 1.2978804111480713, -0.8465616703033447, -2.3852148056030273, 0.71919184923172, 1.0152634382247925, 0.8795061707496643, 1.7327245473861694, 0.38038262724876404, 0.6871808767318726, -1.1165032386779785, 0.48346737027168274, 0.5054036378860474, 0.6144312620162964, 1.4871852397918701, 0.7855807542800903, 0.7836456894874573, 0.6418640613555908, 0.5033224821090698, 1.3686096668243408, -1.9102201461791992, -0.1144571378827095, 0.3851611912250519, -3.126352548599243, 0.754887580871582, 0.6907877922058105, 1.7133334875106812, 1.358647346496582, 0.8958308696746826, -2.0305330753326416, -2.272655963897705, -0.24263274669647217, 0.24511389434337616, 0.33523690700531006, 0.34523364901542664, 0.22868919372558594, 0.43332818150520325, 0.127890944480896, -6.749431133270264, -0.5979211926460266, -0.6652582883834839, 0.42274075746536255, 0.023517845198512077, -0.01829851046204567, -0.04222530871629715, 1.469895362854004, 0.6764675974845886, 0.8317858576774597, 0.5895307064056396, 0.23711629211902618, 0.17798003554344177, -0.343845009803772, -0.5381394624710083, 0.13865022361278534, 0.6000189185142517, -1.0030326843261719, -4.007426738739014, -0.052062954753637314, -0.18938522040843964, -0.5671910047531128, 0.5872241258621216, 0.1895119547843933, -0.0008728714310564101, 0.7574934959411621, 0.029902983456850052, 0.9452706575393677, 0.6581463813781738, -0.02993658557534218, -0.03519058600068092, -0.4205071032047272, 0.6323032379150391, 0.36742377281188965, -0.14554525911808014, -0.8780345320701599, -0.369386225938797, -0.4107704162597656, 0.6359339356422424, -0.20659451186656952, -0.043877117335796356, -1.018278956413269, 1.6628787517547607, 2.247135639190674, 1.6568918228149414, -0.5677234530448914, -0.3028664290904999, 0.7126548886299133, 0.791175901889801, -3.059911012649536, 0.7927080392837524, 0.7249336838722229, 0.02634100802242756, -0.7237766981124878, -0.06197630614042282, -0.039514582604169846, -0.06623738259077072, -2.4259910583496094, -0.5086884498596191, -0.3519606590270996, -1.175911545753479, -1.1035706996917725, -0.7128134369850159, -1.351284384727478, 0.9043750762939453, 2.439188003540039, -0.6810190081596375, -0.921366274356842, -1.0221166610717773, -1.8235079050064087, -0.30437231063842773, -0.9019280672073364, 1.2759015560150146, -0.42603960633277893, -0.5799115300178528, -0.6890209913253784, -1.440889835357666, -0.8595443964004517, -0.9262452721595764, -0.5162779092788696, -0.5711930990219116, -1.4707610607147217, 1.8547927141189575, 0.0009237970225512981, -0.5780258774757385, 3.1636998653411865, -0.7997531890869141, -0.714714765548706, -1.802286982536316, -1.393869400024414, -0.7182701826095581, 2.1734135150909424, 2.36154842376709, 0.2521708607673645, -0.3996798098087311, -0.8413771986961365, -0.2846900522708893, -0.3506854176521301, -0.4397309720516205, 0.03405170887708664, 6.780691623687744, 0.6704962849617004, 0.8564925193786621, -0.47612154483795166, -0.4390150010585785, -0.08857692033052444, -0.08871271461248398, -1.5346685647964478, -0.6337047219276428, -0.8612844347953796, -0.5316849946975708, -0.25925248861312866, -0.06559115648269653, 0.34923067688941956, 0.39949578046798706, 0.06106622889637947, -0.5602529644966125, 1.0635648965835571, 4.144095420837402, -0.005170879885554314, 0.2176627665758133, 0.6373814344406128, -0.48048222064971924, -0.07527250796556473, 0.07763375341892242, -0.8213342428207397, -0.01599724404513836, -0.6789261102676392, -0.5999417304992676, 0.040403690189123154, 0.0933663621544838, 0.5129363536834717, -0.552228569984436, 0.25342461466789246, 0.064550019800663, -0.7719321250915527, -0.254232257604599, -0.37257328629493713, 0.5826165080070496, -0.2827109396457672, -0.07808215171098709, -1.1532353162765503, 1.7887396812438965, 2.3549227714538574, 1.544877290725708, -0.5747133493423462, -0.44456446170806885, 0.6890226006507874, 0.7301904559135437, -3.0897836685180664, 0.6887918710708618, 0.6325669884681702, -0.1914738267660141, -0.9138544797897339, -0.04270365461707115, -0.09455379098653793, -0.20914599299430847, -2.5104267597198486, -0.48681962490081787, -0.16458961367607117, -1.1317005157470703, -1.0096282958984375, -0.8340103030204773, -1.417182445526123, 0.8875043392181396, 2.2778992652893066, -0.8808652758598328, -1.0732719898223877, -0.8950208425521851, -1.8264819383621216, -0.28220537304878235, -0.812218427658081, 1.1411540508270264, -0.4348108470439911, -0.6162168383598328, -0.6855888366699219, -1.459834337234497, -0.7873580455780029, -0.9496245980262756, -0.8507062196731567, -0.9182076454162598, -1.3478670120239258, 1.9358686208724976, 0.12279247492551804, -0.3950200378894806, 3.013859510421753, -0.7361040115356445, -0.6690075397491455, -1.7863739728927612, -1.305168628692627, -0.7409262657165527, 1.9833468198776245, 2.294002056121826, 0.10513488203287125, -0.4054502546787262, -0.5201694369316101, -0.34282538294792175, -0.3061125874519348, -0.42904797196388245, -0.14717519283294678, 6.825473308563232, 0.4531589150428772, 0.7681583762168884, -0.5692703723907471, -0.11347512900829315, 0.016534041613340378, 0.07176008820533752, -1.5263510942459106, -0.6861600279808044, -0.9743805527687073, -0.6032975912094116, -0.26303204894065857, -0.05260995402932167, 0.36187732219696045, 0.5144113898277283, 0.006863786838948727, -0.4472571313381195, 0.9919403791427612, 4.13241720199585, 0.12055417895317078, 0.23792202770709991, 0.5998636484146118, -0.5416392087936401, -0.12574274837970734, 0.1432696133852005, -0.6380724906921387, 0.09612179547548294, -0.6746088266372681, -0.6222988367080688, -0.08698374032974243, -0.08036011457443237, 0.5385463237762451, -0.646765947341919, 0.18152303993701935, 0.007718496955931187, -0.9017154574394226, -0.15950575470924377, -0.43577849864959717, 0.6454395651817322, -0.30594679713249207, -0.07777499407529831, -0.2768642008304596, 1.8883517980575562, 2.3471567630767822, 1.7210108041763306, 0.2697894871234894, -0.4556847810745239, 0.7949007153511047, 0.6492237448692322, -2.9696013927459717, 0.8122413158416748, 0.7689918279647827, -0.09277377277612686, -0.8445194959640503, -0.14155295491218567, -0.10827150195837021, 0.021438149735331535, -2.5556159019470215, -0.5210983753204346, -0.3694680631160736, -1.0982404947280884, -2.1612095832824707, -0.8739190697669983, -1.3987609148025513, 0.8075590133666992, 2.424760341644287, -0.4959585964679718, -1.3643627166748047, -0.8088565468788147, -1.8851650953292847, -0.29065799713134766, -0.8622208833694458, 1.141046166419983, -0.4537082016468048, -0.4950883984565735, -0.7654668688774109, -1.2891098260879517, -0.7138290405273438, -0.6684709191322327, -0.5007423162460327, -0.5878694653511047, -1.456843376159668, 1.9087945222854614, 0.1175469160079956, -0.4605148732662201, 3.1904404163360596, -0.757300853729248, -0.7752445936203003, -1.885115623474121, -1.3575143814086914, -0.7935184240341187, 2.148690700531006, 2.2285685539245605, 0.27148741483688354, -0.21915796399116516, -0.4096425175666809, 0.2009628415107727, -0.2413228303194046, -0.5621650815010071, -0.006187445018440485, 6.8341193199157715, 0.5674905180931091, 0.8719193339347839, -0.56325364112854, -0.015516220591962337, -0.04328717663884163, 0.0011602623853832483, -1.5135656595230103, -0.695424497127533, -0.7663698196411133, -0.5022937655448914, -0.3319525420665741, -0.20945343375205994, 0.1814481019973755, 0.4380049407482147, -0.29913362860679626, -0.44858255982398987, 1.1502363681793213, 3.727433204650879, 0.005669411271810532, -0.43110281229019165, 0.5008920431137085, -0.30187368392944336, 0.12769964337348938, 0.2131757289171219, -0.6690605878829956, -0.009350295178592205, -0.5499063730239868, -0.5896272659301758, -0.06904992461204529, -0.07056774199008942, 0.32389965653419495, -0.1490631401538849, -0.34620583057403564, 0.021604102104902267, 0.8964369297027588, 0.33745077252388, 0.24696482717990875, -0.6392362713813782, 0.23555251955986023, 0.20643915235996246, 0.9265234470367432, -1.5724503993988037, -2.2478573322296143, -1.6098995208740234, 0.7351807355880737, 0.44913777709007263, -0.7584468722343445, -0.7800948023796082, 3.1549291610717773, -0.6995084285736084, -0.7747853398323059, 0.1850854456424713, 0.684406042098999, -0.023160457611083984, 0.0527169294655323, 0.05131242424249649, 2.599490165710449, 0.5896647572517395, 0.2364015430212021, 1.0115768909454346, 1.0914065837860107, 0.7217136025428772, 1.275020718574524, -0.8868167400360107, -2.315732002258301, 0.8515210747718811, 1.1454874277114868, 0.9732614755630493, 1.7522085905075073, 0.31894785165786743, 0.7771338224411011, -1.200458288192749, 0.44616082310676575, 0.462900847196579, 0.8029491901397705, 1.3899693489074707, 0.6503082513809204, 0.9858700633049011, 0.7423867583274841, 0.8579938411712646, 1.3850865364074707, -1.944483757019043, 0.05228741094470024, 0.4444732964038849, -3.100029230117798, 0.6276625394821167, 0.8047358989715576, 1.800484299659729, 1.311264991760254, 0.9312310218811035, -2.101048469543457, -2.217818021774292, -0.2688087522983551, 0.3872702419757843, 0.7641764879226685, 0.3830004632472992, 0.2702789902687073, 0.34814348816871643, 0.023908797651529312, -6.693897724151611, -0.509006917476654, -0.6848273277282715, 0.3998594284057617, 0.3821243941783905, -0.0748259648680687, 0.11787129193544388, 1.4353647232055664, 0.4791247546672821, 0.9585753083229065, 0.6225333213806152, 0.23746784031391144, 0.08571476489305496, -0.33956611156463623, -0.37658610939979553, 0.06400368362665176, 0.6250810027122498, -1.2042359113693237, -4.167503356933594, -0.17030271887779236, -0.2024393230676651, -0.686327338218689, 0.6158691048622131, -0.004272652789950371, -0.15172500908374786, 0.7058130502700806, -0.1492621749639511, 0.8377251029014587, 0.6425130367279053, -0.0587550513446331, -0.011186622083187103, -0.3750644028186798, 0.45686501264572144, 0.39105644822120667, -0.025475554168224335, -0.9448084235191345, -0.17672255635261536, -0.3310766816139221, 0.6198084950447083, -0.12551653385162354, -0.17280590534210205, -1.0382109880447388, 1.7992517948150635, 2.3504867553710938, 1.5589361190795898, -0.6244323253631592, -0.545194149017334, 0.6514461636543274, 0.8150684237480164, -3.042853355407715, 0.7147244215011597, 0.6197592616081238, -0.20456333458423615, -0.7576584815979004, -0.07558997720479965, -0.03151063248515129, -0.042013317346572876, -2.555046558380127, -0.5121866464614868, -0.35546499490737915, -1.031944751739502, -1.0589368343353271, -0.906965434551239, -1.4501054286956787, 0.7234553098678589, 2.3673014640808105, -0.834284245967865, -1.1588187217712402, -1.0165021419525146, -1.7437015771865845, -0.21355247497558594, -0.7760430574417114, 1.0865788459777832, -0.35465338826179504, -0.5834845900535583, -0.7270978689193726, -1.4284029006958008, -0.7141002416610718, -0.7763300538063049, -1.0142265558242798, -1.0503994226455688, -1.4010200500488281, 1.785997748374939, -0.023478718474507332, -0.5443571209907532, 3.083482027053833, -0.5669548511505127, -0.9035919904708862, -1.7623683214187622, -1.4137661457061768, -0.9140440225601196, 2.1081018447875977, 2.3884761333465576, 0.11144188791513443, -0.3146120011806488, -0.7461819648742676, -0.2481086552143097, -0.16968579590320587, -0.3327823579311371, 0.0784405842423439, 6.792299747467041, 0.6190653443336487, 0.7775694727897644, -0.4046388268470764, -0.4212479293346405, 0.050741661339998245, -0.05749735236167908, -1.502224087715149, -0.5707641243934631, -0.9293507933616638, -0.46286097168922424, -0.280815452337265, -0.061725880950689316, 0.3514498472213745, 0.35134655237197876, -0.150596484541893, -0.6404426693916321, 0.9990173578262329, 3.992751359939575, 0.20375502109527588, 0.13540880382061005, 0.5394612550735474, -0.5991140007972717, -0.13278932869434357, 0.08818145096302032, -0.8440395593643188, 0.01949687860906124, -1.0070663690567017, -0.43945908546447754, -0.0663471668958664, -0.06650318205356598, 0.4358328878879547, -0.46121084690093994, -1.9063987731933594, -0.6755901575088501, 0.7471257448196411, 0.683555543422699, 0.8501876592636108, -0.7736931443214417, 0.8787028193473816]}, 'datecode': '2016-10-18 17:02', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (0, 20), 'etaBin': (1.37, 1.54)}}, 'et4_eta1': {'discriminator': {'threshold': 0.43499864339828492, 'nodes': [100, 5, 1], 'bias': [-0.006794690620154142, -0.1554284542798996, -0.3984045386314392, 0.030208555981516838, -0.10840713977813721, -0.14096811413764954], 'weights': [-1.7999227046966553, -1.027034878730774, 1.5167815685272217, 1.3038241863250732, 1.0221314430236816, 1.30545973777771, -0.8648515939712524, -1.0125584602355957, -1.7937843799591064, -2.820099353790283, 0.2814648151397705, 0.5318836569786072, 0.5089548826217651, 5.107941150665283, 4.707424163818359, 10.953789710998535, 9.580018997192383, 6.9715094566345215, 7.283199787139893, 7.441274642944336, 7.319461345672607, 7.384079933166504, 10.955340385437012, 6.394368648529053, 4.812088966369629, 4.612451076507568, 4.57286262512207, 8.837888717651367, 6.0176286697387695, 4.635505199432373, 4.066656589508057, 2.8422253131866455, 4.092710971832275, 4.315120697021484, 3.0796291828155518, 2.271243095397949, 0.3258189260959625, 2.9608850479125977, 4.199531078338623, 2.9192416667938232, 2.390683889389038, 2.393772602081299, 3.086351156234741, -4.281545639038086, -0.27714815735816956, 2.386082410812378, -1.8600664138793945, 0.5252542495727539, 0.7647185921669006, -1.2609208822250366, -2.265915632247925, -4.432082653045654, 2.5929415225982666, 1.3052434921264648, 0.9118005037307739, -0.11201512068510056, 3.186361074447632, 1.0065803527832031, 0.7002419829368591, -2.3315236568450928, -1.2701539993286133, -4.695784091949463, 0.8107354640960693, 4.077216148376465, -1.2741401195526123, -1.6601881980895996, -0.9998442530632019, 2.0348238945007324, -1.7414342164993286, 0.7748311161994934, 0.10149277001619339, 1.1885353326797485, -1.001505732536316, -0.2078997641801834, 1.7877411842346191, 3.9085121154785156, 4.058349609375, 3.022414207458496, 1.167700171470642, 0.8763085603713989, 5.2606072425842285, 6.248317718505859, 7.434049129486084, 6.32707405090332, 5.177743911743164, 1.253045678138733, 3.2860896587371826, 4.109064102172852, 3.6760289669036865, 2.5070691108703613, 0.16121390461921692, -0.3287222683429718, 9.529077529907227, 5.444869041442871, 2.950199842453003, 1.7038172483444214, 3.7537684440612793, 4.954484939575195, 1.5676814317703247, 0.43348121643066406, 1.9155974388122559, -0.27084213495254517, -1.8248854875564575, -1.8497902154922485, -0.48866498470306396, -1.2326923608779907, -0.7088906764984131, -0.3377949297428131, 2.383814573287964, 2.227478265762329, 4.464389801025391, 0.2766726315021515, 0.09003609418869019, -1.466630220413208, -1.7234777212142944, -5.583449840545654, -4.656095027923584, -6.059502601623535, -5.832686424255371, -5.874022483825684, -5.76144552230835, -5.927149772644043, -4.147836208343506, -6.162843704223633, -4.859310150146484, -4.424472808837891, -4.334743022918701, -5.037566184997559, -5.423601150512695, -3.8823442459106445, -4.021630764007568, -3.7493598461151123, -3.977189302444458, -4.179591178894043, -3.0509562492370605, -3.055844783782959, -2.249603271484375, -3.1172916889190674, -4.28181266784668, -3.141746997833252, -2.578383207321167, -2.4541687965393066, -3.008423328399658, 3.0007166862487793, -0.8047334551811218, 1.444414734840393, 1.9381978511810303, -0.5315545201301575, -0.8709000945091248, -1.3247100114822388, -1.6892642974853516, 4.959435939788818, 0.4229227602481842, -1.4444005489349365, -0.9399492740631104, 0.13651129603385925, -1.2663679122924805, -1.0414769649505615, -0.3001660108566284, 2.391136407852173, 1.2387099266052246, 5.031053066253662, -0.813446044921875, 2.007856607437134, 1.3512825965881348, 1.6835397481918335, 1.424838662147522, -0.5842573046684265, 1.823012113571167, -0.5202951431274414, -0.9089785814285278, -1.0309703350067139, 1.2853267192840576, 0.1413520872592926, -2.0295960903167725, -4.015827178955078, -4.124287128448486, -3.0098304748535156, -1.6257693767547607, -0.790565550327301, -8.66431713104248, -6.247581481933594, -5.837586879730225, -4.8163886070251465, -4.966397285461426, -3.8456342220306396, -3.212890625, -4.001729488372803, -3.8169500827789307, -3.0062172412872314, -0.01592959091067314, 0.331468790769577, -8.44169807434082, -5.0702314376831055, -3.0035383701324463, -1.620993733406067, -4.026189804077148, -4.6726484298706055, -2.8539879322052, -1.3541570901870728, 1.5974605083465576, 1.9344853162765503, -0.5923197865486145, -0.5208407640457153, 1.3568525314331055, 1.4686882495880127, 0.46828562021255493, 0.6234206557273865, 1.6291574239730835, 3.773839235305786, -2.2849690914154053, -0.0173037126660347, -0.6913514137268066, -2.2018117904663086, -2.005866527557373, -1.1781272888183594, -1.0746055841445923, -2.960521936416626, -3.020195960998535, -3.291041612625122, -3.1039140224456787, -3.1437220573425293, -3.365147590637207, -2.7703027725219727, -2.0528550148010254, -1.8534427881240845, -1.9343363046646118, -3.7497124671936035, -2.482781171798706, -1.8200953006744385, -1.5440616607666016, -1.1102930307388306, -1.817267894744873, -1.8834421634674072, -1.1623601913452148, -0.9870098233222961, -0.010297157801687717, -1.1041889190673828, -1.671156883239746, -1.2849154472351074, -0.8064302206039429, -0.991357147693634, -1.1975551843643188, -0.10585328191518784, 0.3697037100791931, -0.556940495967865, -0.15853485465049744, -0.034072861075401306, -0.42182764410972595, 0.7920054197311401, 1.2212443351745605, 2.1734256744384766, -1.0674257278442383, 0.40708163380622864, 1.3429632186889648, 0.32503095269203186, -2.000063896179199, -0.30996984243392944, -0.09442844241857529, 1.2394380569458008, 0.6918144822120667, 2.3371236324310303, 2.3947508335113525, -1.6665288209915161, 1.0100497007369995, 1.0625598430633545, 0.7157778739929199, -0.7973801493644714, 1.003158450126648, -0.2244928777217865, -0.23057889938354492, -0.25567328929901123, 0.26687583327293396, 0.5571849942207336, -0.8021562099456787, -0.9193214178085327, -1.7109324932098389, -1.3166331052780151, -0.056996699422597885, -0.3299941420555115, -2.3191375732421875, -2.720602035522461, -3.1226112842559814, -2.6633172035217285, -2.2291204929351807, -0.5240607857704163, -1.3279191255569458, -1.5835566520690918, -1.4658986330032349, -1.0713777542114258, -0.3082595467567444, 0.4604063332080841, -4.250147342681885, -2.1554455757141113, -1.1069138050079346, -0.11036043614149094, -1.5041146278381348, -1.9783992767333984, -0.34503164887428284, -0.10214173793792725, -1.938421607017517, -1.0800155401229858, 1.4481016397476196, 1.524210810661316, 1.0090358257293701, 1.4126237630844116, 0.8840153813362122, -0.8710037469863892, -3.8382015228271484, -2.941593647003174, 0.26305797696113586, 0.5373278856277466, 0.6271727681159973, 5.087252140045166, 4.527551174163818, 11.104263305664062, 9.684577941894531, 6.9155778884887695, 7.264986515045166, 7.306527137756348, 7.2929253578186035, 7.236979007720947, 10.854584693908691, 6.553384780883789, 4.738665580749512, 4.4313812255859375, 4.579624652862549, 8.656661987304688, 5.997731685638428, 4.638885974884033, 4.00109338760376, 2.936990976333618, 4.047165393829346, 4.184921741485596, 2.9954614639282227, 2.2098889350891113, 0.3068324625492096, 2.9505794048309326, 4.352214813232422, 3.034167528152466, 2.4667346477508545, 2.46748948097229, 2.969614267349243, -4.291418075561523, -0.24009820818901062, 2.3423354625701904, -1.9760377407073975, 0.44410112500190735, 0.6611433625221252, -1.142242670059204, -2.1912992000579834, -4.314085006713867, 2.5685765743255615, 1.4943268299102783, 0.9407423734664917, -0.21247321367263794, 3.203758478164673, 1.0463519096374512, 0.6714291572570801, -2.343329429626465, -1.222947359085083, -4.786113262176514, 0.8974404335021973, 4.074822425842285, -1.2417911291122437, -1.661712884902954, -1.067645788192749, 2.0441198348999023, -1.7505759000778198, 0.7762546539306641, 0.2216433435678482, 1.0408440828323364, -0.9313820004463196, -0.19841738045215607, 1.8793439865112305, 4.019741535186768, 4.018013954162598, 2.993985414505005, 1.201834797859192, 0.9852899312973022, 5.097991466522217, 6.315361022949219, 7.412949562072754, 6.136035919189453, 5.180999755859375, 1.2649462223052979, 3.2474563121795654, 4.1203389167785645, 3.7236316204071045, 2.692964792251587, 0.16463275253772736, -0.23796097934246063, 9.620084762573242, 5.165962219238281, 3.042635679244995, 1.5743240118026733, 3.593649387359619, 4.726230621337891, 1.7003471851348877, 0.518455982208252, -0.4016145169734955, -1.1008011102676392, 0.317803293466568, 0.28608277440071106, 0.32597100734710693, 0.45084553956985474, -0.07374785095453262, -0.12140609323978424, -0.7596582174301147, -0.6700848340988159, 0.9180830121040344, 0.17629995942115784, 0.3709384500980377, 1.237718105316162, 1.0335623025894165, 1.8659745454788208, 1.5641096830368042, 1.5010194778442383, 1.4791438579559326, 1.5595364570617676, 1.4915823936462402, 1.641279935836792, 1.5178728103637695, 1.3930697441101074, 0.9667136073112488, 1.000006914138794, 1.079171895980835, 1.8384828567504883, 1.255077838897705, 0.9240754246711731, 0.940382182598114, 0.5644510388374329, 0.9919483065605164, 1.055948257446289, 0.6073247194290161, 0.6412028670310974, 0.2344931662082672, 0.7457457780838013, 0.9121500849723816, 0.7754244804382324, 0.4824374318122864, 0.6844104528427124, 0.7171680927276611, -0.7123866081237793, 0.08371774107217789, 0.6915780305862427, -0.22039438784122467, 0.09132708609104156, 0.1909630447626114, -0.06418135017156601, -0.3973239064216614, 0.16872800886631012, 0.7118033170700073, 0.38794857263565063, 0.33103108406066895, -0.05470170080661774, 0.5033832788467407, 0.3071689009666443, 0.18335385620594025, -0.4761725962162018, -0.1390201449394226, -0.7718136310577393, 0.20810943841934204, 0.8809258937835693, -0.11245188117027283, -0.3263871371746063, -0.22725363075733185, 0.5411223769187927, -0.15130744874477386, 0.2490055114030838, 0.082724928855896, 0.3128555417060852, -0.373563677072525, -0.08090195804834366, 0.45042020082473755, 0.7943832874298096, 1.0029401779174805, 0.6371498107910156, 0.26931270956993103, 0.1977020800113678, 1.0659189224243164, 1.3883217573165894, 1.6231980323791504, 1.4670684337615967, 1.0528758764266968, 0.31061288714408875, 0.8662287592887878, 0.8216555118560791, 0.9152927398681641, 0.5646606683731079, 0.07351450622081757, -0.04422774538397789, 1.976365089416504, 1.1628947257995605, 0.7537108659744263, 0.3191155791282654, 0.9357360005378723, 1.1520085334777832, -0.09915212541818619, 0.28015679121017456, -1.47908353805542, -5.043899059295654, 1.3066630363464355, -8.05117416381836, -1.4243520498275757]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0.8, 1.37)}}, 'et4_eta3': {'discriminator': {'threshold': 0.42499865293502809, 'nodes': [100, 5, 1], 'bias': [0.10244271904230118, -0.026634719222784042, -0.027671828866004944, -0.11646553128957748, -0.0258479006588459, -0.23860521614551544], 'weights': [2.1136536598205566, 2.4761157035827637, -1.3354885578155518, -2.1343538761138916, -1.1735503673553467, -0.47224685549736023, 1.0595214366912842, -1.2222939729690552, 2.3140790462493896, 1.6813380718231201, 0.6189742684364319, -3.9977757930755615, -0.8143018484115601, -0.1061888113617897, -4.447263717651367, -5.6257452964782715, -2.7986018657684326, -6.704593658447266, -5.6314496994018555, -8.470595359802246, -3.464118480682373, -2.936347246170044, -2.4384608268737793, -8.164268493652344, -7.307194232940674, 0.27701619267463684, -2.2832694053649902, -7.54141092300415, -3.060548782348633, -4.162448883056641, -0.8520064949989319, -4.523809432983398, -2.304520845413208, -6.090267658233643, -2.2615864276885986, -4.290173053741455, -2.205183982849121, -2.169804573059082, -2.0118966102600098, -3.0833938121795654, 0.018090147525072098, -3.1861417293548584, 0.1231064423918724, -3.103140354156494, -0.29170987010002136, -1.815237045288086, -0.7281785011291504, -2.0659029483795166, 3.505709171295166, -2.0389456748962402, 0.6046255826950073, -1.3204889297485352, 1.9987943172454834, 3.2374703884124756, 1.3518534898757935, -1.6912293434143066, 4.667560577392578, -0.3907375633716583, 1.0986171960830688, -6.122414588928223, -0.08550530672073364, -1.7563936710357666, 1.0574041604995728, -1.828696608543396, 4.339155673980713, -1.344999074935913, -0.3004172742366791, -2.09759783744812, -0.899025559425354, -2.705749034881592, -1.429856538772583, -2.304187297821045, 0.5561367273330688, 0.4578809142112732, -2.1317460536956787, -2.1856703758239746, -2.2690391540527344, -2.1190686225891113, -1.5095014572143555, -0.742570698261261, -1.509751558303833, -2.2176427841186523, -13.434452056884766, -5.1173095703125, -2.595923900604248, -1.789684772491455, -1.9907029867172241, -2.071993350982666, -0.687940239906311, -2.993159770965576, -0.9220067262649536, -1.0641709566116333, -8.194657325744629, -3.4413692951202393, -0.4580751359462738, -1.7424548864364624, -1.2552765607833862, 0.010018037632107735, -0.4191332459449768, -1.4578543901443481, -2.115049362182617, -2.398184061050415, 1.4441759586334229, 2.0071306228637695, 1.2278002500534058, 0.42092978954315186, -0.6694797873497009, 1.3636431694030762, -2.4132156372070312, -1.0785812139511108, -0.654043972492218, 4.0377326011657715, 0.7583564519882202, 0.10480508208274841, 5.242630958557129, 5.689621925354004, 2.6909446716308594, 6.801192760467529, 5.60910177230835, 8.38937759399414, 8.718599319458008, 2.0788073539733887, 2.23823881149292, 8.17409610748291, 7.450192451477051, 3.954339027404785, 2.0829038619995117, 7.580160140991211, 3.045069932937622, 4.2243332862854, 1.0374382734298706, 4.511968612670898, 2.166616678237915, 5.162961959838867, 2.372391939163208, 4.462983131408691, 2.1679937839508057, 2.0365359783172607, 2.0696470737457275, 3.3711631298065186, 0.05041453242301941, 3.205158233642578, 0.8907615542411804, 3.0509016513824463, 0.35105249285697937, 1.9714038372039795, 0.8271780610084534, 2.0119431018829346, -2.7213120460510254, 2.012510061264038, -0.59637051820755, 1.2845218181610107, -1.8807774782180786, -3.1734073162078857, -1.3776136636734009, 1.7171220779418945, -4.140094757080078, 0.43026307225227356, -1.132845163345337, 6.066633224487305, 0.17703993618488312, 1.8853768110275269, -1.108108639717102, 2.038774013519287, -4.435719013214111, 1.3822416067123413, 0.42699965834617615, 2.2038395404815674, 0.8026497960090637, 3.318131446838379, 1.2378698587417603, 2.1552581787109375, -1.622920274734497, -0.06758100539445877, 2.2439637184143066, 2.1693456172943115, 2.299821615219116, 2.2396175861358643, 1.6990301609039307, 0.8935832381248474, 2.048569917678833, 2.1562492847442627, 9.985710144042969, 5.1122918128967285, 4.914822578430176, 1.878947377204895, 2.068976640701294, 2.03466534614563, -3.1008622646331787, 2.884702205657959, 0.8316497206687927, 1.0190722942352295, 7.438014507293701, 3.340212345123291, 0.36704349517822266, 1.803732991218567, 0.9005705118179321, 0.026195265352725983, 0.9331294298171997, 1.4886400699615479, -2.242891311645508, -2.551076650619507, 1.4809571504592896, 2.238367795944214, 1.4156361818313599, 0.4944586157798767, -0.9664744138717651, 1.3584625720977783, -2.4787468910217285, -2.2724645137786865, -0.5287601351737976, 4.111442565917969, 0.6733664274215698, -0.03702039271593094, 4.495578289031982, 5.7202863693237305, 2.8017024993896484, 6.816144943237305, 5.799431324005127, 8.432250022888184, 3.287015199661255, 2.8676507472991943, 2.196160316467285, 8.338970184326172, 7.510587692260742, -0.20106478035449982, 2.0992941856384277, 7.659865856170654, 3.217709541320801, 4.208213806152344, 1.0480554103851318, 4.542307376861572, 2.265922784805298, 6.185456275939941, 2.393498420715332, 4.5030412673950195, 2.059751272201538, 2.1484198570251465, 2.1146152019500732, 3.019162178039551, -0.11174126714468002, 3.1327524185180664, -0.08307851850986481, 3.114877700805664, 0.341488778591156, 1.9128708839416504, 0.5881271362304688, 2.128124475479126, -3.35807728767395, 2.0762782096862793, -0.5713495016098022, 1.3524963855743408, -2.0395641326904297, -3.2001678943634033, -1.3914719820022583, 1.5958410501480103, -4.563697338104248, 0.4134733974933624, -1.06615149974823, 6.13709831237793, 0.06818988174200058, 1.8502658605575562, -1.3920928239822388, 1.8773846626281738, -4.271185874938965, 1.2731740474700928, 0.3156578242778778, 2.02909255027771, 0.8152152895927429, 5.316812992095947, 1.2877037525177002, 2.1201581954956055, -0.4915796220302582, -0.6078155040740967, 2.202939748764038, 2.053640127182007, 2.2646613121032715, 2.059619426727295, 1.4302775859832764, 0.9473094344139099, 1.4782090187072754, 2.1622867584228516, 9.86046314239502, 5.054417133331299, 2.245720863342285, 1.9868146181106567, 2.0787513256073, 2.1578099727630615, 0.6623260974884033, 2.8673501014709473, 0.7761743068695068, 1.106217384338379, 8.041617393493652, 3.436439275741577, 0.30246272683143616, 1.6667946577072144, 1.0801926851272583, -0.15979406237602234, 0.8684966564178467, 1.4452787637710571, -142.03860473632812, 1.9209511280059814, -1.4678245782852173, -2.176791191101074, -1.36861252784729, -0.5441265106201172, 0.7711635828018188, 9.741856575012207, 2.471639633178711, 4.0471720695495605, 0.6153625845909119, -2.9475879669189453, -0.5559614896774292, 5.189255714416504, -5.787713050842285, 3.5091118812561035, -2.64949893951416, 60.66307067871094, -5.6393351554870605, 59.194366455078125, -8.789266586303711, -0.28474676609039307, -2.2303760051727295, -8.293728828430176, -7.3675312995910645, -3.7747671604156494, 7.462562084197998, -7.0675859451293945, -3.0233042240142822, 4.3458333015441895, -1.0345925092697144, -2.9636011123657227, -2.2457046508789062, -5.228454113006592, -2.309159278869629, -3.00010085105896, -2.1044833660125732, -0.8779270648956299, -1.9660024642944336, -3.2438900470733643, -0.07719025760889053, -3.0831034183502197, 5.522830009460449, -3.0399866104125977, -0.26664799451828003, -1.8533949851989746, -0.9435549974441528, -2.143346071243286, 2.924920082092285, -2.0373075008392334, 0.3517892062664032, -1.4308514595031738, 1.8721117973327637, 3.143479824066162, 1.3025211095809937, -1.8728183507919312, 4.106044292449951, -0.3792337477207184, 0.9321981072425842, -6.085890293121338, -0.23069553077220917, -1.915037751197815, 1.0746597051620483, -1.9125007390975952, 4.342075347900391, -1.3776702880859375, -0.5140342116355896, -2.228787660598755, -0.8907374739646912, -2.615466833114624, -1.2966004610061646, -2.0413265228271484, 1.7899733781814575, 0.5288868546485901, -2.090083360671997, -2.2000763416290283, -2.1760451793670654, -2.088895082473755, -1.6077251434326172, -0.8657386302947998, 18.871570587158203, -1.9380265474319458, -13.092113494873047, -4.997984409332275, -4.738004207611084, -1.958965539932251, -2.112590789794922, -2.1513755321502686, -88.76246643066406, -17.29631233215332, -1.2429815530776978, -0.9369333386421204, -7.299914836883545, -3.3198277950286865, -0.4131157696247101, -1.92756187915802, -0.8283920288085938, 0.10012806951999664, -1.0590925216674805, -1.5049571990966797, -2.0256004333496094, -2.5168638229370117, 1.301788568496704, 2.200427532196045, 1.1756267547607422, 0.514249324798584, -1.042991042137146, 1.333069920539856, -2.4084813594818115, -2.1737043857574463, -0.6555187702178955, 3.9782373905181885, 0.6623839139938354, -0.035289861261844635, 4.552762985229492, 5.56650972366333, 2.6981701850891113, 6.703571319580078, 5.752769947052002, 8.487652778625488, 3.302428722381592, 2.899444341659546, 2.264791965484619, 8.146153450012207, 7.5582122802734375, -0.26566651463508606, 2.252723217010498, 7.596414089202881, 3.1182103157043457, 4.093232154846191, 0.8007409572601318, 4.4159111976623535, 2.208712577819824, 6.049647808074951, 2.221940279006958, 4.450047016143799, 2.204908847808838, 2.144577980041504, 2.0289366245269775, 2.9903759956359863, -0.024109508842229843, 3.1645309925079346, -0.23779073357582092, 3.198810338973999, 0.3822338283061981, 1.8081729412078857, 0.5110057592391968, 2.058108329772949, -3.3312489986419678, 2.1967084407806396, -0.5932506322860718, 1.4020277261734009, -2.131554126739502, -3.1461503505706787, -1.2905434370040894, 1.544182300567627, -4.567009449005127, 0.4236147701740265, -0.9370492100715637, 6.027017593383789, 0.20755675435066223, 1.9110465049743652, -1.384356141090393, 1.9522731304168701, -4.4787397384643555, 1.3535667657852173, 0.3302721083164215, 2.2109057903289795, 0.8844916820526123, 5.253039836883545, 1.4480197429656982, 2.2843456268310547, -0.5308747887611389, -0.5522910952568054, 2.206855058670044, 2.0478646755218506, 2.1654529571533203, 2.2306225299835205, 1.3617877960205078, 0.8822181820869446, 1.525431513786316, 2.0791828632354736, 13.402020454406738, 5.2538652420043945, 2.544570207595825, 1.820676326751709, 1.9823253154754639, 2.125417947769165, 0.7496980428695679, 2.892738103866577, 0.8779227137565613, 1.0895835161209106, 8.246766090393066, 3.4497177600860596, 0.3534480631351471, 1.908599615097046, 1.0185743570327759, -0.08690472692251205, 0.44496309757232666, 1.4602241516113281, 1.7230116128921509, -0.08106107264757156, -2.1638827323913574, 0.417394757270813, -2.439040184020996]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (1.54, 2.5)}}, 'et3_eta0': {'discriminator': {'threshold': 0.42499865293502809, 'nodes': [100, 5, 1], 'bias': [-0.1838398277759552, 0.008611112833023071, 0.18154369294643402, 0.023585721850395203, -0.035233061760663986, 0.19036158919334412], 'weights': [4.017240047454834, 1.901187777519226, -0.294178307056427, -0.08676494657993317, 0.6386704444885254, 0.26069581508636475, 0.4465356171131134, 0.6096044778823853, 1.518546462059021, 2.2324438095092773, -2.307410478591919, -5.6883015632629395, -2.416430950164795, -0.5659266114234924, -1.99880051612854, -1.188903570175171, -4.143251419067383, -4.194454669952393, -3.770979404449463, -3.602367639541626, -4.060153961181641, -3.8789095878601074, -2.8690292835235596, -1.0932801961898804, -3.167452335357666, -1.913938045501709, -2.9928972721099854, -2.8793139457702637, -2.1918280124664307, -2.0739057064056396, -0.3669455945491791, -0.953891932964325, -1.7267831563949585, -1.0764167308807373, -2.0238027572631836, -1.078501582145691, -1.0553325414657593, -0.8950349688529968, -1.080519199371338, -1.1914687156677246, -1.0000526905059814, -1.2180471420288086, -0.5844687819480896, 0.8340210914611816, -0.04327065870165825, -2.5265517234802246, -1.110429286956787, -1.8567613363265991, -0.8584017753601074, -0.9068220257759094, -1.8937453031539917, 2.2211856842041016, 0.5059202909469604, 0.5171898603439331, -0.48264437913894653, -0.4789438247680664, -0.014382182620465755, 0.6536459922790527, -1.3602056503295898, -2.2299585342407227, -0.7366456389427185, 0.6679100394248962, 0.3166215717792511, 0.261661559343338, 1.1499239206314087, 2.046154499053955, -0.18762975931167603, 0.3376421332359314, -0.16516658663749695, -1.997430443763733, 0.0856507271528244, 0.13066110014915466, 0.5849431157112122, 0.2665240168571472, -0.8466548919677734, -1.3664209842681885, -1.8862532377243042, -1.1348214149475098, -1.0910627841949463, -0.4562837779521942, -1.5834029912948608, -1.6089749336242676, -3.3822426795959473, -3.456171751022339, -0.7796923518180847, -1.6461519002914429, -1.1340405941009521, -3.9541521072387695, -3.7404253482818604, -2.9091439247131348, -0.9762431979179382, -0.2890397906303406, -3.1414473056793213, -2.7521419525146484, -1.2586270570755005, 0.12843632698059082, -3.800344705581665, -2.299518585205078, 0.45417091250419617, 0.31377050280570984, 3.8944687843322754, 1.999672293663025, -0.07867418229579926, 0.15685665607452393, 0.2627567946910858, 0.1827951967716217, 0.14163373410701752, 0.2930928170681, 0.38362523913383484, 0.48111438751220703, -2.7268178462982178, -1.248624563217163, -0.7392311692237854, -0.5173453092575073, -0.40430089831352234, -0.22306902706623077, -0.9117127060890198, -0.8576411008834839, 0.34807175397872925, -0.6444129943847656, -0.8651413917541504, -0.6868612170219421, -0.477109432220459, -0.1258327066898346, -0.6597129106521606, -0.39250457286834717, -0.5497321486473083, -0.4838884770870209, -0.2474060356616974, -0.25912752747535706, -0.12114058434963226, -0.14721599221229553, -0.3660867512226105, -0.31196725368499756, -0.3536289930343628, -0.31311020255088806, -0.04534778743982315, -0.05778997391462326, -0.18178151547908783, -0.22856144607067108, -0.0798610970377922, -0.11474566906690598, -0.07250209897756577, -0.09596741199493408, 0.15977729856967926, -0.41160133481025696, -0.08453217893838882, -0.43885675072669983, -0.1770142763853073, -0.13345424830913544, -1.17366623878479, 0.5165542364120483, 0.29159772396087646, 0.11940954625606537, 0.07757951319217682, -0.22602234780788422, 0.06414084881544113, 0.15127034485340118, -0.1787368208169937, -0.44541624188423157, -0.16916730999946594, 0.310271680355072, 0.1992655247449875, 0.18474328517913818, 0.239637553691864, 0.39673730731010437, -0.03368983790278435, 0.05020802840590477, 0.1382662057876587, -0.3465578854084015, 0.036332324147224426, 0.15974746644496918, -0.040685202926397324, 0.030806664377450943, -0.1778826117515564, -0.29523417353630066, -0.27746203541755676, -0.13261963427066803, -0.22235094010829926, 0.0376976877450943, -0.3301202058792114, -0.6011791229248047, -0.7274138331413269, -0.7476048469543457, 0.12260767817497253, -0.17147031426429749, -0.2323864996433258, -0.7875206470489502, -0.7389765977859497, -0.6192401647567749, -0.13957960903644562, 0.1485101282596588, -0.6610538363456726, -0.5390209555625916, -0.2591564953327179, 0.03768515959382057, -0.7620188593864441, -0.4495212137699127, 0.09886474162340164, 0.3735031485557556, -4.349002361297607, -2.0140697956085205, 0.16961106657981873, 0.08638744801282883, -0.6418488621711731, -0.28390932083129883, -0.47101926803588867, -0.45441934466362, -3.9473867416381836, -2.0091233253479004, 4.491796970367432, 1.2081955671310425, 2.368443012237549, 0.5533127188682556, 1.78851318359375, 1.1381349563598633, 4.211236000061035, 4.256258964538574, 0.12619255483150482, 3.5174572467803955, 4.324417591094971, 3.884711265563965, 2.904780626296997, 0.7691080570220947, 3.184690475463867, 1.8505256175994873, 2.955599308013916, 2.937620162963867, 2.0355820655822754, 2.0547971725463867, 0.3605779707431793, 1.0816826820373535, 2.2948079109191895, 0.9985011219978333, 1.8475412130355835, 1.2247549295425415, 0.9468311667442322, 0.9726732969284058, 1.1364326477050781, 1.114496111869812, 1.055133581161499, 1.3230808973312378, 0.7693186402320862, -0.8299221396446228, 0.6903948783874512, 2.4977214336395264, 0.9487977027893066, 1.9027584791183472, 0.6572574973106384, 0.858169674873352, 2.1037802696228027, -2.4640583992004395, -0.5442397594451904, -0.5171831250190735, 0.3147822320461273, 0.9029700756072998, 0.0022602735552936792, -0.6214304566383362, 1.61095130443573, 2.2958576679229736, 0.7556024193763733, -0.6404473781585693, -0.3824630081653595, -0.3357415497303009, -1.2038938999176025, -2.009843587875366, 0.01393294520676136, -0.2452181726694107, 0.275690495967865, 2.1256227493286133, -0.07153146713972092, -0.1839424967765808, -0.47109949588775635, -0.23984293639659882, 0.7661051750183105, 1.450323224067688, 1.8122284412384033, 1.1394996643066406, 0.9768154621124268, 0.42858341336250305, 1.5428367853164673, 1.4586726427078247, 3.4258949756622314, 3.623342514038086, 0.8755447268486023, 1.712335228919983, 1.2801339626312256, 3.791755437850952, 3.5961012840270996, 2.8464343547821045, 1.1375927925109863, 0.40969330072402954, 3.1027917861938477, 2.6016037464141846, 1.3017994165420532, -0.22592635452747345, 3.932161331176758, 2.407233715057373, -0.3704981803894043, -0.30729368329048157, -0.8126057982444763, -1.7537109851837158, 0.30374670028686523, 0.19663259387016296, -0.5386314392089844, -0.32924944162368774, -0.48730379343032837, -0.5664172768592834, -1.548148274421692, -2.123664140701294, 4.870322227478027, 5.7860798835754395, 2.563075065612793, 2.6473259925842285, 2.016915798187256, 1.8301936388015747, 4.2211689949035645, 4.211395263671875, 2.56552791595459, 3.5541064739227295, 4.274668216705322, 3.9277493953704834, 2.8484106063842773, 1.1379717588424683, 3.108508586883545, 2.2655067443847656, 2.977306842803955, 2.9741694927215576, 2.1739916801452637, 1.906596064567566, 0.35444876551628113, 0.9516789317131042, 2.5770010948181152, 1.4899743795394897, 1.8481638431549072, 1.793818712234497, 1.1021093130111694, 0.9619314074516296, 0.9530016183853149, 1.0947790145874023, 1.1771873235702515, 1.2307186126708984, 0.9442250728607178, 0.6861011981964111, 0.1399785727262497, 2.7392351627349854, 1.091855525970459, 2.032843589782715, 0.8597733974456787, 0.7738080024719238, 2.0230090618133545, -2.256220579147339, -0.5889072418212891, -0.6591842174530029, 0.49085745215415955, 0.46377161145210266, -0.1410970240831375, -0.6811745762825012, 1.3132991790771484, 2.24558162689209, 0.7927380800247192, -0.7260120511054993, -0.28994667530059814, -0.22539548575878143, -1.2081248760223389, -1.9118139743804932, 0.05269121378660202, -0.21335916221141815, 0.11547877639532089, 1.98639714717865, -0.05950472131371498, -0.25412142276763916, -0.5847505927085876, -0.28743937611579895, 0.9534026980400085, 1.464464545249939, 1.8349294662475586, 1.3880878686904907, 1.1145753860473633, 0.4048563241958618, 1.634761095046997, 3.7688748836517334, 3.2943553924560547, 3.6754708290100098, 0.2433096021413803, 1.8173960447311401, 1.2114099264144897, 3.7607195377349854, 3.633229970932007, 2.940901041030884, 1.0611448287963867, -0.342640221118927, 3.116647481918335, 2.6127943992614746, 1.2437936067581177, -0.2212551236152649, 3.7938764095306396, 2.4011752605438232, -0.3933797776699066, -0.3684278726577759, 4.31880521774292, 1.863499402999878, -0.3975198566913605, -0.14641639590263367, 0.4882443845272064, 0.32593637704849243, 0.3952708840370178, 0.6339016556739807, 1.4983628988265991, 2.1759893894195557, -2.308568239212036, -5.713767051696777, -2.4012136459350586, -2.6025681495666504, -1.9277783632278442, -1.8282326459884644, -4.310369968414307, -4.324922561645508, -2.9907093048095703, -3.4338347911834717, -4.100180149078369, -3.754282236099243, -2.867154598236084, -0.9154580235481262, -3.1323704719543457, -1.7036194801330566, -3.062544822692871, -3.1084768772125244, -2.2277398109436035, -1.9954543113708496, -0.5607776045799255, -0.9103416204452515, -2.107111930847168, -1.5452295541763306, -2.0014686584472656, -1.1881822347640991, -1.153134822845459, -0.9623962640762329, -1.1597923040390015, -1.1880605220794678, -1.1179391145706177, -1.053280234336853, -0.5804172158241272, -0.7098435759544373, -0.16262097656726837, -2.5311379432678223, -1.1061019897460938, -1.9011772871017456, -0.6762722134590149, -0.9475154876708984, -2.0158958435058594, 2.3693811893463135, 0.583751916885376, 0.640284538269043, -0.40000060200691223, -0.6094009280204773, 0.032956309616565704, 0.6787713170051575, -1.6891632080078125, -2.212841749191284, -0.8768395185470581, 0.6011942028999329, 0.3715870678424835, 0.16223382949829102, 1.272762417793274, 2.0850090980529785, -0.15334901213645935, 0.2346344143152237, -0.187576025724411, -2.04852032661438, -0.02004624530673027, 0.23316223919391632, 0.4556224048137665, 0.1716165989637375, -0.834074079990387, -1.3717609643936157, -1.9067388772964478, -1.4470441341400146, -1.1350499391555786, -0.5380133986473083, -1.6193746328353882, -3.7912509441375732, -3.3218679428100586, -3.6576874256134033, -0.2755720019340515, -1.7465039491653442, -1.2226431369781494, -3.9437644481658936, -3.8099539279937744, -2.8706257343292236, -0.9666258692741394, 0.3260868787765503, -3.1636927127838135, -2.6814651489257812, -1.330487608909607, 0.2314634919166565, -3.9341835975646973, -2.3431928157806396, 0.43969932198524475, 0.4008959233760834, 0.8735739588737488, 1.2821769714355469, -2.0506646633148193, -3.0394513607025146, 1.1730223894119263]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0, 0.8)}}, 'et4_eta0': {'discriminator': {'threshold': 0.52499855756759639, 'nodes': [100, 5, 1], 'bias': [0.02931458316743374, 0.07241812348365784, 0.10845600068569183, -0.09593469649553299, 0.04119148850440979, -0.3013235330581665], 'weights': [3.311089277267456, 2.7776033878326416, 0.18066610395908356, -1.2056864500045776, 1.604825735092163, 0.1865503191947937, 0.7730957865715027, 1.747846007347107, 3.180569648742676, 2.4392879009246826, -7.406797885894775, -2.3232455253601074, -6.833629608154297, -4.189258098602295, -6.104232311248779, -4.2750678062438965, -4.6247406005859375, -4.564622402191162, -4.813847064971924, -4.716826915740967, -5.312751293182373, -4.926319599151611, -4.884196758270264, -4.253235340118408, -4.336501121520996, -4.283618450164795, -5.591576099395752, -3.973464250564575, -9.319202423095703, -2.6603894233703613, -2.5613250732421875, -2.791975259780884, -6.357999801635742, -2.618309736251831, -2.1876912117004395, 3.915004253387451, -2.100966453552246, -2.618317127227783, -2.224304676055908, -1.1870745420455933, -2.20979905128479, -4.178243160247803, -2.71406626701355, -1.8115068674087524, -2.5513877868652344, -1.8894237279891968, -2.615633249282837, -2.727216958999634, -1.1780061721801758, 0.07806529104709625, 3.8563833236694336, -2.8403522968292236, 0.8701767325401306, -1.7194280624389648, -0.3875453770160675, -0.725654125213623, 0.1618911176919937, -2.067396879196167, 0.39956074953079224, -0.7730082869529724, -1.419706106185913, 0.44543057680130005, 1.257712721824646, -6.031074523925781, -0.2799831032752991, 0.6427088379859924, 1.126145601272583, -0.7146590948104858, 0.8776209950447083, -0.32623428106307983, 0.12489358335733414, 2.9221351146698, 0.6449100375175476, 0.4950735569000244, -1.5518912076950073, -3.279216766357422, -3.409505605697632, -2.5731496810913086, -1.338877558708191, -0.5686798095703125, -1.3578202724456787, -3.1066606044769287, -4.292603492736816, -4.043866157531738, -2.9960029125213623, -2.6689112186431885, -2.242722988128662, -1.8914425373077393, -5.118795394897461, -5.386273384094238, -1.6174904108047485, 0.12710949778556824, -4.624730587005615, -4.748095512390137, -2.024381637573242, -0.6438331007957458, -4.923405647277832, -3.7156264781951904, -0.7889842391014099, -0.24809014797210693, 4.9321746826171875, 2.719294548034668, 0.19921042025089264, -1.2299144268035889, 1.469421625137329, 0.27549803256988525, 0.6137067675590515, 1.9288514852523804, 3.162429094314575, 2.4241833686828613, -0.8821160793304443, -2.3855929374694824, -6.967386245727539, -3.6300206184387207, -5.987842559814453, -4.110408306121826, -4.806114196777344, -4.7161760330200195, -4.951784133911133, -4.617422103881836, -5.417108058929443, -4.941716194152832, -4.7647833824157715, -4.198006629943848, -4.221622467041016, -4.302094459533691, -5.669243335723877, -3.8399856090545654, -9.276651382446289, -2.588374137878418, -2.539703607559204, -2.676750421524048, -6.347228050231934, -2.7981884479522705, -2.3425776958465576, 3.793294668197632, -1.9462947845458984, -2.6869421005249023, -2.4106597900390625, -1.296339988708496, -2.0479044914245605, -4.174556255340576, -2.628129243850708, -2.0328147411346436, -2.6600518226623535, -1.9346470832824707, -2.426886558532715, -2.7716281414031982, -1.129162311553955, 0.13035979866981506, 3.499286413192749, -2.8930704593658447, 0.9111056327819824, -1.7877509593963623, -0.8029499053955078, -0.8154670000076294, 0.3207301199436188, -1.9210891723632812, 0.19757568836212158, -0.8172492384910583, -1.42578125, 0.2621346712112427, 0.9545161724090576, -6.406562328338623, -0.3975285589694977, 0.1815395951271057, 1.251863956451416, -0.674562931060791, 0.9707087874412537, -0.1411944031715393, -0.3243597149848938, 2.9314894676208496, 0.5880640745162964, 0.33994588255882263, -1.5169585943222046, -2.1622161865234375, -3.440775156021118, -2.5962939262390137, -1.306143879890442, -0.7967426180839539, -1.3246411085128784, -2.8446576595306396, -4.327754020690918, -4.215429782867432, -2.973690986633301, -2.707385778427124, -2.2584590911865234, -1.9559191465377808, -5.235342979431152, -5.3583760261535645, -1.4794776439666748, 0.0015658815391361713, -4.534499168395996, -4.82176399230957, -2.145214557647705, -0.6682068109512329, -4.796506404876709, -3.9563913345336914, -0.7762383818626404, -0.27372828125953674, 3.329188823699951, 2.699091672897339, 0.11544368416070938, -1.2733908891677856, 1.4800441265106201, 0.23912782967090607, 0.5339061617851257, 1.920528531074524, 3.16400408744812, 2.362506151199341, -7.369227409362793, -2.2801008224487305, -1.3484300374984741, -4.199735164642334, -6.1024885177612305, -4.2332444190979, -4.72761869430542, -4.6649370193481445, -4.950018405914307, -4.506102561950684, -5.2230048179626465, -4.822266101837158, -4.813889026641846, -4.29213809967041, -4.22196626663208, -4.380243301391602, -5.636888027191162, -3.8353168964385986, -9.337599754333496, -2.83490252494812, -2.5923819541931152, -2.799675703048706, -6.360905647277832, -2.7219579219818115, -2.255695104598999, 3.794724941253662, -1.9019191265106201, -2.6753854751586914, -2.422062397003174, -1.2958368062973022, -2.093534231185913, -4.1591315269470215, -2.7466561794281006, -1.9268056154251099, -2.5501599311828613, -1.9369505643844604, -2.4530510902404785, -2.8365652561187744, -1.0778427124023438, -0.0015444951131939888, 3.965160369873047, -2.9005653858184814, 1.0006400346755981, -1.790466070175171, -0.494064599275589, -0.7307782173156738, 0.24435079097747803, -1.9903603792190552, 0.2824591100215912, -0.701539933681488, -1.4626835584640503, 0.2898719906806946, 1.3288838863372803, -5.852675437927246, -0.28906452655792236, 0.6384750008583069, 1.1768627166748047, -0.7747824192047119, 0.8089156746864319, -0.2231132984161377, 0.24653974175453186, 2.9771029949188232, 0.5170877575874329, 0.33400091528892517, -1.6196229457855225, -3.4132800102233887, -3.3679802417755127, -2.728422164916992, -1.3321665525436401, -0.6771137714385986, -1.4866822957992554, -3.241295099258423, -4.46865701675415, -4.034861087799072, -2.951563835144043, -2.7013659477233887, -2.246248245239258, -1.7571269273757935, -5.0455474853515625, -5.256772041320801, -1.41910982131958, 0.12413366883993149, -4.658188819885254, -4.72866678237915, -2.0990781784057617, -0.6789646744728088, -4.915613651275635, -3.7322022914886475, -0.6341574788093567, -0.3005492091178894, -3.221585988998413, -2.7717816829681396, -0.016538845375180244, 1.2063384056091309, -1.51893949508667, -0.13385194540023804, -0.5516979098320007, -1.7744876146316528, -3.196636199951172, -2.4836816787719727, 7.317968368530273, 2.2688426971435547, 1.4693195819854736, 4.20490026473999, 6.045870304107666, 4.062985420227051, 4.715046405792236, 4.630736351013184, 4.8218770027160645, 4.606121063232422, 5.317939281463623, 4.854350566864014, 4.82401704788208, 4.2461700439453125, 4.220977306365967, 4.20060920715332, 5.639387607574463, 3.8129074573516846, 9.24327564239502, 2.6324856281280518, 2.6565353870391846, 2.5638163089752197, 6.334938049316406, 2.6358776092529297, 2.201953649520874, -3.851201057434082, 1.9294993877410889, 2.612241744995117, 2.2624528408050537, 1.2817121744155884, 2.158353090286255, 4.197438716888428, 2.712886095046997, 1.8633755445480347, 2.5852441787719727, 1.8549500703811646, 2.454957962036133, 2.609938383102417, 1.210780382156372, -0.133077010512352, -3.842630386352539, 2.879298210144043, -0.854038655757904, 1.6739861965179443, 0.4184418022632599, 0.6272525787353516, -0.2910340428352356, 1.9043742418289185, -0.4167815148830414, 0.8093799948692322, 1.4446698427200317, -0.3684280514717102, -1.2077643871307373, 6.057832717895508, 0.3735669255256653, -0.5794821381568909, -1.2773224115371704, 0.6377288103103638, -0.8214533925056458, 0.21222138404846191, -0.1485794484615326, -2.9164366722106934, -0.5532369017601013, -0.2782001197338104, 1.6084742546081543, 3.2182531356811523, 3.3501698970794678, 2.7107932567596436, 1.1596511602401733, 0.7838540077209473, 1.342819094657898, 3.182922601699829, 4.304990768432617, 4.045987129211426, 3.025850296020508, 2.7112162113189697, 2.1454615592956543, 1.7928255796432495, 5.239800453186035, 5.270802021026611, 1.5542607307434082, -0.5743051171302795, 4.585275173187256, 4.7357988357543945, 1.9821984767913818, 0.6989428400993347, 4.97335147857666, 3.764003038406372, 0.7662184834480286, 0.35413622856140137, -3.4379727840423584, -2.8555643558502197, -0.3663407564163208, -2.408470630645752, -1.5430840253829956, -0.25652015209198, -0.7511703372001648, -1.8620102405548096, -3.0778346061706543, -2.589646100997925, 7.514346122741699, 2.2859439849853516, 6.818809509277344, 4.352261066436768, 5.9318766593933105, 4.255453109741211, 4.759824275970459, 4.558107852935791, 4.970895767211914, 4.701549053192139, 5.4484686851501465, 4.889317989349365, 4.80600118637085, 4.209726333618164, 4.373593330383301, 4.147166728973389, 5.483404636383057, 4.042483806610107, 9.351543426513672, 2.766465187072754, 2.6710317134857178, 2.704195976257324, 6.392306327819824, 2.766118288040161, 2.2967467308044434, -3.825340509414673, 1.929464340209961, 2.756084680557251, 2.4494926929473877, 1.3677963018417358, 2.203979730606079, 4.26149320602417, 2.6080007553100586, 1.5381990671157837, 2.548158645629883, 1.8604775667190552, 2.5752758979797363, 2.6095759868621826, 1.1493122577667236, -0.21643872559070587, -3.739816665649414, 7.5353312492370605, -1.0523262023925781, 1.7510257959365845, 0.45105794072151184, 0.8300859928131104, -0.2599686086177826, 2.0507545471191406, -0.23286698758602142, 0.700499951839447, 1.4811276197433472, -0.41851431131362915, -1.1686880588531494, 5.877883434295654, 0.20521989464759827, -0.6939062476158142, -1.182706594467163, 0.71788489818573, -0.7842925190925598, 0.2453644722700119, -0.19043582677841187, -2.841397523880005, -0.7045305967330933, -0.41718268394470215, 1.6119834184646606, 2.2414355278015137, 3.465207815170288, 2.5861291885375977, 1.2271615266799927, 0.5889217853546143, 1.1283658742904663, 3.104675531387329, 4.419867038726807, 4.235025405883789, 3.0294127464294434, 2.6096696853637695, 2.289092779159546, 1.8230525255203247, 5.271679878234863, 5.349844932556152, 1.482431173324585, -0.5044125318527222, 4.621979713439941, 4.696404933929443, 2.0854992866516113, 0.8158512115478516, 4.82727575302124, 3.7134132385253906, 0.7147044539451599, 0.23747116327285767, 1.417057752609253, 1.7022205591201782, 0.6667920351028442, -0.9233080148696899, -1.287419080734253]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0, 0.8)}}, 'et1_eta3': {'discriminator': {'threshold': 0.11499894857406617, 'nodes': [100, 18, 1], 'bias': [-0.2002144455909729, -0.15363548696041107, -0.16188405454158783, -0.017389720305800438, 0.14820167422294617, -0.17858947813510895, -0.18675900995731354, -0.032089632004499435, -0.11576628684997559, -0.03401807323098183, -0.2495034635066986, -0.1558571606874466, -0.19357968866825104, 0.16586734354496002, -0.0014014645712450147, 0.20652197301387787, -0.17826637625694275, 0.1897476762533188, -0.054813455790281296], 'weights': [-0.38340234756469727, -0.6566517353057861, 0.16483989357948303, 0.4977419674396515, 0.7625945806503296, 0.19190865755081177, 0.24609415233135223, -0.7307010889053345, -0.8119046092033386, -1.2132209539413452, -0.5309129953384399, 1.3090801239013672, 0.796664297580719, -0.5182087421417236, 1.868080973625183, 4.295961380004883, 1.4176360368728638, 2.454637289047241, 1.4464610815048218, 2.5349671840667725, 0.9971038699150085, 1.1965296268463135, 1.496915578842163, 2.121141195297241, 3.29137921333313, 1.6098891496658325, 0.6513527035713196, 2.1739296913146973, 1.0169310569763184, 1.544034481048584, 1.0793766975402832, 1.3991395235061646, 1.6352118253707886, 1.3835066556930542, 1.1499985456466675, 1.0610237121582031, 0.05404287204146385, 0.41538554430007935, 0.43702971935272217, 0.9927192330360413, 0.07816965878009796, 0.7781451940536499, 0.7118356823921204, 1.3025516271591187, -0.030876843258738518, 1.1513395309448242, 0.2942968010902405, 0.5993052124977112, 0.20513437688350677, 0.8833693861961365, 0.46746826171875, 0.9571513533592224, -0.07157488912343979, 0.72287917137146, 0.7263399958610535, 0.580528199672699, 0.023384803906083107, 0.5015721321105957, 0.39651399850845337, 0.2557906210422516, 0.22474272549152374, 0.2975868880748749, 0.16423001885414124, -0.01598936691880226, 0.005907304584980011, 0.8213630318641663, 0.8370744585990906, 0.27068042755126953, -0.2674257159233093, -0.17367443442344666, -0.5805248022079468, 0.528968095779419, -0.1989305019378662, -0.050370559096336365, 1.2127388715744019, 1.4218155145645142, 1.395790696144104, 1.055174469947815, 0.6698682308197021, 0.24106000363826752, 1.5604139566421509, 3.1179018020629883, 3.4605464935302734, 1.3086051940917969, 0.8781377673149109, 1.0295149087905884, 0.09012075513601303, 0.6932299137115479, 0.5225092172622681, 0.9932043552398682, 0.4548197388648987, 0.05864733085036278, 2.38737154006958, 0.9247806072235107, 0.34414803981781006, 0.6246473789215088, 0.42670920491218567, 0.168732151389122, 0.053754258900880814, 0.9493657946586609, -0.38360196352005005, -0.732202410697937, 0.14758580923080444, 0.6051104068756104, 0.9232946634292603, 0.13980458676815033, 0.3051658570766449, -0.7344979047775269, -0.8900668621063232, -1.3221021890640259, -0.5035775303840637, 1.4208064079284668, 0.5290546417236328, -0.3478271961212158, 1.86189866065979, 4.408084869384766, 1.440454125404358, 2.52168345451355, 1.3675932884216309, 2.5375986099243164, 0.9146979451179504, 1.2156656980514526, 1.4084172248840332, 2.261629104614258, 3.1239607334136963, 1.4413634538650513, 0.6121513247489929, 2.219493865966797, 0.9521713852882385, 1.544762134552002, 1.1904094219207764, 1.3446217775344849, 1.5499415397644043, 1.2284002304077148, 1.1380829811096191, 1.1469122171401978, 0.09570536762475967, 0.2978670299053192, 0.2701861262321472, 0.9458319544792175, 0.09166756272315979, 0.6282024383544922, 0.78712397813797, 1.5633015632629395, -0.2592944800853729, 1.1304155588150024, 0.3707042336463928, 0.6425605416297913, 0.0022983881644904613, 0.8704652786254883, 0.26444754004478455, 0.9208696484565735, 0.0032466643024235964, 0.6803261041641235, 1.4584405422210693, 0.678684651851654, 0.06113111972808838, 0.566028356552124, 0.22947300970554352, 0.2392222285270691, 0.040982428938150406, 0.2520126700401306, 0.41603735089302063, -0.036166854202747345, 0.05413128808140755, 0.7926779389381409, 0.6538285613059998, 0.3500996232032776, -0.1737414300441742, -0.2748863995075226, -0.537535548210144, 0.3872361183166504, -0.20122425258159637, -0.1810685247182846, 1.2737761735916138, 1.4399892091751099, 1.493069052696228, 0.9437366127967834, 0.7208545207977295, 0.45295724272727966, 1.4465068578720093, 3.214751720428467, 3.3187026977539062, 1.2009320259094238, 0.9428243637084961, 0.9918748140335083, 0.07014276832342148, 0.5587629675865173, 0.5597621202468872, 1.059611201286316, 0.28132373094558716, 0.16102787852287292, 2.393214225769043, 0.9395459890365601, 0.17745913565158844, 0.4298109710216522, 0.6617841720581055, 0.06763876974582672, 0.18725647032260895, 1.0290868282318115, 16.190824508666992, 0.14594896137714386, 3.4627883434295654, 12.799717903137207, 10.684195518493652, 0.011130272410809994, -0.03397102653980255, -0.10816044360399246, 0.29309478402137756, 9.081469535827637, -24.892780303955078, 36.682525634765625, 18.784238815307617, -7.007519721984863, -45.00828552246094, -1.1602109670639038, -1.117960810661316, -0.9883555769920349, -5.681673526763916, -0.7563220262527466, -13.34096622467041, -4.8449811935424805, -25.132312774658203, -0.9788350462913513, -4.000855922698975, -0.5069876909255981, -34.51609420776367, -0.885381281375885, -55.87479782104492, -0.7409151792526245, -66.15792846679688, -0.03725424036383629, -12.921009063720703, -0.06828707456588745, -5.4699015617370605, -0.1061086356639862, -3.6921463012695312, 0.1655205339193344, -49.182125091552734, 0.07158195972442627, -0.047861140221357346, 0.025056902319192886, -2.427628755569458, -0.7640111446380615, -44.33208465576172, -0.25958630442619324, -0.24857257306575775, -0.8375716209411621, 2.713972568511963, -0.2896157205104828, -0.052662696689367294, -0.49748677015304565, 1.2169281244277954, -0.2682081460952759, -11.288450241088867, -0.5798513889312744, 0.8085481524467468, -0.3330405354499817, 0.3179360032081604, -0.07634507119655609, 0.5994629859924316, -5.807570457458496, -0.06363659352064133, 0.040838535875082016, 0.7583083510398865, -0.3190859854221344, -0.4253675043582916, 0.13786259293556213, 0.2775750458240509, 0.1861962527036667, 0.3385373055934906, -0.1951509416103363, -12.781550407409668, -5.904649257659912, 0.10519639402627945, -0.21757985651493073, -0.9494050741195679, -0.8350086212158203, -2.6825902462005615, -0.18710128962993622, -88.77208709716797, -31.349262237548828, -11.474648475646973, -0.14730286598205566, -0.04797506704926491, 0.06218511611223221, 0.5091103315353394, 0.2308323085308075, 2.4978582859039307, 11.415743827819824, 2.4144582748413086, 6.942951202392578, 0.379177063703537, -0.011793139390647411, -0.17475751042366028, -8.05445384979248, 13.726672172546387, 0.03526470810174942, 0.29011136293411255, -159.08544921875, -0.40671804547309875, -0.6286713480949402, 0.384751558303833, 0.5788285136222839, 0.7045100331306458, 0.1426837295293808, 0.20395319163799286, -0.37832745909690857, -0.6461001038551331, -1.1783652305603027, -0.9888992309570312, 1.276848554611206, 0.8529349565505981, -0.6925095915794373, 1.732786774635315, 0.23605792224407196, 1.4397642612457275, 2.4341626167297363, 1.3182228803634644, 2.5807056427001953, 1.0016379356384277, 1.2908918857574463, 1.5176434516906738, 2.2151107788085938, 3.0804433822631836, 1.5445953607559204, 0.6013043522834778, 2.2249069213867188, 0.9683724641799927, 1.6630834341049194, 1.0555741786956787, 1.3077234029769897, 1.520164966583252, 1.2600111961364746, 1.1378265619277954, 1.1504502296447754, -0.05448688939213753, 0.372103214263916, 0.1684374064207077, 0.7655290961265564, 0.05944743752479553, 0.5050622820854187, 0.320505827665329, 1.3154972791671753, -0.09305723756551743, 0.8982280492782593, 0.4867056608200073, 0.5647482872009277, 0.13418610394001007, 0.690271258354187, 0.32567334175109863, 0.9298478960990906, -0.1417071521282196, 0.8311952352523804, 0.3170643448829651, 0.9006834626197815, 0.06480348855257034, 0.5515538454055786, 0.3003140985965729, 0.28782549500465393, -0.09280697256326675, 0.4358987510204315, 0.16473950445652008, 0.043837565928697586, -0.21252182126045227, 0.712474524974823, 0.4932105243206024, -0.057035114616155624, -0.1705840826034546, -0.2665582299232483, -0.6421555876731873, 0.35017016530036926, -0.14387036859989166, -0.11060134321451187, 1.2530596256256104, 1.1331610679626465, 1.3611210584640503, 1.0740065574645996, 0.7411977648735046, 0.2834552824497223, 2.934769868850708, 3.048475503921509, 2.401529550552368, 0.9926343560218811, 0.9144255518913269, 0.8618057370185852, 0.006950654089450836, 0.782966136932373, 0.6391353607177734, 0.9835235476493835, 0.2968132197856903, 0.12545588612556458, 1.9531956911087036, 1.153342366218567, 0.21261000633239746, 0.5586487054824829, 0.5515046119689941, 0.182867169380188, 0.15227104723453522, 0.9117034077644348, 0.5825621485710144, 0.8241159915924072, -0.2447684109210968, -0.5811120271682739, -0.8582577705383301, -0.26519033312797546, -0.14317388832569122, 0.6782941818237305, 0.7970190644264221, 1.3394062519073486, 0.31428781151771545, -1.270024299621582, -0.5277531147003174, 0.4809548556804657, -1.859432578086853, -0.8835269212722778, -1.51180899143219, -2.4005470275878906, -0.9432553052902222, -2.47320818901062, -1.0926566123962402, -1.327350378036499, -1.450195074081421, -2.316866874694824, -3.2048487663269043, -1.574819564819336, -0.539912760257721, -2.19111704826355, -1.0004551410675049, -1.706177830696106, -1.026258945465088, -1.2357838153839111, -1.4902604818344116, -1.3973653316497803, -1.056719183921814, -1.2585408687591553, -0.03911249712109566, -0.475729376077652, -0.012611662968993187, -0.9795836210250854, -0.2500004470348358, -0.7511481046676636, -0.7014085650444031, -1.4828335046768188, 0.03260655701160431, -0.7722057700157166, -0.30374693870544434, -0.6167660355567932, -0.04362953081727028, -0.7577283382415771, -0.25374636054039, -0.7800593972206116, 0.3389913737773895, -0.7093072533607483, -0.46981412172317505, -0.8780418038368225, 0.012762768194079399, -0.3979136645793915, -0.3172326683998108, -0.29384326934814453, -0.04235990345478058, -0.4121563136577606, -0.3217425048351288, 0.09652094542980194, -0.14689096808433533, -0.799673855304718, -0.6893338561058044, -0.3845553398132324, 0.2253190577030182, 0.28787529468536377, 0.467214435338974, -0.4973415434360504, 0.09886517375707626, 0.19428466260433197, -1.2496248483657837, -1.3548314571380615, -1.402904987335205, -0.9054427146911621, -0.6342453956604004, -0.4016222059726715, -1.531589388847351, -3.1153032779693604, -2.5563337802886963, -1.2360167503356934, -0.8736165165901184, -0.9458446502685547, 0.057179395109415054, -0.6529570817947388, -0.5880138874053955, -1.0133585929870605, -0.3900461196899414, -0.18856698274612427, -2.2752933502197266, -0.9560835361480713, -0.3810197114944458, -0.4067794680595398, -0.4488714039325714, -0.08817335963249207, -0.19656842947006226, -1.0010647773742676, -0.5717464089393616, -0.5949568152427673, 0.088893823325634, 0.6765756607055664, 0.863964319229126, 0.23964524269104004, 0.2005004733800888, -0.7381905913352966, -0.7229442596435547, -1.15565025806427, -0.5008231997489929, 1.2769683599472046, 0.5431281328201294, -0.41909027099609375, 1.6773723363876343, 1.0654959678649902, 1.363873839378357, 2.577305555343628, 0.9604941606521606, 2.573745012283325, 0.9130794405937195, 1.2603247165679932, 1.3415553569793701, 2.334581136703491, 3.236938238143921, 1.6211953163146973, -0.24978631734848022, 2.0826923847198486, 1.2304937839508057, 1.4990036487579346, 1.0293259620666504, 1.2390410900115967, 1.5301235914230347, 1.2602015733718872, 1.1598795652389526, 1.06606924533844, 0.11481449753046036, 0.39755114912986755, 0.42581531405448914, 0.8909477591514587, 0.11762230843305588, 0.7883768677711487, 0.84607994556427, 1.6059443950653076, -0.17164760828018188, 1.0262399911880493, 0.37056684494018555, 0.6412549614906311, 0.19475476443767548, 0.8455633521080017, 0.30318698287010193, 0.9896240830421448, -0.2364022135734558, 0.6539768576622009, 0.7167876958847046, 0.811370313167572, -0.025442959740757942, 0.5032809972763062, 0.28555721044540405, 0.23520271480083466, 0.1785678118467331, 0.39861637353897095, 0.23411190509796143, -0.15846410393714905, 0.23420950770378113, 0.6505598425865173, 0.6729646325111389, 0.30918487906455994, -0.2147253453731537, -0.0805697813630104, -0.6349985003471375, 0.3706757128238678, -0.08689811080694199, -0.2093910574913025, 1.250820517539978, 1.2184782028198242, 1.3621662855148315, 0.9696751832962036, 0.6886918544769287, 0.20584699511528015, 1.4458370208740234, 2.9813807010650635, 3.18683123588562, 1.2199821472167969, 0.9232864379882812, 1.0173033475875854, -0.018200814723968506, 0.680754542350769, 0.5266239643096924, 1.0290035009384155, 0.41298139095306396, 0.26716676354408264, 2.2691152095794678, 0.961639404296875, 0.15959353744983673, 0.48409610986709595, 0.5433118939399719, 0.08852286636829376, -0.03947044909000397, 0.8682109713554382, -0.5318871140480042, -0.5030391812324524, 0.26828622817993164, 0.5441595315933228, 0.781224250793457, 0.34886404871940613, 0.20735856890678406, -0.7190834283828735, -0.7733364105224609, -1.212363839149475, -0.36193424463272095, 1.4043164253234863, 0.6287188529968262, -0.5259811878204346, 1.636110544204712, 4.26112699508667, 1.3977693319320679, 2.5335309505462646, 1.4603873491287231, 2.5290608406066895, 0.8937587141990662, 1.2686960697174072, 1.5291714668273926, 2.2742104530334473, 3.237992525100708, 1.4308949708938599, 0.48742997646331787, 2.193636655807495, 1.0421017408370972, 1.5803086757659912, 1.001723289489746, 1.3306912183761597, 1.5946170091629028, 1.398392915725708, 1.3004380464553833, 1.0494269132614136, 0.12198827415704727, 0.353340208530426, 0.4266543686389923, 0.8502677083015442, 0.2578189969062805, 0.6877743005752563, 0.6749987006187439, 1.589471459388733, -0.14116521179676056, 1.040137529373169, 0.4916624426841736, 0.4794861972332001, 0.16243241727352142, 0.842799186706543, 0.3313240110874176, 0.8214824795722961, -0.029637884348630905, 0.6293928027153015, 0.7284616231918335, 0.8371362090110779, -0.00013269793998915702, 0.5887269973754883, 0.40477144718170166, 0.3123055696487427, 0.09919605404138565, 0.47714272141456604, 0.162660151720047, -0.17179422080516815, 0.21068352460861206, 0.7757437825202942, 0.6592679619789124, 0.29444342851638794, -0.36484673619270325, -0.11290670931339264, -0.45024874806404114, 0.3623316287994385, -0.21816875040531158, -0.1526898890733719, 1.2754018306732178, 1.5355931520462036, 1.3780335187911987, 1.0633491277694702, 0.659041166305542, 0.19096770882606506, 1.5383731126785278, 2.9813828468322754, 3.264423131942749, 1.3181312084197998, 0.8970950841903687, 0.8458815813064575, 0.08818908780813217, 0.6782749891281128, 0.6739600896835327, 1.0144459009170532, 0.24742408096790314, 0.09595700353384018, 2.33469295501709, 0.9648230075836182, 0.2152952253818512, 0.5277570486068726, 0.6701862812042236, 0.11104635894298553, -0.008986016735434532, 0.8464317321777344, -0.6005939245223999, -0.6416574716567993, 0.12787888944149017, 0.519671618938446, 0.7248276472091675, 0.1684955507516861, 0.1987256109714508, -0.6830629110336304, -0.7839223742485046, -1.2371307611465454, -1.0717519521713257, 1.3692030906677246, 0.8768095374107361, -0.7876304984092712, 1.8158602714538574, 0.3931213319301605, 1.6375144720077515, 2.4715702533721924, 1.4682286977767944, 2.608262300491333, 0.9067097306251526, 1.3750423192977905, 1.4358627796173096, 2.289135217666626, 3.1341562271118164, 1.6185520887374878, 0.6295635104179382, 2.1696391105651855, 0.8269528150558472, 1.6992709636688232, 1.1447465419769287, 1.2837194204330444, 1.4437756538391113, 1.4014016389846802, 1.0449012517929077, 1.080278992652893, 0.12303435057401657, 0.28362587094306946, 0.20950162410736084, 0.8210135102272034, 0.15366126596927643, 0.5670651197433472, 0.5195554494857788, 1.2097681760787964, -0.19844530522823334, 0.8745250701904297, 0.27611637115478516, 0.43773818016052246, 0.2186424285173416, 0.8760428428649902, 0.44570720195770264, 0.8030654191970825, -0.11897523701190948, 0.6506876945495605, 0.3172664940357208, 0.7301618456840515, -0.029334556311368942, 0.5703171491622925, 0.3218229413032532, 0.299481064081192, -0.02812369167804718, 0.2993195354938507, 0.14269781112670898, 0.02241954393684864, -0.19790072739124298, 0.6071950793266296, 0.6461795568466187, 0.12490330636501312, -0.3740408718585968, -0.0602165050804615, -0.6527913212776184, 0.48814189434051514, -0.21445220708847046, -0.225005641579628, 1.2756084203720093, 1.232437252998352, 1.469746708869934, 0.9021191596984863, 0.6458925604820251, 0.4081171452999115, 2.306035280227661, 3.0826146602630615, 2.3463315963745117, 1.0770496129989624, 1.018068790435791, 0.910336971282959, 0.1130421981215477, 0.7826652526855469, 0.4694555997848511, 0.8650839924812317, 0.31786322593688965, 0.2550208270549774, 1.9873223304748535, 1.1453852653503418, 0.33051592111587524, 0.5544898509979248, 0.4452156126499176, 0.2124941647052765, 0.08292680233716965, 0.8491610288619995, -56.80121994018555, -14.151447296142578, -0.18774959444999695, -0.3542330265045166, -0.8086683750152588, -0.05761038511991501, -0.10484757274389267, 0.6895679235458374, 0.7692949175834656, 0.5070134401321411, 1.7576361894607544, 2.4032235145568848, -0.7318966388702393, 1.0726171731948853, 2.981738805770874, -1.114487886428833, -0.40596339106559753, 0.5606130361557007, -5.207275867462158, 12.476569175720215, 0.23585659265518188, 1.904693365097046, -0.5518673658370972, 4.947570323944092, -3.837280035018921, -0.06059196591377258, 2.871915578842163, -0.8866435289382935, -0.07605594396591187, -2.927834987640381, 0.03593759983778, -0.3128579556941986, -0.6111246943473816, -0.07666689902544022, 0.0628674179315567, 1.0550893545150757, 0.7064999938011169, 0.09661006927490234, 8.114603042602539, 0.11041894555091858, -0.21399341523647308, 0.3894084393978119, -0.18029938638210297, -1.3529058694839478, 0.0051324074156582355, -0.18760287761688232, -0.11429450660943985, -1.7869954109191895, -0.08458162844181061, -0.2530703544616699, -0.18161948025226593, -0.39874812960624695, 3.6301748752593994, -0.1379910558462143, -0.17066669464111328, -0.5774021744728088, 0.1965624839067459, -0.24337352812290192, -0.15194885432720184, -0.34497329592704773, -0.17847950756549835, -1.2566121816635132, -0.30973729491233826, 0.004842949565500021, -0.24191004037857056, -0.313288152217865, -0.432453453540802, -0.18742893636226654, -0.17586643993854523, -0.1488223522901535, -0.12833110988140106, -0.39797917008399963, -0.19953987002372742, -0.09475917369127274, -0.17185315489768982, -0.48886269330978394, -0.487642377614975, 0.04784593731164932, 1.3774009943008423, -0.09344834089279175, 0.7785547971725464, -0.2757335901260376, -0.8404405117034912, 0.03939834237098694, -0.12825831770896912, -0.13465513288974762, 0.44766923785209656, 0.16001445055007935, -22.276966094970703, -1.7702490091323853, -0.0713605135679245, -0.6156205534934998, -1.4816166162490845, 0.0003315433277748525, -0.25746849179267883, 14.080020904541016, 0.024155687540769577, -0.036030080169439316, 0.07861766219139099, -0.563843846321106, 0.8405486941337585, 0.7216206789016724, -0.10024264454841614, -0.6815454363822937, -0.8117128014564514, -0.12413720041513443, -0.28767168521881104, 0.7507040500640869, 0.79880291223526, 1.3988380432128906, 1.0554957389831543, -1.1341222524642944, -0.8427881598472595, 0.6588563919067383, -1.814319372177124, -0.27744153141975403, -1.5099965333938599, -2.63364577293396, -1.3798142671585083, -2.4620635509490967, -0.8090096712112427, -1.377532958984375, -1.6074717044830322, -2.1487228870391846, -3.217214822769165, -1.539404034614563, -0.5151381492614746, -2.0406301021575928, -1.0206210613250732, -1.5512062311172485, -1.066892147064209, -1.3595800399780273, -1.422608494758606, -1.3157989978790283, -1.0305311679840088, -1.1775572299957275, 0.025436030700802803, -0.3435658812522888, -0.2715975344181061, -0.9117682576179504, -0.14039325714111328, -0.5204090476036072, -0.40074023604393005, -1.1244744062423706, 1.3476958274841309, -0.7980905771255493, -0.34210821986198425, -0.4770492911338806, 0.028293397277593613, -0.8690755367279053, -0.42223358154296875, -0.836659848690033, 0.13816438615322113, -0.7555708885192871, -1.4806468486785889, -0.7790289521217346, 0.02098878100514412, -0.5725722312927246, -0.2562553286552429, -0.32207733392715454, 0.18862926959991455, -0.40144485235214233, 0.011012431234121323, 0.14454549551010132, 0.19271962344646454, -0.6912900805473328, -0.5944287776947021, 0.0032009859569370747, 0.21535104513168335, 0.08399953693151474, 0.4371108114719391, -0.38139209151268005, 0.2078593671321869, 0.08682353049516678, -1.0982259511947632, -1.118467092514038, -1.5462558269500732, -1.0345520973205566, -0.6848118901252747, -0.3011939823627472, -2.814122438430786, -3.083674192428589, -1.9439293146133423, -0.8705432415008545, -0.8261646628379822, -0.8885801434516907, -0.06915400922298431, -0.6567742228507996, -0.18422433733940125, -0.9046079516410828, -0.4383082091808319, -0.07741483300924301, -1.873676061630249, -1.9145755767822266, -0.23813050985336304, -0.811942458152771, -0.5244396328926086, -0.04697516933083534, -0.182030588388443, -0.8345677256584167, -0.25572437047958374, 0.31898754835128784, 0.1516154706478119, 0.3784807324409485, -1.4377514123916626, -0.017763782292604446, 0.006646250374615192, -0.5897576808929443, -0.7104454040527344, -1.2158955335617065, -3.0753180980682373, -0.4261987805366516, 12.003192901611328, -0.18148554861545563, 1.6016343832015991, 0.5072712898254395, -2.991880178451538, 0.36880654096603394, -0.04196963086724281, 0.4132213890552521, 3.644460678100586, 19.40183448791504, 0.4083648920059204, -0.04513901099562645, 0.9595772624015808, 0.18046723306179047, -0.018884524703025818, 0.14654026925563812, -0.7082056999206543, 0.0008586105541326106, 0.0435924306511879, -0.0766819640994072, -0.20758089423179626, 0.023481043055653572, -0.022992320358753204, -0.044576358050107956, 21.73570442199707, -0.21417291462421417, -0.31068986654281616, -0.19017793238162994, -0.15974323451519012, -0.17240677773952484, -0.08980873972177505, -0.02164374105632305, -0.5421410799026489, 0.014050119556486607, -0.057595156133174896, -0.22192420065402985, 19.47360610961914, -0.14409269392490387, -0.22697722911834717, -0.03573762625455856, -0.6156139373779297, -0.045350100845098495, -0.16688668727874756, -0.017508462071418762, -0.18324628472328186, -0.19444894790649414, -0.3148132264614105, -0.10279625654220581, -0.13189741969108582, -0.08806000649929047, 32.851585388183594, -0.6846795678138733, -0.26579776406288147, -0.020532725378870964, 0.10784540325403214, -0.6826676726341248, -1.1180943250656128, -0.9135575890541077, -1.2716460227966309, -0.051427051424980164, -1.2954837083816528, -0.10623038560152054, -2.2831122875213623, -0.035184647887945175, -4.364250183105469, -0.08836710453033447, -0.05583625286817551, -0.09623824805021286, -18.05628776550293, 0.495023250579834, 0.17405302822589874, -0.15393826365470886, 0.007149766199290752, -0.12751337885856628, -0.21903882920742035, -0.11690343171358109, -6.029508113861084, -6.286768913269043, -0.4862957000732422, -0.00841100700199604, -106.7051773071289, -33.096866607666016, -0.22958901524543762, 5.009400844573975, -4.870616912841797, -0.008741048164665699, -2.145540952682495, -0.1291254460811615, -0.3456064462661743, -0.7874621152877808, 0.11811321973800659, 0.4961678981781006, 0.8507356643676758, 0.31109189987182617, 0.12615905702114105, -0.6484752297401428, -0.8193530440330505, -1.363515019416809, -0.39939379692077637, 1.3482391834259033, 0.614769458770752, -0.3825177848339081, 1.6779334545135498, 4.372943878173828, 1.3199337720870972, 2.55778431892395, 1.3940620422363281, 2.6366376876831055, 1.0289734601974487, 1.3398358821868896, 1.367051124572754, 1.8663303852081299, 3.1488635540008545, 1.6122926473617554, -0.3451955318450928, 1.987937092781067, 1.045506477355957, 1.6692523956298828, 1.076711893081665, 1.2719875574111938, 1.6290814876556396, 1.3335528373718262, 1.2035526037216187, 1.1436285972595215, 0.009594276547431946, 0.4236528277397156, 0.34305500984191895, 0.9403334259986877, 0.186759352684021, 0.8152167201042175, 0.6991836428642273, 1.4957852363586426, -0.1164313554763794, 1.1160130500793457, 0.25823724269866943, 0.6747837662696838, 0.014120438136160374, 0.7943393588066101, 0.3858359158039093, 0.7986517548561096, 0.04141387715935707, 0.7701690196990967, 0.6347532868385315, 1.1564903259277344, 0.07364115118980408, 0.5817779898643494, 0.38106223940849304, 0.39930233359336853, 0.17137157917022705, 0.2800277769565582, 0.2551738917827606, -0.07492279261350632, 0.19717678427696228, 0.7071451544761658, 0.8601028323173523, 0.15870635211467743, -0.3728155791759491, -0.2440648376941681, -0.4857249855995178, 0.5315850973129272, -0.23176896572113037, -0.1742181032896042, 1.1022788286209106, 1.5621484518051147, 1.4421554803848267, 0.9081036448478699, 0.6271923184394836, 0.4233575463294983, 1.5830520391464233, 2.993881940841675, 3.41560435295105, 1.1273272037506104, 1.0601725578308105, 0.8935339450836182, 0.07937508821487427, 0.6667394638061523, 0.46727555990219116, 0.9720954298973083, 0.31306570768356323, 0.20880906283855438, 2.3436191082000732, 1.0587700605392456, 0.17657996714115143, 0.513343870639801, 0.44703051447868347, 0.024708904325962067, 0.08929786831140518, 0.8636502623558044, -0.5039831399917603, -0.8149739503860474, 0.15549060702323914, 0.5605978965759277, 0.7394363880157471, 0.034288641065359116, 0.3114113509654999, -0.8136886954307556, -0.78770512342453, -1.215367317199707, -0.3042708933353424, 1.3430238962173462, 0.8105869889259338, -0.3245096504688263, 1.7687708139419556, 4.349796295166016, 1.459321141242981, 2.405777931213379, 1.4983571767807007, 2.518437147140503, 0.9134923219680786, 1.24137544631958, 1.3457478284835815, 1.816027045249939, 3.235405445098877, 1.5223313570022583, -0.4010748267173767, 2.1362228393554688, 1.0145297050476074, 1.6047039031982422, 1.2129600048065186, 1.3380721807479858, 1.5210533142089844, 1.2514965534210205, 1.148212194442749, 1.1937311887741089, 0.02084837108850479, 0.482487291097641, 0.48379984498023987, 0.9798768758773804, 0.14606598019599915, 0.7855446338653564, 0.8021541237831116, 1.381439208984375, -0.08614232391119003, 1.0535002946853638, 0.4298691153526306, 0.5024979114532471, 0.055451128631830215, 0.8144237399101257, 0.42879316210746765, 0.9803608059883118, -0.09275074303150177, 0.7896514534950256, 0.7642918825149536, 0.759797990322113, 0.005569723434746265, 0.39364930987358093, 0.28167033195495605, 0.297913134098053, 0.1805001199245453, 0.3194378614425659, 0.4017198383808136, -0.15788398683071136, 0.1521838754415512, 0.8012791275978088, 0.8249431252479553, 0.3808400630950928, -0.21746566891670227, -0.1361147165298462, -0.4802781939506531, 0.39037975668907166, -0.1510380655527115, -0.11622194200754166, 1.1559572219848633, 1.2339847087860107, 1.4884576797485352, 1.131054401397705, 0.6433441042900085, 0.18698187172412872, 1.5702699422836304, 3.0558269023895264, 2.6246159076690674, 1.273658275604248, 0.8848209977149963, 1.03648042678833, -0.0012658569030463696, 0.680117130279541, 0.6840394735336304, 1.0479388236999512, 0.2274094671010971, 0.17887642979621887, 2.2029988765716553, 0.9377766847610474, 0.31960272789001465, 0.5836368799209595, 0.6761590242385864, 0.13493165373802185, 0.12582474946975708, 0.992216169834137, 0.47456759214401245, 0.6922589540481567, -0.1855705976486206, -0.6971334218978882, -0.887053370475769, -0.21104511618614197, -0.13083705306053162, 0.6962928771972656, 0.7555514574050903, 1.3254557847976685, 0.5020895600318909, -1.2432564496994019, -0.5599234104156494, 0.451595664024353, -1.6830817461013794, -0.9948074221611023, -1.536298394203186, -2.5452537536621094, -1.4227041006088257, -2.4566104412078857, -0.916395902633667, -1.3843921422958374, -1.54200279712677, -2.229848623275757, -3.1529195308685303, -1.3960180282592773, -0.5726909041404724, -2.195634365081787, -0.89063560962677, -1.669413685798645, -1.1913962364196777, -1.4361872673034668, -1.5772064924240112, -1.261489987373352, -1.1307697296142578, -1.1318963766098022, -0.0918487161397934, -0.2859872579574585, -0.0038845925591886044, -0.8310121893882751, -0.09143610298633575, -0.6529207229614258, -0.8132506608963013, -1.2922431230545044, 0.09331739693880081, -0.9592680931091309, -0.2886314392089844, -0.556973934173584, -0.13302180171012878, -0.8495572805404663, -0.41999366879463196, -0.8087546229362488, 0.198253333568573, -0.7250763773918152, -0.419642835855484, -0.7244623303413391, -0.06659039855003357, -0.3718365430831909, -0.4105495810508728, -0.215079665184021, -0.22190220654010773, -0.42824459075927734, -0.45153114199638367, 0.07241658866405487, -0.01894005388021469, -0.7611389756202698, -0.8470483422279358, -0.31710442900657654, 0.20214024186134338, 0.05845746025443077, 0.6913867592811584, -0.3538076877593994, 0.2046125829219818, 0.05244406685233116, -1.2302556037902832, -1.4253175258636475, -1.4894293546676636, -1.1133145093917847, -0.6371009349822998, -0.26700738072395325, -1.589145302772522, -3.0421440601348877, -2.5315396785736084, -1.1917030811309814, -1.0585963726043701, -0.8579204082489014, 0.012722031213343143, -0.6749125719070435, -0.48217421770095825, -0.908758282661438, -0.3413941264152527, -0.27042534947395325, -2.178652048110962, -1.0290472507476807, -0.2445281744003296, -0.42455798387527466, -0.47516241669654846, -0.08350427448749542, -0.1550547033548355, -0.808168351650238, -0.5934821367263794, -0.6217980980873108, 0.21059148013591766, 0.5637927651405334, 0.7217454314231873, 0.11845924705266953, 0.2433079332113266, -0.40325722098350525, -0.6194440722465515, -1.277657151222229, -0.9599111080169678, 1.0990023612976074, 0.9493449926376343, -0.7359316945075989, 1.8650768995285034, 0.3666505217552185, 1.5127782821655273, 2.500866413116455, 1.046462059020996, 2.5280137062072754, 1.0011956691741943, 1.298850417137146, 1.4209318161010742, 1.907609462738037, 3.1470844745635986, 1.4042335748672485, 0.5238806009292603, 2.051941156387329, 1.0599504709243774, 1.5536439418792725, 1.200449824333191, 1.3390061855316162, 1.4206416606903076, 1.3061033487319946, 1.1451112031936646, 1.085272192955017, -0.0269584059715271, 0.4277454614639282, 0.352082222700119, 0.8048105835914612, 0.2562040686607361, 0.63601154088974, 0.2687901556491852, 1.3364198207855225, -1.5643867254257202, 0.7271315455436707, 0.3902602195739746, 0.5086250305175781, 0.019958999007940292, 0.7116518616676331, 0.26307493448257446, 0.8241589665412903, -0.1213846281170845, 0.6629634499549866, 0.469207227230072, 0.7397229671478271, 0.002996389754116535, 0.378352552652359, 0.21426089107990265, 0.3714514970779419, -0.12755392491817474, 0.24016432464122772, -0.04230710119009018, -0.08580906689167023, -0.1108865737915039, 0.5956770777702332, 0.5284342169761658, 0.06305302679538727, -0.2407395839691162, -0.06492673605680466, -0.4916420578956604, 0.48577985167503357, -0.05260702967643738, -0.017427964136004448, 1.1616544723510742, 1.3033207654953003, 1.527848720550537, 0.8932463526725769, 0.6445272564888, 0.34491854906082153, 2.7684473991394043, 3.137208938598633, 1.8608629703521729, 0.8548393249511719, 1.038639783859253, 0.969724178314209, -0.04320814833045006, 0.6414285898208618, 0.23999328911304474, 0.7778677344322205, 0.21761074662208557, 0.2329217940568924, 1.8669438362121582, 0.9623836874961853, 0.2308725118637085, 0.565108597278595, 0.4916509985923767, 0.2452893853187561, 0.03085728920996189, 1.0297038555145264, 1.161635398864746, 9.901204109191895, -0.037529539316892624, -0.034997567534446716, -0.25338688492774963, -0.13454227149486542, -0.11158210039138794, -18.728437423706055, 9.621607780456543, 3.5917532444000244, 1.9448347091674805, -20.65024757385254, -42.4472770690918, -19.592294692993164, -20.647571563720703, -4.62833833694458, 28.306325912475586, -0.8437386751174927, -2.100412130355835, -1.5205261707305908, -0.5225315093994141, -0.4469055235385895, -0.7152748107910156, -0.9462557435035706, 63.9045295715332, -0.2729223370552063, -14.389724731445312, 84.22908020019531, 8.377567291259766, 30.610279083251953, -0.31653136014938354, -0.3664127290248871, 24.170867919921875, -0.1791929006576538, -0.28324368596076965, -0.3008226454257965, -0.2024661749601364, 17.34783172607422, -0.1773824244737625, 10.670148849487305, -15.724040031433105, 10.213678359985352, -0.523842453956604, 9.429829597473145, -0.12077674269676208, -0.27457189559936523, -5.163954734802246, 1.272387981414795, -0.011837265454232693, -0.31433790922164917, -18.261398315429688, -0.08460602909326553, -0.13487930595874786, -0.13316690921783447, -1.7036172151565552, -0.09511967748403549, -0.11062435805797577, -0.30078181624412537, -0.23387794196605682, -0.2043824940919876, -0.008378877304494381, -0.16227345168590546, -0.05657045170664787, -0.004089131485670805, 2.3013627529144287, -0.11511880159378052, -0.3900409936904907, -0.03357267752289772, 0.09713973104953766, -0.06123226508498192, 23.043460845947266, -0.15792202949523926, 0.5550811290740967, -0.5657082796096802, 4.1439738273620605, 16.765918731689453, 7.856770038604736, 3.7772812843322754, -0.3124656081199646, -0.24940313398838043, 26.295475006103516, 9.135519981384277, 24.17909812927246, 1.034959077835083, -0.32065704464912415, -0.25986477732658386, -0.11530362069606781, -0.11686141043901443, 2.478963613510132, -0.3795199990272522, -0.20295530557632446, -0.8074599504470825, -8.034762382507324, -0.20650243759155273, -0.02028665877878666, -0.1514805406332016, 4.266226768493652, 0.04247583448886871, 0.06836718320846558, -0.20406463742256165, -0.5735689997673035, -0.6491272449493408, 0.21906250715255737, 0.494365930557251, 0.8071540594100952, 0.0334816537797451, 0.22439631819725037, -0.6350592970848083, -0.8927509188652039, -1.1994280815124512, -0.3454638719558716, 1.360395073890686, 0.6474078893661499, -0.34175536036491394, 1.647518515586853, 4.405701160430908, 1.4605927467346191, 2.532263994216919, 1.3597887754440308, 2.638451099395752, 0.93550044298172, 1.1695266962051392, 1.385097861289978, 2.195150852203369, 3.080515146255493, 1.5983755588531494, -0.24432700872421265, 2.2464468479156494, 0.9010893106460571, 1.572930097579956, 1.0414245128631592, 1.3396254777908325, 1.42471444606781, 1.398648738861084, 1.0746119022369385, 1.1420326232910156, 0.1576615273952484, 0.3397315740585327, 0.366732656955719, 0.7686574459075928, 0.25425392389297485, 0.6464563012123108, 0.8529269099235535, 1.6066452264785767, -0.2350366711616516, 1.218779444694519, 0.41390281915664673, 0.6849692463874817, 0.1032264307141304, 0.9038705825805664, 0.40969911217689514, 0.8061321377754211, -0.007514185272157192, 0.8002212047576904, 0.636906087398529, 0.6225029826164246, 0.10163066536188126, 0.43249842524528503, 0.20222121477127075, 0.23062479496002197, 0.17807506024837494, 0.32355037331581116, 0.3264802396297455, -0.026255814358592033, 0.05942526087164879, 0.6613010764122009, 0.6608654856681824, 0.18090984225273132, -0.2652311623096466, -0.173283651471138, -0.6474335789680481, 0.46031659841537476, -0.08340457081794739, -0.22317831218242645, 1.1539905071258545, 1.3967328071594238, 1.5373455286026, 1.103622555732727, 0.6668803691864014, 0.29313352704048157, 1.6417579650878906, 3.069558620452881, 3.0869791507720947, 1.1489677429199219, 0.9195663332939148, 0.8410302996635437, -0.03998010605573654, 0.5659787654876709, 0.5179091691970825, 0.9202679991722107, 0.28998124599456787, 0.2542988955974579, 2.3246243000030518, 0.9346193075180054, 0.2826792895793915, 0.6018133163452148, 0.5234222412109375, 0.17786912620067596, 0.1881076842546463, 1.0357930660247803, 0.37237221002578735, 0.7068068981170654, -0.10552673041820526, -0.6631776094436646, -0.7714059352874756, -0.10107984393835068, -0.2909369170665741, 0.7923951148986816, 0.7781870365142822, 1.2708126306533813, 0.4253212511539459, -1.284758448600769, -0.6904871463775635, 0.47444450855255127, -1.8804067373275757, -4.379486560821533, -1.2785688638687134, -2.604724884033203, -1.4224328994750977, -2.605142593383789, -0.9149799942970276, -1.2751669883728027, -1.5686715841293335, -2.2349438667297363, -3.1050732135772705, -1.394572377204895, 0.426139235496521, -2.104841947555542, -1.0131640434265137, -1.5292565822601318, -1.092477560043335, -1.4689770936965942, -1.5540196895599365, -1.3346068859100342, -1.1286195516586304, -1.258900761604309, -0.17095187306404114, -0.4415469765663147, -0.31653445959091187, -0.8867587447166443, -0.049468234181404114, -0.7606491446495056, -0.8480420708656311, -1.43607759475708, 0.26081132888793945, -1.20256769657135, -0.46141284704208374, -0.48690858483314514, -0.14974823594093323, -0.7698106169700623, -0.42254629731178284, -0.8224038481712341, 0.10380443930625916, -0.7524206638336182, -0.7027066946029663, -0.8763280510902405, -0.09425270557403564, -0.5666542053222656, -0.3628547787666321, -0.3854634463787079, -0.27234748005867004, -0.27971360087394714, -0.4404471218585968, 0.033304363489151, -0.19578883051872253, -0.745542585849762, -0.760949432849884, -0.32081153988838196, 0.31439197063446045, 0.11365415155887604, 0.633655846118927, -0.45060428977012634, 0.15381814539432526, 0.17077188193798065, -1.2179279327392578, -1.493625521659851, -1.530032753944397, -0.9708558320999146, -0.6265876293182373, -0.3226151764392853, -1.619158148765564, -3.032395124435425, -3.4046685695648193, -1.3324408531188965, -1.078819751739502, -0.9526862502098083, 0.10458800941705704, -0.7081135511398315, -0.5134581327438354, -1.0260261297225952, -0.3427356481552124, -0.09988962858915329, -2.395115613937378, -1.0176409482955933, -0.3654569983482361, -0.5655829310417175, -0.4464222490787506, -0.11648882180452347, -0.04751931503415108, -0.9193633198738098, -0.4093737006187439, -0.6794418096542358, 0.538090705871582, -1.5771551132202148, 0.4940848648548126, -0.475830614566803, -0.10659348964691162, -0.8613696098327637, 0.815110445022583, 0.8824114203453064, -0.43883809447288513, -0.5048105120658875, -0.4345971345901489, 1.0691962242126465, -0.8596880435943604, 1.1182911396026611, -0.28860053420066833, 0.41895654797554016]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (1.54, 2.5)}}, 'et4_eta2': {'discriminator': {'threshold': 0.62999845743179317, 'nodes': [100, 7, 1], 'bias': [0.2617207169532776, -0.09929532557725906, -0.005016771145164967, 0.01386977918446064, 0.03250758349895477, -0.06407539546489716, 0.10685599595308304, -0.12187347561120987], 'weights': [-1.199082374572754, 0.04656407609581947, 0.20531979203224182, 0.7296028733253479, 0.4635359048843384, 0.3549058437347412, -0.03367256373167038, 0.7378533482551575, 0.006520850118249655, -1.7109954357147217, -1.3579293489456177, -0.9316742420196533, -0.19753077626228333, 0.17953670024871826, 0.09031382203102112, -0.27410244941711426, 1.21454918384552, 0.2556364834308624, 0.4339869022369385, 0.2299942672252655, 1.1637403964996338, 2.030143976211548, 0.08354060351848602, 0.34558212757110596, 0.8569033741950989, 0.26701757311820984, 0.5901845097541809, 0.6635958552360535, 3.5414912700653076, 2.1423134803771973, 0.2294524610042572, 0.4037497043609619, 0.25770220160484314, 0.35666924715042114, 0.2899927794933319, 0.6750504374504089, 3.4330482482910156, 1.0259796380996704, 1.0824795961380005, 0.6384493112564087, 0.9241836071014404, 1.5686055421829224, 0.7037254571914673, 0.2379872351884842, -0.1277540773153305, 0.08216521888971329, 1.2299778461456299, 0.09574083983898163, 0.1815401166677475, 0.27585047483444214, 0.3812668025493622, -0.28592103719711304, 0.9964554905891418, 0.5828621983528137, 0.3051263689994812, -0.6516976356506348, 0.6308650374412537, -0.6287418603897095, 0.06487537920475006, 0.3375721573829651, 0.24116498231887817, 0.399440735578537, 1.3256276845932007, 0.6574133634567261, 1.446028470993042, 0.7139179706573486, 0.7446342706680298, 0.5182504057884216, 0.6090033650398254, 0.625433623790741, 0.5985376834869385, 0.3289506435394287, -0.05630738288164139, 0.20690375566482544, 1.9794971942901611, 1.1038316488265991, 1.3075302839279175, 0.609601616859436, 0.868517279624939, 0.415502667427063, 0.3067322373390198, 0.03904613479971886, 2.0282180309295654, 1.053371787071228, 0.30868881940841675, -0.8434215784072876, 0.5384722948074341, 0.998020589351654, -0.7636846899986267, 0.4631771743297577, 0.31237831711769104, 0.17431049048900604, 3.3461546897888184, 2.1982741355895996, 1.238305687904358, 0.4995076656341553, 0.03218848630785942, 0.09530129283666611, 0.5305764079093933, 0.576552152633667, -0.6420695781707764, 0.2542959153652191, 1.3605433702468872, 2.0910770893096924, 1.3802176713943481, 0.9903801679611206, 0.2790902256965637, 1.715165615081787, -0.05241371691226959, -3.921043872833252, -3.2381484508514404, -1.8061994314193726, -0.18538765609264374, -0.05606934800744057, -0.09095992892980576, -0.09465332329273224, 3.1976921558380127, -0.02497786656022072, 0.16798436641693115, 0.915084719657898, 3.0084352493286133, 4.830656051635742, 0.5200414657592773, 0.9390490055084229, 2.4810855388641357, 0.9523731470108032, 7.853673458099365, 1.6567965745925903, 7.956750392913818, 4.892110347747803, 0.8726530075073242, 1.4740444421768188, 1.1834298372268677, 2.8549044132232666, 4.226935863494873, 1.7545195817947388, 7.859976291656494, 2.4172916412353516, 2.588454008102417, 1.7589004039764404, 2.1907854080200195, 3.561525821685791, 1.6452295780181885, 2.2264137268066406, 0.6648275852203369, 0.6756118535995483, 2.843770742416382, 0.8039820194244385, 0.7652207016944885, 2.053952932357788, 0.8849445581436157, -0.5286306142807007, 2.112271785736084, 1.7383499145507812, 0.9225568771362305, -1.380336046218872, 1.4952472448349, -0.8224055767059326, -1.1865663528442383, 0.8611737489700317, 0.5567664504051208, 1.416256308555603, 3.0695550441741943, 1.712885856628418, 3.2570877075195312, 1.5307596921920776, 2.3422300815582275, 1.6887884140014648, 1.5337268114089966, 1.4789378643035889, 1.6421314477920532, 0.9208935499191284, -0.5786811709403992, -0.0652947872877121, 4.386538028717041, 2.9333114624023438, 2.982999801635742, 1.5842301845550537, 2.4453229904174805, 1.2320727109909058, -0.10164570808410645, 0.740286648273468, 4.954085826873779, 2.6121160984039307, 1.0759104490280151, -1.2665412425994873, 1.6063791513442993, 2.5454864501953125, -0.3626367151737213, 1.0510146617889404, 1.6065025329589844, 0.9974485635757446, 8.004694938659668, 5.0456743240356445, 2.813222885131836, 1.3321949243545532, -0.005931098014116287, 0.10253987461328506, 1.3715828657150269, 1.5512897968292236, -0.5580244064331055, 0.39332470297813416, 1.4604781866073608, 2.015458106994629, 1.5754472017288208, 0.9694701433181763, 0.12348112463951111, 1.8239972591400146, -0.15916378796100616, -3.8626937866210938, -3.0769317150115967, -2.1775729656219482, -0.256427526473999, -0.2031354010105133, -0.1670435220003128, -0.06627321988344193, 3.07605242729187, -0.18094182014465332, -0.06480242311954498, 0.7439988255500793, 3.0167593955993652, 4.875162124633789, 0.41554611921310425, 0.8810564279556274, 2.3811585903167725, 0.8411372303962708, 2.316687822341919, 1.5723975896835327, 7.848791122436523, 4.988923072814941, 0.8879119753837585, 1.6937354803085327, 1.1807661056518555, 1.7647042274475098, 4.127403259277344, 1.7034803628921509, 7.954260349273682, 2.405754804611206, 2.6305832862854004, 1.7620971202850342, 1.9939932823181152, 3.5212669372558594, 1.4896392822265625, 2.2021868228912354, 0.7211077213287354, 0.45960116386413574, 2.8806607723236084, 0.9822272658348083, 0.7168512940406799, 1.997719407081604, 1.0181657075881958, -0.584338903427124, 2.08488130569458, 1.5234706401824951, 0.8245189189910889, -1.2640483379364014, 1.412737250328064, -1.014040231704712, 0.25493770837783813, 0.9143096208572388, 0.4462814927101135, 1.4634040594100952, 3.0987770557403564, 1.8433420658111572, 3.419429302215576, 1.7040537595748901, 2.0836362838745117, 1.7018086910247803, 1.4518789052963257, 1.6004843711853027, 1.4147433042526245, 0.885858416557312, -0.48173049092292786, -0.5499522686004639, 4.570881366729736, 2.842937469482422, 2.871220827102661, 1.5618584156036377, 2.2895889282226562, 1.315529465675354, 0.06335403025150299, 0.5574368238449097, 4.997497081756592, 2.7653884887695312, 1.0977863073349, -1.3368310928344727, 1.6323343515396118, 2.469188928604126, -0.475273996591568, 1.1088588237762451, 1.5990040302276611, 0.884307324886322, 7.866081714630127, 5.083061218261719, 2.8148746490478516, 1.3715864419937134, -0.03885543718934059, -0.04433303326368332, 0.4738650918006897, 1.6801223754882812, 0.5659589171409607, -0.3973660171031952, -1.340793490409851, -2.0771889686584473, -1.3621615171432495, -1.0556734800338745, -0.23205049335956573, -1.8323252201080322, 0.12092233449220657, 3.75590181350708, 3.249427080154419, 2.0822601318359375, 0.3148649334907532, 0.11203834414482117, -0.013941667042672634, 0.0773695781826973, -2.978292226791382, 0.021314475685358047, 0.05332275480031967, -0.6841344237327576, -2.9114952087402344, -4.9379048347473145, -0.3879004120826721, -1.0109463930130005, -2.377368211746216, -0.9028151631355286, -2.2357802391052246, -1.4990040063858032, -7.909063816070557, -4.934169292449951, -0.8280583620071411, -1.4909025430679321, -1.134150743484497, -2.802126169204712, -4.241472244262695, -1.698750376701355, -7.860925197601318, -2.3732221126556396, -2.6382784843444824, -1.702906608581543, -2.072350025177002, -3.611637592315674, -1.5298588275909424, -2.2180089950561523, -0.6474041938781738, -0.6767086982727051, -2.8410837650299072, -0.8066666126251221, -0.7584149241447449, -1.885524868965149, -1.0379120111465454, 0.39286839962005615, -2.290600299835205, -1.7707421779632568, -0.8907083868980408, 1.3172907829284668, -1.4665154218673706, 1.0246610641479492, -0.3834729790687561, -1.0242635011672974, -0.6360778212547302, -1.5279887914657593, -3.2610692977905273, -1.7313520908355713, -3.304475784301758, -1.7252439260482788, -2.2220873832702637, -1.7486913204193115, -1.4446333646774292, -1.491459608078003, -1.6576067209243774, -0.952872633934021, 0.5044817328453064, 0.522040605545044, -4.3985466957092285, -2.750579595565796, -2.8610687255859375, -1.6051177978515625, -2.276841640472412, -1.3428438901901245, 0.009678386151790619, -0.7363388538360596, -4.961111068725586, -2.642904043197632, -1.092788577079773, 1.3029303550720215, -1.7117785215377808, -2.522066831588745, 0.45609137415885925, -1.0616670846939087, -1.7577388286590576, -0.8381150960922241, -7.887571811676025, -5.148916721343994, -2.911863327026367, -1.2740260362625122, -0.05228741466999054, 0.0640641450881958, -0.678358256816864, -1.5088486671447754, -0.7585100531578064, 0.24690280854701996, 1.491066336631775, 2.1176671981811523, 1.3803449869155884, 1.0477854013442993, 0.2841241955757141, 1.8174431324005127, -0.1158878430724144, -3.7308034896850586, -3.196366548538208, -2.0819554328918457, -0.26281511783599854, -0.19266608357429504, 0.01754525676369667, -0.10219784080982208, 3.0718727111816406, -0.06902283430099487, -0.133313849568367, 0.5706177353858948, 2.9574437141418457, 4.9897236824035645, 0.5128845572471619, 0.9910563230514526, 2.330735445022583, 0.8670439124107361, 2.3793842792510986, 1.4715439081192017, 7.923746585845947, 4.995925426483154, 0.9347348809242249, 1.568109393119812, 1.0414421558380127, 1.8422110080718994, 4.104082107543945, 1.62822687625885, 7.85090970993042, 2.2839040756225586, 2.5488712787628174, 1.7019267082214355, 2.0041286945343018, 3.5792922973632812, 1.5251822471618652, 2.205839157104492, 0.7895069122314453, 0.5379122495651245, 2.8484840393066406, 0.7872741222381592, 0.7096336483955383, 1.8969358205795288, 0.9090040922164917, -0.3916996717453003, 2.098754644393921, 1.770819902420044, 0.8679854273796082, -1.3006939888000488, 1.4268206357955933, -0.9077816009521484, 0.37661105394363403, 1.0032528638839722, 0.5596379637718201, 1.3727277517318726, 3.062189817428589, 1.8172791004180908, 3.4061639308929443, 1.6440497636795044, 2.24149227142334, 1.8443653583526611, 1.5291966199874878, 1.6765329837799072, 1.4972254037857056, 0.97321617603302, -0.6068288683891296, -0.4320228397846222, 4.402719020843506, 2.7863337993621826, 2.9500136375427246, 1.6206917762756348, 2.2972049713134766, 1.387008786201477, 0.021307941526174545, 0.6317957043647766, 5.002443313598633, 2.7371201515197754, 0.9843219518661499, -1.2883226871490479, 1.5675159692764282, 2.628980875015259, -0.579679548740387, 1.1656181812286377, 1.588566541671753, 0.8931626677513123, 7.832260608673096, 5.035940647125244, 2.797762393951416, 1.3244043588638306, 0.11319255083799362, 0.09631530940532684, 0.5693351626396179, 1.650315523147583, -0.5736979842185974, 0.29907727241516113, 1.3671034574508667, 1.9833605289459229, 1.502862811088562, 1.3528274297714233, 0.3030700087547302, 1.795560598373413, -0.03257882595062256, -3.780787467956543, -3.216874361038208, -1.9621294736862183, -0.13271425664424896, -0.15094463527202606, -0.030625861138105392, -0.16971103847026825, 3.0409996509552, -0.12825803458690643, 0.04007377102971077, 0.7174224257469177, 2.968981981277466, 4.984785079956055, 0.32645779848098755, 0.8364684581756592, 2.485739231109619, 0.9804881811141968, 8.059494972229004, 1.6594182252883911, 7.890863418579102, 4.903045654296875, 0.9115142822265625, 2.224780559539795, 1.2443386316299438, 2.905517816543579, 4.1217041015625, 1.7049399614334106, 7.890573501586914, 2.33084774017334, 2.1968533992767334, 1.7856111526489258, 2.0114638805389404, 3.613615036010742, 1.5108184814453125, 2.332899332046509, 0.8047070503234863, 0.6067267656326294, 2.870006799697876, 0.7819770574569702, 0.8261892199516296, 1.9574702978134155, 0.8984113931655884, -0.5123070478439331, 2.1647262573242188, 1.563424825668335, 0.84149169921875, -1.3284196853637695, 1.5815709829330444, -0.9307830333709717, -1.3651620149612427, 0.8764187097549438, 0.6924583315849304, 1.5096555948257446, 3.087284564971924, 1.904294490814209, 3.3959085941314697, 1.6763912439346313, 2.1565194129943848, 1.8633981943130493, 1.5981062650680542, 1.646390438079834, 2.2126824855804443, 0.8007594347000122, -0.5922732949256897, -0.34366941452026367, 4.606023788452148, 2.826465129852295, 2.975831985473633, 1.596818208694458, 2.3216636180877686, 1.2806814908981323, 0.04759327322244644, 0.6352857947349548, 4.785883903503418, 2.5806756019592285, 1.406389832496643, -1.2826743125915527, 1.6320470571517944, 2.5798261165618896, -0.49233919382095337, 1.131220817565918, 1.6612789630889893, 0.7703039646148682, 7.94516658782959, 5.1233720779418945, 3.010620594024658, 1.1783536672592163, -0.01573571376502514, -0.024500656872987747, 0.6910185217857361, 1.6006724834442139, 0.73480224609375, -0.32068580389022827, -1.3771878480911255, -1.9521775245666504, -1.4876173734664917, -1.12008798122406, -0.25979989767074585, -1.6781861782073975, 0.06118091195821762, 3.953031539916992, 3.1361849308013916, 1.9844274520874023, 0.29850277304649353, 0.06268055737018585, 0.04694410413503647, 0.1091935783624649, -3.0240843296051025, 0.19513481855392456, -0.07628891617059708, -0.8516464829444885, -2.9313080310821533, -4.892584323883057, -0.3320695757865906, -0.9883604049682617, -2.3850913047790527, -0.7895957827568054, -7.873676300048828, -1.4846075773239136, -7.826855659484863, -4.971644401550293, -1.0073684453964233, -2.2506613731384277, -1.0835527181625366, -4.091296195983887, -4.484903812408447, -1.779901146888733, -7.877384662628174, -2.282275438308716, -2.141773223876953, -1.7564873695373535, -2.041640281677246, -3.6518912315368652, -1.7103898525238037, -2.209954261779785, -0.7307230234146118, -0.5389871597290039, -3.0585718154907227, -0.9420704245567322, -0.7042399048805237, -1.9312578439712524, -0.941736102104187, 0.4209376573562622, -2.2973058223724365, -1.625028371810913, -0.8337602615356445, 1.309154987335205, -1.4649492502212524, 0.873340368270874, 1.2697153091430664, -0.9467819929122925, -0.567506730556488, -1.449963927268982, -3.1961958408355713, -1.8695497512817383, -3.442155361175537, -1.5416744947433472, -2.278475046157837, -1.645463228225708, -1.427484154701233, -1.6315269470214844, -2.216616630554199, -0.9113065004348755, 0.5815272927284241, 0.045872725546360016, -4.606292724609375, -2.7505600452423096, -2.847938060760498, -1.7729849815368652, -2.4185187816619873, -1.281830906867981, 0.05344507470726967, -0.5244730114936829, -4.86573600769043, -2.5995500087738037, -1.3698476552963257, 1.1978867053985596, -1.682853102684021, -2.67765474319458, 0.36277589201927185, -1.0264809131622314, -1.5784780979156494, -0.7622487545013428, -8.03172779083252, -5.162149429321289, -2.980487823486328, -1.2984944581985474, 0.12434207648038864, 0.039750874042510986, -1.3124161958694458, -1.572436809539795, -0.18876421451568604, -1.0405422449111938, -1.1355165243148804, 1.2341020107269287, -1.3890950679779053, -0.7059615850448608, 0.9352350831031799]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (1.37, 1.54)}}, 'et2_eta1': {'discriminator': {'threshold': 0.27499879598617555, 'nodes': [100, 5, 1], 'bias': [-0.029061544686555862, 0.07115764915943146, 0.019344959408044815, -0.1757797747850418, 0.06782937049865723, -0.12644730508327484], 'weights': [1.756556749343872, 1.2913234233856201, -0.6442728638648987, -1.5849488973617554, -0.9681591987609863, -0.34703120589256287, -0.480928897857666, 0.4635566473007202, 2.7999629974365234, 3.682180166244507, -0.25811320543289185, -7.650780200958252, -7.506412982940674, -2.8826897144317627, -4.782769203186035, -4.413056373596191, -5.161284923553467, -5.507318019866943, -6.594288349151611, -8.124002456665039, -5.251914024353027, -5.55857515335083, -4.189398765563965, -3.764343500137329, -3.9656152725219727, -3.849748373031616, -3.895353317260742, -3.9420130252838135, -2.9963934421539307, -3.193568468093872, -2.3932883739471436, -2.0835120677948, -3.698894739151001, -3.1520891189575195, -1.6031136512756348, -2.793837308883667, -2.235158920288086, -2.0529158115386963, -1.532468318939209, -1.538753867149353, -1.6580761671066284, -1.62722909450531, -2.9714083671569824, -2.1453359127044678, -1.2659714221954346, -1.2260502576828003, -1.1973389387130737, -1.5025995969772339, -0.7388455867767334, -1.0183221101760864, -1.0035122632980347, -0.6884371042251587, -0.45175278186798096, -0.980915367603302, -1.9811737537384033, -1.226658821105957, -0.8294365406036377, 1.6171855926513672, -0.8794742226600647, 0.7183095216751099, -0.0653151199221611, 0.7566898465156555, -1.123794436454773, 0.6581045985221863, -0.892948567867279, -2.1357944011688232, -0.9593702554702759, -4.708323001861572, 2.789361000061035, 1.1390219926834106, -0.673845648765564, -0.5312865376472473, 0.44715917110443115, 0.2671221196651459, -0.8546791076660156, -1.6015502214431763, -1.6695938110351562, -1.5275843143463135, -0.7200620770454407, -0.3451833724975586, -6.460891246795654, -5.874619483947754, -4.774132251739502, -1.8811436891555786, -2.728989362716675, -2.566389322280884, -2.4971728324890137, -2.8685085773468018, -2.284651279449463, -1.2398645877838135, -0.21698573231697083, 0.20892733335494995, -3.9181132316589355, -2.788163900375366, -1.217857003211975, -0.10672779381275177, -2.2597343921661377, -2.228713274002075, -1.4868111610412598, -0.750899612903595, -1.8251063823699951, -1.1889960765838623, 0.6020057201385498, 1.9034740924835205, 0.8605738878250122, 0.3944154679775238, 0.4633791446685791, -0.41065654158592224, -2.585116147994995, -3.7739741802215576, 0.3409169614315033, 7.6753387451171875, 7.5409321784973145, 2.9287683963775635, 4.767678260803223, 4.38762092590332, 5.017165184020996, 5.328006267547607, 6.601678371429443, 7.975613594055176, 5.219958782196045, 5.472799301147461, 4.325254440307617, 3.6673357486724854, 3.8112282752990723, 3.7330210208892822, 3.943687915802002, 3.9255552291870117, 3.2157070636749268, 3.1839513778686523, 2.017850637435913, 1.9788899421691895, 3.794508218765259, 3.23036527633667, 1.584195613861084, 2.7783520221710205, 2.1057605743408203, 2.019235610961914, 1.5729364156723022, 1.368862271308899, 1.529820203781128, 1.495448350906372, 3.081106662750244, 2.3066558837890625, 1.1767699718475342, 1.0655978918075562, 1.0781625509262085, 1.524297833442688, 0.6541399359703064, 1.1615946292877197, 0.8798704743385315, 0.7337639331817627, 0.2541859447956085, 0.9900811314582825, 1.7675137519836426, 1.129771113395691, 0.9769338965415955, -1.7794710397720337, 0.7691759467124939, -0.6065599322319031, 0.1482195258140564, -0.7464447617530823, 0.8744992613792419, -0.7343985438346863, 0.726407527923584, 2.1249442100524902, 1.1226450204849243, 4.6674275398254395, -2.837620258331299, -1.1903719902038574, 0.7181248068809509, 0.3578006327152252, -0.6332944631576538, -0.36820188164711, 0.8394779562950134, 1.5812684297561646, 1.663122296333313, 1.39568030834198, 0.7244759202003479, 0.2570498585700989, 6.5370402336120605, 6.010458469390869, 4.821362018585205, 1.9636433124542236, 2.878424644470215, 2.4029808044433594, 2.4697906970977783, 2.9089889526367188, 2.214284896850586, 1.0990670919418335, 0.11416373401880264, -0.19945867359638214, 3.790609359741211, 2.692485809326172, 1.4060908555984497, 0.06774158775806427, 2.1553001403808594, 2.3251683712005615, 1.6620001792907715, 0.8532625436782837, -1.7099360227584839, -1.2301627397537231, 0.5021715760231018, 1.8247313499450684, 0.945939302444458, 0.4771892726421356, 0.4903935492038727, -0.09884621948003769, -2.664012908935547, -5.259884357452393, 0.17000038921833038, 7.530425548553467, 7.669373035430908, 3.3012807369232178, 5.463374614715576, 4.286874771118164, 4.752519130706787, 5.408957481384277, 6.580020427703857, 8.038166999816895, 5.39423942565918, 5.578622817993164, 4.286208629608154, 3.6949238777160645, 3.929547071456909, 3.9175729751586914, 3.845604181289673, 3.8423171043395996, 3.210578680038452, 3.119899272918701, 2.041748285293579, 2.093860387802124, 3.69392991065979, 3.1492950916290283, 1.6160717010498047, 2.758650541305542, 10.607393264770508, 2.0824766159057617, 1.5606777667999268, 1.5439600944519043, 1.5530520677566528, 1.5601545572280884, 2.937656879425049, 5.104233264923096, 1.126531958580017, 1.0010255575180054, 1.0651741027832031, 1.4039077758789062, 0.6661118865013123, 1.0402370691299438, 0.8780915141105652, 0.6724119186401367, 0.3289961516857147, 0.9449458718299866, 1.8488469123840332, 1.0976601839065552, 0.8687697649002075, -1.6527490615844727, 0.9001840949058533, -0.715388298034668, 0.20300573110580444, -0.8392341732978821, 0.8850993514060974, -0.5326457619667053, 0.8001212477684021, 2.162041425704956, 1.0569554567337036, 4.742851734161377, -2.983938694000244, -1.0209124088287354, 0.7210585474967957, 0.48225831985473633, -0.6464027166366577, -0.26115816831588745, 0.8636200428009033, 1.447980523109436, 1.7011079788208008, 1.4112581014633179, 0.5829867124557495, 0.3114790916442871, 6.44392728805542, 5.825753688812256, 4.810171604156494, 2.026542901992798, 2.933964729309082, 2.6101925373077393, 2.485071897506714, 2.860532760620117, 2.2968432903289795, 0.997700035572052, 0.3955303728580475, -0.30924278497695923, 3.8440232276916504, 2.788963794708252, 1.2485867738723755, 0.19045573472976685, 2.2942357063293457, 2.351768732070923, 1.6125611066818237, 0.8414639234542847, 20.88359260559082, 31.831382751464844, 9.05165958404541, 9.187932014465332, 6.873650550842285, -0.43468737602233887, -0.3632810413837433, -1.234576940536499, 2.125072479248047, 3.703941583633423, -49.585018157958984, -16.155927658081055, -7.2475433349609375, -3.656810760498047, 14.766789436340332, -4.583640098571777, 4.278796672821045, -5.192634582519531, -6.532622337341309, -6.883738994598389, -5.28041410446167, -5.3762593269348145, -3.8572585582733154, -3.653829336166382, -3.800105094909668, -3.688180685043335, -3.904364824295044, -3.8323862552642822, -2.3485937118530273, -2.9538862705230713, -0.3947434723377228, 30.834009170532227, -1.900402307510376, -3.1014208793640137, -1.5573399066925049, -1.6298186779022217, -1.747907042503357, 12.356527328491211, 2.288511276245117, -1.461673378944397, -1.594153881072998, -1.4787530899047852, -1.508923053741455, -1.3912208080291748, 0.6374366283416748, 27.280359268188477, -1.0602654218673706, -1.3706649541854858, -0.6846879124641418, -0.8656125664710999, -0.938352644443512, -0.8656972050666809, -0.33948320150375366, -0.644707441329956, -0.814270555973053, -0.9944366812705994, 0.20980395376682281, 2.78497314453125, -0.773296058177948, 0.6998165845870972, -0.0296720452606678, 0.8005335927009583, -0.7668218612670898, 0.9622485041618347, 35.79130172729492, -2.155447244644165, -1.1117959022521973, 7.3101372718811035, 3.9213907718658447, 1.115527868270874, -0.5450289845466614, -25.06943702697754, 0.6501583456993103, 0.35701680183410645, -0.4462127089500427, -1.407095193862915, -1.5555520057678223, -1.4034217596054077, -0.45231354236602783, 7.305209636688232, -6.618852138519287, -6.079617500305176, -4.787984371185303, -2.0228593349456787, -2.7799034118652344, -2.4050915241241455, -2.4526658058166504, -2.8808984756469727, -2.223472833633423, -1.108133316040039, 0.03166186064481735, 0.39704400300979614, -4.002893447875977, -2.654981851577759, 1.6041043996810913, -0.05317008122801781, -2.1770665645599365, -2.170841693878174, -1.4249660968780518, -1.2949405908584595, -1.652388095855713, -1.2862921953201294, 0.5910248160362244, 1.614255666732788, 0.8507240414619446, 0.3029228746891022, 0.48638105392456055, -0.3356124460697174, -2.662548303604126, -3.5910162925720215, 0.15870735049247742, 7.67800760269165, 7.494472503662109, 3.038341999053955, 4.732555866241455, 7.630685329437256, 5.172760486602783, 5.504209995269775, 6.750641345977783, 13.654948234558105, 5.356211185455322, 5.479427814483643, 4.28655481338501, 3.6980645656585693, 3.7917423248291016, 3.72448992729187, 3.823179006576538, 3.719677448272705, 3.019810914993286, 3.159137010574341, 2.079592704772949, 1.9767004251480103, 3.693387269973755, 3.260141372680664, 1.5015668869018555, 2.646851062774658, 2.065035343170166, 2.190626382827759, 1.538841962814331, 1.4817231893539429, 1.653130054473877, 1.5101487636566162, 2.965825080871582, 2.1524746417999268, 1.0672770738601685, 1.146170973777771, 1.0201960802078247, 1.3391920328140259, 0.6798902750015259, 1.2278106212615967, 0.9752679467201233, 0.6647459268569946, 0.3480157256126404, 0.8157556653022766, 1.9601343870162964, 1.1831120252609253, 0.7730870842933655, -1.6866580247879028, 0.8476627469062805, -0.7752824425697327, 0.1955171823501587, -0.837225615978241, 0.934605598449707, -0.557204008102417, 0.6863991618156433, 2.0814309120178223, 1.1473475694656372, 4.990849494934082, -2.940760374069214, -1.1787337064743042, 0.7082749009132385, 0.39898577332496643, -0.6279712915420532, -0.2622414827346802, 0.7054809927940369, 1.4561007022857666, 1.6185647249221802, 1.4347294569015503, 0.6452640891075134, 0.2592335343360901, 6.344031810760498, 6.005645751953125, 4.733521938323975, 1.9107235670089722, 2.928924560546875, 2.528780460357666, 2.4911437034606934, 2.9880502223968506, 2.201901912689209, 1.1779874563217163, 0.03767179325222969, -0.18527637422084808, 4.009767532348633, 2.662926197052002, 1.3664542436599731, 0.01587219350039959, 2.3132402896881104, 2.3312273025512695, 1.48741614818573, 0.8870764970779419, 3.3081960678100586, -0.9535677433013916, -1.0102258920669556, 0.5050024390220642, -0.5222199559211731]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0.8, 1.37)}}, 'et2_eta2': {'discriminator': {'threshold': 0.61999846696853633, 'nodes': [100, 5, 1], 'bias': [-0.10109030455350876, 0.025601012632250786, 0.009790373966097832, 0.030248437076807022, 0.14768828451633453, 0.0820046067237854], 'weights': [0.013845269568264484, 0.2743213474750519, 0.310118168592453, 0.17151398956775665, 0.17529729008674622, 0.1429874747991562, -0.2319413721561432, 0.12828949093818665, 0.3726005554199219, -0.5962492823600769, -0.5033279061317444, -0.30347728729248047, -0.052831731736660004, 0.12314455211162567, -0.06908852607011795, -0.1663386970758438, 0.5550441741943359, 0.11560817062854767, 0.011102594435214996, 0.3527297079563141, 0.5607606768608093, 0.21273720264434814, 0.23302459716796875, 0.2298903465270996, 0.550605833530426, 0.11658553779125214, 0.33134984970092773, 1.8676954507827759, 1.6868354082107544, 0.3319355249404907, 0.11926001310348511, 0.1792215257883072, 0.2957342863082886, 0.3581884503364563, 0.285575807094574, 0.20025599002838135, 0.46586036682128906, 0.269322007894516, -0.08669886738061905, 0.16297020018100739, 0.010665277019143105, 0.1682368665933609, -0.9233469367027283, 0.22292549908161163, -1.558304786682129, 0.08138477057218552, 0.2755179703235626, 0.34901514649391174, 0.027236755937337875, 0.24263934791088104, 0.2086063027381897, 0.2664881944656372, 0.14927932620048523, 0.08504477888345718, 0.08050014078617096, 0.35674628615379333, 0.040955062955617905, -2.062716245651245, 0.18611185252666473, 0.06885792315006256, 0.08689526468515396, 0.2101241648197174, -0.25217247009277344, 0.06563106179237366, -0.4633270502090454, 0.06968774646520615, -0.4337001442909241, -0.4462567865848541, 0.09202249348163605, 0.22709032893180847, -0.03383948653936386, -0.004440879449248314, -0.017752880230545998, 0.1602475345134735, 0.6226475834846497, 0.22604982554912567, 0.5755512714385986, 0.3946768045425415, 0.3556194007396698, 0.21822257339954376, 0.5022941827774048, 2.110691785812378, 0.727285623550415, 0.4008437693119049, 0.2247782200574875, 0.38945329189300537, 0.34790703654289246, 0.21607756614685059, -0.04521612077951431, 0.0832543820142746, 0.19141966104507446, -0.1400870680809021, 1.0426220893859863, 0.39003899693489075, 0.15603157877922058, 0.3798508644104004, -0.07521170377731323, 0.03613670915365219, 0.20907475054264069, 0.039255063980817795, -0.2530997097492218, 0.17865312099456787, 1.079930305480957, 1.0963369607925415, 0.8849352598190308, 0.5647655129432678, -0.6269519329071045, 0.2035767138004303, 0.10712769627571106, -3.554274559020996, -1.9820129871368408, -1.7706360816955566, -0.6144486665725708, -0.14882032573223114, -0.2552137076854706, -0.22436465322971344, 2.337153434753418, -0.0882270336151123, -0.0938316211104393, 0.8095298409461975, 2.6678357124328613, 1.2588188648223877, 1.1514779329299927, 1.05138099193573, 2.257552146911621, 1.0554909706115723, 1.1473232507705688, 2.4757561683654785, 7.700045585632324, 0.9344580769538879, 1.091758370399475, 0.8402213454246521, 0.9260064363479614, 1.1000162363052368, 1.146885871887207, 1.2140612602233887, 2.278388738632202, 0.8352994918823242, -0.12984758615493774, 1.0570532083511353, -0.3579023778438568, 0.89804607629776, -4.026790618896484, 1.0377442836761475, -5.790028095245361, 0.7602058053016663, 1.1032581329345703, 1.192682147026062, 0.6202642917633057, 0.8277536630630493, 0.948631763458252, 1.1038786172866821, 1.067513346672058, -0.3113504946231842, 0.6047057509422302, 0.9997115135192871, 0.38723868131637573, -9.51147747039795, 0.869415283203125, 0.5203471779823303, 0.9342073202133179, 0.7725358605384827, -1.535783052444458, 0.7961961627006531, -2.4063820838928223, 0.49834880232810974, -2.1108152866363525, -1.5864633321762085, 0.6005389094352722, 0.901448130607605, -0.04919896274805069, 0.43780717253685, -0.19765424728393555, -0.10341626405715942, 2.704650402069092, 1.2416335344314575, 2.505913257598877, 2.0846962928771973, 1.8345003128051758, 0.7891427874565125, 0.41226136684417725, 2.2611896991729736, 3.529381513595581, 1.847952961921692, 1.3003193140029907, 1.6336201429367065, 0.8838067650794983, 0.7201108932495117, -0.7386602163314819, 0.9171581864356995, 0.24124182760715485, -0.20846377313137054, 4.589450836181641, 1.6712210178375244, 1.2195923328399658, 1.931431531906128, 0.036044977605342865, -0.10623301565647125, 0.951185405254364, 0.2761964201927185, -0.17828337848186493, 0.27954038977622986, 1.181740641593933, 1.0753962993621826, 0.8633856773376465, 0.7889276146888733, -0.6758575439453125, 0.25576305389404297, 0.16141879558563232, -3.599872350692749, -2.1027839183807373, -1.8067808151245117, -0.6349226236343384, -0.1279321163892746, -0.2109157145023346, -0.23781795799732208, 2.5200068950653076, -0.21017250418663025, -0.19917631149291992, 0.9052157998085022, 2.63562273979187, 1.2347347736358643, 1.0677075386047363, 1.00037682056427, 2.143268585205078, 1.024927020072937, 1.2102587223052979, 2.469799518585205, 7.675027847290039, 1.0475271940231323, 0.9451121091842651, 0.889057457447052, 0.8876240253448486, 1.0542176961898804, 1.1757442951202393, 1.1550921201705933, 2.204414129257202, 1.067590355873108, -0.13759320974349976, 1.0383327007293701, -0.17024622857570648, 1.0218671560287476, -4.082618713378906, 0.9525879621505737, -5.8976569175720215, 0.7496383786201477, 1.0036855936050415, 1.0155681371688843, 0.7400895357131958, 0.6237994432449341, 0.8681668043136597, 0.9359938502311707, 1.0918132066726685, -0.4765489399433136, 0.638154923915863, 1.1620664596557617, 0.44381457567214966, -9.667152404785156, 0.773475170135498, 0.5509428381919861, 0.8925642967224121, 0.7828179597854614, -1.4553883075714111, 0.7152078747749329, -2.441465377807617, 0.35526368021965027, -1.9984344244003296, -1.6945586204528809, 0.6887819170951843, 0.7537453174591064, -0.17697755992412567, 0.4613681733608246, -0.22249934077262878, -0.034685008227825165, 2.8953933715820312, 1.1101220846176147, 2.565039873123169, 1.9235283136367798, 1.7782132625579834, 0.7157565951347351, 0.2994776964187622, 2.2202746868133545, 3.5404484272003174, 2.0118072032928467, 1.2497440576553345, 1.679099202156067, 0.9576777815818787, 0.7251487970352173, -0.8498184680938721, 0.8960520625114441, 0.29201602935791016, -0.10892680287361145, 4.5771331787109375, 1.5358741283416748, 1.2391037940979004, 1.8849940299987793, 0.009951070882380009, 0.024696487933397293, 1.0489907264709473, 0.3393084406852722, 0.06756250560283661, -0.22210612893104553, -0.9965993762016296, -1.0186727046966553, -1.0063633918762207, -0.8177002668380737, 0.6240396499633789, -0.2130294144153595, -0.03061019256711006, 3.383131504058838, 2.08024263381958, 1.6923630237579346, 0.7350565195083618, 0.046046722680330276, 0.13638022541999817, 0.28787070512771606, -2.4150118827819824, 0.14912953972816467, 0.18064701557159424, -0.9254627823829651, -2.741456985473633, -1.1958385705947876, -1.0552903413772583, -1.1609145402908325, -2.1722030639648438, -0.9735843539237976, -1.0769546031951904, -2.5768070220947266, -7.478160381317139, -1.0177704095840454, -0.9195078611373901, -1.0508978366851807, -0.805747389793396, -1.0914592742919922, -1.0328738689422607, -1.210878849029541, -2.2048799991607666, -0.9712240695953369, 0.11922603845596313, -0.9028347730636597, 0.2978588044643402, -0.8147884011268616, 4.098543643951416, -0.9728285074234009, 7.198566436767578, -0.8029349446296692, -1.2218605279922485, -1.0386810302734375, -0.6064420938491821, -0.6125165224075317, -0.9062126278877258, -0.9134947657585144, -1.0363198518753052, -0.5605500340461731, -0.7708793878555298, -2.256897211074829, -0.41810065507888794, 9.662418365478516, -0.8539235591888428, -0.5763483643531799, -0.8622281551361084, -0.8318180441856384, 1.516129732131958, -0.8509820103645325, 2.3600082397460938, -0.3996390998363495, 2.0548605918884277, -0.00507489126175642, -0.6421050429344177, -0.9636732339859009, 0.23071114718914032, -0.5350654125213623, 0.21433566510677338, 0.1096574068069458, -2.7413439750671387, -1.2357655763626099, -2.5380499362945557, -1.9929677248001099, -1.6789827346801758, -0.8031062483787537, -0.3523203432559967, -2.4070770740509033, -3.599984884262085, -2.00384259223938, -1.2195020914077759, -1.6233731508255005, -0.9231544137001038, -0.9171799421310425, 0.6528230905532837, -0.9366628527641296, -0.2614656686782837, 0.19025464355945587, -4.672588348388672, -1.6925694942474365, -1.045562982559204, -1.8139197826385498, 0.03696505352854729, -0.022716591134667397, -0.8065388798713684, -0.24040116369724274, 0.2556486129760742, -0.09404973685741425, -1.103546380996704, -0.9865561127662659, -0.962024986743927, -0.7802593111991882, 0.48725801706314087, -0.2560781240463257, -0.17328469455242157, 3.373044490814209, 2.164020538330078, 1.7409937381744385, 0.5686818957328796, 0.031084321439266205, 0.21913090348243713, 0.21243412792682648, -2.410529136657715, 0.02821100875735283, 0.08264661580324173, -0.8203510642051697, -2.4261274337768555, -1.362908959388733, -1.060241460800171, -0.9698448777198792, -2.104672431945801, -1.1469992399215698, -1.1001077890396118, -9.16241455078125, -7.64695405960083, -1.1476924419403076, -0.9792933464050293, -1.0301406383514404, -0.8090778589248657, -1.256726861000061, -1.2071492671966553, -2.486253499984741, -2.3341715335845947, -1.0551313161849976, 0.11718505620956421, -0.9335927963256836, 0.2215939611196518, -0.929307222366333, 4.1149516105651855, -0.9382969737052917, 5.833007335662842, -0.7024279236793518, -1.021557331085205, -1.2172623872756958, -0.6352887749671936, -0.7514218091964722, -0.7384740114212036, -1.3904412984848022, -1.5016494989395142, -0.7806954383850098, -0.6780198216438293, -2.252669095993042, -0.428727924823761, 9.49091625213623, -0.8288125991821289, -0.5145612359046936, -0.9224437475204468, -0.8650126457214355, 1.5972092151641846, -0.913063108921051, 2.4032840728759766, -0.26568564772605896, 2.033787250518799, 0.15011750161647797, -0.8332669138908386, -0.745579719543457, 0.11393758654594421, -0.5612844228744507, 0.023119593039155006, 0.010756488889455795, -2.734496593475342, -1.1276297569274902, -2.534862518310547, -2.0270254611968994, -1.7508928775787354, -0.8203508257865906, -0.28407493233680725, -9.806964874267578, -3.4756968021392822, -1.9988998174667358, -1.2020944356918335, -1.6474331617355347, -1.5474064350128174, -0.908934473991394, 0.6984694004058838, -0.655846357345581, -0.26376044750213623, 0.16190822422504425, -4.671891212463379, -1.7697848081588745, -1.12514328956604, -1.771411657333374, 0.08082259446382523, 0.11783760786056519, -0.8500464558601379, -0.14649765193462372, -1.7272425889968872, -2.73661470413208, -3.4732577800750732, 0.7215352058410645, 0.8621499538421631]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (1.37, 1.54)}}, 'et2_eta3': {'discriminator': {'threshold': 0.32499874830245973, 'nodes': [100, 5, 1], 'bias': [0.021079380065202713, 0.08442211896181107, -0.11139082163572311, 0.0007079020724631846, 0.05026240274310112, 0.2636169195175171], 'weights': [115.01241302490234, 42.94895553588867, 2.567657470703125, -23.618711471557617, 0.3513403832912445, -30.06334686279297, 0.13925796747207642, 0.7864643335342407, -2.3290374279022217, -9.502877235412598, -3.580317974090576, 5.760210037231445, 2.3665096759796143, -3.470517635345459, -83.71723175048828, 4.339878082275391, 70.6534423828125, 5.893828392028809, -8.474519729614258, -9.403303146362305, 1.5621743202209473, 15.476668357849121, -6.421986103057861, 1.765583872795105, 6.5437726974487305, -26.356807708740234, -17.89145278930664, 1.2509477138519287, 0.8129051923751831, 3.8760077953338623, 2.3494021892547607, -2.557936191558838, 2.3607680797576904, -46.303829193115234, -10.613133430480957, -6.5056352615356445, 1.526335597038269, 14.906636238098145, 2.1999030113220215, -19.766427993774414, 0.06349214911460876, -13.480081558227539, -0.5147789716720581, -0.3164357542991638, 1.928426742553711, 1.4178005456924438, -8.319304466247559, 28.070369720458984, -2.14863920211792, -0.6671326160430908, -10.336699485778809, 1.0044090747833252, -29.91691017150879, 4.0703654289245605, 1.9270503520965576, -4.03021764755249, 0.44835802912712097, 4.354485511779785, -0.05387434735894203, -13.275885581970215, 0.3991834819316864, -3.31421160697937, -0.3342691957950592, -14.609319686889648, -28.50311279296875, -1.1891582012176514, 2.004866361618042, -0.1418459713459015, -4.437169551849365, 3.9644668102264404, 0.6536940336227417, 10.534915924072266, -0.5242905616760254, -1.0283880233764648, 1.8980313539505005, 2.3233587741851807, 2.7156434059143066, 0.3631680905818939, 0.9115080833435059, -4.258874416351318, -12.490303039550781, 5.131297588348389, 1.4211421012878418, -12.279603004455566, 1.80827796459198, 1.8810527324676514, 1.6881822347640991, -35.38578796386719, 50.878963470458984, 17.235525131225586, 0.9896836876869202, -1.0818644762039185, -4.542476654052734, -1.4971346855163574, 0.15198594331741333, -15.579697608947754, 1.082066535949707, -0.6022031903266907, 2.742074728012085, 432.5343017578125, -2.4046730995178223, -4.054540634155273, -0.3345430791378021, 1.8782836198806763, 0.6635843515396118, 0.46270644664764404, 0.3762456774711609, 0.588930070400238, -1.5792242288589478, -2.701042652130127, -0.9422552585601807, 1.6233853101730347, 1.5889554023742676, 0.08426722139120102, 2.915616273880005, 0.8040958642959595, 1.3760857582092285, 5.797585964202881, 2.9871768951416016, 3.2662434577941895, 3.810821294784546, 4.717774391174316, 4.847388744354248, 3.813713312149048, 11.084071159362793, 4.598029136657715, 2.2005183696746826, 1.0692198276519775, 3.222649335861206, 3.8591089248657227, 2.513326406478882, 3.7206838130950928, 2.4376578330993652, 2.5217013359069824, 5.22318172454834, 2.0839593410491943, 1.6313296556472778, 4.407665729522705, 2.2395167350769043, 2.465404987335205, 0.05863027274608612, 1.863450288772583, 2.30320143699646, 2.8061468601226807, 2.1014904975891113, 1.550355315208435, 1.268784761428833, 2.3019509315490723, -0.9904949069023132, 0.4788903295993805, 1.1533197164535522, 0.9741131663322449, 0.8714801073074341, 1.129149317741394, 1.8406143188476562, 2.3730833530426025, 0.4926026463508606, 2.4584741592407227, -0.08243851363658905, 0.8996639847755432, 0.40754395723342896, 4.372114658355713, -0.31631138920783997, -1.7400392293930054, -0.46883895993232727, 2.0979011058807373, 1.2511507272720337, -0.12380146980285645, -4.6359171867370605, 3.596827507019043, 0.7161647081375122, 3.3739213943481445, -0.4523775279521942, -0.48092547059059143, 2.6023378372192383, 2.700756549835205, 2.780585765838623, 2.3950860500335693, 1.2173625230789185, 1.8506463766098022, 2.427272081375122, 8.001241683959961, 8.119108200073242, 2.7606539726257324, 2.653822422027588, 2.1011712551116943, 2.2490336894989014, 3.638641595840454, 0.6341323852539062, 2.421041965484619, 0.9795575737953186, -0.7216323614120483, 6.437246799468994, 2.5924415588378906, 0.22533871233463287, 1.1461886167526245, 0.8496565222740173, 0.43248608708381653, -0.14927130937576294, 19.89673614501953, 2.9339468479156494, 4.613544940948486, 0.7371185421943665, -1.9341503381729126, -0.6393091678619385, -0.46071740984916687, -0.6781154274940491, -0.4572194218635559, 1.7274147272109985, 2.797091007232666, 1.0358251333236694, -0.7862182855606079, -0.4693666398525238, -0.14982397854328156, -2.7958474159240723, -3.6837379932403564, -1.7527856826782227, -5.968070983886719, -3.1116509437561035, -2.890064239501953, -3.192734479904175, -4.8754963874816895, -2.842022180557251, -3.9419987201690674, -11.073169708251953, -4.346763610839844, -2.2878010272979736, -1.0610346794128418, -3.168459177017212, -3.8329131603240967, -2.6271157264709473, -3.7385663986206055, -2.410245656967163, -2.5832595825195312, -2.7983710765838623, -2.2324941158294678, -1.4780268669128418, -3.8479208946228027, -2.030487537384033, -2.2927138805389404, 0.027142073959112167, -1.930434226989746, -2.109790563583374, -2.787881851196289, -2.0737273693084717, -1.4716532230377197, -1.432565450668335, -2.195216655731201, 0.9082101583480835, -0.49968573451042175, -0.7531368732452393, -1.078606367111206, -0.8780576586723328, -1.12929368019104, -1.8113393783569336, -2.1697838306427, -0.3509630262851715, -2.5010759830474854, 0.06509595364332199, -0.9514897465705872, -0.0512656606733799, -2.8561782836914062, 0.878503680229187, -1.2026686668395996, 0.2730969488620758, -1.5559449195861816, -1.150030493736267, 0.09091801941394806, 4.577388763427734, -3.5361721515655518, -0.7303844094276428, -3.5749614238739014, 0.4578297436237335, 0.8594622611999512, -2.7798662185668945, -2.6554794311523438, -2.8049275875091553, -2.506946325302124, -1.2736141681671143, -1.7042546272277832, -2.8421518802642822, -7.4616265296936035, -8.108945846557617, -4.377047538757324, -2.5591001510620117, -2.0399527549743652, -4.373971939086914, -3.358013153076172, -1.0179824829101562, -2.585057020187378, -0.8176607489585876, 0.9079455137252808, -6.585074424743652, -2.807870864868164, -0.25218847393989563, -1.2549949884414673, -0.8725645542144775, -0.09838278591632843, 0.2362930178642273, -19.98362159729004, 2.0387790203094482, 1.3027656078338623, -0.4540368616580963, -1.1967713832855225, -1.3499963283538818, -4.099092960357666, -0.4082486629486084, -0.3322586119174957, 7.5542402267456055, 5.710226535797119, -0.3379306197166443, -23.053298950195312, -16.225215911865234, 1.1719319820404053, -17.06928825378418, -3.708646774291992, 10.64037036895752, -8.712221145629883, -13.982789039611816, -2.7481861114501953, 0.7753178477287292, -7.936609745025635, -2.169773817062378, -3.247138738632202, 6.233680725097656, -4.7232584953308105, 2.779235363006592, -2.681654691696167, -0.2045527845621109, -4.382552623748779, -3.555079698562622, -3.875593662261963, -0.6958762407302856, -0.63019198179245, -3.723541021347046, 0.058886412531137466, -0.8534103631973267, -2.110583543777466, -1.3677217960357666, 0.054051633924245834, -0.6802531480789185, -1.131946325302124, -0.8535158634185791, -1.0312925577163696, -0.8417698740959167, -0.44020581245422363, 0.3287504315376282, -0.917592465877533, 0.3144913613796234, -0.8756914138793945, -0.036071404814720154, 0.8575083017349243, -8.771231651306152, 1.2499338388442993, -1.2436883449554443, -0.08529619872570038, -0.5046313405036926, -2.8130717277526855, -0.5089612603187561, -0.3762369155883789, -6.77292537689209, -1.197763204574585, -0.5411012172698975, 5.407064437866211, -0.07192108780145645, 7.616754055023193, -1.7108583450317383, 3.5139853954315186, -0.2127103954553604, -2.572028636932373, -0.7069661021232605, -1.262388825416565, 0.9898355007171631, -0.051796745508909225, -0.7122933864593506, -0.6600987315177917, -1.5175871849060059, -1.1813327074050903, -0.3426356613636017, -0.489092618227005, 8.300046920776367, -2.775688409805298, -7.6169819831848145, -2.37893009185791, -1.7154933214187622, -1.0463685989379883, -0.6126124262809753, 0.008684714324772358, 1.5078939199447632, 2.6901357173919678, 0.5272760987281799, -1.0708180665969849, -1.6926586627960205, -1.2914046049118042, -1.0477041006088257, -0.6110436916351318, -0.8042972683906555, -0.7249646186828613, -0.11176440864801407, -8.65184497833252, -2.6839330196380615, -4.035173416137695, -0.39642587304115295, 1.9340206384658813, 0.6639010310173035, 0.51161789894104, 0.5562962293624878, 0.6001103520393372, -1.4932231903076172, -2.636807918548584, -0.9902734756469727, 0.9984682202339172, 1.111194133758545, 0.06704273819923401, 2.7396740913391113, 3.649498701095581, 2.0994036197662354, 5.991048336029053, 3.0657453536987305, 5.515302658081055, 3.9288947582244873, 4.730417251586914, 2.8918492794036865, 3.8142693042755127, 11.114066123962402, 4.269949913024902, 2.2307748794555664, 1.2116316556930542, 3.168015480041504, 3.9591948986053467, 2.4655468463897705, 3.594942092895508, 2.343388557434082, 2.4231455326080322, 2.65401291847229, 2.0189731121063232, 1.6308107376098633, 3.8255233764648438, 2.215118408203125, 2.3084115982055664, 0.01821434497833252, 1.903847336769104, 2.2039103507995605, 2.607603073120117, 2.1239845752716064, 1.512854814529419, 1.2872682809829712, 2.2080740928649902, -0.8491103053092957, 0.5878936648368835, 1.0318490266799927, 1.0073944330215454, 0.7745478749275208, 0.9544230699539185, 1.8896965980529785, 2.319242000579834, 0.35556527972221375, 2.550459861755371, -0.00563912745565176, 0.9463590979576111, -0.035583265125751495, 4.412873268127441, -0.7868633270263672, 1.2892767190933228, -0.2909969687461853, 1.4916921854019165, 1.269150972366333, -0.19655336439609528, -4.657676696777344, 3.5757579803466797, 0.7211792469024658, 3.546260356903076, -0.45072194933891296, -0.583769679069519, 2.811086893081665, 2.7057290077209473, 2.863959550857544, 2.386772632598877, 1.3432966470718384, 1.678554892539978, 3.0095274448394775, 7.341079235076904, 8.186492919921875, 4.186151504516602, 2.5037055015563965, 1.9556443691253662, 2.21278715133667, 2.9992709159851074, 0.987898588180542, 2.287041664123535, 0.9858039021492004, -0.5060150623321533, 6.522360324859619, 2.7444276809692383, 0.18857921659946442, 1.170567512512207, 1.0746809244155884, 0.4019630551338196, -0.18592390418052673, 19.86507797241211, -0.7996860146522522, -0.8971362113952637, 1.7831422090530396, 1.376376986503601, -0.9318203926086426]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (1.54, 2.5)}}, 'et2_eta0': {'discriminator': {'threshold': 0.31999875307083131, 'nodes': [100, 5, 1], 'bias': [-0.1145973950624466, -0.05412110313773155, 0.09014075994491577, -0.060647644102573395, 0.20350374281406403, 0.1337592452764511], 'weights': [3.4661269187927246, 1.3500856161117554, -0.0556333065032959, -0.3569779098033905, 0.4135678708553314, 0.41795459389686584, -0.4174874722957611, 0.3244650661945343, 1.9885859489440918, 2.8075780868530273, -0.7958009243011475, -4.583902359008789, -8.67313289642334, -6.214581489562988, -2.3095853328704834, -5.751229286193848, -2.198564052581787, -3.3803329467773438, -5.199295997619629, -2.4351818561553955, -2.485520362854004, -2.410604476928711, -2.345674753189087, -2.537550926208496, -2.2204580307006836, -1.3173775672912598, -1.9971883296966553, -1.4453233480453491, -1.6724505424499512, -1.6131279468536377, -1.9890766143798828, -1.6009278297424316, -1.413903832435608, -2.079495906829834, -1.7254515886306763, -0.7677139043807983, -1.0373281240463257, -1.272466778755188, -1.5066214799880981, -0.9812381267547607, -1.5210427045822144, -1.0360053777694702, -0.9566309452056885, -1.0135706663131714, -0.2355639785528183, -0.5898135304450989, -0.8778921365737915, -1.1788119077682495, -0.5249338150024414, -0.7230725288391113, 0.11529037356376648, 0.5990443229675293, -1.0125130414962769, -0.5040639638900757, -0.6518067121505737, 0.05305566266179085, -0.0034301066771149635, 0.42206090688705444, 0.3916533291339874, 0.1432589441537857, 0.7103737592697144, 1.5257158279418945, -1.1888790130615234, -0.5304505228996277, -2.3267130851745605, -0.7257466912269592, 1.3764760494232178, 0.09693709015846252, -0.43147093057632446, 0.22741621732711792, -0.5677496790885925, -0.5272998809814453, 0.412883460521698, 0.32479605078697205, -0.7293165922164917, -1.2639217376708984, -1.348122239112854, -0.9404879212379456, -0.5513057708740234, -0.30192387104034424, -1.7723290920257568, -3.5103180408477783, -2.039353132247925, -2.3044636249542236, -1.9126121997833252, -1.709487795829773, -0.6883493065834045, -1.1739675998687744, -3.518812656402588, -2.4658355712890625, -0.973460853099823, 0.004903082270175219, -3.041006326675415, -2.1986403465270996, -0.6585326194763184, 0.3128136694431305, -4.191408157348633, -1.888517141342163, -0.07096751034259796, -0.1799200028181076, -274.7655944824219, -43.93977355957031, -0.31424620747566223, 0.037367723882198334, -0.21977196633815765, -0.8316360116004944, -0.3169817328453064, -0.11244185268878937, -0.5436539649963379, -5.075516223907471, 24.164505004882812, 2.6848723888397217, 6.6518402099609375, -22.516265869140625, 3.8308470249176025, 16.530607223510742, 7.538712024688721, 1.0792908668518066, 2.5052595138549805, 0.4939861595630646, 0.7397604584693909, 0.607239305973053, 0.547098696231842, 0.5501576662063599, 0.5273366570472717, 0.12655936181545258, 0.4669652283191681, 0.379781574010849, 0.36313122510910034, 0.2824549078941345, 0.302779883146286, 0.2844259738922119, 0.3032187819480896, 0.3134819567203522, 0.1935473084449768, 1.2020982503890991, 0.16954252123832703, 0.35271763801574707, 0.4091174006462097, 0.26845628023147583, 103.68645477294922, 0.13802462816238403, 0.1590566188097, 0.12879283726215363, 0.010509362444281578, 0.21270455420017242, -0.7591646909713745, 0.24821963906288147, 0.03088539093732834, 0.16785435378551483, 0.11421521753072739, -0.046707287430763245, 0.28282439708709717, 0.14659562706947327, 0.08657138049602509, -0.02520943433046341, 0.03341761231422424, 0.010446188971400261, -0.16878962516784668, 0.3932514786720276, -0.16624024510383606, -0.529011070728302, 0.277802973985672, 0.14760076999664307, 0.1814027577638626, 0.09646748751401901, -0.9664314389228821, -0.06649115681648254, 0.07938634604215622, -0.14664292335510254, 0.1502922624349594, 0.01714238151907921, 5.909456253051758, -0.1143762618303299, -0.3064577877521515, 0.280812531709671, 0.3925819993019104, -0.12955120205879211, -12.52425479888916, -0.05088113620877266, 0.3544582724571228, 0.759502112865448, 0.4988522529602051, 16.051626205444336, 0.4128522276878357, 0.1501341462135315, 0.15268515050411224, 0.20424585044384003, 0.6215866208076477, -7.800693035125732, 0.20118387043476105, -0.021234877407550812, 0.17071661353111267, -13.458681106567383, 0.05582299828529358, -0.08541436493396759, 0.7859625816345215, 0.36186090111732483, 24.232921600341797, -0.01858949102461338, -3.139693021774292, -1.4449257850646973, 0.11654689908027649, 0.3728778660297394, -0.48765575885772705, -0.3361949026584625, 0.3706994950771332, -0.2993294894695282, -1.8400994539260864, -2.1229188442230225, 1.2088897228240967, 4.7233076095581055, 8.248957633972168, 6.395541667938232, 2.3897228240966797, 5.956242084503174, 2.235562562942505, 3.5572855472564697, 5.117026329040527, 2.434941291809082, 2.460944175720215, 2.4680731296539307, 2.4019899368286133, 2.536468505859375, 2.045292377471924, 1.257469892501831, 2.0955810546875, 1.493794560432434, 1.6864268779754639, 1.692544937133789, 1.902928113937378, 1.5552563667297363, 1.3968826532363892, 2.0522022247314453, 1.6758896112442017, 0.913215160369873, 1.0938458442687988, 1.1959072351455688, 1.4406706094741821, 1.1837518215179443, 1.645910382270813, 1.134926438331604, 1.0559449195861816, 1.0369287729263306, 0.2728612422943115, 0.5262996554374695, 0.8212931752204895, 1.0100024938583374, 0.39508965611457825, 1.0989691019058228, -0.04175104945898056, -0.5138407349586487, 1.1715914011001587, 0.39132463932037354, 0.49334391951560974, -0.06707893311977386, -0.16715681552886963, -0.4800739288330078, -0.6670650243759155, -0.03576413169503212, -0.6910268664360046, -1.5774166584014893, 1.2271993160247803, 0.5348380208015442, 2.2497799396514893, 0.7342997193336487, -1.46317720413208, -0.11940494179725647, -0.30391666293144226, -0.13747809827327728, 0.507476270198822, 0.5882951617240906, -0.4666023850440979, -0.29006993770599365, 0.8116322159767151, 1.2454462051391602, 1.5528160333633423, 0.9679802060127258, 0.3660881817340851, 0.143290713429451, 1.8387651443481445, 3.4006881713867188, 2.2084741592407227, 2.3503472805023193, 1.9328300952911377, 1.7222366333007812, 0.4774474799633026, 1.2661560773849487, 3.4714863300323486, 2.2895569801330566, 0.9087651968002319, -0.034932106733322144, 3.0556228160858154, 2.1732492446899414, 0.630840539932251, -0.37718766927719116, 4.177546977996826, 2.0167076587677, -0.017935506999492645, 0.0986054316163063, 3.5574827194213867, 1.451647162437439, -0.09144826978445053, -0.4547705352306366, 0.4507312476634979, 0.4944400489330292, -0.48623916506767273, 0.13314621150493622, 2.045506238937378, 2.8213329315185547, -0.8786575198173523, -4.641798496246338, -8.662209510803223, -6.207137107849121, -2.2785449028015137, -4.745168209075928, -2.365581512451172, -3.4740469455718994, -4.993616580963135, -2.585416316986084, -2.597362518310547, -2.4302406311035156, -2.2772655487060547, -2.45805025100708, -2.2206428050994873, -1.4150340557098389, -1.988546371459961, -1.457390546798706, -1.636422872543335, -1.5249335765838623, -1.9789929389953613, -1.71364164352417, -1.4642473459243774, -2.1055896282196045, -1.695865511894226, -0.7813180685043335, -0.9865161180496216, -1.3120564222335815, -1.4714500904083252, -1.1135910749435425, -1.5473064184188843, -1.0832594633102417, -0.9067853093147278, -1.028486967086792, -0.2757495641708374, -0.5085345506668091, -0.8818341493606567, -1.145955204963684, -0.5369932055473328, -1.0617187023162842, -0.002517560264095664, 0.47469520568847656, -1.0709162950515747, -0.5530292391777039, -0.6962258815765381, 0.23456771671772003, 0.09004489332437515, 0.6263918280601501, 0.6288085579872131, 0.5215635895729065, 0.7628006339073181, 2.194525718688965, -1.1729481220245361, -0.5279311537742615, -2.172847032546997, -0.9203200936317444, 1.365815281867981, 0.06153104826807976, 0.24390235543251038, 0.2514963150024414, -0.4954139292240143, -0.5472025871276855, 0.39014238119125366, 0.1993001252412796, -0.7645597457885742, -1.3272745609283447, -1.3851884603500366, -0.9792442321777344, -0.3416995108127594, -0.11094941198825836, -1.8498470783233643, -3.418088912963867, -2.212824583053589, -2.4399538040161133, -1.869774580001831, -1.6872807741165161, -0.6417148113250732, -1.2777502536773682, -3.5323994159698486, -2.4896035194396973, -0.9477433562278748, 0.04333853721618652, -2.885671854019165, -2.1565632820129395, -0.8576779961585999, 0.38191887736320496, -4.103809356689453, -2.113654375076294, -0.03770170360803604, -0.32647275924682617, -3.2173664569854736, -1.3979148864746094, 0.04642748832702637, 0.32729101181030273, -0.5889932513237, -0.37988999485969543, -2.112027168273926, -0.4085172116756439, -2.2341020107269287, -2.4571335315704346, 6.137634754180908, 4.525824069976807, 2.0595593452453613, 4.521827220916748, -3.0937137603759766, 2.504520893096924, 2.25490665435791, 3.4088268280029297, 5.432875633239746, 2.5163848400115967, 2.4960949420928955, 2.2455997467041016, 2.3769195079803467, 2.6098148822784424, 2.0510783195495605, 1.2801543474197388, 1.973474144935608, 1.4448826313018799, 1.6874314546585083, 1.5239527225494385, 1.9966497421264648, 1.4814739227294922, 1.517063021659851, 2.078674554824829, 0.7656508088111877, 0.7906789183616638, 1.073715329170227, 1.2385356426239014, 1.4749987125396729, 1.1023108959197998, 1.5462993383407593, 0.9874445796012878, 1.0187957286834717, 0.8696563839912415, 0.23125912249088287, 0.5673548579216003, -0.143781840801239, 0.9861699938774109, 0.524522066116333, 1.1770586967468262, 0.017966890707612038, -0.5852797031402588, 1.1182926893234253, 0.4288347661495209, 0.4860314130783081, -0.11746633052825928, -0.10952814668416977, -0.6002830266952515, -0.45730552077293396, 1.383709192276001, -0.47283563017845154, 0.18728488683700562, 1.2120819091796875, 0.3662359118461609, 2.2678027153015137, 0.838821291923523, 0.2928161323070526, 0.5012331008911133, 0.5098177790641785, 0.37218108773231506, 0.4275001883506775, 0.6379490494728088, -0.6494240760803223, -0.40261393785476685, 0.6969048380851746, 1.4216718673706055, 1.478459358215332, 0.8530159592628479, 0.5206731557846069, 0.20757175981998444, 1.8980046510696411, 3.372199535369873, 2.1750621795654297, 2.359828233718872, 1.94000244140625, 1.7141116857528687, 0.6785669922828674, 1.328121304512024, 3.345731258392334, 2.391211986541748, 0.7904902100563049, 0.03435143828392029, 2.9099299907684326, 2.0068655014038086, 0.773309588432312, -0.26310107111930847, 4.142958641052246, 2.006596088409424, 0.09990581125020981, 0.211178719997406, 1.0721156597137451, -0.2609236538410187, -1.2464908361434937, 1.224605917930603, -2.9271979331970215]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0, 0.8)}}, 'et1_eta2': {'discriminator': {'threshold': 0.49999858140945436, 'nodes': [100, 5, 1], 'bias': [0.1660536676645279, -0.09260424226522446, 0.18541112542152405, -0.01521122083067894, -0.035576365888118744, -0.4945518970489502], 'weights': [-0.9389358758926392, -0.12105660140514374, 0.3670014441013336, 0.8390507698059082, 0.2314704954624176, -1.0423684120178223, 0.03034968487918377, 0.04645406827330589, 0.8171259164810181, -3.6258726119995117, -6.1305108070373535, -2.587165594100952, 3.774099111557007, 3.143880844116211, -0.80121248960495, -1.014901876449585, 3.756338596343994, -0.8993691205978394, -0.929709792137146, 0.46394240856170654, 1.9805229902267456, 0.720779299736023, 0.0041855452582240105, 0.08182483166456223, 2.1305928230285645, 1.3367650508880615, 9.117352485656738, 1.0708565711975098, 2.701639175415039, 0.5453954339027405, 0.5901762247085571, 0.27951815724372864, 0.23340432345867157, 0.3213069438934326, 1.1228090524673462, 1.733852744102478, 2.6954891681671143, 1.004016637802124, 0.8855718374252319, 0.34413546323776245, 1.2824195623397827, -3.899681329727173, 0.8291013836860657, 1.5699998140335083, -2.5046660900115967, 0.12688623368740082, 0.15166909992694855, 0.6564676761627197, 0.8464936017990112, 0.8760786056518555, -2.290839672088623, -0.3234841823577881, -2.8910558223724365, 0.6317764520645142, 1.0405882596969604, 0.8988353610038757, 0.6049715280532837, 0.9102033376693726, -4.668795108795166, 0.5174882411956787, -0.02492581121623516, 0.885158896446228, 0.9668274521827698, -15.823362350463867, 0.6638754606246948, -0.7332473397254944, 0.008322533220052719, 0.7136099338531494, 0.816786527633667, 0.7634891867637634, 2.1394340991973877, 1.9863669872283936, -0.49270015954971313, -0.5512511730194092, 3.020101547241211, 1.3349847793579102, 1.6237982511520386, 1.6902445554733276, 0.6394003033638, 0.5237955451011658, -0.6771195530891418, 0.716903030872345, 3.136241912841797, 1.8372712135314941, 1.843441128730774, 1.534429669380188, 1.5864427089691162, 0.7326285243034363, -0.9221916794776917, 0.04844559356570244, 0.3145847022533417, -0.5440637469291687, 4.12753963470459, 0.44132885336875916, 0.48569878935813904, 2.061765670776367, -0.06607150286436081, 0.01221557892858982, -0.0037229200825095177, 1.8724874258041382, 0.9452347159385681, 0.2318301647901535, -0.29512715339660645, -1.0175572633743286, -0.2936770021915436, 0.8586761951446533, -0.7136247158050537, -0.1394774168729782, -2.479201555252075, 3.633429527282715, 6.148832321166992, 1.1909912824630737, -3.679518222808838, -3.108302116394043, 0.9548355937004089, 0.9398448467254639, -3.7135815620422363, 0.7958019971847534, 0.8493679165840149, -0.5630879998207092, -1.8297094106674194, -0.6841930150985718, 0.11052222549915314, -0.044198133051395416, -2.0813539028167725, -1.491302251815796, -9.028913497924805, -1.1347301006317139, -2.5743601322174072, -0.5954425930976868, -0.45665180683135986, -0.4001908600330353, -0.17055273056030273, -0.35277920961380005, -1.1677411794662476, -1.7353333234786987, -2.8152577877044678, -0.8717381358146667, -0.7229496240615845, -0.3141927123069763, -1.140475869178772, 4.074158668518066, -0.6966882944107056, -1.5700340270996094, 2.4781692028045654, -0.06478343904018402, -0.22886759042739868, -0.6380794048309326, -0.8984648585319519, -0.7970829010009766, 2.442439079284668, 0.14679725468158722, 2.7700870037078857, -0.602025032043457, -0.9070513248443604, -0.7340141534805298, -0.7318882942199707, -0.9676535129547119, 4.53318452835083, -0.5149952173233032, -0.037572383880615234, -0.8892942667007446, -0.8307599425315857, 15.82580852508545, -0.697955846786499, 0.8265050053596497, -0.07606390863656998, -0.6309058666229248, -0.8986612558364868, -0.8548528552055359, -2.0288636684417725, -1.8575608730316162, 0.5736150741577148, 0.5576900243759155, -3.1278727054595947, -1.281878113746643, -1.5657764673233032, -1.877355933189392, -0.6072109341621399, -0.5198767781257629, 0.8055593371391296, -0.7239843606948853, -3.033485174179077, -1.830606460571289, -1.827890396118164, -1.5346916913986206, -1.4141550064086914, -0.841860830783844, 0.9094813466072083, -0.24852539598941803, -0.18477287888526917, 0.4709726572036743, -4.095010280609131, -0.41199788451194763, -0.558438777923584, -2.061180591583252, -0.04788471758365631, -0.083959199488163, 0.08485851436853409, -1.7609026432037354, -0.9927989840507507, -0.22755783796310425, 0.46136975288391113, 0.9827638864517212, 0.17937327921390533, -0.98271644115448, 0.10947437584400177, 0.07717394828796387, 0.9598147869110107, -3.6012673377990723, -6.334378242492676, -2.6594512462615967, -0.028662439435720444, 2.94340443611145, -0.8999265432357788, -0.8038007616996765, 3.7211480140686035, -0.8452624678611755, -0.9760757088661194, 0.3748461604118347, 1.9088479280471802, 0.7320083379745483, -0.02602810598909855, -0.0919680967926979, 2.0431947708129883, 1.3340981006622314, 1.9357608556747437, 1.0278220176696777, 2.4949445724487305, 0.4569856822490692, 0.6744378209114075, 0.26485639810562134, 0.2843888998031616, 0.4894283413887024, 1.005969762802124, 1.744221806526184, 2.677565336227417, 0.9777714610099792, 0.6807442903518677, 0.22208715975284576, 1.2692440748214722, -4.062464714050293, 0.647163987159729, 1.5809606313705444, -2.6220176219940186, 0.09213666617870331, 0.12779907882213593, 0.7498270273208618, 0.8543643951416016, 0.8173231482505798, -2.2751007080078125, -0.14138440787792206, -2.9500601291656494, 0.6055625677108765, 0.8029912710189819, 0.763913631439209, 0.5875661373138428, 0.8201058506965637, -4.600836753845215, 0.5392951369285583, 0.04246700182557106, 0.791408360004425, 0.7280694246292114, -15.716469764709473, 0.7267699241638184, -0.8429386019706726, 0.1141120195388794, 0.7700673937797546, 0.9267532825469971, 0.9103420376777649, 2.0862314701080322, 1.8372583389282227, -0.49715137481689453, -0.48570993542671204, 3.127847194671631, 1.205225944519043, 1.5884701013565063, 1.785603404045105, 0.6516576409339905, 0.5662755966186523, -0.6290300488471985, 0.6927171349525452, 3.056330442428589, 1.8378329277038574, 1.8045244216918945, 1.4628254175186157, 1.440600872039795, 0.9222137928009033, -0.8379809856414795, 0.2164636254310608, 0.28007563948631287, -0.4039464294910431, 3.9559061527252197, 0.41408202052116394, 0.48681291937828064, 2.198930025100708, 0.0427837073802948, -0.1267825812101364, -0.05599617213010788, 1.8454029560089111, 0.10072196274995804, 0.10001213848590851, 0.4225679934024811, 0.0899830088019371, -0.1253460943698883, -0.03832727670669556, -0.17258554697036743, 0.006134936586022377, 0.32795268297195435, -0.7147434949874878, -0.620525598526001, -0.23115095496177673, 0.10592801123857498, 0.3367525339126587, 0.06643199920654297, -0.05069795250892639, 0.32077908515930176, 0.05674194544553757, -0.07806650549173355, 0.08556340634822845, 1.0341018438339233, 0.21585318446159363, 0.10634714365005493, 0.15396660566329956, -0.016072625294327736, 0.058031000196933746, 0.2250940501689911, 0.3886975049972534, 0.20159882307052612, 0.5644832253456116, 0.4009593725204468, 0.38825786113739014, 0.37293195724487305, 0.46160775423049927, 0.0035634059458971024, 0.19673305749893188, 0.26240038871765137, -0.0046761841513216496, 0.04724537581205368, -0.016887251287698746, 0.16653037071228027, -0.5198298096656799, -0.21016016602516174, 0.20032982528209686, -0.2695275843143463, 0.3078876733779907, 0.30879247188568115, -0.05383213236927986, 0.020571794360876083, 0.04397197067737579, -0.24369126558303833, -0.008213493041694164, -0.309078574180603, -0.050603266805410385, 0.058075759559869766, 0.13050958514213562, 0.012967342510819435, -0.08035038411617279, -0.5366634130477905, -0.09735381603240967, -0.1770934760570526, -0.00046371834469027817, 0.08886172622442245, -1.475724697113037, -0.05327661335468292, -0.2230299413204193, -0.004776026587933302, -0.11217094212770462, 0.03254155069589615, -0.018858490511775017, 0.15643702447414398, 0.11969630420207977, 0.02387889102101326, 0.0028783457819372416, 0.11574484407901764, 0.4532398283481598, -0.003159577725455165, 0.15786686539649963, -0.02515074796974659, 0.013235733844339848, -0.025334911420941353, 0.04080158472061157, 0.2121448814868927, 0.22319470345973969, 0.08190509676933289, -0.028443608433008194, 0.19693505764007568, -0.11646437644958496, -0.08839280903339386, 0.039865754544734955, 0.2905471920967102, -0.013601908460259438, 0.3913911283016205, 0.09763815253973007, -0.12082190066576004, 0.02926851622760296, -0.08773969113826752, 0.07752358913421631, -0.13861992955207825, 0.16569967567920685, 1.018976092338562, 0.17579935491085052, -0.768304169178009, -1.623246431350708, -0.41187748312950134, 0.9542348384857178, -0.7742154598236084, -0.15698102116584778, -2.501763343811035, 3.817136287689209, 6.318728923797607, 1.2960803508758545, -2.1982290744781494, -2.928455114364624, 0.9834352135658264, 0.9135052561759949, -3.731199026107788, 1.0144058465957642, 0.983396589756012, -0.5150192379951477, -1.9586814641952515, -0.7450520396232605, -0.11673448234796524, -0.08666057884693146, -2.2077689170837402, -1.4799094200134277, -9.086014747619629, -0.9597002863883972, -2.656831979751587, -1.5887489318847656, -0.6430127024650574, -0.16870272159576416, -0.24260948598384857, -0.9525085091590881, -2.3742737770080566, -1.511581301689148, -2.654101610183716, -0.9373082518577576, -0.7570028305053711, -0.4148290753364563, -1.2122752666473389, 3.969895362854004, -0.6916170716285706, -1.5590852499008179, 2.558318853378296, -0.032666489481925964, -0.24639882147312164, -0.8173388838768005, -0.887973964214325, -0.9202091097831726, 2.3127846717834473, 0.26853957772254944, 2.8263278007507324, -0.7187230587005615, -0.8652063608169556, -0.8027243614196777, -0.5969690680503845, -0.9454819560050964, 4.637962818145752, -0.4610093832015991, -0.03146678954362869, -0.7306612133979797, -0.7855085134506226, 15.76138687133789, -0.7113703489303589, 0.8667826056480408, -0.1569540649652481, -0.7233748435974121, -0.925499439239502, -1.0189083814620972, -1.9827128648757935, -1.9997518062591553, 0.35889387130737305, 0.6073473691940308, -3.0189013481140137, -1.1832222938537598, -1.7242122888565063, -1.632594347000122, -0.6928914189338684, -0.47047221660614014, 0.34094446897506714, -3.1602671146392822, -3.059695243835449, -1.8070142269134521, -1.679485559463501, -1.4816218614578247, -1.457718849182129, -0.7987672686576843, 0.986251711845398, -0.1888679713010788, -0.3279169499874115, 0.5554001331329346, -4.116928577423096, -0.5113602876663208, -0.5399754047393799, -2.094965934753418, -0.1085875853896141, 0.09383213520050049, -0.04293570667505264, -1.846899151802063, -1.6996872425079346, 0.9876492619514465, -1.3035354614257812, -0.6136343479156494, 1.4506049156188965]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (1.37, 1.54)}}} - signatures["ElectronHighEnergyLooseConf"]={'et3_eta2': {'discriminator': {'threshold': -0.18500081300735474, 'nodes': [100, 5, 1], 'bias': [0.22496367990970612, 0.25423291325569153, -0.05725016072392464, 0.181239515542984, -0.24186886847019196, 0.3626905381679535], 'weights': [-0.9931346774101257, -0.01817704737186432, 1.603345274925232, 2.27188777923584, 1.5405961275100708, 1.6163924932479858, 0.8246887922286987, 0.5504136681556702, 0.06960619986057281, -5.246971607208252, -3.9190731048583984, -3.2434945106506348, -1.000954508781433, -0.3501393496990204, -0.2251189798116684, -0.6503921151161194, 5.110980033874512, 0.0947774201631546, 1.863757848739624, 1.2465909719467163, 6.427053451538086, 1.2249650955200195, -2.6062870025634766, 0.4220779240131378, -6.492243766784668, 5.788940906524658, 3.7186813354492188, 2.976773738861084, 11.082649230957031, 5.110097885131836, 0.3884647488594055, 0.5201953053474426, 0.5327610969543457, -2.650282621383667, 4.559503078460693, 4.513420581817627, 5.402627468109131, 13.056455612182617, -5.28449821472168, -2.4395270347595215, 3.176534414291382, 4.322094917297363, 4.349691867828369, 1.364220380783081, 1.8171908855438232, 5.179615020751953, 4.483983993530273, -5.08467960357666, 0.9289032220840454, 9.989507675170898, -11.552595138549805, 5.4164509773254395, 8.87568473815918, 2.331158399581909, 1.1835646629333496, 15.407537460327148, 1.7306100130081177, 1.4408981800079346, -4.631602764129639, -6.673683166503906, -7.13716983795166, 1.2764804363250732, -0.05238982290029526, 1.273556113243103, -6.24355936050415, 2.8994133472442627, -12.11474895477295, 1.6977628469467163, 4.599469184875488, 4.801764011383057, 42.280296325683594, -15.758618354797363, -0.5512469410896301, -0.4191519618034363, 3.0216667652130127, 1.0487087965011597, 4.302881717681885, 4.2061591148376465, 2.764920473098755, 2.869471788406372, -0.158920019865036, 0.2263748198747635, 1.2715317010879517, 3.878507137298584, 2.707009792327881, -0.1432947963476181, 2.222496271133423, 4.375704765319824, -0.7392042279243469, 0.5509490370750427, 1.4576245546340942, 0.48080286383628845, 3.5064849853515625, 4.732835292816162, -2.6513285636901855, 0.6614122986793518, -0.07711731642484665, -0.10382016003131866, -1.4842954874038696, 14.11323070526123, -0.819365918636322, -0.11185577511787415, 1.4462207555770874, 2.273878812789917, 1.5189666748046875, 1.553519606590271, 0.816792368888855, 0.6013060212135315, 0.06894798576831818, -5.2789201736450195, -3.9496655464172363, -3.3238162994384766, -1.108394980430603, -0.3307814598083496, -0.0825585424900055, -0.5530317425727844, 4.420546531677246, 0.1301359087228775, 1.8137028217315674, 1.3027275800704956, 6.463320732116699, 1.1488800048828125, -2.749488353729248, 0.3422110378742218, -6.329661846160889, 5.8210248947143555, 3.548218250274658, 3.137077808380127, 11.140628814697266, 5.098723411560059, 0.48586753010749817, 2.300755023956299, 0.6675386428833008, -2.7125847339630127, 4.555992126464844, 4.43115758895874, 5.517282962799072, 13.047628402709961, -5.076038360595703, -2.3229494094848633, 3.37558913230896, 4.260136127471924, 4.388528347015381, 1.4584147930145264, 1.3935585021972656, 5.358431816101074, 4.435708045959473, -5.0095977783203125, 0.9032479524612427, 9.893756866455078, -11.661206245422363, 5.424482822418213, 8.943679809570312, 2.3191757202148438, 1.1143097877502441, 15.398283004760742, 1.7532914876937866, 1.4410107135772705, -4.720383644104004, -6.595602035522461, -7.145852088928223, 1.2825226783752441, 0.020189011469483376, 1.1598213911056519, -6.297238826751709, 2.9659016132354736, -12.070916175842285, 1.7613192796707153, 4.654551029205322, 4.814225673675537, 42.22060012817383, -15.744312286376953, -0.5319676399230957, -0.3671867549419403, 2.89033579826355, 1.1901012659072876, 4.218427658081055, 4.251856327056885, 2.7415645122528076, 2.7619426250457764, -0.19702652096748352, 0.3342374563217163, 1.174614667892456, 3.668564796447754, 2.8054699897766113, -0.06963631510734558, 2.243130922317505, 4.494266510009766, -0.6628531813621521, 0.4802199900150299, 1.4144364595413208, 0.5458922982215881, 3.4443817138671875, 4.759645938873291, -2.7025539875030518, 0.7854596376419067, 0.0187618900090456, -0.11379291117191315, -1.5365225076675415, 14.266770362854004, 0.46328744292259216, 0.3947559893131256, 0.36305755376815796, -0.04611923545598984, -0.10887285321950912, 0.06751923263072968, -0.04021124169230461, 0.12789545953273773, 0.059422027319669724, 0.42600908875465393, 0.30839094519615173, 0.3086649179458618, 0.5524296760559082, 0.1343601644039154, 0.27397215366363525, 0.29742759466171265, -0.30750522017478943, 0.17883753776550293, -0.6239702105522156, -2.471686601638794, -0.5069426894187927, -2.1701853275299072, 5.2444376945495605, -1.4523099660873413, 0.7326187491416931, -12.473556518554688, -7.699365139007568, 0.27639761567115784, -0.898872435092926, -0.4886949062347412, 0.9635306000709534, -0.08056899905204773, -0.1960873305797577, 1.9147430658340454, -0.24132871627807617, -0.39335373044013977, -0.3724568486213684, -0.8072543144226074, 3.106010675430298, 2.067241907119751, -0.14096124470233917, -0.299396812915802, -0.3965566158294678, -0.12824569642543793, -0.1244005635380745, -0.4982789158821106, -0.2107764184474945, 0.5728129148483276, 0.08725889027118683, -0.7414993643760681, 1.1669864654541016, -0.4326733648777008, -0.806244969367981, -0.20734551548957825, -0.11661368608474731, -6.179890155792236, -0.033673886209726334, -0.05434248596429825, 0.6087918281555176, 0.6669779419898987, 0.714033305644989, -0.05715496093034744, 0.04490915685892105, -0.07697772234678268, 0.01333220861852169, -0.2759895622730255, 1.336474061012268, -0.07291409373283386, -0.4237052798271179, -0.3236718475818634, -3.794415235519409, 1.7916991710662842, 0.24863730370998383, 0.3658004105091095, -3.1611881256103516, -2.0312304496765137, -0.21318680047988892, -0.2111954391002655, -0.19907595217227936, -0.07694064825773239, 0.18091297149658203, -0.3823789954185486, -0.43759241700172424, -0.3232068717479706, -0.2646971046924591, 0.06439076364040375, -0.15192753076553345, -0.22245445847511292, 0.5009520649909973, -1.923946499824524, -0.11646644026041031, 0.0981743335723877, -0.24813973903656006, -0.3879634439945221, 0.4310603737831116, 0.5028122663497925, -0.02763182483613491, -0.07557548582553864, 0.1635049432516098, -1.2735366821289062, -0.7950127124786377, -0.08708997070789337, 1.5768083333969116, 2.335355758666992, 1.3976126909255981, 1.5716580152511597, 0.9118295311927795, 0.5737374424934387, 0.05917077139019966, -5.204732894897461, -3.846733570098877, -3.1808714866638184, -0.9655765295028687, -0.09816698729991913, -0.24888695776462555, -0.27712324261665344, 5.076735496520996, 0.29157620668411255, 1.88616943359375, 1.2569302320480347, 6.25429630279541, 1.0428550243377686, -2.6543445587158203, 0.4390083849430084, -6.289444446563721, 5.705146312713623, 3.693236827850342, 2.962388515472412, 11.072286605834961, 5.079848289489746, 1.6516005992889404, 2.2581167221069336, 0.6720775961875916, -2.666745901107788, 4.573479652404785, 4.510982513427734, 5.579908847808838, 12.91909408569336, -5.264841079711914, -2.271451711654663, 3.3198907375335693, 4.41532039642334, 4.3419108390808105, 1.3044755458831787, 1.6199474334716797, 5.386545181274414, 4.403131484985352, -5.077688217163086, 1.0941535234451294, 9.932294845581055, -11.534035682678223, 5.407714366912842, 8.874841690063477, 2.3946802616119385, 1.1929874420166016, 15.371015548706055, 1.6173173189163208, 1.423647403717041, -4.681282043457031, -6.558859825134277, -7.183442115783691, 1.2368748188018799, 0.012941846624016762, 1.1281214952468872, -6.298399448394775, 2.9774928092956543, -12.263850212097168, 1.581725001335144, 4.778667449951172, 4.673547744750977, 42.09385681152344, -15.674543380737305, -0.4315670132637024, -0.37489619851112366, 3.047224760055542, 1.0537246465682983, 4.315587997436523, 4.167531967163086, 2.778156280517578, 2.808948516845703, -0.03417599946260452, 1.1044646501541138, 5.242288589477539, 3.7639293670654297, 2.708077907562256, 1.556064248085022, 2.070166826248169, 4.262251377105713, -0.8150630593299866, 0.5874195098876953, 1.460222840309143, 0.5971516966819763, 3.5045785903930664, 4.799536228179932, -2.68164324760437, 0.6034370064735413, 0.06889212131500244, -0.044757187366485596, -1.6570795774459839, 14.199957847595215, 0.824752151966095, 0.17998909950256348, -1.395802617073059, -2.3812897205352783, -1.3393431901931763, -1.6171101331710815, -0.8048666715621948, -0.5729721188545227, -0.09688341617584229, 5.192379474639893, 3.9456334114074707, 3.1389269828796387, 0.9345805644989014, 0.3942444920539856, 0.18496719002723694, 0.4945777356624603, -5.0109968185424805, -0.14160796999931335, -1.8641877174377441, -1.2552272081375122, -6.402767181396484, -1.1240326166152954, 2.68575382232666, -0.42572709918022156, 6.44467306137085, -5.8094282150268555, -3.6414718627929688, -3.175381660461426, -11.110631942749023, -5.0160369873046875, -1.6501483917236328, -2.2639331817626953, -0.5181571245193481, 2.6067066192626953, -4.6280198097229, -4.338582992553711, -5.4429030418396, -12.86388111114502, 5.195508003234863, 2.3679556846618652, -3.279820680618286, -4.388542175292969, -4.284562110900879, -1.2926123142242432, -1.8372116088867188, -5.395905494689941, -4.572208404541016, 4.923374176025391, -0.9507557153701782, -9.836893081665039, 11.623922348022461, -5.409999370574951, -8.86340618133545, -2.421633243560791, -1.1847803592681885, -15.446847915649414, -1.6003040075302124, -1.6061725616455078, 4.634953022003174, 6.534738540649414, 7.307224273681641, -1.2789621353149414, -0.04566904157400131, -1.0929158926010132, 6.193482875823975, -3.0619707107543945, 12.228958129882812, -1.54684579372406, -4.810722351074219, -4.780562400817871, -42.20497131347656, 15.685347557067871, 0.5100194811820984, 0.5636279582977295, -3.0273468494415283, -1.1059386730194092, -4.133427619934082, -4.296045780181885, -2.742187023162842, -2.72588849067688, -0.01962086744606495, -0.37358298897743225, -5.164302825927734, -3.803501605987549, -2.7034244537353516, 0.0468272864818573, -2.1827831268310547, -4.483081817626953, 0.7187308073043823, -0.5038670897483826, -1.4626773595809937, -0.5724906325340271, -3.465902805328369, -4.831928730010986, 2.4990127086639404, -0.6668882966041565, 0.05673468858003616, 0.06973163038492203, 1.625718116760254, -14.103596687316895, -2.1895155906677246, -1.2306833267211914, 2.9472439289093018, -2.2828173637390137, 3.7954890727996826]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (40, 50), 'etaBin': (1.37, 1.54)}}, 'et0_eta0': {'discriminator': {'threshold': -0.13000080958008767, 'nodes': [100, 5, 1], 'bias': [0.0027719091158360243, -0.030745789408683777, -0.019994130358099937, -0.03405983746051788, 0.05469532310962677, 0.053494904190301895], 'weights': [3.0104122161865234, 0.33716049790382385, -0.6918603777885437, -0.36650729179382324, -0.6899896264076233, 0.4430517256259918, -0.6841123104095459, -0.033467914909124374, 1.730831265449524, 3.1084628105163574, -0.47636309266090393, -3.5764594078063965, -6.254197120666504, -10.624968528747559, -11.068583488464355, -25.362735748291016, -6.449751377105713, -7.022157669067383, -4.590561866760254, -7.303133010864258, -1.6697059869766235, -5.107601642608643, -1.6860201358795166, -4.665144920349121, -2.327211856842041, -3.789498805999756, -1.8446691036224365, -2.1149957180023193, -2.4795403480529785, -2.0756676197052, -4.072450160980225, -1.607600450515747, -4.25227165222168, -2.8429853916168213, -1.540915846824646, -1.1948466300964355, -1.3314839601516724, -1.2600440979003906, -1.1157169342041016, -0.8921983242034912, -1.147460699081421, -1.304847240447998, -1.436676263809204, -0.18538561463356018, 0.6405125856399536, -2.860827922821045, 0.2269716113805771, -1.1676502227783203, -0.4828597903251648, -0.26171448826789856, 0.2950541079044342, -0.34384864568710327, -1.4255995750427246, -1.0086662769317627, -0.8365383148193359, -0.37980136275291443, -0.23097233474254608, -0.026851283386349678, 0.7985484004020691, -0.7422285079956055, 0.30208659172058105, 1.9833194017410278, -0.24380549788475037, -0.44539281725883484, 0.7395967245101929, -0.3832899034023285, 0.25805309414863586, -0.5461606383323669, 0.0523955300450325, 0.38556036353111267, 1.3945204019546509, 1.4798781871795654, 0.39619994163513184, 0.07445497810840607, -0.9953435659408569, -1.9788360595703125, -1.6968204975128174, -1.3965789079666138, -1.0862582921981812, -0.8369073271751404, -10.748941421508789, -5.583034515380859, -2.855900764465332, -1.3770126104354858, -2.4373059272766113, -1.3597148656845093, -0.886629581451416, -0.12372172623872757, -2.620683431625366, -2.572859764099121, -1.0929572582244873, 0.21334059536457062, -2.155773878097534, -2.496173620223999, -1.5309242010116577, 0.6554529070854187, -1.4070754051208496, -0.5922932624816895, -0.5046824812889099, 0.3669447600841522, -0.7217203974723816, -0.9673169255256653, 0.06229373812675476, 0.3094996511936188, 0.5783401131629944, -0.38237664103507996, 0.5983491539955139, -0.1485704481601715, -2.008176565170288, -3.4177675247192383, 2.0519659519195557, 3.4366772174835205, 6.185133457183838, 8.25444221496582, 6.4256720542907715, 6.5173163414001465, -0.7637931108474731, 1.562807321548462, 4.360255718231201, 4.418243408203125, 1.7192559242248535, 1.6434358358383179, 1.6664299964904785, 2.4063775539398193, 2.2053911685943604, 2.2568867206573486, 1.711796522140503, 2.139913558959961, 2.4252068996429443, 1.8033676147460938, 1.7279512882232666, 1.5197616815567017, 1.582788109779358, 1.6811914443969727, 1.3529754877090454, 0.7527691125869751, 0.41302475333213806, 1.3256173133850098, 0.9507708549499512, 0.9108638763427734, 1.1912190914154053, 1.1901438236236572, 1.8660979270935059, 0.3677856922149658, -0.5320388674736023, 2.153707504272461, -0.19673658907413483, 1.1783156394958496, 0.42888006567955017, 0.29169729351997375, -0.42466095089912415, 0.09009473025798798, 1.3948500156402588, 0.6720010638237, 0.8526855111122131, 0.087816022336483, 0.3434672951698303, 0.16433802247047424, -0.7643856406211853, 0.7186273336410522, -0.3571009635925293, -1.8309638500213623, 0.42539486289024353, 0.4876108765602112, -0.7158036231994629, 0.49800407886505127, -0.18922294676303864, 0.4988306164741516, -0.060269732028245926, -0.47746676206588745, -1.3874552249908447, -1.4369741678237915, -0.35041794180870056, -0.17787058651447296, 0.8279309868812561, 0.965869128704071, 1.451266884803772, 0.774532675743103, 0.8948243856430054, 0.6089109182357788, 4.532330513000488, 2.4813692569732666, 2.112624168395996, 1.2613558769226074, 1.305626392364502, 1.2173666954040527, 1.055824637413025, 0.1458195447921753, -8.777544975280762, -3.3303956985473633, 0.22165046632289886, -0.24194011092185974, -10.794304847717285, 0.24839042127132416, 0.43038418889045715, -0.5748007297515869, 1.2133091688156128, -0.7433232069015503, 0.8734686374664307, -0.3130723834037781, 3.2121834754943848, 0.10607273131608963, -0.6179821491241455, -0.36072948575019836, -0.6476112604141235, 0.3023219406604767, -0.5528578758239746, 0.037560656666755676, 1.9878206253051758, 3.3295130729675293, 0.19036130607128143, -3.5238215923309326, -6.40492582321167, -10.083856582641602, -9.790680885314941, -11.897777557373047, -11.309596061706543, -8.16537857055664, -4.585658550262451, -7.368370056152344, -1.7431230545043945, -5.166879653930664, -1.66887629032135, -4.584742546081543, -3.336078405380249, -6.059154510498047, -1.6525816917419434, -2.14245343208313, -4.092792510986328, -2.0044467449188232, -4.221402645111084, -1.4996662139892578, -2.972101926803589, -1.9158331155776978, -2.4203226566314697, -2.9057581424713135, -4.483760833740234, -1.281398057937622, -1.131919503211975, -0.9067531228065491, -1.0236477851867676, -1.257441520690918, -1.937111258506775, -0.21556560695171356, 0.709513247013092, -3.0301427841186523, 0.2656053602695465, -1.0813615322113037, -0.3780216574668884, -0.20815321803092957, 0.42901286482810974, -0.2392861545085907, -2.605818271636963, -0.86431485414505, -0.7243807315826416, -0.3742513358592987, -0.22884339094161987, 0.025325078517198563, 0.7732704281806946, -0.3985472321510315, 0.16029061377048492, 1.8401808738708496, -0.300541490316391, -0.47950634360313416, 0.7446222901344299, -0.3247467279434204, 0.3969283401966095, -0.5363669395446777, 0.09838587790727615, 0.25009846687316895, 1.387192726135254, 1.3507468700408936, 0.28283819556236267, 0.11735668033361435, -0.833392858505249, -2.0014379024505615, -2.919123888015747, -1.4755831956863403, -0.949961245059967, -0.7413705587387085, -9.580817222595215, -10.612905502319336, -5.750339508056641, -1.381137490272522, -1.880005121231079, -1.2526817321777344, -0.9165176749229431, -0.3214545249938965, -7.4235334396362305, -8.185215950012207, -1.1611775159835815, 0.22365787625312805, -6.677170753479004, -4.687042713165283, -1.104333519935608, 0.5235454440116882, -1.2530628442764282, -0.7386404871940613, -0.6773895621299744, 0.30902689695358276, 2.9395408630371094, 0.13832561671733856, -0.564487874507904, -0.5071085095405579, -1.5592316389083862, 0.4185751676559448, -0.5541017651557922, 0.0804615318775177, 1.7380670309066772, 3.1298227310180664, 0.15635636448860168, -3.591261386871338, -6.4358015060424805, -10.735091209411621, -10.198407173156738, -24.517120361328125, -6.3657402992248535, -7.8438005447387695, -4.5508928298950195, -7.143901824951172, -1.7702034711837769, -5.148921012878418, -1.8216018676757812, -4.528764247894287, -2.376386880874634, -3.7688820362091064, -1.7383065223693848, -2.1279988288879395, -2.532334804534912, -1.8712098598480225, -4.010451316833496, -1.617948293685913, -3.825892210006714, -2.908707857131958, -1.6663868427276611, -1.2733074426651, -1.4150670766830444, -1.278174638748169, -1.073642611503601, -0.9754862189292908, -1.1604262590408325, -1.11674964427948, -1.2858500480651855, -0.13160493969917297, 0.7079187631607056, -2.8933658599853516, 0.24327464401721954, -1.0096101760864258, -0.4499947428703308, -0.2123025357723236, 0.3633473813533783, -0.162286639213562, -1.4112114906311035, -1.0693395137786865, -0.7675403356552124, -0.31957727670669556, -0.27664440870285034, -0.09396519511938095, 0.8523868322372437, -0.8349786996841431, 0.18403346836566925, 1.8440912961959839, -0.35350823402404785, -0.5359216928482056, 0.7835922837257385, -0.40162190794944763, 0.33800390362739563, -0.5791444182395935, 0.022545333951711655, 0.2586481273174286, 1.5271910429000854, 1.3897197246551514, 0.4511193633079529, 0.1104169711470604, -0.9838781356811523, -2.157365322113037, -1.7037426233291626, -1.375399112701416, -1.0486834049224854, -0.8016714453697205, -11.121331214904785, -5.470461845397949, -2.888141632080078, -1.4748350381851196, -2.392019271850586, -1.3163450956344604, -1.048919439315796, -0.1316092312335968, -2.6575260162353516, -2.368626832962036, -1.1869951486587524, 0.06508775055408478, -2.4916975498199463, -2.450981378555298, -1.5207723379135132, 0.5177884101867676, -1.3736330270767212, -0.7511304020881653, -0.7303417921066284, 0.36395689845085144, 21.058435440063477, 9.12915325164795, -0.25019577145576477, -0.32718023657798767, -0.13435697555541992, 0.24798369407653809, 0.007742086425423622, 0.1744593232870102, 2.1947598457336426, 4.382591724395752, 0.19817961752414703, -14.266183853149414, -14.236342430114746, -5.732553482055664, 30.525476455688477, 55.66305160522461, 2.7460784912109375, -0.9372447729110718, -4.193747520446777, -4.583090782165527, -0.041570164263248444, 0.499439001083374, -0.8257566094398499, -2.054959774017334, -2.248997688293457, -2.1881630420684814, -1.6864163875579834, -2.203171730041504, -2.4180378913879395, -1.9553823471069336, -2.194016933441162, -1.5868390798568726, -1.4754722118377686, -1.5462244749069214, -1.191624402999878, -0.910804808139801, -0.4427856206893921, -1.4043998718261719, -1.1056311130523682, -0.5787000060081482, -1.0505337715148926, -12.395109176635742, -1.106887936592102, -0.3359536826610565, 0.5638695359230042, -1.04970383644104, 0.3423970341682434, -1.0439348220825195, -0.5383099913597107, -0.3183959424495697, 0.3600114583969116, -0.18680769205093384, -1.060125708580017, -0.6349836587905884, 16.35931396484375, -0.11585278809070587, -0.15916891396045685, -0.05726008489727974, 0.8844321370124817, -18.155141830444336, 0.32439282536506653, 1.7903741598129272, -3.329820156097412, -0.45139265060424805, 0.7490172386169434, -2.474151134490967, 0.31415724754333496, -18.46172523498535, 0.06788526475429535, 0.4433909058570862, 1.5188599824905396, 1.3348900079727173, 0.40647777915000916, 0.034642528742551804, -1.5371259450912476, -0.19851063191890717, -1.2684131860733032, -2.540963649749756, -1.0701502561569214, -0.7753573060035706, -3.845635414123535, 14.788578987121582, -2.112802267074585, -0.9182282090187073, -1.2395609617233276, -1.3820443153381348, -1.048235535621643, -0.32137513160705566, -1.4147359132766724, 8.470860481262207, 0.4240935742855072, 0.19208970665931702, 4.7737226486206055, 6.954910755157471, -0.4719589650630951, 0.7183969020843506, -1.3202235698699951, -0.5370994210243225, -0.7489437460899353, -0.49337053298950195, 0.19182538986206055, -0.49395933747291565, 1.4365226030349731, 0.5646209120750427, 0.9925091862678528]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (0, 0.8)}}, 'et0_eta1': {'discriminator': {'threshold': 0.004999199509620661, 'nodes': [100, 5, 1], 'bias': [-0.2419523298740387, -0.1788606494665146, -0.11421695351600647, 0.14182445406913757, -0.07570439577102661, 0.22020137310028076], 'weights': [2.2169363498687744, 2.7532498836517334, -0.8267584443092346, -0.7797825336456299, -1.020559310913086, -0.0499534048140049, -0.3282013237476349, 0.5312463045120239, 2.659205913543701, 5.342463970184326, 2.144444227218628, -0.0833103135228157, -11.308581352233887, -4.076024055480957, -8.603513717651367, -16.366212844848633, -5.259064674377441, -6.481001377105713, -12.627670288085938, -4.692115306854248, -5.565089225769043, -6.783063888549805, -4.543320178985596, -3.0383706092834473, -3.642913818359375, -1.2224321365356445, -7.077785968780518, -4.494020462036133, -3.2396719455718994, -3.3516175746917725, -3.506727457046509, -3.2087135314941406, -2.667553186416626, -2.7103047370910645, -5.8007402420043945, -2.4100589752197266, -1.2014609575271606, -2.7959556579589844, -0.5541382431983948, -4.078998565673828, -1.0442224740982056, -1.3879176378250122, 1.2014338970184326, -0.7012238502502441, 1.3713657855987549, -0.5381091237068176, -0.17806638777256012, 0.9453555345535278, 1.366939663887024, -5.294135570526123, -0.7591349482536316, 0.7920718789100647, -0.462947279214859, -4.339409828186035, -1.1262003183364868, -0.4685709774494171, -1.0528900623321533, 0.8854106068611145, -1.187703013420105, -2.815504789352417, -1.047894835472107, -0.7617879509925842, 0.624564528465271, 0.06664310395717621, 0.3762340843677521, -2.4422380924224854, 0.1785350739955902, 0.6013210415840149, 0.3860478103160858, 0.05054749175906181, -0.9731127619743347, -1.2421848773956299, 0.3652139902114868, 0.11926782876253128, -0.8625178337097168, -1.8412816524505615, -2.3486902713775635, -1.7384939193725586, -1.1514246463775635, -0.6194364428520203, -9.820606231689453, -5.94714879989624, -3.4351768493652344, -3.0902912616729736, -1.8717381954193115, -1.3676413297653198, -1.7327674627304077, -1.9622999429702759, -3.6860873699188232, -0.7463592886924744, 0.5572549700737, 0.30155766010284424, -7.388822555541992, -8.848809242248535, -0.23705165088176727, -0.1447933465242386, 0.3552716374397278, -1.1003679037094116, -1.5010054111480713, -0.07164696604013443, 2.179924726486206, 1.0082378387451172, -0.8127292990684509, -0.8268682360649109, -0.9137819409370422, -0.47814273834228516, -0.3614632785320282, 0.6130778789520264, 1.9895679950714111, 5.251211166381836, 2.003241539001465, -0.2468765676021576, -10.565252304077148, -3.4158098697662354, -8.538171768188477, -15.665409088134766, -5.202942371368408, -5.901217937469482, -12.562687873840332, -4.299706935882568, -5.48009729385376, -6.96751070022583, -4.617422103881836, -2.97694993019104, -4.4424920082092285, -1.3203697204589844, -5.45392370223999, -4.5033111572265625, -3.3547441959381104, -3.436358690261841, -3.6645357608795166, -3.1198506355285645, -2.705101728439331, -3.9648759365081787, -3.0624101161956787, -2.3369081020355225, -1.2047312259674072, -3.1745526790618896, -0.6369917392730713, -4.062929153442383, -1.128879189491272, -1.369496464729309, 1.2078688144683838, -0.7363274693489075, 1.3929245471954346, -0.38409000635147095, -0.3405444324016571, 0.8460223078727722, 1.3779445886611938, -3.2692196369171143, -0.8582490682601929, 0.6502522826194763, -0.5448287725448608, -4.385491371154785, -0.968392014503479, -0.5234550833702087, -1.2225149869918823, 0.5946704149246216, -0.9748676419258118, -2.8626723289489746, -1.0791670083999634, -0.7076032161712646, 0.6646453738212585, -0.0034364121966063976, 0.5190089344978333, -2.3634095191955566, -0.05494547635316849, 1.6995137929916382, 0.4713716506958008, -0.029251473024487495, -0.8175522685050964, -1.240248441696167, 0.5401641726493835, 0.12718243896961212, -0.6915145516395569, -1.895331859588623, -2.196659564971924, -1.630667805671692, -1.1080918312072754, -0.7638545632362366, -9.896124839782715, -7.4101433753967285, -3.4054222106933594, -3.2316782474517822, -1.9031871557235718, -1.4178217649459839, -1.6775732040405273, -1.9368301630020142, -2.026869297027588, -0.690743625164032, -0.5442407131195068, 0.2723405957221985, -7.502132415771484, -8.830202102661133, -0.33507582545280457, -0.12850044667720795, 1.2458628416061401, -1.1952428817749023, -1.3449838161468506, -0.12557072937488556, 2.255282163619995, 0.92508864402771, -0.32057368755340576, -0.5549095869064331, -0.3435039222240448, -0.49410825967788696, 0.0898943766951561, 0.59955894947052, 1.9818447828292847, 5.4488525390625, 2.1250998973846436, -0.22664912045001984, -1.5746294260025024, -9.53662395477295, -8.113788604736328, -6.87240743637085, -4.332401752471924, -4.196752071380615, -4.3074445724487305, -3.384168863296509, -4.739842891693115, -4.160134315490723, -5.109932899475098, -2.2272047996520996, -3.0943310260772705, -1.2474457025527954, -5.051222324371338, -4.322053909301758, -3.3698785305023193, -3.335650682449341, -3.8726353645324707, -3.08906626701355, -2.587754487991333, -3.4864842891693115, -2.2807652950286865, -2.187812089920044, -1.2461556196212769, 0.5336964726448059, -0.29373618960380554, -0.92899489402771, -1.1141397953033447, -1.3155173063278198, 1.7685489654541016, -0.4097933769226074, 1.3541674613952637, -0.2364848405122757, -0.17864270508289337, 1.048292636871338, 1.338594913482666, -1.844401240348816, -0.8443801403045654, 0.5884573459625244, -0.6398547887802124, -6.024773597717285, -1.0054324865341187, -0.5032756924629211, -1.0822479724884033, 0.6396970152854919, -0.9285800457000732, -2.7478291988372803, -0.9908654093742371, -0.5518115758895874, 0.7110306620597839, 0.13611719012260437, 0.428081750869751, -2.775491952896118, 0.17641127109527588, 1.5609934329986572, 0.42926275730133057, 0.06777767091989517, -1.0060672760009766, -1.0280340909957886, 0.20303383469581604, 0.14916649460792542, -0.6993547081947327, -0.7571804523468018, -1.5524744987487793, -1.0487337112426758, -0.6372774243354797, -0.3927784264087677, -3.1435720920562744, 11.845252990722656, -3.3446078300476074, -2.4433434009552, -1.8015235662460327, -1.3650074005126953, -1.8337547779083252, -1.977478265762329, 1.5484129190444946, -0.5749542713165283, -0.5401884317398071, -0.15113025903701782, 32.1970100402832, 25.611331939697266, -0.23964577913284302, -0.03404242545366287, 1.310422420501709, 0.1727093756198883, -1.4330334663391113, -0.263566792011261, -2.1751060485839844, -1.035946249961853, 0.673592746257782, 0.7085232138633728, 0.5158143639564514, 0.19016025960445404, 0.02306843362748623, -0.5579238533973694, -2.0862724781036377, -5.3436126708984375, -2.1633241176605225, 0.10163290053606033, 8.65424919128418, 15.908517837524414, 8.520809173583984, 7.398211479187012, 5.328628063201904, 5.485339164733887, 9.160340309143066, 3.8076565265655518, 5.458552360534668, 6.797657489776611, 3.4759681224823, 3.0724897384643555, 3.1501755714416504, 1.3562136888504028, 4.897558689117432, 4.407222270965576, 3.3011069297790527, 3.3482141494750977, 3.5584263801574707, 3.0816965103149414, 2.618988037109375, 3.529326915740967, 2.929184913635254, 2.425967216491699, 1.2664817571640015, -0.22728584706783295, 0.28546062111854553, 0.9497538805007935, 1.1099337339401245, 1.2939321994781494, -1.828993320465088, 0.43414321541786194, -1.2278379201889038, 0.29704153537750244, 0.29775917530059814, -0.9372382164001465, -1.3688970804214478, 3.1984920501708984, 0.8992602229118347, -0.6575921177864075, 0.46973884105682373, 4.236397743225098, 1.0550086498260498, 0.6718395948410034, 1.0928590297698975, -0.5286487340927124, 0.9334386587142944, 2.9640419483184814, 1.0886595249176025, 0.7026524543762207, -0.5850628018379211, -0.1319434493780136, -0.5144090056419373, 1.7701421976089478, -0.17973458766937256, -1.62489914894104, -0.2760557234287262, -0.062471143901348114, 0.8572553396224976, 1.1737757921218872, -0.22838062047958374, -0.2608878016471863, 0.8621696829795837, 0.7644885182380676, 1.9728444814682007, 1.1150742769241333, 0.8555498123168945, 0.5383461117744446, 4.460012912750244, 5.82310152053833, 3.237823009490967, 2.5480830669403076, 1.797529935836792, 1.4706848859786987, 1.8601220846176147, 1.959677815437317, 1.2026774883270264, 0.6463479399681091, 0.42303016781806946, -0.3455183506011963, -1.5780541896820068, 1.6332106590270996, 0.10772932320833206, -0.07981161028146744, -1.1880288124084473, -6.858782768249512, 1.454778790473938, 0.17228664457798004, -1.0589264631271362, -1.2777150869369507, -0.8202926516532898, -1.2153453826904297, -7.900195598602295, -0.3028285503387451, -0.23521244525909424, -0.5138748288154602, -0.9081577062606812, -4.760847091674805, -0.7580344080924988, -0.5153947472572327, 3.17096209526062, 31.483720779418945, 3.723647356033325, 2.9741768836975098, 1.8442035913467407, 1.7252893447875977, 1.3106104135513306, 1.2294288873672485, -3.3668296337127686, 2.2755684852600098, 0.8985055685043335, -1.0879207849502563, 0.2836175858974457, 0.2901609539985657, 0.23782014846801758, 1.200321912765503, 0.4658257067203522, -0.3615632951259613, -4.021435260772705, 0.726189136505127, 0.5964933037757874, 0.8738551139831543, 0.6852433085441589, 0.5820195078849792, -4.477887153625488, -1.5113470554351807, -1.0317434072494507, 0.06051911786198616, -3.362048864364624, -7.459989070892334, -1.3490523099899292, -0.2520720362663269, -2.8832485675811768, -1.016361117362976, -0.2892061173915863, -1.101325273513794, -4.395275115966797, 0.6755730509757996, 0.24080154299736023, -0.5123816132545471, -0.07995622605085373, 0.22133974730968475, 0.33544281125068665, 0.26873674988746643, 0.3825101852416992, -0.35860052704811096, 0.04941486567258835, 0.46868517994880676, 0.04499971494078636, 0.4071914553642273, -0.39102670550346375, -0.1014576330780983, -0.10466546565294266, 5.0549116134643555, -0.17937366664409637, -0.9165195226669312, -0.30500149726867676, -0.30383312702178955, 0.3180762231349945, 0.4968600571155548, -0.8282189965248108, -0.272370308637619, 0.20714102685451508, 0.3640463948249817, -32.001800537109375, -0.8529021143913269, -8.93774127960205, -4.88483190536499, 0.11148025840520859, 0.2184128314256668, -7.403574466705322, -0.2069324404001236, -1.176985502243042, -0.8256001472473145, 0.45193272829055786, 0.3454861640930176, -2.566599130630493, 0.7642796635627747, -1.0901622772216797, -0.16659995913505554, -5.848890781402588, -6.345538139343262, 1.5991814136505127, -0.17160169780254364, 0.9480943083763123, -5.87355899810791, 0.05881625786423683, 0.13153761625289917, 0.820921778678894, 1.0528318881988525, 0.5193421840667725, -0.42662134766578674, -0.3459281921386719]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (0.8, 1.37)}}, 'et1_eta1': {'discriminator': {'threshold': -0.3550007104873657, 'nodes': [100, 6, 1], 'bias': [-0.009262134321033955, 0.11403325945138931, -0.05697072297334671, 0.02670249342918396, -0.0004424861108418554, -0.09567686170339584, -0.06761693209409714], 'weights': [-1.68311607837677, -1.4569848775863647, 0.5335415005683899, 0.8660264611244202, 0.7174923419952393, 0.730705976486206, 0.09598191827535629, 0.7200860977172852, -2.1343369483947754, -4.757304668426514, -1.4119659662246704, 2.976902723312378, 2.519176721572876, 1.5647720098495483, 0.10974285751581192, 0.10809197276830673, 4.8538737297058105, 5.077908515930176, 5.329061031341553, 5.2591681480407715, 4.971745014190674, 4.666284561157227, 4.310705184936523, 4.793591499328613, 4.540436267852783, 3.747809410095215, 2.1948869228363037, 3.136486291885376, 2.200423240661621, 3.60239315032959, 2.740330457687378, 2.204880952835083, 2.1703991889953613, 2.2458949089050293, 2.954357624053955, 1.4308279752731323, 1.314427137374878, 1.5256716012954712, 1.705006718635559, 1.4887328147888184, 1.6929272413253784, 1.626034140586853, 2.609642744064331, 0.47312799096107483, 0.5724508166313171, 0.8067747950553894, 3.231626272201538, 0.8580575585365295, 4.727327823638916, 0.9930837154388428, 1.065865397453308, 0.7019524574279785, 0.8121689558029175, -0.8102405071258545, 0.781336784362793, 0.588182806968689, 0.6844849586486816, 0.6846994757652283, 0.8524537086486816, 0.23930908739566803, 0.5554389953613281, 0.6583843231201172, -0.5964277982711792, 0.8768768906593323, -0.05953080207109451, -1.6624952554702759, 0.580730140209198, -1.6758124828338623, -0.643416702747345, 0.3210599720478058, 0.20139828324317932, 0.5071247220039368, -0.5896103978157043, -0.19933345913887024, 0.7465687394142151, 1.0144462585449219, 1.5076524019241333, 1.3741308450698853, 0.7607359290122986, 0.2931405305862427, 10.498966217041016, 5.260972499847412, 3.5426642894744873, 2.233567714691162, 2.319105863571167, 2.194509267807007, 1.6586837768554688, 2.3370673656463623, 1.5669591426849365, 0.8519150018692017, 0.6782934665679932, -0.22657379508018494, 2.875805139541626, 1.7324320077896118, 0.2371082603931427, -0.10835153609514236, 2.2406046390533447, 1.7271203994750977, 0.5645100474357605, 0.6243765950202942, 26.117496490478516, 47.860939025878906, -0.0185922272503376, -0.08952942490577698, -0.07323047518730164, -0.076230987906456, -0.0784786194562912, -0.21038077771663666, 0.31702524423599243, 0.8066724538803101, -3.1502938270568848, -120.3679428100586, -9.880788803100586, -4.596731185913086, 29.22450828552246, 0.017462890595197678, -1.1553833484649658, -1.1195496320724487, -1.2243932485580444, -0.9548608064651489, -1.0794403553009033, -0.9172614812850952, -0.9452863931655884, -0.9285127520561218, -1.0340548753738403, -0.8179218769073486, -0.3497898578643799, -0.6662282347679138, -0.5086925625801086, -0.46222612261772156, -0.5275274515151978, -0.42630690336227417, -0.3595050573348999, -0.3644062876701355, -0.47783172130584717, -0.24926239252090454, -0.24036729335784912, -0.2418835312128067, -0.2943932116031647, -0.2044386863708496, -0.39601412415504456, -0.19684003293514252, -0.174738809466362, -0.22927667200565338, -0.10544516146183014, -0.26784849166870117, -0.35845011472702026, -0.09223094582557678, -0.22095224261283875, -0.22769610583782196, -0.10604245960712433, -0.12347967177629471, -0.2589598596096039, 0.18820318579673767, -0.27018824219703674, 41.964115142822266, -0.28381603956222534, -0.06393256038427353, -0.1931096762418747, -0.09659484773874283, -0.10530337691307068, -0.11529818922281265, 0.17910997569561005, -0.17627088725566864, -0.015767188742756844, 1.252566933631897, -0.20815938711166382, 0.2603822350502014, 0.13631519675254822, -0.13949330151081085, -0.1467839479446411, -0.014168902300298214, 0.1513163447380066, 0.6338702440261841, -0.23853857815265656, -0.27293604612350464, -0.38623708486557007, -0.2877321243286133, -0.22093838453292847, 0.03441372886300087, -2.4927520751953125, -0.8883300423622131, -0.7975724339485168, -0.6235693693161011, -0.4278264045715332, -0.37991246581077576, -0.3968816101551056, -0.2537919878959656, -0.4183489978313446, -0.1392844021320343, -0.16861552000045776, 0.11789364367723465, -0.6407777667045593, -0.4173126816749573, -0.1015007272362709, 0.1118307113647461, -0.34941568970680237, -0.3567374050617218, -0.20485980808734894, -0.08960124105215073, 1.6926958560943604, 1.1739120483398438, -0.3778495490550995, -0.748168408870697, -0.60002601146698, -0.688393235206604, -0.10886187851428986, 0.7823707461357117, 1.954888939857483, 4.082591533660889, 1.3562995195388794, -3.1061081886291504, -14.4478759765625, -1.1340501308441162, -7.89017391204834, -1.355668067932129, -5.379847526550293, -5.210483074188232, -5.527088165283203, -6.067376613616943, -5.566293716430664, -4.522905349731445, -4.378673553466797, -4.849443435668945, -4.719850063323975, -3.6691508293151855, -2.1491057872772217, -3.109639883041382, -2.2511565685272217, -4.536490440368652, -2.9407622814178467, -2.4051313400268555, -2.1256041526794434, -2.2372162342071533, -2.789137125015259, -1.5142287015914917, -1.2492684125900269, -1.6211843490600586, -1.7839574813842773, -1.4934532642364502, -1.7011547088623047, -1.5181875228881836, -1.4232414960861206, -0.5656542181968689, -0.4539507329463959, -0.7779789566993713, -1.1279048919677734, -1.0179001092910767, -1.0559519529342651, -0.9773439168930054, -1.0534878969192505, -0.73095703125, -0.8986287117004395, 0.770297646522522, -0.8808987140655518, -0.6339964270591736, -0.8934319019317627, -0.7237647175788879, -0.8160689473152161, -0.25114724040031433, -0.4401104748249054, -0.8078599572181702, -0.1128823459148407, -0.7314887046813965, -0.052875861525535583, 1.539644479751587, -0.5039902925491333, 1.6002612113952637, 0.4862348139286041, -0.3433493971824646, -0.4274101257324219, 1.9341918230056763, 0.3974999785423279, 0.28377246856689453, -0.7782816290855408, -1.0435620546340942, -1.4090238809585571, -1.42666494846344, -0.7047394514083862, -0.5438223481178284, -11.117718696594238, -4.498582363128662, -3.575146198272705, -2.35101580619812, -2.2881040573120117, -1.5803592205047607, -1.5527069568634033, -1.7492262125015259, -1.7389928102493286, -0.9570375084877014, -0.1886393427848816, 0.15874634683132172, -3.0056302547454834, -2.182521104812622, -0.5244185924530029, 0.21831248700618744, -2.208988904953003, -1.576480746269226, -0.5401718616485596, -0.5023214817047119, 0.3207312822341919, 1.2268915176391602, -0.11252876371145248, -0.22917109727859497, -0.0613178052008152, -0.03746052458882332, 0.08305753022432327, 0.2504933476448059, 0.47544988989830017, 1.0961859226226807, 0.2796965539455414, -3.2554128170013428, -1.2093565464019775, -1.4485738277435303, -0.9744834899902344, 0.019727423787117004, -0.9282875657081604, -0.994166910648346, -1.0240962505340576, -1.201321005821228, -0.9554650783538818, -1.0570991039276123, -0.8853266835212708, -0.8295027017593384, -0.8679211735725403, -0.6739240884780884, -0.43453657627105713, -0.5977059602737427, -0.4133867621421814, -0.5869407057762146, -0.4897671639919281, -0.5638994574546814, -0.3849004805088043, -0.5227524638175964, -0.6460722088813782, -0.28870177268981934, -0.3622654378414154, -0.3931449055671692, -0.2667752504348755, -0.24373890459537506, -0.4419442415237427, -0.27533140778541565, -0.6664111614227295, -0.13489198684692383, -0.17816193401813507, -0.22605203092098236, -0.32236671447753906, -0.07040201872587204, -0.12137936800718307, -0.31337106227874756, -0.07943723350763321, -0.13811169564723969, -0.27617186307907104, 0.16876719892024994, -0.19158783555030823, -0.012025796808302402, -0.18275116384029388, -0.07416193932294846, -0.1231045052409172, -0.14463919401168823, -0.21086907386779785, -0.14971907436847687, 0.04209398478269577, -0.07392524927854538, 0.03368920460343361, 0.31920942664146423, -0.14851324260234833, 0.41493648290634155, 0.17232975363731384, -0.10359667986631393, -0.034418314695358276, 0.4594833254814148, 0.1365262120962143, -0.05514472350478172, -0.21112124621868134, -0.14040443301200867, -0.34301382303237915, -0.33753329515457153, -0.075286366045475, -0.16005758941173553, -2.067650079727173, -0.62843918800354, -0.5556692481040955, -0.4679825007915497, -0.48359760642051697, -0.4274426996707916, -0.37278300523757935, -0.4013608992099762, -0.24077413976192474, -0.29583656787872314, 0.027360446751117706, -0.05881731957197189, -0.586703360080719, -0.19924455881118774, 0.0040486338548362255, -0.04747982323169708, -0.4401179850101471, -0.389442503452301, -0.2114265114068985, -0.16198934614658356, -1.690132737159729, -1.3687201738357544, 0.4556020200252533, 0.8527954816818237, 0.5999191999435425, 0.6221451163291931, 0.10438346862792969, 0.687874436378479, -2.0101394653320312, -4.8871259689331055, -1.5930103063583374, 3.1762843132019043, 1.0754178762435913, 1.441694736480713, -1.0820975303649902, 0.05032562091946602, 4.939760208129883, 4.9943318367004395, 5.317627906799316, 5.311254978179932, 4.989718437194824, 4.524256706237793, 4.336480140686035, 4.7966389656066895, 4.745635509490967, 3.6857500076293945, 2.247640371322632, 3.0365402698516846, 2.369861364364624, 3.847121477127075, 2.9389500617980957, 2.3582558631896973, 2.085233211517334, 2.124588966369629, 2.852431297302246, 1.4701558351516724, 1.326816439628601, 1.6742054224014282, 1.7030094861984253, 1.5289603471755981, 1.7025913000106812, 1.4520392417907715, 2.6067025661468506, 0.4762183725833893, 0.5174486041069031, 0.884993314743042, 3.8454627990722656, 0.8798968195915222, 4.731002330780029, 0.9449880123138428, 0.897678017616272, 0.7145578265190125, 0.864109218120575, -0.7105767726898193, 0.8060390949249268, 0.6032533049583435, 0.7130441069602966, 0.7531229853630066, 0.8018993735313416, 0.19523273408412933, 0.5336224436759949, 0.7721254825592041, 0.26588529348373413, 0.778928279876709, -0.058028846979141235, -1.6551185846328735, 0.5130794048309326, -1.6709634065628052, -0.7295700907707214, 0.2604445517063141, 0.38593539595603943, 0.43960869312286377, -0.5822135806083679, -0.13916073739528656, 0.691264808177948, 1.2089803218841553, 1.4040387868881226, 1.5151915550231934, 0.7375446557998657, 0.43524718284606934, 10.349853515625, 5.309102535247803, 3.455317974090576, 2.3784525394439697, 2.2248263359069824, 2.373924970626831, 1.5765775442123413, 2.960482120513916, 1.5727297067642212, 0.9360575079917908, 0.586595356464386, -0.23358409106731415, 2.832442283630371, 1.750033974647522, 0.12322598695755005, 0.09100231528282166, 2.2746238708496094, 1.5544936656951904, 0.5266433954238892, 0.581261932849884, 1.6814533472061157, 1.172446846961975, -0.2586249113082886, -0.8439111709594727, -0.7179451584815979, -0.6600342988967896, -0.2213069051504135, 0.9859451651573181, 1.7618019580841064, 4.235414028167725, 1.3822236061096191, -3.1086835861206055, -14.562711715698242, -1.059888243675232, -16.777902603149414, -4.529929161071777, -5.258783340454102, -5.110031604766846, -5.5335259437561035, -5.930649280548096, -5.649166584014893, -4.602900505065918, -4.279512882232666, -4.896762847900391, -4.582980632781982, -3.5727100372314453, -2.3015153408050537, -3.0661983489990234, -2.2142016887664795, -2.8304226398468018, -2.9345176219940186, -2.371076822280884, -2.1943888664245605, -2.119457960128784, -2.8591575622558594, -1.4466975927352905, -1.35748291015625, -1.5501443147659302, -1.767087697982788, -1.5341343879699707, -1.7305326461791992, -1.4832645654678345, -1.4578478336334229, -0.45584186911582947, -0.48572540283203125, -0.9220519065856934, -1.0070197582244873, -0.9191168546676636, -0.8233225345611572, -0.8701371550559998, -1.072057843208313, -0.814674973487854, -0.862621545791626, 0.702472984790802, -0.7575227618217468, -0.7151869535446167, -0.7163618206977844, -0.7611345648765564, -0.845486581325531, -0.29114389419555664, -0.623615562915802, -0.8391228914260864, -0.12719140946865082, -0.729718804359436, -0.2207925021648407, 1.4636245965957642, -0.7394801378250122, 1.5782012939453125, 0.49014732241630554, -0.2573527991771698, -0.481814444065094, 1.9003393650054932, 0.5471203327178955, 0.18622633814811707, -0.6945018768310547, -1.2002664804458618, -1.3966060876846313, -1.4773098230361938, -0.7708931565284729, -0.5748347640037537, -10.810044288635254, -3.4294321537017822, -3.435889959335327, -2.132974147796631, -2.300492525100708, -1.5717380046844482, -1.7953721284866333, -1.7138242721557617, -1.759426236152649, -0.9750609993934631, -0.06394440680742264, 0.20894065499305725, -3.0633206367492676, -2.071727752685547, -0.7266013026237488, 0.24678899347782135, -2.1746394634246826, -1.7095069885253906, -0.5420822501182556, -0.472383052110672, -0.5386008024215698, 0.3790470063686371, 0.9293994307518005, 0.49629369378089905, -0.606113851070404, 3.118548631668091]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0.8, 1.37)}}, 'et1_eta0': {'discriminator': {'threshold': -0.4650006055831909, 'nodes': [100, 5, 1], 'bias': [0.08850277215242386, 0.29802069067955017, 0.21457459032535553, -0.10977515578269958, -0.2650356590747833, -0.06368418782949448], 'weights': [-2.5806844234466553, -1.0012047290802002, -0.2730771601200104, 0.04640960693359375, -0.23492079973220825, -0.25099289417266846, -0.18854427337646484, -0.6312430500984192, -1.5728650093078613, -2.0988950729370117, 1.0723426342010498, 5.214395046234131, 7.634226322174072, 3.932420492172241, 3.1731977462768555, 2.7362208366394043, 2.520021915435791, 1.7802473306655884, 1.7117398977279663, 2.775007963180542, 1.8490713834762573, 4.080935001373291, 1.5807067155838013, 1.3705689907073975, 1.4523284435272217, 1.282424807548523, 1.9052059650421143, 1.3268152475357056, 1.2147687673568726, 1.1448230743408203, 1.0762319564819336, 1.149719476699829, 0.9828029274940491, 0.7869490385055542, 1.0506229400634766, 0.7081304788589478, 0.7478598356246948, 0.8586633205413818, 0.8232532739639282, 1.6884773969650269, 0.5400390028953552, 0.44420546293258667, 0.6171509623527527, 0.6396961212158203, 0.40406715869903564, 0.4276370704174042, 0.4723331928253174, 0.10639713704586029, 0.4063652455806732, -0.04959668591618538, 0.2616499960422516, -0.03402677923440933, 0.059273116290569305, 0.3306509256362915, 0.5020179152488708, 0.6612769365310669, -0.03246231749653816, -0.3431079685688019, 0.112039715051651, 0.20476339757442474, -0.2729301452636719, -0.652006208896637, 0.3640297055244446, 0.6954027414321899, 0.1482647806406021, 0.5909504890441895, -0.28839030861854553, 0.31749823689460754, -0.47111091017723083, 0.2065715789794922, -0.7505382895469666, 0.2084415853023529, -0.42441025376319885, -0.2964019775390625, 0.2804376482963562, 0.582612931728363, 1.00559663772583, 0.5798299312591553, 0.4391465187072754, 0.03747107461094856, 5.822595596313477, 1.6330883502960205, 1.7257215976715088, 1.1487311124801636, 0.8518974184989929, 0.7851455211639404, 0.9534518718719482, 1.4868475198745728, 1.8831793069839478, 1.4306070804595947, 0.39715254306793213, 0.24408017098903656, 1.7380021810531616, 1.0294674634933472, -0.11819819360971451, -0.24534854292869568, 2.358104705810547, 1.0681188106536865, 0.2522551417350769, -8.108581823762506e-05, -0.2052263468503952, 20.07004737854004, -0.05454494431614876, -0.18717095255851746, -0.022892674431204796, 6.42439079284668, 0.021967625245451927, -0.2698066532611847, 0.9815628528594971, 2.539395570755005, -0.041126005351543427, -188.51095581054688, 1.2481532096862793, 4.584614276885986, 31.096965789794922, 7.407281875610352, 6.4813032150268555, 0.44959187507629395, 6.5897698402404785, 3.112337350845337, 0.552180290222168, 0.7381755709648132, 0.34178149700164795, 0.10214046388864517, 0.28746888041496277, 0.11707084625959396, 0.2851114869117737, 0.29011955857276917, 0.2782539427280426, 0.1969985067844391, 0.2606906592845917, 0.1943608522415161, 0.2012009471654892, 0.12583144009113312, 0.1824081391096115, 0.13188831508159637, 0.13675498962402344, 0.13455922901630402, 0.1803206503391266, 0.03803775832056999, -0.0544644296169281, -0.08126848191022873, 0.17514316737651825, 0.15767283737659454, -0.02302093245089054, 0.0002129851491190493, 9.541810035705566, -0.11653793603181839, -0.02170524187386036, -0.0030093672685325146, 0.11309917271137238, -0.15355350077152252, -0.11288440972566605, -2.4306955337524414, -73.22344970703125, -0.020048722624778748, -0.17453287541866302, -0.7349122762680054, -0.1362602561712265, -0.11913035064935684, -0.24777555465698242, -0.09940226376056671, 0.08428455889225006, -0.187347412109375, 0.01218602154403925, 0.08000417053699493, -0.04203977808356285, 0.013009489513933659, -0.1961224377155304, 0.05147147923707962, -0.17532473802566528, -0.11450307816267014, 0.1367666870355606, 0.10501325130462646, 1.171893835067749, 4.778346538543701, 0.24694855511188507, 0.031231198459863663, 0.059682074934244156, -0.07460985332727432, 0.560391902923584, 8.475451469421387, 16.56343650817871, 0.22844885289669037, 0.005401573609560728, 0.09367279708385468, 0.021713171154260635, 0.1966490000486374, -1.247552514076233, 0.024344611912965775, -0.0208007600158453, -0.26645153760910034, 0.12142878770828247, 0.10227616131305695, -0.09873196482658386, -0.07469190657138824, 0.4973446726799011, 2.5086257457733154, -0.07525625079870224, -0.16092340648174286, -2.383897066116333, -1.3760507106781006, -0.3348962664604187, 1.179531455039978, -0.15976905822753906, -0.24633640050888062, -0.027256470173597336, -0.5228423476219177, -1.5888421535491943, -2.6769280433654785, 0.8242276310920715, 2.4047093391418457, 1.4194800853729248, 3.582404375076294, 3.1895318031311035, 2.3722589015960693, 2.534457206726074, 1.7707122564315796, 1.8028674125671387, 2.6878201961517334, 1.6965737342834473, 2.156740427017212, 1.542108178138733, 1.4480589628219604, 1.8843015432357788, 1.1578338146209717, 1.8208820819854736, 1.3979628086090088, 1.1670628786087036, 1.1282018423080444, 1.2297827005386353, 1.0489581823349, 1.0769861936569214, 0.6272847056388855, 0.8593021035194397, 0.6260786056518555, 0.5971726775169373, 0.8229843974113464, 0.8540348410606384, 1.5200797319412231, 0.6819210648536682, 0.5246379971504211, 0.6939978003501892, 0.5826196670532227, 0.2613293528556824, 0.5254384279251099, 0.5967040657997131, -0.01746673323214054, 0.5041105151176453, -0.12722176313400269, 0.30193957686424255, 0.1491677314043045, -0.1304699331521988, 0.3279569149017334, 0.5113049745559692, 0.6325740814208984, -0.14406374096870422, 0.02065088227391243, 0.15422871708869934, 0.2860473394393921, -0.3209764361381531, -0.7076837420463562, 0.3395984470844269, 0.7022368907928467, 0.1842680275440216, 0.6265614032745361, -0.3680141568183899, 0.45416259765625, -0.46680304408073425, 0.40902554988861084, -0.49815353751182556, 0.09244372695684433, -0.39312347769737244, -0.48561719059944153, 0.43097352981567383, 0.7226723432540894, 0.897112250328064, 0.6425195336341858, 0.45138198137283325, 0.00849300716072321, 5.954187870025635, 1.6895170211791992, 1.6343204975128174, 1.0949205160140991, 0.9260191321372986, 0.6236910820007324, 0.8671881556510925, 1.417702078819275, 1.9717001914978027, 1.473469614982605, 0.4402773082256317, 0.24526472389698029, 2.007535457611084, 1.0167276859283447, 0.41198447346687317, -0.30539608001708984, 2.3852570056915283, 0.996436595916748, 0.3332338035106659, -0.17675654590129852, 2.5845961570739746, 1.212166428565979, 0.20074820518493652, 0.030683953315019608, 0.2545512318611145, 0.17029887437820435, 0.16634932160377502, 0.4982535243034363, 1.6890970468521118, 1.9754447937011719, -1.2980303764343262, -5.312727451324463, -7.698091983795166, -3.7385916709899902, -3.286646604537964, -2.704873561859131, -2.4968903064727783, -1.7537165880203247, -1.8216450214385986, -2.681057929992676, -1.8271340131759644, -1.9379202127456665, -1.5291752815246582, -1.463510274887085, -1.3950189352035522, -1.0537468194961548, -1.7698345184326172, -1.4257134199142456, -1.1033873558044434, -1.2061586380004883, -1.0880452394485474, -1.0287353992462158, -1.074491024017334, -0.8654044270515442, -1.09386146068573, -0.7744948267936707, -0.6656947135925293, -0.6827832460403442, -0.7813001871109009, -1.495880365371704, -0.7289212346076965, -0.38663405179977417, -0.7631081938743591, -0.651140570640564, -0.39397621154785156, -0.4455743730068207, -0.4467396140098572, -0.04283224418759346, -0.40346524119377136, 0.20658908784389496, -0.34545084834098816, 0.04809919744729996, 0.0783865675330162, -0.3686244487762451, -0.5752061605453491, -0.7076175212860107, 0.121605284512043, 0.1639905422925949, -0.26296666264533997, -0.23427186906337738, 0.2737751007080078, 0.7305718064308167, -0.5138651132583618, -0.5449318289756775, -0.15384043753147125, -0.7897053956985474, 0.3668023347854614, -0.4822190999984741, 0.4539201259613037, -0.32751092314720154, 0.5043238401412964, -0.419588178396225, 0.6023481488227844, 0.17831134796142578, -0.24144744873046875, -0.6358891129493713, -0.9003252387046814, -0.5418298244476318, -0.43454253673553467, -0.1705821305513382, -5.86890983581543, -1.708831787109375, -1.6034786701202393, -1.0516904592514038, -0.7220751643180847, -0.7304001450538635, -0.9084433317184448, -1.4979172945022583, -2.0133533477783203, -1.2951805591583252, -0.19642029702663422, -0.1319875419139862, -1.6450563669204712, -0.9842507243156433, 0.104102723300457, 0.21811139583587646, -2.505967378616333, -0.9627663493156433, -0.20291189849376678, -0.17066088318824768, 2.523078203201294, 1.2397465705871582, 0.3222271502017975, 0.12637624144554138, 0.19881415367126465, 0.1611686795949936, 0.015605319291353226, 0.5323315262794495, 1.6160365343093872, 2.0284018516540527, -1.044151782989502, -3.7301273345947266, -1.5994799137115479, -3.6477060317993164, -3.2697880268096924, -2.807410955429077, -2.474952459335327, -1.6306145191192627, -1.6776785850524902, -2.6056666374206543, -1.7122881412506104, -1.9532740116119385, -1.5319031476974487, -1.4019474983215332, -1.90078866481781, -1.3484795093536377, -1.8125066757202148, -1.1925442218780518, -1.1334221363067627, -1.092852234840393, -1.013049840927124, -1.129899501800537, -0.9238896369934082, -0.6770639419555664, -1.1074323654174805, -0.6877516508102417, -0.7302060127258301, -0.8390008807182312, -0.9042571187019348, -1.6276228427886963, -0.5894379615783691, -0.46856778860092163, -0.6491129994392395, -0.5125652551651001, -0.2724980115890503, -0.30689680576324463, -0.41970714926719666, -0.1430593878030777, -0.39922475814819336, 0.13472452759742737, -0.3783359229564667, -0.057618461549282074, -0.016896555200219154, -0.4073556363582611, -0.6274473071098328, -0.5425912141799927, 0.13909856975078583, 0.12539851665496826, -0.11267583072185516, -0.25544434785842896, 0.2485422044992447, 0.7121180891990662, -0.3919336199760437, -0.7181009650230408, -0.22763942182064056, -0.6732332706451416, 0.37915194034576416, -0.3767874538898468, 0.6579141616821289, -0.1865592747926712, 0.7217347621917725, -0.06282942742109299, 0.4178060293197632, 0.5003261566162109, -0.3291083574295044, -0.7071840167045593, -0.9176375269889832, -0.7618668675422668, -0.5984167456626892, -0.17798370122909546, -5.918032169342041, -1.6591318845748901, -1.4021949768066406, -0.9522659778594971, -0.9617892503738403, -0.5658779144287109, -0.8876404762268066, -1.4604300260543823, -2.021662712097168, -1.3704696893692017, -0.4504642188549042, 0.9031230807304382, -2.0044949054718018, -1.0812060832977295, -0.45180824398994446, 0.2888007164001465, -3.373633623123169, -1.0152852535247803, -0.27049174904823303, 0.2571607232093811, -1.17954421043396, -0.2844941020011902, -1.0495645999908447, 2.2307827472686768, 2.5593717098236084]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0, 0.8)}}, 'et3_eta1': {'discriminator': {'threshold': -0.035000821948051458, 'nodes': [100, 5, 1], 'bias': [0.15730011463165283, 0.07815705239772797, -0.006643477361649275, 0.1405337154865265, -0.15454824268817902, -0.23352541029453278], 'weights': [-2.2592337131500244, -2.111402988433838, 1.0897276401519775, 1.14312744140625, 0.6493831276893616, -0.3516945540904999, -0.24517647922039032, -0.2307973951101303, -2.991236686706543, -3.7764527797698975, 2.889862060546875, 7.753478527069092, 1.6842848062515259, 3.7955284118652344, 9.603760719299316, 8.095412254333496, 3.444871425628662, 7.7395172119140625, 7.613654136657715, 6.645348072052002, 7.937831401824951, 2.643230676651001, 6.488022327423096, 3.073213815689087, 3.4893076419830322, 2.4130094051361084, 4.246172904968262, 2.2602477073669434, 1.967344045639038, 2.2002124786376953, 2.0582127571105957, 3.8808634281158447, 4.826034069061279, 8.88129997253418, 2.8044652938842773, 0.9710285663604736, 2.2622244358062744, 1.680975317955017, 3.2145273685455322, 1.786454200744629, 3.0584285259246826, 2.1071407794952393, 2.1291117668151855, 3.5432729721069336, 1.052205204963684, 0.030557846650481224, -2.2776753902435303, 1.5152586698532104, 1.7110742330551147, 1.7531414031982422, 0.7845969200134277, 0.8433842062950134, 4.040330410003662, -0.9446387887001038, -3.7090647220611572, 1.0371294021606445, 0.9976323246955872, 0.6247972846031189, 1.0383681058883667, 0.8938833475112915, 0.07614778727293015, -1.8009514808654785, 0.8994818329811096, -2.3960764408111572, 1.3220913410186768, 1.2301081418991089, 5.750441551208496, -0.347689151763916, -2.032581090927124, -0.004036625847220421, 0.9990876317024231, 0.10651766508817673, -0.6248242855072021, -0.6703989505767822, 1.238221526145935, 2.0437328815460205, 2.0885448455810547, 1.6882622241973877, 1.6431466341018677, 0.6129466891288757, 5.512369632720947, 6.847434043884277, 4.415524005889893, 4.060720443725586, 2.1885111331939697, 0.9768252372741699, 3.6383414268493652, 3.9159090518951416, 2.347606658935547, 1.1752392053604126, 0.09728527814149857, 0.03384150564670563, 4.355111122131348, 3.7721214294433594, 1.4732459783554077, 0.4030681848526001, 4.801760196685791, 2.2721035480499268, 2.0172536373138428, -0.409799188375473, -1.0578287839889526, -1.8762972354888916, 1.079729437828064, 1.1918156147003174, 0.6503933072090149, -0.19451335072517395, 0.18041542172431946, -0.2852369546890259, -3.0265536308288574, -3.862375497817993, 2.8850512504577637, 1.560224175453186, 1.7875977754592896, 3.647792339324951, 9.470881462097168, 8.199115753173828, 3.448289394378662, 7.844549179077148, 7.59998083114624, 6.665423393249512, 7.847585201263428, 2.698899745941162, 6.49744176864624, 3.2684009075164795, 3.482053518295288, 2.5860989093780518, 4.403741359710693, 2.1741089820861816, 2.1662118434906006, 2.245495557785034, 2.0364773273468018, 3.708613872528076, 5.011116027832031, 8.842255592346191, 2.6692419052124023, 0.9078444242477417, 2.1339166164398193, 1.6668797731399536, 6.28959321975708, 1.615511178970337, 2.183648109436035, 2.009016990661621, 3.1257035732269287, 6.710860729217529, 1.0459524393081665, 0.13967451453208923, -2.264399290084839, 1.5051060914993286, 1.6856147050857544, 1.744413137435913, -0.32601088285446167, 0.7349650859832764, 4.0952982902526855, -0.9256616830825806, 0.39020541310310364, 1.0775421857833862, 0.9500966668128967, 0.6222617030143738, 0.9999426603317261, 0.9623971581459045, -0.12071329355239868, -1.868445873260498, 0.568004310131073, -2.445319890975952, 1.2082405090332031, 1.3135732412338257, 5.609175205230713, -0.038440752774477005, -1.6587306261062622, -0.16029344499111176, 1.0652010440826416, 0.06854327023029327, -0.6420084238052368, -0.6593389511108398, 1.3284329175949097, 2.0131008625030518, 1.9690968990325928, 1.794880986213684, 1.609578251838684, 0.7076612710952759, 5.371720314025879, 6.823807716369629, 4.39454460144043, 3.982004165649414, 2.176537275314331, 1.0426629781723022, 3.6658716201782227, 3.863720655441284, 2.4182329177856445, 1.3307749032974243, 0.19643723964691162, -0.6463615894317627, 4.203552722930908, 3.610746383666992, 1.5748257637023926, 0.3813633322715759, 4.716528415679932, 2.3044610023498535, 1.9815802574157715, -0.4256702661514282, 0.948711097240448, 1.4046434164047241, -1.1294604539871216, -1.6056320667266846, -0.5236995816230774, 0.16869063675403595, -0.1355123668909073, -0.7893909811973572, 2.8440308570861816, 3.742664098739624, -2.7891299724578857, -1.5766050815582275, -1.9559719562530518, -3.642308235168457, -9.54025650024414, -8.080312728881836, -3.419504165649414, -7.699987411499023, -7.557397365570068, -6.559866905212402, -7.960373878479004, -2.503316879272461, -6.43572473526001, -3.2168118953704834, -3.5800607204437256, -2.5390164852142334, -4.433113098144531, -2.179738998413086, -2.1718313694000244, -2.30818247795105, -2.2183165550231934, -3.8191580772399902, -4.827245235443115, -8.837349891662598, -2.619448661804199, -0.939981997013092, -2.150607109069824, -1.808663249015808, -6.18973970413208, -1.819018006324768, -2.2086610794067383, -2.0497169494628906, -3.1091132164001465, -6.667771816253662, -1.0853623151779175, 0.044015172868967056, 2.189815044403076, -1.5199230909347534, -1.5938282012939453, -1.5399328470230103, 0.180278941988945, -0.7517843246459961, -3.931715488433838, 0.837063193321228, -0.3596337139606476, -1.0161563158035278, -0.9874147772789001, -0.6168691515922546, -1.1806604862213135, -0.9918128252029419, 0.06760714203119278, 1.7423646450042725, -0.7214913368225098, 2.388862371444702, -1.3336081504821777, -1.1807910203933716, -5.644992828369141, 0.13285598158836365, 1.6455429792404175, -0.012143492698669434, -1.1784769296646118, -0.10255590826272964, 0.6653430461883545, 0.5668428540229797, -1.3355993032455444, -2.030824899673462, -2.114377737045288, -1.8687688112258911, -1.6404701471328735, 0.11417483538389206, -5.477608680725098, -6.7639570236206055, -4.232583045959473, -4.16078519821167, -2.2094781398773193, -1.0866056680679321, -3.524570941925049, -3.929792642593384, -2.4525907039642334, -1.1559392213821411, -0.06478343158960342, 0.5546999573707581, -4.3912739753723145, -3.628386974334717, -1.5357224941253662, -0.4579792022705078, -4.605578422546387, -2.296983242034912, -1.9679656028747559, 0.28695544600486755, -2.3765549659729004, -1.826352834701538, 1.2187130451202393, 1.3092496395111084, 0.5915548205375671, -0.3426985442638397, -0.2751856744289398, -0.314382404088974, -2.811002016067505, -3.895705461502075, 2.9136977195739746, 7.730470180511475, 1.8735255002975464, 3.8248209953308105, 9.666841506958008, 8.284022331237793, 3.4880027770996094, 7.699344158172607, 7.492215156555176, 6.57686185836792, 7.852872848510742, 2.585815191268921, 6.493010997772217, 3.0883805751800537, 3.6977086067199707, 2.517072916030884, 4.410699844360352, 2.3049583435058594, 2.1643483638763428, 2.3864967823028564, 2.1740663051605225, 3.7206766605377197, 4.969498157501221, 8.886266708374023, 2.8033461570739746, 0.8167921900749207, 2.2691328525543213, 1.656901478767395, 3.2165815830230713, 1.7338237762451172, 2.9080471992492676, 2.1400740146636963, 2.060528039932251, 3.3422608375549316, 1.1214913129806519, 0.03210899978876114, -2.050215482711792, 1.3877946138381958, 1.665394902229309, 1.619297742843628, 0.8203185200691223, 0.9526190161705017, 3.569678783416748, -0.9109848141670227, -3.824537754058838, 1.0541692972183228, 0.895470917224884, 0.6667991280555725, 1.1071701049804688, 0.7507856488227844, 0.06456183642148972, -1.856168270111084, 0.5235879421234131, -2.2571492195129395, 1.2647886276245117, 1.1707028150558472, 5.652133941650391, -0.39103126525878906, -2.123114824295044, -0.01829957216978073, 1.14298677444458, 0.10547726601362228, -0.5980741381645203, -0.5880293250083923, 1.276043176651001, 1.8998985290527344, 2.1654112339019775, 1.7136738300323486, 1.611719012260437, 0.013624376617372036, 5.396884441375732, 6.844674110412598, 4.3231282234191895, 3.993725299835205, 1.9795293807983398, 1.0088306665420532, 4.624177932739258, 3.8446385860443115, 2.42866849899292, 1.2011736631393433, 0.12086088210344315, -0.683218240737915, 4.318774223327637, 3.723301410675049, 1.4488369226455688, 0.32057785987854004, 5.1095194816589355, 2.4652087688446045, 1.8802709579467773, -0.37574025988578796, -21.59067153930664, -63.43375015258789, -0.2735781669616699, 0.2153743952512741, -0.8092572689056396, -0.47440817952156067, -20.279008865356445, -0.24874059855937958, -0.36921605467796326, -0.5934879779815674, 47.644649505615234, 53.703582763671875, 11.008259773254395, 3.457265853881836, 0.8416662812232971, 2.116163730621338, 0.8367151021957397, 0.6726363897323608, -0.997137188911438, 1.2167855501174927, 1.4902551174163818, 0.38358455896377563, 1.4080822467803955, 0.6277941465377808, 0.9135026335716248, 0.6050988435745239, 0.40357279777526855, 0.6170344948768616, 0.2969239354133606, 0.5191042423248291, 0.6139196753501892, 0.7409111261367798, 0.9573351144790649, 1.8468486070632935, -248.90916442871094, -54.436676025390625, 0.43212229013442993, 0.09688788652420044, 0.38933852314949036, 0.16416221857070923, 0.6027839183807373, 0.2772578299045563, 0.3182348906993866, 0.21298809349536896, 0.2695401906967163, 0.1460779309272766, -0.7934804558753967, 0.28100353479385376, 0.13278765976428986, 0.31015878915786743, -0.035232365131378174, 0.0193338505923748, 66.85016632080078, 0.10123156756162643, 0.07632054388523102, 0.19312737882137299, 0.13152167201042175, -0.0026324214413762093, 0.24675513803958893, 0.1866142451763153, 0.00965319573879242, -0.40578967332839966, 0.019524067640304565, -0.5681098699569702, 0.17334890365600586, 0.18794532120227814, 0.256261944770813, -0.17903569340705872, -1.0559300184249878, -0.07804456353187561, 0.12097977101802826, -84.89774322509766, 0.009624776430428028, 0.11099477112293243, 0.14837472140789032, 0.40018707513809204, 0.2729507386684418, 0.39055711030960083, 0.2435155212879181, 0.007527800276875496, 1.1460940837860107, 1.4636454582214355, 0.7786661982536316, 0.8342838883399963, 0.44177284836769104, 0.23402126133441925, 28.704330444335938, 0.6955901980400085, 0.26131296157836914, 0.14333754777908325, -0.12008234858512878, -0.3277459740638733, 0.941196620464325, 0.7440329790115356, 0.245652437210083, 0.029291512444615364, 0.7237016558647156, 0.5614503622055054, 0.4866182804107666, -0.20025552809238434, -1.9216974973678589, -2.128844738006592, 0.4173222780227661, -1.8761860132217407, -0.4172418415546417]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (40, 50), 'etaBin': (0.8, 1.37)}}, 'et0_eta3': {'discriminator': {'threshold': -0.055000817775726324, 'nodes': [100, 9, 1], 'bias': [-0.1407214254140854, 0.06674350053071976, -0.18006108701229095, 0.05616862326860428, -0.18473659455776215, 0.16730372607707977, -0.09875761717557907, -0.018065694719552994, 0.14515070617198944, -0.12949378788471222], 'weights': [-0.8132635354995728, -0.7208519577980042, 0.11873473972082138, 0.33942773938179016, 1.0432066917419434, 0.36767181754112244, 0.27934151887893677, 0.0815957710146904, -1.380362629890442, -1.6840870380401611, -1.7429289817810059, -0.28187838196754456, 1.5563263893127441, 0.4624183475971222, 5.093498229980469, 4.076866626739502, 1.8049594163894653, 5.036686897277832, 0.5959597826004028, 5.1945366859436035, 1.6616880893707275, -1.4257605075836182, 3.233429431915283, 3.1460630893707275, 2.002929925918579, 2.0998306274414062, 1.980833888053894, 2.803379774093628, 0.3217647075653076, 0.7369864583015442, 0.722167432308197, 1.7329550981521606, 1.6127166748046875, 1.7412950992584229, -0.2182760089635849, 1.858873963356018, 0.45404917001724243, -0.461873859167099, 0.30324089527130127, 1.5901087522506714, 0.8437208533287048, -1.1453101634979248, 1.052100419998169, 1.3319687843322754, 1.0879489183425903, 0.9551039338111877, 1.2579126358032227, 0.12899626791477203, 0.1943940967321396, 0.9106179475784302, -0.08881685882806778, 1.0421924591064453, -0.10981596261262894, -0.4122312366962433, -0.10562685132026672, 0.026212286204099655, 1.1173734664916992, 0.8650310039520264, -0.08201833814382553, 0.07405491918325424, -0.27372512221336365, 2.4792611598968506, -0.7124928832054138, 0.0992538183927536, 0.24293576180934906, 0.6265254616737366, -1.1141934394836426, -0.9671548008918762, -0.26049870252609253, 0.9531799554824829, -2.1120102405548096, -1.0566222667694092, -0.29698124527931213, -0.22588281333446503, 0.5247219800949097, 1.7258588075637817, 2.1028051376342773, 1.4754496812820435, 0.4460217356681824, 0.9740409851074219, 5.81657075881958, 5.043082237243652, 2.6552717685699463, 1.1897108554840088, 1.492576003074646, 1.3613582849502563, 0.21798363327980042, 1.1362003087997437, 0.5873610377311707, 1.1977033615112305, 0.2068304717540741, 0.007278257980942726, 2.1149260997772217, 0.9510822296142578, 0.11564116925001144, 0.3190535008907318, 0.30512645840644836, 0.40963464975357056, 0.20987500250339508, -0.10704275220632553, 0.7592369318008423, 0.7010093927383423, -0.07309114933013916, -0.321598619222641, -1.2008109092712402, -0.20066553354263306, -0.3915606141090393, -0.09344636648893356, 1.399393916130066, 1.789229154586792, 1.7646849155426025, 0.46421006321907043, -1.5790103673934937, -0.39892324805259705, -5.003358364105225, -3.9036083221435547, -1.822140097618103, -4.984104633331299, -0.934328556060791, -5.151466369628906, -1.584260106086731, 1.5737708806991577, -3.1216108798980713, -3.0638585090637207, -1.789509892463684, -1.9562020301818848, -1.874325156211853, -2.966566324234009, -0.4420681893825531, -0.929384171962738, -0.7703667879104614, -1.8981620073318481, -1.5977709293365479, -1.752970576286316, 0.12634186446666718, -1.7356882095336914, -0.2895793318748474, 0.2668388783931732, -0.43842393159866333, -1.6531239748001099, -0.7248035073280334, 1.0227733850479126, -0.9419450759887695, -1.1990209817886353, 0.7308794856071472, -0.9434993863105774, -1.1982247829437256, 0.05041747912764549, -0.12107542902231216, -0.8440163731575012, 0.09307906776666641, -1.1794803142547607, 0.0777030885219574, 0.2817169725894928, 0.060458697378635406, -0.016693897545337677, -1.1133806705474854, -1.0501405000686646, 0.17486368119716644, 0.1022058054804802, 0.14273224771022797, -2.4254705905914307, 0.6866123080253601, 0.05049509555101395, -0.19168545305728912, 1.3615690469741821, 1.1406676769256592, 0.9363752007484436, 0.4406859278678894, -0.8153678774833679, 1.9708521366119385, 1.1368048191070557, 0.3213760554790497, 0.25849276781082153, -0.5581075549125671, -1.7605060338974, -2.0657196044921875, -1.4582678079605103, -0.5693160891532898, -0.8994877934455872, -5.7229461669921875, -4.89405632019043, -2.6821625232696533, -1.3737807273864746, -1.4649416208267212, -1.4477856159210205, -0.14602454006671906, -1.113690733909607, -0.6070882678031921, -1.0237780809402466, -0.2823850214481354, 0.08853570371866226, -2.1337239742279053, -1.0616344213485718, -0.13125473260879517, -0.2957075536251068, -0.2960958778858185, -0.37493205070495605, -0.20818856358528137, 0.04974399134516716, -0.6139215230941772, -0.675837516784668, 0.01800144463777542, 0.16583053767681122, 1.2029106616973877, 0.3534911572933197, 0.3536852300167084, 0.11401058733463287, -1.3429614305496216, -1.7399932146072388, -1.7351245880126953, -0.2631223797798157, 1.6811394691467285, 0.3199397027492523, 4.912400245666504, 4.087119102478027, 1.8122690916061401, 4.585328578948975, 0.5006241798400879, 5.293233871459961, 1.540311574935913, -1.5636931657791138, 2.9893717765808105, 3.1181747913360596, 1.9691492319107056, 1.8847261667251587, 1.9459575414657593, 2.723675012588501, 0.2768232524394989, 0.709211528301239, 0.7326670289039612, 1.730704426765442, 1.6340304613113403, 1.9072352647781372, -0.14522923529148102, 1.7837166786193848, 0.3496350049972534, -0.3285650312900543, 0.2599640488624573, 1.522546410560608, -0.4116015136241913, -1.0928959846496582, 1.0027908086776733, 1.1905454397201538, 0.9984291791915894, 0.9808773994445801, 1.19428551197052, 0.04732788726687431, 1.0897341966629028, 1.0191333293914795, -0.07227389514446259, 1.151305913925171, 0.03757204860448837, -0.35156339406967163, -0.02380802109837532, 0.14536979794502258, 1.219740629196167, 0.9114254117012024, -0.00130744487978518, -0.03901457041501999, -0.25455406308174133, 2.571018934249878, -0.8134226202964783, 0.14029164612293243, 0.24446211755275726, 0.6065241098403931, -1.1495189666748047, -1.0705891847610474, -0.4038388133049011, 0.8757845163345337, -2.127149820327759, -1.122079610824585, -0.32063862681388855, -0.18409450352191925, 0.5740222930908203, 1.6113555431365967, 1.9088267087936401, 1.6182595491409302, 0.5058969259262085, 0.9988620281219482, 5.763286590576172, 5.048830986022949, 2.5395450592041016, 1.2832765579223633, 1.3747955560684204, 1.3269175291061401, 0.17452827095985413, 1.1202446222305298, 0.5959217548370361, 0.9587409496307373, 0.09219545871019363, 0.03949817642569542, 1.9787968397140503, 0.991693377494812, 0.1883508414030075, 0.16261804103851318, 0.3252050578594208, 0.19150783121585846, 0.25308945775032043, 0.026354173198342323, 0.6227089166641235, 0.7692942023277283, -0.08964084833860397, -0.4267958104610443, -1.0906569957733154, -0.3703511655330658, -0.4365720748901367, -0.06057586148381233, 1.538360834121704, 1.7810781002044678, 1.7440450191497803, 0.4286406338214874, -1.7042056322097778, -0.3263782560825348, -5.154655933380127, -4.059049606323242, -2.0356369018554688, -5.170736312866211, -0.835893988609314, -5.329240798950195, -1.6158276796340942, 1.4615364074707031, -3.17944598197937, -3.052053689956665, -1.8381186723709106, -1.8850442171096802, -2.0912375450134277, -2.9795339107513428, -0.3490269184112549, -1.4141292572021484, -0.8147439956665039, -1.6981388330459595, -1.6216113567352295, -1.8562984466552734, 0.22728736698627472, -1.8928875923156738, -0.31895917654037476, 0.31665071845054626, 3.4235925674438477, -1.557573914527893, -0.8990640044212341, 1.1268880367279053, -1.1254336833953857, 0.4046348035335541, 0.6647327542304993, -1.0347871780395508, -1.1936805248260498, 0.01357869990170002, -0.13351063430309296, -0.9845501780509949, 0.1219787523150444, -1.229602575302124, 0.06844998896121979, 0.24674876034259796, 0.016024844720959663, -0.06808590888977051, -1.0710718631744385, -1.0635803937911987, 0.11627098172903061, 0.2314356565475464, 0.2823445498943329, -2.534559965133667, 0.7723482251167297, -0.07724808156490326, -0.1604723483324051, 1.304740071296692, 1.0992412567138672, 0.9320917725563049, 0.4397430121898651, -0.9811238646507263, 2.0688986778259277, 0.9843761324882507, 0.25361254811286926, 0.17018835246562958, -0.6069934368133545, -1.6504689455032349, -2.005711793899536, -1.4964929819107056, -0.48185303807258606, -1.0954331159591675, -5.6581926345825195, -5.042731285095215, -2.6847081184387207, -1.3244023323059082, -1.1975760459899902, -1.4887137413024902, 5.016898155212402, -1.3004270792007446, -0.6558590531349182, -1.0847349166870117, -0.3006038963794708, -0.06806442141532898, -2.0518479347229004, -0.9880046844482422, -0.1700318306684494, -0.4345398545265198, -0.5227755904197693, -0.21367666125297546, -0.1561916023492813, 0.06564300507307053, -0.6659454107284546, -0.622691810131073, -0.051412079483270645, 0.34174641966819763, 1.2015018463134766, 0.38680869340896606, 0.2616593539714813, 0.07423434406518936, -1.4861937761306763, -1.7715117931365967, -1.8740382194519043, -0.3130093812942505, 1.6568242311477661, 0.4021936357021332, 4.996301651000977, 4.259697437286377, 1.8955779075622559, 5.142794132232666, 0.9814954400062561, 5.332903861999512, 1.614749550819397, 2.6933858394622803, 3.115966320037842, 3.0592973232269287, 1.8946386575698853, 2.085125207901001, 1.9024978876113892, 2.8605880737304688, 0.4251677393913269, 1.232535481452942, 0.8212841749191284, 1.7352460622787476, 1.6488492488861084, 1.918835997581482, -0.029908062890172005, 1.8048712015151978, 0.4021608233451843, -0.29827722907066345, 0.4903169870376587, 1.4395898580551147, -0.27691856026649475, -1.0816011428833008, 1.1188898086547852, 1.1751198768615723, 1.0842138528823853, 1.114804744720459, 1.354832649230957, -0.03124201111495495, 1.0991301536560059, 1.063336968421936, -0.13179071247577667, 1.0225187540054321, 0.0463390126824379, -0.32412439584732056, -0.1525048166513443, 0.09484929591417313, 1.1942088603973389, 0.9197342991828918, 0.02821928635239601, 0.005864947102963924, -0.2811189293861389, 2.440190076828003, -0.7855979800224304, 0.12086456269025803, 0.13282744586467743, 0.49346262216567993, -1.1400457620620728, -0.880723774433136, -0.4784016013145447, 0.8666333556175232, -1.891428828239441, -1.1882468461990356, -0.32701680064201355, -0.2394263744354248, 2.557929277420044, 1.699292540550232, 2.016538143157959, 1.4745913743972778, 0.5076565742492676, 0.8669944405555725, 5.636932373046875, 5.054530143737793, 2.527874708175659, -0.07977724820375443, 1.3436614274978638, 1.3673244714736938, 0.2537522614002228, 1.3125509023666382, 0.6408349275588989, 1.0952733755111694, 0.06655373424291611, 0.046229083091020584, 1.980616807937622, 0.9861326813697815, 0.18340858817100525, 0.03663339093327522, 0.4393174648284912, 0.20378132164478302, 0.11638950556516647, 0.07391009479761124, 0.7904120683670044, 0.7548847198486328, 0.10546236485242844, -0.22652727365493774, -1.203131914138794, -0.2964054048061371, -0.4464738965034485, -0.09530619531869888, 1.3557573556900024, 1.6277737617492676, 1.6624302864074707, 0.44902920722961426, -1.7018150091171265, -0.35193052887916565, -5.1142120361328125, -3.9311115741729736, -1.9852997064590454, -4.830398082733154, -0.565402626991272, -5.132021903991699, -1.760054349899292, 1.3865091800689697, -3.0243148803710938, -3.162200450897217, -1.817534327507019, -2.113487720489502, -2.0752768516540527, -2.7552340030670166, -0.4173230826854706, -0.7053608298301697, -0.8918169736862183, -1.6928094625473022, -1.5515276193618774, -1.943318247795105, 0.12203282862901688, -1.7010403871536255, -0.32823503017425537, 0.4477287828922272, -0.41569429636001587, -1.487956166267395, 0.41814324259757996, 1.1215918064117432, -1.0393763780593872, -1.2042914628982544, -1.0021240711212158, -0.9621548652648926, -1.305995225906372, 0.03306679055094719, -0.13276417553424835, -0.941654622554779, 0.0567602813243866, -1.0809261798858643, 0.11984408646821976, 0.33333510160446167, 0.04753946512937546, -0.09345943480730057, -1.2096068859100342, -1.016615390777588, 0.021261446177959442, -0.08944723010063171, 0.15282049775123596, -2.4530937671661377, 0.7224584221839905, 0.09759773313999176, -0.1622200757265091, -0.4635638892650604, 1.212966799736023, 0.9171085953712463, 0.40835946798324585, -0.9684682488441467, 2.007861852645874, 1.1340219974517822, 0.2570323050022125, 0.2853410243988037, -0.5762231349945068, -1.67903470993042, -2.045976400375366, -1.4782031774520874, -0.49357855319976807, -0.84811931848526, -5.8028717041015625, -5.0524396896362305, -2.577767848968506, -1.1650478839874268, -1.3962191343307495, -1.341011643409729, -0.2615102231502533, -1.1311367750167847, -0.7195371389389038, -1.025370478630066, -0.23194703459739685, -0.003792643081396818, -2.1930365562438965, -0.9652890563011169, -0.1718796193599701, -0.31551459431648254, -0.41296103596687317, -0.3687058091163635, -0.2573288083076477, -0.10950438678264618, -0.7553176879882812, -0.5950412750244141, 0.061784058809280396, 0.38738369941711426, 1.0232112407684326, 0.2314578890800476, 0.27080437541007996, 0.12366103380918503, -1.4114328622817993, -1.5494160652160645, -1.7205865383148193, -0.3128710091114044, 1.6419261693954468, 0.4649029076099396, 4.947268486022949, 3.9843125343322754, 1.8459254503250122, 4.989476203918457, 0.538245439529419, 5.318441867828369, 1.6196821928024292, -1.613242506980896, 3.2171969413757324, 3.0326616764068604, 1.862798810005188, 2.0538835525512695, 1.9819453954696655, 2.9155337810516357, 0.49679017066955566, 0.8369187712669373, 0.7425017952919006, 1.7178410291671753, 1.5938711166381836, 1.9528785943984985, -0.001915204105898738, 1.8124868869781494, 0.2811996340751648, -0.5021361708641052, 0.3064672350883484, 1.6342695951461792, 0.9581728577613831, -1.1121954917907715, 1.072817087173462, 1.256352424621582, 0.8042021989822388, 1.0776768922805786, 1.1127344369888306, -0.05006515979766846, 0.26220694184303284, 0.9411124587059021, 0.07581096887588501, 1.0650126934051514, -0.01854572258889675, -0.2562927305698395, -0.2045576572418213, -0.015395746566355228, 1.2349133491516113, 1.0152405500411987, -0.019656650722026825, -0.16491565108299255, -0.2716693580150604, 2.5543885231018066, -0.6906757950782776, 0.07496882975101471, 0.2814233899116516, 0.6166151165962219, -1.1773701906204224, -0.8534405827522278, -0.31821948289871216, 0.8856787085533142, -1.9354966878890991, -1.0199341773986816, -0.33891865611076355, -0.3040750026702881, 0.49333348870277405, 1.7195175886154175, 1.9153486490249634, 1.5315181016921997, 0.5302369594573975, 0.8619439601898193, 5.654287815093994, 5.022297382354736, 2.558448314666748, 1.365851879119873, 1.3796416521072388, 1.41362726688385, 0.34433579444885254, 1.1483513116836548, 0.5417488813400269, 1.1383308172225952, 0.25591689348220825, -0.04382206127047539, 2.1382229328155518, 1.0295239686965942, 0.047772251069545746, 0.38837939500808716, 0.38120678067207336, 0.27101653814315796, 0.19322992861270905, -0.08113179355859756, -1.2226717472076416, -2.2615997791290283, 0.11468613892793655, -0.041502244770526886, -0.058404117822647095, -0.0006618080078624189, 0.06844418495893478, -0.04163588583469391, -2.885434865951538, -2.2815637588500977, -5.823894500732422, 6.315771102905273, 13.926741600036621, 0.3584934175014496, 7.180079936981201, 2.036898612976074, 1.0683224201202393, 1.9928253889083862, 0.4074763059616089, 2.3068251609802246, 0.008570806123316288, -3.5014407634735107, 0.1181761771440506, 0.10338350385427475, -0.08359355479478836, 0.0745428279042244, 0.07168718427419662, 0.19474110007286072, -0.18653930723667145, -0.008703239262104034, -0.16436587274074554, 0.008475163951516151, 0.05818643793463707, 0.1148080825805664, -0.0146404430270195, 0.14130903780460358, -0.07004042714834213, -0.07259126007556915, -0.07193485647439957, 0.1561882048845291, -0.1037708967924118, -0.08505424857139587, -0.11788424104452133, -0.02076549455523491, -0.05390157550573349, 0.01568114385008812, 0.007832315750420094, -0.1522279530763626, -0.03455847501754761, -0.11080139875411987, -0.049526382237672806, 0.10247504711151123, -0.1257350593805313, 0.03314872458577156, -0.17825110256671906, -0.033581092953681946, 0.051709990948438644, -0.0015021897852420807, -0.13709756731987, -0.04016176983714104, -0.1597995162010193, 0.19407711923122406, -0.29533061385154724, -0.02836567349731922, -0.09202534705400467, 0.05194428190588951, -0.17909935116767883, -0.0787263959646225, -0.08789540827274323, -0.09972371906042099, -0.3702903389930725, -0.22444038093090057, -0.393245130777359, -0.24160142242908478, 0.4288545548915863, 0.9095355868339539, -1.3994536399841309, 0.1041254997253418, -0.14515364170074463, -0.13872568309307098, 0.32822009921073914, 0.40128985047340393, 0.23110079765319824, 0.013566783629357815, 0.09797225892543793, 0.14670036733150482, -0.1992563158273697, 0.023033827543258667, -0.07138340920209885, -0.11761593073606491, -0.12291847169399261, 0.24084576964378357, 0.05392049252986908, -0.9788991212844849, -0.05892879143357277, 0.0387190505862236, -0.128006711602211, -0.13337089121341705, -0.020160453394055367, 0.17158415913581848, 0.7907049059867859, 0.6440308094024658, -0.12235572189092636, -0.144143745303154, -1.0617835521697998, -0.3811827301979065, -0.38613244891166687, -0.06276097148656845, 1.4026087522506714, 1.6855754852294922, 1.683066964149475, 0.2817555367946625, -1.695611596107483, -0.48389801383018494, -5.1422624588012695, -3.9930789470672607, -1.9463180303573608, -4.6762003898620605, -0.6216059923171997, -5.318002700805664, -1.5334546566009521, 1.5967717170715332, -3.089381694793701, -3.2239346504211426, -1.8783546686172485, -1.9791476726531982, -1.989551067352295, -2.758859634399414, -0.3009742796421051, -0.8281821608543396, -0.880773663520813, -1.8349069356918335, -1.526471734046936, -1.9013646841049194, 0.06110519543290138, -1.793364405632019, -0.3698478937149048, 0.47032514214515686, -0.4766908288002014, -1.481472134590149, 0.36378514766693115, 1.0824525356292725, -0.9414381980895996, -1.1176804304122925, -0.9144996404647827, -0.8910530209541321, -1.2857142686843872, -0.09906584769487381, -1.0923926830291748, -0.9732527136802673, -0.002614302560687065, -1.148712396621704, 0.03982345014810562, 0.46762239933013916, 0.17897582054138184, 0.023795591667294502, -1.1997110843658447, -1.058182954788208, 0.1343129724264145, 0.038008205592632294, 0.24716021120548248, -2.3277885913848877, 0.7066056132316589, -0.04173530265688896, -0.2536925673484802, -0.5391313433647156, 0.9800989031791687, 1.0427545309066772, 0.35465317964553833, -1.0036044120788574, 2.1387813091278076, 1.16023588180542, 0.44071075320243835, 0.10145777463912964, -0.48560264706611633, -1.6656851768493652, -2.005952835083008, -1.6018835306167603, -0.35362327098846436, -0.8403108716011047, -5.6993818283081055, -4.973056793212891, -2.6367321014404297, 0.19910159707069397, -1.4412904977798462, -1.5272680521011353, -0.12015276402235031, -1.165101408958435, -0.6846979856491089, -1.0296903848648071, -0.13966700434684753, 0.12266261875629425, -2.064850091934204, -0.8876504302024841, -0.18596825003623962, 0.0004316970007494092, -0.4121033251285553, -0.3569337725639343, -0.11948295682668686, 0.0958978682756424, -0.24796636402606964, 0.3102058470249176, -0.31246238946914673, 0.7109705209732056, -1.364931344985962, 0.4993029832839966, -0.27371105551719666, -0.2719373106956482, 0.9909254312515259]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (1.54, 2.5)}}, 'et3_eta3': {'discriminator': {'threshold': 0.069999167323112482, 'nodes': [100, 10, 1], 'bias': [-0.11204543709754944, -0.0005571477231569588, -0.015970643609762192, -0.09284664690494537, -0.04320921003818512, -0.42669299244880676, 0.03731859102845192, 0.08955458551645279, 0.006626900285482407, -0.11064879596233368, -0.17044442892074585], 'weights': [-0.3349671959877014, -2.1922991275787354, 0.6381950974464417, 1.8786818981170654, -0.09619683027267456, 0.9831786155700684, -0.10270281136035919, -0.36504659056663513, -1.1769630908966064, -1.2381079196929932, -0.36275455355644226, 0.7514060735702515, 0.5506219863891602, -0.09184645116329193, 2.3116815090179443, 1.989417552947998, 1.057970643043518, 3.2463321685791016, 2.4086410999298096, 0.3519798815250397, 1.2988545894622803, 0.8126804232597351, 1.498828411102295, 2.0563762187957764, 2.1049644947052, 3.1309635639190674, 2.0919837951660156, 0.7062703371047974, 0.08555298298597336, 1.629734992980957, -0.3702670633792877, 1.9434852600097656, 0.21980874240398407, 1.7597917318344116, 1.0452804565429688, 0.9453401565551758, 1.2282007932662964, 1.4760781526565552, 0.8298380970954895, 1.5435173511505127, -0.1920449435710907, 1.6701442003250122, 1.0551064014434814, -0.09667908400297165, 0.7571905851364136, 0.8571940660476685, 0.9294390678405762, 0.03769263997673988, -0.8469163775444031, 1.508821964263916, 0.47700855135917664, -0.25957950949668884, 0.47566965222358704, 0.49819257855415344, 1.2151286602020264, 0.490138441324234, -0.12011615931987762, 1.0474594831466675, 0.09285878390073776, 0.7700443267822266, -1.4918872117996216, 0.6713210940361023, 1.1657558679580688, -0.6743438839912415, -0.0705714076757431, 0.9142141938209534, 0.26151204109191895, -0.18699178099632263, -1.1757621765136719, -1.0924283266067505, 0.1508558839559555, 1.410093069076538, -0.5074962973594666, -0.18407458066940308, 0.7891706228256226, 1.6649242639541626, 1.7187005281448364, 1.5447419881820679, 1.1684495210647583, 0.7184458374977112, 0.845126748085022, 2.77567720413208, 4.662013530731201, 1.4182112216949463, 1.439104437828064, 1.5463923215866089, 0.3641999661922455, 0.902549147605896, 0.052764780819416046, 0.8090866208076477, 0.3928539454936981, -0.27104443311691284, 2.8212780952453613, 1.0455013513565063, 0.30424994230270386, 0.5833691954612732, -0.2732866704463959, 0.09257468581199646, -0.23206567764282227, -0.18406745791435242, 0.9383934736251831, 1.5834602117538452, -0.5277302861213684, -1.879165768623352, 0.14342409372329712, -1.0293627977371216, -0.12693572044372559, 0.4241839647293091, 1.1655879020690918, 1.1686946153640747, 0.5826362371444702, -0.6428468227386475, -0.5362977385520935, 0.09630941599607468, -2.2365779876708984, -2.0999398231506348, -1.0480588674545288, -3.2166411876678467, -2.4551191329956055, -0.20400846004486084, -1.4480869770050049, -0.8371495604515076, -1.06124746799469, -2.1287355422973633, -1.9415154457092285, -3.3048739433288574, -2.0947980880737305, -0.7278380393981934, 0.06465206295251846, -1.656935453414917, 0.2720947265625, -1.935396432876587, -0.17796848714351654, -1.7872473001480103, -1.163591742515564, -1.1122797727584839, -1.0570887327194214, -1.579468846321106, -0.6930827498435974, -1.710487723350525, 0.32126957178115845, -1.7568295001983643, -1.0130951404571533, -0.12102624028921127, -0.5092678666114807, -0.75847327709198, -0.6236388087272644, 0.15296846628189087, 0.7252858877182007, -1.6209874153137207, -0.3830263018608093, 0.5887121558189392, -0.5939456224441528, -0.5343878269195557, -1.0809246301651, -0.46315184235572815, 0.15594540536403656, -1.148966670036316, -0.10574719309806824, -0.6333145499229431, 1.6077347993850708, -0.7640979290008545, -0.7465420365333557, 0.5874470472335815, 0.19488239288330078, -0.8877139687538147, -0.013103763572871685, 0.23783902823925018, 1.0805784463882446, 1.4592550992965698, -0.16654767096042633, -0.6239666938781738, 0.511305034160614, 0.1920689344406128, -0.8151097297668457, -1.4758692979812622, -1.5936031341552734, -1.6363632678985596, -0.6946160197257996, -0.7333278059959412, -1.1497833728790283, -2.795340061187744, -4.684925079345703, -1.5059123039245605, -1.4766325950622559, -1.4417542219161987, -0.1884889304637909, -0.8865324854850769, -0.3097880780696869, -0.8902643322944641, -0.21785514056682587, 0.21168121695518494, -2.6762378215789795, -1.0289398431777954, -0.2538539469242096, -0.6335757374763489, 0.5555450916290283, -0.06977073848247528, 0.21438732743263245, 0.23139555752277374, 0.9777159690856934, 1.612128496170044, -0.5588719248771667, -0.8065817952156067, 0.4220631420612335, -1.0356889963150024, -0.03361280634999275, 0.4455021023750305, 0.9932084679603577, 1.2335463762283325, 0.6208199858665466, -0.564558744430542, -0.4566357731819153, 0.058975569903850555, -2.2251389026641846, -2.0190224647521973, -1.1098880767822266, -3.184762716293335, -2.6348910331726074, -0.384797066450119, -1.3955844640731812, -0.9479634165763855, -0.9920554161071777, -1.999262809753418, -3.5285394191741943, -3.27225399017334, -2.1000726222991943, -0.6026673316955566, 0.028924034908413887, -1.5391629934310913, 0.2134353071451187, -1.943014144897461, -0.04259577393531799, -1.8658264875411987, -1.031092882156372, -1.06613290309906, -1.1307796239852905, -1.591119408607483, -0.6144086718559265, -1.7190794944763184, 0.3857021927833557, -1.6511859893798828, -1.012676477432251, -0.09098929911851883, -0.45217078924179077, -0.7354037761688232, -0.50146484375, 0.1594591736793518, 0.7690284848213196, -1.440970540046692, -0.5685290694236755, 0.6981239914894104, -0.5359545350074768, -0.5994396805763245, -1.0814701318740845, -0.5588353276252747, 0.07252316176891327, -1.1659940481185913, -0.06611713767051697, -0.7412510514259338, 1.471016526222229, -0.5456522107124329, -0.850879430770874, 0.574748158454895, 0.09730437397956848, -0.8707695603370667, 0.0315660685300827, 0.30401718616485596, 1.097086787223816, 1.3451193571090698, -0.12018384039402008, -0.7805120944976807, 0.5140247941017151, 0.25006887316703796, -0.9304066300392151, -1.5619750022888184, -1.5237483978271484, -1.6407049894332886, -0.8769919276237488, -0.8572136759757996, -0.9628891348838806, -2.9257588386535645, -4.712568759918213, -1.3472496271133423, -1.4971189498901367, -1.4587372541427612, -0.2655378580093384, -0.7529715895652771, -0.35500410199165344, -0.9140278697013855, -0.18101373314857483, 0.26722192764282227, -2.7438910007476807, -1.1075698137283325, -0.1997983455657959, -0.5613659024238586, 0.504993736743927, -0.2085171639919281, 0.11533959954977036, 0.43482542037963867, 0.9250600337982178, 1.032142996788025, -0.5811259150505066, -0.8066530227661133, 0.29665932059288025, -0.992992103099823, 0.031951356679201126, 0.38190239667892456, 1.092992901802063, 1.1638330221176147, 0.24968662858009338, -3.3411080837249756, -0.6950407028198242, -0.041062142699956894, -2.2832560539245605, -2.1367578506469727, -1.0457638502120972, -3.114353656768799, -2.548537015914917, -2.223914623260498, -1.2886624336242676, -1.0534002780914307, -1.2133017778396606, -2.229454755783081, -3.579439163208008, -3.2545042037963867, -2.124349594116211, -0.5482796430587769, -0.1045973151922226, -1.6006287336349487, 0.2554238438606262, -1.8359912633895874, -0.053628429770469666, -1.8421820402145386, -1.172943353652954, -0.986102819442749, -1.064279556274414, -1.4185982942581177, -0.7591738700866699, -1.8016924858093262, 0.24099306762218475, -1.6632071733474731, -1.1342915296554565, -0.07686378061771393, -0.3154155910015106, -0.914932131767273, -0.6840060949325562, 0.11218519508838654, -0.23195785284042358, -1.4576090574264526, -0.6024360060691833, 1.6593729257583618, -0.4088800549507141, -0.44224175810813904, -3.02765154838562, -0.48232632875442505, 0.24770323932170868, -1.1361078023910522, -0.1834220141172409, -0.655113160610199, 1.4393014907836914, -0.6208243370056152, -0.9065263867378235, 0.7809772491455078, 0.045653194189071655, -0.8194165229797363, 0.1566622406244278, 0.31902164220809937, 1.0721532106399536, 1.3253062963485718, 0.09547056257724762, -0.8403527736663818, 0.3677157163619995, 0.5547420978546143, -0.8370879292488098, -1.5485479831695557, -1.643640160560608, -1.4016422033309937, -0.81944340467453, -0.821969211101532, -0.9941686391830444, -2.9019815921783447, -4.655714511871338, -1.2466386556625366, -1.5649137496948242, -1.5965360403060913, -0.33771687746047974, -0.8944688439369202, -0.21392667293548584, -0.8546475768089294, -0.2764699459075928, 0.12774713337421417, -2.7598276138305664, -0.9695761203765869, -0.13289405405521393, -0.6288184523582458, 0.445507675409317, -0.016699491068720818, 0.06278710812330246, 0.3505435585975647, -0.9003103971481323, -1.2974884510040283, 0.5560373663902283, 1.8097264766693115, -0.009194432757794857, 0.9247484803199768, 0.12704825401306152, -0.3870401680469513, -1.0359165668487549, -1.261805772781372, -0.597606360912323, 0.6559993028640747, 0.7225520610809326, -0.1047891154885292, 2.137369394302368, 1.961359977722168, 1.060703158378601, 3.1251256465911865, 2.420262336730957, 0.39078840613365173, 1.2243841886520386, 0.8601310849189758, 1.0000430345535278, 2.211505651473999, 3.562204122543335, 3.207707405090332, 2.0939199924468994, 0.7570949792861938, 0.2105238288640976, 1.7228022813796997, -0.4355507791042328, 1.7233307361602783, 0.18976189196109772, 1.8840469121932983, 1.1140397787094116, 1.0263358354568481, 1.0435765981674194, 1.5243266820907593, 0.6385778784751892, 1.8323403596878052, -0.47576141357421875, 1.6927173137664795, 0.9161306023597717, 0.11301440745592117, 0.44237184524536133, 0.7942527532577515, 0.47103163599967957, 0.024731812998652458, -0.7808135747909546, 1.4392311573028564, 0.5155419111251831, -0.6379481554031372, 0.4408721923828125, 0.611409604549408, 1.110713243484497, 0.4919058382511139, -0.18207226693630219, 1.1835707426071167, 0.15805809199810028, 0.5833492875099182, -1.512954592704773, 0.6586411595344543, 0.7164667844772339, -0.7128362655639648, -0.20924866199493408, 0.8137912750244141, 0.033716365694999695, -0.26000142097473145, -1.2153412103652954, -1.4988399744033813, 0.03428491950035095, 0.5666656494140625, -0.374586284160614, -0.18932901322841644, 0.9817655086517334, 1.5315333604812622, 1.637812852859497, 1.4184434413909912, 0.6960226893424988, 0.7163098454475403, 0.9820674061775208, 2.9349727630615234, 4.626328945159912, 1.4170825481414795, 1.4613254070281982, 1.6449171304702759, 0.3603718876838684, 0.8508049249649048, 0.3156041204929352, 0.8826151490211487, 0.36411744356155396, -0.3430602252483368, 2.794981002807617, 1.1508969068527222, 0.2290416955947876, 0.5060122609138489, -0.5132824182510376, 0.05987079069018364, -0.13215909898281097, -0.31820088624954224, 608.93505859375, 267.85546875, -6.378628730773926, 0.33263882994651794, -125.64762115478516, -39.93284606933594, -0.04853648319840431, 59.696353912353516, -0.2918473184108734, -0.33305034041404724, 0.3500538766384125, -19.91232681274414, 0.2854350209236145, -13.71103286743164, 1.9322808980941772, 1.3798667192459106, 1.3910174369812012, -23.507102966308594, -21.908449172973633, 0.10858732461929321, -137.61627197265625, -15.962505340576172, -206.61102294921875, -92.18582916259766, 1.5461252927780151, 0.4754636287689209, 0.37441882491111755, -0.005579917225986719, -67.76272583007812, 0.1548139601945877, -7.715848922729492, 0.3745519518852234, -0.018931357190012932, 0.3777935802936554, 0.25089144706726074, -138.63917541503906, -3.0718772411346436, 0.22783444821834564, 31.658987045288086, 0.37444379925727844, -0.26991599798202515, 0.26833248138427734, 0.01229032315313816, 44.543663024902344, -132.90029907226562, 90.19137573242188, -0.06142802536487579, -0.06738584488630295, -0.0855005756020546, 0.29129257798194885, -183.17877197265625, 84.56061553955078, -0.044022656977176666, 0.1171611100435257, 0.2519994080066681, -0.0471591092646122, -0.1458677351474762, 0.17735454440116882, -0.047444503754377365, 30.804187774658203, -0.3544883131980896, -36.42132568359375, -0.11568495631217957, -0.2802271842956543, 0.008129852823913097, -0.036577217280864716, 0.07157901674509048, -0.21903002262115479, -0.3106585443019867, -0.46044740080833435, 0.04806327819824219, 0.09376034140586853, -0.07303282618522644, -0.897283136844635, 0.5713763236999512, 0.1456032544374466, 0.3136045038700104, 0.3043023347854614, -0.013695154339075089, -0.03506314009428024, -64.56201171875, 16.288570404052734, -7.777749061584473, -20.72641372680664, 0.24397990107536316, 0.299025297164917, -22.395353317260742, 69.9798355102539, 145.16908264160156, 14.923798561096191, 1.1042617559432983, 0.030481893569231033, 0.5635495781898499, 0.09019069373607635, -0.13287849724292755, 691.88671875, -0.20705914497375488, -0.05275285243988037, -0.45272040367126465, 14709.2373046875, -0.8642759323120117, -1.5680649280548096, 0.4369680881500244, 0.8344177007675171, -0.22995835542678833, 0.9861013889312744, -0.08804081380367279, -0.363717257976532, -0.9978976845741272, -1.3513156175613403, -0.5989676713943481, 3.4440152645111084, 0.5986332893371582, 0.10821884870529175, 2.1151418685913086, 2.0682451725006104, 1.205670952796936, 3.087080955505371, 2.612340211868286, 2.0782809257507324, 1.281671404838562, 0.9900065660476685, 1.2912274599075317, 2.1591336727142334, 5.9241461753845215, 3.1011483669281006, 2.2857420444488525, 0.5820815563201904, -0.09678821265697479, 1.7206323146820068, -0.22484436631202698, 1.740064263343811, 0.019562192261219025, 1.7318657636642456, 1.1044847965240479, 0.9318149089813232, 1.195791244506836, 1.5427871942520142, 0.8101403117179871, 1.7795466184616089, -0.3044998347759247, 1.5635349750518799, 0.6233676075935364, 0.056803666055202484, 0.5316118001937866, 0.7678189277648926, 0.5163013339042664, 0.015180910006165504, -0.8095941543579102, 1.4333232641220093, 0.5839280486106873, -5.210971355438232, 0.5699249505996704, 0.49862805008888245, 3.078136682510376, 0.5322481393814087, -0.09594621509313583, 1.0992584228515625, 0.2679940462112427, 0.6500742435455322, -1.6026256084442139, 0.7362425923347473, 0.8052639961242676, -0.7317297458648682, -0.2984599769115448, 0.8984277844429016, -0.07464109361171722, -0.4400843381881714, -1.1176667213439941, -1.441033959388733, -0.22985532879829407, 0.5925242900848389, -0.43359464406967163, -0.11433926969766617, 0.9569036364555359, 1.457709550857544, 1.7515873908996582, 1.433363914489746, 0.6989014744758606, 0.8003503680229187, 1.001442790031433, 2.7631659507751465, 4.498702049255371, 1.1662336587905884, 1.482236385345459, 1.496585488319397, 0.3069888949394226, 0.7148589491844177, 0.32581207156181335, 0.5760663151741028, 0.32331857085227966, -0.18148556351661682, 2.3094043731689453, 1.1810826063156128, 0.3771262466907501, 0.22924940288066864, -0.4037111699581146, 0.09422307461500168, -0.24897414445877075, -0.35402294993400574, 0.8310986757278442, 1.1903191804885864, -0.5627408623695374, -1.6879571676254272, 0.01551483292132616, -0.9278779029846191, 0.09774628281593323, 0.42447859048843384, 1.156247854232788, 1.2236217260360718, 0.6438049674034119, -0.6681567430496216, -0.6663642525672913, 0.07469262927770615, -2.231431245803833, -1.9983638525009155, -1.122272253036499, -3.1514785289764404, -2.5910122394561768, -0.4037865102291107, -1.4306867122650146, -0.839373767375946, -1.0860460996627808, -2.2160749435424805, -1.8749535083770752, -3.1245431900024414, -2.0521647930145264, -0.6706720590591431, 0.22595834732055664, -1.6893175840377808, 0.24633535742759705, -1.890685796737671, -0.022140325978398323, -1.8386683464050293, -1.1632786989212036, -1.0937086343765259, -1.2426129579544067, -1.5900801420211792, -0.6648640036582947, -1.5876110792160034, 0.3754720389842987, -1.676450490951538, -1.0069875717163086, 0.08419283479452133, -0.4598500728607178, -0.7378610372543335, -0.5521301627159119, 0.1375296711921692, 0.8072067499160767, -1.4497714042663574, -0.6075873374938965, 0.6973845362663269, -0.43430352210998535, -0.5481491088867188, -1.0502358675003052, -0.47255739569664, 0.08718898892402649, -1.0849957466125488, -0.2935899794101715, -0.7763735055923462, 1.4037054777145386, -0.7420870065689087, -0.8355369567871094, 0.7748615741729736, 0.174818754196167, -0.7407917976379395, -0.04272041469812393, 0.26785755157470703, 1.2262333631515503, 1.467199683189392, -0.10513440519571304, -0.659709095954895, 0.3640255331993103, 0.023974575102329254, -0.8812496066093445, -1.5644217729568481, -1.7504239082336426, -1.640337586402893, -0.8079192042350769, -0.7988794445991516, -0.9731906056404114, -2.8976058959960938, -4.65114688873291, -1.4053499698638916, -1.3570537567138672, -1.6129049062728882, -0.332871675491333, -0.8450609445571899, -0.4263191819190979, -0.9869986772537231, -0.31008872389793396, 0.12673716247081757, -2.741502285003662, -0.9746290445327759, -0.142032653093338, -0.4832998812198639, 0.5212404727935791, -0.223173588514328, 0.15907761454582214, 0.33340707421302795, -0.9724976420402527, -1.2781873941421509, 0.37440311908721924, 0.7573132514953613, -0.32833990454673767, 0.971528172492981, -0.08501695096492767, -0.3965226113796234, -0.9734662175178528, -1.2060142755508423, -0.5361012816429138, 3.395104169845581, 0.5373645424842834, 0.1377948373556137, 2.158454656600952, 1.9997434616088867, 1.0596023797988892, 3.205472230911255, 2.4920666217803955, 2.141176223754883, 1.4665292501449585, 0.9304757714271545, 1.32386314868927, 2.2253828048706055, 5.831193447113037, 3.267540216445923, 2.1621320247650146, 0.6199184656143188, -0.17313796281814575, 1.5323913097381592, -0.39907726645469666, 1.804374098777771, 0.024435047060251236, 1.7440522909164429, 1.0922458171844482, 1.0869505405426025, 1.1939269304275513, 1.534067988395691, 0.683820903301239, 1.8016107082366943, -0.416195809841156, 1.7490507364273071, 0.9389775395393372, -0.0066984849981963634, 0.4977242052555084, 0.7842644453048706, 0.633277416229248, -0.1646454632282257, -0.9088186621665955, 1.4295293092727661, 0.46750128269195557, -5.374321460723877, 0.5071008801460266, 0.4143255054950714, 3.2297451496124268, 0.6261566877365112, -0.013353029265999794, 1.126759648323059, 0.15075580775737762, 0.6558187007904053, -1.5166150331497192, 0.6937483549118042, 0.8758693337440491, -0.6381175518035889, -0.07058162242174149, 0.7078053951263428, -0.07453806698322296, -0.21457242965698242, -1.0680290460586548, -1.3182734251022339, -0.2403300255537033, 0.7794545888900757, -0.2753189206123352, -0.15181441605091095, 0.8313480019569397, 1.574169635772705, 1.7310713529586792, 1.424288272857666, 0.7929701805114746, 0.9295756220817566, 0.9890704154968262, 2.989780902862549, 4.713570594787598, 1.3400217294692993, 1.3755748271942139, 1.6142131090164185, 0.3256987929344177, 0.6902822852134705, 0.22198761999607086, 0.47703543305397034, 0.3049871623516083, -0.19674327969551086, 2.4170212745666504, 0.9843716025352478, 0.2065003216266632, 0.6318442225456238, -0.5420563220977783, 0.17267575860023499, -0.2044893205165863, -0.19374431669712067, 0.8663700819015503, 1.299919843673706, -0.5593047142028809, -0.7321540117263794, 0.2824028432369232, -0.8836308717727661, 0.0855402797460556, 0.3843826651573181, 1.0332286357879639, 1.3348251581192017, 0.34375205636024475, -3.4945168495178223, -0.5923031568527222, -0.051170870661735535, -2.2332658767700195, -2.0607597827911377, -1.237189531326294, -3.1831607818603516, -2.5058953762054443, -2.218125343322754, -1.2196165323257446, -1.02603018283844, -1.3601137399673462, -2.230297565460205, -3.645559787750244, -3.1362709999084473, -2.1793227195739746, -0.7006319761276245, -0.027840934693813324, -1.6596485376358032, 0.4331428110599518, -1.8314865827560425, -0.14340093731880188, -1.9081026315689087, -1.1075129508972168, -1.0763660669326782, -1.0072771310806274, -1.5621119737625122, -0.5846183896064758, -1.817975640296936, 0.1856682002544403, -1.6571216583251953, -1.04145348072052, 0.0024020662531256676, -0.30587002635002136, -0.7585331201553345, -0.7410571575164795, -0.08389157056808472, -0.15793202817440033, -1.4584550857543945, -0.5301848649978638, 1.5399112701416016, -0.3687847852706909, -0.4999660551548004, -3.134387731552124, -0.5219212174415588, 0.04568237438797951, -1.0352834463119507, -0.1128348708152771, -0.7939441204071045, 1.4675416946411133, -0.6350466012954712, -0.7783241868019104, 0.7330111265182495, 0.22803419828414917, -0.8883169293403625, 0.004662253428250551, 0.2958712577819824, 1.12227201461792, 1.3343003988265991, 0.3185693621635437, -0.763487696647644, 0.3963637948036194, 0.6081469058990479, -0.8932719230651855, -1.5239202976226807, -1.6963834762573242, -1.501311182975769, -0.7283564209938049, -0.7871091961860657, -1.1082472801208496, -3.001173734664917, -4.753879070281982, -1.334190011024475, -1.459304690361023, -1.5389031171798706, -0.20233076810836792, -0.7283373475074768, -0.3180025517940521, -0.9112094044685364, -0.21841645240783691, 0.31444185972213745, -2.8441812992095947, -1.063040852546692, -0.25670257210731506, -0.5172252058982849, 0.5456728935241699, -0.029964270070195198, 0.1376665085554123, 0.23829707503318787, -0.5014091730117798, 2.2362592220306396, 1.3533912897109985, 1.1992579698562622, -0.824650764465332, -0.4929713010787964, -1.4007679224014282, 0.8023108243942261, -1.609825611114502, 1.901110053062439]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (40, 50), 'etaBin': (1.54, 2.5)}}, 'et0_eta2': {'discriminator': {'threshold': 0.1299991101026535, 'nodes': [100, 7, 1], 'bias': [-0.06348874419927597, 0.03623969852924347, -0.1288398653268814, -0.12441787868738174, 0.1003570482134819, -0.005418633110821247, 0.029942257329821587, -0.20454871654510498], 'weights': [-0.6994321942329407, 0.10208365321159363, 1.681780219078064, 0.8598272204399109, -0.3105170428752899, -0.8199452757835388, -0.24872657656669617, 0.24371692538261414, 1.2890616655349731, -3.030609607696533, -3.005108118057251, -2.7385737895965576, -0.9483087658882141, -0.10872109979391098, -1.2035022974014282, -1.1545008420944214, 5.109705924987793, -0.9131451845169067, -1.0364693403244019, 0.05470660328865051, 2.2213242053985596, 0.0609315000474453, -0.06487470865249634, 0.5144542455673218, 3.66133189201355, 0.13849909603595734, -2.2307546138763428, 1.0401767492294312, 1.1351555585861206, 1.4495421648025513, 1.2791365385055542, 0.6287277340888977, -0.733975350856781, 2.002916097640991, 1.6680200099945068, 0.002605465240776539, 2.368330240249634, 0.5400947332382202, 0.9055526256561279, -0.3188956081867218, -3.7293615341186523, 1.982121467590332, -0.7138312458992004, 1.2670035362243652, 1.3463627099990845, 1.3707585334777832, 0.4937777519226074, 0.9307859539985657, 1.6330000162124634, 0.42295849323272705, 1.4393194913864136, -3.489879608154297, -21.689550399780273, 0.7888513207435608, 0.6065999865531921, 1.1640162467956543, 1.1659111976623535, 1.1224546432495117, 0.8181604743003845, 0.34476009011268616, 0.7292398810386658, 0.307730108499527, 0.5083118081092834, -0.1468956023454666, 0.49803051352500916, 1.027100682258606, -0.023049376904964447, 0.3076647222042084, 0.44340968132019043, 0.46747466921806335, 1.4015519618988037, 1.0442742109298706, 0.017169183120131493, -0.5910464525222778, 1.9767276048660278, 0.9590660333633423, 1.0071029663085938, 0.6182443499565125, 0.6004731059074402, 0.40733572840690613, -4.144710540771484, -0.07095064222812653, -0.13940078020095825, 0.3004467487335205, 0.7743308544158936, -4.6586480140686035, 0.9079718589782715, 0.9051303267478943, -0.9884213209152222, 0.25647568702697754, 0.001450522686354816, -0.15312232077121735, 1.7478258609771729, -0.8393897414207458, 0.7932825088500977, -0.06429167836904526, -0.04977763071656227, -0.06843768805265427, 0.1047542616724968, -0.8194230198860168, -0.6115278601646423, 0.09765119850635529, 1.3214211463928223, 0.866887092590332, -0.4110688269138336, -0.8353613018989563, -0.3266078233718872, 0.15197445452213287, 1.2481001615524292, -3.0475668907165527, -2.9632232189178467, -2.6965742111206055, -0.8962796330451965, -0.10409792512655258, -1.1161562204360962, -1.1503418684005737, 5.042563438415527, -0.8737424612045288, -1.0692106485366821, 0.029309913516044617, 2.6510682106018066, -0.08167729526758194, -0.027943413704633713, 0.5984232425689697, 3.4828624725341797, 0.08236321806907654, -2.2207534313201904, 0.9744399189949036, 1.238242268562317, 1.58805251121521, 1.4116514921188354, 0.4440762400627136, -0.5017024278640747, 2.1402831077575684, 1.7400015592575073, 0.01887228712439537, 2.24285888671875, 0.5093076229095459, 0.841781497001648, -0.4968641400337219, 0.28141161799430847, 1.957116723060608, 0.6013190746307373, 1.2706714868545532, 1.385116457939148, 1.5819119215011597, 0.6709210872650146, 0.8653045296669006, 3.265524387359619, 0.363518089056015, 1.365139126777649, -0.7787774801254272, -2.7768466472625732, 0.743328869342804, 0.6601492762565613, 1.366594910621643, 1.0569247007369995, 1.1993486881256104, 0.8746750354766846, 0.35751205682754517, 0.6915795803070068, 0.1977250874042511, 0.43816831707954407, -0.3167257308959961, 0.5370357632637024, 0.9942529797554016, 0.13064152002334595, 0.16605283319950104, 0.3902914822101593, 0.5092731714248657, 1.3726606369018555, 0.9422245621681213, -0.13885952532291412, -0.49613067507743835, 2.1251988410949707, 0.9648995995521545, 1.0657436847686768, 0.8174012303352356, 0.7892894148826599, 0.5329540371894836, -1.6574095487594604, 0.06622839719057083, 0.3421139717102051, 0.42999839782714844, 0.843985378742218, -0.9439149498939514, 0.9481310844421387, 0.840822160243988, -0.9870644211769104, 0.2610977292060852, 0.1828286200761795, 0.0447382889688015, 1.8897302150726318, -0.7401317954063416, 0.8096083402633667, -0.13080072402954102, 0.028338264673948288, 0.053457845002412796, 0.25215551257133484, -0.7827207446098328, 0.2212507575750351, -0.14484000205993652, -0.384246289730072, -0.25710728764533997, 0.46749913692474365, 0.5572332143783569, 0.45652493834495544, 0.6051268577575684, -1.6051222085952759, 1.128701090812683, 2.6701321601867676, 1.1636186838150024, 0.2001228779554367, 0.22440995275974274, 0.2826562225818634, 0.27844810485839844, -1.3489367961883545, 0.5463594794273376, 0.33576756715774536, -0.0998910591006279, -0.5289080739021301, -0.19072000682353973, -0.2870570719242096, -1.556277871131897, -1.54615318775177, -0.8130171298980713, 4.524102687835693, -0.1396736055612564, -0.49219879508018494, -0.5249353647232056, -0.37386825680732727, 0.035871148109436035, 1.4547717571258545, -0.6416154503822327, -0.6378124356269836, -0.15821164846420288, -0.657520592212677, -0.14465390145778656, -0.14651301503181458, 0.3411875367164612, 1.6198832988739014, -0.657878577709198, -0.15671813488006592, -0.43762272596359253, -0.48266008496284485, -0.5495358109474182, -0.11727019399404526, -0.20478028059005737, -1.4401438236236572, -0.09428220242261887, -0.5240834355354309, 1.7509093284606934, 1.4686453342437744, -0.26726600527763367, -0.22691361606121063, -0.36868810653686523, -0.24493809044361115, -0.36019057035446167, -0.171264186501503, 0.18464073538780212, -0.18023346364498138, 0.07953140139579773, -0.10153011977672577, 0.15828613936901093, -0.03566069155931473, -0.09460435062646866, 0.11431301385164261, 0.05293290689587593, 0.07226324826478958, -0.12114517390727997, -0.3714432120323181, -0.30009016394615173, -0.1217225044965744, -0.0045923818834125996, -3.457169532775879, -0.24030056595802307, -0.11426949501037598, -0.2163078337907791, -0.21587233245372772, -0.16124066710472107, 0.5443711280822754, -0.14228269457817078, 0.12431485950946808, 0.06580327451229095, -0.3655425012111664, 2.051795482635498, -0.3123963475227356, -0.11518420279026031, 0.437244713306427, -1.0017818212509155, 0.012854296714067459, 1.1998306512832642, -0.388393372297287, 0.5600149631500244, -0.20035132765769958, -0.13071319460868835, -0.0399421788752079, -0.12273726612329483, -0.16315199434757233, 0.22284507751464844, -0.6074252724647522, -0.033254474401474, 1.7734354734420776, 0.9066227674484253, -0.43184366822242737, -0.7900717854499817, -0.1781877875328064, 0.11263395845890045, 1.331699013710022, -2.854299306869507, -2.904628038406372, -2.784907341003418, -0.8464739918708801, -0.19670042395591736, -1.2164088487625122, -1.1727181673049927, 5.151409149169922, -0.842821478843689, -1.0274747610092163, -0.1730169951915741, 2.069715738296509, 0.043851688504219055, 0.070670947432518, 0.6500223875045776, 3.5279433727264404, 0.307046115398407, -2.330390214920044, 0.9481484293937683, 1.2282432317733765, 1.4820579290390015, 1.4465502500534058, 0.8016788363456726, -0.5898081660270691, 2.0149948596954346, 1.6407771110534668, 0.013302115723490715, 2.398138999938965, 0.3364012539386749, 0.7973099946975708, -0.4934387803077698, -3.5097553730010986, 1.9622154235839844, -0.6902076601982117, 1.3413820266723633, 1.250186800956726, 1.396918535232544, 0.5621547698974609, 0.8888913989067078, 1.4824937582015991, 0.48818662762641907, 1.4166909456253052, -3.536811351776123, -24.92084503173828, 0.654778778553009, 0.44824737310409546, 1.33790922164917, 0.9533734321594238, 1.1114494800567627, 0.6530362963676453, 0.47235310077667236, 0.7386127710342407, 0.29787588119506836, 0.547225296497345, -0.24037419259548187, 0.512398898601532, 1.0412685871124268, -0.09365858882665634, 0.10470365732908249, 0.26602765917778015, 0.5356124639511108, 1.271186351776123, 0.8395084738731384, 0.07754461467266083, -0.4474998116493225, 2.0934016704559326, 0.91155606508255, 0.4728260040283203, 0.5563065409660339, 0.7580582499504089, 0.42653581500053406, -4.153563976287842, -0.18298356235027313, -0.17927567660808563, 0.3640288710594177, 0.7750224471092224, -4.609886169433594, 0.8984575271606445, 0.6813861727714539, -0.9628022909164429, 0.32882440090179443, 0.15228895843029022, -0.10598684102296829, 1.8224663734436035, -0.8819865584373474, 0.7348246574401855, -0.2222723513841629, -0.06606271862983704, 0.04948493093252182, -0.00904881302267313, -0.7661005854606628, 0.5607529282569885, -0.05159216746687889, -1.792655110359192, -0.9723911285400391, 0.2107294648885727, 0.8136662840843201, 0.16430503129959106, -0.2579205632209778, -1.2882338762283325, 2.911761999130249, 2.8237626552581787, 2.8000264167785645, 0.9412887096405029, 0.22695930302143097, 1.2663750648498535, 1.353284239768982, -5.121635913848877, 1.0401403903961182, 1.0674011707305908, 0.18953466415405273, -2.149789810180664, 0.10647141188383102, 0.03580387309193611, -0.5147081017494202, -3.628361701965332, -0.12231002002954483, 2.3675930500030518, -1.1145216226577759, -1.1123000383377075, -1.5907338857650757, -1.481510043144226, -0.7424841523170471, 0.6412054896354675, -2.0590980052948, -1.6372747421264648, 0.0619027242064476, -2.4287240505218506, -0.3367054760456085, -0.8573153018951416, 0.5163951516151428, 3.556837797164917, -1.858163833618164, 0.7149078249931335, -1.1894092559814453, -1.3607982397079468, -1.5640636682510376, -0.49976587295532227, -0.9596536755561829, -1.6972423791885376, -0.39594757556915283, -1.4810117483139038, 3.486910820007324, 2.8940298557281494, -0.857546865940094, -0.6077556014060974, -1.1933507919311523, -0.9613820910453796, -1.2438371181488037, -0.6647740006446838, -0.3744419515132904, -0.7347481846809387, -0.09965112060308456, -0.6350415945053101, 0.3057122528553009, -0.6031996607780457, -0.8806594610214233, -0.01072041504085064, -0.21616210043430328, -0.35064586997032166, -0.45507487654685974, -1.3696155548095703, -0.8669682145118713, -0.13787759840488434, 0.6219918727874756, -1.978965163230896, -0.8375784754753113, -0.4755556583404541, -0.6244028210639954, -0.7649192214012146, -0.6339374780654907, 4.167630672454834, 0.12187815457582474, 0.1668955683708191, -0.34224599599838257, -0.7939738631248474, 4.682919979095459, -0.9770385026931763, -0.7183697819709778, 0.8933781385421753, -0.1742231696844101, -0.10143762826919556, 0.05050342157483101, -1.7145602703094482, 0.8550977110862732, -0.73504638671875, -0.0055467355996370316, -0.04514014720916748, 0.09083645790815353, -0.08515525609254837, 1.0986518859863281, -0.5119187235832214, 0.05760094150900841, 1.3171058893203735, 0.8399652242660522, -0.33957669138908386, -0.8359718918800354, -0.18823641538619995, 0.05371649190783501, 1.2638932466506958, -2.888981580734253, -3.0126914978027344, -2.6422805786132812, -0.9336118102073669, -0.1310640275478363, -1.1350458860397339, -1.2499178647994995, 5.139877796173096, -0.9532581567764282, -1.0571777820587158, -0.015751279890537262, 2.4440970420837402, 0.09489630907773972, 0.0012970769312232733, 0.687771201133728, 3.577953338623047, 0.1779686063528061, -2.3735105991363525, 0.9543430209159851, 1.3185936212539673, 1.6423382759094238, 1.2892314195632935, 0.3614344298839569, -0.4948037266731262, 2.021239995956421, 1.642642617225647, -0.1457976996898651, 2.3662660121917725, 0.55765700340271, 0.821914553642273, -0.35032719373703003, 0.18251673877239227, 1.893751621246338, 0.559088945388794, 1.1893036365509033, 1.2400177717208862, 1.5134555101394653, 0.5754262208938599, 0.8589807152748108, 3.110215663909912, 0.47953107953071594, 1.5568150281906128, -0.8979969024658203, -2.721264362335205, 0.7211843132972717, 0.6376146674156189, 1.2742069959640503, 1.129908561706543, 1.2671172618865967, 0.741439163684845, 0.4965633749961853, 0.8062971830368042, 0.23679718375205994, 0.5215432643890381, -0.20244623720645905, 0.44972795248031616, 0.98760586977005, 0.08758813142776489, 0.20948883891105652, 0.42465686798095703, 0.6894136667251587, 1.3195726871490479, 0.9331247210502625, -0.02805432118475437, -0.598785400390625, 2.0426430702209473, 0.9867404103279114, 1.137693166732788, 0.8048722147941589, 0.8114951252937317, 0.664736270904541, -1.5552059412002563, 0.02622155286371708, 0.13953495025634766, 0.344723641872406, 0.7831734418869019, -0.9259676337242126, 1.013528823852539, 0.8709443211555481, -0.9086853265762329, 0.23759059607982635, 0.12343567609786987, -0.005225889850407839, 1.6622343063354492, -0.7085463404655457, 0.6308629512786865, -0.2025437355041504, 0.04593987762928009, 0.07471984624862671, 0.2311854511499405, -1.021540641784668, 0.007167748175561428, 0.25892382860183716, -0.06918046623468399, -0.00621141167357564, -0.22361071407794952, -0.26106134057044983, -0.5436748266220093, -0.8577413558959961, 1.4302963018417358, -0.19007162749767303, -0.05895201861858368, -0.041624072939157486, 0.019658850505948067, 0.05061909556388855, -0.10030277073383331, -0.02440410479903221, 0.15019437670707703, 0.08859577029943466, -0.0507817417383194, 0.18049032986164093, 0.03021840751171112, 0.1474703848361969, 0.2350054830312729, 0.37257248163223267, 0.28667935729026794, 0.3376149535179138, -0.9727715253829956, 0.04192372411489487, 0.0713353231549263, 0.015926873311400414, 0.03416824713349342, -0.15991435945034027, -0.33007901906967163, 0.16517677903175354, 0.08699169754981995, -0.02082204446196556, -0.041814230382442474, -0.13877896964550018, 0.05543418228626251, -0.6091954708099365, -0.4247947931289673, 0.14133520424365997, -0.1552610695362091, -0.08489401638507843, -0.02667396143078804, -0.05163195729255676, -0.051392100751399994, 0.016054268926382065, -0.06420417129993439, -0.029363417997956276, 0.004692618735134602, -1.9968196153640747, -1.6428422927856445, -0.11348580569028854, -0.16131089627742767, 0.02872431091964245, -0.11745506525039673, -0.07678171247243881, -0.06865803897380829, -0.2331675887107849, -0.019946591928601265, -0.1373768299818039, -0.1981438249349594, -0.3051968812942505, 0.08097540587186813, 0.01644028164446354, -0.08025483042001724, -0.15796218812465668, 0.036216042935848236, -0.058446139097213745, 0.1305682212114334, -0.014940540306270123, 0.2333737164735794, -0.03680476173758507, 1.1119219064712524, 0.009979184716939926, -0.12234748899936676, -0.12312275916337967, -0.08529893308877945, -0.06911766529083252, 0.057953253388404846, -0.13154922425746918, -0.21691179275512695, -0.07254161685705185, 0.06872223317623138, -1.9916510581970215, -0.11578366160392761, -0.14464883506298065, -0.02283313311636448, 0.2677203416824341, 0.009310171008110046, -0.45566526055336, 0.0005858965450897813, -0.005648707039654255, -0.15681412816047668, -0.11898121982812881, 0.06339046359062195, 0.03415011987090111, 0.7315319776535034, 0.07375860959291458, -0.6383800506591797, -0.8773346543312073, 0.5294492244720459, -0.5438499450683594, 0.7297844290733337, -0.8299105763435364, -0.022825097665190697]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (1.37, 1.54)}}, 'et4_eta1': {'discriminator': {'threshold': -0.025000816583633428, 'nodes': [100, 5, 1], 'bias': [0.1368117481470108, -0.20471306145191193, 0.25162437558174133, 0.037453796714544296, -0.14133796095848083, 0.38234931230545044], 'weights': [-2.130035638809204, -0.5393927693367004, -0.9759161472320557, 0.027014100924134254, 0.8318871855735779, 1.0238282680511475, 1.141689658164978, -1.869693398475647, -3.665236711502075, -4.683228492736816, 4.261914253234863, 3.514181137084961, 0.20307433605194092, 6.266193389892578, 5.99254846572876, 3.932964324951172, 17.59791374206543, 8.373623847961426, 7.607294082641602, 7.776383399963379, 8.354427337646484, 8.5038423538208, 13.071599960327148, 4.98869514465332, 4.986407279968262, 5.2472004890441895, 5.8095245361328125, 6.400001525878906, 6.61406946182251, 5.610245704650879, 4.371086597442627, -4.412916660308838, 4.295096397399902, 4.34031867980957, 4.5890350341796875, 0.7572334408760071, -2.9243900775909424, 3.5074942111968994, 4.746408462524414, 3.6123123168945312, -0.29847827553749084, 2.4830968379974365, 12.243091583251953, -2.671121835708618, -0.42474305629730225, 5.3024067878723145, 0.47904419898986816, -4.686585426330566, 1.057651162147522, 0.5037263631820679, -0.6339253187179565, -11.455190658569336, 2.888310194015503, 1.111154556274414, -2.011073350906372, 1.065307378768921, 8.978684425354004, 0.9059798121452332, 1.3704766035079956, 1.4005928039550781, 1.3405280113220215, 0.7859353423118591, 1.1938691139221191, 1.7589560747146606, 1.3541094064712524, 1.1626307964324951, 1.4609614610671997, 1.5543619394302368, -0.5058679580688477, 2.250509023666382, 1.5658988952636719, 11.599382400512695, -0.7680370211601257, -0.3099972605705261, 0.9102615118026733, 3.842761754989624, 3.410079002380371, 2.9276795387268066, 1.877437949180603, 0.7450165152549744, 1.20259428024292, 6.227108478546143, 9.775453567504883, 5.654054164886475, 4.373102188110352, 0.5716181993484497, 4.210047245025635, 3.1950364112854004, 2.887277841567993, 2.189822196960449, 0.08076183497905731, -0.47561392188072205, 12.133353233337402, 5.22784948348999, 2.3519136905670166, 1.3858380317687988, 3.441948413848877, 4.795068264007568, 0.26946109533309937, -0.3931163251399994, 2.0531983375549316, 3.5182902812957764, 0.36154523491859436, -0.08953151106834412, -1.5676263570785522, -1.1089410781860352, 2.055800676345825, 2.016171455383301, 4.887370586395264, 3.535243272781372, -4.930495738983154, -3.289088249206543, -0.2499181628227234, -6.260674476623535, -5.867226600646973, -3.8889119625091553, -17.596994400024414, -8.426430702209473, -7.641038417816162, -7.651299953460693, -8.437056541442871, -8.409344673156738, -13.048593521118164, -5.03273868560791, -5.010976791381836, -5.2970733642578125, -5.759562969207764, -6.3693695068359375, -6.5537238121032715, -5.702812194824219, -4.265665531158447, 4.3925065994262695, -4.482141494750977, -4.437830924987793, -4.678004741668701, -0.8397036194801331, -0.15652664005756378, -2.7364277839660645, -4.686943531036377, -3.6105051040649414, -1.52102530002594, -2.3185880184173584, -4.614280700683594, 2.9151771068573, 0.3193269968032837, -10.638097763061523, -0.4483521282672882, 4.5968098640441895, -1.1343300342559814, -0.4985029101371765, 0.6699225902557373, 1.0003150701522827, -3.6652991771698, -1.0335488319396973, 2.113910675048828, -1.4512553215026855, -11.102887153625488, -1.3996875286102295, -1.2658365964889526, -1.3318449258804321, -1.3592191934585571, -0.8332695364952087, -1.141115665435791, -1.80889093875885, -1.494734287261963, -1.1840511560440063, -1.5774871110916138, -1.6156516075134277, 0.5827875137329102, -2.3029839992523193, -1.3679801225662231, -3.759927749633789, 0.623717725276947, 0.4817883372306824, -1.0705909729003906, -3.8159971237182617, -3.559784173965454, -2.800854206085205, -0.25998586416244507, -0.7139890193939209, -1.323843002319336, -6.250438690185547, -9.895606994628906, -5.672438621520996, -4.342494964599609, -0.6370532512664795, -4.407532691955566, -4.767236709594727, -2.9602842330932617, -2.278280735015869, -0.22159385681152344, 0.8717446327209473, -12.011740684509277, -4.494610786437988, -1.9178028106689453, -1.4090640544891357, -3.5514323711395264, -4.603492736816406, 0.15254566073417664, 0.3649347722530365, -1.9347444772720337, -3.4411838054656982, 0.2424999475479126, 0.07644066214561462, 1.4897571802139282, 1.12418794631958, -1.9590630531311035, -1.9693427085876465, -4.938224792480469, -3.6590375900268555, 5.115259647369385, 3.2115535736083984, 0.262077271938324, 6.171327590942383, 5.821171760559082, 3.8345682621002197, 17.569730758666992, 8.430460929870605, 7.773387432098389, 7.7894606590271, 8.560273170471191, 8.36445140838623, 13.05023193359375, 5.072444438934326, 5.021036148071289, 5.2770256996154785, 5.686396598815918, 6.312747478485107, 6.452341556549072, 5.600564002990723, 4.344597339630127, -4.380504131317139, 4.462042808532715, 4.510515213012695, 4.68198299407959, 0.7366636991500854, -0.013637147843837738, 2.842212438583374, 4.888831615447998, 3.647587537765503, 1.5496257543563843, 2.4471447467803955, 4.578889846801758, -2.6680076122283936, -0.2750495672225952, 10.561718940734863, 0.38308224081993103, -4.58486270904541, 1.0569143295288086, 0.5706480145454407, -0.7779104113578796, -0.9494509696960449, 3.697617530822754, 1.2045910358428955, -2.0284082889556885, 1.4885661602020264, 11.23969841003418, 1.4069561958312988, 1.2414549589157104, 1.3621617555618286, 1.269284963607788, 0.8928844332695007, 1.1885015964508057, 1.6937881708145142, 1.369047999382019, 1.2404853105545044, 1.617439866065979, 1.5777935981750488, -0.4256432056427002, 2.2867300510406494, 1.3621190786361694, 3.635892152786255, -0.7695103287696838, -0.5179620385169983, 0.9356290102005005, 3.7094156742095947, 3.4421634674072266, 2.8587162494659424, 0.4235161542892456, 0.7770473957061768, 1.1957545280456543, 6.047815799713135, 9.751434326171875, 5.571600914001465, 4.5497145652771, 0.5733157396316528, 4.3490729331970215, 4.852941513061523, 2.9088807106018066, 2.2005069255828857, 0.07970323413610458, -0.7549872398376465, 11.988516807556152, 5.222102642059326, 2.2982215881347656, 1.518141508102417, 3.5133588314056396, 4.635383605957031, -0.3394232392311096, -0.5039586424827576, -2.1126832962036133, -3.126528263092041, -0.8905130624771118, 0.2526894509792328, 0.9697019457817078, 1.1697176694869995, 0.9658239483833313, -1.6358197927474976, -3.542360544204712, -3.643115758895874, 5.021982669830322, 0.8475335240364075, 0.6862958073616028, 6.191305637359619, 5.982331275939941, 3.841648578643799, 17.666725158691406, 8.448466300964355, 7.690269470214844, 7.750001430511475, 8.512673377990723, 8.32656192779541, 13.097729682922363, 4.891061305999756, 5.028873920440674, 5.315243244171143, 5.779512882232666, 6.42729377746582, 6.548605442047119, 5.492628574371338, 4.432719707489014, -3.757545232772827, 4.407778739929199, 4.376555919647217, 4.776916027069092, 0.7515699863433838, 0.15473267436027527, 3.503401041030884, 4.851888656616211, 3.6555261611938477, -0.3399224877357483, 3.285504102706909, 12.171703338623047, -2.310349464416504, -0.3852766156196594, 5.297940731048584, 0.398785799741745, -4.591699600219727, 1.1337236166000366, 0.49689191579818726, -0.8178296089172363, -6.896082878112793, 3.6698272228240967, 1.2443881034851074, -2.1804614067077637, 1.0107548236846924, 11.061007499694824, 1.122423529624939, 1.3488410711288452, 1.536514401435852, 1.3528521060943604, 0.8315747380256653, 1.281538486480713, 2.088397264480591, 1.4307785034179688, 1.1716574430465698, 1.4112392663955688, 1.5508853197097778, -0.4952566623687744, 1.877034306526184, 1.5999292135238647, 11.57441234588623, -0.6229255199432373, -0.3313760757446289, 0.9546158313751221, 3.752150297164917, 3.630032777786255, 3.185051679611206, 1.8875349760055542, 0.784959614276886, 1.4096580743789673, 6.043801307678223, 9.78857421875, 5.76153564453125, 4.328771591186523, 0.7151880264282227, 4.269259452819824, 3.0902724266052246, 2.9918134212493896, 2.436870574951172, 0.11758103966712952, -0.5334725975990295, 11.954203605651855, 5.096224784851074, 2.249992847442627, 1.5389662981033325, 3.575451374053955, 4.6377434730529785, 0.1630374938249588, -0.5051027536392212, 1.984914779663086, 0.5627711415290833, 1.0732998847961426, -0.19242368638515472, -0.8294803500175476, -1.1556565761566162, -1.1030082702636719, 1.8765265941619873, 3.5459787845611572, 4.77174711227417, -4.350045680999756, -3.55570650100708, -0.3403075635433197, -6.087789535522461, -5.966447353363037, -3.835606098175049, -17.626285552978516, -8.548233985900879, -7.739028453826904, -7.64619779586792, -8.525344848632812, -8.562987327575684, -12.968362808227539, -4.999866485595703, -5.012319087982178, -5.32070255279541, -5.9654669761657715, -6.27116584777832, -6.429178714752197, -5.6488447189331055, -4.270801067352295, 4.193481922149658, -4.312960624694824, -4.401850700378418, -4.714672565460205, -0.770115315914154, 2.73360276222229, -3.3352391719818115, -4.755034923553467, -3.6631531715393066, 0.30004802346229553, -3.2827205657958984, -12.332881927490234, 2.7946627140045166, 0.49721306562423706, -5.106895923614502, -0.5173488259315491, 4.480642318725586, -1.0393213033676147, -0.40753108263015747, 0.8173714876174927, 6.724306106567383, -2.8538410663604736, -1.0836765766143799, 2.1090803146362305, -1.0541775226593018, -9.022180557250977, -0.9658997654914856, -1.4897149801254272, -1.518357753753662, -1.437066912651062, -0.807464063167572, -1.2718617916107178, -1.614151120185852, -1.4347045421600342, -1.1070570945739746, -1.5882421731948853, -1.5664325952529907, 0.47449272871017456, -1.813798189163208, -1.3695961236953735, -11.625906944274902, 0.7945756316184998, 0.44462013244628906, -1.0783065557479858, -3.732006311416626, -3.626474380493164, -3.1738016605377197, -1.9752010107040405, -0.9405118823051453, -1.3127484321594238, -6.13884973526001, -9.861763000488281, -5.727163314819336, -4.516567230224609, -0.5624948740005493, -4.275181293487549, -3.1227517127990723, -2.936113119125366, -2.114412546157837, -0.1288205236196518, 0.5894713401794434, -12.076895713806152, -5.096946716308594, -2.3524556159973145, -1.4124445915222168, -3.512423038482666, -4.665160179138184, -0.30556291341781616, 0.5504725575447083, -0.835625946521759, 1.624426245689392, -1.4829803705215454, -0.9288313388824463, 1.4517772197723389]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (50, 500000), 'etaBin': (0.8, 1.37)}}, 'et4_eta3': {'discriminator': {'threshold': -0.055000817775726324, 'nodes': [100, 5, 1], 'bias': [0.10169322043657303, 0.11152373254299164, -0.10183665156364441, 0.14507950842380524, -0.012784632854163647, 0.3051639199256897], 'weights': [-1.0979061126708984, -0.08282068371772766, 0.34341326355934143, 0.19185738265514374, 0.1345616728067398, 0.27040520310401917, -0.24012655019760132, 0.30704063177108765, -1.3665729761123657, -1.2696759700775146, -0.18033018708229065, 0.8451737761497498, 0.3972945213317871, -0.0687713772058487, 0.5313021540641785, 2.0114214420318604, 0.44385334849357605, 1.6325621604919434, 1.1157288551330566, -2.3137314319610596, 0.7903743982315063, -0.2982981503009796, 0.5546078085899353, 1.270151972770691, 0.4905008375644684, 0.8352788686752319, -1.3395742177963257, 1.2522163391113281, 0.9795517921447754, -0.6428253650665283, -2.8577184677124023, 0.9079991579055786, 0.3171425461769104, 0.9993422031402588, 0.29240882396698, 0.8716768026351929, 0.12775194644927979, -0.3423280119895935, 0.1825614720582962, 0.8119484186172485, 0.0912979245185852, 0.28227120637893677, -1.8392573595046997, 0.40407654643058777, -0.04376028850674629, 2.1911468505859375, 0.20093314349651337, 0.33370083570480347, -0.8898378610610962, 0.19318871200084686, 0.26690852642059326, -0.17185620963573456, 0.040499769151210785, -5.500153064727783, -0.2076902836561203, -1.6063992977142334, -0.3194468915462494, -0.2711489796638489, -0.07819535583257675, 3.113276720046997, -0.04002723842859268, 0.17636047303676605, -0.5736351609230042, 0.27420365810394287, -0.22301238775253296, 0.1618892252445221, -0.1577230542898178, 1.013501763343811, 0.24833723902702332, 5.052083969116211, 0.060960665345191956, 1.642093300819397, -0.037449825555086136, -0.09065145999193192, 0.6004922986030579, 0.43923068046569824, 0.4695076048374176, 0.2831805944442749, -0.014764359220862389, -0.0768909826874733, 0.011413696222007275, 0.7759168744087219, 1.434158444404602, 0.8301385641098022, 0.7751454710960388, 0.2719067633152008, 2.961560010910034, 0.14687494933605194, -0.30398914217948914, -0.004368031397461891, -0.09897327423095703, -0.25245094299316406, 0.5440033078193665, 0.23826628923416138, -0.08488204330205917, 0.14345282316207886, -0.6308616995811462, 0.03856739029288292, -0.03184456750750542, 1.070357322692871, -2.617691993713379, -6.656711578369141, 2.4757888317108154, 3.5707614421844482, 2.057889223098755, 2.052273750305176, -2.0231831073760986, 1.939840316772461, -2.6131949424743652, -2.5421559810638428, -1.763682246208191, 3.3119683265686035, 0.7178563475608826, -0.39789652824401855, 6.116654872894287, 7.613209247589111, 3.4975619316101074, 6.759545803070068, 5.012187957763672, 15.513250350952148, 7.251643180847168, 4.53508996963501, 4.012040138244629, 6.30180549621582, 5.689427375793457, 5.829439163208008, 4.7401862144470215, 15.034461975097656, 5.4140238761901855, 2.107877016067505, 3.0105841159820557, 11.514065742492676, 3.2595458030700684, 11.68129825592041, 4.664960861206055, 5.22706413269043, 2.9597506523132324, -2.5245423316955566, 2.2901451587677, 9.183551788330078, -0.1297299861907959, 4.82317590713501, -1.211287498474121, 4.24929141998291, 0.6421849131584167, 8.138345718383789, 2.7121224403381348, 3.538393497467041, 0.5898178815841675, 3.014824867248535, 1.588001012802124, -2.2866568565368652, 0.019272340461611748, -9.419038772583008, -2.5010175704956055, -0.9488634467124939, -3.4928126335144043, 1.7943700551986694, -0.7283805012702942, 9.655435562133789, -0.7184367775917053, 3.136930227279663, -4.745823860168457, 3.207775354385376, -2.136139154434204, 3.2504653930664062, 0.6701611876487732, 15.872361183166504, 3.3193769454956055, 14.49349594116211, 2.468200206756592, 6.438237190246582, -1.4938722848892212, -0.639966607093811, 3.4333484172821045, 3.911973237991333, 3.677407741546631, 4.427213668823242, 2.643077850341797, 2.7849297523498535, -0.29479601979255676, 5.059480667114258, 17.023698806762695, 8.839578628540039, 4.89912748336792, 2.5039241313934326, 5.475114822387695, 3.013314723968506, 1.07643723487854, 3.775461196899414, 0.908786952495575, 1.0980957746505737, 11.619643211364746, 5.260384559631348, 0.5877745151519775, 2.6299173831939697, 1.4273529052734375, -0.4948287308216095, -2.033464193344116, 4.372760772705078, 2.500901460647583, 2.579420566558838, -2.5093531608581543, -4.606098651885986, -1.9711756706237793, -2.100320816040039, 1.8749351501464844, -2.1329658031463623, 2.437307596206665, 3.864166736602783, 1.5940780639648438, -3.1355409622192383, -0.5700050592422485, 1.048753023147583, -6.067641258239746, -7.68746280670166, -3.407564163208008, -6.8469038009643555, -5.190151691436768, -17.401081085205078, -7.434668064117432, -1.2659673690795898, -3.8133394718170166, -6.165755271911621, -5.254295349121094, -5.790334224700928, -4.496147632598877, -14.951017379760742, -5.329471111297607, 8.61903190612793, -0.5275079011917114, -5.586751461029053, -3.1718804836273193, -11.697233200073242, -4.556994915008545, -5.189043045043945, -2.7670092582702637, 2.689246654510498, -2.2010533809661865, -9.412078857421875, 0.24068301916122437, -4.658514022827148, 1.2108837366104126, -4.396398544311523, -0.5231589674949646, -5.344787120819092, -2.737154483795166, -3.3716776371002197, -0.6236485242843628, -2.9491689205169678, -1.3587371110916138, 2.3853695392608643, -0.003714960068464279, 9.313597679138184, 2.7558295726776123, 0.8726276159286499, 3.4560890197753906, -1.8512276411056519, 0.7082236409187317, -9.644646644592285, 0.864723265171051, -3.151304006576538, 6.809230327606201, -3.2238106727600098, 2.1201791763305664, -2.0560364723205566, -0.6338484287261963, -15.681925773620605, -3.4844303131103516, -14.612195014953613, -2.2891721725463867, -5.3732709884643555, 0.9272360801696777, 1.181979775428772, -3.3734681606292725, -3.72320556640625, -5.280770301818848, -4.350282192230225, -2.5575671195983887, -2.6050665378570557, -3.3768303394317627, -5.016435146331787, -16.990394592285156, -8.685245513916016, -4.9775824546813965, -2.4999797344207764, -5.642441749572754, -3.161771535873413, -1.024899959564209, -3.884551763534546, -1.6399691104888916, -0.9303645491600037, -11.548840522766113, -5.411692142486572, -0.4956657588481903, -2.5952160358428955, -1.4735021591186523, 0.3778286278247833, -0.7521504759788513, -4.337569236755371, 53.01465606689453, -1.298416256904602, 2.617765426635742, -13.046305656433105, 2.234074354171753, 2.1408660411834717, -9.46604061126709, 4.151231288909912, -2.499563217163086, -1.7210322618484497, -1.5978878736495972, 16.444271087646484, 1.0147067308425903, -2.8413987159729004, 6.655270099639893, 7.840666770935059, 3.780627489089966, -3.729732036590576, 12.36520767211914, -13.033893585205078, 7.415826320648193, 4.445235252380371, 3.8943684101104736, 6.3190836906433105, 22.114755630493164, 5.633950710296631, 3.6316051483154297, 14.974407196044922, 5.369043827056885, -8.791732788085938, -3.454469680786133, 11.705693244934082, 3.1771106719970703, 11.775496482849121, 4.508627414703369, -3.727743148803711, 2.8148369789123535, -4.559893608093262, 2.143740653991699, 9.26596736907959, -0.28415486216545105, 4.849753379821777, -1.292141318321228, 4.342484951019287, 0.6156432628631592, 5.531485557556152, 6.774319648742676, 3.4155354499816895, 0.7188467383384705, 2.8427388668060303, 17.954885482788086, -2.2932324409484863, -0.043466221541166306, -9.422235488891602, -2.822448492050171, -1.0253350734710693, -2.4667675495147705, 1.881261944770813, -0.8402062058448792, 9.672449111938477, -0.7901399731636047, 3.0479142665863037, -6.738386631011963, 3.107330322265625, -2.1448211669921875, 3.0629026889801025, 4.503348350524902, 15.817924499511719, 3.3827271461486816, 14.545833587646484, 2.492377996444702, 6.333768844604492, -1.4178109169006348, -1.0377272367477417, 3.3737051486968994, 3.614872932434082, 5.2997331619262695, 4.440213680267334, 2.5455493927001953, 2.761075973510742, -18.800033569335938, 5.065690040588379, 16.898515701293945, 8.77258586883545, 4.92848539352417, 2.418088436126709, 4.820222854614258, 3.1034581661224365, 51.12868118286133, 12.34978199005127, 2.116889476776123, 1.4288195371627808, 0.5983867049217224, 2.7856030464172363, 0.6184176206588745, 2.569619655609131, 9.459463119506836, -0.26877838373184204, 0.7392995953559875, -0.38821324706077576, 0.8399670124053955, 0.2777262330055237, -0.1357821673154831, -0.5220499634742737, -0.2703060209751129, -0.055373821407556534, 0.09603899717330933, -0.3123301565647125, 1.2544300556182861, 1.8659120798110962, 0.2846262454986572, -3.422534942626953, -3.0241026878356934, 1.2115352153778076, -1.6675751209259033, -1.9614168405532837, -0.36647292971611023, -1.3794169425964355, -1.116569995880127, 2.3009607791900635, -1.512026309967041, 0.3406734764575958, -0.5428059697151184, -1.2391767501831055, -0.3969387412071228, -0.9235440492630005, -0.05546741932630539, -1.3031277656555176, -0.7303032279014587, 0.6844742298126221, -0.16292323172092438, -1.0784679651260376, -0.3151314854621887, -0.9295787215232849, -0.393349826335907, -0.750480055809021, -0.13518023490905762, 2.5464935302734375, -0.07153121381998062, -0.6512382626533508, 0.04086637124419212, -0.3879895806312561, 1.8481264114379883, -0.09230849891901016, -0.07517105340957642, -0.6584089994430542, -0.17452041804790497, -0.2032109647989273, 1.032909631729126, -0.19110313057899475, -0.16645808517932892, 2.239582061767578, 0.21135148406028748, 5.550180912017822, 0.26484423875808716, 1.6695494651794434, 0.25145551562309265, 0.425235390663147, 0.29761841893196106, -3.217189073562622, 0.1453329175710678, -0.09675054252147675, 0.5040395259857178, -0.05637646093964577, 0.3299723267555237, -0.10154800862073898, 0.2093258947134018, -0.9515230059623718, -0.2501482665538788, -4.930473804473877, 0.03070908412337303, -1.5502731800079346, 0.466640442609787, 0.2452339231967926, -0.5247545838356018, -0.6222149133682251, -0.44065651297569275, -0.4496033191680908, 0.1696391999721527, -0.026013880968093872, 0.03566448763012886, -0.8327396512031555, -1.4984370470046997, -1.096489429473877, -0.5744541883468628, -0.08651740849018097, -2.928529739379883, -0.3007300794124603, 0.2601717412471771, 0.3471606373786926, -0.08165929466485977, -0.22601909935474396, -0.5088711977005005, 0.0077554043382406235, 0.9099997282028198, -0.3312782347202301, 0.4978024661540985, 0.08636274933815002, 0.024140648543834686, -1.0005066394805908, -3.6228630542755127, -1.2034006118774414, 1.6776691675186157, -1.1059746742248535, 1.0401599407196045]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (50, 500000), 'etaBin': (1.54, 2.5)}}, 'et3_eta0': {'discriminator': {'threshold': -0.10000081211328507, 'nodes': [100, 5, 1], 'bias': [0.08717413246631622, 0.07987606525421143, -0.0891275629401207, -0.023250024765729904, -0.026635879650712013, -0.4253220856189728], 'weights': [2.2681500911712646, 2.079900026321411, -0.33947908878326416, -0.026545777916908264, 0.7609163522720337, 1.0033166408538818, 0.2756510376930237, 1.0896888971328735, 2.5666394233703613, 2.388798475265503, -6.693527698516846, -2.7544918060302734, -6.087902545928955, -2.6686267852783203, -2.6295480728149414, -5.184552192687988, -3.6752121448516846, -3.4875972270965576, -3.3280348777770996, -3.430103302001953, -4.832165718078613, -3.773735523223877, -3.5406227111816406, -3.4261839389801025, -3.5784945487976074, -2.9147233963012695, -1.4379254579544067, -3.1726906299591064, -3.258202314376831, -2.6153550148010254, 0.2055467963218689, -1.7876670360565186, -2.224311113357544, -4.015501976013184, -3.022507667541504, -1.730854868888855, -1.6220908164978027, -1.8350517749786377, -1.3011441230773926, -2.2793126106262207, -4.432361125946045, -4.25582218170166, 1.2008366584777832, 0.4277830421924591, -0.5211353302001953, -2.3532819747924805, -2.2193915843963623, -3.309920072555542, -1.2911876440048218, -1.1818913221359253, -1.9365110397338867, 2.0710086822509766, -0.007945757359266281, 3.1537222862243652, -1.3415555953979492, -2.087634325027466, -0.07220783829689026, 1.7260982990264893, -1.6626362800598145, -3.8554580211639404, 0.21316450834274292, 1.3741559982299805, 0.9717640280723572, -0.46294111013412476, -0.34346452355384827, 1.3640385866165161, -0.5500186085700989, 1.6180779933929443, -0.47913509607315063, -1.358103632926941, -0.520005464553833, 0.561260461807251, 0.7398634552955627, 0.05589801073074341, -0.7283907532691956, -1.7042986154556274, -2.5798048973083496, -1.7380833625793457, -1.6584665775299072, -1.357088565826416, -1.6095407009124756, -4.945938587188721, -3.900132894515991, -3.4401230812072754, -1.5807958841323853, -2.535367012023926, -1.7578206062316895, -3.638277530670166, -4.470762729644775, -3.697664499282837, -0.9952393770217896, -0.2312505543231964, -3.7200167179107666, -3.252729654312134, -1.4943480491638184, -0.27065297961235046, -8.132335662841797, -2.3080925941467285, 0.5592635273933411, -0.3546481430530548, 2.4463951587677, 1.9880770444869995, -0.48482123017311096, -0.005826584994792938, 0.5851339101791382, 1.062596082687378, 0.1375136524438858, 1.1505777835845947, 2.5349080562591553, 2.236337423324585, -6.843856334686279, -2.6496658325195312, -6.799166679382324, -3.206312894821167, -2.804013967514038, -5.225292682647705, -3.5711240768432617, -3.3738090991973877, -3.3550992012023926, -3.5153350830078125, -4.706862449645996, -3.9292984008789062, -3.583012580871582, -3.522552251815796, -3.7470498085021973, -3.0970559120178223, -1.4312368631362915, -3.015939712524414, -3.3172662258148193, -2.583068609237671, 0.06776868551969528, -1.666075587272644, -2.015195608139038, -4.0161895751953125, -2.882598638534546, -1.9164810180664062, -1.7996349334716797, -1.8370146751403809, -1.355314016342163, -2.253908634185791, -4.5830512046813965, -4.456624507904053, 1.3362325429916382, 0.3204353153705597, -0.6760029196739197, -2.395637035369873, -2.1313436031341553, -3.119370222091675, -1.2161948680877686, -1.1246105432510376, -2.097766876220703, 2.0353033542633057, -0.10252197831869125, 3.2166507244110107, -1.2374905347824097, -2.114626884460449, -0.18791182339191437, 1.8331598043441772, -1.7690062522888184, -3.794090747833252, 0.11636921018362045, 1.3661470413208008, 0.9198753237724304, -0.5876086354255676, -0.3558407127857208, 1.2159229516983032, -0.6241759061813354, 1.6643364429473877, -0.6137420535087585, -4.0116753578186035, -0.5777978897094727, 0.500361979007721, 0.6505674719810486, 0.25670525431632996, -0.6605172157287598, -1.7072674036026, -2.649838924407959, -1.8182814121246338, -1.706974983215332, -1.356821060180664, -1.396317720413208, -4.8891377449035645, -3.930746555328369, -3.557610034942627, -1.697187066078186, -2.4656057357788086, -1.905996561050415, -3.634237289428711, -4.530080795288086, -3.7160747051239014, -1.1659671068191528, -0.15122747421264648, -3.7501344680786133, -3.239210844039917, -1.5352976322174072, -0.3094708025455475, -19.72968864440918, -2.426893711090088, 0.5629449486732483, -0.4031555652618408, -0.7764798998832703, -2.101797103881836, 0.41359439492225647, -0.012198015116155148, -0.5716569423675537, -1.024855375289917, -0.28448039293289185, -1.0423412322998047, -2.6221699714660645, -2.3653488159179688, 6.712673664093018, 2.6106224060058594, 6.476511001586914, 3.1795055866241455, 2.703843593597412, 5.151386260986328, 3.7313404083251953, 3.53232741355896, 3.490340232849121, 3.4104089736938477, 4.636786460876465, 3.784532070159912, 3.5146002769470215, 3.519984483718872, 3.5550174713134766, 3.0672061443328857, 1.5808106660842896, 3.0069823265075684, 3.1332614421844482, 2.4964497089385986, -0.04416756331920624, 1.7103191614151, 2.053579807281494, 4.203500270843506, 2.8984155654907227, 1.729622721672058, 1.7907354831695557, 1.7044827938079834, 1.2708089351654053, 2.1621689796447754, 4.555490970611572, 4.474891662597656, -1.2315996885299683, -0.3709278404712677, 0.6682347655296326, 2.3946242332458496, 2.2408931255340576, 3.2824597358703613, 1.379584789276123, 1.1354440450668335, 1.8918840885162354, -1.9478740692138672, 0.20254938304424286, -3.226553440093994, 1.3282544612884521, 2.028494119644165, 0.15404437482357025, -1.826766014099121, 1.6681016683578491, 3.810171604156494, -0.20248286426067352, -1.4376040697097778, -0.8654280304908752, 0.5292313098907471, 0.4658297002315521, -1.1470085382461548, 0.6128965616226196, -1.5579992532730103, -1.6742795705795288, 1.3928155899047852, 0.600355863571167, -0.6056905388832092, -0.7163179516792297, -0.1430409550666809, 0.7646363973617554, 1.8728001117706299, 2.5364155769348145, 1.7979557514190674, 1.8019986152648926, 1.1714766025543213, 1.392497181892395, 5.0426530838012695, 4.067913055419922, 3.6481518745422363, 1.6065806150436401, 2.4595863819122314, 1.9045389890670776, 3.7440080642700195, 4.524541854858398, 3.6195452213287354, 1.0578652620315552, -0.7546117901802063, 3.5762698650360107, 3.1909730434417725, 1.625138521194458, 0.25145629048347473, 8.057820320129395, 2.2714688777923584, -0.7487093210220337, 0.36658287048339844, 10.601336479187012, 2.3486015796661377, -0.48883068561553955, -0.030921315774321556, -0.6588714718818665, 1.1090047359466553, 0.12095142155885696, 1.0767301321029663, 2.5803449153900146, 2.845432758331299, -3.005988359451294, -2.6966347694396973, 8.092320442199707, -3.0568323135375977, -2.6848690509796143, -5.100444793701172, -3.687608480453491, -3.4052910804748535, -3.475186347961426, -3.4591307640075684, -4.923104286193848, -3.85518479347229, -3.4973647594451904, -3.557156562805176, -3.527707815170288, -2.663508653640747, -2.3545241355895996, -3.1414101123809814, -3.122628688812256, -2.5375185012817383, 0.12827737629413605, -1.88190495967865, -2.216580390930176, -1.7920469045639038, -2.823535203933716, -1.9149564504623413, -1.7011759281158447, -1.141815423965454, -1.257978081703186, -2.1186866760253906, -4.578508377075195, -4.2725701332092285, 1.0573289394378662, 0.38121190667152405, -0.510231614112854, -2.2349376678466797, -2.2155354022979736, -3.224957227706909, -1.3313136100769043, -1.0849641561508179, -2.966862916946411, 2.060497760772705, -0.23289397358894348, 3.251350164413452, -1.285964012145996, -2.021150827407837, -0.9624714851379395, 1.8656820058822632, -1.8160383701324463, -3.713286876678467, 0.18810054659843445, 1.388276219367981, 0.9094597101211548, -0.4733060896396637, -0.2816438674926758, 1.2042436599731445, -0.5040654540061951, 1.5934778451919556, -0.6388738751411438, -1.2615058422088623, 2.413672924041748, 0.48390454053878784, 0.24212536215782166, 0.3519132733345032, -0.8600905537605286, -1.3416095972061157, -2.6193883419036865, -1.8580267429351807, -1.6438733339309692, -1.2080692052841187, -0.6655287146568298, -4.8726887702941895, -4.046780586242676, -3.433450698852539, -1.4894355535507202, -2.386496067047119, -1.6990876197814941, -3.575183868408203, -4.424587726593018, -3.795478343963623, -1.1499186754226685, -0.21804332733154297, -2.526177406311035, -3.213907241821289, -1.7318994998931885, -0.2925381064414978, -8.27686595916748, -2.2592711448669434, 0.7715545892715454, -0.43027418851852417, -2.4589970111846924, -1.8989923000335693, 0.4602471888065338, 0.09353755414485931, 0.9011911749839783, -1.030157446861267, -0.15154880285263062, -1.1605008840560913, -2.576120615005493, -2.337810516357422, 6.66701078414917, 2.656461238861084, 6.698328018188477, 3.012401580810547, 2.807321310043335, 5.149005889892578, 3.5259971618652344, 3.4519119262695312, 3.3437204360961914, 3.3645424842834473, 4.880809783935547, 3.817607879638672, 3.406575918197632, 3.4616856575012207, 3.633307456970215, 3.0002620220184326, 2.2805230617523193, 3.0060055255889893, 3.2404773235321045, 2.653902292251587, -0.1338905543088913, 1.8328795433044434, 2.160149574279785, 4.426030158996582, 2.8809216022491455, 1.8393868207931519, 1.7423720359802246, 1.3731577396392822, 1.3589370250701904, 2.1390697956085205, 4.465871334075928, 4.267027378082275, -1.1880772113800049, -0.28225114941596985, 0.5433818697929382, 2.29086971282959, 2.073479652404785, 3.2025809288024902, 1.4455918073654175, 1.071745753288269, 2.0469069480895996, -1.9572094678878784, 0.19417183101177216, -3.1877684593200684, 1.2383781671524048, 2.0761518478393555, 0.1013798788189888, -1.725682020187378, 1.737042784690857, 3.889230728149414, -0.19426727294921875, -1.20805823802948, -0.9141234755516052, 0.39761027693748474, 0.42420968413352966, -1.1954774856567383, 0.6132887601852417, -1.6696009635925293, 0.6184801459312439, 1.217643141746521, -2.457885265350342, -0.3829217851161957, -0.6075864434242249, -0.23630546033382416, 0.8261470198631287, 1.8789469003677368, 2.5897252559661865, 1.9423701763153076, 1.70601224899292, 1.2675572633743286, 0.7246795296669006, 4.820921421051025, 3.9054529666900635, 3.4479055404663086, 1.5085712671279907, 2.4575765132904053, 1.7742023468017578, 3.7832281589508057, 4.373318195343018, 3.8084664344787598, 1.153889536857605, 0.17277860641479492, 3.7421257495880127, 3.216512441635132, 1.6230533123016357, 0.3557702898979187, 8.284748077392578, 2.247519016265869, -0.5243308544158936, 0.4056456685066223, 0.8545168042182922, 1.120518445968628, -1.1356474161148071, 1.794189214706421, -1.4717013835906982]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (40, 50), 'etaBin': (0, 0.8)}}, 'et4_eta0': {'discriminator': {'threshold': -0.06000081673264504, 'nodes': [100, 5, 1], 'bias': [-0.45464807748794556, 0.20552325248718262, 0.10041922330856323, -0.05248928815126419, -0.22410131990909576, -0.0736473947763443], 'weights': [0.8654434084892273, 0.7238449454307556, -0.016100937500596046, -0.25440120697021484, 0.07482898235321045, -0.030807798728346825, 0.11228960007429123, -0.009093526750802994, 0.4012471139431, 0.37599948048591614, -2.7480766773223877, -1.003393530845642, -0.663458526134491, -0.5567011833190918, -0.5626842975616455, -0.4391510784626007, -0.5311102271080017, -0.5860939025878906, -0.5039300322532654, -0.6715015769004822, -0.5225920081138611, -0.5690078735351562, -0.3136046826839447, -0.7533348202705383, -0.6315939426422119, -0.5109248161315918, -0.5853291153907776, -0.43357110023498535, -0.5417161583900452, -0.4573008716106415, -0.18659482896327972, -0.2626052498817444, -0.6091729998588562, -0.6240653395652771, -0.2358284741640091, 0.5703610777854919, -0.16411447525024414, -0.42654454708099365, -0.33193549513816833, -0.29979634284973145, -0.17617523670196533, -0.6149170398712158, -0.3203448951244354, -0.09810018539428711, -0.05930136516690254, -0.2373141646385193, -0.2271171659231186, -0.23208528757095337, 0.27704036235809326, 0.09344451129436493, 0.3813376724720001, -0.41856837272644043, -0.040545638650655746, -0.0506567507982254, 0.026553193107247353, -0.1488424390554428, -0.04041403904557228, 0.008025726303458214, 0.1478395164012909, 0.03709493204951286, 0.04564598575234413, 0.058449145406484604, 1.0249732732772827, -0.8301489353179932, 0.49061694741249084, 0.20719993114471436, 0.0224740169942379, -0.19264444708824158, 0.2008010745048523, 0.11050363630056381, -0.06956909596920013, 0.4201537072658539, 0.10056952387094498, 0.11979181319475174, -0.2621730864048004, -0.3530222773551941, -0.23982149362564087, -0.17515558004379272, -0.09984767436981201, 0.15087352693080902, -0.2621642053127289, -0.2963142693042755, -0.7800387740135193, -0.7981981039047241, -0.38331881165504456, -0.3252427577972412, -0.18831244111061096, -0.3211379647254944, -0.5502303838729858, -0.600724458694458, 0.08456476032733917, -0.029803911224007607, -0.6279226541519165, -0.4302491247653961, -0.1905108094215393, -0.16664323210716248, -1.4184746742248535, -1.0339531898498535, -0.05212470889091492, -0.02694692090153694, -2.89664626121521, -1.522126317024231, 0.4018760025501251, 0.6632153987884521, -0.7798606753349304, 0.6821388602256775, -0.2742626667022705, -0.05876707285642624, -1.9260213375091553, -1.6399043798446655, 2.5064587593078613, 0.1500595360994339, 2.973342180252075, 2.5104820728302, 2.231959581375122, 2.0803494453430176, 3.0945847034454346, 2.4651262760162354, 2.807868003845215, 2.7549498081207275, 2.822803020477295, 2.881761074066162, 1.6963393688201904, 4.415185928344727, 3.204582452774048, 2.9989960193634033, 2.9865028858184814, 1.8464858531951904, 4.592492580413818, 1.6828067302703857, 1.4450982809066772, 1.4380775690078735, 3.6352689266204834, 3.0613625049591064, 1.4443411827087402, -2.1787731647491455, 1.3897387981414795, 2.3056859970092773, 1.5532810688018799, 1.1870392560958862, 1.2428401708602905, 3.1866557598114014, 1.4062598943710327, 0.13774792850017548, 0.8020579814910889, 0.9122603535652161, 1.2649930715560913, 1.3068610429763794, -1.2336946725845337, -0.6574968695640564, -1.6042311191558838, 1.7356789112091064, 0.6620549559593201, 0.17718784511089325, 0.18065781891345978, 0.8247844576835632, -0.08921278268098831, -0.31668365001678467, -0.3119603395462036, -0.2912907898426056, -0.18129703402519226, -0.07816110551357269, -4.42380952835083, 3.818580389022827, -1.9053175449371338, -0.6864086985588074, -0.26168131828308105, 2.5147035121917725, -1.56748628616333, -0.19003517925739288, -0.12223684787750244, -2.712665319442749, -0.6076650023460388, -0.3756449818611145, 0.7902325987815857, 1.3035956621170044, 1.6836720705032349, 1.3523029088974, 1.0712761878967285, -0.7981645464897156, 0.8433824181556702, 1.766300916671753, 3.968885660171509, 3.0044257640838623, 1.3793870210647583, 1.3354099988937378, 1.0920867919921875, 1.3455820083618164, 3.0423827171325684, 3.003952980041504, 0.8978968858718872, -0.3142809569835663, 2.860992431640625, 2.330233335494995, 1.066333532333374, 0.35020801424980164, 6.688539028167725, 4.506115913391113, -0.6031891703605652, 0.32940608263015747, -2.9038455486297607, -1.623227596282959, 0.5406121611595154, 0.8475165367126465, -0.48916947841644287, 0.7471515536308289, -0.2566618323326111, -2.115492343902588, -1.9048508405685425, -1.7299522161483765, 2.3003745079040527, 0.21627192199230194, 2.8531148433685303, 2.5590667724609375, 2.2148633003234863, 1.8159559965133667, 2.8399252891540527, 2.235598564147949, 2.893561601638794, 2.850270986557007, 2.8349950313568115, 2.6701767444610596, 1.6580226421356201, 3.468771457672119, 3.096242904663086, 2.9424970149993896, 2.9990367889404297, 1.8209178447723389, 2.226557970046997, 1.7474256753921509, 1.3832262754440308, 1.466168999671936, 3.591931104660034, 3.1371963024139404, 1.4783045053482056, -2.104995012283325, 1.2974631786346436, 2.364189386367798, 1.4710657596588135, 1.1042094230651855, 1.215171217918396, 3.3849034309387207, 1.385764718055725, -0.014021494425833225, 0.8076024055480957, 0.8762842416763306, 1.2194186449050903, 1.1757382154464722, -1.4135451316833496, -0.6134902834892273, -1.391289472579956, 1.9358757734298706, 0.7488318085670471, 0.10341046005487442, 0.19832651317119598, 0.7993220090866089, 0.06751842796802521, -0.19233927130699158, -0.3591148853302002, -0.38272109627723694, -0.1326684057712555, 0.06153513118624687, -4.2384257316589355, 3.8730711936950684, -1.9382104873657227, -0.7312253713607788, -0.13728484511375427, 2.6223466396331787, -1.5314161777496338, -0.1439787894487381, -0.10129785537719727, -2.708142042160034, -0.5973096489906311, -0.37132561206817627, 0.8917113542556763, 1.3223198652267456, 1.6434791088104248, 1.3919332027435303, 0.9560523629188538, 0.9828652739524841, 0.9428966045379639, 1.6152968406677246, 3.990575075149536, 3.2077877521514893, 1.403012990951538, 1.3792610168457031, 1.253310203552246, 1.2463598251342773, 3.11582088470459, 3.1141462326049805, 0.9595915675163269, -0.1430038958787918, 2.862159013748169, 2.324970245361328, 1.2882179021835327, 0.3202151358127594, 6.660834789276123, 4.603679180145264, -0.5275687575340271, 0.33389902114868164, 2.8177311420440674, 1.432892084121704, -0.4087291657924652, -0.8980953693389893, 0.4600740969181061, -0.5846183896064758, 0.36127161979675293, 2.270127534866333, 2.0754613876342773, 1.7735780477523804, -2.5191783905029297, -1.8718628883361816, -2.9903199672698975, -2.7312474250793457, -2.3452813625335693, -1.7607662677764893, -2.844550132751465, -2.3965907096862793, -2.694422483444214, -2.7240097522735596, -2.9285266399383545, -2.760113477706909, -1.6335761547088623, -4.451236724853516, -3.1620421409606934, -2.8661000728607178, -3.08090877532959, -1.797761082649231, -4.763051509857178, -1.718124508857727, -1.3160881996154785, -1.4486864805221558, -3.5041887760162354, -3.174787759780884, -1.2657315731048584, 2.159719705581665, -1.4213159084320068, -4.020944118499756, -1.5134907960891724, -1.4005309343338013, -1.3205370903015137, -3.3943374156951904, -1.382098913192749, 0.020209314301609993, -0.8206770420074463, -0.9970183372497559, -1.1619480848312378, -1.361959457397461, 1.1774243116378784, 0.6213225722312927, 1.5801045894622803, -1.8135794401168823, -1.1466608047485352, -0.13892577588558197, -0.1261061728000641, -0.7023807764053345, -0.02267831563949585, 0.1866150200366974, 0.23058351874351501, 0.278452068567276, 0.10738613456487656, 0.13800562918186188, 4.400415897369385, -4.241020202636719, 1.8513851165771484, 0.8601193428039551, 0.2994016408920288, -2.584233522415161, 1.4830491542816162, 0.2706097662448883, 0.18619072437286377, 2.8031914234161377, 0.465737521648407, 0.46590203046798706, -0.7943810820579529, -1.3838398456573486, -1.6804900169372559, -1.2413676977157593, -0.9539666771888733, -0.7971248030662537, -1.0329701900482178, -1.673173189163208, -3.9746499061584473, -3.135118246078491, -1.2476274967193604, -1.4965581893920898, -1.3324739933013916, -1.2949087619781494, -2.990060806274414, -3.0730648040771484, -0.8636347055435181, 0.2923405170440674, -2.8703114986419678, -2.4225494861602783, -1.284198522567749, -0.41126593947410583, -7.129720211029053, -4.4336090087890625, 0.47070786356925964, -0.24420206248760223, 6.621960163116455, 1.5531953573226929, 0.16881611943244934, -0.6563533544540405, 0.9717976450920105, -0.5415729880332947, 0.2813624441623688, -0.02211250551044941, 1.990850806236267, 2.443688154220581, -13.056986808776855, -0.06846289336681366, -2.83554744720459, 1.4128798246383667, -0.5264930129051208, -2.086946964263916, -2.901472806930542, -2.4524571895599365, -2.742899179458618, -2.68485426902771, -2.724334239959717, -2.784693479537964, -1.6959819793701172, -3.558197498321533, -3.157496929168701, -2.844770908355713, -2.9571187496185303, -1.8365565538406372, -2.058974027633667, -1.8734827041625977, -1.4801733493804932, -1.5197715759277344, -3.4089183807373047, -2.659240245819092, -1.3161871433258057, 2.1144587993621826, -1.197648286819458, -2.4264097213745117, -1.4878005981445312, -1.225193738937378, -1.2998156547546387, -3.0821964740753174, -1.3705337047576904, -0.06024394556879997, -0.7749933004379272, -0.8323165774345398, -1.1959781646728516, -1.152975082397461, 1.0688725709915161, 0.5407252311706543, 1.5729928016662598, -1.9761295318603516, -0.6922330260276794, -0.014015045948326588, -0.11072008311748505, -0.8325469493865967, 0.1459876000881195, 0.15852101147174835, 0.3167571425437927, 0.271232545375824, 0.08685741573572159, -0.10567887127399445, 4.366079807281494, -3.8133983612060547, 1.9354991912841797, 0.6590432524681091, 0.15178334712982178, -1.2577868700027466, 1.4220062494277954, 0.14820916950702667, 0.3068661391735077, 2.7795424461364746, 0.4177979826927185, 0.5308338403701782, -0.9165863394737244, -1.464543104171753, -1.6435383558273315, -1.4106981754302979, -1.084282398223877, -0.8663834929466248, -0.9938668012619019, -1.2448112964630127, -3.9049248695373535, -2.9579334259033203, -1.2604814767837524, -1.457514762878418, -1.3085763454437256, -1.4251024723052979, -2.9756081104278564, -2.960500478744507, 0.08075465261936188, 0.19593694806098938, -2.8579344749450684, -2.3241536617279053, -1.1857752799987793, -0.32204028964042664, -6.7069783210754395, -4.4802985191345215, 0.8465225100517273, -0.2384466826915741, 0.19520102441310883, -2.7891340255737305, -2.1869490146636963, 2.4636752605438232, 2.442392587661743]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (50, 500000), 'etaBin': (0, 0.8)}}, 'et1_eta3': {'discriminator': {'threshold': -0.12000081166625023, 'nodes': [100, 13, 1], 'bias': [0.01576770842075348, -0.17712590098381042, 0.1333610564470291, 0.055166684091091156, 0.04430213198065758, -0.011580921709537506, -0.14800608158111572, -0.005270873662084341, -0.12565214931964874, -0.0865122452378273, 0.05252000689506531, 0.22120104730129242, -0.00014748472312930971, -0.18239182233810425], 'weights': [-1.6242141723632812, -1.4964895248413086, 0.37748241424560547, 0.7470607757568359, 0.9542444944381714, 0.5318184494972229, 0.4347248375415802, 0.5383001565933228, -1.9435062408447266, -2.7042596340179443, -2.2418925762176514, 1.7174015045166016, 0.21549135446548462, 0.08604630082845688, 3.5546133518218994, 0.8935694098472595, 1.419352412223816, 4.707134246826172, 2.0739784240722656, 4.4052605628967285, 1.1195226907730103, 2.078622579574585, 1.5331175327301025, 3.9400546550750732, 3.667813539505005, 2.234042167663574, 1.2733572721481323, 2.0328524112701416, 1.737978219985962, 1.8174703121185303, 1.415321946144104, 2.052001953125, 1.0036811828613281, 1.778766393661499, 0.8040391802787781, 1.5641635656356812, 0.9708910584449768, 0.6309452652931213, 1.3382713794708252, 1.494091510772705, 1.2222161293029785, 1.5860905647277832, 1.2585562467575073, 1.5427742004394531, -0.10605103522539139, 1.9475257396697998, 0.7545058727264404, 1.1645710468292236, -0.03386295959353447, 1.4772766828536987, 0.9225281476974487, 1.2584081888198853, -0.0013007435481995344, 0.05273319408297539, 1.3612408638000488, 0.9288939833641052, -0.29872816801071167, 0.6677990555763245, 0.5154576897621155, 0.38816744089126587, 0.5626683831214905, 0.514236330986023, 0.3904486894607544, -0.38007882237434387, -0.43703773617744446, 1.1052629947662354, 1.3141889572143555, 0.4210074841976166, -1.1155036687850952, -0.9305633306503296, -1.4501405954360962, 2.397630214691162, -0.7033202052116394, -0.06572511792182922, 1.303359031677246, 1.6486235857009888, 1.6052062511444092, 1.555179238319397, 1.042755365371704, 0.60936439037323, 3.031231641769409, 4.049725532531738, 3.155161142349243, 1.3237437009811401, 1.295178771018982, 0.9450104236602783, 0.8464922904968262, 0.9597887396812439, 0.591497540473938, 1.1264482736587524, 0.3443072438240051, 0.23298604786396027, 2.815629482269287, 1.1309726238250732, 0.2059529423713684, 0.6912635564804077, 0.36232665181159973, -0.09207841008901596, -0.08863653987646103, 1.7311025857925415, 552.792236328125, 2.7643704414367676, 0.03178073465824127, 2.4510867595672607, 0.47880813479423523, 0.19967111945152283, -22.79944610595703, 0.06149303913116455, 4.637579441070557, 9.932884216308594, -0.8642027974128723, -72.0328140258789, 5.356922149658203, -10.814126968383789, -21.906282424926758, 4.461131572723389, 2.3555476665496826, -382.99676513671875, -0.7506295442581177, -118.81001281738281, -0.23603971302509308, -359.9303283691406, -238.3626251220703, -123.53948211669922, 5.906637668609619, -2.9081966876983643, -270.46624755859375, -108.27574920654297, -32.92097091674805, 0.35070714354515076, 0.06556747108697891, 0.3463708758354187, 12.028189659118652, 0.35598239302635193, 0.199430450797081, -0.16904978454113007, -7.062976360321045, 0.12747342884540558, -120.97481536865234, 0.3730243742465973, 0.13945479691028595, 0.40641385316848755, -9.401337623596191, 0.36529579758644104, 0.015359221957623959, 19.928722381591797, -0.45481184124946594, 0.12378585338592529, -0.03318038582801819, 0.37035036087036133, 0.12706786394119263, 0.31845661997795105, 0.08344756066799164, 0.05344955250620842, 0.38324278593063354, 52.608642578125, -0.10237911343574524, 0.23618148267269135, 0.17435726523399353, 0.1518622636795044, 0.029518933966755867, 0.23272207379341125, 0.17592455446720123, 0.04647079482674599, -0.09742999821901321, 0.2759542763233185, 0.25486478209495544, 1.8833415508270264, -0.2674887776374817, -0.10872107744216919, -0.2236718088388443, 0.39290904998779297, -2.1441736221313477, -0.5715833306312561, 1.0811980962753296, 1.7409107685089111, 0.4397510588169098, -0.7035594582557678, -0.04647792875766754, 0.014676590450108051, -0.33066582679748535, 0.9460379481315613, 0.7540554404258728, 0.31899482011795044, 0.2915303111076355, 0.3317646086215973, 0.2781268060207367, 0.32645830512046814, 81.83029174804688, 12.409649848937988, 0.15977266430854797, 0.1402168869972229, 0.5275840759277344, 0.21177367866039276, 0.13422362506389618, -19.29012680053711, 0.19948558509349823, -0.02666034735739231, -0.12297744303941727, 0.2627582550048828, 1.3451869487762451, 1.5398826599121094, -0.5667336583137512, -0.6756628155708313, -0.7777997851371765, -0.3610230088233948, -0.5281922817230225, -0.5053830742835999, 1.9370986223220825, 2.40655779838562, 0.9808388948440552, -0.4040254056453705, -1.6646993160247803, -0.12418182939291, -3.91359281539917, -4.555013179779053, -3.540066957473755, -4.154556751251221, -1.983077883720398, -4.430322170257568, -1.5266995429992676, -2.4847044944763184, -1.4583783149719238, -3.7185375690460205, -4.202314853668213, -2.1284139156341553, -1.2668983936309814, -2.0230956077575684, -1.3704944849014282, -1.635471224784851, -1.5790205001831055, -1.994910478591919, -0.9721395969390869, -1.833087682723999, -0.9069038033485413, -1.6374646425247192, -0.8688830137252808, -0.5770263671875, -1.3354765176773071, -1.6173791885375977, -0.5580151677131653, -1.4621177911758423, -1.1774671077728271, -1.5859581232070923, 0.17720523476600647, -1.9122381210327148, -0.8429813385009766, -1.0451874732971191, 0.08511986583471298, -1.474605679512024, -1.789915919303894, -1.2390694618225098, -0.1389285922050476, -0.12887753546237946, -1.3730297088623047, -1.5071101188659668, 0.3250204920768738, -0.8615003824234009, -0.8253448009490967, -0.7397359609603882, -0.5332510471343994, -0.7578414082527161, -0.37777265906333923, 0.4106280207633972, 0.7251321077346802, -1.2262300252914429, -1.1063522100448608, -0.5078602433204651, 1.0481419563293457, 0.3587208092212677, 1.454047441482544, -2.561699151992798, 0.14295408129692078, 0.13616083562374115, -1.2397269010543823, -1.5601950883865356, -1.6087393760681152, -1.5504231452941895, -1.082851529121399, -0.47664424777030945, -3.024127721786499, -3.9904229640960693, -3.0953497886657715, -1.2052276134490967, -1.3117115497589111, -0.5782686471939087, -0.7740269899368286, -0.9467630982398987, -0.602620005607605, -1.1237213611602783, -0.14873045682907104, -0.47934702038764954, -2.6208910942077637, -1.1959482431411743, -0.38733866810798645, -0.6369909644126892, -0.2984714210033417, -0.13217131793498993, -0.004260192159563303, -1.7349183559417725, -1.5636281967163086, -1.524303913116455, 0.46807625889778137, 0.6881670951843262, 0.8886976838111877, 0.4724058508872986, 0.4774948060512543, 0.45738154649734497, -2.127117395401001, -2.264835834503174, -2.1885218620300293, 1.5548815727233887, 1.603270411491394, 0.04921438917517662, 3.9386258125305176, 1.033981204032898, 1.5921486616134644, 4.605279445648193, 2.034390449523926, 4.340433597564697, 1.5405898094177246, 2.096177577972412, 1.5370259284973145, 3.863614797592163, 3.6669256687164307, 2.246741533279419, 1.2843917608261108, 1.9595898389816284, 1.784196138381958, 1.945350170135498, 1.416082739830017, 2.064642906188965, 1.0506212711334229, 1.6227446794509888, 1.0033318996429443, 1.505257248878479, 1.0028568506240845, 0.6274805068969727, 1.4439401626586914, 1.587863802909851, 1.1598221063613892, 1.498486876487732, 1.184914469718933, 1.7404240369796753, -0.23110359907150269, 1.8027336597442627, 0.8465827107429504, 1.158596158027649, -0.12499502301216125, 1.5345361232757568, 0.8469158411026001, 1.2177677154541016, 0.06865401566028595, 0.22658230364322662, 1.4897241592407227, 0.9931418895721436, -0.3577333986759186, 0.5338138937950134, 0.5112457871437073, 0.37899768352508545, 0.5517551302909851, 0.5024477243423462, 0.3987458348274231, -0.3087290823459625, -0.3539457619190216, 1.0673022270202637, 1.321824312210083, 0.48313379287719727, -1.1617642641067505, -0.8124355673789978, -1.4520151615142822, 2.2560794353485107, -0.6670147180557251, -0.1809217780828476, 1.1968793869018555, 1.5539358854293823, 1.595673680305481, 1.5401126146316528, 1.187708854675293, 0.5038745999336243, 3.0686442852020264, 4.123976707458496, 3.0041894912719727, 1.1848679780960083, 1.297721266746521, 0.9273462295532227, 0.7773542404174805, 0.9081366062164307, 0.43511122465133667, 1.048279047012329, 0.28002145886421204, 0.06567780673503876, 2.603466272354126, 1.3191734552383423, 0.36029869318008423, 0.6783035397529602, 0.507758378982544, 0.07470805197954178, 0.036275628954172134, 1.5847333669662476, -1.7440775632858276, -1.505877137184143, 0.2649371325969696, 0.6923153400421143, 0.8982371687889099, 0.5299132466316223, 0.5649812817573547, 0.3271094560623169, -1.9742448329925537, -2.6683623790740967, -2.206207752227783, 1.5939074754714966, 0.21798333525657654, -0.053698278963565826, 3.5577590465545654, 0.933222234249115, 1.2130160331726074, 4.714488983154297, 1.9339014291763306, 4.461015224456787, 1.089707374572754, 2.1416754722595215, 1.4641839265823364, 3.821254253387451, 3.6482670307159424, 2.0975613594055176, 1.2187036275863647, 2.120209217071533, 1.7676467895507812, 1.7264128923416138, 1.4358125925064087, 1.9669864177703857, 0.8585684299468994, 1.7845708131790161, 0.9164472222328186, 1.6152206659317017, 0.9748068451881409, 0.6214003562927246, 1.430312156677246, 1.4658796787261963, 0.9964339137077332, 1.461653709411621, 1.1086094379425049, 1.5716569423675537, -0.11820424348115921, 1.7992467880249023, 0.8248462677001953, 1.231836199760437, 0.07739429175853729, 1.6597223281860352, 0.7933809757232666, 1.3380423784255981, -0.007976951077580452, 0.10687519609928131, 1.5742518901824951, 0.9120137095451355, -0.3792531490325928, 0.5739946961402893, 0.5841264128684998, 0.3421119451522827, 0.5871232151985168, 0.6052318811416626, 0.511553943157196, -0.5025423169136047, -0.340216726064682, 1.0866056680679321, 1.2445876598358154, 0.5235912799835205, -1.1418553590774536, -0.37823212146759033, -1.3342962265014648, 2.3976669311523438, -0.5554074645042419, -0.1412772685289383, 0.9277483224868774, 1.5325767993927002, 1.633580207824707, 1.404060959815979, 0.9922519326210022, 0.4968109726905823, 3.064375162124634, 4.122241020202637, 3.1240410804748535, 1.351357340812683, 1.169669270515442, 1.125045895576477, 0.8560924530029297, 1.0059247016906738, 0.4257277250289917, 1.3129643201828003, 0.37121298909187317, -0.007078672293573618, 2.6136226654052734, 1.252180814743042, 0.1924278736114502, 0.45479774475097656, 0.4666701853275299, -0.13599362969398499, 0.052490632981061935, 1.5569227933883667, 0.11207173764705658, 1.5673251152038574, 0.21948276460170746, -0.1706579476594925, 0.20658865571022034, 0.4444074034690857, -0.06275875866413116, -0.09602004289627075, 0.4329732656478882, 0.3868177533149719, 0.5335736870765686, -1.615212082862854, -1.6560707092285156, -0.3140912353992462, -3.6353068351745605, -0.7322068214416504, -0.28341037034988403, -1.0050400495529175, -0.3419286608695984, -0.9155945777893066, -0.8803226947784424, -0.7133737802505493, -0.16435860097408295, -0.676879346370697, -0.8959323763847351, -0.2383534014225006, -0.2511528432369232, -0.3358331620693207, -0.14717106521129608, -0.296308696269989, -0.9763094782829285, -0.31645631790161133, -0.059382546693086624, -0.1863415539264679, -0.2748272716999054, -0.34713470935821533, -0.0542185939848423, -0.1688673198223114, -0.8496227264404297, -0.25317972898483276, -0.08508124947547913, -0.26484042406082153, -0.06464679539203644, -0.3290494382381439, 0.092121921479702, -0.34205880761146545, -0.0895528569817543, -0.12434211373329163, 0.03791821002960205, -0.38038498163223267, -0.5401926636695862, -0.25441575050354004, 0.09118084609508514, 0.1188853308558464, -0.166121244430542, -0.14382879436016083, 0.19497434794902802, -0.17046307027339935, 0.05484700947999954, -0.01568160206079483, -0.03641972318291664, -0.09813490509986877, -0.13234658539295197, 0.12830500304698944, 0.1137353703379631, -0.08941684663295746, -0.165379598736763, 0.05546451732516289, 0.4119976758956909, 0.24452979862689972, 0.3213237524032593, -0.3851219117641449, -0.028218602761626244, 0.11134273558855057, -0.03273233771324158, -0.2635450065135956, -0.27601709961891174, -0.2385721355676651, -0.25492680072784424, 0.04179928079247475, 0.6108481884002686, -0.646676778793335, -0.6546499729156494, -0.26968488097190857, -0.1279374063014984, -0.03908933326601982, -0.09513313323259354, -0.1315973550081253, 0.35041600465774536, 0.07261974364519119, 0.13131588697433472, 0.0683763399720192, -0.28039631247520447, -0.06540018320083618, 0.0860893726348877, 0.01173508632928133, 0.05043424665927887, 0.0319412499666214, 0.44078320264816284, -0.22699443995952606, 0.569207489490509, 10.118484497070312, 0.5869184732437134, -0.23266395926475525, -0.22150415182113647, 0.11243846267461777, -0.08446071296930313, 0.03232450410723686, -0.14664967358112335, 1.566145658493042, 0.8566641807556152, -4.340214729309082, -1.0850410461425781, -0.9245840311050415, -8.765680313110352, -2.57635760307312, -0.8307259678840637, -1.5788475275039673, -0.10425139963626862, -1.879743218421936, -1.6567991971969604, -1.7835394144058228, -0.658108115196228, -1.1952704191207886, -17.831636428833008, -0.9914507865905762, -39.30318832397461, -0.6488813161849976, -17.420658111572266, -0.7398617267608643, -8.333794593811035, -0.7403357625007629, -0.41006144881248474, -0.6084940433502197, -0.3199058473110199, -0.705725371837616, -0.09825854748487473, -0.2415328025817871, -0.16026397049427032, -0.5344529747962952, -0.30099567770957947, -0.5692082047462463, -0.3368820250034332, -0.700025737285614, 0.38944900035858154, -0.6970731019973755, -0.22601492702960968, -0.29214417934417725, 0.19525261223316193, -0.4706447124481201, -2.170785427093506, -0.4108344316482544, 0.15164020657539368, 0.08020782470703125, -1.3762803077697754, -0.3609658181667328, 0.31938210129737854, -0.16691942512989044, -0.2319401353597641, -0.10534583777189255, 0.0004285731993149966, -0.17633305490016937, 0.015866998583078384, 0.30904003977775574, 0.5252588391304016, -0.3907189667224884, -0.41111278533935547, -0.06981083005666733, 0.7134514451026917, 0.25976642966270447, 0.7031596302986145, -0.325287401676178, -0.282072514295578, -0.08061013370752335, -0.2923697233200073, -0.6317827701568604, -0.716009259223938, -0.6643671989440918, -0.4638528823852539, -0.0693204402923584, -1.4576201438903809, -1.7735381126403809, -1.2580504417419434, -0.3902900516986847, -0.3694489896297455, -0.4418288469314575, -0.17822803556919098, -0.3224373161792755, -0.07440484315156937, 0.07097062468528748, 0.03084496408700943, 0.1774269938468933, -1.1567301750183105, -0.3372563421726227, 0.06563237309455872, -0.026887614279985428, 0.022859806194901466, 0.04626991227269173, 0.13664039969444275, -0.6153284311294556, 0.19879627227783203, 0.49912333488464355, 0.15074574947357178, -0.1389814019203186, 0.2656807601451874, 0.3537868559360504, -0.07524000108242035, -0.02653874270617962, 0.04904153198003769, -0.014147642999887466, 0.036865849047899246, -0.2073207050561905, -4.319263935089111, -0.09087192267179489, 0.4187915623188019, -0.6202352046966553, -0.0365801639854908, 0.03477364033460617, 0.07524202018976212, -0.15304630994796753, -1.084322214126587, -0.5789081454277039, -0.017221834510564804, -0.11415266245603561, -0.3979513645172119, -0.0009047755738720298, -0.08691267669200897, 0.07778538018465042, 0.08316941559314728, 0.013613002374768257, -0.39775756001472473, -0.10488886386156082, -0.07013958692550659, 0.006998687516897917, -0.29658201336860657, 0.051460158079862595, -0.09595461189746857, 0.04474246874451637, -0.8101599812507629, 0.002780354116111994, 0.02211136929690838, -0.01593831367790699, -0.02383730746805668, -0.12470965087413788, 0.03665545955300331, -0.15279939770698547, 0.04156281426548958, -0.10346100479364395, 0.12897290289402008, 0.006309210788458586, -0.6199628710746765, -0.11041916161775589, 0.11414217203855515, -0.031745944172143936, -0.06135125830769539, 0.03421567752957344, 0.11457649618387222, 0.10210516303777695, 0.04936494678258896, 0.04891703277826309, 0.03114130161702633, -0.06390345096588135, 0.11051042377948761, -0.055351242423057556, 0.1513061672449112, -0.07033836096525192, 0.07845842838287354, 0.13343358039855957, 0.18489046394824982, -0.05284982547163963, 0.12340499460697174, -0.005748967174440622, -0.02615467831492424, 0.03903046250343323, 0.027949120849370956, -0.14660902321338654, -0.13830402493476868, -0.06515458971261978, -0.09806390851736069, 0.12094021588563919, 1.3407784700393677, -0.06484344601631165, -0.20136243104934692, 0.06163958087563515, 0.10626552253961563, 0.038034453988075256, -0.011921621859073639, 0.05996355414390564, 0.31614866852760315, 0.14564809203147888, 0.017926644533872604, -0.030957091599702835, 0.020635919645428658, -0.08232193440198898, -0.07647424191236496, -0.15627843141555786, 0.013405008241534233, -0.11506153643131256, -0.06344332545995712, -0.06442835927009583, -1.6948215961456299, -1.374026894569397, 0.45735812187194824, 0.7441738247871399, 0.926918625831604, 0.5328865647315979, 0.6245124936103821, 0.6043076515197754, -1.9460148811340332, -3.728248119354248, -0.8666092753410339, 0.32013753056526184, 1.814964771270752, 0.08204898983240128, 3.5145561695098877, 4.606217861175537, 1.6926093101501465, 4.154201030731201, 2.084848642349243, 4.394313812255859, 2.1543452739715576, 2.3002374172210693, 1.5719012022018433, 3.7970693111419678, 3.478036403656006, 2.2518043518066406, 1.1834920644760132, 1.9087597131729126, 1.5292699337005615, 1.713663935661316, 0.7750661969184875, 2.0037338733673096, 0.9753880500793457, 1.8458985090255737, 0.7545556426048279, 1.5309269428253174, 1.0138039588928223, 0.779555082321167, 1.324082612991333, 1.5432661771774292, 1.2808539867401123, 1.302045226097107, 1.2884753942489624, 1.5711995363235474, -0.05899054557085037, 1.9335743188858032, 0.8873742818832397, 1.0036513805389404, 0.06123936548829079, 1.6129034757614136, 1.7194935083389282, 1.3282191753387451, 0.10062761604785919, 0.179970845580101, 2.2549612522125244, 1.5311799049377441, -0.4092741310596466, 0.9473189115524292, 0.9941576719284058, 0.5455511808395386, 0.43860843777656555, 0.469561368227005, 0.47462910413742065, -0.509946882724762, -0.41698065400123596, 1.1551569700241089, 1.159548282623291, 0.4582456648349762, -1.1753933429718018, -0.8450286984443665, -1.585595726966858, 2.9577999114990234, -0.6436326503753662, -0.17514505982398987, 1.5109885931015015, 1.5636075735092163, 1.7329803705215454, 1.5543644428253174, 1.0518341064453125, 0.4883584976196289, 2.5242295265197754, 4.147961139678955, 2.9376206398010254, 1.3096472024917603, 1.2615928649902344, 0.5879326462745667, 0.8940541744232178, 1.0711349248886108, 0.46630460023880005, 1.2440662384033203, 0.340199738740921, 0.11749430000782013, 2.7758820056915283, 1.200555443763733, 0.2967906594276428, 0.6783573627471924, 0.48993897438049316, 0.10238969326019287, -0.011745195835828781, 1.5402342081069946, -1.4734909534454346, -1.3780670166015625, 0.4619764983654022, 0.7953463792800903, 1.0563148260116577, 0.370169997215271, 0.5685901045799255, 0.4622335433959961, -2.030644178390503, -2.401200771331787, -0.957638144493103, 1.569664716720581, 1.6778439283370972, 0.1335846483707428, 3.960793972015381, 4.675021648406982, 3.5973570346832275, 4.142901420593262, 2.0527288913726807, 4.457016468048096, 1.5721279382705688, 2.3970298767089844, 1.5058456659317017, 3.721092939376831, 4.240220546722412, 2.1291346549987793, 1.2269959449768066, 2.0664103031158447, 1.756988763809204, 1.6647372245788574, 1.3654842376708984, 2.0576062202453613, 0.9074469208717346, 1.802932858467102, 0.8626964688301086, 1.5198301076889038, 1.0907427072525024, 0.5751223564147949, 1.4303526878356934, 1.53548002243042, 0.9767692685127258, 1.3242193460464478, 1.1571396589279175, 1.6120322942733765, -0.13162536919116974, 1.6732239723205566, 0.7331457138061523, 1.1402865648269653, -0.08006050437688828, 1.6901044845581055, 0.6937851905822754, 1.3397859334945679, 0.011032379232347012, 0.05293005332350731, 1.2205897569656372, 1.3738906383514404, -0.3984019458293915, 0.9045627117156982, 0.7442097663879395, 0.30125802755355835, 0.3498018682003021, 0.420055627822876, 0.5645756125450134, -0.4032018482685089, -0.2462673783302307, 1.0896871089935303, 1.2518011331558228, 0.4280555546283722, -1.1818678379058838, -0.9058977365493774, -1.6089688539505005, 2.4408814907073975, -0.616915225982666, -0.06590677797794342, 1.4060014486312866, 1.7127970457077026, 1.6957112550735474, 1.6063036918640137, 1.0776170492172241, 0.658760130405426, 3.0399088859558105, 4.112060070037842, 3.030510425567627, 1.3490625619888306, 1.362789273262024, 0.6233588457107544, 0.793054461479187, 0.9226189851760864, 0.41492846608161926, 1.0315072536468506, 0.22529368102550507, 0.09893400222063065, 2.512591600418091, 1.1801563501358032, 0.3042181730270386, 0.4467712342739105, 0.40187403559684753, -0.06129360944032669, -0.02255595661699772, 1.7093428373336792, -1.6432732343673706, -1.585505485534668, 0.4455070197582245, 0.6441716551780701, 1.0770249366760254, 0.5162317752838135, 0.6279934048652649, 0.4914849102497101, -2.109876871109009, -2.7053401470184326, -2.3338234424591064, 1.7057536840438843, 0.20316848158836365, -0.01807522587478161, 3.4759607315063477, 1.0748878717422485, 1.274013638496399, 4.655988693237305, 2.0632402896881104, 4.5135416984558105, 0.9690438508987427, 2.043833017349243, 1.6856648921966553, 3.8168728351593018, 3.757876396179199, 2.3390259742736816, 1.3626359701156616, 2.087589740753174, 1.7162327766418457, 1.9472029209136963, 1.437515139579773, 2.0037448406219482, 1.0522329807281494, 1.859933614730835, 0.9110863208770752, 1.652016520500183, 1.028664469718933, 0.6730564832687378, 1.3714547157287598, 1.6440644264221191, 1.0050503015518188, 1.535170316696167, 1.1386771202087402, 1.571481466293335, -0.26906633377075195, 2.007200241088867, 0.97314453125, 1.1479214429855347, -0.033159784972667694, 1.6762545108795166, 0.7559630870819092, 1.3668254613876343, 0.17066365480422974, 0.030890384688973427, 2.1763641834259033, 0.9327290058135986, -0.4737824499607086, 0.7423145771026611, 0.5662016868591309, 0.4495573043823242, 0.5087298154830933, 0.5781282186508179, 0.395752489566803, -0.39331531524658203, -0.29981517791748047, 1.2254409790039062, 1.13060462474823, 0.35779711604118347, -1.211405873298645, -0.8227726817131042, -1.6215662956237793, 2.342751979827881, -0.6547279953956604, -0.09885267913341522, 1.28086519241333, 1.5423967838287354, 1.6239371299743652, 1.49622642993927, 1.1781095266342163, 0.6366270780563354, 2.9106123447418213, 4.010722637176514, 3.0326154232025146, 1.1186727285385132, 1.242163062095642, 1.0580123662948608, 0.9041142463684082, 0.9899135231971741, 0.5209850072860718, 0.9766155481338501, 0.17762179672718048, 0.09583786129951477, 2.616609811782837, 1.2277886867523193, 0.3185042440891266, 0.49217161536216736, 0.3211157023906708, 0.09509262442588806, -0.09274669736623764, 1.6018213033676147, -552.864501953125, -89.66056823730469, -0.11743012815713882, -2.334815502166748, -0.2966395616531372, -0.03662319853901863, 42.54216003417969, -0.13022921979427338, 0.2541114091873169, -2.4763221740722656, 0.7610852122306824, 54.44601821899414, -5.226278781890869, 10.895147323608398, 254.3391571044922, -4.229949474334717, 4.767922878265381, 22.331096649169922, 0.5956622362136841, 116.17454528808594, 0.10975602269172668, 0.4308340847492218, -0.09527736902236938, 81.89161682128906, -4.8345947265625, -0.4923328161239624, 256.7643737792969, 107.61156463623047, 32.51325607299805, -0.2517307698726654, -0.10120502859354019, -0.31792065501213074, -6.690577507019043, -0.21603195369243622, -0.05702843517065048, -0.12909549474716187, 1.0213677883148193, -0.002027353970333934, 116.52684020996094, -0.36094701290130615, -0.12765632569789886, -0.3591914772987366, 5.100647926330566, -0.4217729866504669, 0.15308904647827148, -78.20451354980469, 0.951957106590271, -0.3251190185546875, 0.08644768595695496, -0.33919963240623474, -0.05406152084469795, -0.2206450253725052, -0.10779125243425369, -0.07888578623533249, -0.36401933431625366, -0.3730511963367462, 0.03132060170173645, -0.15898336470127106, -0.1694311797618866, -0.06712400913238525, -0.10189072042703629, -0.0068391598761081696, -0.06516451388597488, 0.1782175898551941, 0.21338370442390442, -0.2712914049625397, -0.29605811834335327, -17.021631240844727, 0.14963530004024506, -0.022046484053134918, 0.4077531695365906, -0.2888941764831543, 1.3947776556015015, 0.5609872937202454, -10.491022109985352, -0.40771394968032837, -9.830562591552734, 0.5514671802520752, -0.06376117467880249, -0.1530449390411377, -0.6828411817550659, -0.7085099220275879, -0.5495133996009827, -0.18635305762290955, -0.3539504408836365, -0.35058078169822693, -0.258853554725647, -0.21096371114253998, -103.15705871582031, -17.2119083404541, -0.171717569231987, -0.14994323253631592, -0.5220857262611389, -0.14971013367176056, -0.16776955127716064, 24.485219955444336, -0.12893813848495483, -0.05572142452001572, -0.09593889117240906, -0.28193774819374084, -0.3820389211177826, 0.020328717306256294, -0.18613170087337494, -0.089986152946949, -0.21945148706436157, -0.49083277583122253, -0.015738744288682938, -0.0071320682764053345, 0.029002400115132332, -0.019386347383260727, -0.26510390639305115, 1.1224726438522339, 6.664980888366699, 0.6481620073318481, -2.431462049484253, 0.677589476108551, -0.06548326462507248, -0.13572005927562714, -0.08753036707639694, 0.12488378584384918, 0.18689033389091492, 0.43816304206848145, -0.0063032894395291805, 0.03186273202300072, 0.39663681387901306, 0.08504485338926315, 0.07693356275558472, 0.09288141876459122, -0.076265349984169, -0.037395354360342026, 0.19528652727603912, -0.06863228231668472, 0.14609447121620178, -0.08660196512937546, 0.23252668976783752, -0.03541788086295128, -0.057179808616638184, 0.08873672038316727, 0.8471117615699768, 0.11827612668275833, 0.03169577196240425, -0.10762202739715576, -0.009779691696166992, -0.06842096894979477, 0.0792987123131752, -0.0782332643866539, 0.0766831785440445, 0.10943435877561569, -0.06310806423425674, -0.10216032713651657, 0.713716983795166, 0.09118673205375671, -0.031047694385051727, -0.11960230022668839, 0.3543779253959656, 0.12408443540334702, -0.11377641558647156, -0.09686360508203506, 0.07073569297790527, -0.06876904517412186, -0.008683153428137302, -0.10921872407197952, -0.013554458506405354, -0.06658368557691574, -0.09150417149066925, 0.08272112160921097, 0.06052215397357941, 0.012413851916790009, 0.03385744243860245, 0.017742592841386795, -0.03555351868271828, 0.0060442909598350525, 0.2159235030412674, -0.2910517752170563, 0.040971118956804276, 0.051287490874528885, -0.07658003270626068, -0.00937520619481802, 0.032818544656038284, -0.0017873405013233423, -1.3051505088806152, 0.011788404546678066, 0.016169341281056404, -0.1182766780257225, 0.002938428893685341, 0.06404751539230347, -0.13711322844028473, 0.03153100982308388, -0.1480286419391632, -0.18700993061065674, 0.07585188746452332, -0.18576261401176453, -0.030102837830781937, -0.03429120406508446, 0.06768222898244858, -0.06672611832618713, -0.06789281964302063, -0.032425131648778915, 0.09039555490016937, -0.0841752365231514, -0.5628393292427063, -0.2998746335506439, 0.7201017141342163, -0.6106091141700745, -1.2528587579727173, 2.5749545097351074, 0.2486107051372528, 0.003795512719079852, -0.6725246906280518, -0.6740331649780273, -0.7349206805229187, 0.3413822054862976, -3.0800232887268066]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (20, 30), 'etaBin': (1.54, 2.5)}}, 'et4_eta2': {'discriminator': {'threshold': -0.14500080645084382, 'nodes': [100, 5, 1], 'bias': [0.07917795330286026, -0.11831410974264145, 0.02653731033205986, 0.037854090332984924, 0.0019815023988485336, -0.3486272096633911], 'weights': [0.19843904674053192, -0.058875974267721176, -0.04326336458325386, -0.11321347951889038, -0.22157005965709686, -0.10730722546577454, 0.3745001554489136, -0.2558435797691345, 0.1424679458141327, 1.0263217687606812, 0.6999816298484802, 0.30600643157958984, 0.07806351780891418, 0.08327186852693558, -0.1777438074350357, 0.10038430243730545, -0.5248778462409973, -0.038612525910139084, -0.39872047305107117, -0.28444749116897583, -0.9980010986328125, -1.5127053260803223, 0.1979541778564453, -0.32997938990592957, -0.3489316999912262, -0.15367491543293, -2.2198708057403564, -0.26825016736984253, -2.7749743461608887, -0.8617600202560425, -0.09909697622060776, -0.17918868362903595, -0.18626078963279724, -0.14524361491203308, -0.15213170647621155, -0.29111459851264954, -1.9678081274032593, -0.2911415696144104, -0.33365485072135925, -0.15995465219020844, -0.17492829263210297, -1.3340978622436523, -0.605542778968811, -0.25727397203445435, -0.29796531796455383, -0.2302875965833664, -1.5060298442840576, -0.16948801279067993, 0.9827492237091064, -0.11198002845048904, -0.14857470989227295, -0.1308097541332245, -0.5809677243232727, -0.2103646844625473, 0.06424117088317871, 3.1437878608703613, -0.25365424156188965, 0.011770646087825298, 0.7938454747200012, -0.24619118869304657, 0.03621393069624901, -0.2733103036880493, -0.3014981746673584, -0.14885523915290833, -0.5823711156845093, -0.43225881457328796, -0.6819719672203064, -0.22043395042419434, -0.239812433719635, -0.24446256458759308, -0.19261875748634338, -0.09331440925598145, -0.0354016087949276, 0.1703440248966217, -0.4293913245201111, -0.3520030379295349, -0.6189568042755127, -0.2027088701725006, -0.16495664417743683, -0.09841347485780716, 0.11157503724098206, -0.143389493227005, -1.2832545042037964, -0.2871471047401428, 0.2769422233104706, 0.8271965384483337, -0.18569205701351166, -0.12356787174940109, 0.006625983398407698, -0.12885113060474396, -0.1413503736257553, -0.06292189657688141, -1.196790099143982, -0.5923837423324585, -0.37488433718681335, -0.08503884077072144, 0.061679136008024216, -0.005496353842318058, -0.4499998390674591, -0.3197402060031891, 0.6277943253517151, -0.10406453162431717, -0.3655036389827728, -1.0510603189468384, -1.1635586023330688, -0.7228602170944214, 2.0800740718841553, -0.9477074146270752, 0.24350564181804657, 1.4949134588241577, 3.0407767295837402, 1.0606045722961426, 0.6999744176864624, 0.07677821069955826, 0.13364534080028534, 0.20846040546894073, -2.300600051879883, 0.02978888340294361, -0.645549476146698, -0.9755619168281555, -4.458914279937744, -7.862541675567627, 0.6324165463447571, -1.301794409751892, -1.0996429920196533, -1.024741530418396, -11.186277389526367, -1.0049670934677124, -12.887227058410645, -3.7494685649871826, -0.8687475919723511, -1.3223682641983032, -0.867615282535553, -0.8138494491577148, -1.028181791305542, -0.8000075221061707, -9.404091835021973, -1.0163896083831787, -1.445360541343689, -0.6547778248786926, -0.7807666659355164, -5.904367923736572, -2.501373291015625, -1.5232384204864502, -1.0277657508850098, -0.9240407943725586, -7.114432334899902, -0.6644827127456665, 4.936777591705322, -0.9329755902290344, -0.8921515941619873, -0.8116706609725952, -3.0774483680725098, -0.9190694093704224, -0.07221107184886932, 14.74031925201416, -0.9749648571014404, -0.1763647496700287, 12.005014419555664, -0.8935961723327637, 0.6402859687805176, -1.0257129669189453, -1.181807518005371, -0.9516039490699768, -3.1304805278778076, -1.4402759075164795, -3.6530215740203857, -0.8244721293449402, -0.8461655974388123, -0.6997277140617371, -1.0689067840576172, -0.8016883134841919, 0.3022933006286621, 0.32295846939086914, -1.5995917320251465, -1.2440654039382935, -2.8085544109344482, -1.2667522430419922, -0.9192014336585999, -0.2858508825302124, 0.234048992395401, -0.26895758509635925, -6.08580207824707, -1.4630569219589233, 2.323629379272461, 4.4118242263793945, -0.781417727470398, -0.16982564330101013, 0.6514472961425781, -0.9848294258117676, -0.6113961935043335, 0.18455840647220612, -6.346983432769775, -3.0930964946746826, -2.12569260597229, -0.825966477394104, -0.03689870238304138, -0.05597178637981415, -1.7091572284698486, -0.8694016337394714, 0.538478672504425, -0.29178640246391296, -0.4680575132369995, -1.1599676609039307, -1.1469377279281616, -0.890026330947876, 1.9173754453659058, -0.9527194499969482, 0.24605567753314972, 1.3845936059951782, 2.9548888206481934, 0.8911598324775696, 0.5366544723510742, 0.13727369904518127, 0.03529117628931999, 0.36252060532569885, -2.377124309539795, 0.017898760735988617, -0.5337632894515991, -0.9570571184158325, -4.513769149780273, -7.736189365386963, 0.6784204840660095, -1.1835755109786987, -1.0912556648254395, -1.4223910570144653, -11.407207489013672, -1.0612695217132568, -12.851149559020996, -3.981472969055176, -0.9559224843978882, -1.2679510116577148, -1.0460032224655151, -0.7622424364089966, -1.0731977224349976, -0.952303946018219, -9.278315544128418, -0.9659073948860168, -1.3613336086273193, -0.4313996434211731, -0.8500753045082092, -5.89675760269165, -2.688828468322754, -1.5145313739776611, -0.9691314101219177, -0.9684584140777588, -7.193000793457031, -0.6728978157043457, 4.875428199768066, -0.8902928233146667, -0.8915324211120605, -0.6865395903587341, -3.149742841720581, -1.0453267097473145, -0.06865935027599335, 14.666970252990723, -0.9149070382118225, -0.30999842286109924, 12.11669921875, -1.038794994354248, 0.6735774278640747, -1.0106775760650635, -1.03125, -0.855364978313446, -3.305170774459839, -1.5760698318481445, -3.4677438735961914, -0.8828592896461487, -0.9409480690956116, -0.6717583537101746, -1.1452490091323853, -0.724443793296814, 0.09653688967227936, 0.3005527853965759, -1.504169225692749, -1.3878728151321411, -2.634042501449585, -1.2404276132583618, -1.0747389793395996, -0.7351477146148682, 0.2935914099216461, -0.1825401782989502, -6.09831428527832, -1.4852796792984009, 2.2743186950683594, 4.412333965301514, -0.8675190210342407, -0.14960786700248718, 0.6853855848312378, -0.9687178730964661, -0.5718677639961243, 0.1714552789926529, -6.306363105773926, -3.0675199031829834, -1.962223768234253, -0.7187012434005737, 0.09421937167644501, 0.0514395497739315, -1.6508066654205322, -1.0744011402130127, 0.5221546292304993, -0.1688251942396164, -0.2852502763271332, -1.1912262439727783, -1.1741142272949219, -0.8497717380523682, 2.0628299713134766, -0.9573359489440918, 0.1239398643374443, 1.39858877658844, 3.0097548961639404, 0.8631302118301392, 0.545143187046051, 0.17631390690803528, -0.1239486038684845, 0.3684420585632324, -2.429640769958496, -0.03239741176366806, -0.5000216364860535, -0.9886659383773804, -4.448267459869385, -7.8853678703308105, 0.4418301582336426, -1.3391191959381104, -1.3216300010681152, -1.2984806299209595, -11.182941436767578, -0.9329841136932373, -12.91749095916748, -3.9666085243225098, -0.9302960634231567, -1.3476884365081787, -0.9111068844795227, -0.80168616771698, -1.1871225833892822, -0.8475130200386047, -9.280434608459473, -1.1822551488876343, -1.2640880346298218, -0.5527045130729675, -0.8045503497123718, -5.992523670196533, -2.5902857780456543, -1.463446855545044, -1.0229277610778809, -0.944084644317627, -7.133020877838135, -0.782139778137207, 4.848005771636963, -1.0444939136505127, -0.7845062017440796, -0.13820376992225647, -3.2052440643310547, -0.9270139932632446, 0.058824386447668076, 14.628971099853516, -0.9205606579780579, -0.20612655580043793, 4.048259735107422, -0.8629136085510254, 0.7893847227096558, -0.8947634696960449, -1.1829833984375, -0.8525384068489075, -3.2257721424102783, -1.59385085105896, -3.6080033779144287, -0.8026497960090637, -0.9271995425224304, -0.7118434309959412, -0.9384663701057434, -0.6680995225906372, 0.20856314897537231, 0.3579999804496765, -1.6446177959442139, -1.3325717449188232, -2.8000986576080322, -1.323870062828064, -0.8808022737503052, -0.6807488203048706, 0.30382585525512695, -0.8766505122184753, -6.005836486816406, -1.2826693058013916, 2.448645830154419, 4.384418964385986, -0.9507842063903809, -0.22881141304969788, 0.5134653449058533, -0.9616960883140564, -0.7230673432350159, 0.11827108263969421, -6.438907146453857, -3.122575521469116, -2.015510320663452, -0.7925659418106079, 0.01845378428697586, 0.10577049106359482, -1.6219987869262695, -0.8885412812232971, -0.3990319073200226, 0.1610254943370819, 0.3931426405906677, 1.0031417608261108, 1.1299707889556885, 0.7007510662078857, -1.9989891052246094, 0.7475440502166748, -0.24501515924930573, -1.3563021421432495, -2.9222452640533447, -0.8815038800239563, -0.6206080913543701, -0.09661660343408585, 0.03201199322938919, -0.22039464116096497, 2.4530599117279053, 0.1538521945476532, 0.4481150805950165, 0.8931834697723389, 4.328883647918701, 7.734996318817139, -0.6424065232276917, 1.1826496124267578, 1.3137836456298828, 1.3616467714309692, 11.386146545410156, 1.080670952796936, 12.866631507873535, 3.9327449798583984, 1.060046672821045, 1.17130708694458, 0.8657472729682922, 0.7906845808029175, 1.0713013410568237, 1.0066542625427246, 9.36905574798584, 1.1339709758758545, 1.4620819091796875, 0.5239474177360535, 0.7948567271232605, 6.029382228851318, 2.539458751678467, 1.3745920658111572, 0.8908397555351257, 1.049965262413025, 7.19590950012207, 0.6697745323181152, -4.869314670562744, 1.0591723918914795, 0.8253028392791748, 0.7593411207199097, 3.0658555030822754, 1.0158782005310059, 0.1413022130727768, -14.779873847961426, 0.823947012424469, 0.20322173833847046, -4.047779083251953, 0.9640843868255615, -0.6722579002380371, 1.0212986469268799, 1.1114691495895386, 0.9280045032501221, 3.092660665512085, 1.6551597118377686, 3.593964099884033, 0.7618563771247864, 0.9365280270576477, 0.6471535563468933, 1.1175612211227417, 0.6640381813049316, -0.24009032547473907, -0.47837749123573303, 1.5553977489471436, 1.4176009893417358, 2.7892978191375732, 1.2938426733016968, 1.1021111011505127, 0.644943356513977, -0.3228708803653717, 0.1429155170917511, 6.081678867340088, 1.3728801012039185, -2.3426244258880615, -4.3570942878723145, 0.8937885761260986, 0.24191537499427795, -0.5800982713699341, 0.9014846086502075, 0.588697612285614, -0.31642162799835205, 6.248983860015869, 3.1653358936309814, 2.141467809677124, 0.7257773876190186, 0.08191932737827301, 0.0024512677919119596, 1.7630603313446045, 0.9945467114448547, 0.042988210916519165, 14.605488777160645, 2.8634936809539795, 2.8143715858459473, -2.6142516136169434]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (50, 500000), 'etaBin': (1.37, 1.54)}}, 'et2_eta1': {'discriminator': {'threshold': -0.080000812560319906, 'nodes': [100, 9, 1], 'bias': [0.1834578812122345, 0.038406264036893845, 0.2277717888355255, -0.11224567145109177, -0.032732654362916946, -0.13294199109077454, -0.0878298208117485, -0.03744007274508476, -0.2362646758556366, -0.38488686084747314], 'weights': [0.004499542061239481, -1.9415453672409058, -0.30703845620155334, 0.1669836789369583, 0.16948339343070984, 0.3984569013118744, 0.31329405307769775, -0.35503950715065, -15.21175479888916, -8.14402961730957, 0.7569541931152344, 36.71369934082031, 1.1281871795654297, 0.5330346822738647, 3.3125078678131104, 5.399392127990723, 5.428003311157227, 2.7117762565612793, 2.896425724029541, 2.153343915939331, 2.2664084434509277, 2.3275535106658936, 0.6963872313499451, -1.242303729057312, 1.416195034980774, -0.4414708614349365, 1.6310455799102783, 1.647055745124817, 1.0301884412765503, 1.561370611190796, 0.6816695928573608, -0.06212157383561134, 1.190083384513855, 0.9948219656944275, 0.5635619163513184, 0.48699843883514404, 0.6377851963043213, 1.1684753894805908, 0.5559937357902527, 1.7703348398208618, 0.4505130648612976, 0.530821681022644, 0.4961338937282562, 0.49482065439224243, 1.167014241218567, 0.4118550717830658, 0.2557421624660492, 1.4883331060409546, 0.22240997850894928, 0.3126266300678253, 0.16667155921459198, 0.0696839913725853, 0.045265376567840576, 0.19445180892944336, 2.012479066848755, 0.5592862963676453, 0.1429232805967331, -2.3565707206726074, 3.2528812885284424, -1.3066539764404297, 0.04093802347779274, 0.03383617848157883, 0.327037513256073, -0.10088060796260834, -0.1659843921661377, 1.8148635625839233, 10.08419418334961, 0.91677325963974, -0.31926605105400085, -0.038209520280361176, 0.335633248090744, -0.06547890603542328, -0.1458699107170105, 0.0707988440990448, 1.649000883102417, 0.4053569436073303, 0.6100645065307617, 0.5359510183334351, 0.07217152416706085, -0.136271670460701, 2.146354913711548, 2.5029799938201904, 1.5638030767440796, 1.088937759399414, 0.9201000928878784, 0.8669834136962891, 0.662987232208252, 1.0024718046188354, 0.6455403566360474, 1.2433773279190063, 0.3235679268836975, -0.19345244765281677, 0.9573050141334534, 0.8204120993614197, 0.25753602385520935, -0.20892475545406342, 1.1113395690917969, -8.521957397460938, 0.4651676118373871, 0.1444692462682724, -1.5022149085998535, -1.8229855298995972, 0.3492593765258789, 0.798374593257904, 0.8134347796440125, 0.47272565960884094, 0.5776800513267517, -0.2740126848220825, -2.629077196121216, -3.1090006828308105, 1.347335934638977, 4.013919353485107, 0.1908143311738968, -1.2652533054351807, 0.6310298442840576, 3.076305866241455, 2.557399034500122, 5.316928863525391, 6.355111598968506, 6.001584529876709, 5.763666152954102, 5.0943450927734375, 3.4046876430511475, 3.0425665378570557, 4.555365562438965, 0.1102314442396164, 4.8203043937683105, 3.7742035388946533, 3.40641450881958, 3.8364181518554688, 2.3925251960754395, 2.232933521270752, 4.025863170623779, 2.707824468612671, 1.6952582597732544, 1.9400101900100708, 3.73349666595459, 5.0669403076171875, 2.0745110511779785, 1.8654143810272217, 1.674062728881836, 1.5602108240127563, 2.8395001888275146, 1.402117371559143, 1.5328067541122437, 0.9909412860870361, 1.4280707836151123, 3.229188919067383, 0.8169304728507996, 1.0814898014068604, 0.6663644313812256, 0.668704628944397, 0.3052811622619629, 0.45168256759643555, 1.1257872581481934, 0.9267649054527283, 0.5674657821655273, -0.4290004372596741, 2.251713991165161, -2.0806214809417725, 0.23142021894454956, 0.2799263298511505, 1.5346530675888062, 0.12800148129463196, 0.17600910365581512, 1.8786375522613525, 2.9274871349334717, 2.382244348526001, -0.25315797328948975, 0.1466868370771408, 1.08413827419281, 0.3730648458003998, -0.4525236487388611, -0.3664560317993164, 0.563310980796814, 1.2535595893859863, 1.6344081163406372, 1.5166316032409668, 0.8127090930938721, 0.6384350061416626, 0.4925779104232788, 6.269612789154053, 3.8223912715911865, 2.513105630874634, 2.285754919052124, 2.351311206817627, 2.1976170539855957, 2.7794792652130127, 1.912764549255371, 1.0071821212768555, 0.12011672556400299, -0.0437142550945282, 2.90798282623291, 2.4290592670440674, 1.2592779397964478, 0.18222394585609436, 2.6393823623657227, 1.9669933319091797, 1.472691297531128, 0.6444822549819946, 28.41168785095215, 47.43718338012695, 13.47498893737793, 0.013317426666617393, 0.196879580616951, -0.12371323257684708, 0.0226189736276865, 0.5873128771781921, 0.09287849068641663, -5.849676609039307, -19.8280029296875, -68.08638000488281, -0.6993151307106018, -19.96688461303711, -25.044160842895508, -26.023447036743164, -21.507848739624023, -1.086702823638916, -0.9635292887687683, -1.2544578313827515, -1.0003620386123657, -0.9917522668838501, -0.894866943359375, -0.6843815445899963, -0.8408843874931335, -0.6775660514831543, -0.9608429074287415, -0.7371110916137695, 11.42117977142334, 3.594266176223755, -0.5161185264587402, -0.8242433071136475, -0.4583587646484375, -0.42477867007255554, 0.9191774725914001, -0.2670925557613373, -0.5567941665649414, 97.39399719238281, -0.4116446375846863, -0.3808867633342743, -0.3668149709701538, -0.22649337351322174, -0.22388523817062378, 0.4518795609474182, -0.46158498525619507, 110.1222152709961, -0.49389466643333435, -0.8184410333633423, -0.32555973529815674, -0.05224964767694473, -0.20526716113090515, -12.303352355957031, -0.040718384087085724, -0.11035522073507309, -0.21083015203475952, 79.80033874511719, 88.04261779785156, 0.540647029876709, 0.0693846046924591, 0.4059399962425232, 0.1039746105670929, -0.10286895185709, -0.13233275711536407, 0.09262023121118546, 91.39602661132812, 70.29059600830078, -0.16574479639530182, -0.554405927658081, 47.85167694091797, -36.75209045410156, -0.15515011548995972, 0.0975303053855896, 0.11210978776216507, -0.18740850687026978, -0.3541460633277893, -0.32059091329574585, -0.2577117681503296, -0.23744109272956848, -0.1360265463590622, -0.010025538504123688, -1.3780848979949951, 0.0021154675632715225, -0.9787189364433289, -0.5059293508529663, -6.785722255706787, -0.4535842835903168, -0.27630648016929626, -0.45833268761634827, -0.5230143666267395, -0.07583164423704147, 0.08355328440666199, 0.171754390001297, -0.5364022254943848, -0.3701072931289673, -0.21269479393959045, 0.10152851045131683, -0.4154379069805145, -7.532531261444092, -9.859244346618652, 0.03940296545624733, -1.2337274551391602, -0.4335934519767761, 0.9166411757469177, 0.7453747987747192, 0.5866844654083252, 0.3642278015613556, 0.32438454031944275, -0.23731689155101776, -0.8489590287208557, -2.9175198078155518, 1.5359359979629517, 12.10604476928711, 1.0601284503936768, 37.87739562988281, 7.095449924468994, 3.9640674591064453, 7.444843769073486, 10.113004684448242, 6.432591915130615, 6.033285617828369, 5.461123466491699, 5.922774791717529, 4.597827911376953, 5.73243522644043, 5.280814170837402, 0.03771522641181946, 4.807012557983398, 3.884894371032715, 3.4321846961975098, 3.775815486907959, 2.2388792037963867, -1.4359182119369507, 3.187615394592285, 2.7590298652648926, 1.6618001461029053, 1.9376020431518555, 2.2107949256896973, 2.1880698204040527, 2.113541841506958, 1.8094573020935059, 2.5658693313598633, 1.4600869417190552, 2.9799880981445312, 1.4653410911560059, 1.8500776290893555, 0.9305185079574585, 1.3162413835525513, 3.284100294113159, 0.9997169375419617, 2.221728801727295, 0.7267639636993408, 0.7726669907569885, 0.267424613237381, 0.4987851083278656, 0.9479166269302368, 0.8012362122535706, 0.5337008237838745, -0.1159716472029686, 2.6097190380096436, -2.4153318405151367, 0.22665263712406158, 0.15801391005516052, 1.209650993347168, 0.1512717753648758, 0.1114291399717331, 4.474946975708008, 2.7808334827423096, 2.305875062942505, 0.02152210846543312, 1.5491405725479126, 0.9760637879371643, 0.4223584830760956, -0.3807240426540375, -0.3168112337589264, 0.755028247833252, 1.2472203969955444, 1.520928144454956, 1.5277856588363647, 0.8655574321746826, 0.21166647970676422, 6.648160934448242, 6.387720108032227, 3.919774293899536, 2.4727578163146973, 2.191469669342041, 2.349933624267578, 2.195526361465454, 2.667527914047241, 1.9361271858215332, 1.1334940195083618, 0.258385568857193, -0.06807686388492584, 2.6236867904663086, 2.6032185554504395, 1.106451153755188, 0.3257206678390503, 2.5508103370666504, 1.929329514503479, 1.281491994857788, 0.6217859387397766, -1.5021765232086182, -1.4461970329284668, 0.5640124082565308, 0.981315553188324, 1.2827445268630981, 0.5912262797355652, 1.178019642829895, -0.33531904220581055, -2.809582233428955, -3.1131229400634766, 1.4225068092346191, 3.87982177734375, 0.469290554523468, -1.1348881721496582, 0.6388782262802124, 3.050302028656006, 2.4826037883758545, 5.365139007568359, 6.385817050933838, 5.990123271942139, 5.323315620422363, 5.085732460021973, 3.3135428428649902, 3.0149080753326416, 4.425673007965088, -0.19109445810317993, 4.892195701599121, 3.839364767074585, 3.4483485221862793, 3.8701438903808594, 2.4748520851135254, 2.3508870601654053, 3.980473041534424, 2.858336925506592, 1.7441316843032837, 1.8300179243087769, 3.696619749069214, 5.169502258300781, 2.155214786529541, 2.1112329959869385, 2.4660096168518066, 1.4416824579238892, 2.9635796546936035, 1.4038550853729248, 1.577034831047058, 0.870784342288971, 1.4041846990585327, 3.450667381286621, 1.004298210144043, 1.0883773565292358, 0.6329202055931091, 0.7479889988899231, 0.30382758378982544, 0.5790987014770508, 1.1568552255630493, 5.794923782348633, 0.5792981386184692, -0.061572104692459106, 2.185656785964966, -2.268634557723999, 0.10133589059114456, 0.296243280172348, 1.9594827890396118, -0.05143973231315613, 0.09080538898706436, 1.847223162651062, 2.890036106109619, 2.4931607246398926, -0.1823013424873352, 0.4473358690738678, 0.9557338953018188, 0.3270702362060547, -0.25409695506095886, -0.3848559856414795, 0.542361319065094, 1.2222687005996704, 1.5160866975784302, 1.4482650756835938, 0.7508527040481567, 0.448066771030426, 0.2841876447200775, 6.169351577758789, 3.963287591934204, 2.449603796005249, 2.318325996398926, 2.2539281845092773, 2.2551498413085938, 2.824129104614258, 1.8977012634277344, 0.9984173774719238, 0.3091556131839752, -0.19289308786392212, 2.915731906890869, 2.447483539581299, 1.1825993061065674, 0.10495427995920181, 2.626293659210205, 2.1071934700012207, 1.5078914165496826, 0.45019951462745667, -1.297458291053772, -0.45740842819213867, 0.952518880367279, 0.6373777985572815, 0.7348952293395996, 0.353727251291275, 0.42706888914108276, -0.3269568383693695, -1.0887354612350464, -2.9002525806427, 1.4518436193466187, 12.14744758605957, 0.9752563238143921, 37.93968200683594, 7.127453804016113, 3.9040489196777344, 7.506072521209717, 8.715500831604004, 6.388621807098389, 6.213069438934326, 5.509678840637207, 5.967726230621338, 4.50136137008667, 5.619169235229492, 5.209662437438965, 0.020495720207691193, 4.934803009033203, 3.9512500762939453, 3.443044662475586, 3.9560184478759766, 1.5216786861419678, -1.3993854522705078, 3.08848237991333, 2.9669272899627686, 1.5964852571487427, 1.731454610824585, 2.2143537998199463, 2.2742791175842285, 2.073272943496704, 1.9499629735946655, 2.6253602504730225, 1.5912553071975708, 2.9273369312286377, 1.4746536016464233, 1.7879953384399414, 1.165419578552246, 1.4779512882232666, 3.3087761402130127, 0.8256181478500366, 2.0899481773376465, 0.6756985187530518, 0.6540297269821167, 0.17427369952201843, 0.6067681312561035, 0.970686674118042, 0.7315359711647034, 0.6330856680870056, -0.02533109486103058, 2.65073561668396, -2.3136680126190186, 0.31018516421318054, 0.3979533612728119, 1.4435147047042847, 0.2120596468448639, 0.06903615593910217, 8.270658493041992, 2.8063602447509766, 2.5225446224212646, 0.1363167017698288, 3.1430139541625977, 1.0987015962600708, 0.34112128615379333, -0.26429417729377747, -0.24070362746715546, 0.6392266154289246, 1.3987681865692139, 1.5764124393463135, 1.3250266313552856, 0.944579005241394, 0.34557822346687317, 6.569159507751465, 6.1601972579956055, 3.9310855865478516, 2.5563488006591797, 2.3274309635162354, 2.1285853385925293, 2.203329086303711, 2.6448850631713867, 2.114823579788208, 1.1883994340896606, 0.08191344141960144, -0.07570543885231018, 2.898005723953247, 2.5649702548980713, 1.3304966688156128, 0.3165499269962311, 2.591526508331299, 1.9233766794204712, 1.4951139688491821, 0.5217757225036621, -23.634342193603516, -2.67168927192688, 0.045292843133211136, 0.2216816544532776, 0.07813402265310287, 6.476638317108154, 1.0681407451629639, -0.094279944896698, 10.026422500610352, -4.954705715179443, 0.276483952999115, -0.9913234114646912, 0.19012588262557983, -13.826842308044434, 0.5055462718009949, 3.183793067932129, 2.4594969749450684, 1.4656578302383423, 1.395868182182312, 1.7472290992736816, 1.2462667226791382, 1.5416176319122314, 0.8516262769699097, 16.841707229614258, 1.8300551176071167, 1.1149345636367798, 1.0239062309265137, 0.988641619682312, 0.7956610321998596, 0.8884279727935791, 0.4951491057872772, 0.3537820875644684, 1.2845431566238403, 0.49777495861053467, 0.2427581548690796, 0.365629106760025, 4.162539482116699, 0.3248137831687927, 0.4120083749294281, 0.3664233982563019, 0.39584794640541077, 0.3796992599964142, 0.6232036352157593, 0.260934442281723, 4.111270904541016, 2.965893268585205, 1.2554230690002441, 5.462955474853516, 0.2593518793582916, 0.20760609209537506, 0.051538560539484024, 0.05514802783727646, 0.10930357128381729, 0.029312636703252792, 0.11183460056781769, 0.27811092138290405, 0.052516620606184006, 0.0238356851041317, 0.36149781942367554, -0.3040696084499359, 288.4954528808594, 0.11892435699701309, 0.29140424728393555, -0.053263161331415176, 0.11719116568565369, 0.19966453313827515, 0.12815673649311066, 0.43745794892311096, 0.059598274528980255, 0.09878852963447571, 0.24286161363124847, 0.03916141763329506, -0.10920850932598114, 0.2808002531528473, 0.5932399034500122, 0.24074918031692505, 0.41230329871177673, 0.34480297565460205, 0.2830016613006592, 0.11590540409088135, 1.2982475757598877, 1.4071950912475586, 0.9277039766311646, 0.6887012124061584, 0.36969977617263794, 0.493261456489563, 0.5307020545005798, 0.5004181861877441, 0.35800501704216003, 0.6476626396179199, 0.10353843122720718, -0.008556912653148174, 0.6868646144866943, 0.5910359621047974, 0.3235679268836975, 0.11743918061256409, 0.5103510618209839, 0.314921498298645, 0.40727105736732483, 0.6025475263595581, -1.3994519710540771, -1.7226303815841675, 0.531259298324585, 0.8950603604316711, 0.6087445020675659, 0.5132849216461182, 0.4879535436630249, -0.20305709540843964, -2.7216796875, -3.1903700828552246, 1.4612499475479126, 3.9633963108062744, 0.5909196138381958, -1.1266835927963257, 0.6652944087982178, 3.0919103622436523, 3.2945356369018555, 5.363988876342773, 6.400425434112549, 6.181777000427246, 5.76285457611084, 5.312102794647217, 3.345689058303833, 3.08036470413208, 5.172361850738525, 0.11408300697803497, 4.958394527435303, 3.9501912593841553, 3.4192490577697754, 3.753365993499756, 2.499711275100708, 1.8412697315216064, 4.04606294631958, 2.8555219173431396, 1.7463409900665283, 1.8255099058151245, 3.6650938987731934, 3.4058666229248047, 2.0260956287384033, 2.1895196437835693, 1.590471625328064, 1.3690470457077026, 2.8683502674102783, 1.2934595346450806, 1.5637098550796509, 1.056125283241272, 1.3485442399978638, 3.3485984802246094, 0.9271038174629211, 1.0521769523620605, 0.7092902660369873, 0.7690393924713135, 0.19443196058273315, 0.4285842776298523, 0.9676355123519897, 0.859369158744812, 0.6703961491584778, -0.45424211025238037, 2.389968156814575, -1.9599623680114746, 0.1280466467142105, 0.26896631717681885, 1.5135680437088013, 0.04972628876566887, 0.05607781186699867, 1.9092299938201904, 2.7298192977905273, 2.4488275051116943, -0.2617037892341614, 0.1572466790676117, 0.9914611577987671, 0.2766714096069336, -0.37643498182296753, -0.19370697438716888, 0.6235930919647217, 1.273690938949585, 1.6386196613311768, 1.5023044347763062, 0.9571459293365479, 0.4961557984352112, 6.636341571807861, 6.200307369232178, 3.970154285430908, 2.6529831886291504, 2.200371742248535, 2.152639627456665, 2.0386765003204346, 2.8019371032714844, 1.9440817832946777, 0.981881856918335, 0.2583397626876831, -0.11086706072092056, 2.876617431640625, 2.546860933303833, 1.1089571714401245, 0.28759852051734924, 2.5311782360076904, 1.8756697177886963, 1.3897396326065063, 0.5234129428863525, 0.8017023801803589, -2.3502840995788574, -0.0693027526140213, -0.21624846756458282, -0.20724447071552277, -6.735622882843018, -0.062252093106508255, 0.3753495216369629, 10.807839393615723, 9.636984825134277, -0.8205879926681519, -3.51694917678833, -1.2329678535461426, -0.40269768238067627, -3.9202659130096436, -7.355228900909424, -5.336204528808594, -2.728790283203125, -2.794332981109619, -2.214664936065674, -2.3095030784606934, -2.286529064178467, -1.1347591876983643, -1.370967984199524, -2.8154757022857666, 0.5419830083847046, -1.713679313659668, -1.5397913455963135, -0.7256280183792114, -1.6379294395446777, -0.7846157550811768, 5.786059379577637, -2.338231325149536, -1.1871604919433594, -0.6099388599395752, -0.9533227682113647, -0.9428920745849609, -65.0632095336914, -0.5772411823272705, -0.8050519824028015, -0.5091246962547302, -0.46976080536842346, -0.5779293179512024, -0.46858686208724976, -1.1925735473632812, -0.23946407437324524, -0.26331502199172974, -1.5529396533966064, -0.18409310281276703, -0.21518602967262268, -0.09123919159173965, -0.09589371085166931, -0.026181204244494438, -0.6270238161087036, -9.73526668548584, -51.97587203979492, -0.08429419994354248, 0.23809543251991272, -1.5656036138534546, 1.131711483001709, -0.05779992416501045, -0.01669810526072979, -1.3589448928833008, 0.0744287371635437, 0.10739950835704803, -46.482173919677734, -49.18745040893555, -0.8655964136123657, 0.20156894624233246, -0.05822359398007393, -0.31801721453666687, -0.011549745686352253, 0.15759193897247314, 0.09393136203289032, -1.6774038076400757, -0.3906159996986389, -0.6258748173713684, -0.5668478012084961, -0.16054296493530273, -0.04315653070807457, 60.08961486816406, -2.3439624309539795, -1.5780463218688965, -1.0342209339141846, -0.9736708402633667, -0.9788872599601746, -0.6396852731704712, -0.9882106184959412, -0.7097277641296387, -0.2984163165092468, -0.23520687222480774, 0.37739497423171997, -0.8094437122344971, -0.820475697517395, -0.35888633131980896, 0.060245271772146225, -1.015425205230713, -0.6828067302703857, -0.5472896099090576, -14.223094940185547, -0.3423876464366913, -1.995727777481079, 0.4365156888961792, -0.9568784832954407, -1.145176649093628, -1.0865919589996338, -0.04911554232239723, -1.697597861289978, 0.16821187734603882]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (30, 40), 'etaBin': (0.8, 1.37)}}, 'et2_eta2': {'discriminator': {'threshold': -0.06000081673264504, 'nodes': [100, 5, 1], 'bias': [0.08753234893083572, 0.13090386986732483, -0.054588861763477325, -0.01655721850693226, -0.003977576736360788, 0.008401443250477314], 'weights': [0.43544790148735046, -0.2538854479789734, -0.8397748470306396, -0.8486863374710083, -1.009407639503479, -1.0432308912277222, -0.3306425213813782, -0.6216546297073364, -0.6540290713310242, 3.440434455871582, 3.277256727218628, 2.0262792110443115, 0.32433223724365234, 0.43337640166282654, 0.46535080671310425, 0.43867695331573486, -3.022052764892578, 0.3197908103466034, 0.057934291660785675, -0.31624263525009155, -2.448324203491211, -1.2621147632598877, -0.879868745803833, -1.3610750436782837, -1.3672606945037842, -1.0881459712982178, -1.2026821374893188, -1.3869057893753052, -5.145620346069336, -0.8585528135299683, -1.1984525918960571, 0.5639861226081848, 1.2934925556182861, -2.4027976989746094, -1.1335461139678955, -1.1355934143066406, -3.581644058227539, -0.9561834931373596, -1.0029189586639404, -1.067145586013794, -0.5116070508956909, -0.8311207294464111, 1.7083876132965088, -1.2086714506149292, 3.2893738746643066, -1.0111340284347534, -1.9538010358810425, -1.0812138319015503, -1.1459778547286987, -1.1777316331863403, -0.8713607788085938, -1.1594771146774292, -0.903601348400116, -0.9112756848335266, -1.215891718864441, -1.238979697227478, -0.8064771294593811, 7.213140964508057, -0.33242931962013245, -0.4586346745491028, -1.0447313785552979, -0.9684170484542847, 1.1170791387557983, -0.8538909554481506, 7.183265209197998, -0.2465347796678543, 0.717339277267456, 2.2496159076690674, -1.066243052482605, -1.0407042503356934, -1.0538791418075562, -1.0579310655593872, 0.1311648041009903, 0.07169005274772644, -5.1904754638671875, -0.8873730897903442, -3.0730955600738525, -2.4272725582122803, -1.2928894758224487, -1.0526258945465088, -0.12569546699523926, -4.972345352172852, -2.46457576751709, -1.3521400690078735, -1.3025455474853516, -1.4406278133392334, -1.3122296333312988, -0.6634224653244019, 0.7299451231956482, -0.7153655886650085, -0.4721425175666809, -0.09434489160776138, -4.599591255187988, -1.6644418239593506, -1.239997148513794, -1.8230412006378174, -0.07049793004989624, 0.06914123892784119, -0.6952479481697083, -0.9023397564888, -0.9573584198951721, 0.06490606814622879, 0.9684723615646362, 0.874728798866272, 1.102800726890564, 1.0971516370773315, 0.2597167491912842, 0.4802432060241699, -0.21859869360923767, -3.431432008743286, -3.1913387775421143, -1.9646916389465332, -0.5874313116073608, -0.20583021640777588, -0.39834147691726685, -0.33817678689956665, 2.970319986343384, -0.2858656644821167, -0.05120851844549179, 0.3205240070819855, 2.590973138809204, 1.2641915082931519, 0.2522640824317932, 1.477105975151062, 1.3650877475738525, 1.1837058067321777, 1.1533266305923462, 1.3192018270492554, 4.9258270263671875, 0.9556280374526978, 1.1799613237380981, -0.565028965473175, -1.309804916381836, 1.196069359779358, 1.1629536151885986, 1.2170822620391846, 3.508270740509033, 1.116434097290039, 0.9529591202735901, 1.0607781410217285, 0.4331416189670563, 0.8688268661499023, -1.6487596035003662, 1.169366478919983, -0.22837479412555695, 1.1421794891357422, 1.7672773599624634, 1.0516108274459839, 1.0632296800613403, 1.2456525564193726, 0.8417384624481201, 0.9716588854789734, 0.9690882563591003, 0.8602927327156067, 1.1396955251693726, 1.0545265674591064, 0.8554439544677734, -7.33428430557251, 0.3280395567417145, 0.5355259776115417, 1.0162546634674072, 1.207880973815918, 0.3732747435569763, 0.813510000705719, -7.314406871795654, 0.3517904579639435, -0.6806394457817078, -2.2064120769500732, 1.0840307474136353, 1.0318522453308105, 1.0951234102249146, 0.9928448796272278, -0.3500291705131531, -0.21853646636009216, 1.8853754997253418, 0.9339408874511719, 3.0617027282714844, 2.3884851932525635, 1.3142625093460083, 0.9540764689445496, 0.15042097866535187, 4.968503952026367, 2.4259274005889893, 1.1946336030960083, 1.4957234859466553, 1.5735015869140625, 1.2180371284484863, 0.7528160810470581, -0.8782432079315186, 0.6123750805854797, 0.5387499928474426, -0.205851748585701, 4.488345146179199, 1.5635864734649658, 1.1872773170471191, 1.8283729553222656, 0.07930629700422287, -0.08956926316022873, 0.4332733154296875, 0.9245277643203735, 0.3053550720214844, -0.10476681590080261, -0.9733907580375671, -0.9292745590209961, -0.9025076627731323, -1.049320101737976, -0.28465980291366577, -0.4118485748767853, 0.031934238970279694, 3.515028476715088, 3.28084397315979, 2.0305871963500977, 0.6264911890029907, 0.3885815441608429, 0.4074462652206421, 0.2582876980304718, -3.14158034324646, 0.2844088077545166, 0.24454064667224884, -0.34183499217033386, -2.518915891647339, -1.344730019569397, -0.38430649042129517, -1.2529305219650269, -1.2437069416046143, -1.053612470626831, -1.1766802072525024, -1.2144511938095093, -4.997520446777344, -0.9604114294052124, -1.1055437326431274, 0.5908668637275696, 1.2696261405944824, -1.122104525566101, -1.1961266994476318, -1.1486186981201172, -3.64306640625, -0.9639080166816711, -1.072693109512329, -1.1256461143493652, -0.4536110460758209, -0.8945903182029724, 2.9062373638153076, -1.1463106870651245, 0.21846027672290802, -1.1409780979156494, -1.8196452856063843, -1.0657037496566772, -1.059019684791565, -1.1091536283493042, -0.8726768493652344, -1.1519840955734253, -0.9086622595787048, -1.0277389287948608, -1.352437138557434, -1.129360556602478, -0.8972620964050293, 7.354781627655029, -0.30253973603248596, -0.3924461007118225, -0.9960758686065674, -1.112428903579712, 1.2012749910354614, -0.8379755616188049, 7.227231502532959, -0.4771038591861725, 0.729102611541748, 2.2410333156585693, -1.0523523092269897, -0.8465303778648376, -1.1298357248306274, -0.9771705865859985, 0.2529947757720947, 0.1848514974117279, -1.8511106967926025, -0.8738077878952026, -2.8375940322875977, -2.4110536575317383, -1.272687554359436, -0.9823499917984009, -0.03202511742711067, -4.962332725524902, -2.3779337406158447, -1.2724038362503052, -1.4004063606262207, -1.4816577434539795, -1.1140007972717285, -0.6948519349098206, 0.8216823935508728, -0.7394312024116516, -0.5942984223365784, 0.07731347531080246, -4.515483856201172, -1.7112752199172974, -1.0836892127990723, -1.9471524953842163, -0.09571601450443268, -0.014971595257520676, -0.2608397603034973, -0.9047937989234924, 0.27724403142929077, -0.01901376247406006, -0.7699190378189087, -0.7830173969268799, -1.167035460472107, -0.9709010720252991, -0.10496655106544495, -0.4907691478729248, -0.6567061543464661, 3.4595987796783447, 3.2112812995910645, 1.9043993949890137, 0.5714796781539917, 0.35154953598976135, 0.4668389558792114, 0.43017899990081787, -3.0579068660736084, 0.3886381983757019, 0.03927021473646164, -0.19387896358966827, -2.649522304534912, -1.236520528793335, -0.32060861587524414, -1.4439131021499634, -1.3942391872406006, -1.064635992050171, -1.2871571779251099, -1.2962430715560913, -4.978155136108398, -0.8016833066940308, -1.3351682424545288, 0.5719218850135803, 1.3680896759033203, -1.1584571599960327, -1.058614730834961, -1.2172975540161133, -3.5908002853393555, -0.8975604176521301, -0.5588316917419434, -1.0803050994873047, -0.4324931204319, -0.8710951805114746, 1.5746749639511108, -1.1904040575027466, 3.1687188148498535, -1.1420321464538574, -1.9427047967910767, -0.9957467913627625, -0.9661791920661926, -1.1866260766983032, -0.9056214094161987, -0.9388925433158875, -0.888228178024292, -0.9867854714393616, -1.320128321647644, -1.2492583990097046, -0.8571321964263916, 7.26641321182251, -0.2533717751502991, -0.34315019845962524, -1.0717334747314453, -1.0420279502868652, 1.2418256998062134, -0.8049693703651428, 7.271480083465576, -0.28884080052375793, 0.6832298636436462, 2.0866901874542236, -1.048599362373352, -1.0400032997131348, -0.9879794120788574, -1.2031575441360474, 0.3338753581047058, 0.005202845204621553, -1.870332956314087, -1.0473015308380127, -3.028496742248535, -2.3024778366088867, -1.366024136543274, -1.0702126026153564, -0.011121917515993118, -4.837756156921387, -2.5035622119903564, -1.2208665609359741, -1.485734224319458, -1.5851771831512451, -1.192561388015747, -0.7502496838569641, 0.8806524872779846, -0.7586238980293274, -0.5902004837989807, 0.07082610577344894, -4.474475860595703, -1.656426191329956, -1.0673701763153076, -1.8516955375671387, -0.10346166789531708, -0.03432529419660568, -0.3299255967140198, -0.9189863801002502, -0.34211108088493347, 0.15302442014217377, 0.8172764778137207, 0.9279978275299072, 1.0501629114151, 1.0340768098831177, 0.31618791818618774, 0.8232476711273193, 0.5855967402458191, -3.346769332885742, -3.2345681190490723, -1.9675462245941162, -0.5035005807876587, -0.3756554126739502, -0.33215922117233276, -0.45611947774887085, 3.185671091079712, -0.474907249212265, -0.0019796714186668396, 0.2282453030347824, 2.537781238555908, 1.1804982423782349, 0.892102837562561, 1.4359885454177856, 1.205693006515503, 1.2003264427185059, 1.3300193548202515, 1.310004472732544, 4.988697052001953, 0.8599144220352173, 1.336311936378479, -0.3725610375404358, -1.3246933221817017, 1.1793049573898315, 1.14927077293396, 1.1568491458892822, 3.6878509521484375, 0.9457520246505737, 0.560152530670166, 1.0932188034057617, 0.3348715007305145, 0.8299450278282166, -2.872796058654785, 1.1127365827560425, -3.654811143875122, 0.9817737936973572, 1.852124810218811, 1.057611346244812, 0.9731946587562561, 1.120308756828308, 1.0147731304168701, 1.0878523588180542, 1.0194711685180664, 1.0786226987838745, 1.2074791193008423, 1.204982876777649, 0.8299685120582581, -7.349228382110596, 0.20936447381973267, 0.5802146792411804, 1.1650177240371704, 0.9715105295181274, -1.0590862035751343, 0.6879644989967346, -7.308121204376221, 0.3085511028766632, -0.6069979071617126, -2.2799665927886963, 1.1295291185379028, 0.8643592596054077, 1.0620927810668945, 1.2044507265090942, -0.29747265577316284, -0.2227703034877777, 5.236808776855469, 1.0438685417175293, 2.8584067821502686, 2.376181125640869, 1.170770287513733, 0.966115415096283, 0.0054801031947135925, 5.0053391456604, 2.294739246368408, 1.3594955205917358, 1.4909740686416626, 1.517390489578247, 1.2738871574401855, 0.6205419301986694, -0.777568519115448, 0.808970034122467, 0.539140522480011, -0.12814348936080933, 4.707989692687988, 1.5344207286834717, 1.1467335224151611, 1.7948827743530273, 0.014194371178746223, -0.06376484781503677, 0.33352214097976685, 0.8976209163665771, 1.4930099248886108, -0.8525076508522034, 1.7975599765777588, 1.2298215627670288, -1.9667859077453613]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (30, 40), 'etaBin': (1.37, 1.54)}}, 'et2_eta3': {'discriminator': {'threshold': -0.10500081200152636, 'nodes': [100, 13, 1], 'bias': [0.12301873415708542, 0.12412352859973907, -0.14823086559772491, -0.1450803130865097, -0.12146025896072388, -0.04708926007151604, -0.20305420458316803, -0.13244207203388214, -0.1551319658756256, 0.12996461987495422, 0.16650205850601196, -0.11159323900938034, -0.0754173994064331, 0.11395751684904099], 'weights': [0.30418726801872253, 0.8497653007507324, -0.6887367963790894, -1.1621745824813843, -0.6113541126251221, -1.057387113571167, -0.3409591019153595, -0.6250436305999756, 1.0915658473968506, 1.1697919368743896, 0.11023081094026566, -2.862215280532837, -0.25837546586990356, -0.1397186815738678, -2.98982310295105, -3.6729938983917236, -1.3729815483093262, -4.9331135749816895, -3.3440096378326416, -2.172529935836792, -1.5044852495193481, -4.413820743560791, -1.3811358213424683, -1.588523507118225, -4.195178508758545, -2.3188867568969727, -0.6977825164794922, -1.3636525869369507, -0.4245065152645111, -1.4669708013534546, -0.772320568561554, -1.9325722455978394, -1.1024763584136963, 0.2176528424024582, -1.571555495262146, -1.6388942003250122, -0.73421311378479, -1.843888759613037, -1.0722200870513916, -0.4295573830604553, -0.45321106910705566, -0.7210465669631958, -0.7969924211502075, -1.5129765272140503, -0.9125153422355652, -0.47102102637290955, -0.9808535575866699, -1.9205478429794312, 0.28503116965293884, -0.2707855701446533, 0.21478445827960968, -0.3487158715724945, -0.7190283536911011, -0.5389546155929565, -0.6640545725822449, -0.34965771436691284, -0.8494725227355957, -1.8142505884170532, 0.4217793345451355, -0.17951776087284088, -0.16311372816562653, -1.8624355792999268, -0.05131518840789795, 0.6620866656303406, -0.06519957631826401, 0.26691943407058716, -1.0862338542938232, 0.47569042444229126, 2.3826143741607666, -0.9888518452644348, -0.6096920371055603, -2.0633859634399414, 0.1741425096988678, 0.09333915263414383, -1.3368562459945679, -1.0445584058761597, -1.8494149446487427, -1.421730637550354, -0.8431060314178467, -0.9251859188079834, -0.5813602805137634, -3.3905375003814697, -2.6186413764953613, -2.1882357597351074, -1.119201898574829, -0.9595183730125427, -1.125844120979309, -0.09222555160522461, -0.8053295016288757, -1.335995078086853, -0.6404117941856384, -0.15574225783348083, -2.905750036239624, -1.2272462844848633, -0.2803206145763397, -1.5305250883102417, -0.9465407133102417, -0.14035649597644806, -0.21217818558216095, -6.7821831703186035, 0.4178466796875, 0.9353280067443848, -0.5816575288772583, -1.1598467826843262, -0.5564528703689575, -0.9457266330718994, -0.16822941601276398, -0.5664964318275452, 0.9762808680534363, 1.2137621641159058, 0.437343031167984, -2.7996912002563477, -0.3631327748298645, -0.24042445421218872, -2.7883148193359375, -2.5495426654815674, -1.263527750968933, -5.11525297164917, -3.1762044429779053, -2.0281825065612793, -1.6031328439712524, -4.4091362953186035, -1.3487286567687988, -1.641599178314209, -4.1170244216918945, -2.3824644088745117, -0.6433667540550232, -1.461822509765625, -0.39284271001815796, -1.3839620351791382, -0.693322479724884, -2.0719099044799805, -1.0699131488800049, 0.1502453237771988, -1.7072285413742065, -1.4347018003463745, -0.6855227947235107, -1.8113669157028198, -1.0726268291473389, -0.24809420108795166, -0.3721972107887268, -0.6835063695907593, -0.801081657409668, -1.542225956916809, -0.7369579076766968, -0.639552652835846, -0.9209814071655273, -1.8816319704055786, 0.19405755400657654, -0.2908840775489807, 0.14995653927326202, -0.2907114028930664, -0.7556899785995483, -0.5869253873825073, -0.6548513770103455, -0.28700974583625793, -0.7130810022354126, -1.757418155670166, 0.3907534182071686, -0.07897394150495529, -0.27136585116386414, -2.0624635219573975, -0.2664145529270172, 0.4506451189517975, -0.08523759245872498, 0.1642151027917862, -0.8453987836837769, 0.25697019696235657, 2.3169705867767334, -0.9964538216590881, -0.6514313817024231, -2.0524673461914062, 0.1995789110660553, 0.051973167806863785, -1.3547682762145996, -1.0910674333572388, -1.7880864143371582, -1.3799949884414673, -0.8465836644172668, -0.957261323928833, -0.564211905002594, -3.5106306076049805, -3.1596767902374268, -2.178257942199707, -0.9829910397529602, -0.9245108962059021, -1.0569998025894165, -0.06946852803230286, -0.7025414109230042, -1.2926933765411377, -0.6913346648216248, -0.1600404530763626, -3.0791871547698975, -1.2459183931350708, -0.2689438760280609, -1.4641588926315308, -1.0716415643692017, -0.1361074596643448, -0.11653489619493484, -6.724954128265381, -0.3965246379375458, -0.8558112382888794, 0.5742728114128113, 1.2904711961746216, 0.5677658319473267, 1.086992621421814, 0.17724068462848663, 0.8273959755897522, -1.094128131866455, -1.1877236366271973, -0.45167985558509827, 2.8013670444488525, 0.481206476688385, 0.2692694067955017, 2.8116722106933594, 2.666585922241211, 1.3945326805114746, 4.969942092895508, 3.330779790878296, 2.2182538509368896, 1.571179747581482, 4.505165100097656, 1.344825267791748, 1.698574185371399, 4.963958263397217, 2.4525885581970215, 0.7026008367538452, 1.4111098051071167, 0.5565152168273926, 1.3050004243850708, 0.7208021283149719, 2.0179920196533203, 1.0633853673934937, -0.13319465517997742, 1.568001389503479, 1.4417909383773804, 0.6033551096916199, 1.9216288328170776, 1.117271065711975, 0.28853896260261536, 0.2680075168609619, 0.7167360186576843, 0.8398164510726929, 1.6980571746826172, 0.7816507816314697, 0.5635744333267212, 0.9330514669418335, 2.029628038406372, -0.15740585327148438, 0.21728986501693726, -0.0327858105301857, 0.2960619032382965, 0.7494935989379883, 0.6769182085990906, 0.4767330288887024, 0.33478879928588867, 0.8754949569702148, 1.8766576051712036, -0.39680272340774536, 0.09256334602832794, 0.0658884197473526, 1.8434150218963623, 0.05762580782175064, -0.6603575944900513, 0.1237194836139679, -0.2717497646808624, 0.8832526206970215, -0.3037146329879761, -2.31727933883667, 0.838454008102417, 0.6482180953025818, 1.9509977102279663, -0.0838266909122467, -0.01945280097424984, 1.4060927629470825, 1.3620051145553589, 1.7707526683807373, 1.4466333389282227, 0.93125981092453, 0.9794870018959045, 0.5605012774467468, 3.5484373569488525, 2.9119770526885986, 1.951120138168335, 1.035802960395813, 0.773888111114502, 1.120093584060669, 0.045821741223335266, 0.6521666646003723, 1.1093902587890625, 0.5105617046356201, 0.16685819625854492, 2.9315502643585205, 1.0994263887405396, 0.3065134286880493, 1.5813195705413818, 1.057920217514038, 0.2084522694349289, 0.1900288313627243, 6.71383810043335, -42.46225357055664, -70.96731567382812, 0.07631244510412216, 19.227619171142578, 3.3918514251708984, 18.458330154418945, 0.9544081687927246, 0.4319327771663666, -1.5471141338348389, 3.1591649055480957, -3.498514413833618, 11.57614803314209, 4.312415599822998, 9.06739330291748, -20.08837127685547, 1.2611100673675537, 4.591228008270264, 3.2659976482391357, -8.876774787902832, 2.2359485626220703, -29.228708267211914, 2.082066059112549, 1.5442314147949219, 1.4400252103805542, 17.212377548217773, 1.7645370960235596, -0.542725145816803, 1.4210560321807861, 1.026045560836792, 1.5745453834533691, -28.105018615722656, 1.1648740768432617, -19.639842987060547, 4.012938499450684, -0.051800403743982315, 1.4506182670593262, 0.8734657168388367, 1.3684583902359009, -0.8187167644500732, 1.4108632802963257, 0.6901399493217468, 26.724184036254883, 11.367783546447754, -7.4334940910339355, -9.515633583068848, 0.939599335193634, 0.5313428640365601, 0.720454752445221, -0.45186764001846313, 0.3764512538909912, -0.35271570086479187, 0.21664610505104065, -2.4248080253601074, -0.2605746388435364, 0.7959389090538025, 0.6855553388595581, 0.5836410522460938, 14.972626686096191, 0.3206372857093811, 4.867676734924316, 1.4906827211380005, -1.5150582790374756, 6.724363327026367, 0.7121997475624084, 16.79769515991211, 6.245677471160889, 0.8168960809707642, -0.3535807132720947, -0.9013701677322388, 19.182355880737305, 0.6428565382957458, 1.3382554054260254, -0.3308599293231964, -0.29333075881004333, 0.9137106537818909, 0.5301271677017212, 1.0323295593261719, 1.3004313707351685, 1.1908447742462158, 0.8775336146354675, 33.16133117675781, 2.3310062885284424, 2.678463935852051, 1.7283899784088135, 0.9873225092887878, -5.185284614562988, 1.2016500234603882, 12.617661476135254, -50.8746223449707, -6.66983699798584, 0.5779006481170654, 0.7036734223365784, 14.482378005981445, 1.5860333442687988, 0.4311436116695404, 1.172850489616394, -1.7398306131362915, 1.2602179050445557, -4.303325176239014, -688.7769775390625, -0.5277848243713379, -1.0461124181747437, 0.6094116568565369, 1.1573532819747925, 0.7563377022743225, 0.916793942451477, 0.35657933354377747, 0.8378023505210876, -1.0734639167785645, -1.1636098623275757, -0.4562557339668274, 2.833606481552124, 0.5163435339927673, 0.32135361433029175, 2.8050928115844727, 2.634460687637329, 1.279829740524292, 4.988045692443848, 3.1871063709259033, 2.096364736557007, 1.503313660621643, 4.611399173736572, 1.5462313890457153, 1.6967856884002686, 5.010919094085693, 2.3433640003204346, 0.668563723564148, 1.561421275138855, 0.49576336145401, 1.444431185722351, 0.841437578201294, 2.066014528274536, 1.0146316289901733, -0.21768641471862793, 1.7231591939926147, 1.5794697999954224, 0.5889291167259216, 2.0158655643463135, 1.012094497680664, 0.28763899207115173, 0.38233309984207153, 0.6044565439224243, 0.6848258376121521, 1.5692805051803589, 0.7184041142463684, 0.6654860377311707, 0.789604663848877, 1.8791120052337646, -0.2951842248439789, 0.17412510514259338, -0.08447487652301788, 0.33074140548706055, 0.5779514312744141, 0.5859646797180176, 0.5065541863441467, 0.444772332906723, 0.9155693054199219, 1.8753169775009155, -0.3768397867679596, 0.0687597393989563, 0.20108890533447266, 1.9811288118362427, 0.07897226512432098, -0.5760437250137329, 0.1798102855682373, -0.3355177640914917, 0.8649784326553345, -0.25917550921440125, -2.5271005630493164, 0.9552915692329407, 0.6989930272102356, 2.0957932472229004, -0.07641968131065369, -0.12085721641778946, 1.424972653388977, 1.3087549209594727, 1.7453577518463135, 1.3189929723739624, 0.9482564330101013, 1.064982295036316, 0.6298055648803711, 3.460169553756714, 2.7317564487457275, 2.083712577819824, 0.905897319316864, 0.9155291318893433, 1.1221959590911865, -0.04841718077659607, 0.7889496684074402, 1.128574013710022, 0.6327909827232361, 0.1991017609834671, 3.0771656036376953, 1.2395368814468384, 0.4259513318538666, 1.556912899017334, 0.9002264738082886, 0.3124716281890869, 0.20730529725551605, 6.586654186248779, 14.063756942749023, 8.218186378479004, -0.14519159495830536, 4.272008419036865, 7.982744216918945, 3.923720598220825, 0.22982282936573029, 6.627468585968018, -0.1453406661748886, 0.5045799612998962, -0.36684590578079224, -1.4339826107025146, -0.18114908039569855, -0.2483782172203064, -1.1930547952651978, -0.5184308290481567, -0.13267658650875092, -0.7445982098579407, -1.9974291324615479, -0.23628738522529602, -1.1211274862289429, -1.020624041557312, -66.09517669677734, -5.356493949890137, -1.3376556634902954, -0.34383901953697205, -0.4764726161956787, -0.051435891538858414, -0.13659794628620148, -0.25425228476524353, -0.4077799320220947, -0.535479724407196, -0.25888094305992126, 0.9030393958091736, -23.053281784057617, -39.430747985839844, -1.5864990949630737, -5.059427261352539, -0.26177147030830383, 0.4109734892845154, 0.07736000418663025, 0.481022447347641, 0.04597252234816551, -61.85880661010742, -0.4914794862270355, 0.07932600378990173, -0.7798473238945007, 54.87738037109375, -0.03970981761813164, -0.3524216115474701, -69.59514617919922, -23.8482666015625, -52.1743278503418, -1.2950568199157715, 0.019184764474630356, 15.454039573669434, -0.2506156265735626, -0.061185866594314575, -0.03239520639181137, -14.93748664855957, 3.340256929397583, 0.15641818940639496, -2.3994925022125244, 1.835261344909668, -13.6608247756958, 77.0022201538086, -0.19211140275001526, 19.97312355041504, -36.92919921875, -0.17449429631233215, -0.09447365999221802, 78.25885009765625, -5.779533863067627, -5.420243263244629, -0.3052462637424469, -3.9634804725646973, -0.5211328268051147, -0.31938979029655457, -0.2517760097980499, -0.2685023844242096, -212.9854736328125, -30.17164421081543, -24.490009307861328, -10.645490646362305, -21.07343864440918, -11.246722221374512, 0.04942397400736809, -71.0390625, 11.424042701721191, 10.798490524291992, -0.0429750494658947, 4.414422035217285, -2.6547229290008545, -4.820148944854736, -0.12145984172821045, -0.5519380569458008, 3.101762533187866, 4.2444658279418945, -3.6345603466033936, -0.562982976436615, -1.2166202068328857, -4.596149921417236, -0.7959448099136353, -6.384563446044922, -4.002380847930908, 0.8029256463050842, -0.35959765315055847, 3.7923853397369385, -16.618196487426758, -9.554988861083984, 1.1377618312835693, 47.795204162597656, 109.44261932373047, 24.423660278320312, -3.6046438217163086, -22.6756534576416, -260.8214416503906, -63.076087951660156, 15.552159309387207, 0.4022412896156311, -0.11724751442670822, 0.36431413888931274, -2.5042953491210938, -23.82703399658203, -85.89523315429688, -0.4229048192501068, 24.80335235595703, -2.1182053089141846, -0.4451961815357208, -0.012475650757551193, 26.245166778564453, 31.059240341186523, -35.73555374145508, 41.04964828491211, 36.78553009033203, 0.12180949747562408, -0.23237749934196472, 34.898136138916016, 0.4524468183517456, 41.13677215576172, 21.005521774291992, 15.234944343566895, -2.944014549255371, 0.13965633511543274, 50.49112319946289, -4.110185623168945, -0.39785847067832947, -43.943660736083984, -0.42626452445983887, -24.15531349182129, 0.644363284111023, -13.422357559204102, 49.38895797729492, -0.06469817459583282, 37.11933135986328, 38.50857162475586, 2.538553237915039, -32.90419006347656, -0.6295183897018433, -15.45336627960205, 52.15901565551758, 18.984493255615234, -2.1657252311706543, 25.40456771850586, -0.34799468517303467, -5.49114990234375, 26.026382446289062, -15.492897033691406, 47.72470474243164, -13.565674781799316, -0.576643168926239, 7.9617767333984375, 0.061585333198308945, 0.7577609419822693, -6.103629112243652, -14.067750930786133, -18.153383255004883, -3.8901801109313965, -0.06462503224611282, -3.9029226303100586, -51.21853256225586, 14.732786178588867, -26.661537170410156, 4.567901134490967, 10.833147048950195, 0.04311544820666313, 17.802446365356445, -4.474728107452393, -2.7988169193267822, -3.1032097339630127, -1.3325752019882202, 10.483931541442871, -45.62336349487305, -0.5037767887115479, 2.8887016773223877, 0.20716409385204315, 0.29963305592536926, 6.20416784286499, -0.5406949520111084, 1.17706298828125, -0.5078774094581604, -0.9594403505325317, 0.5891019701957703, 1.230588436126709, 0.7258692979812622, 0.918239951133728, 0.28832927346229553, 0.7563337087631226, -0.9690443277359009, -1.15109121799469, -0.5003306269645691, 2.9191904067993164, 0.369613915681839, 0.11917898803949356, 3.0260579586029053, 2.614006280899048, 1.4625333547592163, 5.118364334106445, 3.2308008670806885, 2.204737663269043, 1.5220906734466553, 4.58559513092041, 1.452600121498108, 1.6444710493087769, 5.074839115142822, 2.4159789085388184, 0.579825758934021, 1.4140586853027344, 0.5123767852783203, 1.2717394828796387, 0.7904630303382874, 2.1074490547180176, 0.9395533800125122, -0.0409160740673542, 1.589781641960144, 1.4682937860488892, 0.7720704078674316, 1.809342861175537, 1.080473780632019, 0.33711913228034973, 0.43754005432128906, 0.6236121654510498, 0.7613350749015808, 1.7258000373840332, 0.7839359045028687, 0.5030819177627563, 0.9207557439804077, 1.8706471920013428, -0.34089863300323486, 0.34998661279678345, -0.23262326419353485, 0.30890199542045593, 0.7487384080886841, 0.6121823787689209, 0.6804398894309998, 0.40631455183029175, 0.7663447260856628, 1.7124123573303223, -0.31505870819091797, 0.2561591565608978, 0.11884371936321259, 1.9870301485061646, 0.23096242547035217, 0.3338371515274048, 0.11443057656288147, -0.32183289527893066, 0.8388746976852417, -0.389498233795166, -2.471872091293335, 1.0024690628051758, 0.6032493710517883, 1.9581527709960938, -0.005172703880816698, -0.1352144181728363, 1.195815920829773, 1.1974705457687378, 1.8081310987472534, 1.469057321548462, 0.8334143757820129, 0.8341609835624695, 0.7078484296798706, 3.70715069770813, 3.0509819984436035, 2.0596837997436523, 0.9122124314308167, 0.8366513848304749, 1.0534800291061401, 0.056742988526821136, 0.7957990765571594, 1.1165286302566528, 0.6075904965400696, 0.11813954263925552, 3.0899298191070557, 1.1223469972610474, 0.4400268495082855, 1.4853813648223877, 1.0389213562011719, 0.30533814430236816, 0.25351232290267944, 6.785035610198975, -0.39140114188194275, -1.139840006828308, 0.6731201410293579, 1.1550958156585693, 0.5638008117675781, 1.0792462825775146, 0.3624536395072937, 0.6030336022377014, -1.1120805740356445, -1.2129931449890137, -0.2030080407857895, 2.742615222930908, -1.0337464809417725, 0.30721890926361084, 3.462728500366211, 2.477478504180908, 1.182031273841858, 4.89307165145874, 3.2948129177093506, 2.036480188369751, 1.670960545539856, 4.506345272064209, 1.5122008323669434, 2.244701623916626, 4.131073474884033, 2.262995958328247, 0.7003257274627686, 1.3925265073776245, 0.5528702735900879, 1.4417014122009277, 0.7929090857505798, 2.0238447189331055, 1.1691749095916748, -0.19980467855930328, 1.6516227722167969, 1.969643235206604, 0.761513888835907, 1.9527347087860107, 1.0873714685440063, 0.22053319215774536, 0.7128230929374695, 0.6049107313156128, 0.8591893315315247, 1.5111196041107178, 0.732628583908081, 0.558334231376648, 0.9773120880126953, 1.8561618328094482, -0.39211851358413696, 0.005776680540293455, -0.16405422985553741, 0.4031231999397278, 0.552124559879303, 0.4953479766845703, 0.4938861131668091, 0.3383435308933258, 0.7426741123199463, 1.6564736366271973, -0.41170963644981384, 0.03124856762588024, 0.2252117395401001, 1.9004722833633423, 0.16434632241725922, 0.2846846580505371, 0.11429283022880554, -0.3527865409851074, 0.9703900814056396, -0.3925929069519043, -2.333373785018921, 0.8955271244049072, 0.7136886119842529, 2.0322043895721436, -0.05712644010782242, -0.18348143994808197, 1.307091236114502, 1.2848570346832275, 1.8391969203948975, 1.3917560577392578, 0.8969113230705261, 1.0127688646316528, 0.7510788440704346, 3.6391384601593018, 3.945478677749634, 2.1604669094085693, 0.9281222820281982, 1.2677093744277954, 1.0914695262908936, 0.041172102093696594, 0.8696383833885193, 1.3039631843566895, 0.6090715527534485, 0.30596521496772766, 3.606468439102173, 1.1730620861053467, 0.3334497809410095, 1.609261155128479, 1.029264211654663, 0.32256901264190674, 0.1050935611128807, 6.615805625915527, 0.44275766611099243, 1.0860676765441895, -0.6361497044563293, -1.1486839056015015, -0.7489868402481079, -1.0916446447372437, -0.1996331810951233, -0.5125791430473328, 0.8987367749214172, 1.3552607297897339, 0.1900576651096344, -2.9276974201202393, -0.34848079085350037, -0.23827406764030457, -3.0009052753448486, -3.120072603225708, -1.3448060750961304, -4.940805435180664, -3.394080400466919, -2.1645140647888184, -1.6466408967971802, -4.567572593688965, -1.4169425964355469, -2.3487601280212402, -4.133004188537598, -2.437957525253296, -0.5606707334518433, -1.458410382270813, -0.554598867893219, -1.2566148042678833, -0.6758361458778381, -1.9483543634414673, -1.0569878816604614, 0.09677363187074661, -1.5889736413955688, -1.4748929738998413, -0.6199264526367188, -1.9844932556152344, -1.0697342157363892, -0.2587957978248596, -0.2410532832145691, -0.6015037298202515, -0.7069128751754761, -1.6559184789657593, -0.9482842683792114, -0.6457294225692749, -0.787306547164917, -1.9159588813781738, 0.3557521402835846, -0.2937186360359192, 0.23418042063713074, -0.4342738687992096, -0.6624311208724976, -0.5870678424835205, -0.608083963394165, -0.46999478340148926, -0.7522498965263367, -1.8880794048309326, 0.4712357521057129, -0.02299511805176735, -0.29113438725471497, -1.9809561967849731, -0.0999230444431305, -0.21887987852096558, -0.04071185737848282, 0.2224041372537613, -0.9774309396743774, 0.3506249785423279, 2.428495168685913, -0.865532636642456, -0.813362181186676, -2.069868564605713, 0.12737295031547546, 0.2549683749675751, -1.2262831926345825, -1.2279356718063354, -1.8744863271713257, -1.378003716468811, -0.9208574891090393, -0.8273350596427917, -0.5485767722129822, -3.598797082901001, -3.7702102661132812, -2.08737850189209, -0.973261833190918, -1.2275522947311401, -1.1310789585113525, -0.11530504375696182, -0.83946293592453, -1.3033760786056519, -0.694290041923523, -0.28694257140159607, -3.6592657566070557, -1.0928118228912354, -0.22903433442115784, -1.5917664766311646, -1.180234670639038, -0.42320385575294495, -0.13401277363300323, -6.652355670928955, 5.676045894622803, 19.770729064941406, 23.222349166870117, 11.33836555480957, -0.382088303565979, -1.095794677734375, -0.13374540209770203, -8.887331008911133, -4.773684024810791, -7.823843002319336, -9.213000297546387, -11.879658699035645, 173.0123748779297, 41.449607849121094, -13.581475257873535, 66.26525115966797, 8.883946418762207, -7.707841396331787, 49.82863235473633, 84.21129608154297, -1.0134878158569336, 134.4239044189453, -1.493996024131775, -1.3615819215774536, 8.893420219421387, 9.426976203918457, -0.5602660775184631, 26.191953659057617, -12.173545837402344, -1.5878174304962158, -2.582836627960205, -0.7510395646095276, -3.0528995990753174, -0.7998068928718567, 10.311631202697754, 41.3348274230957, 2.155888319015503, -2.0228519439697266, -22.477628707885742, 23.287004470825195, 3.4981820583343506, 9.579017639160156, 5.486382484436035, -1.6653884649276733, 15.744100570678711, -0.6553637385368347, 5.699670314788818, -24.563302993774414, 0.448487251996994, -2.5196456909179688, 67.56224822998047, -0.7288800477981567, 98.18753814697266, -12.992110252380371, -33.887813568115234, 15.54227352142334, -0.7602488398551941, -26.514163970947266, -22.066547393798828, 31.037639617919922, -8.115333557128906, 12.380725860595703, 8.054473876953125, 7.686533451080322, 7.942568778991699, -0.3603121042251587, 2.8651421070098877, 0.2672731578350067, 11.944064140319824, -0.846297025680542, -11.89965534210205, 11.031524658203125, 0.22739070653915405, 0.38495784997940063, -1.281140923500061, -1.7910065650939941, -1.864558458328247, -4.447373867034912, -1.1394922733306885, -8.389485359191895, 5.285486221313477, 1.3094311952590942, -14.86137866973877, 4.189198017120361, 6.647069454193115, -1.0425013303756714, 17.80618667602539, -16.129196166992188, -5.551366806030273, -4.523837089538574, 1.6083695888519287, 1.8986173868179321, -10.16767692565918, -3.654367208480835, -0.3141562044620514, 23.318510055541992, 9.78225326538086, -2.691760778427124, 5.128377437591553, 229.34840393066406, -0.40750205516815186, -0.9493240118026733, 0.7802091240882874, 1.1088117361068726, 0.7727574706077576, 1.0732859373092651, 0.25883087515830994, 0.8580639958381653, -0.8193686008453369, -1.2143988609313965, -0.42096102237701416, 5.592052459716797, 0.41015130281448364, 0.6507567167282104, 2.8110806941986084, 7.526437282562256, 2.3188974857330322, 7.0018768310546875, 3.231797695159912, 2.0545995235443115, 1.6128654479980469, 4.6465678215026855, 1.5516663789749146, 1.714942455291748, 5.084629058837891, 2.3604440689086914, 0.5300267934799194, 1.480985403060913, 0.41223475337028503, 1.2992547750473022, 0.7385439276695251, 2.10420560836792, 0.932577908039093, -0.1520778238773346, 1.713442325592041, 1.5210338830947876, 0.5656725764274597, 1.9072049856185913, 0.9567627310752869, 0.3960697650909424, 0.44163215160369873, 0.5878949165344238, 0.8206663131713867, 1.611753225326538, 0.8479095697402954, 0.5944604873657227, 0.7890034914016724, 1.7957267761230469, 0.2998366057872772, 0.22618070244789124, -0.18701373040676117, 0.4275779724121094, 0.6229318976402283, 0.484366774559021, 0.6177490949630737, 0.45515379309654236, 0.8331781625747681, 1.8538588285446167, -0.4489183723926544, 0.12093083560466766, 0.28035518527030945, 2.051271438598633, 0.1941535919904709, -0.5715430378913879, 0.06991387903690338, -0.23077881336212158, 1.0564696788787842, -0.38945966958999634, -2.5332345962524414, 0.8461225032806396, 0.6650053858757019, 2.1577959060668945, -0.2023492157459259, -0.014899578876793385, 1.2793691158294678, 1.315588355064392, 1.7638591527938843, 1.4163093566894531, 0.9151162505149841, 1.0821192264556885, 0.780752420425415, 3.455174207687378, 2.8397932052612305, 1.9887480735778809, 0.8774558305740356, 0.8926156759262085, 1.0601515769958496, 0.10924302041530609, 0.7368251085281372, 1.237809658050537, 0.6107839345932007, 0.23089584708213806, 2.823254346847534, 1.0797215700149536, 0.463812917470932, 1.6288496255874634, 1.098106026649475, 0.2966061234474182, 0.12865206599235535, 6.780473232269287, -0.3926839828491211, -0.8417141437530518, 0.5603635311126709, 1.2253443002700806, 0.5749374628067017, 1.0861812829971313, 0.14323027431964874, 0.837890088558197, -1.0361592769622803, -1.3356995582580566, -0.4629151225090027, 2.809370994567871, 0.35665374994277954, 0.32396990060806274, 2.9100983142852783, 2.6866960525512695, 1.233535647392273, 4.903575897216797, 3.28961443901062, 2.1631999015808105, 1.6127880811691284, 4.525756359100342, 1.3435090780258179, 1.7663136720657349, 4.98877477645874, 2.470659017562866, 0.6718692183494568, 1.4164974689483643, 0.4008151590824127, 1.4083858728408813, 0.6580820679664612, 2.0783207416534424, 0.9338761568069458, -0.20211385190486908, 1.5251353979110718, 1.570773720741272, 0.7841767072677612, 1.8578743934631348, 0.9782386422157288, 0.27680420875549316, 0.3058190643787384, 0.8169229030609131, 0.8495539426803589, 1.5865484476089478, 0.914578914642334, 0.46138980984687805, 0.7614924907684326, 2.0410616397857666, -0.3417319357395172, 0.15728244185447693, -0.10924871265888214, 0.405869722366333, 0.7487831711769104, 0.6119390726089478, 0.6409085392951965, 0.3202405869960785, 0.8153237104415894, 1.7592722177505493, -0.39275893568992615, 0.12709733843803406, 0.04390799254179001, 2.0353190898895264, 0.13898898661136627, -0.5605301260948181, -0.004498795606195927, -0.2200174480676651, 0.8615419864654541, -0.23729310929775238, -2.3160743713378906, 0.9283014535903931, 0.6896944642066956, 1.9768567085266113, -0.14448532462120056, -0.2189287692308426, 1.333641529083252, 1.1834828853607178, 1.696648359298706, 1.4531941413879395, 0.7313092947006226, 0.9738285541534424, 0.757607638835907, 3.4497151374816895, 3.037750482559204, 2.109966278076172, 0.933390736579895, 0.7784393429756165, 1.2766214609146118, 0.13047191500663757, 0.8273962140083313, 1.257369041442871, 0.6205911040306091, 0.2958318889141083, 3.019834280014038, 1.0379300117492676, 0.2847546637058258, 1.555392861366272, 1.0617468357086182, 0.17820194363594055, 0.21733613312244415, 6.705352306365967, 1.7399436235427856, 1.593267560005188, -1.848791480064392, 0.5474113821983337, -0.4398048520088196, 0.6698813438415527, -0.772300660610199, -1.4968303442001343, -0.6162540912628174, 1.213181972503662, 1.14113450050354, -0.7641025185585022, -0.45179712772369385]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (30, 40), 'etaBin': (1.54, 2.5)}}, 'et2_eta0': {'discriminator': {'threshold': -0.06000081673264504, 'nodes': [100, 5, 1], 'bias': [0.07847574353218079, 0.7629546523094177, 0.10928067564964294, 0.19618543982505798, 0.18218255043029785, -0.08439499139785767], 'weights': [-0.7119408845901489, -2.240541696548462, -2.7603185176849365, 0.2700490355491638, -0.41171079874038696, -0.9108693599700928, -0.9470913410186768, -0.1902671903371811, -2.4491517543792725, -3.2685701847076416, 3.370185136795044, 12.913612365722656, 5.621732711791992, 26.516376495361328, 55.569419860839844, 4.388315677642822, 3.5565598011016846, 3.211742401123047, 3.8946003913879395, 3.7326226234436035, 4.113090991973877, 2.12119722366333, 2.739637851715088, 2.7863919734954834, 2.442747116088867, 2.8151042461395264, 2.1818275451660156, 2.2052829265594482, 2.2070767879486084, 2.384472608566284, 1.6437053680419922, 0.8267799019813538, 1.2870289087295532, 3.154662609100342, 1.4556388854980469, 1.5003046989440918, 1.5551685094833374, 1.509101390838623, 1.483616828918457, 1.6190054416656494, 2.250215768814087, 1.4467514753341675, 0.16150003671646118, -8.42698860168457, 1.0536600351333618, 1.1665540933609009, 1.165086269378662, 1.4236738681793213, 1.230736255645752, 0.8768990635871887, 0.6607258915901184, 0.2204592376947403, 0.42039763927459717, 0.7857428193092346, 0.9055647253990173, 0.4581426978111267, 0.0927475318312645, 0.05435469374060631, -0.2726903259754181, -0.5764389038085938, -1.6322872638702393, -2.6324899196624756, 0.5350361466407776, 1.2776252031326294, 2.4128077030181885, 0.8366170525550842, 0.23994331061840057, -0.3887934684753418, 0.0355718694627285, -0.5618188977241516, 0.35970374941825867, 0.8971461653709412, -0.5802282691001892, -0.5947319269180298, 0.966034471988678, 1.4822137355804443, 1.62027108669281, 1.471069574356079, 0.15782611072063446, -0.020223205909132957, 2.823122262954712, 2.693579912185669, 2.8301751613616943, 2.3084781169891357, 1.6026636362075806, 1.6897698640823364, 1.5767418146133423, 5.69877815246582, 2.7764956951141357, 2.256046772003174, 0.16424404084682465, -0.06079587712883949, 3.2271440029144287, 2.1910839080810547, 0.9774269461631775, -0.20367079973220825, 4.154149055480957, 2.442843437194824, 0.2865254580974579, 3.124415397644043, -56.49191665649414, -0.4098327159881592, -0.7341068387031555, -1.5462725162506104, -0.11737889796495438, -0.08675909787416458, -0.6945703625679016, -0.0257110632956028, -5.058988094329834, -3.632960319519043, 0.46336981654167175, 8.2831449508667, 0.7417730093002319, -11.89832592010498, -0.3551108241081238, -0.6785120368003845, -2.656543254852295, 0.4756072461605072, 0.7682706117630005, 0.3508555293083191, 0.7252914309501648, 0.278731107711792, 0.7361022233963013, 0.7715103030204773, 0.19049392640590668, 0.4049382507801056, 0.2623523473739624, -0.08075734227895737, 0.2134803831577301, 0.22921833395957947, 0.261470228433609, 0.43027669191360474, 0.19312967360019684, 0.3928200304508209, 0.44809895753860474, 0.37734153866767883, 0.3831552565097809, 0.2500981092453003, 0.29143449664115906, 0.27737849950790405, 1.7319985628128052, 0.3704843819141388, 0.027276014909148216, 0.17787288129329681, 0.892750084400177, 0.2694832682609558, 0.15648795664310455, 0.2537045478820801, 0.18419775366783142, 0.19120995700359344, 0.11450974643230438, -0.11331019550561905, 0.38909637928009033, 0.5923218727111816, 0.31627798080444336, -0.04405646398663521, 0.0014515798538923264, 0.08459271490573883, -0.10759730637073517, 0.21883749961853027, -0.45896679162979126, -0.18342788517475128, 0.1355195939540863, 0.019575851038098335, 0.25031718611717224, 0.17690414190292358, 0.029845835641026497, -0.015406846068799496, 0.010905565693974495, -0.005880381446331739, -0.039869677275419235, 25.09929656982422, -0.011351218447089195, -0.23217561841011047, -1.473679542541504, 0.1123473197221756, 0.44710657000541687, 0.3514510989189148, -4.154234409332275, -0.02785796858370304, 0.05499179661273956, 0.705963134765625, 0.44965454936027527, 0.8405165672302246, 0.41737860441207886, 0.44072991609573364, 0.20978909730911255, 0.3216022253036499, 0.3156183063983917, -0.6809942722320557, -0.3737870454788208, 0.000582381384447217, -0.27832743525505066, 0.46415385603904724, 0.16863110661506653, 3.162311315536499, 0.7340706586837769, 0.5276182889938354, -0.019018065184354782, 0.13615861535072327, -3.885833740234375, -2.250655174255371, 0.08676255494356155, 0.3059181571006775, -0.3745964467525482, 0.36144012212753296, -0.7617700099945068, -0.6664785742759705, -2.301903009414673, -3.1738085746765137, 3.3496274948120117, 4.603571891784668, 5.325782775878906, -4.5366973876953125, -0.6852859258651733, 3.5065078735351562, 3.6086719036102295, 3.360424518585205, 3.8940789699554443, 3.435147285461426, 3.4170849323272705, 2.007793664932251, 2.9455790519714355, 2.7861993312835693, 2.4028189182281494, 2.2636289596557617, 2.12794828414917, 2.1937096118927, 2.122143268585205, 2.2096493244171143, 1.6055375337600708, 1.6099010705947876, 1.5194404125213623, 4.133847236633301, 1.4598667621612549, 1.6122678518295288, 1.4496665000915527, 1.5963572263717651, 1.616939902305603, 1.5164343118667603, 3.1513895988464355, 1.4457648992538452, 1.1238073110580444, 0.6345608234405518, 1.2533984184265137, 1.018856167793274, 0.7702746987342834, 0.8643901348114014, 0.7191444635391235, 0.9200932383537292, 0.7738093137741089, 0.34013867378234863, 1.3611621856689453, 0.7824179530143738, 1.0800970792770386, 0.5242002606391907, 0.26881375908851624, -0.007204233668744564, -0.2283705621957779, -0.501410961151123, -1.6035155057907104, -0.7626625299453735, 1.4196206331253052, 1.171082854270935, 2.4265995025634766, 0.9581426382064819, 0.2041902095079422, -0.254436731338501, 0.10813120752573013, -0.4622395634651184, 0.1457851231098175, 0.8357154726982117, -0.4234122037887573, -0.485456645488739, 0.8002054691314697, 1.5129543542861938, 1.6100502014160156, 1.620447039604187, 1.0160433053970337, 0.39991846680641174, 2.8421740531921387, 3.086730718612671, 3.16877818107605, 3.2167727947235107, 1.7400325536727905, 1.6114381551742554, 1.3821934461593628, 1.6403707265853882, 3.987455368041992, 2.641127347946167, 1.1868956089019775, -0.1966841071844101, 3.11489200592041, 2.3976504802703857, 1.0971933603286743, -0.1261538565158844, 4.030074119567871, 2.5336809158325195, 0.2542243003845215, 0.40848666429519653, -3.6147656440734863, -2.1539711952209473, 0.045470431447029114, 0.7304039597511292, -0.3738579750061035, -0.6959854364395142, -0.6956247091293335, -0.5939298868179321, -2.439155340194702, -3.18929123878479, 5.671125888824463, 4.483436584472656, 5.276941299438477, 4.772185325622559, -0.54397052526474, 3.5849523544311523, 3.6388955116271973, 3.3671553134918213, 4.1331281661987305, 3.3683149814605713, 3.404278039932251, 2.116446018218994, 2.9454658031463623, 2.9406914710998535, 2.028132677078247, 2.127959966659546, 2.0885345935821533, 2.175482749938965, 2.2884764671325684, 2.2066760063171387, 2.0421037673950195, 1.5948137044906616, 1.611924409866333, 4.083347797393799, 1.4701485633850098, 1.4637832641601562, 1.4488550424575806, 1.4325478076934814, 1.5399307012557983, 1.6220324039459229, 2.905242919921875, 1.3415616750717163, 1.1074074506759644, 0.6788487434387207, 1.1415725946426392, 1.1479862928390503, 0.8960355520248413, 0.7605296969413757, 0.8521959781646729, 0.9242546558380127, 0.8740400671958923, 0.1877056062221527, 1.4756288528442383, 0.7101624608039856, 2.6559505462646484, 0.37599489092826843, 0.06333006173372269, -0.04173819720745087, -0.24581675231456757, -0.5424069166183472, -1.6604419946670532, -0.7659134864807129, 0.8391252160072327, 2.537083864212036, 2.3545873165130615, 0.9121683835983276, 0.10163474828004837, -0.32298609614372253, 0.13920442759990692, -0.394283652305603, 0.18470700085163116, 0.6860589385032654, -0.6604444980621338, -0.6959370374679565, 0.7248620390892029, 1.5838512182235718, 1.7571015357971191, 1.4008452892303467, 0.9828911423683167, 0.36834990978240967, 2.867776393890381, 4.006468772888184, 3.2964606285095215, 3.3589704036712646, 1.7385478019714355, 1.744105577468872, 1.2849962711334229, 1.6732823848724365, 3.8446593284606934, 2.7659952640533447, 1.2162116765975952, -0.08323752135038376, 3.2214784622192383, 2.3385660648345947, 0.9700197577476501, -0.3291915953159332, 4.1662797927856445, 2.549304485321045, 0.22350864112377167, 0.30393296480178833, -3.6114461421966553, -2.3934710025787354, 0.09477496892213821, 0.3588869571685791, -0.45580652356147766, -0.7425466179847717, -0.7596940398216248, -0.6543024182319641, -2.3511250019073486, -2.977902889251709, 3.531572103500366, 4.63935661315918, 5.377264022827148, 1.71120023727417, -0.6276735663414001, 3.5791587829589844, 3.644695281982422, 3.318505048751831, 4.479356288909912, 3.693902015686035, 3.3519914150238037, 2.0276482105255127, 2.944472551345825, 3.9413626194000244, 2.0502684116363525, 2.1641287803649902, 2.111687421798706, 2.2166693210601807, 1.618442416191101, 1.6708953380584717, 1.9803305864334106, 1.6056240797042847, 1.5804476737976074, 4.259450912475586, 1.5122487545013428, 1.5869331359863281, 1.5093088150024414, 1.4131137132644653, 1.599554181098938, 1.534354567527771, 2.8035945892333984, 1.3648053407669067, 0.938794732093811, 0.7846008539199829, 0.8212500214576721, 0.8945085406303406, 0.9411532878875732, 0.8930754661560059, 0.7907464504241943, 0.8233004212379456, 0.896054208278656, 0.31046944856643677, 1.5223931074142456, 0.721443235874176, 1.0003323554992676, 0.541334331035614, 0.12053316831588745, -0.008119943551719189, -0.369466096162796, -0.7188175916671753, -1.6764843463897705, -0.7763171195983887, 1.4366395473480225, 1.1803926229476929, 2.5309770107269287, 0.7898460626602173, 0.17730993032455444, -0.32265764474868774, -0.005061417818069458, -0.4954034388065338, 0.33508720993995667, 0.7351938486099243, -0.6127973198890686, -0.48705407977104187, 0.8037559390068054, 1.3957831859588623, 1.6182202100753784, 1.54705810546875, 1.1642327308654785, 0.5082777142524719, 2.676494598388672, 3.9732484817504883, 3.3225440979003906, 3.216959238052368, 1.6738606691360474, 1.7805352210998535, 1.4509203433990479, 1.481755018234253, 3.917235851287842, 2.8054752349853516, 1.0479758977890015, -0.2747025787830353, 3.027235269546509, 2.5161335468292236, 0.6379184126853943, -0.3682080805301666, 3.984583854675293, 2.4014289379119873, -0.09441936016082764, 0.21489889919757843, -0.7867413759231567, -0.4875887334346771, -0.6358382105827332, -1.8459546566009521, -2.2943880558013916]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (30, 40), 'etaBin': (0, 0.8)}}, 'et1_eta2': {'discriminator': {'threshold': 0.029999205470085138, 'nodes': [100, 5, 1], 'bias': [0.09213433414697647, -0.23188082873821259, -0.022360503673553467, -0.04104926064610481, 0.03756337985396385, -0.0800914540886879], 'weights': [0.5904896855354309, 0.03893570229411125, -1.3907091617584229, -1.7032928466796875, -0.17930108308792114, -0.08128349483013153, -1.1231359243392944, -0.4356464147567749, -3.0507562160491943, 3.4091029167175293, 3.001242160797119, 2.186160087585449, -0.10801549255847931, -0.3285580277442932, 0.4429783225059509, 1.0124597549438477, -2.9995498657226562, 0.9482599496841431, 1.1347765922546387, -1.0792865753173828, -2.8616366386413574, -2.19612455368042, -0.933168351650238, -0.34021806716918945, -2.1018013954162598, -0.9993510842323303, -1.1490378379821777, -2.6507275104522705, -2.175452709197998, -2.6680071353912354, -1.598770022392273, -0.6464859843254089, 2.9719316959381104, -2.507420539855957, -2.6244289875030518, -1.669575572013855, -2.7445647716522217, -1.4244457483291626, -0.9748613834381104, -0.6090899109840393, -2.1220827102661133, 4.71447229385376, -1.5496011972427368, -1.635913610458374, -1.1907134056091309, -0.014827021397650242, -0.6180021166801453, -0.7886080741882324, 0.8222874402999878, -1.2192057371139526, 0.03905884549021721, -0.6332072019577026, 3.0907986164093018, -1.273242712020874, -1.4562478065490723, -0.7722591161727905, -0.9486415982246399, -0.8034889698028564, 3.963317632675171, -1.277497410774231, -1.5324105024337769, -1.5171821117401123, -0.7567922472953796, 11.43925952911377, 5.547926902770996, 2.2526206970214844, 0.32004526257514954, -0.08272207528352737, -0.8711645007133484, -1.5131275653839111, -5.475527286529541, -2.480309009552002, 0.15551942586898804, 0.6227447390556335, -2.8719332218170166, -1.444675326347351, -2.0609018802642822, -1.8438037633895874, -0.7539303302764893, -0.5538824200630188, 0.029319029301404953, -2.5630404949188232, -2.5874741077423096, -0.8599187135696411, -1.672669768333435, -1.1529184579849243, -1.4896444082260132, -1.1326221227645874, 0.6330705285072327, -0.6693201661109924, -0.13246819376945496, 0.21245704591274261, -2.72232723236084, -0.7060127854347229, -0.521721363067627, -1.2177700996398926, -0.02182083949446678, 0.08974209427833557, -0.7891942858695984, -2.5173909664154053, -0.008088058792054653, -0.36212486028671265, 0.23218347132205963, 0.22939063608646393, 0.0789651870727539, -0.10735327750444412, 0.16151665151119232, -0.04628978669643402, 0.3349303603172302, -0.7026050090789795, -0.6477628946304321, -0.3520905673503876, 0.1677282303571701, 0.8560368418693542, -0.1344541609287262, -0.17212247848510742, 0.4232829213142395, -0.22554950416088104, -0.4439670741558075, -0.0494656004011631, 0.44899943470954895, 0.3173619508743286, 0.20028135180473328, 0.0868181511759758, 0.4064970910549164, 0.24186518788337708, 0.13442009687423706, 0.49868378043174744, 0.4536883234977722, 0.41789302229881287, 0.2941080629825592, 0.08372219651937485, -0.6924700140953064, 0.3533497452735901, 0.5764604210853577, 0.28987061977386475, 0.44642946124076843, 0.2365383356809616, 0.1317114382982254, 0.049991242587566376, 0.45580965280532837, -0.9969360828399658, 0.14324866235256195, 0.26984602212905884, 0.1351763904094696, -0.07751408964395523, 0.07537492364645004, 0.07581835985183716, -0.2067098617553711, 0.22372019290924072, -0.14219994843006134, 0.17268246412277222, -0.8246129751205444, 0.15458162128925323, 0.2911348044872284, 0.16611871123313904, 0.10237517952919006, -0.02008274383842945, -0.8829513788223267, 0.10081202536821365, 0.21726326644420624, 0.1398436278104782, 0.11100310832262039, -2.3700549602508545, -1.3163566589355469, -0.4976082444190979, -0.2008645087480545, -0.05346931144595146, 0.01672099158167839, 0.2794433832168579, 1.153123378753662, 0.5347667336463928, -0.23591700196266174, 0.06366326659917831, 0.5289624929428101, 0.3109363913536072, 0.26955440640449524, 0.21271485090255737, 0.059970956295728683, -0.05220668762922287, -0.08240161091089249, 0.5594058036804199, 0.5780542492866516, -0.006105588749051094, 0.24551650881767273, 0.19855040311813354, 0.2277381420135498, 0.20978404581546783, 0.010368341580033302, -0.008331459946930408, 0.007413141895085573, -0.22215430438518524, 0.46232789754867554, 0.05946789309382439, 0.1490078866481781, 0.14973200857639313, -0.11406383663415909, -0.06628511101007462, 0.21060946583747864, 0.38572537899017334, 0.6790534853935242, -0.0625845268368721, -1.4726331233978271, -1.4356392621994019, -0.12817269563674927, -0.2684076130390167, -1.1802328824996948, 0.5320567488670349, -0.5610719919204712, 3.69439959526062, 3.151961088180542, 2.26894474029541, -0.06426209956407547, -3.326401472091675, 0.9820716381072998, 1.7997863292694092, -2.8844730854034424, 0.949916660785675, 1.9055261611938477, -0.28290674090385437, -2.8899521827697754, -2.081645965576172, -0.9682865738868713, -0.2956332564353943, -1.904733419418335, -1.0034464597702026, -1.4726214408874512, -2.6972193717956543, -2.149054527282715, -2.6661837100982666, -1.8061586618423462, -0.7728073000907898, 3.0695223808288574, -2.555445432662964, -2.6622440814971924, -1.762162446975708, -2.738736152648926, -1.5288463830947876, -1.049529790878296, -0.8103806376457214, -2.27580189704895, 4.559605121612549, -1.5203019380569458, -1.550980806350708, -1.1586025953292847, -0.5841806530952454, -0.579011857509613, -0.651354193687439, 0.8221023678779602, -1.1980561017990112, 0.065700463950634, -0.6556133031845093, 2.9849350452423096, -1.2717925310134888, -1.424140214920044, -0.6916865706443787, -0.9612129330635071, -0.792949914932251, 3.9885778427124023, -1.2518304586410522, -1.5309427976608276, -1.4580252170562744, -0.8494288325309753, 11.549216270446777, 5.5689897537231445, 2.112680673599243, 0.3473624289035797, -0.06544961035251617, -0.8742182850837708, -1.3191906213760376, -5.648783206939697, -2.374908447265625, 0.04539087414741516, 0.580887496471405, -2.9228873252868652, -1.5327987670898438, -1.870954155921936, -1.6144806146621704, -0.9528557658195496, -0.6053400635719299, 0.03321241959929466, -2.4870898723602295, -2.6514077186584473, -0.9663213491439819, -1.836551308631897, -0.943376362323761, -1.1616631746292114, -1.073682188987732, 0.6118646264076233, -0.6491239666938782, -0.48891928791999817, 0.20361731946468353, -2.894702196121216, -0.7100587487220764, -0.430533230304718, -1.1173512935638428, 0.07548007369041443, -0.033040277659893036, -0.9127926230430603, -2.6644287109375, -0.629770815372467, -0.07850421220064163, 1.4082646369934082, 1.3599551916122437, 0.19849306344985962, 0.23612728714942932, 1.1846352815628052, -0.4241095781326294, 3.0868964195251465, -3.493380308151245, -2.861161470413208, -2.2373175621032715, 0.048551034182310104, 0.446251779794693, -0.44748467206954956, -1.0757741928100586, 2.8319435119628906, -0.9173075556755066, -0.9451092481613159, 0.31820836663246155, 2.751389503479004, 2.2438759803771973, 0.8698926568031311, 0.4281347393989563, 2.0359036922454834, 1.1272084712982178, 1.5681869983673096, 2.4893717765808105, 2.0592267513275146, 2.616725444793701, 1.649046778678894, 0.787843644618988, -3.0635390281677246, 2.574495792388916, 2.610328197479248, 1.8476383686065674, 2.716024160385132, 1.4725632667541504, 0.9866077303886414, 0.6180453896522522, 2.3364200592041016, -4.705195903778076, 1.506639838218689, 1.6076021194458008, 0.9751289486885071, 0.5456989407539368, 0.5271331667900085, 0.6558789014816284, -0.8371469378471375, 1.0203856229782104, -0.013975318521261215, 0.7584142684936523, -2.991203784942627, 1.2342934608459473, 1.418912410736084, 0.8065088987350464, 1.038306474685669, 0.6427537798881531, -3.8408119678497314, 1.2946735620498657, 1.5718222856521606, 1.6892096996307373, 0.6667776703834534, -11.493181228637695, -5.559185028076172, -2.1062769889831543, -0.446382075548172, 0.2928588390350342, 0.8152022957801819, 1.4135942459106445, 5.444582462310791, 2.3882269859313965, -0.08741159737110138, -0.44619089365005493, 3.0019993782043457, 1.5476585626602173, 1.9402860403060913, 1.632541537284851, 0.9815916419029236, 0.6687995195388794, -0.1889418661594391, 2.5583789348602295, 2.2068729400634766, 0.8004432916641235, 1.6298130750656128, 1.104409098625183, 1.1206876039505005, 1.1845680475234985, -0.5918524861335754, 0.5153836607933044, -0.05285320058465004, -0.38325634598731995, 2.7411727905273438, 0.681136429309845, 0.5474600791931152, 1.2225672006607056, -0.10717086493968964, 0.06011933460831642, 1.0072410106658936, 2.5828940868377686, -0.7259383797645569, -0.016049988567829132, 1.543966293334961, 1.5821679830551147, 0.14803296327590942, 0.24122636020183563, 1.078426718711853, -0.42724740505218506, 0.5997751951217651, -3.838749885559082, -3.0026040077209473, -2.3924615383148193, -0.02239542454481125, 3.494504928588867, -1.005405306816101, -1.7695751190185547, 2.9350998401641846, -0.9304192662239075, -1.9162030220031738, 0.4818142354488373, 2.88106369972229, 2.149655342102051, 0.8577679991722107, 0.21102914214134216, 2.0918517112731934, 0.9984931945800781, 1.410853385925293, 2.6451926231384277, 2.114591360092163, 2.732818603515625, 1.5853537321090698, 0.6914913058280945, -3.081550121307373, 2.6373603343963623, 2.496070146560669, 1.7700231075286865, 2.7934415340423584, 1.4922529458999634, 0.9308130741119385, 0.6724027395248413, 2.326244592666626, -4.52893590927124, 1.3958758115768433, 1.5147380828857422, 1.1259888410568237, 0.5307672619819641, 0.5730082392692566, 0.6693390607833862, -0.8560463786125183, 1.1814037561416626, -0.08019416034221649, 0.8441669940948486, -3.1649646759033203, 1.1468080282211304, 1.5281178951263428, 0.6987478137016296, 1.06266188621521, 0.603773295879364, -3.802156925201416, 1.318844199180603, 1.6397875547409058, 1.6550276279449463, 0.8351544737815857, -11.452370643615723, -5.521458625793457, -2.293156623840332, -0.4740429222583771, 0.1676577776670456, 0.8885350823402405, 1.3051804304122925, 5.613041400909424, 2.4396400451660156, -0.028703929856419563, -0.6290497779846191, 2.951404094696045, 1.5168440341949463, 1.9830490350723267, 1.6369656324386597, 0.9549140334129333, 0.6835190057754517, -0.027351686730980873, 2.474626302719116, 2.6867542266845703, 0.7921246290206909, 1.6991311311721802, 1.0826727151870728, 0.9945557713508606, 1.2690974473953247, -0.6617172360420227, 0.6684654355049133, 0.5199615955352783, -0.3760114014148712, 2.87965989112854, 0.726798951625824, 0.5863709449768066, 1.1498115062713623, -0.007829710841178894, 0.0622253343462944, 0.816074550151825, 2.5150094032287598, 0.8264837265014648, -0.13779251277446747, 1.0971431732177734, -2.029695987701416, -2.529853105545044]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (20, 30), 'etaBin': (1.37, 1.54)}}} - signatures["ElectronHighEnergyVeryLooseConf"]={'et3_eta2': {'discriminator': {'threshold': 0.63999844789505, 'nodes': [100, 7, 1], 'bias': [0.14202213287353516, 0.044922810047864914, 0.130228653550148, -0.23902182281017303, -0.06338616460561752, -0.09544681757688522, -0.012388982810080051, 0.052718501538038254], 'weights': [0.28274717926979065, -0.0902794897556305, -1.1716275215148926, -1.3358254432678223, -1.1099737882614136, -1.2971314191818237, -1.1283234357833862, 1.2253859043121338, 0.06466394662857056, 3.320276975631714, 3.171196460723877, 1.138137936592102, 0.045503389090299606, 0.22475014626979828, 0.17751266062259674, 0.06439196318387985, -2.633634567260742, -0.034996699541807175, -0.26828062534332275, -2.000157594680786, -6.725962162017822, -1.618412971496582, -0.08970476686954498, -1.3093565702438354, 0.6815795302391052, -4.424966335296631, -4.0503716468811035, -1.5026123523712158, -4.661406517028809, -2.0828752517700195, -0.5624021291732788, -1.2347328662872314, -1.6328587532043457, -1.1456995010375977, -1.8225566148757935, -3.344203233718872, -5.027546405792236, -4.453680992126465, 2.239474058151245, -1.0636610984802246, -1.310888409614563, -2.8235020637512207, -1.498542070388794, -1.2264456748962402, -1.2086938619613647, -1.15601646900177, -1.4287259578704834, -1.165838360786438, -1.8594722747802734, -4.3931884765625, -0.19476176798343658, -3.165910005569458, -3.085859537124634, -2.0063984394073486, -1.8945086002349854, -16.13319969177246, -1.3044785261154175, -1.3416823148727417, 2.1770057678222656, -0.7433953881263733, 0.12988553941249847, -0.9316554069519043, 2.217691659927368, 1.3818416595458984, -0.5709995627403259, 0.10366477817296982, 1.7351735830307007, -2.106459379196167, -0.9717280268669128, -2.6626627445220947, -14.11143684387207, 1.331822395324707, 0.20649340748786926, 0.2823592722415924, -3.0638129711151123, -1.2494398355484009, -2.881779670715332, -2.7773523330688477, -1.3643923997879028, -2.6660802364349365, 0.12275853753089905, -0.531599223613739, -2.955622911453247, -1.8080048561096191, -1.099861979484558, -1.2246712446212769, -2.114856481552124, -3.929741382598877, 0.15120084583759308, -1.2696914672851562, -0.9174460172653198, -0.6061720848083496, -1.789094090461731, -3.2463278770446777, 0.8811066746711731, -0.703289806842804, 0.060550328344106674, 0.023639215156435966, -0.6814206838607788, -3.909001350402832, 0.18770723044872284, -0.1405377835035324, -1.2302677631378174, -1.2209010124206543, -1.1579291820526123, -1.246543049812317, -1.0957294702529907, 1.1706188917160034, -0.014210512861609459, 3.3775975704193115, 3.121427536010742, 1.215960144996643, -0.011379869654774666, 0.055852439254522324, 0.11891841888427734, -0.00011067414015997201, -2.463144302368164, 0.05265668407082558, -0.21255169808864594, -2.0422146320343018, -6.922985553741455, -1.5908870697021484, -0.05098368227481842, -1.2778136730194092, 0.672627866268158, -4.401785850524902, -4.167597770690918, -1.497903823852539, -4.746738433837891, -2.0047824382781982, -0.39979735016822815, -1.1637401580810547, -1.6208927631378174, -1.1186578273773193, -1.8880037069320679, -3.3668735027313232, -5.20128059387207, -4.5024027824401855, 2.1461684703826904, -1.0649056434631348, -1.2864209413528442, -2.715212821960449, -1.4060957431793213, -1.242992877960205, -1.0179378986358643, -1.1375652551651, -1.2584116458892822, -1.055956482887268, -1.7858989238739014, -4.418509006500244, -0.11106868088245392, -3.0379960536956787, -3.0995235443115234, -2.135347843170166, -1.9988124370574951, -15.904447555541992, -1.1588839292526245, -1.3118478059768677, 2.1590986251831055, -0.9344964623451233, -0.0135507732629776, -0.8568328022956848, 2.0817148685455322, 1.2662397623062134, -0.4850042164325714, 0.1536051332950592, 1.8482657670974731, -1.9428343772888184, -0.954640805721283, -2.658745050430298, -9.85637092590332, 1.3575080633163452, 0.06733619421720505, 0.30169108510017395, -3.0705435276031494, -1.178808569908142, -1.454285740852356, -1.2192264795303345, -1.438407301902771, -2.5547242164611816, -0.00877488311380148, -0.5377897620201111, -2.9677164554595947, -1.9030320644378662, -1.2191334962844849, -1.0897046327590942, -2.232499361038208, -4.124947547912598, 0.6349344849586487, -1.1538774967193604, -1.0822242498397827, -0.5848073959350586, -1.8498214483261108, -3.295718193054199, 1.0382333993911743, -0.6621528267860413, 0.07696890830993652, 0.0424940399825573, -0.4925270080566406, -3.891364574432373, 0.2936531603336334, -0.08454501628875732, -1.3505454063415527, -1.1100420951843262, -1.0956943035125732, -1.2969938516616821, -1.19979989528656, 1.156850814819336, 0.10668422281742096, 3.385024309158325, 3.27032470703125, 1.3354922533035278, -0.0006183558725751936, 0.11222503334283829, 0.11331998556852341, 0.151800274848938, -2.5373029708862305, 0.022961391136050224, -0.14889909327030182, -1.9839359521865845, -6.814295291900635, -1.7548489570617676, -0.060591235756874084, -1.2306143045425415, 0.6699003577232361, -4.380358695983887, -4.096383094787598, -1.4795560836791992, -4.785045623779297, -1.9159256219863892, -0.44302597641944885, -1.3554067611694336, -1.4681158065795898, -1.1972999572753906, -1.9608839750289917, -3.4111669063568115, -5.071067810058594, -4.420048236846924, 2.096034288406372, -1.073103666305542, -1.4559451341629028, -2.8757550716400146, -1.5540671348571777, -1.4096827507019043, -1.1300352811813354, -1.1148945093154907, -1.2811181545257568, -0.9829069972038269, -1.669853925704956, -4.369635581970215, -0.23904581367969513, -3.072566270828247, -2.955306053161621, -2.013627290725708, -1.9658594131469727, -16.02226448059082, -1.2750412225723267, -1.215607762336731, 2.318936824798584, -0.8296549916267395, 0.17947354912757874, -0.9137855172157288, 2.254194736480713, 1.352735996246338, -0.6126715540885925, 0.24527733027935028, 1.6311631202697754, -1.948216438293457, -1.0399196147918701, -2.6666765213012695, -14.206071853637695, 1.3620108366012573, 0.15816786885261536, 0.14013929665088654, -2.9734251499176025, -1.2094577550888062, -2.8923392295837402, -2.782792806625366, -1.386623501777649, -2.4949629306793213, 0.1145109087228775, -0.35467785596847534, -2.934598207473755, -1.894834280014038, -1.173606038093567, -1.0315607786178589, -2.0828115940093994, -3.9362707138061523, 0.22694946825504303, -1.1036574840545654, -1.0480130910873413, -0.48877695202827454, -1.848626732826233, -3.096954822540283, 0.9614549279212952, -0.7965526580810547, 0.10809937119483948, 0.007918222807347775, -0.6243818998336792, -3.9375853538513184, 0.051183849573135376, 0.09048901498317719, -0.4733905494213104, -0.3319469392299652, -0.2653762698173523, -0.4868011474609375, -0.297495573759079, 0.560832142829895, -0.05003780126571655, 1.3924373388290405, 1.3854362964630127, 0.5146607756614685, -0.19103823602199554, -0.017589056864380836, 0.023756936192512512, 0.0330176055431366, -1.114441156387329, -0.22596734762191772, -0.7708549499511719, -0.6054661870002747, -2.9334278106689453, -0.6454871296882629, 0.05751057714223862, -0.41776296496391296, 0.5411032438278198, -1.7859348058700562, -1.719722867012024, -0.580839216709137, -2.130156993865967, -0.7216871976852417, -0.10892875492572784, -0.4566148519515991, -0.6056199073791504, -0.4279724359512329, -0.7769535779953003, -1.4744900465011597, -2.1605429649353027, -1.7213953733444214, 1.1051760911941528, -0.3211342394351959, -0.445777952671051, -1.1812955141067505, -0.5576277375221252, -0.4195803701877594, -0.3422568142414093, -0.22653773427009583, -0.4695035219192505, -0.3262995183467865, -0.735004186630249, -1.9418224096298218, 0.09174071997404099, -1.168866515159607, -1.22128164768219, -0.7043483257293701, -0.7283256649971008, -7.204474925994873, -0.3798859715461731, -0.33746176958084106, 1.1496115922927856, -0.20708248019218445, 0.22945275902748108, -0.22658023238182068, 1.0233837366104126, 0.8642142415046692, -0.18985693156719208, 0.1500888168811798, 0.8520581126213074, -0.7269424796104431, -0.35286080837249756, -1.0235799551010132, -6.348456382751465, 0.8705183863639832, 0.15560570359230042, 0.08678900450468063, -1.209613561630249, -0.4835868179798126, -0.4736233949661255, -0.3437206447124481, -0.33955317735671997, -0.9751660823822021, -0.29732581973075867, -0.06590645760297775, -1.1636468172073364, -0.6912620067596436, -0.4436054527759552, -0.42642655968666077, -0.7728438377380371, -1.5741921663284302, 0.05708381533622742, -0.4356011748313904, -0.3077152967453003, -0.048934049904346466, -0.5054852366447449, -1.3148101568222046, 0.6431949734687805, -0.3225339353084564, 0.07493171840906143, 0.10042744129896164, -0.04590907320380211, -1.7250473499298096, -0.0603816881775856, 0.23417924344539642, 1.2101662158966064, 1.2427308559417725, 1.1328670978546143, 1.2249811887741089, 0.9862027764320374, -1.161576747894287, -0.04822760447859764, -3.262429714202881, -3.2015626430511475, -1.338485598564148, -0.15154676139354706, -0.07190978527069092, -0.1653263121843338, -0.15322059392929077, 2.595893383026123, -0.11972130835056305, 0.18652082979679108, 2.0217485427856445, 6.926002025604248, 1.5598387718200684, 0.16886068880558014, 1.2638275623321533, -0.5272692441940308, 4.492748260498047, 4.03787899017334, 1.5100269317626953, 4.785079002380371, 1.9689689874649048, 0.2699744701385498, 1.345538854598999, 1.4226157665252686, 1.2248382568359375, 1.8355270624160767, 3.399639368057251, 5.029793739318848, 4.3292717933654785, -2.115488052368164, 1.0870859622955322, 1.2395857572555542, 2.6768858432769775, 1.5618555545806885, 1.2893359661102295, 1.2196587324142456, 0.9908119440078735, 1.4075284004211426, 1.1343210935592651, 1.82818603515625, 4.285490036010742, 0.18009521067142487, 3.0944271087646484, 2.924328088760376, 2.0661463737487793, 2.0301294326782227, 16.130718231201172, 1.1917723417282104, 1.2245737314224243, -2.1768124103546143, 0.749620258808136, -0.12066446244716644, 0.9654014110565186, -2.0959198474884033, -1.3426272869110107, 0.4436481297016144, -0.20915882289409637, -1.6357824802398682, 1.9860965013504028, 0.9602493643760681, 2.645803689956665, 9.665706634521484, -1.38805091381073, -0.12973235547542572, -0.08195609599351883, 3.0752155780792236, 1.3292607069015503, 1.2726296186447144, 1.3841434717178345, 1.4111193418502808, 2.6714603900909424, 0.02954469993710518, 0.5684002041816711, 2.8847787380218506, 1.7597341537475586, 1.191670298576355, 1.0492116212844849, 2.0593647956848145, 4.1192450523376465, -0.7738291621208191, 1.2191345691680908, 0.9027732610702515, 0.5678022503852844, 1.767541766166687, 3.1131906509399414, -0.8755212426185608, 0.7946219444274902, -0.058945488184690475, 0.07659655064344406, 0.6571308374404907, 3.925680160522461, -0.07904722541570663, 0.09933401644229889, 1.1631450653076172, 1.292356252670288, 1.1254448890686035, 1.2377358675003052, 1.2000197172164917, -1.2117499113082886, -0.1780625283718109, -3.26377534866333, -3.06864595413208, -1.1412039995193481, -0.19419358670711517, -0.05612161383032799, -0.1832316666841507, -0.14489597082138062, 2.4453468322753906, -0.08739234507083893, 0.26468759775161743, 1.9401435852050781, 6.82135534286499, 1.6155610084533691, 0.17874838411808014, 1.2941884994506836, -0.6455373167991638, 4.384232997894287, 4.177690029144287, 1.375864028930664, 4.703462600708008, 2.041057586669922, 0.35167667269706726, 1.24973726272583, 1.5953521728515625, 1.2429873943328857, 1.7988351583480835, 3.3330843448638916, 5.070181846618652, 4.270904064178467, -2.24532413482666, 0.9881550669670105, 1.4153648614883423, 2.68945050239563, 1.424712896347046, 1.4129841327667236, 1.0125186443328857, 1.1543220281600952, 1.3040084838867188, 1.0121275186538696, 1.8835437297821045, 4.269620895385742, 0.21178914606571198, 3.054622173309326, 2.9546971321105957, 2.1172122955322266, 2.0112013816833496, 16.03333282470703, 1.143807291984558, 1.3549410104751587, -2.172865629196167, 0.8555322289466858, -0.15370137989521027, 0.8155571818351746, -2.0952937602996826, -1.2124121189117432, 0.5474461913108826, -0.23574058711528778, -1.8112386465072632, 2.120798349380493, 0.8876272439956665, 2.5760042667388916, 14.055011749267578, -1.3161897659301758, -0.19645124673843384, -0.18186043202877045, 3.0352323055267334, 1.2923511266708374, 1.2616549730300903, 2.6287970542907715, 1.4860528707504272, 2.4803502559661865, -0.12982788681983948, 0.439534991979599, 2.889356851577759, 1.8662235736846924, 1.1233550310134888, 1.044345736503601, 2.0779550075531006, 3.993479013442993, -0.6578121781349182, 1.232187032699585, 0.8924049139022827, 0.6412978172302246, 1.8662434816360474, 3.1129326820373535, -0.9073031544685364, 0.7616286277770996, -0.09526926279067993, 0.10485108941793442, 0.523346483707428, 3.7854385375976562, 0.17648743093013763, -0.2528316378593445, -1.2156128883361816, -1.1102771759033203, -1.0704588890075684, -1.2753180265426636, -1.210276484489441, 0.9992573261260986, 0.1409521847963333, 3.2184674739837646, 3.1039376258850098, 1.151229977607727, 0.09455053508281708, 0.23564834892749786, 0.09298748522996902, 0.1539033055305481, -2.470391273498535, 0.12664496898651123, -0.23481540381908417, -1.9038240909576416, -6.783145427703857, -1.6993741989135742, -0.11947531998157501, -1.2329158782958984, 0.5226105451583862, -4.325520992279053, -4.037867546081543, -1.550290584564209, -4.854043006896973, -1.916058897972107, -0.37323376536369324, -1.2939159870147705, -1.6378166675567627, -1.3380255699157715, -1.9009093046188354, -3.302973508834839, -5.188836574554443, -4.369269371032715, 2.299292802810669, -1.1578855514526367, -1.3190635442733765, -2.8401646614074707, -1.5704522132873535, -1.4302914142608643, -1.2236803770065308, -1.0672663450241089, -1.2983427047729492, -1.0083593130111694, -1.902198076248169, -4.474057197570801, -0.18566705286502838, -3.0211009979248047, -3.002972364425659, -2.0178515911102295, -1.930372953414917, -15.964561462402344, -1.225709080696106, -1.3742645978927612, 2.3071861267089844, -0.8480401635169983, 0.01940225251019001, -0.9427683353424072, 2.298581600189209, 1.2756229639053345, -0.5297210216522217, 0.09697975963354111, 1.660962462425232, -1.9817538261413574, -0.8847788572311401, -2.6862776279449463, -9.727682113647461, 1.4013739824295044, 0.17543819546699524, 0.26084262132644653, -2.953389883041382, -1.2830952405929565, -1.4196559190750122, -1.4025901556015015, -1.4884506464004517, -2.6430399417877197, 0.012899785302579403, -0.4018450379371643, -3.0324909687042236, -1.7914526462554932, -1.2262786626815796, -1.0926862955093384, -2.1743857860565186, -3.9383301734924316, 0.8301222920417786, -1.1796116828918457, -1.069738507270813, -0.6172525882720947, -1.7295562028884888, -3.3269524574279785, 1.008524775505066, -0.8471908569335938, -0.017537109553813934, 0.08606838434934616, -0.4558980464935303, -3.909362316131592, 0.9480514526367188, 2.385404586791992, 0.9066774845123291, 0.14874543249607086, -1.9307057857513428, -1.6492191553115845, 3.136667490005493]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (1.37, 1.54)}}, 'et1_eta3': {'discriminator': {'threshold': -0.25500081777572631, 'nodes': [100, 7, 1], 'bias': [-0.03094511106610298, -0.5799899697303772, -0.2377893626689911, -0.026239745318889618, 0.046430233865976334, -0.5510327816009521, -0.0039180004969239235, -0.051922306418418884], 'weights': [-2.1007091999053955, -2.313844680786133, 1.0081775188446045, 1.1952576637268066, 1.1381967067718506, 0.05225830525159836, 0.8718470931053162, 0.7521812915802002, -2.3881070613861084, -3.520962715148926, -1.7607707977294922, 1.2383842468261719, 0.5015622973442078, 0.5506165623664856, 7.889691352844238, 4.487699508666992, 2.413928270339966, 4.557316780090332, 2.7182300090789795, 6.116832256317139, 1.8896197080612183, 2.954477071762085, 2.252577304840088, 4.00665807723999, 7.100888729095459, 3.796987533569336, 1.3658812046051025, 2.5489814281463623, 2.373077392578125, 2.194671869277954, 3.1750872135162354, 2.3532614707946777, 1.3565171957015991, 2.281101703643799, 1.3306998014450073, 2.118257999420166, 2.540738105773926, 0.7964193224906921, 0.5464814305305481, 2.3898704051971436, 1.2077999114990234, 1.6454503536224365, 1.5282938480377197, 2.09716796875, -0.790364146232605, 2.1279666423797607, 0.2590458393096924, 1.4781116247177124, -0.3069359362125397, 1.6084834337234497, 1.3704075813293457, 1.980455994606018, 1.8952268362045288, 0.6363973617553711, 1.8800452947616577, 1.7378103733062744, 0.6629533171653748, 1.0552384853363037, 0.9378629326820374, 0.7483189702033997, -0.1298983097076416, 0.9791874289512634, 0.8771135210990906, -1.0042057037353516, 0.40825867652893066, 1.1051154136657715, 1.0564031600952148, 0.45147621631622314, -1.067683219909668, -1.2380783557891846, -3.285083770751953, 1.7178001403808594, -0.7389792203903198, -0.22323843836784363, 2.189730167388916, 2.009469747543335, 2.255263566970825, 1.9634788036346436, 1.4359910488128662, 0.6549786329269409, 3.5869414806365967, 5.503750324249268, 4.111057758331299, 1.946467638015747, 1.4941688776016235, 1.556199550628662, 1.214790940284729, 1.1002682447433472, 0.8039454817771912, 1.1697194576263428, 0.060469068586826324, 0.37819790840148926, 3.4146008491516113, 1.5209791660308838, 0.16834624111652374, 0.9300581216812134, 0.7021365165710449, 0.21195092797279358, -0.021994179114699364, 1.546455979347229, 1.3528074026107788, 5.125917434692383, 0.22711265087127686, -0.4906262159347534, -0.30035990476608276, 0.43955761194229126, -0.17688122391700745, -0.04665842652320862, 0.9400006532669067, 0.8820577263832092, 3.295884132385254, -6.009624481201172, -7.582295894622803, -0.5822781920433044, -0.8339431285858154, -0.7792884111404419, -1.3579961061477661, -1.968181848526001, -0.73675137758255, -3.972010850906372, 3.736644744873047, -1.5014550685882568, -0.1969117820262909, -1.642208456993103, -2.2833566665649414, -1.8617013692855835, 0.559748113155365, -1.1071833372116089, -1.2239174842834473, -0.8167917132377625, -2.072439432144165, -0.9969769716262817, -0.6641512513160706, -0.7494655847549438, -1.007724404335022, -0.8033524751663208, 1.0693188905715942, 0.4696619510650635, 0.44561606645584106, -0.7622324824333191, -0.4941210150718689, -0.500256359577179, -0.5528082847595215, -0.8811859488487244, -2.627695322036743, -0.9086533784866333, -0.13771457970142365, -0.4600067436695099, -0.23270897567272186, -0.48949337005615234, -0.4211263060569763, -0.8661603331565857, -0.3454934060573578, -0.25097566843032837, -1.109216332435608, -0.2770203948020935, 2.2806193828582764, -0.4382098913192749, -0.2284175008535385, 0.38630273938179016, 2.6404471397399902, 0.015628736466169357, 0.060615409165620804, 0.5514221787452698, -0.13763225078582764, -0.34061601758003235, -0.13166075944900513, -0.10710185021162033, 0.7150377631187439, 0.6659208536148071, 1.686867356300354, -0.4217521548271179, 0.051326170563697815, 1.9894918203353882, -0.4145640730857849, 0.0018460950814187527, -0.9995002746582031, -0.7671723365783691, -0.36894315481185913, -0.16878998279571533, -0.9874062538146973, -2.3170623779296875, -1.5303120613098145, -0.7137605547904968, -0.5784990787506104, -0.5984774231910706, -0.3706347346305847, -0.3041951358318329, 0.6751729249954224, -0.18250393867492676, 0.014772665686905384, 0.47152262926101685, -1.1612502336502075, -0.35504812002182007, -0.15878286957740784, -0.23169395327568054, 0.06546385586261749, 0.1422242820262909, 0.12764205038547516, -0.4763239026069641, 402.8721008300781, 33.97813034057617, 0.2774106562137604, -13.140117645263672, 18.208972930908203, -1.6552678346633911, -14.364242553710938, 0.10251864045858383, 0.6461477279663086, -6.983832359313965, -0.1841837614774704, -5.492713451385498, 11.75304889678955, -11.98824405670166, -159.63316345214844, -1.214348554611206, 0.8628255128860474, -107.30135345458984, 0.7032712697982788, -1.4195795059204102, -0.18183526396751404, -65.83489990234375, 0.33127501606941223, -106.34962463378906, 11.31546688079834, -53.09890365600586, -21.88643455505371, -3.195594072341919, -28.47698211669922, 0.3772991895675659, 0.3786780834197998, 0.3228470981121063, 13.256346702575684, -1.2974534034729004, 0.24294105172157288, -5.732027053833008, -98.69583892822266, 0.11705353111028671, -0.3564915955066681, 0.5138375163078308, -0.8186004757881165, 0.21545495092868805, 0.1928042769432068, 0.3294401466846466, -2.746062755584717, 0.5420972108840942, 0.1389545351266861, 0.3707195222377777, -0.10348216444253922, 0.40366220474243164, 0.21224001049995422, 0.35471540689468384, -78.8619155883789, 0.14935342967510223, 0.1958923041820526, 0.36816808581352234, -56.387245178222656, 0.10132946819067001, 0.16250264644622803, 0.06466923654079437, -0.06174613907933235, 0.10366235673427582, 0.06677092611789703, -0.16304466128349304, 0.07947070896625519, 0.19330325722694397, 0.23532555997371674, 0.03881563991308212, -0.1308038830757141, -0.32119083404541016, -0.6026683449745178, 7.16275691986084, -0.03346657752990723, -0.4408835768699646, 0.6430355906486511, 2.9998464584350586, 0.5100350379943848, 0.5578357577323914, 0.2675873935222626, -0.35237443447113037, -16.593713760375977, 1.062922716140747, 0.8223982453346252, -0.4407559633255005, 0.43679893016815186, 0.38295313715934753, 0.2279316931962967, 0.13923469185829163, 85.44652557373047, 11.521448135375977, 0.005550213158130646, 0.11674965918064117, 0.6307211518287659, 0.29508522152900696, 0.1420155018568039, 0.1129414290189743, 0.1537802517414093, 0.016230463981628418, 0.10687793791294098, 0.18670910596847534, -1.9405847787857056, -2.2584705352783203, 0.43508070707321167, 1.1229798793792725, 1.2083641290664673, -0.055893369019031525, 0.854990541934967, 0.4440760016441345, -2.362013339996338, -3.002002239227295, -1.7424116134643555, 1.282680869102478, 3.54481840133667, 0.3624274730682373, 7.852659225463867, 4.4275736808776855, 2.3369593620300293, 4.522994518280029, 2.953019380569458, 6.063052177429199, 1.98888099193573, 2.8754169940948486, 2.223193407058716, 4.024523735046387, 3.9249138832092285, 3.621492624282837, 1.3646823167800903, 2.564692497253418, 2.1688525676727295, 2.0190727710723877, 3.2260923385620117, 2.3291244506835938, 1.4813531637191772, 2.127375841140747, 1.2334511280059814, 2.068463087081909, 2.523533344268799, 1.1103572845458984, 0.47116997838020325, 2.399650812149048, 1.3764628171920776, 1.7786095142364502, 1.5651535987854004, 1.948794960975647, -0.4554291367530823, 2.1042613983154297, 0.5021664500236511, 1.5149105787277222, -0.09896903485059738, 1.6347845792770386, 1.3543245792388916, 2.042853355407715, 0.7513309121131897, 0.7224506139755249, 1.668306827545166, 1.629412293434143, 0.5949528217315674, 0.9215031862258911, 1.0848543643951416, 0.7651270627975464, -0.15050332248210907, 0.9530659317970276, 0.868942141532898, -1.1884386539459229, 0.473081111907959, 1.0005643367767334, 0.6908371448516846, 0.5094130635261536, -1.0406453609466553, -1.303475260734558, -3.4733846187591553, 1.6681971549987793, -0.6520408987998962, -0.12984442710876465, 1.2784024477005005, 1.8467698097229004, 2.34696626663208, 2.044661045074463, 1.404430627822876, 0.7100067734718323, 3.449969530105591, 5.455233573913574, 4.227277755737305, 2.001664876937866, 1.5308459997177124, 1.507209062576294, 1.4007253646850586, 1.0763568878173828, 0.2573568820953369, 1.2577941417694092, 0.20016540586948395, 0.2080109715461731, 3.231663942337036, 1.4974982738494873, 0.22924233973026276, 0.8112363219261169, 0.5831732153892517, 0.03717155382037163, -0.0931810736656189, 1.6993858814239502, 1.9425886869430542, 2.230010747909546, -0.7899075746536255, -1.041550874710083, -1.163835048675537, -0.023047853261232376, -0.7102572917938232, -0.6930257081985474, 2.35408616065979, 2.9593417644500732, 1.747288703918457, -1.4183573722839355, -3.672621726989746, -0.4312297999858856, -7.906158447265625, -4.6028571128845215, -2.2369861602783203, -4.694456100463867, -2.8813130855560303, -6.100637435913086, -5.464810848236084, -2.905691385269165, -2.2714719772338867, -3.974491834640503, -7.147107124328613, -3.6417150497436523, -1.5428097248077393, -2.6747145652770996, -2.2317328453063965, -2.1590499877929688, -3.2053399085998535, -2.3329577445983887, -1.3180989027023315, -2.262638807296753, -1.149888038635254, -2.112332820892334, -2.4860734939575195, -0.8565242886543274, -0.47458285093307495, -2.3548367023468018, -1.354463815689087, -1.7831059694290161, -1.6712779998779297, -2.0474355220794678, 0.6300367116928101, -2.0333731174468994, -0.30299773812294006, -1.705795407295227, 0.2845810353755951, -1.818902850151062, -1.2862391471862793, -2.0488240718841553, -0.5381596684455872, -0.5640580058097839, -1.6181864738464355, -1.55097234249115, -0.1210620179772377, -1.1456257104873657, -1.1275335550308228, -0.8689118027687073, 0.08309686183929443, -0.9453075528144836, -0.970598042011261, 0.9878921508789062, -0.34412458539009094, -1.0246222019195557, -1.0590088367462158, -0.5912625193595886, 1.081247091293335, 1.3132822513580322, 3.4099647998809814, -1.5989214181900024, 0.6513791680335999, 0.21187707781791687, -2.2735748291015625, -1.9909420013427734, -2.1788532733917236, -1.8416821956634521, -1.3916486501693726, -0.6080116629600525, -3.4252054691314697, -5.368403434753418, -4.12479305267334, -1.9456300735473633, -1.5372709035873413, -1.6067602634429932, -1.2785377502441406, -1.1867151260375977, 0.2990397810935974, -1.0779470205307007, -0.158025324344635, -0.14052170515060425, -3.3931007385253906, -1.5667158365249634, -0.36663204431533813, -0.8455533385276794, -0.6713784337043762, -0.16063879430294037, -0.040134310722351074, -1.4953278303146362, 1.596260905265808, 5.198098182678223, 2.63092041015625, -0.40998658537864685, -0.32816070318222046, 0.4930421710014343, -0.0616956390440464, -0.03750624507665634, 1.0591871738433838, 0.959857702255249, 3.3427958488464355, -4.3458991050720215, -7.73824405670166, -0.6858645081520081, -0.9432830214500427, -0.6730754375457764, -1.3013004064559937, -1.9121559858322144, -1.011731505393982, -3.1688013076782227, 3.716156482696533, -1.3690149784088135, -0.16697902977466583, -1.5855625867843628, -2.169727325439453, -1.7538241147994995, 0.6404786109924316, -1.0807452201843262, -1.1927940845489502, -0.849341869354248, -1.9389855861663818, -0.8733682632446289, -0.659896194934845, -0.8995044231414795, -1.0617659091949463, -0.8034411668777466, 0.9729233980178833, 0.5285145044326782, 0.2824307382106781, -0.9946240782737732, -0.37254321575164795, -0.6959270238876343, -0.4802451729774475, -0.7419224977493286, -2.6758620738983154, -0.695358157157898, 0.09782667458057404, -0.46678611636161804, -0.23515424132347107, -0.4873230457305908, -0.47331178188323975, -0.867354154586792, -0.21005989611148834, -0.2723740041255951, -1.0755614042282104, -0.29528096318244934, 2.2023961544036865, -0.32304009795188904, -0.22123561799526215, 0.24789991974830627, 2.7217793464660645, 0.15713565051555634, 0.04494522139430046, 0.6728058457374573, -0.14567501842975616, -0.4104965031147003, -0.2612016201019287, -0.21245737373828888, 0.7029872536659241, 0.7955795526504517, 1.6041685342788696, -0.3090055584907532, 0.10718128830194473, 1.8080730438232422, -0.46032610535621643, -0.11171220988035202, -0.7961090207099915, -0.790030837059021, -0.4890535771846771, -0.2189905345439911, -0.9987297058105469, -2.211577892303467, -1.6008617877960205, -0.5922768712043762, -0.5221610069274902, -0.637117862701416, -0.2673161029815674, -0.41357263922691345, 0.8814568519592285, -0.2164633423089981, 0.16833142936229706, 0.3782579302787781, -1.1592421531677246, -0.38619136810302734, -0.12990409135818481, -0.10718148946762085, -0.01697695441544056, 0.06661339849233627, 0.014486494474112988, -0.5699627995491028, 1.9973385334014893, 2.1309306621551514, -0.5122681260108948, -1.202344298362732, -1.1297152042388916, 0.014354710467159748, -0.9862836599349976, -0.30565881729125977, 2.4909772872924805, 4.27197265625, 4.374741554260254, -1.3085383176803589, -11.390575408935547, -0.20352113246917725, -7.747992038726807, -4.423669815063477, -2.3426685333251953, -4.480123519897461, -2.8186402320861816, -5.92237663269043, -1.4835683107376099, -3.0571129322052, -2.2464282512664795, -3.940237045288086, -2.7140586376190186, -3.6811470985412598, 0.9845989346504211, -2.5505330562591553, -1.9789199829101562, -2.08762788772583, -1.9171174764633179, -2.359292984008789, -1.315712809562683, -2.2376279830932617, -0.8671364784240723, -2.107095241546631, -2.6475205421447754, -0.8589930534362793, -0.3683758080005646, -2.1531691551208496, -1.4233540296554565, -1.5702155828475952, -1.6174753904342651, -2.0062501430511475, 0.342667818069458, -2.0331859588623047, -0.5590293407440186, -1.6435714960098267, 0.14125694334506989, -1.7987854480743408, -1.3453396558761597, -2.090360641479492, -0.6115875244140625, -0.7373771667480469, -1.8221087455749512, -1.6411436796188354, -0.6797935962677002, -0.9783271551132202, -1.0827277898788452, 0.2515128254890442, 0.021974338218569756, -0.9872182607650757, -0.47856155037879944, 1.1943868398666382, -0.36076390743255615, -0.9760910272598267, -0.7265956997871399, -0.5572766065597534, 1.1302062273025513, 1.1217896938323975, 3.399322032928467, -1.6227389574050903, 0.7325427532196045, 0.005098146852105856, -1.2944973707199097, -1.6728495359420776, -2.1555445194244385, -1.8680419921875, -1.3898398876190186, -0.7260504364967346, -3.4318902492523193, -5.429965496063232, -4.287997245788574, -2.0866763591766357, -1.5176806449890137, -1.5258362293243408, -1.2487256526947021, -1.1510461568832397, -0.7547659277915955, -1.276963472366333, -0.170984148979187, 0.596198558807373, -3.3602657318115234, -1.3989766836166382, -0.18409514427185059, -0.5489795804023743, -0.704750120639801, -0.2765718698501587, 0.021174276247620583, -1.4826658964157104, -0.8679412603378296, 0.2576349973678589, -0.5919599533081055, -0.7536229491233826, 1.2111365795135498, 0.7024969458580017, 1.1383100748062134]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (20, 30), 'etaBin': (1.54, 2.5)}}, 'et1_eta2': {'discriminator': {'threshold': 0.34999872446060182, 'nodes': [100, 16, 1], 'bias': [-0.019316092133522034, -0.1037711575627327, -0.03230678290128708, 0.11474386602640152, -0.08302824199199677, -0.05786946788430214, -0.006892677396535873, -0.01378057524561882, -0.14864644408226013, 0.019947558641433716, 0.1488591730594635, 0.038698844611644745, 0.040183890610933304, -0.017803698778152466, -0.1598578244447708, -0.11896070092916489, 0.11337883025407791], 'weights': [0.5552917718887329, 0.010228516533970833, -0.9567947387695312, -0.8506383895874023, -0.25354018807411194, -0.09409420937299728, -0.5022487640380859, -0.24314863979816437, -1.4397705793380737, 3.3494832515716553, 3.500687837600708, 1.4162331819534302, -1.6418179273605347, -0.2862023115158081, 0.6304506659507751, 0.7158096432685852, -2.605576753616333, 0.05955013632774353, 0.11632593721151352, -0.8891122341156006, -1.8062291145324707, -0.5559478402137756, -0.19555532932281494, 0.020463798195123672, -1.0237559080123901, -0.23868079483509064, -0.9529364705085754, -1.6772258281707764, -1.8570913076400757, -1.2494373321533203, -0.8983120322227478, -1.152151346206665, -0.6400688290596008, -1.185542345046997, -2.6568124294281006, -1.2505749464035034, -1.5172412395477295, -1.1229621171951294, -0.7818270921707153, 0.44712117314338684, -0.8999243974685669, 1.5345436334609985, -0.8705605864524841, -1.120680809020996, -0.4715586304664612, -0.18130704760551453, -0.9992321729660034, -0.8352436423301697, -0.7491253614425659, -1.182928204536438, 0.302002876996994, -0.13425582647323608, 0.8934618830680847, -0.8060379028320312, -1.351983666419983, -0.8858078718185425, -0.7271347045898438, -0.8996135592460632, -0.5432066917419434, -1.5538347959518433, -0.8567658066749573, -1.1478756666183472, -0.38719427585601807, 10.876370429992676, -0.332080215215683, 2.5477261543273926, 0.5793077349662781, -1.4362565279006958, -0.603681206703186, -0.8186864852905273, -2.2784171104431152, -3.0707437992095947, 0.32493945956230164, 0.12808974087238312, -1.5168015956878662, -1.3067073822021484, -1.2778325080871582, -1.0687216520309448, -0.7766463160514832, -0.04328407719731331, -0.19496800005435944, -1.2531750202178955, -2.910007953643799, -0.3609386682510376, -2.1424617767333984, -0.7363407611846924, -0.8463560342788696, -0.9375942945480347, 0.6519914865493774, -0.2914380431175232, -0.43966105580329895, 0.16867288947105408, -4.101846218109131, -1.0502941608428955, 0.011142313480377197, -0.9158366918563843, 0.0484946183860302, -0.06989461928606033, -0.5177410244941711, -0.7031639814376831, 0.7335751056671143, -0.0949900820851326, -0.8556097745895386, -0.897462010383606, -0.08025611937046051, -0.261803537607193, -0.4068710207939148, -0.1846694052219391, -0.2076261341571808, 3.481656789779663, 3.419125556945801, 1.398795485496521, -1.6988979578018188, -0.16265524923801422, 0.4975373148918152, 0.772631824016571, -2.782301902770996, 0.14371941983699799, 0.20590175688266754, -0.8948282599449158, -1.7259280681610107, -0.6316713094711304, -0.21104009449481964, -0.08008550852537155, -1.1546460390090942, -0.29059165716171265, -0.25878670811653137, -1.7542731761932373, -1.844640851020813, -1.0604256391525269, -0.9801983833312988, -0.9484772086143494, -0.8163326382637024, -1.4220900535583496, -2.7558176517486572, -1.266526222229004, -1.665647029876709, -1.1136500835418701, -0.7263275384902954, 0.2755652070045471, -0.7718544602394104, 1.5213825702667236, -0.8038144707679749, -1.051478385925293, -0.3741123676300049, -0.26005318760871887, -0.8455421924591064, -0.6586684584617615, -0.756643533706665, -1.1935230493545532, 0.2170078158378601, -0.048524320125579834, -0.3516852855682373, -0.9206705689430237, -1.4098917245864868, -0.9038867950439453, -0.6365238428115845, -0.8064131140708923, -0.4581282436847687, -1.4378315210342407, -0.8303741812705994, -1.0381807088851929, -0.32336902618408203, 10.86023235321045, -0.20308178663253784, 2.4996066093444824, 0.916535496711731, -1.4427239894866943, -0.651955246925354, -0.916057288646698, -2.6491751670837402, -1.3226696252822876, 0.20145893096923828, 0.016924021765589714, -1.5994532108306885, -1.3198020458221436, -1.2118921279907227, -1.0106171369552612, -0.8690285086631775, -0.05156170204281807, -0.1345367282629013, -1.1746867895126343, -3.0087599754333496, -0.4126783609390259, -1.6475902795791626, -0.6453680396080017, -0.8594444394111633, -0.8819097280502319, 0.5885420441627502, -0.3558621108531952, -0.5238243937492371, 0.14452555775642395, -4.069514751434326, -1.0835719108581543, -0.16290251910686493, -0.7415673136711121, -0.019963355734944344, 0.1148814857006073, -0.6057941317558289, -0.8104291558265686, 0.7246147394180298, -0.11818815022706985, -0.8793654441833496, -0.7741272449493408, -0.1725231111049652, -0.3059075176715851, -0.46918076276779175, -0.212732195854187, -1.3384826183319092, 3.487067461013794, 3.4443018436431885, 1.584708571434021, -1.7936021089553833, -0.1785620003938675, 0.6468092799186707, 0.7794907689094543, -2.569432497024536, 0.09671192616224289, 0.15427713096141815, -0.7508818507194519, -1.856061339378357, -0.46623748540878296, -0.02812071517109871, -0.07284417003393173, -0.9098274111747742, -0.18429060280323029, -0.23630863428115845, -1.5745432376861572, -2.073143482208252, -1.1390475034713745, -0.96384197473526, -0.9389058947563171, -0.666911780834198, -1.4336183071136475, -2.62703537940979, -1.4563757181167603, -1.7171554565429688, -1.0512981414794922, -0.6972362995147705, 0.339679092168808, -0.9511238932609558, 1.5715643167495728, -0.8007113337516785, -1.0636872053146362, -0.586872935295105, -0.3550742268562317, -0.8697413802146912, -0.6544356942176819, -0.8945467472076416, -1.2754613161087036, 0.3610660135746002, -0.06953465938568115, -0.26404812932014465, -0.8395150899887085, -1.3439617156982422, -0.774702787399292, -0.6974011659622192, -0.9728923439979553, -0.5893943309783936, -1.4801794290542603, -0.8205973505973816, -1.250777244567871, -0.36026930809020996, 10.894411087036133, -0.42308273911476135, 2.3444528579711914, 0.8858518600463867, -1.467198133468628, -0.7441110610961914, -0.9217826128005981, -2.156825304031372, -1.343586802482605, 0.25004807114601135, 0.05955538526177406, -1.6514348983764648, -1.2369376420974731, -1.2601590156555176, -1.0826798677444458, -0.7860440611839294, 0.0887174904346466, -0.041484326124191284, -1.1946935653686523, -2.973034620285034, -0.4790688157081604, -1.8347071409225464, -0.7825266718864441, -0.8445653915405273, -0.8828567266464233, 0.5315582156181335, -0.3270191550254822, -0.320083886384964, 0.09319224953651428, -4.249144554138184, -1.1637670993804932, -0.05504040792584419, -0.8941628932952881, -0.008276454173028469, -0.05497322976589203, -0.5358245968818665, -0.6403898000717163, -0.6696319580078125, 0.03270046040415764, 0.8640455007553101, 0.8980611562728882, 0.2464776635169983, 0.32776811718940735, 0.5700050592422485, 0.21295976638793945, 0.3229745626449585, -3.3371031284332275, -3.4341933727264404, -1.3828312158584595, 1.6272374391555786, 0.27042704820632935, -0.7119466662406921, -0.7196571230888367, 2.580906867980957, -0.156316876411438, -0.13831043243408203, 0.8095064759254456, 1.8257427215576172, 0.5846728086471558, 0.12217122316360474, 0.19327515363693237, 0.977573037147522, 0.3239986002445221, 0.1648118644952774, 1.7038171291351318, 1.908756971359253, 1.108931303024292, 0.8072933554649353, 1.0766046047210693, 0.8026160597801208, 1.286221981048584, 2.6415646076202393, 1.41896390914917, 1.5956764221191406, 0.9195521473884583, 0.6640766859054565, -0.2301202118396759, 0.9652895331382751, -1.598633885383606, 0.8651534914970398, 1.1733200550079346, 0.40456539392471313, 0.35020318627357483, 0.7773797512054443, 0.7307055592536926, 0.8341201543807983, 1.195003628730774, -0.23022514581680298, 0.22589200735092163, 0.3061002492904663, 0.8185170292854309, 1.4574700593948364, 0.938140332698822, 0.5677893161773682, 0.7599512934684753, 0.4279262125492096, 1.4332828521728516, 0.8324853777885437, 1.078055739402771, 0.2039680778980255, -10.871905326843262, 0.35006770491600037, -2.490281581878662, -0.7757031917572021, 1.5198066234588623, 0.7101616859436035, 0.7515924572944641, 2.7716360092163086, 1.3313320875167847, -0.20012888312339783, -0.076100192964077, 1.486978530883789, 1.3516525030136108, 1.2427988052368164, 1.0729584693908691, 0.729925811290741, 0.15996645390987396, 0.19842636585235596, 1.2653568983078003, 3.051607847213745, 0.4309154748916626, 1.63603937625885, 0.7357271313667297, 0.8980702757835388, 0.8016939163208008, -0.5445800423622131, 0.12130704522132874, 0.4391273558139801, -0.09838249534368515, 4.11781120300293, 1.122452974319458, 0.19744031131267548, 0.9369194507598877, 0.06823644787073135, 0.060421332716941833, 0.6352501511573792, 0.6739318370819092, 0.6858038902282715, -0.019727200269699097, -1.001968264579773, -0.8918737173080444, -0.1502036452293396, -0.3205699026584625, -0.5736018419265747, -0.13186383247375488, -0.39529410004615784, 3.4859557151794434, 3.4284462928771973, 1.4035826921463013, -1.640210509300232, -0.3135383725166321, 0.5356839299201965, 0.6600520014762878, -2.5823628902435303, 0.13955093920230865, 0.0725494921207428, -0.770932674407959, -1.7348649501800537, -0.6507049798965454, -0.20144428312778473, -0.13504642248153687, -1.1447025537490845, -0.35723036527633667, -0.286099910736084, -1.6319332122802734, -1.8560181856155396, -1.2031279802322388, -0.8930785059928894, -1.00017511844635, -0.6441065669059753, -1.245873212814331, -2.794471025466919, -1.3996754884719849, -1.5556483268737793, -1.0835742950439453, -0.7992517948150635, 0.22534754872322083, -0.9724661111831665, 1.6932770013809204, -0.8565849661827087, -1.1712214946746826, -0.360552579164505, -0.2824894189834595, -0.8571367263793945, -0.6806299090385437, -0.7907031774520874, -1.1049941778182983, 0.3263963758945465, -0.08406949043273926, -0.28964173793792725, -0.8079245090484619, -1.4929438829421997, -0.7955628633499146, -0.5991711616516113, -0.932087779045105, -0.6560699343681335, -1.404407024383545, -0.8554427027702332, -1.2351109981536865, -0.33419013023376465, 10.89401912689209, -0.2312469482421875, 2.4426827430725098, 0.9305117130279541, -1.3534389734268188, -0.6897302865982056, -0.9675629138946533, -2.168972969055176, -1.322123646736145, 0.3144022524356842, 0.23111803829669952, -1.4979221820831299, -1.1858443021774292, -1.2555993795394897, -1.1561403274536133, -0.7495806813240051, -0.04245036467909813, -0.18406154215335846, -1.1813132762908936, -2.8791563510894775, -0.4076322913169861, -1.7781468629837036, -0.5980466604232788, -0.7824084758758545, -0.967664361000061, 0.5172649025917053, -0.319959431886673, -0.3406945765018463, 0.28363990783691406, -4.237994194030762, -1.1467232704162598, -0.10464151203632355, -0.9307601451873779, 0.09541943669319153, -0.04833906143903732, -0.470238596200943, -0.7218970060348511, 0.6560988426208496, -0.019636064767837524, -0.987587571144104, -0.8654680252075195, -0.21539467573165894, -0.2691390812397003, -0.3547929525375366, -0.15463805198669434, -0.44715645909309387, 3.268347978591919, 3.445453643798828, 1.4911233186721802, -1.6178590059280396, -0.16750086843967438, 0.6673619151115417, 0.7508688569068909, -2.7298293113708496, 0.27502188086509705, 0.04391147196292877, -0.878665566444397, -1.7333455085754395, -0.42223119735717773, -0.08202985674142838, -0.1357778012752533, -1.0610271692276, -0.18828009068965912, -1.10871160030365, -1.6452271938323975, -1.9328927993774414, -1.1163911819458008, -1.0184240341186523, -1.1207354068756104, -0.799267590045929, -1.3428575992584229, -2.646636724472046, -1.378038763999939, -1.5872211456298828, -0.9589189887046814, -0.8143696784973145, 0.38390132784843445, -0.8238955140113831, 1.7091470956802368, -0.8524795174598694, -1.0142797231674194, -0.44063395261764526, -0.38869708776474, -0.8513612151145935, -0.6661911606788635, -0.7474545240402222, -1.113882303237915, 0.2191244661808014, -0.05329042673110962, -0.31202733516693115, -0.7818042039871216, -1.2730140686035156, -0.9762862324714661, -0.6460895538330078, -0.9700111150741577, -0.6080973148345947, -1.5421806573867798, -0.8005247712135315, -1.0704976320266724, -0.3505350351333618, 10.77982234954834, -0.4056065082550049, 2.332180976867676, 0.8519328832626343, -1.3173824548721313, -0.6615946292877197, -0.8192706108093262, -2.2163519859313965, -1.3874064683914185, 0.23657876253128052, 0.20182503759860992, -1.648252248764038, -1.3577327728271484, -1.1491069793701172, -1.0587122440338135, -0.9210017323493958, 0.09329727292060852, -0.10950182378292084, -1.2180290222167969, -2.954618453979492, -0.5974734425544739, -1.8027368783950806, -0.6955682039260864, -0.9109864234924316, -0.79716956615448, 0.6159631609916687, -0.1585788130760193, -0.5499623417854309, 0.1952921748161316, -4.153988838195801, -1.1303470134735107, -0.0651962012052536, -0.7791256308555603, 0.015276663936674595, -0.10145309567451477, -0.5245361924171448, -0.7878845930099487, 0.5420677065849304, 0.08807596564292908, -0.9652855396270752, -0.7756388187408447, -0.2582073509693146, -0.17781835794448853, -0.4082542657852173, -0.10696716606616974, -1.258629560470581, 3.3630504608154297, 3.330069065093994, 1.3764828443527222, -1.6140903234481812, -0.22745390236377716, 0.5316597819328308, 0.6512035727500916, -2.667112112045288, 0.06558626890182495, 0.055324967950582504, -0.8987908959388733, -1.9087872505187988, -0.5168763399124146, -0.017934247851371765, 0.1199500784277916, -1.108228087425232, -0.21412090957164764, -1.0999445915222168, -1.7409183979034424, -2.016655683517456, -1.1809495687484741, -0.9947664141654968, -1.0683255195617676, -0.749823272228241, -1.3067584037780762, -2.7546021938323975, -1.3776978254318237, -1.7094800472259521, -1.1140555143356323, -0.760067343711853, 0.42332199215888977, -0.8901544809341431, 1.6417795419692993, -0.6780205368995667, -1.0704796314239502, -0.5616641044616699, -0.3436475396156311, -0.7575474381446838, -0.7307946085929871, -0.9181311130523682, -1.2583494186401367, 0.38407453894615173, -0.14973074197769165, 0.8444107174873352, -0.802437424659729, -1.2806735038757324, -0.7632415294647217, -0.6862729787826538, -0.9626096487045288, -0.7404227256774902, -1.4165318012237549, -0.863975465297699, -1.18902587890625, -0.4225977659225464, 10.772107124328613, -0.23835685849189758, 2.40183162689209, 0.6040114760398865, -1.5220704078674316, -0.7533706426620483, -0.7849242687225342, -2.1319403648376465, -2.95457124710083, 0.2098451554775238, 0.21101662516593933, -1.606735110282898, -1.2558144330978394, -1.3445488214492798, -1.172842264175415, -0.8773942589759827, -0.022912582382559776, -0.11842013895511627, -1.2591526508331299, -2.9178128242492676, -0.5895341038703918, -2.1575403213500977, -0.660133957862854, -0.6962929964065552, -0.8991097211837769, 0.6525007486343384, -0.3258896470069885, -0.5198801159858704, 0.17467382550239563, -4.190149307250977, -1.1786179542541504, -0.0998210459947586, -0.8977149724960327, 0.030365636572241783, 0.09993544965982437, -0.5981345772743225, -0.8582810163497925, 0.5524110198020935, 0.11531226336956024, -1.0019946098327637, -0.9969024658203125, -0.20132476091384888, -0.11159340292215347, -0.5777144432067871, -0.15819329023361206, -0.4240085184574127, 3.3257875442504883, 3.2646822929382324, 1.432519555091858, -1.6101032495498657, -0.28971201181411743, 0.5283111929893494, 0.6881642937660217, -2.7632620334625244, 0.21138545870780945, 0.12903903424739838, -0.9136327505111694, -1.7372262477874756, -0.4604852497577667, -0.064637191593647, -0.006348660681396723, -1.0896896123886108, -0.13110902905464172, -0.9624751210212708, -1.7700157165527344, -2.0115745067596436, -1.1155856847763062, -0.788764238357544, -1.0497938394546509, -0.6650617718696594, -1.3809199333190918, -2.709787368774414, -1.4830747842788696, -1.7210495471954346, -0.9916821122169495, -0.6696491241455078, 0.2705630660057068, -0.8018741011619568, 1.6704416275024414, -0.7711095213890076, -0.9818471074104309, -0.34823861718177795, -0.1930639147758484, -0.8789785504341125, -0.8605405688285828, -0.8687694072723389, -1.0590296983718872, 0.24311695992946625, -0.17582863569259644, -0.2927711009979248, -0.9937281012535095, -1.429437279701233, -0.732380747795105, -0.7981847524642944, -0.9775375723838806, -0.7422921657562256, -1.5196466445922852, -0.8099066615104675, -1.2283482551574707, -0.2597169876098633, 10.907303810119629, -0.3482074439525604, 2.3625059127807617, 0.8717207908630371, -1.3964693546295166, -0.6666903495788574, -0.908074140548706, -2.1554651260375977, -1.3678256273269653, 0.1117272675037384, 0.09076996147632599, -1.5935816764831543, -1.3875312805175781, -1.3178406953811646, -1.0343167781829834, -0.891835629940033, 0.056560713797807693, -0.027595989406108856, -1.1675275564193726, -2.860581398010254, -0.49365389347076416, -1.71084725856781, -0.7552939057350159, -0.8165731430053711, -0.8600330352783203, 0.5460430383682251, -0.20101794600486755, -0.3369798958301544, 0.11865200847387314, -4.100966930389404, -1.0798583030700684, -0.01701251044869423, -0.9220162630081177, 0.09343264997005463, -0.030823949724435806, -0.49320000410079956, -0.7121666669845581, 0.632112979888916, -0.05428549274802208, -0.8398749828338623, -0.7990745306015015, -0.1185401976108551, 2.6731719970703125, -0.5765849351882935, -0.18326599895954132, -0.35980263352394104, 3.3923072814941406, 3.337785482406616, 1.521710991859436, -1.7350128889083862, -0.13072694838047028, 0.529849112033844, 0.7103376984596252, -2.7135844230651855, 0.2357502579689026, 0.06007874011993408, -0.7547092437744141, -1.775507926940918, -0.5906293392181396, -0.06129206717014313, -0.14705394208431244, -1.1301027536392212, -0.15509547293186188, -0.2765403687953949, -1.7038192749023438, -1.9208108186721802, -1.0965497493743896, -0.9743235111236572, -1.116319179534912, -0.8019616007804871, -1.4192209243774414, -2.8154807090759277, -1.3002300262451172, -1.5239949226379395, -1.1099088191986084, -0.7488856315612793, 0.23943021893501282, -0.8672509789466858, 1.6506108045578003, -0.7268218398094177, -1.1732014417648315, -0.44607657194137573, -0.1607809215784073, -0.7964323163032532, -0.6717060208320618, -0.7984524965286255, -1.0591058731079102, 0.35388270020484924, -0.13013166189193726, -0.4093472361564636, -0.8671713471412659, -1.3253464698791504, -0.9607282280921936, -0.6807286739349365, -0.9727411270141602, -0.46037420630455017, -1.5484155416488647, -0.799708902835846, -1.0443429946899414, -0.36867570877075195, 10.794164657592773, -0.2161657214164734, 2.3848462104797363, 0.927868127822876, -1.3043650388717651, -0.7762401103973389, -0.9174246191978455, -2.7800586223602295, -1.3057551383972168, 0.09613153338432312, 0.196137472987175, -1.4711434841156006, -1.2639726400375366, -1.1665273904800415, -1.0663243532180786, -0.8164348006248474, 0.04119865968823433, -0.04601795971393585, -1.2183531522750854, -3.0672388076782227, -0.39163029193878174, -1.6475480794906616, -0.6290925145149231, -0.8715149760246277, -0.9162837266921997, 0.6716094613075256, -0.13705773651599884, -0.43566396832466125, 0.26804637908935547, -4.089991092681885, -1.050508737564087, 0.005654691252857447, -0.765339195728302, -0.09186980128288269, 0.061650313436985016, -0.4814169406890869, -0.7700247168540955, 0.22261957824230194, 0.27385228872299194, -0.38581645488739014, -0.2188703864812851, 0.02134861797094345, 0.09258832782506943, -0.08652443438768387, -0.04787389934062958, -2.271608829498291, 1.4947373867034912, 1.4573472738265991, 0.5160476565361023, -0.8225224018096924, -0.07194259762763977, 0.07544585317373276, 0.22346793115139008, -0.9598096013069153, 0.7252102494239807, 0.6960195302963257, -1.4652684926986694, -0.7625773549079895, -0.8763155341148376, 0.1309540867805481, 0.6470280885696411, 0.15402714908123016, -0.10100390762090683, -0.42381924390792847, -0.6934351325035095, -0.762237012386322, -0.4023946523666382, -0.3195303976535797, -0.38602960109710693, -0.0778217613697052, -0.48665106296539307, -0.9878547787666321, -0.5887565016746521, -0.7072536945343018, -0.35406625270843506, -0.2763228118419647, 0.21918776631355286, -0.31705358624458313, 0.9699246287345886, -0.17995712161064148, -0.40799084305763245, -0.03289899230003357, 0.1274687796831131, -0.36904576420783997, -0.17907430231571198, -0.22493049502372742, -0.330144464969635, 0.2705046832561493, 0.14948803186416626, -0.06799889355897903, -0.3077440857887268, -0.43842312693595886, -0.22256720066070557, -0.06345987319946289, -0.18686693906784058, -0.06358469277620316, -0.5627282857894897, -0.32939475774765015, -0.45493051409721375, 0.01959889568388462, 5.156739234924316, 0.2834535539150238, 1.2460044622421265, 0.3060623109340668, -0.47827714681625366, -0.1157769039273262, -0.3361499011516571, -0.8086167573928833, -1.3150746822357178, 0.6540687680244446, 0.5690444707870483, -3.209197998046875, -0.395097553730011, -0.4609433114528656, -0.40177494287490845, -0.2810609042644501, 0.25238457322120667, 0.2293238490819931, -2.195103883743286, -1.167539358139038, -0.14838236570358276, -0.999081552028656, -0.212384432554245, -0.13247260451316833, -0.15001089870929718, 0.026074187830090523, -0.15011508762836456, -0.10747889429330826, 0.19392193853855133, -1.6530259847640991, -0.2750660479068756, -0.06225883215665817, -0.2546047568321228, -0.03841559961438179, -0.03967097029089928, 0.015415400266647339, -0.3048535883426666, -0.5692223310470581, -0.07346553355455399, 0.928709089756012, 0.7833044528961182, 0.153292715549469, -2.6441550254821777, 0.44275110960006714, 0.2619275450706482, 0.3028370440006256, -3.4265103340148926, -3.321615219116211, -1.5663403272628784, 1.835250973701477, 0.30459505319595337, -0.6639588475227356, -0.7172166705131531, 2.7376997470855713, -0.2478047013282776, -0.1797090619802475, 0.8652576208114624, 1.81241774559021, 0.6039350628852844, 0.10478495061397552, 0.06856509298086166, 0.9166993498802185, 0.3458516597747803, 0.2566390633583069, 1.6602988243103027, 2.040602684020996, 1.2547693252563477, 0.9900321364402771, 1.0598194599151611, 0.844077467918396, 1.2845771312713623, 2.759064197540283, 1.3612451553344727, 1.6575517654418945, 0.9038020968437195, 0.6493788957595825, -0.4374237358570099, 0.8661250472068787, -1.494763970375061, 0.723382294178009, 1.0331300497055054, 0.5366083383560181, 0.2624150216579437, 0.888665497303009, 0.7704996466636658, 0.9038853645324707, 1.2708921432495117, -0.38372424244880676, 0.03329093009233475, 0.3952557444572449, 0.8966758847236633, 1.389200210571289, 0.9724171757698059, 0.6618061065673828, 0.7775104641914368, 0.41268953680992126, 1.4101024866104126, 1.0018811225891113, 1.25154709815979, 0.41304636001586914, -10.789060592651367, 0.2728728652000427, -2.4127449989318848, -0.8776015043258667, 1.5104824304580688, 0.7814182043075562, 0.8841051459312439, 2.8040359020233154, 1.2939538955688477, -0.2128550112247467, -0.19145046174526215, 1.5584542751312256, 1.2222511768341064, 1.2886991500854492, 1.0066851377487183, 0.8890364766120911, -0.05277736857533455, 0.2140362411737442, 1.2769666910171509, 2.974672555923462, 0.5296852588653564, 1.7198127508163452, 0.5845268368721008, 0.7820757627487183, 0.9854792356491089, -0.6722201704978943, 0.23911726474761963, 0.3506932556629181, -0.3056710362434387, 4.160074234008789, 0.9940557479858398, 0.201008602976799, 0.90798020362854, 0.0233707744628191, -0.043903857469558716, 0.5909914374351501, 0.6908525228500366, -0.5875297784805298, -0.02776630036532879, 0.9093465805053711, 0.9859960675239563, 0.23784762620925903, 0.23874036967754364, 0.5052947402000427, 0.28018468618392944, 1.2873717546463013, -3.4774231910705566, -3.30070424079895, -1.5356227159500122, 1.7687159776687622, 0.18869982659816742, -0.5209565758705139, -0.6100957989692688, 2.753513813018799, -0.12017790228128433, -0.06640010327100754, 0.812556803226471, 1.909602165222168, 0.6444414258003235, 0.1857922524213791, -0.005518943537026644, 1.121510624885559, 0.25868430733680725, 1.003171443939209, 1.6081900596618652, 1.8776129484176636, 1.2382960319519043, 0.7876763343811035, 1.1334214210510254, 0.6184034943580627, 1.2892389297485352, 2.78045392036438, 1.4749940633773804, 1.7585704326629639, 0.9878721833229065, 0.7815052270889282, -0.3511771857738495, 0.8986721038818359, -1.596664547920227, 0.8401011824607849, 0.9845490455627441, 0.5737125873565674, 0.2673555612564087, 0.9618011116981506, 0.8235570788383484, 0.7815597057342529, 1.2024366855621338, -0.3832310736179352, 0.008286681026220322, -0.7784460186958313, 0.9768238067626953, 1.5027365684509277, 0.836801290512085, 0.6561470031738281, 0.8466697931289673, 0.6869416236877441, 1.4963550567626953, 0.791848361492157, 1.173964023590088, 0.3179985284805298, -10.969965934753418, 0.2000882625579834, -2.486266613006592, -0.7102620601654053, 1.2838163375854492, 0.7918285131454468, 0.9491873979568481, 2.214906930923462, 2.995861768722534, -0.2495458722114563, -0.21504539251327515, 1.5675654411315918, 1.2224774360656738, 1.2699116468429565, 1.089068055152893, 0.6877438426017761, 0.06078376993536949, -0.02695423737168312, 1.0760304927825928, 3.0633158683776855, 0.5158119797706604, 1.8551548719406128, 0.7786241769790649, 0.6904430389404297, 0.8602482080459595, -0.6634842157363892, 0.27224621176719666, 0.31184902787208557, -0.25209683179855347, 4.115756511688232, 1.1150634288787842, 0.07361479103565216, 0.7907412648200989, 0.07072055339813232, 0.016683489084243774, 0.501982569694519, 0.7487491369247437, -0.15351438522338867, -0.015474776737391949, 0.3224705457687378, 0.368401437997818, 0.054661836475133896, -0.33910059928894043, 0.20444133877754211, 0.14257746934890747, 1.1763544082641602, -0.7914208173751831, -0.761695384979248, -0.489960640668869, 0.2430058717727661, 0.04654635488986969, -0.30573949217796326, -0.29601770639419556, 0.5736737251281738, 0.040292833000421524, 0.0001534953189548105, 0.8606926202774048, 0.4631679654121399, 0.5023238658905029, -0.05345385521650314, -0.05911736190319061, -0.02512521483004093, 0.15216971933841705, 0.2015838325023651, 0.4772830307483673, 0.5508400797843933, 0.27763503789901733, 0.16519032418727875, 0.30578505992889404, 0.12799791991710663, 0.41659292578697205, 0.6312043070793152, 0.3065654933452606, 0.46833327412605286, 0.1810104250907898, 0.3182970881462097, 0.05631256848573685, 0.26955774426460266, -0.25929880142211914, 0.3093605935573578, 0.40027838945388794, 0.21371953189373016, 0.2256433367729187, 0.16652962565422058, 0.32942795753479004, 0.2278715968132019, 0.3164258897304535, 0.07985683530569077, 0.19594430923461914, -0.1714591681957245, 0.347763329744339, 0.4583021402359009, 0.19667427241802216, 0.1678125262260437, 0.2956392168998718, 0.31660836935043335, 0.2720945179462433, 0.36709728837013245, 0.42693787813186646, 0.15950585901737213, -2.0562732219696045, 0.19613035023212433, -0.3040444552898407, -0.10329990833997726, 0.3453850746154785, 0.35603317618370056, 0.1640731394290924, 0.43434178829193115, 0.3735398054122925, 0.03558903560042381, 0.11653785407543182, 1.4684211015701294, 0.2657748758792877, 0.3720548152923584, 0.2963389754295349, 0.13488070666790009, 0.19518886506557465, 0.1809907853603363, 1.1420998573303223, 0.7772908806800842, 0.07644534111022949, 0.45514440536499023, 0.2749902904033661, 0.19483910501003265, 0.34127283096313477, -0.2552580237388611, 0.07143449038267136, 0.2498902976512909, -0.02597561478614807, 0.8495694994926453, 0.2772759795188904, 0.0762675553560257, 0.3240980803966522, -0.04781553894281387, -0.02920999936759472, 0.11201774328947067, 0.20301388204097748, -0.22155533730983734, -0.25239482522010803, 0.3942726254463196, 0.35944950580596924, -0.15318694710731506, -0.14408089220523834, 0.08346880227327347, -0.02467876859009266, 2.467668056488037, -1.3736053705215454, -1.3765095472335815, -0.4578242897987366, 0.9056024551391602, 0.14426404237747192, -0.1581110656261444, -0.2552333474159241, 1.146436333656311, -0.7663829922676086, -0.6800397634506226, 1.678048014640808, 0.7941333651542664, 0.9000147581100464, -0.7960336208343506, -0.5820049047470093, -0.12017951905727386, 0.21020056307315826, 0.33966541290283203, 0.52530837059021, 0.850095272064209, 0.48447316884994507, 0.27255627512931824, 0.23525470495224, 0.18350504338741302, 0.4500918686389923, 0.9798058867454529, 0.5604541897773743, 0.6170668005943298, 0.3408123850822449, 0.17761513590812683, -0.2505834102630615, 0.18524663150310516, -0.9803856015205383, 0.20893211662769318, 0.3571166694164276, 0.08735021948814392, 0.058525990694761276, 0.28425905108451843, 0.18046684563159943, 0.13006743788719177, 0.22451025247573853, -0.296002596616745, 0.026890018954873085, 0.03122042305767536, 0.247061088681221, 0.4401393234729767, 0.21346578001976013, 0.11411820352077484, 0.3441142141819, 0.1260416954755783, 0.46154752373695374, 0.3290356993675232, 0.4680897891521454, -0.03187314420938492, -5.049267768859863, -0.30469444394111633, -1.268471360206604, -0.4665786027908325, 0.6065343022346497, 0.08062374591827393, 0.3166109621524811, 0.9076255559921265, 1.147546648979187, -0.6914778351783752, -0.6807433366775513, 3.230966567993164, 0.41428691148757935, 0.2955557703971863, 0.3404185175895691, 0.299495667219162, -0.23678402602672577, -0.11761575937271118, 2.1901726722717285, 1.0836626291275024, -0.07470156252384186, 0.9313201308250427, 0.12807345390319824, 0.1899438351392746, 0.37263065576553345, -0.19281698763370514, 0.2678961157798767, -0.010805061087012291, -0.12060068547725677, 1.7620373964309692, 0.3841964304447174, 0.0026256220880895853, 0.12676605582237244, -0.11460620164871216, 0.05920666456222534, -0.012849540449678898, 0.11611093580722809, 0.6771117448806763, -0.09010560810565948, -0.9665323495864868, -0.7928628921508789, -0.2548508644104004, 2.631056785583496, -0.373775839805603, -0.1700432449579239, -0.26178157329559326, 3.4720377922058105, 3.269885301589966, 1.568495750427246, -1.6251331567764282, -0.2848411202430725, 0.5914715528488159, 0.5737268328666687, -2.653423547744751, 0.15727578103542328, 0.11436566710472107, -0.36837369203567505, -1.7710082530975342, -0.5890544056892395, -0.004598815925419331, -0.1717689037322998, -0.9595019817352295, -0.1270713210105896, -0.2681505084037781, -1.6845159530639648, -1.821069359779358, -1.2113145589828491, -1.0177128314971924, -0.9937042593955994, -0.6653838753700256, -1.3438081741333008, -2.7087831497192383, -1.280611276626587, -1.7361533641815186, -1.045855164527893, -0.7381701469421387, 0.37074896693229675, -0.9689252972602844, 1.615546464920044, -0.7941573262214661, -1.187119483947754, -0.389799028635025, -0.1440800577402115, -0.9248347282409668, -0.8007283806800842, -0.8823519945144653, -1.109104871749878, 0.31093350052833557, -0.23165729641914368, -0.4798595607280731, -0.8755504488945007, -1.4294612407684326, -0.8385142683982849, -0.6832071542739868, -0.8230113387107849, -0.5643129348754883, -1.4732786417007446, -1.0101966857910156, -1.169541835784912, -0.41638052463531494, 10.843693733215332, -0.24382582306861877, 0.15963220596313477, 0.8735771179199219, -1.2987276315689087, -0.6054645776748657, -0.9831261038780212, -2.6652421951293945, -1.4855848550796509, 0.24082186818122864, -0.0018209561239928007, -1.6427631378173828, -1.3087844848632812, -1.102328896522522, -1.120883822441101, -0.7444868683815002, -0.07999657094478607, -0.14935782551765442, -1.2114752531051636, -4.82593297958374, -0.5667009353637695, -1.6259385347366333, -0.6089750528335571, -0.6789158582687378, -0.9202635288238525, 0.5959989428520203, -0.2938535809516907, -0.3423807919025421, 0.22740700840950012, -4.126529693603516, -0.9828047752380371, -0.10889439284801483, -0.8516637682914734, 0.03482954949140549, -0.12931567430496216, -0.5842295289039612, -0.721480667591095, 0.7322691679000854, 0.06651779264211655, -0.8901524543762207, -0.7736340761184692, -0.28127360343933105, -0.3023776113986969, -0.367135226726532, -0.18577773869037628, -0.2133750468492508, 3.312370777130127, 3.439251184463501, 1.4256643056869507, -1.6716214418411255, -0.08436109125614166, 0.4995855987071991, 0.678874671459198, -2.5522241592407227, 0.16384737193584442, 0.06027798354625702, -0.9152365326881409, -1.8614736795425415, -0.47841542959213257, -0.005530437454581261, -0.1541101038455963, -1.1144267320632935, -0.27409517765045166, -0.0974019393324852, -1.7681572437286377, -1.8858016729354858, -1.1614291667938232, -0.9538732171058655, -0.9946754574775696, -0.7595598101615906, -1.434044361114502, -2.6819193363189697, -1.4070396423339844, -1.7144439220428467, -1.00375235080719, -0.6213544607162476, 0.21728792786598206, -0.8275063633918762, 1.642755150794983, -0.8314856886863708, -1.0835851430892944, -0.42108863592147827, -0.28220322728157043, -0.9751375317573547, -0.7222127318382263, -0.7549343109130859, -1.224083662033081, 0.379701167345047, -0.18609243631362915, -0.22526735067367554, -0.7991133332252502, -1.374838948249817, -0.9978248476982117, -0.7451139688491821, -0.8566227555274963, -0.6976406574249268, -1.5913162231445312, -0.9853466153144836, -1.0982879400253296, -0.2764087915420532, 10.765791893005371, -0.27141159772872925, 2.37382173538208, 0.9282246828079224, -1.313207745552063, -0.6641057729721069, -0.8031356334686279, -2.574204921722412, -1.3942062854766846, 0.18911921977996826, 0.06048859283328056, -1.4564509391784668, -1.3828494548797607, -1.1867462396621704, -1.243852972984314, -0.7489772439002991, -0.028437986969947815, -0.1516718715429306, -1.1385879516601562, -2.876561164855957, -0.5500564575195312, -1.7365912199020386, -0.7247620224952698, -0.8301856517791748, -0.8328460454940796, 0.7055837512016296, -0.1701187789440155, -0.38160234689712524, 0.10288836807012558, -4.190521717071533, -1.1410326957702637, -0.052337292581796646, -0.9346357583999634, 0.04343460127711296, -0.00950728077441454, -0.42270371317863464, -0.7629152536392212, 0.42700091004371643, 0.6053087115287781, 0.3591371178627014, -0.46631619334220886, 0.5706192851066589, 0.27974873781204224, 0.3642050623893738, 0.5283149480819702, 0.3677680492401123, 1.3959580659866333, -0.5715200304985046, -0.6076533198356628, -1.867607593536377, -0.4095662832260132, 0.6237652897834778, 0.08427703380584717]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (1.37, 1.54)}}, 'et1_eta1': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 6, 1], 'bias': [0.21030354499816895, -0.18122774362564087, -0.14719505608081818, -0.18119624257087708, -0.14072690904140472, 0.16648980975151062, -0.14101508259773254], 'weights': [1.4386593103408813, 0.45915886759757996, -1.5229798555374146, -1.436055302619934, -1.004254698753357, -0.9490943551063538, -0.5090715289115906, 0.49285227060317993, 1.9872885942459106, 4.876913070678711, 0.6880943179130554, -4.636479377746582, 0.0033839084208011627, -0.9218282699584961, -5.503398895263672, -19.312273025512695, -7.673230171203613, -3.245694160461426, -12.294034957885742, -10.059121131896973, -8.340250015258789, -6.9441423416137695, -5.462812900543213, -6.334737300872803, -5.314388751983643, -5.322555065155029, -4.323203086853027, -4.6451287269592285, -3.095691680908203, -3.3984415531158447, -3.402747869491577, -2.7085652351379395, -2.51513671875, -2.951267957687378, -2.7571682929992676, -2.558816909790039, -2.4867498874664307, -2.3901329040527344, -2.375945568084717, -2.404093027114868, -2.5399789810180664, -2.4855754375457764, -2.0552096366882324, 0.23360034823417664, -0.6254650950431824, -1.5911295413970947, -2.2850494384765625, -1.5522570610046387, -1.359688401222229, -1.9866268634796143, -2.0798442363739014, -1.1338692903518677, -1.0612783432006836, -0.9105952382087708, -1.1205147504806519, -0.9206946492195129, -0.4777166247367859, -1.28596830368042, -1.001623511314392, -1.1145389080047607, -1.0381758213043213, -0.7109525799751282, -0.5408516526222229, -0.9200298190116882, -0.4221055507659912, -0.6132196187973022, -0.45678186416625977, 0.5002219080924988, 1.1828240156173706, 0.41585877537727356, 0.20065852999687195, 1.139463186264038, 0.3380820155143738, 0.3371035158634186, -0.3092867434024811, -2.6889688968658447, -1.9579792022705078, -1.7426689863204956, -1.6036344766616821, -1.2619227170944214, -14.300032615661621, -8.209640502929688, -4.43801736831665, -3.0450103282928467, -2.8707964420318604, -2.649761199951172, -2.2836263179779053, -2.322253942489624, -2.373394727706909, -1.5404067039489746, -0.3449452817440033, -0.13616986572742462, -3.456265926361084, -2.842782974243164, -1.1350173950195312, -0.3811895251274109, -3.3155393600463867, -2.7761964797973633, -1.235686182975769, -0.4446364641189575, -1.4873168468475342, -0.3480736315250397, 1.4507967233657837, 1.0528265237808228, 1.0006486177444458, 1.0663710832595825, 0.4961460828781128, -0.3954235315322876, -2.0221221446990967, -4.891871929168701, -0.8532798886299133, 4.709255218505859, -0.013590337708592415, 0.9823217391967773, 5.466055870056152, 19.248552322387695, 7.704766273498535, 5.583001136779785, 12.463115692138672, 9.907303810119629, 8.166528701782227, 6.845732688903809, 5.3061347007751465, 6.326858997344971, 5.333719730377197, 5.330562114715576, 4.300183296203613, 4.602540016174316, 2.9993722438812256, 3.5282344818115234, 3.533322811126709, 2.567115306854248, 2.5072102546691895, 2.760854959487915, 2.6527812480926514, 2.550811529159546, 2.410085916519165, 2.2692928314208984, 2.216564416885376, 2.2961227893829346, 2.407707452774048, 2.409529685974121, 2.016953468322754, -0.1272735744714737, 0.8253637552261353, 1.518592119216919, 1.4460020065307617, 1.5685250759124756, 1.2729991674423218, 2.198314905166626, 1.1334038972854614, 1.122263789176941, 0.6390866637229919, 0.8636446595191956, 1.1045585870742798, 0.5485116839408875, 0.4423002600669861, 1.242871642112732, 0.888534426689148, 0.4922315776348114, 0.8671665787696838, 0.7313299179077148, 0.5199978947639465, 0.9993928670883179, 0.2491784691810608, 0.17265687882900238, 0.5316669940948486, -0.5010084509849548, -1.1836270093917847, -0.8156769871711731, -0.3058880567550659, -1.3355276584625244, -0.25306302309036255, -0.23224976658821106, 0.2825390696525574, 2.7587192058563232, 1.9938229322433472, 1.7585293054580688, 1.3305540084838867, 1.0360625982284546, 14.278777122497559, 8.15658187866211, 4.375566005706787, 2.884700059890747, 2.5964536666870117, 2.567826509475708, 2.2518980503082275, 2.4391605854034424, 2.245429277420044, 1.4949644804000854, 0.582448422908783, -0.04790542274713516, 3.585293769836426, 2.8106274604797363, 1.177231788635254, 0.34081751108169556, 3.1510887145996094, 2.6571271419525146, 1.2718452215194702, 0.4502386450767517, -1.4569214582443237, -0.5183768272399902, 1.4247690439224243, 1.1952847242355347, 1.0704149007797241, 0.696662187576294, 0.4357132017612457, -0.578811526298523, -1.8127881288528442, -4.848544120788574, -1.1404229402542114, 4.530750274658203, -0.055479906499385834, 0.9808154106140137, 5.488518238067627, 19.33883285522461, 7.602758407592773, 5.736112594604492, 12.462970733642578, 9.844576835632324, 8.31246566772461, 6.9471540451049805, 5.471607685089111, 6.386049747467041, 5.386390209197998, 5.40241003036499, 2.610337018966675, 4.740708351135254, 3.048919439315796, 3.6115033626556396, 3.4233739376068115, 2.649955987930298, 2.675405979156494, 2.880108594894409, 2.622850179672241, 2.533543586730957, 2.4685275554656982, 2.43415904045105, 2.2711384296417236, 2.308668375015259, 2.3606715202331543, 2.2971839904785156, 2.1062240600585938, -0.2133009135723114, 0.714409589767456, 1.633223056793213, 1.4234013557434082, 1.6107935905456543, 1.2855113744735718, 2.2024240493774414, 1.1158424615859985, 0.4681008458137512, 0.7417191863059998, -0.018716486170887947, 0.6319336295127869, 0.4485854506492615, 0.40393227338790894, 1.1905807256698608, 0.9238787889480591, 0.5063086748123169, 0.3457896411418915, 0.659623384475708, 0.3616856336593628, 0.940438449382782, -0.017967281863093376, 0.23964345455169678, 0.4583423137664795, -0.3950194716453552, -1.2081607580184937, -0.837325394153595, -0.18445560336112976, -1.4030430316925049, -0.3841593861579895, -0.27677664160728455, 0.384226530790329, 2.7718987464904785, 2.0668253898620605, 1.8644696474075317, 1.3831040859222412, 1.118679165840149, 14.3859281539917, 8.18867301940918, 4.36430025100708, 3.0915863513946533, 2.7764554023742676, 2.5189714431762695, 2.1111817359924316, 2.325563907623291, 2.3995134830474854, 1.384935975074768, 0.4858267903327942, 0.13715675473213196, 3.7168657779693604, 2.8109235763549805, 1.3313827514648438, 0.20373184978961945, 3.2154736518859863, 2.7099101543426514, 1.243646502494812, 0.494144082069397, -1.3658320903778076, -0.2865876853466034, 1.411838173866272, 1.240986943244934, 1.1471396684646606, 0.6116806864738464, 0.5536534190177917, -0.39608824253082275, -1.845452904701233, -4.9010419845581055, -1.1081583499908447, 4.535780906677246, 0.04654265567660332, 0.9656124114990234, 1.0901126861572266, 19.22427749633789, 7.695137023925781, 3.196397304534912, 12.50178337097168, 10.081515312194824, 8.283769607543945, 6.9158220291137695, 5.522806644439697, 6.357304096221924, 5.484114170074463, 5.319051265716553, 2.5015573501586914, 2.6620595455169678, 3.189669370651245, 3.437335729598999, 3.353301525115967, 2.6260738372802734, 2.4773058891296387, 2.9661858081817627, 2.6470768451690674, 2.6678895950317383, 2.4720301628112793, 2.3206045627593994, 2.332486152648926, 2.2819125652313232, 2.450340747833252, 2.393202781677246, 2.08209228515625, -0.1893307864665985, 0.7928186655044556, 1.5357530117034912, 1.5885379314422607, 1.5258595943450928, 1.3274190425872803, 2.150324821472168, 1.0121275186538696, 0.4153326153755188, 0.6610209345817566, -0.06882555782794952, 0.5366686582565308, 0.4680175185203552, 0.5261852741241455, 1.1460870504379272, 1.0939064025878906, 0.5135902166366577, 0.38284966349601746, 0.5038571953773499, 0.34749162197113037, 1.035119891166687, 0.16806532442569733, 0.24726973474025726, 0.43164873123168945, -0.4612061381340027, -1.0572110414505005, -0.8009306788444519, -0.27980440855026245, -1.419301986694336, -0.2534865736961365, -0.14053583145141602, 0.38953104615211487, 2.7252590656280518, 1.8498742580413818, 1.7791889905929565, 1.5072519779205322, 1.0790969133377075, 14.251280784606934, 8.211511611938477, 4.321418285369873, 3.1319620609283447, 2.746779441833496, 2.6478898525238037, 2.173396587371826, 2.4205477237701416, 2.4815316200256348, 1.3614569902420044, 0.585685670375824, 0.0005135852843523026, 3.4771370887756348, 2.640866994857788, 1.2618694305419922, 0.2105192393064499, 3.308764934539795, 2.6412551403045654, 1.1818405389785767, 0.48150718212127686, -1.5107616186141968, -0.3225195109844208, 1.2603260278701782, 1.2160567045211792, 1.0267380475997925, 0.65908282995224, 0.5652944445610046, -0.49803096055984497, -1.9257208108901978, -4.867487907409668, -1.0967252254486084, 4.723787307739258, 0.02865936979651451, 1.019310712814331, 1.254241704940796, 4.055185317993164, 7.567360877990723, 3.211092472076416, 12.443714141845703, 9.924410820007324, 8.145870208740234, 6.735800743103027, 5.43444299697876, 6.302181720733643, 5.499661922454834, 5.4852070808410645, 2.479905366897583, 2.6220808029174805, 3.051096200942993, 3.459430456161499, 3.5227506160736084, 2.5863850116729736, 2.4729700088500977, 2.740309000015259, 2.59195876121521, 2.6279690265655518, 2.5373692512512207, 2.2866287231445312, 2.2001237869262695, 2.276484966278076, 2.440417528152466, 2.516087532043457, 2.0203919410705566, -0.20763608813285828, 0.7255880832672119, 1.629145860671997, 1.4388022422790527, 1.5746650695800781, 1.4260063171386719, 2.186660051345825, 0.9133277535438538, 0.6198347210884094, 0.5265095233917236, -0.012174995616078377, 0.4535791277885437, 0.5928670763969421, 0.5051784515380859, 1.3202658891677856, 0.934963583946228, 0.597823977470398, 0.3353094756603241, 0.5238648056983948, 0.40153753757476807, 0.9737392663955688, -0.0473051592707634, 0.23669660091400146, 0.3398519456386566, -0.36742353439331055, -1.111261248588562, -0.7812760472297668, -0.20095059275627136, -1.4737744331359863, -0.354761004447937, -0.1324179768562317, 0.3072521686553955, 2.800567865371704, 1.960886001586914, 1.7909883260726929, 1.387552261352539, 1.0448821783065796, 14.30859088897705, 8.236827850341797, 4.247890949249268, 3.0452592372894287, 2.5849311351776123, 2.470428705215454, 2.2210445404052734, 2.481506586074829, 2.468748092651367, 1.4939759969711304, 0.4870641827583313, -0.07574906200170517, 3.678239107131958, 2.8401055335998535, 1.1401684284210205, 0.38198792934417725, 3.2536163330078125, 2.6715707778930664, 1.2032781839370728, 0.2400844693183899, 1.3826874494552612, 0.3309628665447235, -1.2250014543533325, -1.1954489946365356, -1.0189226865768433, -0.582927405834198, -0.38215675950050354, 0.42838865518569946, 1.8308719396591187, 4.7571234703063965, 1.0189274549484253, -4.620083808898926, 0.020166272297501564, -0.9369232654571533, -1.1644896268844604, -3.984037399291992, -7.723116874694824, -3.3409547805786133, -12.376529693603516, -10.060873985290527, -8.131372451782227, -6.80804967880249, -5.285688877105713, -6.289992809295654, -5.292094707489014, -5.304602146148682, -2.461285352706909, -4.682882308959961, -3.0819664001464844, -3.54605770111084, -3.5396275520324707, -2.5012898445129395, -2.54142689704895, -2.9659008979797363, -2.7302956581115723, -2.6040196418762207, -2.442765951156616, -2.4858672618865967, -2.2360897064208984, -2.2670035362243652, -2.505980968475342, -2.3858113288879395, -2.1512467861175537, 0.20062515139579773, -0.7569640874862671, -1.6799755096435547, -1.6187050342559814, -1.5177586078643799, -1.3626587390899658, -2.055011510848999, -0.9831571578979492, -0.5517156720161438, -0.7114755511283875, 0.08137281239032745, -0.6173107028007507, -0.5799934267997742, -0.4994145631790161, -1.2213376760482788, -0.999640941619873, -0.3788909316062927, -0.31328150629997253, -0.5956922173500061, -0.3415490388870239, -1.0298950672149658, -0.006074368022382259, -0.32477182149887085, -0.36233147978782654, 0.3989202380180359, 1.0691436529159546, 0.7131035923957825, 0.23220178484916687, 1.3746638298034668, 0.1728249192237854, 0.2768540680408478, -0.42310068011283875, -2.7698402404785156, -1.8575527667999268, -1.8426998853683472, -1.2901911735534668, -1.1741160154342651, -14.219252586364746, -7.236485004425049, -4.247403621673584, -2.89684796333313, -2.7419683933258057, -2.643399953842163, -2.3037991523742676, -2.388740062713623, -2.2987513542175293, -1.397368311882019, -0.4194043278694153, -0.0017059465171769261, -3.605109214782715, -2.7221839427948, -1.258066177368164, -0.17627477645874023, -3.2137367725372314, -2.567908525466919, -1.2101079225540161, -0.3757832646369934, 0.7011764645576477, -1.0349770784378052, -0.6078515648841858, -0.7064729928970337, -0.4256393313407898, 0.6446554660797119]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (20, 30), 'etaBin': (0.8, 1.37)}}, 'et1_eta0': {'discriminator': {'threshold': -0.32000081166625022, 'nodes': [100, 6, 1], 'bias': [0.09428483247756958, -0.04721463471651077, 0.03348788246512413, -0.09799544513225555, -0.3383110463619232, 0.136421799659729, -0.0016502226935699582], 'weights': [3.923448324203491, 1.1882224082946777, -0.6763618588447571, -0.6988966464996338, -0.18739859759807587, -0.13122932612895966, -0.0803513303399086, 0.36352407932281494, 1.6484767198562622, 2.7206170558929443, -2.009655237197876, -4.764303684234619, -7.428475379943848, -5.242104530334473, -5.1493120193481445, -3.9369795322418213, -4.319851875305176, -2.42492413520813, -3.8639581203460693, -3.06176495552063, -3.5927224159240723, -2.342604398727417, -2.2864866256713867, -2.682417392730713, -2.4459338188171387, -1.8506228923797607, -2.380054473876953, -2.536121368408203, -1.7753264904022217, -1.7710134983062744, -1.7237180471420288, -1.73544442653656, -1.6591451168060303, -1.634910225868225, -1.7335577011108398, -1.5049324035644531, -1.4207079410552979, -1.808071494102478, -1.769775629043579, -1.9586020708084106, -1.759112000465393, 0.6824190020561218, -1.6991995573043823, -1.5732603073120117, -1.0441198348999023, -0.26445966958999634, -1.1053507328033447, -0.8227761387825012, -0.8396470546722412, -0.029614917933940887, -1.1335971355438232, -0.42685258388519287, -0.7260417938232422, -0.9086365103721619, -0.5909733772277832, -0.5020917654037476, -0.5897409915924072, 0.5629515051841736, -0.571086049079895, -0.4344123899936676, 0.3413902521133423, -0.184260293841362, 0.02249733917415142, -0.7398144602775574, -1.648028016090393, -1.3329564332962036, 0.5283265113830566, -0.4305841326713562, 0.36262255907058716, -0.7422177195549011, 0.9301882386207581, 0.1162920743227005, 0.3746093511581421, 0.08978663384914398, -0.7556164264678955, -1.4996659755706787, -1.5741618871688843, -1.4125343561172485, -1.1244484186172485, -0.6970234513282776, -7.393949508666992, -3.830742597579956, -2.5318894386291504, -1.7298834323883057, -1.7483831644058228, -1.3825581073760986, -1.6762408018112183, -1.9955909252166748, -3.0325729846954346, -2.321094274520874, -0.9059852361679077, 0.01854351907968521, -2.9494946002960205, -1.7963650226593018, -0.5497912764549255, 0.044953852891922, -2.9953620433807373, -1.6981210708618164, -0.07101298868656158, -0.12509861588478088, -4.037827491760254, -1.3446953296661377, 0.7784045934677124, 0.6073556542396545, 0.24960488080978394, 0.10312885791063309, 0.027864275500178337, -0.4808664619922638, -1.7037843465805054, -2.634799003601074, 2.0211637020111084, 5.004406929016113, 7.504706382751465, 5.29726505279541, 5.054901123046875, 4.020586967468262, 4.481381893157959, 2.438789129257202, 3.8085429668426514, 2.972856283187866, 3.5939173698425293, 2.3869593143463135, 2.360999345779419, 2.6569135189056396, 2.468747615814209, 1.950138807296753, 2.4906649589538574, 2.5407261848449707, 1.802910566329956, 1.877778172492981, 1.8937097787857056, 1.6418582201004028, 1.626845359802246, 1.6486958265304565, 1.8066765069961548, 1.5416336059570312, 1.399609088897705, 1.8354934453964233, 1.682347059249878, 1.8889862298965454, 1.6141008138656616, -0.5000907182693481, 1.6114388704299927, 1.336704969406128, 1.0233625173568726, 0.3405361771583557, 1.1204007863998413, 0.7052913308143616, 0.905900239944458, 0.2467210441827774, 1.1417542695999146, 0.487510621547699, 0.7292344570159912, 0.7330562472343445, 0.6316474080085754, 0.5346447229385376, 0.7719225287437439, -0.4184606969356537, 0.6150315999984741, 0.3875364661216736, -0.34836921095848083, 0.13995802402496338, 0.09368211776018143, 0.7073189616203308, 1.6107147932052612, 1.264011263847351, -0.5309082269668579, 0.37896299362182617, -0.4109354615211487, 0.6589947938919067, -1.0766267776489258, -0.36314404010772705, -0.28229787945747375, -0.2987841069698334, 0.7517623901367188, 1.3129756450653076, 1.6994911432266235, 1.4297255277633667, 1.0785218477249146, 0.6303584575653076, 7.369983673095703, 4.051222801208496, 2.5190908908843994, 1.715894103050232, 1.8000702857971191, 1.417280912399292, 1.6880205869674683, 1.9712133407592773, 2.953469753265381, 2.383610486984253, 0.8263368606567383, 0.1536141335964203, 2.960911273956299, 1.8261113166809082, 0.4312123656272888, -0.06406568735837936, 2.962948799133301, 1.8352017402648926, -0.006507714278995991, 0.30261319875717163, 4.094224452972412, 1.3538014888763428, -0.6430330276489258, -0.5037286281585693, -0.02021068148314953, -0.1343294233083725, -0.051147762686014175, 0.468893438577652, 1.6346927881240845, 2.55149507522583, -2.0465762615203857, -4.870841026306152, -7.596250057220459, -5.097512722015381, -5.134709358215332, -4.079732418060303, -4.504998683929443, -1.448211908340454, -3.7079124450683594, -3.1969354152679443, -3.535269260406494, -2.3765645027160645, -2.3216142654418945, -2.565958023071289, -2.5622763633728027, -1.9192848205566406, -2.419567108154297, -2.5183629989624023, -1.8477065563201904, -1.884598731994629, -1.7961883544921875, -1.645997405052185, -1.6679456233978271, -1.6720283031463623, -1.6914526224136353, -1.3376121520996094, -1.4698761701583862, -1.7278283834457397, -1.7396018505096436, -2.0397355556488037, -1.6054697036743164, 0.666731059551239, -1.6442240476608276, -1.170311689376831, -0.8893857002258301, -0.2035771906375885, -1.261660099029541, -0.860862672328949, -0.8593165874481201, -0.03884166479110718, -1.2719595432281494, -0.3960013687610626, -0.7602661848068237, -0.8397487998008728, -0.43347546458244324, -0.6437143087387085, -0.5984553098678589, 0.4384280741214752, -0.6860079169273376, -0.2746046781539917, 0.3457860052585602, -0.1354590803384781, 0.030843423679471016, -0.7352814674377441, -1.6452915668487549, -1.2735707759857178, 0.45766186714172363, -0.4680826663970947, 0.25973784923553467, -0.5401926636695862, 1.0860638618469238, 0.469875693321228, 0.31843212246894836, 0.26076576113700867, -0.7279438972473145, -1.4087984561920166, -1.5858793258666992, -1.2986433506011963, -1.0795834064483643, -0.4858991503715515, -7.280345439910889, -3.934363603591919, -2.5324549674987793, -1.6415549516677856, -1.7741668224334717, -1.2166703939437866, -1.7384816408157349, -1.7875797748565674, -2.9822635650634766, -2.255749225616455, -0.7790749669075012, 0.06430347263813019, -3.0778605937957764, -1.9036273956298828, -0.49056267738342285, 0.1618373692035675, -3.0342941284179688, -1.7184972763061523, -0.23414337635040283, -0.27585524320602417, -1.1261011362075806, -1.1798738241195679, -0.9485312700271606, 0.16112913191318512, 0.1641768515110016, 0.07582134753465652, 0.14433221518993378, -0.4372958242893219, -1.676491141319275, -2.551440954208374, 1.9285380840301514, 4.91425085067749, 7.662518501281738, 5.29468297958374, 5.193585395812988, 4.031679630279541, 4.416653633117676, 2.5406181812286377, 3.8636605739593506, 2.9419915676116943, 3.573391914367676, 2.4995038509368896, 2.229203224182129, 2.7799723148345947, 2.3641457557678223, 1.9324288368225098, 2.3154587745666504, 2.694338798522949, 1.870150089263916, 1.7996881008148193, 1.7266204357147217, 1.6662640571594238, 1.6988842487335205, 1.4557876586914062, 1.694400668144226, 1.518085241317749, 1.3557237386703491, 1.8312348127365112, 1.7126238346099854, 1.8639191389083862, 1.7016428709030151, -0.19371654093265533, 1.7526798248291016, 1.6858230829238892, 0.953188419342041, 0.36363399028778076, 1.0622607469558716, 0.8269491791725159, 0.7739856243133545, 0.23601265251636505, 1.2676434516906738, 0.5918899178504944, 0.8395336866378784, 0.981619119644165, 0.602532148361206, 0.5546470880508423, 0.7497178912162781, -0.36620593070983887, 0.5320726037025452, 0.4394287168979645, -0.3673272430896759, 0.11589080095291138, -0.08498596400022507, 0.7535653114318848, 1.600698471069336, 1.229651927947998, -0.49804428219795227, 0.3166012167930603, -0.4410797953605652, 0.9971193671226501, -0.8890329599380493, -0.0023846453987061977, -0.2948201298713684, -0.24493838846683502, 0.7322864532470703, 1.4917255640029907, 1.5198543071746826, 1.3444273471832275, 0.708216667175293, 0.5756549835205078, 7.282473087310791, 3.964520215988159, 2.5772628784179688, 1.7302260398864746, 1.707587480545044, 1.1897637844085693, 1.7308176755905151, 1.864957571029663, 3.0347917079925537, 2.334423303604126, 0.7820855975151062, -0.038981884717941284, 2.9271435737609863, 1.8597732782363892, 0.5414337515830994, -0.1161341443657875, 2.9158060550689697, 1.7217378616333008, 0.13564832508563995, 0.25485867261886597, 68.41543579101562, 0.807092010974884, -0.03815412148833275, -0.0031056092120707035, 0.3357650637626648, 0.17168110609054565, 0.14499792456626892, 0.3020905554294586, 1.037489414215088, 2.240356922149658, 0.2505757808685303, -10.780411720275879, 2.1264612674713135, -0.3292251527309418, -1.6696528196334839, -1.4874883890151978, -0.6973477005958557, -0.7882032990455627, -1.4552565813064575, 0.05444833263754845, -1.3506237268447876, -1.0490533113479614, -0.8472493886947632, -1.0677050352096558, -0.827885091304779, -0.7792014479637146, -0.6453233361244202, -1.0011374950408936, -0.6126304864883423, -0.6655076742172241, -0.6420760750770569, -0.6135802865028381, -0.72860187292099, 4.171623706817627, -0.5551552176475525, 2.451664686203003, -0.4434615671634674, -0.7158829569816589, -0.6591212153434753, -0.7634958624839783, -0.5202367305755615, 0.29859960079193115, -0.5022311806678772, -0.2385317087173462, -0.3225386440753937, 0.08737433701753616, -0.3380112946033478, -0.2965800166130066, -0.31959769129753113, 0.13457518815994263, -0.39021754264831543, -0.14648278057575226, -0.11529599875211716, -0.3072280287742615, -0.05452859029173851, -0.017405381426215172, -0.1924649477005005, 0.37374645471572876, -0.8509728908538818, -0.13951194286346436, 0.32901865243911743, 0.15458373725414276, 0.16355739533901215, -0.2256907969713211, -0.15639078617095947, -0.21790683269500732, 0.35897794365882874, 0.0248115137219429, 0.36136311292648315, -0.038327042013406754, 0.7363858222961426, 0.34456291794776917, 0.3903294801712036, -0.4767921268939972, -0.021873565390706062, 0.3957872688770294, 1.7582982778549194, 1.7655011415481567, -0.21013952791690826, 0.15366579592227936, -1.8137587308883667, -1.5353763103485107, -0.7630446553230286, -0.6249462366104126, -0.7243854999542236, -0.36755916476249695, -0.7164442539215088, -0.7284979820251465, 4.877445220947266, 1.675413727760315, -0.24474026262760162, 0.1344580352306366, 13.538191795349121, 0.393987774848938, 0.02512023225426674, 0.13981109857559204, -1.15338933467865, -0.909194827079773, 0.16977693140506744, 0.004831548780202866, 1.0855668783187866, 1.3767421245574951, 0.779876172542572, -0.3380758762359619, -0.214487686753273, -0.06112128123641014, -0.16263015568256378, 0.33733585476875305, 1.6739202737808228, 2.5217883586883545, -1.9365088939666748, -4.83817195892334, -7.593231678009033, -5.2851080894470215, -5.0597243309021, -4.102902889251709, -4.443674564361572, -2.5735738277435303, -3.7927825450897217, -2.9662463665008545, -3.575557231903076, -2.3379318714141846, -2.442155122756958, -2.6344223022460938, -2.339329242706299, -1.9245784282684326, -2.4700746536254883, -2.717705249786377, -1.6702909469604492, -1.8246701955795288, -1.8243670463562012, -1.7465704679489136, -1.7666319608688354, -1.4825994968414307, -1.7120200395584106, -1.3965201377868652, -1.376320719718933, -1.6275217533111572, -1.6995038986206055, -1.9057179689407349, -1.5360676050186157, 0.5846211314201355, -1.7099270820617676, -1.756282091140747, -0.9218419790267944, -0.4266519248485565, -1.21243155002594, -0.830771267414093, -0.8784458637237549, -0.046456318348646164, -1.2872374057769775, -0.4588843882083893, -0.7572606801986694, -0.9550910592079163, -0.5648831725120544, -0.49344655871391296, -0.7432249784469604, 0.4892309010028839, -0.5027213096618652, -0.47274747490882874, 0.22537299990653992, -0.1758030503988266, -0.037124548107385635, -0.7236385345458984, -1.6959059238433838, -1.3609012365341187, 0.40990275144577026, -0.4239270091056824, 0.2739073634147644, -0.8325074315071106, 0.9795343279838562, 0.00927299540489912, 0.22855588793754578, 0.13855595886707306, -0.8043398261070251, -1.298763632774353, -1.6467868089675903, -1.3270063400268555, -0.758661687374115, -0.6183732748031616, -7.344381332397461, -4.043093681335449, -2.7266080379486084, -1.7013587951660156, -1.7875580787658691, -1.3098913431167603, -1.6492325067520142, -1.946955680847168, -3.023843765258789, -2.2150039672851562, -0.9058859348297119, -0.10050598531961441, -2.876117706298828, -1.8660410642623901, -0.41135260462760925, 0.08043376356363297, -2.813690662384033, -1.6882896423339844, -0.03904115408658981, -0.3114432096481323, 0.8298541903495789, -0.9455680251121521, 1.103615641593933, -1.0841418504714966, 0.3889533579349518, 1.1483161449432373]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (20, 30), 'etaBin': (0, 0.8)}}, 'et3_eta1': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 5, 1], 'bias': [-0.14058396220207214, -0.010156997479498386, 0.06733924150466919, -0.07649846374988556, 0.1293705850839615, 0.10575754195451736], 'weights': [1.1464204788208008, 1.2067878246307373, -0.28515830636024475, -0.6625406742095947, -0.28769823908805847, 0.13101060688495636, 0.5060973763465881, 0.07477506250143051, 1.7470577955245972, 2.6376776695251465, -1.5882339477539062, -4.5880889892578125, -0.46777409315109253, -0.4468534290790558, -2.810885429382324, -4.303411960601807, -2.836515426635742, -2.6504995822906494, -5.5379157066345215, -5.193375110626221, -5.799534797668457, -2.3341825008392334, -2.6373019218444824, -2.5101006031036377, -2.6728148460388184, -0.5762125253677368, -2.9398365020751953, -1.8632680177688599, -1.7720856666564941, -1.7791000604629517, -2.0870559215545654, -2.242917537689209, -3.039011001586914, -4.897435665130615, -1.5594055652618408, 0.29868486523628235, -1.8047505617141724, -0.5125581622123718, -1.627350926399231, -1.0700658559799194, -1.6318979263305664, -1.447097897529602, -0.97405606508255, -0.9917728900909424, -0.27230104804039, -0.44569796323776245, 1.3847215175628662, -0.9223855137825012, -0.8403496742248535, -0.8519346117973328, -0.6648346185684204, -0.4896341860294342, -2.749429941177368, 2.6370368003845215, -0.33549007773399353, -0.480179101228714, -0.5426475405693054, -0.4316626489162445, -0.6873779296875, -0.660333514213562, 0.05645446106791496, 1.2366952896118164, -0.16785748302936554, 0.4090938866138458, -0.4713269770145416, -0.8317732810974121, -1.8288275003433228, -0.13761776685714722, 0.261544793844223, -0.020635241642594337, 0.19626902043819427, 1.6235370635986328, 0.4725204408168793, 0.1403738111257553, -0.43527036905288696, -0.8138880729675293, -1.7723891735076904, -0.7774099707603455, -1.136383056640625, -0.3619338572025299, -3.3469748497009277, -3.8529646396636963, -2.103095769882202, -1.985591173171997, -1.6665419340133667, -0.6530410647392273, -2.53981351852417, -1.8707005977630615, -1.3365834951400757, -0.7573326826095581, -0.1973240226507187, 0.24604938924312592, -3.0916507244110107, -2.1134731769561768, -0.7261000275611877, 0.03696891665458679, -2.770416736602783, -1.9849522113800049, -1.8168784379959106, -0.20196595788002014, 1.2289875745773315, 1.2332342863082886, -0.4334612786769867, -0.7423491477966309, -0.23879605531692505, 0.16808798909187317, 0.37993887066841125, 0.09751887619495392, 1.7321946620941162, 0.9208857417106628, -1.632216215133667, -4.4352898597717285, -0.5792647004127502, -1.706499457359314, -2.6057097911834717, -4.27695894241333, -2.979640483856201, -2.666217088699341, -5.394307613372803, -5.226280689239502, -5.667537212371826, -2.3605830669403076, -2.468632459640503, -2.567067861557007, -2.603724479675293, -0.6089507937431335, -2.765385389328003, -1.7737246751785278, -1.7722558975219727, -1.9457465410232544, -2.237405300140381, -2.1448466777801514, -2.932236433029175, -4.942885875701904, -1.5568363666534424, -0.7975941300392151, -1.7974990606307983, -0.48156991600990295, -1.6772531270980835, -1.093492865562439, -1.6772154569625854, -1.556591510772705, -1.097195029258728, -0.931762158870697, -0.39597970247268677, -0.6163713335990906, 1.096318244934082, -0.8394436836242676, -0.7740214467048645, -1.091386318206787, -0.696062445640564, -0.5440112948417664, -2.7632176876068115, 2.7588603496551514, 0.6027905941009521, -0.676897406578064, -0.7062645554542542, -0.6056439280509949, -0.5418381690979004, -0.5713596940040588, -0.03145892545580864, 1.4845952987670898, -0.739717960357666, 0.4211161434650421, -0.521577000617981, -0.642084002494812, -1.8894439935684204, -0.196270152926445, 0.2301837056875229, 0.12156328558921814, 0.09879958629608154, 1.5312397480010986, 0.4896114468574524, 0.1724841147661209, -0.447278767824173, -0.90472412109375, -1.6582369804382324, -1.0757876634597778, -1.2255232334136963, 0.17686861753463745, -3.4604837894439697, -3.9889583587646484, -2.2140815258026123, -1.859501838684082, -1.696321725845337, -0.6070360541343689, -2.626055955886841, -2.04848051071167, -1.4573805332183838, -0.8128771781921387, -0.034132182598114014, 0.2672517001628876, -3.0215039253234863, -2.030954122543335, -0.9436529278755188, -0.4262523651123047, -2.7508294582366943, -1.3706477880477905, -1.6185466051101685, -0.1981123685836792, -1.175389051437378, -1.1598323583602905, 0.38730573654174805, 0.8325306177139282, 0.28435105085372925, -0.18733718991279602, -0.4185461103916168, -0.08939151465892792, -1.8770824670791626, -2.563385248184204, 1.6099488735198975, 4.484491348266602, 0.6108928918838501, 1.6056360006332397, 2.662555456161499, 4.263810157775879, 2.78157901763916, 2.6834702491760254, 5.538370609283447, 5.223874568939209, 5.660417079925537, 2.297001600265503, 2.4157140254974365, 2.639709949493408, 2.755115032196045, 0.6514777541160583, 2.894240140914917, 1.737408995628357, 1.8106071949005127, 1.8579720258712769, 2.2233378887176514, 2.241504430770874, 2.9423248767852783, 4.878469467163086, 1.9052973985671997, 0.5610609650611877, 1.71853768825531, 0.5269231200218201, 1.4773133993148804, 1.1114442348480225, 1.4584585428237915, 1.5761823654174805, 0.9307408928871155, 0.9505367875099182, 0.30985787510871887, 0.4778963327407837, -1.0503709316253662, 0.7971989512443542, 0.8974006772041321, 1.0396018028259277, 0.6561216115951538, 0.6621599793434143, 2.640239715576172, -2.61531138420105, 0.38022053241729736, 0.4664246737957001, 0.6559479832649231, 0.44172337651252747, 0.5368390679359436, 0.554684042930603, 0.02156297117471695, -1.2618663311004639, 0.5779081583023071, -0.20528863370418549, 0.43809038400650024, 0.6577037572860718, 1.8972069025039673, 0.029116105288267136, -0.16851399838924408, -0.07194825261831284, -0.006217167712748051, -1.4465324878692627, -0.4251112639904022, -0.2592546343803406, 0.5819464921951294, 0.8879455327987671, 1.6747844219207764, 1.0146082639694214, 1.1712167263031006, -0.035036683082580566, 3.3428122997283936, 3.8900070190429688, 2.2322709560394287, 1.8635920286178589, 1.7416054010391235, 0.5695316195487976, 2.661424398422241, 2.0481526851654053, 1.4977550506591797, 0.8479567766189575, 0.012441311962902546, -0.24147672951221466, 3.0376315116882324, 2.089226484298706, 0.9434524178504944, 0.3540703356266022, 2.8294332027435303, 1.2397146224975586, 1.625142216682434, 0.09659366309642792, 1.0279542207717896, 1.138154149055481, -0.2595961391925812, -0.819037675857544, -0.41244974732398987, 0.05184108391404152, 0.4502420723438263, 0.1416597068309784, 1.6836082935333252, 2.4917287826538086, -1.4323716163635254, -4.5349345207214355, -0.6647194027900696, -1.6684268712997437, -2.6388678550720215, -4.355661869049072, -2.808748722076416, -2.6888272762298584, -5.588684558868408, -5.214621067047119, -5.685235500335693, -2.3215930461883545, -2.635526657104492, -2.6018660068511963, -2.5341546535491943, -0.6950390338897705, -2.7777016162872314, -1.7542210817337036, -1.8483892679214478, -1.846396565437317, -2.178955078125, -2.181396961212158, -2.9261341094970703, -4.951703071594238, -1.666548252105713, 0.2821841537952423, -1.681933045387268, -0.4199392795562744, -1.5648959875106812, -1.022971510887146, -1.6724826097488403, -1.485029697418213, -1.1298590898513794, -0.9730470776557922, -0.28265199065208435, -0.4415583610534668, 1.1810696125030518, -0.7960107922554016, -0.8624612092971802, -0.9603792428970337, -0.6445156335830688, -0.6536909937858582, -2.8332080841064453, 2.647057056427002, -0.3350646197795868, -0.681509256362915, -0.6635286211967468, -0.5253638029098511, -0.5234053134918213, -0.6012322902679443, 0.1517142355442047, 1.3208472728729248, -0.05931241810321808, 0.36842599511146545, -0.45350944995880127, -0.8182008266448975, -1.873921513557434, -0.009066952392458916, 0.35633140802383423, 0.00880338903516531, 0.11586792767047882, 1.6656674146652222, 0.45195531845092773, 0.1604243814945221, -0.630664587020874, -0.8327372670173645, -1.7361226081848145, -0.7621591687202454, -1.1136603355407715, -0.3598534166812897, -3.42808198928833, -3.8219974040985107, -2.2530033588409424, -1.8942232131958008, -1.8818079233169556, -0.5462697148323059, -2.6618480682373047, -1.9506031274795532, -1.5569698810577393, -0.7033156156539917, -0.2067478746175766, 0.3543814420700073, -2.9655261039733887, -2.0257229804992676, -0.9127545952796936, -0.5428412556648254, -2.681168556213379, -1.3037751913070679, -1.7885948419570923, -0.005853230599313974, -1.0860682725906372, -1.0734792947769165, 0.27771878242492676, 0.66318678855896, 0.4281288683414459, 0.021441476419568062, -0.4228176176548004, -0.045351747423410416, -1.7974884510040283, -2.4933993816375732, 1.4437899589538574, 4.48915433883667, 0.6418988704681396, 0.38811638951301575, 2.6976161003112793, 4.356443881988525, 2.789215087890625, 2.8492746353149414, 5.5300068855285645, 5.209054470062256, 5.647152423858643, 2.3758299350738525, 2.457690477371216, 2.6274266242980957, 2.619152545928955, 0.5737661123275757, 2.9511682987213135, 1.893384337425232, 1.8045170307159424, 1.8663023710250854, 2.0648622512817383, 2.0794131755828857, 3.0032405853271484, 4.855755805969238, 1.6529033184051514, -0.18197762966156006, 1.6592453718185425, 0.43303021788597107, 1.5172001123428345, 1.1304086446762085, 1.6846052408218384, 1.448781132698059, 0.9475112557411194, 0.9966188073158264, 0.47153156995773315, 0.5621554851531982, -1.3490948677062988, 1.062267541885376, 0.8943380117416382, 0.8916992545127869, 0.5641133785247803, 0.647514820098877, 2.8187954425811768, -2.661088466644287, 0.3544188439846039, 0.5078852772712708, 0.5281962752342224, 0.4739721715450287, 0.7331516742706299, 0.6662646532058716, -0.1832236498594284, -1.4693982601165771, 0.02233303338289261, -0.31534868478775024, 0.45322951674461365, 0.7676177024841309, 2.0272295475006104, 0.23029379546642303, -0.14894478023052216, -0.14739438891410828, -0.031203297898173332, -1.4461865425109863, -0.38258659839630127, -0.2581344246864319, 0.5952154397964478, 0.8467711210250854, 1.7590489387512207, 0.716701090335846, 1.0528626441955566, 0.41462835669517517, 3.313983917236328, 3.92500376701355, 2.3016252517700195, 1.765486240386963, 1.7265759706497192, 0.6142205595970154, 2.6038918495178223, 1.9042367935180664, 1.3280261754989624, 0.6109039783477783, -0.01948726363480091, -0.12509223818778992, 2.968801736831665, 2.007418155670166, 0.9509100317955017, 0.07723372429609299, 2.856487512588501, 1.2510318756103516, 1.7686060667037964, 0.144351989030838, 1.976989507675171, 0.8318104147911072, -4.274761199951172, 2.218122720718384, -1.989960789680481]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0.8, 1.37)}}, 'et0_eta3': {'discriminator': {'threshold': -0.28000081256031989, 'nodes': [100, 12, 1], 'bias': [-0.005526068154722452, -0.14407646656036377, -0.08192288130521774, -0.001809734501875937, -0.10623811930418015, -0.1274862289428711, 0.0917968600988388, 0.17756062746047974, 0.009135567583143711, 0.05177127569913864, 0.16776925325393677, 0.1346316933631897, 0.03238997980952263], 'weights': [0.07347682863473892, 0.11086798459291458, -0.22192643582820892, 0.09431090205907822, -0.05672236904501915, 0.11650260537862778, 0.14526772499084473, 0.018506711348891258, 0.3028365671634674, 0.15159951150417328, 0.2367319017648697, 0.042840637266635895, -0.35028985142707825, -0.31897103786468506, -1.3899519443511963, -1.9221934080123901, -0.8345057964324951, -1.4002259969711304, -0.11473327875137329, -0.5336739420890808, 0.046892136335372925, 0.020185809582471848, -0.27707216143608093, -0.32486623525619507, -0.28225624561309814, -0.12812288105487823, -0.07255647331476212, -0.0880657508969307, 0.04132342338562012, -0.01982087269425392, -0.06551582366228104, -0.21632741391658783, 0.08068790286779404, -0.2809408903121948, 0.07507067173719406, -0.21632595360279083, 0.10672523826360703, 0.17428983747959137, 0.08878613263368607, 0.0024222845677286386, 0.21090568602085114, 0.13904181122779846, 0.056481070816516876, -0.053941935300827026, -0.0006760474061593413, 0.1476811170578003, -0.2004903107881546, -0.060623180121183395, -0.03918984904885292, -0.14786642789840698, 0.07511330395936966, -0.12189099192619324, 0.11945702880620956, 0.0014888636069372296, 0.055504683405160904, 0.06655048578977585, -0.004591848701238632, 0.049100060015916824, 0.07141102105379105, 0.1084647849202156, 0.11069134622812271, -0.05304590240120888, 0.08269322663545609, 0.022154495120048523, 0.06309032440185547, 0.17265938222408295, 0.1972074657678604, 0.11327174305915833, 0.21721617877483368, 0.029723765328526497, 0.6813767552375793, 0.28352710604667664, 0.06496311724185944, -0.04755278304219246, -0.35126793384552, -0.07787079364061356, -0.13117091357707977, -0.1766783446073532, 0.031938813626766205, 0.07550125569105148, -0.8615522384643555, -0.6679161190986633, -0.12950240075588226, -0.09848945587873459, -0.0540039986371994, -0.14964455366134644, 0.23978275060653687, -0.15690870583057404, 0.08983753621578217, -0.10051235556602478, 0.02544274553656578, -0.025074589997529984, -0.1731126606464386, -0.013265403918921947, 0.005334390792995691, 0.3504922091960907, 0.05395995453000069, 0.20664794743061066, -0.008105502463877201, -0.0842062383890152, 0.855747640132904, 0.7074270248413086, -0.016444029286503792, -0.2780096232891083, -0.3728114366531372, -0.3448895812034607, 0.010952084325253963, 0.17163412272930145, 1.401155710220337, 1.4119529724121094, 1.1573766469955444, 0.15913087129592896, -0.9635791182518005, -0.004706947132945061, -2.7353320121765137, -1.8571641445159912, -0.8683490753173828, -1.224515676498413, -0.32254523038864136, -4.198087215423584, -0.6634833812713623, 0.08895087242126465, -1.5653350353240967, -1.5306264162063599, -1.265318751335144, -1.2880889177322388, -0.9057645201683044, -1.3303006887435913, -0.6194390654563904, -0.2876385748386383, -0.2651457190513611, -0.926378607749939, -0.689467191696167, -1.1560643911361694, -0.5342223644256592, -1.0350139141082764, -0.4904097616672516, 0.03905121982097626, -0.012493722140789032, -0.7521436214447021, 0.21592386066913605, 0.8197923302650452, -0.4486432373523712, -0.36533045768737793, -0.5907633304595947, 0.6238790154457092, -0.8606862425804138, -0.5602596998214722, -0.2714194655418396, -0.4400058686733246, 0.06338010728359222, -0.5400457382202148, 0.5681506395339966, -0.38450828194618225, 0.3632930815219879, 0.10522530227899551, -0.22643527388572693, -0.4927605390548706, 0.2428278625011444, 0.5828389525413513, 0.4789542257785797, -0.6057939529418945, 0.27690306305885315, 0.16087718307971954, -0.14181575179100037, 0.8329270482063293, 0.9529933333396912, 0.11186084151268005, 0.19148360192775726, -0.37853938341140747, 3.115266799926758, 0.48467060923576355, 0.27880263328552246, 0.3575509786605835, -0.1261363923549652, -0.8967247605323792, -0.9208580851554871, -0.7278516888618469, -0.4357077181339264, -0.30160582065582275, -4.074020862579346, -3.13667631149292, -1.4786394834518433, -0.6965441703796387, -0.9018935561180115, -0.7534804940223694, 0.41811078786849976, -0.6213122010231018, -0.34094229340553284, -0.5763772130012512, -0.09397301077842712, 0.05943828076124191, -1.3248196840286255, -0.6100223660469055, 0.19724351167678833, 0.10311945527791977, -0.3543071448802948, -0.03594284504652023, 0.10391878336668015, 0.24742886424064636, 0.00842108391225338, 0.0860825926065445, -0.07726234942674637, -0.12025225162506104, 0.022525157779455185, -0.06872686743736267, -0.16843517124652863, -0.08427511155605316, -1.0784353017807007, -0.1799338012933731, -0.583513081073761, 0.3034774661064148, 1.4859081506729126, 0.2909749746322632, 2.9033586978912354, 0.5619007349014282, 0.3196623921394348, 0.34367048740386963, -0.02729983814060688, 0.21850748360157013, -0.04758019000291824, -0.08521731197834015, -0.060818083584308624, 0.11483602970838547, -0.0322471521794796, 0.050403304398059845, 0.09942431002855301, 0.15561765432357788, -0.06184005364775658, -0.03521320968866348, -0.09842794388532639, 0.10993342846632004, -0.04234985262155533, 0.01581757329404354, -0.1170201376080513, -0.09533613175153732, 0.06596697866916656, -0.05266482010483742, -0.10430748015642166, -0.09664641320705414, -0.16822968423366547, -0.09581680595874786, 0.025377027690410614, 0.08222180604934692, 0.007014991249889135, -0.01759798638522625, 0.030903633683919907, -0.10274358093738556, 0.056878261268138885, 0.08013400435447693, -0.06835773587226868, -0.08981900662183762, -0.3249205946922302, 0.08807559311389923, -0.05523494631052017, -0.1798548847436905, -0.04893767833709717, 0.06124546378850937, -0.20350730419158936, -0.17651942372322083, -0.32398101687431335, -0.027756955474615097, -0.16674423217773438, -0.18017792701721191, -0.01897132210433483, -0.23978625237941742, -0.30503523349761963, -0.09166087210178375, -0.2619082033634186, -0.123734250664711, -0.6592873334884644, -0.22616378962993622, 0.3362840414047241, 0.01528079342097044, 0.19117462635040283, -0.09905395656824112, -0.08071215450763702, 0.0898781269788742, -0.07270664721727371, 0.08015698194503784, 0.1904226541519165, 0.0017876464407891035, -0.03542063757777214, 0.054917220026254654, 0.1386953890323639, -0.07253273576498032, -0.15625742077827454, -0.005800198297947645, 0.08101876825094223, -0.0663861334323883, -0.22704042494297028, -1.006371259689331, 0.09764708578586578, 0.010764076374471188, -0.11778287589550018, -2.0778450965881348, -0.09443961083889008, -0.17228789627552032, -0.18620581924915314, 0.27392756938934326, 0.8744163513183594, 0.8125483989715576, -0.0053376671858131886, -0.2002032846212387, -0.47455692291259766, -0.15588080883026123, -0.0051125288009643555, -0.024333246052265167, 1.2056201696395874, 1.3944300413131714, 1.1319537162780762, -0.09528699517250061, -0.9170843958854675, -0.014647792093455791, -2.8694591522216797, -1.9158152341842651, -0.8248977661132812, -1.2046726942062378, -0.25200286507606506, -3.3429982662200928, -0.37323155999183655, -0.027821844443678856, -1.4500927925109863, -1.486460566520691, -1.3272377252578735, -1.3038021326065063, -0.9106979966163635, -1.2255276441574097, -0.6897165179252625, -0.33680611848831177, -0.09995408356189728, -0.967322051525116, -0.6430069208145142, -1.2293671369552612, -0.39361080527305603, -1.0808135271072388, -0.001004521269351244, 0.26315218210220337, -0.006637883838266134, -0.8298298120498657, -0.07509388774633408, 0.7364076972007751, -0.4815395176410675, -0.38508111238479614, -0.43553584814071655, 0.7057363390922546, -0.8194615244865417, -0.6102641820907593, -0.4546935260295868, -0.579706609249115, 0.10725420713424683, -0.785744845867157, 0.4946363568305969, -0.474288672208786, 0.2102336436510086, -0.03970213234424591, -0.3224485218524933, -0.4019050598144531, 0.21190160512924194, 0.6654230356216431, 0.511168360710144, -0.4810371398925781, 1.0577058792114258, 0.2490135133266449, -0.09986763447523117, 0.8817153573036194, 1.0048160552978516, -0.36437126994132996, 0.20315374433994293, -0.330370157957077, 2.942955493927002, 0.42803582549095154, 0.5143197774887085, 0.39953476190567017, -0.5323323607444763, -0.7767040133476257, -1.044390082359314, -0.7440090179443359, -0.355406790971756, -0.35815170407295227, -4.237850189208984, -3.0227644443511963, -1.49408757686615, -0.6865396499633789, -0.8504322171211243, -0.673483669757843, 0.5320491194725037, -0.45379316806793213, -0.4189683198928833, -0.48896026611328125, 0.14664076268672943, 0.023087093606591225, -1.375417947769165, -0.587888777256012, 0.0001595106878085062, 0.10394413024187088, -0.2924331724643707, -0.1908976286649704, 0.012759930454194546, 0.3284040689468384, 0.14168211817741394, -0.04534709081053734, -0.061322566121816635, -0.0018186133820563555, -0.008228253573179245, 0.002197754569351673, 0.14681458473205566, 0.06852608174085617, 0.16117675602436066, 0.18891580402851105, 0.23935651779174805, -0.11590386182069778, -0.237266406416893, -0.37408459186553955, -1.3021790981292725, -2.021311044692993, -1.0043226480484009, -1.2683333158493042, 0.04500492289662361, -0.613460898399353, 0.028964290395379066, 0.05371265113353729, -0.15793932974338531, -0.3019441068172455, -0.199056476354599, -0.2443135529756546, -0.11962194740772247, -0.1444297730922699, -0.03305366635322571, 0.00960729829967022, 0.013261242769658566, -0.24069702625274658, -0.027906352654099464, -0.2840786874294281, -0.0272306427359581, -0.03390061482787132, 0.007627041079103947, 0.050167858600616455, 0.07867341488599777, 0.004167712293565273, 0.1452757567167282, 0.11340190470218658, -0.11871328204870224, -0.02474808134138584, -0.06323155760765076, 0.30139535665512085, -0.07401128858327866, -0.05047077685594559, 0.0033744617830961943, -0.10416176915168762, -0.0127211669459939, -0.11493046581745148, 0.21504515409469604, 0.04273524507880211, 0.10369852185249329, 0.0026657693088054657, 0.16297727823257446, 0.06843680143356323, 0.1936783790588379, 0.1834593564271927, 0.14125841856002808, -0.032214343547821045, 0.1515183448791504, 0.18664170801639557, 0.03668138012290001, 0.1209854707121849, 0.30160486698150635, 0.23028595745563507, 0.06258966028690338, -0.11846767365932465, 0.7819381952285767, 0.30579298734664917, -0.09066370129585266, 0.12039241194725037, -0.31799423694610596, -0.0535348616540432, -0.052090127021074295, 0.0012685826513916254, 0.08462054282426834, -0.04484141618013382, -0.8824142217636108, -0.4605533182621002, -0.2246975600719452, 0.06346900761127472, -0.04791492596268654, 0.045877862721681595, 0.2868633270263672, -0.001428512274287641, 0.06217288225889206, 0.050635140389204025, 0.013391317799687386, -0.04036753997206688, -0.30595308542251587, 0.06169583275914192, 0.17272765934467316, 0.43375855684280396, 0.09545344859361649, 0.23572556674480438, -0.05034046992659569, -0.2155289351940155, 0.9065430164337158, 0.5857232809066772, -0.03530312702059746, -0.3067540228366852, -0.4503781199455261, -0.339547336101532, -0.18671448528766632, 0.028712963685393333, 1.4522440433502197, 1.3335511684417725, 1.0613354444503784, 0.17492231726646423, -0.9013590812683105, -0.06811504065990448, -2.72227144241333, -1.8414833545684814, -0.899369478225708, -1.2936887741088867, -0.34870070219039917, -4.074159622192383, -0.7317330837249756, 0.06324698030948639, -1.571948528289795, -1.529797911643982, -1.3649953603744507, -1.2017725706100464, -0.8665840029716492, -1.1559250354766846, -0.5724329352378845, -0.3783361315727234, -0.20255477726459503, -1.071000337600708, -0.6594464778900146, -1.3547478914260864, -0.33298036456108093, -1.0795292854309082, -0.057504959404468536, 0.15285950899124146, 0.04248875379562378, -0.8943964242935181, 0.25436675548553467, 0.7213768362998962, -0.5781385898590088, -0.26770395040512085, -0.5101674795150757, 0.7498635649681091, -0.7504525780677795, -0.5074657201766968, -0.4570271074771881, -0.5983095169067383, -0.002321421168744564, -0.551486611366272, 0.6265198588371277, -0.4537837505340576, 0.3557170331478119, 0.06089989095926285, -0.4518108069896698, -0.4641896188259125, 0.1304561197757721, 0.6468974351882935, 0.6592563986778259, -0.41315239667892456, 0.1933002471923828, 0.3742205798625946, -0.1508912742137909, 0.821418285369873, 0.8794024586677551, 0.1548968255519867, 0.29681187868118286, -0.40018463134765625, 3.0190861225128174, 0.6254054307937622, 0.4011673033237457, 0.37429165840148926, -0.46948426961898804, -0.936190664768219, -1.0205520391464233, -0.8640571236610413, -0.4193330407142639, -0.34448835253715515, -4.124610424041748, -3.189025640487671, -1.5359941720962524, -0.6932930946350098, -0.7811101675033569, -0.5759922862052917, 0.37400275468826294, -0.4834817051887512, -0.37729647755622864, -0.49043789505958557, 0.10487262904644012, -0.039048321545124054, -1.2886598110198975, -0.49174559116363525, 0.06968165189027786, 0.13323935866355896, -0.2505851089954376, 0.005125742871314287, 0.18010830879211426, 0.21406501531600952, -0.9584665894508362, -0.7277305126190186, 0.16012613475322723, 0.18554215133190155, 0.32520437240600586, 0.35149189829826355, 0.16333350539207458, -0.06821055710315704, -1.296568751335144, -1.37785804271698, -1.1466500759124756, 0.03394511714577675, 1.0219504833221436, 0.10026994347572327, 2.81296706199646, 1.9108121395111084, 0.6823952198028564, 1.2771985530853271, 0.27122944593429565, 4.195213317871094, 0.7168731689453125, 0.0016496042953804135, 1.3323209285736084, 1.4375067949295044, 1.4913971424102783, 1.2384988069534302, 1.08400297164917, 1.3802720308303833, 0.6991890072822571, 0.22822077572345734, 0.11677227914333344, 0.8910311460494995, 0.6221300363540649, 1.138989806175232, 0.28660231828689575, 1.171839952468872, 0.10849226266145706, -0.23197291791439056, 0.0009737455984577537, 0.8462570905685425, -0.12290724366903305, -0.7538785338401794, 0.4840732514858246, 0.2649516463279724, 0.5004700422286987, -0.7625958323478699, 0.826468288898468, 0.5355994701385498, 0.4371645450592041, 0.6062021255493164, -0.10328906774520874, 0.5074070692062378, -0.5644182562828064, 0.3633464276790619, -0.23727551102638245, -0.12718234956264496, 0.4074524939060211, 0.5452460050582886, -0.22704115509986877, -0.5738474726676941, -0.4735086262226105, 0.485590398311615, -0.2908652126789093, -0.23514603078365326, 0.01691947877407074, -0.7105526924133301, -0.9028140902519226, -0.2472354620695114, -0.27440768480300903, 0.4295786917209625, -2.904749870300293, -0.46219155192375183, -0.49081698060035706, -0.36337631940841675, 0.6392976641654968, 0.9233927726745605, 1.0280735492706299, 0.855082094669342, 0.4253135025501251, 0.32280850410461426, 4.114168643951416, 3.0987489223480225, 1.4795920848846436, 0.7543225884437561, 0.8552014827728271, 0.6286765933036804, -0.3699073791503906, 0.5038646459579468, 0.5203952789306641, 0.37468552589416504, -0.002101720543578267, 0.11309120059013367, 1.2686017751693726, 0.48761066794395447, -0.11136091500520706, -0.03246009349822998, 0.36666861176490784, 0.18458890914916992, -0.18100899457931519, -0.33038026094436646, -0.8576292395591736, -0.6034986972808838, 0.1782567799091339, 0.1853518784046173, 0.48616868257522583, 0.3124924302101135, 0.14944002032279968, -0.13483746349811554, -1.4192923307418823, -1.456716537475586, -1.2490123510360718, -0.06486590951681137, 1.0535950660705566, -0.09196782112121582, 2.8710718154907227, 1.8114943504333496, 0.6964011788368225, 1.1661278009414673, 0.48658767342567444, 4.5252580642700195, 0.8016472458839417, 0.04046686738729477, 1.4570856094360352, 1.538711667060852, 1.277990698814392, 1.1479015350341797, 1.1226155757904053, 1.395092248916626, 0.6385074853897095, 0.3767186999320984, 0.36560413241386414, 0.939081072807312, 0.6355020403862, 1.2757031917572021, 0.4591260254383087, 1.0899118185043335, 0.3337954878807068, -0.19800813496112823, 0.10867235064506531, 0.8212641477584839, -0.16458255052566528, -0.8197336792945862, 0.6165056228637695, 0.2516234815120697, 0.49862009286880493, -0.5641435980796814, 0.692038893699646, 0.5399461984634399, 0.26827704906463623, 0.4212935268878937, 0.046381376683712006, 0.665159285068512, -0.45296868681907654, 0.3815387785434723, -0.2345687597990036, 0.027097560465335846, 0.338366836309433, 0.5328542590141296, -0.050201691687107086, -0.45964911580085754, -0.5936470627784729, 0.5169273018836975, -0.3848832845687866, -0.33402392268180847, 0.17707763612270355, -0.7725269198417664, -0.826316773891449, -0.23771458864212036, -0.2643836736679077, 0.3564695119857788, -2.928142786026001, -0.5430784225463867, -0.37379151582717896, -0.24647824466228485, 0.1978469341993332, 0.7825720310211182, 1.0872291326522827, 0.8748255372047424, 0.545219898223877, 0.4693337678909302, 4.217126846313477, 3.1120924949645996, 1.5275987386703491, 0.7005982398986816, 0.8788042068481445, 0.6872969269752502, -0.5256029367446899, 0.713604211807251, 0.31036660075187683, 0.4176439940929413, 0.054314471781253815, 0.03916264325380325, 1.3210774660110474, 0.7062481045722961, -0.027917219325900078, -0.07610499113798141, 0.26682043075561523, 0.08701750636100769, 0.04109897091984749, -0.19383859634399414, -0.9060099124908447, -0.8061052560806274, 0.1346808820962906, 0.2311590611934662, 0.44427114725112915, 0.1269865334033966, 0.021368691697716713, -0.16141526401042938, -1.2312791347503662, -1.4421308040618896, -0.9955828189849854, -0.06613966077566147, 1.1256804466247559, -0.08193204551935196, 2.844921827316284, 1.9210702180862427, 0.8079874515533447, 1.3337292671203613, 0.3976365923881531, 4.219398021697998, 0.45786532759666443, -0.13562770187854767, 1.3916535377502441, 1.4762107133865356, 1.463157057762146, 1.2964633703231812, 0.9028158783912659, 1.2343894243240356, 0.7546287775039673, 0.3548973500728607, 0.15370763838291168, 1.0007694959640503, 0.6673437356948853, 1.1535650491714478, 0.1998511403799057, 1.0750494003295898, -0.10461225360631943, -0.19961868226528168, 0.07331909239292145, 0.7016324996948242, -0.15799236297607422, -0.7915172576904297, 0.44717732071876526, 0.3366883099079132, 0.5416970252990723, -0.7644333243370056, 0.9053620100021362, 0.44135719537734985, 0.23079749941825867, 0.5505024194717407, -0.1197170615196228, 0.9046310782432556, -0.4715484380722046, 0.35268810391426086, -0.3597562611103058, -0.05945149064064026, 0.4516793191432953, 0.5026513934135437, -0.04410887509584427, -0.4710855782032013, -0.650486171245575, 0.4444030523300171, -0.33818143606185913, -0.36381253600120544, -0.012776313349604607, -0.8477009534835815, -0.8672123551368713, -0.22888538241386414, -0.11814677715301514, 0.2764802873134613, -3.0342233180999756, -0.602359414100647, -0.37518393993377686, -0.2685604691505432, 0.5680629014968872, 0.7738755345344543, 1.1179381608963013, 0.8658738136291504, 0.4418547749519348, 0.4673839509487152, 4.072352409362793, 3.0460755825042725, 1.4626399278640747, 0.8022899031639099, 0.7519503831863403, 0.7506676316261292, -0.5152669548988342, 0.4847334027290344, 0.3387884497642517, 0.4153599739074707, 0.07847215235233307, 0.015526333823800087, 1.264989972114563, 0.5176454186439514, -0.07653401792049408, -0.06885093450546265, 0.2627805173397064, -0.006038305349647999, -0.19594085216522217, -0.2749088406562805, -0.15506508946418762, -0.07674091309309006, 0.20880095660686493, -0.13028904795646667, -0.06834574788808823, -0.09979509562253952, 0.03406215459108353, -0.0370730385184288, -0.1818811446428299, -0.15657664835453033, -0.11721772700548172, 0.11424239724874496, 0.24962656199932098, 0.35821688175201416, 1.4577369689941406, 1.91103196144104, 0.9968602657318115, 1.2154844999313354, -0.035733118653297424, 0.5517828464508057, 0.1226339116692543, -0.017128044739365578, 0.2432246059179306, 0.1492808759212494, 0.1701391339302063, 0.10536917299032211, 0.1825931817293167, 0.17476706206798553, -0.030415143817663193, -0.1356056183576584, 0.017266996204853058, 0.15089617669582367, 0.027581969276070595, 0.21431761980056763, 0.05308667942881584, 0.20477096736431122, 0.07292912900447845, -0.09120200574398041, -0.12410985678434372, 0.06861978024244308, -0.14101625978946686, -0.28445982933044434, -0.05799431353807449, 0.02841321937739849, 0.12406405806541443, -0.3109760582447052, 0.16056585311889648, 0.11679185181856155, -0.07927782088518143, -0.04777057096362114, 0.004410652909427881, -0.05662199482321739, -0.08247187733650208, 0.03897350654006004, -0.18002575635910034, -0.1469271332025528, 0.027537068352103233, -0.06884099543094635, -0.05984370410442352, -0.06936267763376236, -0.280610054731369, 0.011115786619484425, -0.11427098512649536, -0.07855330407619476, -0.1768922656774521, -0.30564671754837036, -0.2704107463359833, -0.042173322290182114, -0.0405212864279747, 0.09127126634120941, -0.7688004970550537, -0.26651617884635925, -0.09464344382286072, -0.03610975667834282, 0.3480038046836853, -0.05798826366662979, 0.11375173926353455, 0.12823611497879028, 0.1179373487830162, 0.01817651093006134, 0.8470374345779419, 0.6677495241165161, 0.2742365002632141, 0.11571747809648514, 0.08905573189258575, -0.059712912887334824, -0.07337439060211182, -0.014665705151855946, -0.08936870098114014, 0.04892120137810707, -0.16316162049770355, -0.13913169503211975, 0.3091582655906677, 0.07353337854146957, 0.0036234387662261724, -0.5578142404556274, -0.1319304257631302, -0.2759475111961365, 0.10144764930009842, 0.1881783902645111, -0.09759411960840225, -0.04952652379870415, 0.26593542098999023, 0.00643699336796999, 0.16204950213432312, 0.04702237993478775, 0.06161084026098251, -0.03125558793544769, -0.31633904576301575, -0.373982697725296, -2.102773904800415, -0.13163958489894867, 0.07909572869539261, 0.23009540140628815, 3.4120571613311768, 8.32243824005127, 4.10237979888916, 5.228827953338623, -2.7055113315582275, 0.5222992897033691, 0.2140372395515442, 0.1592486947774887, 0.25893259048461914, 0.19383087754249573, 0.2061028927564621, 0.21586407721042633, 0.09745234251022339, 0.2664583921432495, 0.03401170298457146, 0.13446660339832306, 0.09642453491687775, -0.04614802449941635, 0.17165958881378174, 0.17747050523757935, 0.08152814209461212, 0.268003910779953, 0.09988859295845032, -0.0798511952161789, -0.13566634058952332, 0.2791441082954407, -0.05417996644973755, -0.27447569370269775, 0.04101395979523659, 0.023564089089632034, 0.0016796530690044165, -0.03237523138523102, 0.12366566061973572, 0.1786729097366333, 0.1742279976606369, 0.08037525415420532, -0.12613973021507263, 0.01852203905582428, -0.08336832374334335, 0.08367909491062164, -0.14198455214500427, 0.041289862245321274, 0.10388877987861633, 0.03752424567937851, -0.10942618548870087, -0.009894691407680511, -0.21749547123908997, 0.14783616364002228, -0.3288171589374542, 0.0449431836605072, -0.09457507729530334, -0.5045395493507385, -0.16149289906024933, -0.010722105391323566, -0.0024131862446665764, 0.10652121156454086, -0.6093565225601196, 0.00548471650108695, -0.023121826350688934, -0.038937196135520935, 0.7127572894096375, -0.14538134634494781, 0.2567242980003357, 0.20106500387191772, 0.12912382185459137, 0.10088694840669632, 0.9673728942871094, 0.5949899554252625, 0.35058775544166565, 0.10116714239120483, 0.00028490315889939666, 0.20796535909175873, -0.15689198672771454, 0.2182890772819519, 0.20317070186138153, 0.08681519329547882, 0.0504450686275959, -0.0007735955878160894, 0.2315407693386078, 0.15969708561897278, 0.09008954465389252, -0.05359499529004097, 0.0116139966994524, 0.025718441233038902, -0.1322256624698639, 0.026017479598522186, -0.9817870259284973, -0.6066368818283081, 0.16600172221660614, 0.16566255688667297, 0.3446674942970276, 0.30290859937667847, 0.1603359878063202, -0.02179131843149662, -1.355717658996582, -1.3758225440979004, -1.221917986869812, -0.16333216428756714, 0.9108412861824036, -0.08025842905044556, 2.6888298988342285, 2.0144193172454834, 0.7878190279006958, 1.1553541421890259, 0.4640013873577118, 4.694734573364258, 0.8231510519981384, 0.08003854751586914, 1.3627078533172607, 1.5198570489883423, 1.4475654363632202, 1.186111569404602, 0.8843483328819275, 1.2401591539382935, 0.6395353674888611, 0.38456523418426514, 0.198313906788826, 1.0574777126312256, 0.6501401662826538, 1.2411178350448608, 0.5506219863891602, 1.2045819759368896, 0.29643648862838745, -0.08840465545654297, 0.09486310184001923, 0.8406497240066528, -0.22680316865444183, -0.799617350101471, 0.5306044816970825, 0.29936936497688293, 0.5236285328865051, -0.5907637476921082, 0.714980959892273, 0.6494489908218384, 0.23771736025810242, 0.4380604326725006, 0.08380818367004395, 0.6636692881584167, -0.40345141291618347, 0.5661117434501648, -0.24809308350086212, 0.004664320964366198, 0.3084019124507904, 0.5841951370239258, -0.22073587775230408, -0.48312321305274963, -0.5276358127593994, 0.5587068200111389, -0.28312763571739197, -0.2465420961380005, -0.0572635792195797, -0.820408046245575, -0.865695059299469, -0.26787200570106506, -0.22597427666187286, 0.3101177215576172, -2.945730447769165, -0.5323840975761414, -0.3293997049331665, -0.343095064163208, 0.24950294196605682, 0.7813385725021362, 0.9707733988761902, 0.9425172209739685, 0.4118528366088867, 0.31547462940216064, 4.284393787384033, 3.0229828357696533, 1.379088282585144, 0.8345760703086853, 0.96744704246521, 0.7667807936668396, -0.4072304368019104, 0.531790554523468, 0.4480220377445221, 0.6070080399513245, -0.13287457823753357, 0.001303400844335556, 1.3107070922851562, 0.6144444346427917, 0.014874671585857868, -0.0792723298072815, 0.1337544173002243, 0.09746420383453369, 0.0009585428633727133, -0.26542824506759644, 2.372265338897705, 0.47514158487319946, -0.3515172600746155, 0.6451715230941772, 0.03153396397829056, 1.7297091484069824, -1.5963265895843506, -0.4168339967727661, -0.8385906219482422, -0.44107484817504883, -0.5089825391769409, -0.6203166246414185]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (1.54, 2.5)}}, 'et3_eta3': {'discriminator': {'threshold': -0.31500081177800893, 'nodes': [100, 5, 1], 'bias': [-0.0026822981890290976, -0.07377532869577408, -0.007974994368851185, -0.16853055357933044, -0.06441225856542587, 0.13564197719097137], 'weights': [1.6453747749328613, 2.6088600158691406, -1.3678135871887207, -1.2877781391143799, 0.0757671445608139, -1.313241958618164, 0.3504394292831421, 1.5601763725280762, 1.8411474227905273, 1.8598456382751465, 0.6482876539230347, -2.511263608932495, -0.2952120006084442, -0.7789666056632996, -2.5676252841949463, -2.1249446868896484, -2.0311155319213867, -4.27354097366333, -4.34259033203125, -6.79109001159668, 0.26440444588661194, -1.3378560543060303, -1.8120442628860474, -4.250185012817383, -4.795808792114258, -4.172086715698242, -2.1067121028900146, -1.054761290550232, -1.254315972328186, -2.626077651977539, -0.08611088991165161, -4.771571159362793, -0.9363676309585571, -2.3707633018493652, -1.7289048433303833, -1.649170994758606, -1.8055485486984253, -2.6921520233154297, -1.6702463626861572, -3.475526809692383, -0.8764222860336304, -2.4371860027313232, -1.4124659299850464, -1.1228387355804443, -0.0710236057639122, -1.706192135810852, -1.7178205251693726, -0.4437747001647949, 0.9503127336502075, -2.0104548931121826, -0.48377037048339844, 0.6771113872528076, 1.2609716653823853, -0.9713212847709656, -1.2625234127044678, 0.11309906840324402, 1.554800033569336, -3.551863431930542, 1.255460262298584, -2.244666337966919, 0.06816621869802475, 0.8891024589538574, -0.31957268714904785, 0.6217986941337585, -0.755652129650116, -1.3269896507263184, 0.393809050321579, -0.6914824843406677, 1.1989281177520752, 2.0677664279937744, -0.3061457872390747, -0.8172145485877991, 0.5543983578681946, 0.26117756962776184, -1.7833328247070312, -1.9560140371322632, -2.247663736343384, -1.8420708179473877, -1.7461508512496948, -0.7262256741523743, -1.5775303840637207, -3.9379920959472656, -6.896449565887451, -1.7874044179916382, -2.4555823802948, -1.904052495956421, 0.6451247334480286, -1.394220232963562, -0.6604307293891907, -1.612280249595642, -0.2587394118309021, -0.3036463260650635, -4.475130558013916, -1.869966745376587, -0.40121808648109436, -1.164275050163269, 0.9186030030250549, -0.16907858848571777, 0.43050912022590637, 3.2057249546051025, 1.6611487865447998, 1.9638066291809082, -1.3152694702148438, -1.266971468925476, -0.012450817972421646, -1.237388253211975, 0.5422267913818359, 0.033369556069374084, 1.9038782119750977, 1.9781697988510132, 0.5547154545783997, -2.5483882427215576, -0.28108328580856323, -0.7324627041816711, -2.6389048099517822, -1.9112340211868286, -2.124799966812134, -4.432255744934082, -4.41224479675293, -6.802875518798828, 0.4018074870109558, -1.1553627252578735, -1.9742958545684814, -4.18024206161499, -4.953296661376953, -4.3323283195495605, -1.9895886182785034, -0.9182958006858826, -1.2809019088745117, -4.090524196624756, 0.25694540143013, -4.791000843048096, -0.8209642171859741, -2.378762722015381, -1.9224141836166382, -1.8710798025131226, -1.7290903329849243, -1.6767504215240479, -1.8385858535766602, -3.344933032989502, -0.8140627145767212, -2.392922878265381, -1.3276156187057495, -1.1542680263519287, 0.02396303229033947, -2.0387930870056152, -1.7846342325210571, -0.4471873342990875, 0.8051605224609375, -1.8978304862976074, -0.4933512210845947, 0.6779794692993164, -1.2109791040420532, -0.8121653199195862, -1.2003304958343506, 0.01022394746541977, 1.5496234893798828, -3.6216423511505127, 1.2804350852966309, -2.2850427627563477, 0.1395234912633896, 0.8535337448120117, -0.37076684832572937, 0.5594646334648132, -0.5713777542114258, -1.3768380880355835, 0.35866066813468933, -0.6591535806655884, 1.0931122303009033, 2.1704494953155518, -0.15126368403434753, -0.8692861199378967, 0.4619787037372589, 0.4645921587944031, -0.45322543382644653, -1.9674001932144165, -2.243455410003662, -1.7346749305725098, -1.7518469095230103, -0.8585518002510071, -1.6066029071807861, -3.9446539878845215, -7.036523342132568, -1.761863112449646, -2.5527281761169434, -1.732835054397583, -1.3442597389221191, -1.5046111345291138, -0.5676074624061584, -1.465461015701294, -0.1604148894548416, -0.41759225726127625, -4.571678638458252, -1.8314518928527832, -0.2993718683719635, -1.3043948411941528, 0.8986514210700989, -0.35147565603256226, 0.31468939781188965, 3.329052448272705, 1.7038644552230835, 2.0513393878936768, -1.241438388824463, -1.2287734746932983, -0.014411812648177147, -1.1697802543640137, 0.3433302044868469, -0.11848220974206924, 1.7212376594543457, 1.8913778066635132, 0.624262809753418, -2.4948599338531494, -1.1592159271240234, -0.6414404511451721, -2.6828062534332275, -1.9724620580673218, -2.117993116378784, -4.335535049438477, -4.3711628913879395, -6.860287666320801, 0.3457065224647522, -1.2056001424789429, -1.8813178539276123, -4.197864055633545, -4.894214630126953, -4.131383895874023, -2.022266387939453, -1.0494474172592163, -1.1988086700439453, -2.6329545974731445, 0.05129804089665413, -4.660510063171387, -0.8967994451522827, -2.258549928665161, -1.802286982536316, -1.6968477964401245, -1.7932871580123901, -2.5292296409606934, -1.7534565925598145, -3.3403868675231934, -0.9253813028335571, -2.3010048866271973, -1.2638598680496216, -1.2387075424194336, -0.040734414011240005, -2.0132577419281006, -1.6782728433609009, -0.2569505572319031, 0.9217413663864136, -2.002413749694824, -0.6130432486534119, 0.48643115162849426, -1.1137219667434692, -0.8444671034812927, -1.1574695110321045, -0.08551698923110962, 1.4662344455718994, -3.6057822704315186, 1.3055717945098877, -2.2806570529937744, 0.004436437040567398, 0.9250521659851074, -0.4877007305622101, 0.6005710959434509, -0.6104230284690857, -1.3253049850463867, 0.321970671415329, -0.7774056792259216, 1.120121717453003, 2.1561338901519775, -0.2598663568496704, -0.7015664577484131, 0.5452624559402466, 0.4589969515800476, -1.7789264917373657, -1.9475234746932983, -2.2627665996551514, -1.8027403354644775, -1.793903112411499, -0.7669637799263, -1.5272283554077148, -4.112431526184082, -6.88445520401001, -1.8373111486434937, -2.5002312660217285, -1.789937973022461, 0.6400154232978821, -1.5303689241409302, -0.6031690239906311, -1.5702120065689087, -0.187468484044075, -0.3362116813659668, -4.640526294708252, -1.7236292362213135, -0.42891374230384827, -1.1815162897109985, 1.0636907815933228, -0.2656785249710083, 0.32441914081573486, 3.2690725326538086, -34.40025329589844, 0.41740137338638306, -1.3427472114562988, -1.8935437202453613, -0.07210046797990799, -1.257354736328125, 0.42105773091316223, 1.9622278213500977, 1.8373973369598389, 1.4988397359848022, 0.5791566371917725, -6.353612899780273, -0.27011504769325256, -0.9749468564987183, -2.828953504562378, -2.065742254257202, -2.1755571365356445, -4.3603644371032715, -4.385867595672607, -6.798715591430664, -0.9942068457603455, -1.1383098363876343, -1.8002347946166992, -4.139078140258789, -5.653036594390869, -4.271299362182617, -2.0500035285949707, -1.0299122333526611, -1.319596529006958, -4.078281879425049, -0.09901869297027588, -4.635015964508057, -0.9073197841644287, -2.270519733428955, -1.9242812395095825, -1.7391963005065918, -1.891558289527893, -2.5714898109436035, -1.6749062538146973, -3.3198678493499756, -0.7976337671279907, -2.5387473106384277, -1.2916070222854614, -1.0383052825927734, -0.1292460858821869, -1.9439153671264648, -1.7040313482284546, -0.37775999307632446, 0.8713788390159607, -1.7951557636260986, -0.41710808873176575, 0.6332650780677795, 1.430885910987854, -0.8980161547660828, -1.199503779411316, -0.12392499297857285, 1.5348355770111084, -3.6775381565093994, 1.289231538772583, -2.3353352546691895, 0.09248685836791992, 0.7473977208137512, -0.5191354155540466, 0.7092427015304565, -0.551459550857544, -1.4764515161514282, 0.4311779737472534, -0.818794310092926, 1.1750246286392212, 1.8094141483306885, -0.28274527192115784, -0.7673657536506653, 0.4760637581348419, 0.6220453977584839, -0.4894423484802246, -1.8552812337875366, -2.0978188514709473, -1.9490512609481812, -1.575343132019043, -0.8947160243988037, -1.7066760063171387, -3.9449539184570312, -6.8630571365356445, -1.743622899055481, -2.6345927715301514, -1.8126083612442017, 0.7065228223800659, -2.7592875957489014, -0.8106955289840698, -1.7465633153915405, -1.0619277954101562, -0.34462061524391174, -4.518394470214844, -1.8728910684585571, -0.3283807039260864, -1.2613738775253296, 1.3888221979141235, -0.3492630422115326, 0.45158952474594116, 3.269859552383423, 1.7088007926940918, 2.451556444168091, -1.3519201278686523, -1.9614174365997314, -0.008374339900910854, -1.1711941957473755, 0.39905989170074463, -0.06875412911176682, 1.673877239227295, 1.9118486642837524, 0.5733628273010254, -2.568279266357422, -1.2159640789031982, -0.6716782450675964, -2.5906946659088135, -2.105297327041626, -2.012949228286743, -4.33719539642334, -4.386645317077637, -6.748504161834717, 0.44734546542167664, 0.2650229036808014, -1.7927244901657104, -4.137123107910156, -4.86408805847168, -4.295288562774658, -3.994318723678589, -1.0194958448410034, -1.2288086414337158, -3.8779234886169434, 0.20965246856212616, -4.6872782707214355, -0.7442327737808228, -2.458414316177368, -2.1241183280944824, -1.7859731912612915, -1.7468398809432983, -1.7682089805603027, -1.6021887063980103, -3.3703441619873047, -0.9675437211990356, -2.391298294067383, -1.3692113161087036, -1.0898878574371338, -0.16703927516937256, -2.0278801918029785, -1.6609057188034058, -0.2729266583919525, 0.9068354368209839, -2.001925468444824, -0.37908220291137695, 0.5717799663543701, -1.30225670337677, -0.815249502658844, -1.2591121196746826, 0.0038052527233958244, 1.5792746543884277, -3.538403034210205, 1.1771156787872314, -2.1983330249786377, 0.18195728957653046, 0.9563326835632324, -0.4344067871570587, 0.6829262971878052, -0.5312673449516296, -1.3887757062911987, 0.31381747126579285, -0.653171181678772, 0.9940149784088135, 2.108583688735962, -0.16697187721729279, -0.8684530854225159, 0.6122769117355347, 0.4479224681854248, -0.39230504631996155, -2.239649772644043, -2.040733575820923, -1.8034400939941406, -1.5750021934509277, -0.8075667023658752, -1.5260570049285889, -3.907365322113037, -7.087438583374023, -1.7769445180892944, -2.514227867126465, -2.75828218460083, -1.3614614009857178, -1.432160496711731, -0.5940631031990051, -1.5489791631698608, -0.2553326189517975, -0.3682858943939209, -4.589400291442871, -1.7366037368774414, -0.40904679894447327, -1.2989604473114014, 0.9858608841896057, -0.5643770694732666, 0.19531701505184174, 3.3128654956817627, 1.0682185888290405, 0.4756389856338501, 3.894681453704834, 1.0250746011734009, 1.9188525676727295]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (40, 50), 'etaBin': (1.54, 2.5)}}, 'et0_eta2': {'discriminator': {'threshold': -0.075000885128974903, 'nodes': [100, 5, 1], 'bias': [-0.04407104104757309, -0.0810713842511177, 0.05680200457572937, -0.031822316348552704, 0.014685048721730709, -0.271891713142395], 'weights': [-1.0825904607772827, 0.08574618399143219, 0.9685280323028564, 0.25779464840888977, 1.4009474515914917, -0.43996185064315796, -0.5787885785102844, -0.052533622831106186, 2.152944564819336, -4.60988712310791, -4.571747303009033, -3.3987250328063965, 0.8187448978424072, 0.24409186840057373, -1.5000301599502563, -2.578064441680908, 6.256258964538574, -0.26530393958091736, -0.3800651431083679, 1.0240007638931274, 1.2560677528381348, 0.32237425446510315, 0.9248688817024231, 0.5689820051193237, 4.2176594734191895, 0.4145246148109436, 0.008375607430934906, 1.1467556953430176, 2.8383400440216064, 0.7960429787635803, 1.509331226348877, 0.3867398202419281, 0.08516347408294678, 1.1665160655975342, 2.0155913829803467, 0.7269957661628723, 2.8648746013641357, 0.3785054087638855, 1.0710755586624146, 0.44012337923049927, -7.029890060424805, 2.7329320907592773, -0.4517747163772583, 2.704028606414795, 1.7207869291305542, 1.76518976688385, 0.31695756316185, 0.4686599671840668, 1.864015817642212, -0.2112739086151123, 1.531958818435669, -9.805472373962402, -7.812379360198975, 0.012495559640228748, 0.5575580596923828, 1.4924118518829346, 1.44475257396698, 0.7656540274620056, 0.21027854084968567, 0.021225228905677795, 0.27754437923431396, 0.0004881627392023802, 1.467686653137207, -0.016614526510238647, 0.43773579597473145, 1.5841753482818604, 0.9382981061935425, -0.1464185118675232, -0.8255245089530945, 1.0672740936279297, 0.8217244744300842, 0.5950704216957092, -0.27170273661613464, -0.296937495470047, 2.9902400970458984, 0.479889452457428, 0.01635497808456421, 0.4594772756099701, 1.3170560598373413, 1.3166279792785645, -4.464760780334473, -1.6882765293121338, -0.8037212491035461, 1.1366719007492065, 0.7525591850280762, -7.0844807624816895, 0.3426554203033447, 1.106463074684143, -1.1505635976791382, 0.41234174370765686, -0.11217062175273895, 0.38337114453315735, 1.154335379600525, -1.9204294681549072, 0.7371239066123962, -0.3465268313884735, 0.08321468532085419, -0.030556054785847664, -0.031579989939928055, -0.35611554980278015, -0.9876312613487244, 0.10274811089038849, 1.0551854372024536, 0.37982040643692017, 1.4573813676834106, -0.6407098770141602, -0.5639141201972961, 0.10327505320310593, 2.2927420139312744, -4.5257673263549805, -4.426496982574463, -3.3717570304870605, 0.8411870002746582, 0.25315651297569275, -1.698035478591919, -3.124276876449585, 6.366399765014648, -0.14681683480739594, -0.33744296431541443, 0.9182819128036499, 1.2642593383789062, 0.23908913135528564, 1.0396828651428223, 0.4190557599067688, 4.11634635925293, 0.5109344124794006, -0.053779978305101395, 1.3481312990188599, 2.7488715648651123, 0.9549916386604309, 1.531281590461731, 0.39701613783836365, 0.01831832528114319, 1.2805454730987549, 1.9067471027374268, 0.7213699221611023, 3.0208144187927246, 0.5273315906524658, 0.984556257724762, 0.49320197105407715, -7.039739608764648, 2.548867702484131, -0.3765135407447815, 2.599059581756592, 1.788646936416626, 1.898934006690979, 0.3848823606967926, 0.4087528586387634, 1.8734512329101562, -0.0959416925907135, 1.609128713607788, -9.783060073852539, -7.7851176261901855, 0.19969406723976135, 0.4252587854862213, 1.6623327732086182, 1.4855653047561646, 0.814243495464325, 0.29807761311531067, -0.022644948214292526, 0.18716299533843994, -0.09185656160116196, 1.3251649141311646, -0.1139320433139801, 0.46420544385910034, 1.4334721565246582, 1.0781512260437012, 0.031342972069978714, -0.8239216208457947, 1.1147432327270508, 0.8097687363624573, 0.5916090607643127, -0.1644834578037262, -0.2390330582857132, 2.99937105178833, 0.2348819226026535, -0.040052302181720734, 0.5412852764129639, 1.1846431493759155, 1.2704479694366455, -4.510382652282715, -1.5035237073898315, -0.822405219078064, 1.1230968236923218, 0.8845148682594299, -6.992668151855469, 0.49421584606170654, 1.0364357233047485, -1.2529572248458862, 0.4496068060398102, 0.01672779582440853, 0.25050511956214905, 1.1040409803390503, -1.8346953392028809, 0.7438300848007202, -0.3751390874385834, 0.021725764498114586, -0.12088722735643387, -0.12522420287132263, -0.42078670859336853, 0.40593743324279785, -0.17704273760318756, -2.5800063610076904, -0.6200281977653503, -0.5745964646339417, -0.1709720939397812, 0.1915697306394577, -0.10357870161533356, -0.31075340509414673, 3.0802440643310547, 7.903794765472412, 1.383229374885559, 1.0003013610839844, 0.42152512073516846, 0.5634909272193909, 0.962303638458252, -2.6268694400787354, 0.015338052064180374, 0.11794253438711166, -0.187285378575325, -3.4550161361694336, -0.3742278218269348, -0.3502424955368042, -0.4000864624977112, -1.87181556224823, -1.419228196144104, -0.24961507320404053, -3.085707664489746, -1.0063339471817017, -1.8244991302490234, -3.7415499687194824, -1.082822322845459, -0.5979400873184204, -3.151231288909912, -4.487706184387207, -1.944701075553894, -1.6603573560714722, -1.8000693321228027, -0.17634537816047668, -1.2092612981796265, -0.9449935555458069, -1.0295277833938599, -1.5545796155929565, -1.2223538160324097, -0.6605437994003296, -0.7603915333747864, -1.1740238666534424, -0.7833941578865051, -0.6020617485046387, 0.07888055592775345, -0.8712419271469116, 2.9096338748931885, 7.952542781829834, 0.0743514746427536, -0.33217012882232666, -0.45973896980285645, -0.5926423668861389, -0.25713425874710083, -1.5991075038909912, -0.2073005586862564, -1.2610282897949219, -0.42198652029037476, -0.41359448432922363, -0.35890793800354004, -1.1611835956573486, -0.2069760262966156, -0.2726447284221649, -0.0705200657248497, -0.16371753811836243, -0.17558065056800842, -0.22931239008903503, -0.10156021267175674, -0.09828787297010422, 0.15635733306407928, -6.191123008728027, -1.6424697637557983, -2.1052184104919434, -1.5590429306030273, -0.4421420991420746, -0.3700082004070282, 1.9565821886062622, 0.33755236864089966, -0.95201176404953, -0.17235925793647766, -0.43996310234069824, 3.0674614906311035, -1.3589973449707031, -0.6367796063423157, 0.6908778548240662, -1.4051241874694824, 0.1204921156167984, 1.5098772048950195, -3.6376779079437256, 0.16056931018829346, -0.0936564952135086, 0.4496389627456665, -0.02629782259464264, -0.08783216029405594, -0.019794583320617676, 0.001618462847545743, 0.9761450290679932, -0.055561479181051254, -1.1416538953781128, -0.3853769302368164, -1.513965129852295, 0.5668556690216064, 0.302071750164032, -0.061637625098228455, -2.1873176097869873, 4.628849506378174, 4.638221740722656, 3.6216931343078613, 1.3733007907867432, -0.2658552825450897, 1.5429216623306274, 2.6711924076080322, -6.0058112144470215, 0.3061431646347046, 0.27969062328338623, -1.1286944150924683, -1.2777042388916016, -0.23044545948505402, -0.8125728368759155, -0.4178599715232849, -4.178099632263184, -0.5654889345169067, -0.13899219036102295, -1.275926947593689, -2.6826772689819336, -0.9007846713066101, -1.6263715028762817, -0.3489578664302826, -0.030371999368071556, -1.2079277038574219, -1.8554635047912598, -0.6779713034629822, -4.139376163482666, -0.5931854248046875, -0.8874623775482178, -0.49628978967666626, 1.0718165636062622, -2.5306694507598877, 0.3706080913543701, -2.745999336242676, -1.790184497833252, -1.7904106378555298, -0.5145547389984131, -0.30139032006263733, -3.0778181552886963, 0.1586395800113678, -1.5348047018051147, 5.99743127822876, 7.641915798187256, -0.22821012139320374, -0.4714745283126831, -1.6166611909866333, -1.562677264213562, -0.8104075789451599, -0.2106080949306488, 0.006476747803390026, -0.431707501411438, -0.005110820755362511, -1.3908367156982422, -0.033923424780368805, -0.3585066795349121, -1.5972576141357422, -1.1322345733642578, 0.07311927527189255, -0.4280344843864441, -1.0599029064178467, -0.8081928491592407, -0.5103299021720886, 0.23274576663970947, 0.20392929017543793, -3.0005948543548584, -0.6365391612052917, 0.0015095829730853438, -0.4286399781703949, -1.284263014793396, -1.330533504486084, 4.446524143218994, 1.1311116218566895, 0.09046709537506104, -1.0766178369522095, -0.8885828852653503, 7.081045627593994, -0.3920170068740845, -1.1443006992340088, 1.102772831916809, -0.472776859998703, 0.30169478058815, -0.17559286952018738, -1.0941393375396729, 1.7821416854858398, -0.9212589263916016, 0.4484897553920746, 0.01548506785184145, -0.09181047230958939, 0.1414693146944046, 0.4962255358695984, -1.0334877967834473, 0.07781491428613663, 1.1460769176483154, 0.30784404277801514, 1.320994257926941, -0.49919629096984863, -0.2512543797492981, 0.10831945389509201, 2.0478789806365967, -4.505317687988281, -4.594081401824951, -3.527892589569092, 0.8108193874359131, 0.15681114792823792, -1.598739504814148, -2.5955898761749268, 6.39864444732666, -0.3007097840309143, -0.27232977747917175, 0.9647157192230225, 1.4248409271240234, 0.2729596197605133, 0.8721199631690979, 0.34965887665748596, 4.077643394470215, 0.5557665824890137, 0.053583815693855286, 1.2528311014175415, 2.727527379989624, 0.9207438230514526, 1.5947096347808838, 0.33100053668022156, 0.06567537784576416, 1.1861624717712402, 2.0139987468719482, 0.7745558023452759, 3.9312446117401123, 0.5401031970977783, 1.036202073097229, 0.4027394652366638, -7.002265930175781, 2.680999994277954, -0.3758254051208496, 2.7289979457855225, 1.5763626098632812, 1.7348488569259644, 0.31913086771965027, 0.47689637541770935, 1.929862380027771, -0.09270866215229034, 1.5254355669021606, -9.940582275390625, -7.787464618682861, 0.024363325908780098, 0.4464062750339508, 1.6232454776763916, 1.6031330823898315, 0.9539582133293152, 0.201005756855011, -0.1744878888130188, 0.3411921262741089, -0.04162665456533432, 1.4588932991027832, -0.015815282240509987, 0.2954772412776947, 1.569823980331421, 0.9250545501708984, -0.0902547836303711, 0.3614014685153961, 1.2554881572723389, 0.8420773148536682, 0.5306254029273987, -0.1407562494277954, -0.3198264241218567, 2.945493698120117, 0.7684943079948425, 0.080005943775177, 0.4330621659755707, 1.3119004964828491, 1.314406394958496, -4.630164623260498, -1.5067929029464722, -0.9357821345329285, 1.0014532804489136, 0.7030044794082642, -7.084412097930908, 0.33034592866897583, 1.2532033920288086, -1.2166136503219604, 0.3960300385951996, -0.3553300201892853, 0.22526171803474426, 0.9761221408843994, -1.7732036113739014, 0.9098100066184998, -0.3755049705505371, -0.028497174382209778, -0.1154387891292572, -0.09133943170309067, -0.32184547185897827, -0.5127127170562744, -0.7881003022193909, 0.5929464101791382, 0.7647581100463867, -0.4633060097694397]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (1.37, 1.54)}}, 'et4_eta3': {'discriminator': {'threshold': -0.36000080332159995, 'nodes': [100, 5, 1], 'bias': [0.06462695449590683, -0.12676197290420532, -0.05327867344021797, -0.12458591908216476, -0.02929820492863655, 0.4395279586315155], 'weights': [-1.4867814779281616, -1.4737091064453125, 0.844450056552887, 1.5732043981552124, 0.6019328236579895, -0.4373997449874878, -0.5268439650535583, 1.2225843667984009, -1.5791033506393433, -1.3404196500778198, -0.37639474868774414, 2.592952251434326, 0.6489744186401367, -0.5390294194221497, 2.801182508468628, 4.186042308807373, 1.5369982719421387, 3.385530471801758, 4.301487922668457, 3.444990396499634, 3.128727436065674, 1.4267210960388184, 1.3380502462387085, 3.8352210521698, 4.03884220123291, 3.417123556137085, 1.5704231262207031, 4.7366719245910645, 1.7156262397766113, -0.337830126285553, -0.2463470995426178, 3.733076333999634, 2.0827527046203613, 3.4395291805267334, 1.6618478298187256, 2.271916151046753, 1.433703064918518, -0.7758818864822388, 1.5254719257354736, 3.477954387664795, -1.267235517501831, 1.9360064268112183, 0.8179213404655457, 3.515212059020996, 0.20326341688632965, 1.2137004137039185, 1.4239284992218018, 1.738392949104309, 0.07549072057008743, 1.7007884979248047, 0.5368281602859497, -0.2083173394203186, -0.2131136655807495, -4.36929988861084, -1.907471776008606, -0.1919580101966858, -2.4573922157287598, 1.0268385410308838, -1.1203089952468872, 7.070017337799072, -0.13881118595600128, 0.7215918302536011, -1.300080418586731, 0.9581174254417419, -1.2448112964630127, 1.5979256629943848, -1.021296501159668, 1.8850929737091064, 1.729594349861145, 7.351315975189209, -2.1720261573791504, 4.964243412017822, -0.4282679855823517, -0.4487836956977844, 1.6107763051986694, 1.6064417362213135, 1.8531638383865356, 1.4907758235931396, 1.025588870048523, 1.2084702253341675, 1.0822110176086426, 1.6485376358032227, 6.506876468658447, 4.879627227783203, 2.8146398067474365, 1.2076873779296875, 1.7120426893234253, 1.5159088373184204, 0.18634159862995148, 1.2148019075393677, 0.336647629737854, 0.3901866376399994, 4.704002380371094, 2.0778651237487793, 0.29331091046333313, 1.7218950986862183, 0.1951432079076767, -0.3266952335834503, 0.2843090891838074, 1.1680628061294556, 1.6010924577713013, 1.6172492504119873, -0.8451579213142395, -1.6616193056106567, -0.5480712652206421, 0.4967135190963745, 0.5839541554450989, -1.2435401678085327, 1.639122486114502, 1.4536617994308472, 0.8924252986907959, -2.502986431121826, -0.6584173440933228, 0.5919974446296692, -2.688136339187622, -4.183643341064453, -1.7220592498779297, -3.4389805793762207, -4.238657474517822, -3.503734827041626, -3.1268930435180664, -1.5796105861663818, -1.5052632093429565, -3.872730016708374, -3.983173370361328, -3.5366408824920654, -1.5897138118743896, -4.627622604370117, -1.7220213413238525, 0.19923824071884155, 0.262792706489563, -3.628666639328003, -2.0813517570495605, -3.420935869216919, -1.6493909358978271, -2.213114023208618, -1.3593264818191528, 0.6032209396362305, -1.4911677837371826, -2.0726802349090576, 1.450044870376587, -1.7461060285568237, -0.8393234610557556, -3.34538197517395, -0.20262302458286285, -1.1185157299041748, -1.4939242601394653, -1.680585265159607, -0.27598610520362854, -1.7114967107772827, -0.5413006544113159, 0.006118231453001499, 0.053060561418533325, 4.440168380737305, 1.9099938869476318, 0.0841115191578865, 2.4119558334350586, -1.0400716066360474, 1.1249712705612183, -7.125352382659912, 0.2292049080133438, -0.704696774482727, 1.3456120491027832, -1.1085519790649414, 1.2788655757904053, -1.536393642425537, 1.1718889474868774, -2.0209789276123047, -1.598495602607727, -7.162876605987549, 2.1705310344696045, -5.220207214355469, 0.5644900798797607, 0.4294244647026062, -1.6114963293075562, -1.7119221687316895, -1.7808786630630493, -1.5579559803009033, -0.8310328722000122, -1.0944525003433228, 0.19997258484363556, -1.7006828784942627, -6.591492652893066, -4.871800422668457, -2.7927043437957764, -0.9788928031921387, -1.8071975708007812, -1.5429456233978271, -0.24970172345638275, -1.3173140287399292, -0.4225567877292633, -0.3986871838569641, -4.786027908325195, -2.1147027015686035, -0.9594298601150513, -1.7684777975082397, -0.412676066160202, 0.31834909319877625, -0.22456033527851105, -1.012269377708435, -133.3319854736328, 0.7500282526016235, -1.04212486743927, -5.753209590911865, -1.772415280342102, -0.5085403919219971, 0.9793993830680847, 4.756992340087891, 1.5842928886413574, 2.8646275997161865, 0.9690821766853333, -3.982877731323242, -0.6454582810401917, 1.8154902458190918, -2.6285903453826904, -3.281752824783325, -1.7247415781021118, 9.381003379821777, -4.36454439163208, 0.47222229838371277, -3.27756404876709, -1.0361080169677734, -1.6282318830490112, -2.890007495880127, -4.3262939453125, 5.245368480682373, 30.798059463500977, -4.717989921569824, -1.8360204696655273, 18.620315551757812, 1.6453514099121094, -3.6965060234069824, -2.125960350036621, -3.574266195297241, -1.5278217792510986, 8.578984260559082, -1.4894806146621704, 0.5837669372558594, -1.5354734659194946, -2.2052173614501953, 1.2544898986816406, -1.7368152141571045, 3.2383806705474854, -3.3198013305664062, -0.20314103364944458, 36.236717224121094, -1.4842288494110107, -1.7330299615859985, -0.2848369777202606, -1.5803918838500977, -0.8730565309524536, 1.9593693017959595, -0.5476393699645996, 4.369739532470703, 1.837645411491394, 0.12737376987934113, 2.434699058532715, -1.0143126249313354, 1.073431134223938, -7.206415176391602, 0.026276158168911934, -0.7369642853736877, 1.454508662223816, -0.9562530517578125, 1.3384836912155151, -1.5626505613327026, 1.1611621379852295, -1.8394544124603271, -1.628089427947998, -7.215399742126465, -0.8328399658203125, -5.198910236358643, 0.5378676652908325, 0.299236923456192, -1.571925163269043, -1.752135157585144, -1.939960241317749, -1.6952630281448364, -1.1344391107559204, -1.1983847618103027, 15.013886451721191, -1.5810015201568604, -2.1311440467834473, 2.483027696609497, -2.818328619003296, -1.1147847175598145, -1.5673705339431763, -1.5386836528778076, -61.90903091430664, -7.341132640838623, -0.6849504113197327, -2.770543098449707, 14.490680694580078, -2.344757080078125, -0.32797905802726746, -1.8134076595306396, -9.469379425048828, 0.4396365284919739, -0.5708122849464417, 1175.425537109375, -0.6392597556114197, 5.817916393280029, -0.7583734393119812, -1.6797935962677002, -0.6084758043289185, 0.49208471179008484, 0.37925252318382263, -1.281166434288025, 1.4826879501342773, 1.3099654912948608, 0.9481105804443359, -2.466290235519409, -0.25591522455215454, 0.5295944213867188, -2.845876693725586, -4.244900703430176, -1.8413976430892944, -3.353544235229492, -4.254318714141846, -3.648327350616455, -3.2965798377990723, -1.60770845413208, -1.539547324180603, -3.897989273071289, -4.200295925140381, -3.5161688327789307, -1.5999046564102173, -4.629602432250977, -1.8001389503479004, 0.3400377631187439, 0.20770108699798584, -3.6942813396453857, -1.8704400062561035, -3.6249916553497314, -1.4966779947280884, -2.187971591949463, -1.331571102142334, 0.7840662598609924, -1.494399905204773, -3.4661026000976562, 1.2672978639602661, -1.9300782680511475, -0.6854815483093262, -3.309452533721924, -0.21256285905838013, -1.1317399740219116, -1.5249943733215332, -1.6415632963180542, -0.1943846344947815, -1.506707787513733, -0.4104507267475128, 0.2074458748102188, 0.22047878801822662, 4.341631889343262, 1.8496493101119995, 0.27076441049575806, 2.3170735836029053, -1.11367928981781, 1.0733110904693604, -7.143605709075928, 0.05996796116232872, -0.49723702669143677, 1.3839823007583618, -1.0266321897506714, 0.6632851362228394, -1.5816642045974731, 1.042488932609558, -1.8211493492126465, -1.6957498788833618, -7.30482816696167, 2.2417476177215576, -5.263777732849121, 0.4748886227607727, 0.4238177239894867, -1.6097875833511353, -1.5732351541519165, -1.7961047887802124, -1.581592082977295, -0.8914350271224976, -1.0374106168746948, 0.14475391805171967, -1.6208686828613281, -6.5695343017578125, -4.996014595031738, -2.8021655082702637, -1.0248346328735352, -1.7940449714660645, -1.6252694129943848, -0.36168837547302246, -1.28688645362854, -0.4638928472995758, -0.4508695900440216, -5.0872039794921875, -2.0638904571533203, -0.931699275970459, -1.6916216611862183, -0.3978312015533447, 0.45317956805229187, -0.1839575320482254, -1.1039848327636719, 1.9617257118225098, 1.6389902830123901, -0.8699897527694702, -1.5998834371566772, -0.47336500883102417, 0.32016292214393616, 0.5577893853187561, -1.2908899784088135, 1.6202701330184937, 1.4410102367401123, 0.358812153339386, -2.5089657306671143, -0.7544220685958862, 0.48537203669548035, -2.641774892807007, -4.277714252471924, -1.6127872467041016, -3.270237445831299, -4.33588171005249, -3.503051996231079, -3.3448410034179688, -1.3215751647949219, -0.953072726726532, -3.757697105407715, -4.174436092376709, -3.2933425903320312, -1.4677386283874512, -4.575158596038818, -1.8304145336151123, 0.1457415372133255, 0.18272513151168823, -3.783085584640503, -1.947263240814209, -3.5277891159057617, -1.4989421367645264, -2.245493173599243, -1.3996042013168335, 0.7301384210586548, -1.3280394077301025, -2.129436492919922, 1.3069052696228027, -1.75732421875, -0.6596307754516602, -3.3413944244384766, -0.31757453083992004, -1.0883784294128418, -1.5811158418655396, -1.68881094455719, -0.13395372033119202, -1.6528756618499756, -0.5463045835494995, 0.17333471775054932, 0.20440131425857544, 4.364204406738281, 1.8462419509887695, 0.04675350338220596, 2.4032280445098877, -1.1763029098510742, 0.6204546093940735, -7.208596706390381, 0.09103894978761673, -0.7689123749732971, 1.3510886430740356, -1.1080331802368164, 1.348832130432129, -1.6236079931259155, 1.1374080181121826, -1.9865670204162598, -1.5614207983016968, -7.277379035949707, 2.144817352294922, -5.323642253875732, 0.4416712820529938, 0.3412749767303467, -1.4677971601486206, -1.7046772241592407, -1.8935762643814087, -1.5041370391845703, -0.8366202116012573, -1.0677515268325806, -1.0486068725585938, -1.7086403369903564, -6.6407341957092285, -4.853827476501465, -2.8789336681365967, -1.0603193044662476, -1.8825640678405762, -1.6039913892745972, -0.37384241819381714, -1.3188132047653198, -0.4087521731853485, -0.3929712474346161, -5.079066276550293, -2.0130181312561035, -0.199309840798378, -1.767380714416504, -0.39557260274887085, 0.2972075045108795, -0.1916777640581131, -0.9607219099998474, -1.3500920534133911, 2.688656806945801, 0.8741428256034851, 0.8419037461280823, 4.304064750671387]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (50, 500000), 'etaBin': (1.54, 2.5)}}, 'et0_eta0': {'discriminator': {'threshold': -0.21500081121921538, 'nodes': [100, 12, 1], 'bias': [-0.3243821859359741, -0.022949250414967537, 0.06397953629493713, -0.002450532279908657, 0.005139805842190981, -0.0042592985555529594, -0.1272035837173462, -0.01745532639324665, -0.057310499250888824, -0.10154696553945541, 0.01067082304507494, -0.02071106806397438, -0.026636380702257156], 'weights': [1.476061463356018, 0.057953573763370514, -0.061145782470703125, 0.14903037250041962, 0.05627449229359627, 0.12229415774345398, 0.0437023751437664, 0.23709996044635773, 0.21900202333927155, 0.3448837399482727, 0.0644509568810463, -1.284635066986084, -5.035192489624023, -0.043930720537900925, -0.490546315908432, -0.7604197859764099, 0.054398056119680405, -0.20822304487228394, -0.8825193047523499, -0.41976767778396606, -0.32447633147239685, -0.22125662863254547, -0.15850138664245605, -0.24071381986141205, -0.3704829812049866, -0.362745076417923, -0.2589312791824341, -0.11356930434703827, -0.16233879327774048, -0.24333973228931427, -0.23491203784942627, 0.016969546675682068, -0.1014983132481575, -0.22767505049705505, -0.13504700362682343, 0.12819024920463562, -0.09571896493434906, 0.05516155809164047, -0.12372250854969025, -0.14374038577079773, -0.17545878887176514, 0.031179307028651237, -0.2246602326631546, -0.006212448701262474, 0.4229028522968292, -0.10946831107139587, -0.019336272031068802, 0.006436899304389954, -0.025292545557022095, 0.0565677285194397, 0.5393238067626953, 0.010842016898095608, -0.11572227627038956, -0.010478798300027847, 0.02785000391304493, -0.12484199553728104, 0.29947125911712646, 0.012082966044545174, 0.15753582119941711, 0.07837500423192978, 0.15220965445041656, 0.3800061047077179, -0.01225293893367052, 0.05631566792726517, 0.4082483947277069, 0.08196637034416199, 0.1384999006986618, -0.06263206899166107, 0.2716931700706482, 0.5301321148872375, 0.05661932751536369, 0.18994684517383575, 0.060955509543418884, -0.11557963490486145, -0.02318572625517845, -0.09796342253684998, -0.26194578409194946, 0.05938266962766647, -0.06903216987848282, 0.033798396587371826, -0.766826331615448, -0.19958138465881348, -0.18872560560703278, 0.01909077726304531, 0.03044808842241764, -0.06817609816789627, -0.13110919296741486, -0.012401021085679531, -0.1713392734527588, -0.21668341755867004, 0.012201621197164059, 0.4037587344646454, -0.14945973455905914, -0.1395430713891983, 0.06031619384884834, 0.38285258412361145, -0.2974977493286133, -0.12648186087608337, 0.20011746883392334, 0.10430724918842316, -0.6960152387619019, -0.2775358557701111, 0.1363564282655716, 0.18876704573631287, 0.16436830163002014, -0.14093901216983795, 0.09610968083143234, -0.1800735890865326, -0.7320963740348816, -1.1285581588745117, -0.11085426807403564, 0.6199904084205627, 2.050849199295044, 3.8321921825408936, 2.064218282699585, 2.286722421646118, 1.4917384386062622, 1.842494249343872, 2.0157387256622314, 1.0776647329330444, 1.0539902448654175, 0.9616613388061523, 0.9284083247184753, 1.0583244562149048, 0.9447614550590515, 1.046964406967163, 0.7982513904571533, 0.7098509669303894, 0.863567590713501, 0.8808420300483704, 0.8805064558982849, 0.25724586844444275, 0.36333155632019043, 0.9393158555030823, 0.6228321194648743, 0.37539443373680115, 0.6231546401977539, 0.247482031583786, 0.39974692463874817, 0.38513579964637756, 0.506837785243988, 0.44895729422569275, 0.6238045692443848, 0.4085644483566284, -0.5285047888755798, 0.34321993589401245, 0.3186812996864319, 0.4267951548099518, 0.4548929035663605, 0.31742143630981445, -0.19146175682544708, -0.01741754822432995, 0.5441179871559143, 0.31392115354537964, 0.320030152797699, 0.5049025416374207, -0.028435463085770607, 0.09931579977273941, -0.05825544148683548, 0.11842112243175507, 0.1963658332824707, -0.357530802488327, 0.12685859203338623, -0.19431133568286896, -0.46653425693511963, 0.3576080799102783, 0.2375250607728958, 0.24967795610427856, -0.19622279703617096, -0.651342511177063, 0.2566276490688324, -0.05432011932134628, -0.062122780829668045, -0.01816791109740734, 0.3294052183628082, 0.42870306968688965, 0.6888091564178467, 0.5112172961235046, 0.3980710208415985, 0.28258341550827026, 2.864884376525879, 1.0171176195144653, 0.8973293900489807, 0.4066636562347412, 0.4845094680786133, 0.501609206199646, 0.27183276414871216, 0.4392940402030945, 0.9660190939903259, 0.842970073223114, 0.29989534616470337, -0.10744970291852951, 1.1572062969207764, 0.46984249353408813, 0.28639930486679077, -0.20800787210464478, 0.8500248193740845, 0.4979040026664734, 0.24565085768699646, -0.13411100208759308, 0.6587658524513245, 0.3341616690158844, -0.31965118646621704, -0.1291426420211792, -0.1039436012506485, 0.09522631764411926, -0.09256931394338608, 0.17307069897651672, 0.878302276134491, 1.1097573041915894, 0.11843667924404144, -0.780601441860199, -2.0414466857910156, -3.766209602355957, -1.871741771697998, -2.2838282585144043, -1.6353451013565063, -1.8062189817428589, -1.9007903337478638, -1.1669193506240845, -1.0442146062850952, -1.0744746923446655, -0.70192950963974, -0.9318003058433533, -0.7778177261352539, -0.9121586680412292, -0.9268052577972412, -0.8662547469139099, -0.9678456783294678, -0.930668294429779, -0.8388561606407166, -0.39635470509529114, -0.35807496309280396, -0.8350146412849426, -0.7014111876487732, -0.3082309067249298, -0.5654641389846802, -0.32241711020469666, -0.340485543012619, -0.4271754026412964, -0.5996658802032471, -0.38121673464775085, -0.5805191993713379, -0.49109143018722534, 0.4162992238998413, -0.35344594717025757, -0.3992149829864502, -0.436668336391449, -0.4587709903717041, -0.2821115255355835, 0.09143092483282089, 0.022399021312594414, -0.38038790225982666, -0.4334152936935425, -0.4344814419746399, -0.415460467338562, 0.04464549571275711, -0.09638110548257828, -0.00780858937650919, -0.2073897421360016, -0.026212023571133614, 0.3322162330150604, -0.10899668186903, 0.1515868753194809, 0.5464217066764832, -0.17238718271255493, -0.2121865153312683, -0.3770309388637543, 0.09445513039827347, 0.48999956250190735, -0.4061352014541626, 0.07177530229091644, -0.030583752319216728, 0.15788069367408752, -0.3935731053352356, -0.634501576423645, -0.5583630800247192, -0.40997612476348877, -0.36782220005989075, -0.4019736349582672, -2.9742817878723145, -1.0826107263565063, -1.0108041763305664, -0.34852731227874756, -0.4269449710845947, -0.4836242198944092, -0.3701973855495453, -0.3664204478263855, -0.9441653490066528, -0.7609328031539917, -0.3055655360221863, 0.0812799483537674, -1.1000967025756836, -0.46806764602661133, -0.3543839752674103, 0.3440917432308197, -0.6621334552764893, -0.5414609909057617, -0.21703045070171356, 0.1872454583644867, -0.7800435423851013, -0.26391303539276123, 0.2687060832977295, 0.14706704020500183, 0.10998667776584625, -0.10566559433937073, -0.00527771795168519, -0.31274887919425964, -0.8602349162101746, -1.0804035663604736, -0.12237152457237244, 0.7297987937927246, 2.231590747833252, 3.8236396312713623, 1.8765668869018555, 2.218198537826538, 1.5936576128005981, 1.9169617891311646, 2.1039249897003174, 0.9597241282463074, 1.1086180210113525, 1.004084587097168, 0.7974360585212708, 0.9986209273338318, 0.8849788308143616, 0.8981264233589172, 0.9357025027275085, 0.9319033622741699, 0.9834273457527161, 0.7466726899147034, 0.9445087313652039, 0.2888241708278656, 0.4901118576526642, 0.887897789478302, 0.6136507391929626, 0.19943992793560028, 0.6060624718666077, 0.38367411494255066, 0.3388911187648773, 0.48767632246017456, 0.4434056878089905, 0.3775225579738617, 0.5883793830871582, 0.498860239982605, -0.6094395518302917, 0.36791694164276123, 0.3394908308982849, 0.4487156271934509, 0.5549932718276978, 0.1786375641822815, -0.03970607742667198, 0.13637468218803406, 0.4542858898639679, 0.3339504599571228, 0.41318264603614807, 0.34875234961509705, -0.1564885377883911, 0.08213863521814346, 0.008575341664254665, 0.10929201543331146, 0.07375779002904892, -0.22763368487358093, 0.15024155378341675, 0.029834937304258347, -0.635840117931366, 0.3727417588233948, 0.2866503596305847, 0.33003586530685425, -0.292678564786911, -0.6640088558197021, 0.17276149988174438, 0.033568210899829865, -0.1452905535697937, -0.1365237981081009, 0.2597862780094147, 0.5123768448829651, 0.5960836410522461, 0.4633513391017914, 0.5046104788780212, 0.2890225648880005, 2.9260005950927734, 1.0276273488998413, 1.0584967136383057, 0.37141573429107666, 0.5158037543296814, 0.508152425289154, 0.32820868492126465, 0.34160280227661133, 0.956307053565979, 0.7184001207351685, 0.1844894289970398, -0.01977946236729622, 1.168821930885315, 0.6351172924041748, 0.3504367172718048, -0.12327994406223297, 0.7826497554779053, 0.6101318597793579, 0.14397403597831726, -0.29887765645980835, 0.723616361618042, 0.25893381237983704, -0.30390241742134094, -0.18394224345684052, -0.0011842958629131317, 0.19550587236881256, 0.008074487559497356, 0.22621819376945496, 0.8383589386940002, 0.9687522053718567, -0.014054263941943645, -0.8114946484565735, -2.2685179710388184, -3.687333345413208, -1.8694920539855957, -2.25789475440979, -1.4992057085037231, -1.9338481426239014, -1.8828308582305908, -1.1564518213272095, -0.999512255191803, -0.9706010818481445, -0.9313433170318604, -0.9694126844406128, -0.8566136956214905, -1.0584187507629395, -0.784536600112915, -0.8348600268363953, -0.9686130285263062, -0.7070528864860535, -0.9538553357124329, -0.3339445888996124, -0.45528101921081543, -0.9326247572898865, -0.6954519152641296, -0.30490538477897644, -0.5611538290977478, -0.46350178122520447, -0.5306990146636963, -0.46445584297180176, -0.6350771188735962, -0.4572320878505707, -0.6470425128936768, -0.5068849921226501, 0.41750097274780273, -0.41931775212287903, -0.38742950558662415, -0.29768016934394836, -0.3747560679912567, -0.2540116608142853, -0.005796564277261496, -0.0955575704574585, -0.49509480595588684, -0.5135501027107239, -0.34334731101989746, -0.362275630235672, 0.06511737406253815, -0.10966382175683975, 0.07512755692005157, -0.1860388219356537, -0.03367023542523384, 0.30179962515830994, -0.2719210684299469, 0.01747116446495056, 0.4167458415031433, -0.32770150899887085, -0.09628990292549133, -0.2367144227027893, 0.2576958239078522, 0.6623708009719849, -0.3237297534942627, -0.011700491420924664, 0.06413056701421738, 0.17541424930095673, -0.2461612969636917, -0.536953330039978, -0.6084061861038208, -0.49747201800346375, -0.37795478105545044, -0.36963239312171936, -2.786975383758545, -0.9466710686683655, -0.8497671484947205, -0.522612988948822, -0.3659266531467438, -0.4781096875667572, -0.4927422106266022, -0.2832837700843811, -0.9536038041114807, -0.7994208335876465, -0.2122483104467392, 0.03496243804693222, -1.1701340675354004, -0.5265145897865295, -0.28813809156417847, 0.14604005217552185, -0.8775339126586914, -0.605994701385498, -0.2954024076461792, 0.16882073879241943, -0.7774041891098022, -0.1178220883011818, 0.22547976672649384, 0.1690535545349121, 0.15536841750144958, -0.29932695627212524, -0.03597563877701759, -0.10570986568927765, -0.8147822022438049, -1.076404094696045, 0.02478604018688202, 0.6669730544090271, 2.1209115982055664, 3.795520782470703, 1.8743782043457031, 2.13991379737854, 1.6914101839065552, 1.7487924098968506, 2.0167899131774902, 1.0183645486831665, 1.0455210208892822, 1.11996328830719, 0.7865516543388367, 0.8750813603401184, 0.8187900185585022, 0.936396062374115, 0.8437780141830444, 0.8014704585075378, 0.9436918497085571, 0.885571300983429, 0.9232723116874695, 0.25422343611717224, 0.5256718397140503, 0.8227117657661438, 0.6017442345619202, 0.2802416980266571, 0.5966557264328003, 0.3428051173686981, 0.3773047626018524, 0.5244446992874146, 0.6559674739837646, 0.563808023929596, 0.5616024732589722, 0.3792630136013031, -0.45197808742523193, 0.33967095613479614, 0.39106473326683044, 0.45449888706207275, 0.3592917323112488, 0.14236736297607422, 0.025437576696276665, 0.12701091170310974, 0.5290206074714661, 0.38731324672698975, 0.5297143459320068, 0.36218366026878357, -0.06395639479160309, 0.10603252798318863, -0.10770198702812195, 0.1613713800907135, -0.04068173095583916, -0.36586424708366394, 0.16843944787979126, -0.02052471414208412, -0.5898191332817078, 0.3797563910484314, 0.06766174733638763, 0.3673762381076813, -0.3272448778152466, -0.5951536893844604, 0.24615316092967987, -0.03786547854542732, -0.13957352936267853, -0.08918934315443039, 0.31821122765541077, 0.42612648010253906, 0.6158890724182129, 0.3239102363586426, 0.4248531758785248, 0.3625611960887909, 2.7510218620300293, 1.0123035907745361, 0.8732120394706726, 0.5261968970298767, 0.5547390580177307, 0.43870770931243896, 0.49714115262031555, 0.47235339879989624, 0.9114752411842346, 0.7698146104812622, 0.11789002269506454, -0.15053117275238037, 1.077889323234558, 0.5874332189559937, 0.16860392689704895, -0.1621113121509552, 0.7412704825401306, 0.4587494730949402, 0.14176379144191742, -0.12539425492286682, -0.579647958278656, -0.38935571908950806, 0.12167588621377945, 0.15145407617092133, 0.0600559338927269, 0.04652192071080208, -0.006256299093365669, 0.1282905489206314, -0.16438427567481995, -0.113800048828125, 0.08819019794464111, 2.362645387649536, 2.040235996246338, 0.6736499071121216, 0.2812625467777252, 0.4025460183620453, 0.00039687901153229177, 0.22943401336669922, 0.4316480755805969, 0.10370149463415146, 0.09645375609397888, 0.29061609506607056, 0.16679520905017853, 0.20591211318969727, 0.056572336703538895, 0.1707373559474945, 0.2876901626586914, -0.007451578509062529, 0.22167544066905975, 0.19639211893081665, 0.24014900624752045, 0.03732027858495712, 0.13819825649261475, 0.2038734257221222, 0.07922736555337906, 0.016163617372512817, 0.11822336912155151, 0.12362080067396164, 0.21042616665363312, 0.2035510241985321, 0.15610383450984955, 0.15003079175949097, 0.04464350640773773, 0.1710120290517807, -0.14172954857349396, 0.023574458435177803, -0.012666396796703339, 0.18968015909194946, -0.008056697435677052, 0.10037846118211746, 0.08987661451101303, -0.07269002497196198, 0.1226225420832634, 0.09563713520765305, 0.12487387657165527, 0.13163724541664124, 0.07762188464403152, 0.06325860321521759, 0.06127370521426201, 0.0795314759016037, -0.03956534340977669, -0.03349811211228371, -0.08067768812179565, 0.09203643351793289, -0.19249092042446136, 0.011392530985176563, 0.1043589785695076, 0.09499963372945786, -0.12877480685710907, -0.17455501854419708, 0.07403942197561264, 0.0576593279838562, 0.19663161039352417, 0.33649685978889465, 0.21683286130428314, 0.07682272046804428, 0.22730880975723267, 0.1339457482099533, 0.009706462733447552, -0.048624444752931595, 0.38573452830314636, 0.04370135813951492, 0.10157392919063568, -0.025286376476287842, 0.14711278676986694, 0.19015805423259735, 0.11559094488620758, 0.1336848884820938, 0.10356315225362778, 0.15963514149188995, -0.008706903085112572, 0.1580125093460083, 0.016266142949461937, 0.09074185788631439, 0.08938904851675034, 0.01862986758351326, 0.20890820026397705, 0.18977190554141998, 0.18820568919181824, 0.049352794885635376, -0.7806790471076965, -0.23438364267349243, 0.14554771780967712, 0.09212977439165115, 0.027323439717292786, -0.1795697957277298, -0.030876850709319115, -0.1481524109840393, -0.760424792766571, -1.1755577325820923, -0.10541558265686035, 0.6398243308067322, 2.0786359310150146, 3.635143518447876, 2.067805528640747, 2.346752166748047, 1.6585654020309448, 1.880583643913269, 1.9749646186828613, 1.0171561241149902, 1.133100986480713, 0.9676198959350586, 0.7912762761116028, 0.897345244884491, 0.9583345055580139, 0.9731187224388123, 0.7820274829864502, 0.8727594017982483, 0.9315875768661499, 0.8790619969367981, 1.0047755241394043, 0.4724777042865753, 0.41589975357055664, 0.837573230266571, 0.5062357783317566, 0.27869340777397156, 0.7179790139198303, 0.2380809485912323, 0.3466125428676605, 0.4632721543312073, 0.438789427280426, 0.38961848616600037, 0.710131824016571, 0.3566570580005646, -0.5497071146965027, 0.4447776675224304, 0.33844923973083496, 0.33722302317619324, 0.35933974385261536, 0.28477299213409424, -0.1063450425863266, 0.20133990049362183, 0.5057849287986755, 0.4971030056476593, 0.3894655108451843, 0.491787314414978, -0.1542949676513672, 0.140877366065979, -0.14365963637828827, 0.2957767844200134, 0.028755055740475655, -0.3070200979709625, 0.28425130248069763, -0.10196131467819214, -0.5294090509414673, 0.3867524266242981, 0.2215283066034317, 0.3122559189796448, -0.1881251484155655, -0.485280841588974, 0.36670801043510437, 0.12092411518096924, -0.19059531390666962, -0.05695551633834839, 0.21754713356494904, 0.5142231583595276, 0.7399312257766724, 0.4074784219264984, 0.3823760151863098, 0.24980266392230988, 2.9636974334716797, 1.074893832206726, 0.8481115698814392, 0.478789359331131, 0.4902724027633667, 0.5101810097694397, 0.3424863815307617, 0.3308432102203369, 1.004491925239563, 0.8160499334335327, 0.12408070266246796, -0.029177628457546234, 1.169668197631836, 0.47259026765823364, 0.22181475162506104, -0.24677099287509918, 0.8702714443206787, 0.42897742986679077, 0.23883172869682312, -0.0941210612654686, -0.7464067339897156, -0.1393120437860489, 0.30386295914649963, 0.06628911942243576, 0.016536641865968704, -0.254507839679718, -0.03825397044420242, -0.22446735203266144, -0.774318277835846, -1.1725398302078247, -0.05262186378240585, 0.7752832770347595, 2.062148332595825, 3.6173818111419678, 1.9630950689315796, 2.2362475395202637, 1.569177269935608, 1.8511412143707275, 1.9206682443618774, 0.954825222492218, 1.081829309463501, 0.8732966184616089, 0.7028389573097229, 0.9882843494415283, 0.8494143486022949, 0.9445117115974426, 0.9234167337417603, 0.7813320755958557, 0.8666919469833374, 0.8231660723686218, 0.8291475176811218, 0.44714823365211487, 0.4455345571041107, 0.8096457123756409, 0.6892251372337341, 0.30815285444259644, 0.6257227659225464, 0.4243081510066986, 0.5339103937149048, 0.3445960581302643, 0.6384410858154297, 0.39555492997169495, 0.7375269532203674, 0.30566170811653137, -0.550922691822052, 0.35684967041015625, 0.4111183285713196, 0.4807831645011902, 0.5070168375968933, 0.31376034021377563, -0.014503933489322662, 0.06359174102544785, 0.5199306607246399, 0.5111125111579895, 0.3320494294166565, 0.3863998055458069, -0.17949503660202026, 0.23546284437179565, -0.10630717873573303, 0.21629539132118225, 0.057924315333366394, -0.21113428473472595, 0.16882818937301636, -0.03254755213856697, -0.45083826780319214, 0.2201589047908783, 0.08624336123466492, 0.2879609763622284, -0.18969903886318207, -0.6674262881278992, 0.2343495935201645, 0.11666262149810791, -0.13148455321788788, -0.17209984362125397, 0.39633241295814514, 0.5815616846084595, 0.5470340251922607, 0.42488759756088257, 0.3591296970844269, 0.43875575065612793, 1.948797583580017, 0.9059339761734009, 0.8886678814888, 0.5393306612968445, 0.32810941338539124, 0.5039650797843933, 0.28703731298446655, 0.3776465058326721, 0.8586753606796265, 0.8085424304008484, 0.3255603015422821, -0.13518378138542175, 0.5526973009109497, 0.5480127930641174, 0.17460809648036957, -0.32457220554351807, 0.7896354794502258, 0.48064878582954407, 0.14689065515995026, -0.15502357482910156, -15.491171836853027, -4.285859107971191, 0.0818476751446724, 0.06650038808584213, 0.03016006015241146, -0.081988625228405, 0.08372359722852707, 0.06274610012769699, -0.13087241351604462, -0.19910715520381927, 3.3757717609405518, 39.55893325805664, 2.093914270401001, -176.65133666992188, -4.331258773803711, 0.39432811737060547, -0.10075069963932037, -3.6958420276641846, 0.37659895420074463, 0.2783397138118744, 0.1598002016544342, 0.21591122448444366, -0.3677313029766083, 0.24481381475925446, 0.2627587616443634, 0.12696927785873413, 0.13358008861541748, -0.01974961906671524, 0.19124282896518707, 0.25373348593711853, 0.13908451795578003, 0.0008843100513331592, 0.07936114817857742, 0.09220340847969055, 0.1904328465461731, 0.13175538182258606, 0.11042188107967377, 0.07629276812076569, 0.16529527306556702, -0.0060999030247330666, 0.02589152194559574, 0.18454609811306, 0.2563488185405731, 0.20759092271327972, -0.01230043824762106, 0.19658254086971283, 0.021490851417183876, 0.20630313456058502, 0.03463979810476303, 0.07174990326166153, 0.03506484255194664, 0.051517553627491, 0.06359807401895523, 0.15722902119159698, 0.03541490063071251, 0.014536981470882893, 0.09417340159416199, 0.044150520116090775, -0.08035457134246826, 0.8098222017288208, 5.259992030914873e-05, -0.01029662974178791, 0.13987113535404205, 0.05670633167028427, -0.04850941523909569, 0.051377393305301666, 0.10235633701086044, 0.005661094095557928, 0.09524820744991302, -0.12393156439065933, -0.0378715880215168, -0.5669868588447571, -0.40579789876937866, -0.2606159448623657, -0.04482203722000122, 0.038945335894823074, -0.15142029523849487, 0.034491658210754395, -0.015906868502497673, 0.022592587396502495, 0.4919695556163788, 0.41574862599372864, 0.26817673444747925, -0.002132260473445058, 0.12034596502780914, 0.015913166105747223, 0.008873587474226952, 0.11072759330272675, 0.14224855601787567, 0.008609726093709469, -0.05536558851599693, 0.005231568124145269, -0.018855849280953407, 0.20781876146793365, 0.1079775020480156, 0.025684602558612823, 0.11940726637840271, 0.06137339770793915, 0.04815657436847687, -0.9021568894386292, -0.880332887172699, -0.2813597023487091, 0.11267052590847015, 0.09328419715166092, 0.08167222887277603, -0.2526177763938904, -0.003816338023170829, -0.18739047646522522, -0.863169252872467, -1.0840320587158203, -0.06257447600364685, 0.6662363409996033, 2.093428611755371, 3.6898958683013916, 2.071664571762085, 2.1934731006622314, 1.6108354330062866, 1.8452820777893066, 2.0900933742523193, 1.1813876628875732, 1.0497792959213257, 1.1331278085708618, 0.6984289288520813, 0.914137601852417, 0.9053791165351868, 1.0205188989639282, 0.940129816532135, 0.9280211329460144, 0.9807019829750061, 0.9307714104652405, 0.9677285552024841, 0.4357527196407318, 0.4068205952644348, 1.0050190687179565, 0.7080274224281311, 0.3384552299976349, 0.5750148892402649, 0.2305757701396942, 0.35322532057762146, 0.45492783188819885, 0.53663170337677, 0.4528823792934418, 0.7420092821121216, 0.483097106218338, -0.41787874698638916, 0.4667041599750519, 0.29779791831970215, 0.407510906457901, 0.33215752243995667, 0.3730563521385193, -0.109189972281456, 0.10464361310005188, 0.5269121527671814, 0.41522321105003357, 0.5469120740890503, 0.4414403438568115, -0.2025863528251648, 0.21906358003616333, -0.15255723893642426, 0.31041210889816284, 0.1170356422662735, -0.3667773902416229, 0.24834677577018738, 0.01885516382753849, -0.4079081416130066, 0.31527531147003174, 0.16464368999004364, 0.2769801616668701, -0.2532947361469269, -0.5217404365539551, 0.33690035343170166, -0.08377234637737274, -0.17760571837425232, -0.06869559735059738, 0.3766525685787201, 0.42167961597442627, 0.5127557516098022, 0.5397555828094482, 0.3739357590675354, 0.2328018993139267, 2.946880340576172, 1.0774153470993042, 0.9717760682106018, 0.46458330750465393, 0.39710190892219543, 0.5541382431983948, 0.264120876789093, 0.4267430901527405, 0.8890705108642578, 0.743122935295105, 0.23032748699188232, -0.014709069393575191, 1.0502794981002808, 0.5195984840393066, 0.3432987630367279, -0.2584777772426605, 0.8596128225326538, 0.4797530770301819, 0.20566365122795105, -0.18376195430755615, -0.8227311968803406, -0.20698490738868713, 0.11102037131786346, 0.22080208361148834, 0.1153373271226883, -0.2897360324859619, 0.12594637274742126, -0.23577368259429932, -0.8286423087120056, -1.0136382579803467, -0.08974894881248474, 0.7163418531417847, 2.1168737411499023, 3.793184995651245, 2.0460703372955322, 2.3263978958129883, 1.6736890077590942, 1.8304005861282349, 1.9066585302352905, 0.9959879517555237, 1.1238120794296265, 0.9346550703048706, 0.8507928252220154, 0.8582316040992737, 0.9514577984809875, 0.8473272919654846, 0.7740100622177124, 0.7148613333702087, 0.965130090713501, 0.8125954270362854, 1.0081979036331177, 0.46507373452186584, 0.37572628259658813, 0.8053709864616394, 0.6264010071754456, 0.32764407992362976, 0.5767160058021545, 0.2904122769832611, 0.5325918197631836, 0.47844672203063965, 0.6541452407836914, 0.3666097819805145, 0.5771685242652893, 0.38559582829475403, -0.41357266902923584, 0.5147339105606079, 0.34592801332473755, 0.4873802661895752, 0.37800514698028564, 0.2250511646270752, 0.023746708407998085, -0.013935789465904236, 0.4142044186592102, 0.46205636858940125, 0.35973113775253296, 0.39222392439842224, -0.09047795832157135, 0.1042354479432106, -0.1764659732580185, 0.16848084330558777, 0.15030142664909363, -0.3375096619129181, 0.14844581484794617, -0.019485371187329292, -0.5909953117370605, 0.37221550941467285, 0.12829771637916565, 0.3150736689567566, -0.3749918043613434, -0.6171873807907104, 0.40479397773742676, -0.0752357691526413, -0.12085483968257904, -0.1529383510351181, 0.27498093247413635, 0.4954458475112915, 0.7150106430053711, 0.4734967052936554, 0.2890981435775757, 0.24244461953639984, 2.971099853515625, 0.883664608001709, 0.8501023650169373, 0.3935048580169678, 0.49203982949256897, 0.48357340693473816, 0.38229358196258545, 0.39532411098480225, 0.942328691482544, 0.8241564035415649, 0.2859242558479309, -0.19443035125732422, 1.148388385772705, 0.49751755595207214, 0.3637045919895172, -0.3307400047779083, 0.8817672729492188, 0.4765219986438751, 0.1777738481760025, -0.2705914378166199, 0.05752190575003624, -1.150236964225769, 0.5735300183296204, -1.1392220258712769, 0.22553712129592896, -0.6983524560928345, -2.0947089195251465, -1.6132698059082031, -0.5439276099205017, -0.27180683612823486, -1.7030823230743408, -0.43344739079475403]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (0, 0.8)}}, 'et3_eta0': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 10, 1], 'bias': [0.17728745937347412, -0.060267046093940735, -0.18031713366508484, 0.19339519739151, -0.2021235227584839, -0.2422117292881012, 0.02458428218960762, 0.0455373078584671, 0.19666767120361328, 0.1951281577348709, -0.38630449771881104], 'weights': [-2.239042282104492, -1.193054437637329, 0.10130614787340164, 0.077732153236866, -0.28948864340782166, -0.48709824681282043, -0.27328553795814514, -0.7119665741920471, -1.5452057123184204, -1.4948227405548096, 2.6356019973754883, 1.3895624876022339, 1.1060211658477783, 0.8897459506988525, 1.6279979944229126, 2.031764030456543, 1.9524110555648804, 1.950697660446167, 0.2668675184249878, 1.9286677837371826, 2.2022855281829834, 1.8675689697265625, 1.3760188817977905, 1.4287655353546143, 1.7971867322921753, 1.014933466911316, 1.4421981573104858, 1.2080477476119995, 1.2991358041763306, 0.8171337842941284, 0.6002821326255798, 0.42710310220718384, 1.1112200021743774, 1.1269630193710327, 2.4265713691711426, 1.1673288345336914, 0.4597588777542114, 0.8000677824020386, 0.948357343673706, 1.1512888669967651, 2.4464528560638428, 1.4949381351470947, 0.533879280090332, -1.5922576189041138, 0.2776532769203186, 0.855198085308075, 0.5342828631401062, 1.6617522239685059, 0.42463386058807373, 0.46751052141189575, 0.6457004547119141, -1.5743060111999512, -0.04708711430430412, -1.1245516538619995, 0.08592380583286285, 1.3257657289505005, -0.9139286875724792, -0.951816201210022, 0.63743656873703, 1.365053653717041, -0.48002371191978455, -0.8110402226448059, -0.12207528948783875, -0.1744014024734497, -0.6583820581436157, -0.6415829658508301, 0.16945123672485352, -0.6192817687988281, -0.4287709593772888, 0.5661042332649231, -0.3378031551837921, -0.4615362584590912, -0.494212806224823, -0.24629426002502441, 0.3412192761898041, 0.6793802976608276, 0.9677519798278809, 0.9163610339164734, 0.703278660774231, 0.3944285809993744, 0.8558233976364136, 0.9388306140899658, 2.641338348388672, 1.7916686534881592, 0.644843578338623, 1.081906795501709, 0.5050879716873169, 1.9577882289886475, 2.2299489974975586, 1.9200313091278076, 0.6415445804595947, -0.11577116698026657, 1.7925642728805542, 1.6948580741882324, 0.7407084107398987, -0.06291315704584122, 2.3198184967041016, 1.1895947456359863, -0.9326055645942688, -0.2404146045446396, 2.2779293060302734, 1.1723291873931885, -0.07709205895662308, 0.009872540831565857, 0.35524341464042664, 0.3591274917125702, 0.3421315848827362, 0.8148862719535828, 1.4112972021102905, 1.3282899856567383, -2.795855760574341, -1.3158165216445923, -0.9573688507080078, -1.0057073831558228, -1.7129524946212769, -2.1079723834991455, -1.985476016998291, -2.1140975952148438, -0.136284738779068, -1.9993411302566528, -2.3148820400238037, -1.9802287817001343, -1.3858450651168823, -1.4189133644104004, -1.6426162719726562, -1.1204235553741455, -1.346848487854004, -1.1531518697738647, -1.3088210821151733, -1.179398775100708, -0.6055530905723572, -0.6614584922790527, -1.0318186283111572, -1.1138473749160767, -2.309666872024536, -1.0168190002441406, -0.5687865018844604, -0.8607608079910278, -0.940894603729248, -1.1477817296981812, -2.4272351264953613, -1.4012854099273682, -0.4624536335468292, 1.5136843919754028, -0.09189184010028839, -0.8745547533035278, -1.0733500719070435, -1.7171263694763184, -0.3609464168548584, -0.49171313643455505, -0.5253045558929443, 1.7718403339385986, 0.15666791796684265, 0.9886773228645325, -0.18354475498199463, -1.3080577850341797, 0.9190080165863037, 1.0279908180236816, -0.5590051412582397, -1.3638322353363037, 0.40405648946762085, 0.6377573013305664, 0.15249820053577423, 0.18366572260856628, 0.7446582317352295, 0.7830826044082642, -0.2556442320346832, 0.6023577451705933, 0.5154051780700684, -0.3983910083770752, 0.3185587227344513, 0.32094255089759827, 0.3294515311717987, 0.3042007386684418, -0.3139403164386749, -0.6984218955039978, -1.3539637327194214, -1.032212734222412, -0.7718667984008789, -0.4775051474571228, -0.7494340538978577, -0.8928504586219788, -2.5885422229766846, -1.8221418857574463, -0.7289097905158997, -1.0671120882034302, -0.5120259523391724, -2.042602777481079, -2.547106981277466, -1.842767357826233, -0.47869452834129333, 0.13617964088916779, -2.1420276165008545, -1.50803804397583, -0.7052081227302551, 0.05322765186429024, -2.237316608428955, -0.9938442707061768, 0.8821194171905518, 0.16310741007328033, 2.1447434425354004, 1.0728535652160645, -0.13696448504924774, -0.05550730228424072, 0.19970948994159698, 0.27732881903648376, 0.25448402762413025, 0.7809370160102844, 1.4348810911178589, 1.310713768005371, -2.7845609188079834, -1.2118386030197144, -0.9166501760482788, -2.270514965057373, -1.476441740989685, -0.8001417517662048, -1.9898992776870728, -1.9654734134674072, -0.1848532259464264, -1.9239118099212646, -2.275127649307251, -1.9608579874038696, -1.4868172407150269, -1.6291639804840088, -1.723827838897705, -1.001381516456604, -1.2864340543746948, -1.2287296056747437, -1.3363977670669556, -0.794121503829956, -0.6423551440238953, -0.5582156181335449, -1.2088571786880493, -1.204245686531067, -2.2827398777008057, -1.1020257472991943, -0.49409157037734985, -0.9277572631835938, -0.8136351704597473, -1.0432268381118774, -2.5055317878723145, -1.256455659866333, -0.5008126497268677, 1.462856650352478, -0.23493452370166779, -0.9232950210571289, -0.6957864165306091, -1.6569700241088867, -0.5079548954963684, -0.5465513467788696, -0.6366112232208252, 1.701859474182129, 0.1274765282869339, 1.023290753364563, -0.15832042694091797, -1.4247366189956665, 0.8257716298103333, 1.093299388885498, -0.5974026918411255, -1.2377538681030273, 0.33323556184768677, 0.6493145227432251, 0.11781392246484756, 0.18269553780555725, 0.6720931529998779, 0.781604528427124, -0.34857335686683655, 0.5982115268707275, 0.4406513571739197, -0.6109530925750732, 0.4252433478832245, 0.4147861897945404, 0.43512752652168274, 0.3663524389266968, -0.5108449459075928, -0.6952983736991882, -1.1685101985931396, -0.9947712421417236, -0.7148631811141968, -0.4257887303829193, -0.7605547904968262, -0.940877377986908, -2.54469633102417, -1.868729829788208, -0.7485997676849365, -1.058110237121582, -0.42840108275413513, -2.1492533683776855, -2.37595272064209, -1.7107268571853638, -0.4529905617237091, 0.07569878548383713, -1.997704029083252, -1.5101165771484375, -0.7729349732398987, 0.1242036297917366, -2.2477755546569824, -1.1482243537902832, 0.9732744097709656, 0.32478398084640503, -2.1450037956237793, -1.1404597759246826, 0.014158740639686584, -0.020100193098187447, -0.23917531967163086, -0.44033604860305786, -0.30000045895576477, -0.7670972943305969, -1.4926031827926636, -1.305226445198059, 2.685429811477661, 1.216978907585144, 1.067989468574524, 0.8069314956665039, 1.5168771743774414, 1.9856197834014893, 1.8579005002975464, 1.9841488599777222, 0.11744345724582672, 2.0995750427246094, 2.1469924449920654, 1.938354253768921, 1.532765507698059, 1.6629221439361572, 1.813986897468567, 1.075127124786377, 1.392306923866272, 1.0991307497024536, 1.2994121313095093, 0.8540873527526855, 0.5601438879966736, 0.5102548599243164, 1.2119313478469849, 1.2631114721298218, 2.4230542182922363, 1.0549194812774658, 0.37923571467399597, 0.7586725950241089, 0.7696542739868164, 1.1345311403274536, 2.6058168411254883, 1.3772258758544922, 0.6079716086387634, -1.4751144647598267, 0.34056025743484497, 0.8070067167282104, 0.609471321105957, 1.6413116455078125, 0.42105668783187866, 0.6567086577415466, 0.5327335596084595, -1.653010368347168, -0.050537388771772385, -1.0919348001480103, 0.23021310567855835, 1.32795250415802, -0.8816784024238586, -1.1208522319793701, 0.5418692827224731, 1.2058699131011963, -0.3486722707748413, -0.6833118200302124, -0.18694405257701874, -0.20577266812324524, -0.657939076423645, -0.7211319208145142, 0.2891044616699219, -0.6881989240646362, -0.5385521650314331, 0.5182172656059265, -0.43464115262031555, -0.4231164753437042, -0.6709752082824707, -0.25787681341171265, 0.5009713172912598, 0.828959047794342, 1.1714119911193848, 0.8878676295280457, 0.5689829587936401, 0.3310777246952057, 0.7530944347381592, 0.9550017714500427, 2.7627170085906982, 1.948923110961914, 0.7047944664955139, 1.0841410160064697, 0.6756921410560608, 2.1105499267578125, 2.3265812397003174, 1.7316349744796753, 0.6462854146957397, -0.15122170746326447, 1.99532949924469, 1.6235671043395996, 0.6850496530532837, -0.12313885986804962, 2.15781307220459, 0.9901554584503174, -0.79831463098526, -0.2487647384405136, 2.318676233291626, 1.2051165103912354, 0.016452468931674957, 0.030725371092557907, 0.29274752736091614, 0.35086843371391296, 0.3077310025691986, 0.7247107625007629, 1.523887038230896, 1.4791914224624634, -2.736750364303589, -1.430783987045288, -0.9411048889160156, -1.0433337688446045, -1.532468557357788, -2.0924367904663086, -2.1113338470458984, -2.032477855682373, -0.2753092050552368, -2.058124542236328, -2.238680124282837, -1.9064738750457764, -1.5010687112808228, -1.6562058925628662, -1.8657268285751343, -1.0471060276031494, -1.4882447719573975, -1.3173631429672241, -1.3543518781661987, -0.8708300590515137, -0.5150277018547058, -0.6512885689735413, -1.1491857767105103, -1.1725527048110962, -2.293598175048828, -1.1983673572540283, -0.392975777387619, -0.8812519311904907, -0.970319926738739, -1.1021558046340942, -2.539600133895874, -1.3694462776184082, -0.5296359062194824, 1.4154243469238281, -0.310099333524704, -1.0040279626846313, -0.5231863260269165, -1.6038367748260498, -0.406640887260437, -0.46852391958236694, -0.4686395525932312, 1.8045070171356201, 0.010837312787771225, 0.9279595017433167, -0.08683158457279205, -1.4342236518859863, 0.9337668418884277, 0.9225844144821167, -0.6066074967384338, -1.151829481124878, 0.39342761039733887, 0.6785211563110352, 0.3597167730331421, 0.053507912904024124, 0.728875994682312, 0.7635947465896606, -0.32505154609680176, 0.7602272033691406, 0.4732668995857239, -0.49506449699401855, 0.279278963804245, 0.4092167317867279, 0.4421418011188507, 0.4406158924102783, -0.3217693269252777, -0.7668841481208801, -1.1708629131317139, -0.8821460604667664, -0.729198694229126, -0.3309440314769745, -0.8189537525177002, -1.0362927913665771, -2.5962555408477783, -1.7947170734405518, -0.6902950406074524, -1.0340635776519775, -0.6129263639450073, -1.987069845199585, -2.215005874633789, -1.748450756072998, -0.4539339244365692, 0.04778668284416199, -2.0020923614501953, -1.5182080268859863, -0.6809839010238647, 0.1724814474582672, -2.2697594165802, -1.0368678569793701, 0.9345167279243469, 0.33130133152008057, 2.144519567489624, 1.0889544486999512, -0.09744448214769363, 0.07499998062849045, 0.20698653161525726, 0.4883233606815338, 0.391111820936203, 0.93660968542099, 1.4492250680923462, 1.4098538160324097, -2.6955175399780273, -1.3490216732025146, -1.0756964683532715, -0.9678946137428284, -1.5755923986434937, -0.9260223507881165, -1.979748249053955, -2.006340503692627, -0.1477576494216919, -2.0643367767333984, -2.2879626750946045, -2.006572723388672, -1.4852737188339233, -1.6509864330291748, -1.7501575946807861, -1.1281912326812744, -1.3503042459487915, -1.2975503206253052, -1.1861628293991089, -0.9324530363082886, -0.6094515919685364, -0.6543434262275696, -1.0849491357803345, -1.1388517618179321, -2.2553892135620117, -1.2169792652130127, -0.4638415575027466, -0.7567497491836548, -1.0190273523330688, -1.0056623220443726, -2.481522560119629, -1.3798611164093018, -0.5934018492698669, 1.5739578008651733, -0.24730555713176727, -0.8688960671424866, -0.4644274413585663, -1.65216064453125, -0.4873929023742676, -0.5242351293563843, -0.5260884761810303, 1.7025573253631592, 0.09705090522766113, 1.128327488899231, -0.18647438287734985, -1.474462628364563, 0.8110279440879822, 1.0083045959472656, -0.722978949546814, -1.3484010696411133, 0.3560481071472168, 0.802780270576477, 0.1571776419878006, 0.08327765762805939, 0.6448144912719727, 0.6021802425384521, -0.3168061673641205, 0.6082123517990112, 0.43926411867141724, -0.5384664535522461, 0.22667023539543152, 0.43037864565849304, 0.6303468942642212, 0.3213287591934204, -0.37712201476097107, -0.7585886716842651, -1.1521053314208984, -0.8758272528648376, -0.7663147449493408, -0.3958512246608734, -0.8654335141181946, -0.8888355493545532, -2.521090507507324, -1.9970052242279053, -0.5365056991577148, -1.055628776550293, -0.6134313344955444, -2.00691819190979, -2.212327718734741, -1.7751946449279785, -0.4283324182033539, 0.01599796861410141, -1.9016767740249634, -1.6922330856323242, -0.6859153509140015, 0.18592292070388794, -2.3631749153137207, -1.0364668369293213, 0.7988559603691101, 0.20096497237682343, -2.2798359394073486, -0.9982129335403442, 0.14484696090221405, 0.058334507048130035, -0.24039840698242188, -0.36558279395103455, -0.21348002552986145, -0.8744270205497742, -1.4827383756637573, -1.4441452026367188, 2.7260162830352783, 1.2946815490722656, 0.9623924493789673, 0.974850058555603, 1.51039457321167, 2.1397788524627686, 2.0888113975524902, 2.111521005630493, 0.18752995133399963, 2.000131607055664, 2.2795708179473877, 1.739831566810608, 1.3394826650619507, 1.6208863258361816, 1.6451220512390137, 1.1405341625213623, 1.260148048400879, 1.310970425605774, 1.1956318616867065, 1.052588701248169, 0.6919853091239929, 0.5477901697158813, 1.0776972770690918, 1.2666066884994507, 2.262777805328369, 1.233924150466919, 0.4730463922023773, 0.9439457654953003, 0.8279562592506409, 0.9791718125343323, 2.393134832382202, 1.4605515003204346, 0.5147533416748047, -1.5413330793380737, 0.11887224018573761, 0.9663402438163757, 1.0797563791275024, 1.605398178100586, 0.5854249596595764, 0.5479366183280945, 0.6564112901687622, -1.7207872867584229, -0.1490982472896576, -0.9621780514717102, 0.19452688097953796, 1.3195611238479614, -0.8738262057304382, -1.099992275238037, 0.4820856750011444, 1.2972530126571655, -0.3631128668785095, -0.6268166303634644, -0.3341735601425171, -0.09541554749011993, -0.595929741859436, -0.7696031332015991, 0.2904965877532959, -0.7193057537078857, -0.4173148274421692, 0.5623487830162048, -0.4206360876560211, -0.4989962875843048, -0.3482714593410492, -0.3525504171848297, 0.3502817153930664, 0.7050169110298157, 1.1553555727005005, 0.8329162001609802, 0.6682993173599243, 0.608733594417572, 0.8484053611755371, 0.9189615845680237, 2.5287792682647705, 1.9301106929779053, 0.5394763946533203, 1.0197595357894897, 0.6329258680343628, 2.140395164489746, 2.4269795417785645, 1.8881759643554688, 0.6782927513122559, 0.02659289352595806, 2.1969492435455322, 1.598191499710083, 0.71418696641922, -0.0780780091881752, 2.3423802852630615, 1.0362517833709717, -0.8106425404548645, -0.20199988782405853, -2.2078311443328857, -1.0486295223236084, 0.08000613003969193, -0.05598746985197067, -0.1640249788761139, -0.32660695910453796, -0.3216648995876312, -0.9226858019828796, -1.5902694463729858, -1.4917333126068115, 2.743290424346924, 1.335413932800293, 0.9270409345626831, 0.9063587188720703, 1.654326319694519, 2.030198335647583, 1.9371541738510132, 1.9938161373138428, 0.26860201358795166, 1.9185068607330322, 2.3014047145843506, 1.9614020586013794, 1.5339189767837524, 1.5303282737731934, 1.735044240951538, 1.025425910949707, 1.3128609657287598, 1.2879351377487183, 1.4011987447738647, 1.2297163009643555, 0.661037266254425, 0.5798875093460083, 1.2024052143096924, 1.168814778327942, 2.42602801322937, 1.1895310878753662, 0.41222772002220154, 0.7535437345504761, 0.9807790517807007, 1.0562971830368042, 2.4006195068359375, 1.3851735591888428, 0.6346132159233093, -1.5671972036361694, 0.22047770023345947, 0.9846572279930115, 0.9454964995384216, 1.5533435344696045, 0.48403453826904297, 0.49274617433547974, 0.524734616279602, -1.80234694480896, 0.06958520412445068, -1.085220456123352, 0.2678837478160858, 1.3826919794082642, -0.8665017485618591, -0.9742083549499512, 0.5201785564422607, 1.26466965675354, -0.3033871650695801, -0.6176689863204956, -0.3366625905036926, -0.15645626187324524, -0.6730332374572754, -0.6068395376205444, 0.18305981159210205, -0.6252965927124023, -0.4429503083229065, 0.6097378730773926, -0.24749943614006042, -0.27167239785194397, -0.37826335430145264, -0.3050284683704376, 0.3062669634819031, 0.7746275067329407, 1.2191916704177856, 0.9001162648200989, 0.6878582239151001, 0.5731820464134216, 0.8624178767204285, 1.0523186922073364, 2.6571428775787354, 1.9173321723937988, 0.5480315685272217, 0.976004421710968, 0.43780383467674255, 2.158034324645996, 2.5132133960723877, 1.733149528503418, 0.6613456010818481, -0.07283436506986618, 2.049067258834839, 1.5807583332061768, 0.5517159700393677, -0.07113222032785416, 2.2422335147857666, 1.0118186473846436, -0.7374804019927979, -0.3297822177410126, -2.175553560256958, -1.1985993385314941, 0.07332075387239456, 0.021346617490053177, -0.3300497233867645, -0.25863024592399597, -0.17544278502464294, -0.7952801585197449, -1.5064650774002075, -1.385896921157837, 2.6337473392486572, 1.304810881614685, 0.9117859601974487, 1.0363479852676392, 1.6349717378616333, 1.9729249477386475, 2.1186742782592773, 1.9894551038742065, 0.30509769916534424, 1.9368107318878174, 2.3146684169769287, 1.8927338123321533, 1.4047926664352417, 1.490464448928833, 1.75087308883667, 1.1552612781524658, 1.4223501682281494, 1.2775908708572388, 1.3859087228775024, 0.9964785575866699, 0.6788200736045837, 0.575339674949646, 1.0307259559631348, 1.1754900217056274, 2.2640278339385986, 1.0483067035675049, 0.4824575185775757, 0.9896638989448547, 1.0003074407577515, 1.2147537469863892, 2.490678071975708, 1.2907373905181885, 0.5105671882629395, -1.4879711866378784, 0.21871095895767212, 0.8368341326713562, 0.5817559957504272, 1.5140950679779053, 0.4470527768135071, 0.5511883497238159, 0.5082119107246399, -1.7247977256774902, 0.06378090381622314, -0.9789692759513855, 0.2514275312423706, 1.3882944583892822, -0.8823153376579285, -1.0745110511779785, 0.5152118802070618, 1.2291442155838013, -0.42539942264556885, -0.6004307270050049, -0.3640444874763489, -0.1982484757900238, -0.6535419225692749, -0.7917993068695068, 0.2808682322502136, -0.5897175073623657, -0.6436878442764282, 0.47517508268356323, -0.24679943919181824, -0.37793126702308655, -0.5350465774536133, -0.43289899826049805, 0.5311357975006104, 0.8332191109657288, 1.0170798301696777, 0.8994541764259338, 0.7114859819412231, 0.46820077300071716, 0.9246200919151306, 1.0638461112976074, 2.562593698501587, 1.9693078994750977, 0.661144495010376, 1.1706914901733398, 0.49095994234085083, 2.0036778450012207, 2.1940133571624756, 1.7857164144515991, 0.5535497665405273, -0.09505709260702133, 1.8668205738067627, 1.6191902160644531, 0.7396007180213928, 0.01820875145494938, 2.3482308387756348, 1.0456078052520752, -0.8239447474479675, -0.17262275516986847, -0.1570029854774475, -0.30454376339912415, -0.11810807883739471, -0.012160603888332844, -0.1602475494146347, 0.009688081219792366, -0.22344590723514557, -0.08508329838514328, -0.055638670921325684, 0.027916520833969116, 1.3883978128433228, 0.8419553637504578, 0.604651689529419, 0.6455225944519043, -0.01491620671004057, 0.24911291897296906, 0.18244722485542297, 0.07595661282539368, -0.17563095688819885, 0.03616087883710861, 0.26147356629371643, 0.13462717831134796, 0.08592566102743149, 0.10849546641111374, 0.07942968606948853, 0.023789335042238235, 0.020618518814444542, 0.11601622402667999, -0.041020870208740234, -0.057366784662008286, -0.018283290788531303, 0.010939449071884155, 0.061094630509614944, 0.13172531127929688, 0.05412779003381729, 0.13239683210849762, 0.029915839433670044, -0.03913268819451332, 0.03614918887615204, -0.027741020545363426, 0.07831506431102753, -0.026448508724570274, 0.05860540643334389, -0.2783336043357849, -0.008596600033342838, 0.13391059637069702, -0.06457118690013885, 0.02984980121254921, -0.09440506249666214, -0.054244816303253174, -0.010101713240146637, -0.30560997128486633, -0.20492151379585266, -0.25943583250045776, 0.03756161779165268, 0.0475594587624073, -0.11881260573863983, -0.24812346696853638, -0.09469559043645859, 0.12125609815120697, -0.12497956305742264, -0.09155207127332687, -0.1283242404460907, 0.04938923567533493, -0.14584395289421082, -0.09356189519166946, 0.04735855013132095, -0.23610953986644745, 0.001409954740665853, -0.07452401518821716, -0.13415883481502533, -0.21019898355007172, 0.029680661857128143, -0.02904488705098629, -0.07434059679508209, -0.08405172824859619, -0.08609213680028915, 0.017704444006085396, -0.00887321773916483, -0.08505752682685852, 0.10295527428388596, 0.1559147834777832, 0.18057377636432648, 0.2034745216369629, -0.1067788377404213, -0.01611076109111309, -0.07507006078958511, 0.19650134444236755, 0.1453283727169037, 0.07884165644645691, -0.014847823418676853, 0.03448435291647911, 0.007493128534406424, 0.1800888031721115, 0.09988660365343094, -0.061529431492090225, 0.14850415289402008, 0.09273742139339447, -0.10822104662656784, 0.10528768599033356, -1.7289971113204956, 1.0254331827163696, 1.036848783493042, -1.0040441751480103, 2.7050065994262695, 1.0240970849990845, -1.2022963762283325, -1.1089030504226685, -1.0786373615264893, -0.049769964069128036]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (40, 50), 'etaBin': (0, 0.8)}}, 'et4_eta0': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 7, 1], 'bias': [-0.04682574048638344, -0.08617614209651947, 0.20550568401813507, 0.19406697154045105, -0.21780766546726227, -0.14207829535007477, -0.19644320011138916, -0.4111674726009369], 'weights': [3.058222532272339, -0.11194922029972076, 0.035943593829870224, -0.7757505774497986, 0.07118203490972519, -0.09140380471944809, 0.2142840027809143, 0.3084720969200134, 3.741539239883423, 2.846857786178589, -23.705419540405273, -2.217923164367676, -3.789524793624878, 6.113155841827393, -1.0452487468719482, -0.30597636103630066, -0.44204625487327576, -0.41467300057411194, -0.3544802665710449, -0.2849993407726288, -0.4855339527130127, -0.4296742379665375, -0.316491037607193, -0.5878586173057556, -0.4117034375667572, -0.4559156894683838, -0.38594603538513184, -0.0028064127545803785, -3.4092721939086914, -0.19013607501983643, 8.469882011413574, -0.11551237106323242, -1.1934882402420044, -0.6451283097267151, -0.15799158811569214, 0.230536550283432, -0.1870790719985962, -0.20149420201778412, -0.03712010011076927, -0.06004518270492554, -0.15890927612781525, -0.3119009733200073, -0.2208530604839325, -0.09368983656167984, -0.03259018063545227, -0.16843222081661224, -0.4838895797729492, -0.2368321269750595, -0.020008714869618416, 0.006714432034641504, 0.3447405993938446, -0.37682273983955383, 0.025721082463860512, -0.0037106380332261324, 0.03084147348999977, 0.12326698750257492, 0.08658303320407867, -0.047322701662778854, -0.044342804700136185, -0.1000499501824379, 0.011086884886026382, 0.05750685930252075, 1.5009475946426392, -0.3275568187236786, 0.23978331685066223, 0.12135636806488037, 14.254684448242188, 0.13094894587993622, 0.29169443249702454, -0.11389230936765671, -0.060511261224746704, 0.7684271931648254, 0.4076651334762573, 0.21494433283805847, -0.8374203443527222, -0.08702822029590607, -0.1917855441570282, -0.0933770164847374, -0.002842595800757408, 0.8212772607803345, 1.4939647912979126, 0.033795006573200226, -0.3374331295490265, -7.199451923370361, -0.2523188292980194, -0.14858418703079224, -0.02545495145022869, -0.2519879937171936, -0.2895655930042267, -0.501137375831604, -0.11993192136287689, 0.034077778458595276, -0.2932177484035492, -0.5695431232452393, -0.14869928359985352, -0.03629862517118454, -0.6153274178504944, -0.5390393137931824, 0.07262600213289261, -0.3199878931045532, 3.8441638946533203, 2.4829163551330566, -0.26871541142463684, -0.8806520104408264, 0.09902488440275192, -0.015863578766584396, 0.04607203230261803, -0.1474648118019104, 1.769394040107727, 1.810459852218628, -2.1421632766723633, -0.47937875986099243, -1.7101706266403198, -2.3814663887023926, -1.507400393486023, 0.2453577071428299, -0.9946631789207458, -0.9898926019668579, -1.0422345399856567, -1.0190954208374023, -1.0885716676712036, -1.0190953016281128, -0.7978494763374329, -1.138378381729126, -0.9015890955924988, -1.0785750150680542, -1.139174222946167, -0.5206763744354248, -1.209172010421753, -0.5813487768173218, -0.47889435291290283, -0.6585498452186584, -0.9243745803833008, -0.8175743818283081, -0.4532160460948944, 0.496810644865036, -0.47903749346733093, -0.672505259513855, -0.45675018429756165, -0.586637020111084, -0.36931079626083374, -1.2034589052200317, -0.38565999269485474, -0.3632654845714569, -0.5101311802864075, -0.2804872989654541, -0.5031045079231262, -0.4227074980735779, -0.15543816983699799, -0.23727214336395264, 0.8670980334281921, -1.1379660367965698, -0.3012160062789917, -0.19568713009357452, -0.1657724529504776, -0.19995617866516113, -0.3173958957195282, -0.26098230481147766, -0.2027474045753479, -0.2685406506061554, -0.12593881785869598, -0.20002315938472748, 0.31118521094322205, -1.1010000705718994, 0.362888902425766, 0.22763827443122864, 0.04347231239080429, 0.13150164484977722, 0.45144176483154297, -0.09309958666563034, -0.08833667635917664, 1.302908182144165, 0.16498632729053497, 0.2480601817369461, -0.9275625944137573, -0.6184854507446289, -0.6614977121353149, -0.6341808438301086, -0.4455365240573883, -0.061971455812454224, -0.5405353903770447, -0.670965313911438, -1.1627663373947144, -0.9610299468040466, -0.6288802027702332, -0.5787298679351807, -0.4981994330883026, -0.45428627729415894, -1.0223252773284912, -1.3182083368301392, -0.3163299262523651, -0.08467867970466614, -0.861793041229248, -0.6871806383132935, -0.3416394889354706, -0.12184478342533112, -1.5149272680282593, -1.1164722442626953, -0.16802158951759338, 0.015504078939557076, 3.6298203468322754, 2.2275190353393555, -0.981661319732666, -1.5638165473937988, 0.8214496970176697, -0.5503222942352295, 0.06743296980857849, 1.7082005739212036, 1.903743863105774, 1.9553890228271484, -1.9765180349349976, -3.019707202911377, -1.7605977058410645, -2.564491033554077, -2.147373914718628, 0.5959938168525696, -5.082260608673096, -4.647099494934082, -5.259606838226318, -5.12030553817749, -5.1186347007751465, -4.634576320648193, -3.6494760513305664, -5.623584270477295, -4.171816825866699, -5.107388496398926, -5.15177583694458, -2.693830728530884, -12.755818367004395, -2.7550582885742188, -2.427621841430664, -2.6396641731262207, -6.116861343383789, -4.335421562194824, -2.5281879901885986, 2.070563554763794, -1.891847848892212, -2.806384325027466, -2.6311497688293457, -2.2443137168884277, -2.0492849349975586, -5.445554256439209, -2.0076398849487305, -1.4045981168746948, -2.261333703994751, -1.442292332649231, -1.8760515451431274, -2.143193006515503, -1.1561247110366821, -0.4909752309322357, 4.346169471740723, -5.302811145782471, -0.9942522048950195, -1.0937047004699707, -1.446998119354248, -1.045389175415039, -1.1076384782791138, -0.8765107989311218, -0.7879534959793091, -1.090978980064392, -0.8969172239303589, -0.6372650861740112, 1.583371877670288, -5.118905544281006, 1.5666515827178955, 1.1148627996444702, 0.5236160755157471, 0.15286563336849213, 1.5849872827529907, -0.115245021879673, -1.1538535356521606, 6.115447998046875, 0.4133511185646057, 0.12399254739284515, -1.1436381340026855, -2.8712241649627686, -2.7044293880462646, -2.7658567428588867, -1.4567821025848389, -1.2862217426300049, -0.638632595539093, -3.1346116065979004, -5.393614768981934, -5.492956161499023, -2.6360185146331787, -2.5395565032958984, -2.088763475418091, -1.862412691116333, -5.033935546875, -5.098400115966797, -1.4891976118087769, -0.11286056786775589, -4.410672187805176, -3.9915692806243896, -1.8804373741149902, -0.4776649475097656, -7.639400482177734, -5.817543983459473, -0.47120505571365356, -0.14676909148693085, 3.7647016048431396, 2.2664897441864014, -0.8277937173843384, -1.5396820306777954, 0.7850982546806335, -0.7172222137451172, -0.0029119609389454126, 1.617307424545288, 1.9747254848480225, 1.8899439573287964, -1.7579938173294067, -2.979426383972168, -1.8452677726745605, -2.6823441982269287, -2.1170928478240967, 0.7532058358192444, -4.998748302459717, -4.28693962097168, -5.187532424926758, -5.077785491943359, -5.217937469482422, -4.488471984863281, -3.5019326210021973, -5.719718933105469, -4.103728294372559, -5.223949432373047, -5.266420364379883, -2.680941343307495, -5.460350513458252, -2.8738937377929688, -1.9959862232208252, -2.856679916381836, -5.214505195617676, -4.245157718658447, -2.482255220413208, 1.954346776008606, -1.9555160999298096, -2.844082832336426, -2.6627228260040283, -2.249976396560669, -2.1391794681549072, -5.342377185821533, -1.9597060680389404, -1.5938774347305298, -2.262721300125122, -1.6072357892990112, -1.6617052555084229, -2.3042099475860596, -0.9879289269447327, -0.4569021463394165, 4.486571311950684, -5.247201919555664, -1.0572209358215332, -1.0646865367889404, -1.244405746459961, -1.0535571575164795, -1.2069679498672485, -1.0317038297653198, -0.796983003616333, -1.0574246644973755, -0.9278029203414917, -0.683318018913269, 1.643038272857666, -5.229658603668213, 1.5981935262680054, 0.9773871898651123, 0.5397863984107971, 0.15572184324264526, 1.6528881788253784, -0.1438533514738083, -1.1919186115264893, 6.106741428375244, 0.5012319684028625, 0.1205344870686531, -1.096039056777954, -2.797684669494629, -2.859549045562744, -2.758711576461792, -1.5302135944366455, -1.516284465789795, -0.6106914281845093, -3.096102237701416, -5.324934959411621, -5.541281700134277, -2.5834882259368896, -2.511425495147705, -1.9021031856536865, -2.353917360305786, -4.917848110198975, -4.9027180671691895, -1.4773632287979126, -0.2708081603050232, -4.27911376953125, -3.933354377746582, -1.906004548072815, -0.5583126544952393, -7.705436706542969, -5.813662528991699, -0.33910590410232544, -0.13162696361541748, -3.7615854740142822, -1.4522404670715332, 0.8991000056266785, 1.686396598815918, -0.7773232460021973, 1.0072230100631714, 0.26715701818466187, -1.7207142114639282, -1.9176400899887085, -1.2886720895767212, 5.597075939178467, 4.755531311035156, 9.08128833770752, 15.556910514831543, 2.565484046936035, 33.14349365234375, 4.91190767288208, 4.60050630569458, 5.39437198638916, 5.049078941345215, 5.1297807693481445, 4.618407726287842, 3.7229318618774414, 5.705411434173584, 4.124068260192871, 5.011401653289795, 5.321530342102051, 2.8017966747283936, 4.413352012634277, 2.832120895385742, -0.14350518584251404, 2.842862129211426, 4.8411760330200195, 3.6803529262542725, 2.4113669395446777, -1.8979147672653198, 1.958972454071045, 2.683875560760498, 2.6418144702911377, 2.3044533729553223, 2.1664774417877197, 5.404063701629639, 2.030165672302246, 1.4528071880340576, 2.4251549243927, 1.5190815925598145, 2.187225341796875, 2.355745792388916, 1.5998170375823975, 0.5241653323173523, -4.441922664642334, 5.520379543304443, 1.104872226715088, 1.0641906261444092, 1.338766098022461, 1.0145593881607056, 1.0118064880371094, 0.9334816932678223, 0.627514123916626, 0.9344139099121094, 1.1682759523391724, 0.7832707762718201, -1.7494443655014038, 5.141222953796387, -1.7669464349746704, -0.940024197101593, -0.561367928981781, 0.023768587037920952, -1.7655338048934937, 0.09105351567268372, 1.1846694946289062, -5.94081449508667, -0.11080938577651978, -0.2980530560016632, 1.404118299484253, 2.6462109088897705, 2.835512399673462, 2.8947935104370117, 1.672385334968567, 1.2797707319259644, 0.5853452086448669, 3.032156467437744, 5.354996681213379, 4.589992523193359, 2.6931378841400146, 2.3857498168945312, 2.0071868896484375, 2.466366767883301, 4.9414544105529785, 5.093765735626221, 1.5791155099868774, 0.1517462581396103, 4.315247535705566, 3.8986899852752686, 1.950404167175293, 0.8662136197090149, 7.7105712890625, 5.836587429046631, 0.48735615611076355, 0.2787986099720001, -3.721740245819092, -2.1914706230163574, 0.9087993502616882, 1.640774130821228, -0.7228733897209167, 0.550100564956665, -0.013423996977508068, -1.60116446018219, -1.9033275842666626, -1.9928429126739502, 1.9557932615280151, 2.929208278656006, 1.947727918624878, 2.7449495792388916, 2.172131299972534, -0.5560443997383118, 4.972500324249268, 4.436136245727539, 5.282439708709717, 5.045923233032227, 5.130961894989014, 4.621788024902344, 3.6188478469848633, 5.9305949211120605, 4.306408405303955, 5.131011962890625, 5.15607213973999, 2.657116174697876, 12.78602409362793, 2.6523661613464355, 2.444584846496582, 2.8161470890045166, 6.058564186096191, 4.287871837615967, 2.543428897857666, -2.038630962371826, 2.082280158996582, 2.642899751663208, 2.7784817218780518, 2.1969587802886963, 2.081080913543701, 5.333948612213135, 2.107991933822632, 1.3853250741958618, 2.321838140487671, 1.5590497255325317, 1.6585291624069214, 2.332139730453491, 1.0124374628067017, 0.5344870090484619, -4.469806671142578, 5.179800510406494, 1.0166256427764893, 1.1776483058929443, 1.2407281398773193, 0.9641483426094055, 0.97700035572052, 0.9127278923988342, 0.6783474683761597, 0.9988885521888733, 0.8387950658798218, 0.782820999622345, -1.7371785640716553, 5.240685939788818, -1.707461953163147, -1.0152877569198608, -0.608104944229126, -0.1329755187034607, -1.6459537744522095, -0.060127999633550644, 1.1567333936691284, -5.90641975402832, -0.46212491393089294, -0.25896692276000977, 1.0951948165893555, 2.644749641418457, 2.677863121032715, 2.7380902767181396, 1.6574537754058838, 1.3541650772094727, 0.6627252697944641, 3.2182869911193848, 5.346889495849609, 5.5477705001831055, 2.5671355724334717, 2.5247654914855957, 2.070686101913452, 1.9010865688323975, 5.063714027404785, 4.701160907745361, 1.4274324178695679, 0.07615093886852264, 4.576550483703613, 3.784346103668213, 1.7273280620574951, 0.34699541330337524, 7.770010948181152, 5.818144798278809, 0.4020147919654846, 0.2080635279417038, -3.8537497520446777, -2.229783058166504, 0.8410850763320923, 1.5596709251403809, -0.7939671874046326, 0.4869135320186615, 0.0008100590202957392, -1.6491413116455078, -1.7287112474441528, -1.8115477561950684, 1.7512292861938477, 3.055027961730957, 1.867591142654419, 2.734863042831421, 2.111686944961548, -0.7517343163490295, 5.02384090423584, 4.319546699523926, 5.213986396789551, 5.21436071395874, 5.190641403198242, 4.480449676513672, 3.6517934799194336, 5.877364158630371, 4.189788341522217, 5.235416412353516, 5.155519485473633, 2.7725393772125244, 5.381101131439209, 2.8336939811706543, 1.0247656106948853, 2.690347671508789, 5.209045886993408, 4.165224552154541, 2.5942981243133545, -1.9667069911956787, 1.9036645889282227, 2.6956348419189453, 2.616560459136963, 2.1857504844665527, 2.0671610832214355, 5.291419506072998, 1.9691225290298462, 1.546148419380188, 2.2623331546783447, 1.613204836845398, 1.8738374710083008, 2.330886125564575, 1.0245407819747925, 0.4370993375778198, -4.325289726257324, 5.258477687835693, 1.0313644409179688, 1.117443323135376, 1.2593004703521729, 1.1157245635986328, 1.0128002166748047, 0.937661349773407, 0.692359447479248, 1.0423952341079712, 0.7915937304496765, 0.7418938279151917, -1.566014051437378, 5.089958667755127, -1.6445757150650024, -1.0467134714126587, -0.4334580600261688, 0.03142494335770607, -1.6122690439224243, -0.0543707013130188, 1.056473970413208, -6.1401047706604, -0.49200066924095154, -0.24462638795375824, 1.2733333110809326, 2.8084726333618164, 2.739459991455078, 2.889749526977539, 1.565711498260498, 1.4347708225250244, 0.7239013910293579, 3.0345113277435303, 5.252737998962402, 5.370234489440918, 2.5766031742095947, 2.4560861587524414, 2.05161714553833, 2.411252975463867, 5.0268659591674805, 4.689214706420898, 1.5177005529403687, 0.24555231630802155, 4.382572650909424, 3.7923269271850586, 1.7391070127487183, 0.38399314880371094, 7.753477096557617, 5.751125335693359, 0.34996873140335083, 0.21831955015659332, 1.2715792655944824, 2.1550581455230713, 1.637433409690857, 1.4867666959762573, -1.228814959526062, -1.1137611865997314, -0.38699743151664734]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0, 0.8)}}, 'et4_eta1': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 12, 1], 'bias': [-0.0026008044369518757, 0.023759836331009865, -0.024954164400696754, 0.17662985622882843, 0.13368922472000122, -0.003745823632925749, 0.08660782128572464, -0.16665630042552948, 0.08803021162748337, 0.06880437582731247, 0.2080850750207901, -0.20359952747821808, 0.5135029554367065], 'weights': [1.0251964330673218, 0.9432219862937927, -0.0820334330201149, -0.6389436721801758, -0.3155007064342499, -0.2924656271934509, -0.020791927352547646, 1.1528325080871582, 2.107461929321289, 2.2574687004089355, -2.087670087814331, -1.9684263467788696, -1.0845232009887695, -1.1545836925506592, -5.917627334594727, -2.3472442626953125, -2.384425401687622, -2.0445775985717773, -1.7059215307235718, -7.696312427520752, -5.7867913246154785, -5.58860969543457, -5.791332721710205, -5.08574914932251, -4.485403060913086, -4.859439373016357, -4.341657638549805, -5.740997791290283, -4.65217924118042, -3.9596948623657227, -1.6836967468261719, 1.4801589250564575, -3.132284164428711, -3.2424638271331787, -3.0248920917510986, -1.520330548286438, 0.900954008102417, -2.982525110244751, -3.6294922828674316, -3.0259299278259277, -0.5943242907524109, -1.8192708492279053, -5.717397212982178, 2.796595573425293, 0.3239839971065521, -6.452282428741455, -0.917125403881073, 1.2398161888122559, -1.199539303779602, 2.2845866680145264, 2.083760976791382, 3.8625245094299316, -3.4644060134887695, -1.1657593250274658, 0.22709402441978455, -1.031438946723938, -6.911469459533691, 1.969260334968567, -0.31299981474876404, -0.9276729226112366, -1.5744290351867676, 0.512809157371521, -0.0687171146273613, -3.875103235244751, -0.5436527729034424, -0.44733819365501404, 0.34765321016311646, -0.5354034304618835, 0.3033260107040405, -2.8684377670288086, -1.0951836109161377, -0.2306152880191803, 0.5077614188194275, 0.10726307332515717, -1.2207926511764526, -1.2413564920425415, -2.9442501068115234, -1.2926234006881714, -0.9796597361564636, -0.5431806445121765, -0.23998428881168365, -5.076852321624756, -5.459351539611816, -3.251709222793579, -3.8161978721618652, -0.08608277142047882, -2.73380446434021, -3.4887847900390625, -2.2211384773254395, -1.3793654441833496, 0.090150848031044, 0.15583693981170654, -6.495730876922607, -3.0528712272644043, -1.6602296829223633, -0.8064813017845154, -0.7644926309585571, -3.234057903289795, 0.05518966168165207, 0.845378577709198, -1.2251133918762207, -0.9910582304000854, 0.1137213259935379, 0.8121068477630615, 0.37160518765449524, 0.14337804913520813, 0.022148767486214638, -1.1122034788131714, -2.1749846935272217, -2.2468812465667725, 2.1103813648223877, 2.0191025733947754, 1.1914830207824707, 1.1817905902862549, 6.020692348480225, 2.291637420654297, 2.3170127868652344, 2.058645486831665, 1.7249642610549927, 7.651444435119629, 5.870999813079834, 5.3885884284973145, 5.946183681488037, 5.320845603942871, 4.460893630981445, 4.834956169128418, 4.259814262390137, 5.807432174682617, 4.7996063232421875, 3.779287576675415, 1.6268171072006226, -1.2817829847335815, 3.1548917293548584, 3.2432360649108887, 3.145568609237671, 1.5924879312515259, -0.7984192371368408, 2.853696346282959, 3.748835802078247, 3.05438232421875, 0.48264166712760925, 1.7104640007019043, 5.878546714782715, -2.7947616577148438, -0.39902082085609436, 6.383516788482666, 0.8567981123924255, -1.131406545639038, 1.395716667175293, -2.3324129581451416, -2.026764154434204, -3.7778069972991943, 3.4674205780029297, 1.1267383098602295, -0.15828856825828552, 1.019776463508606, 6.8414154052734375, -1.9757224321365356, 0.37437400221824646, 1.0116039514541626, 1.3810056447982788, -0.5017603635787964, 0.10016095638275146, 3.697732925415039, 0.6022651791572571, 0.34859874844551086, -0.20200702548027039, 0.3923362195491791, -0.2800343930721283, 2.882565975189209, 0.9871253371238708, 0.39308643341064453, -0.6089921593666077, -0.14284765720367432, 1.1342353820800781, 1.3159459829330444, 3.0907623767852783, 0.1247924417257309, 0.911798894405365, 0.6349954009056091, 0.045262888073921204, 5.072535991668701, 5.3848724365234375, 3.310866594314575, 3.766305923461914, 0.1662800908088684, 2.787860155105591, 3.375393867492676, 2.2090036869049072, 1.5013518333435059, -0.12616603076457977, -0.10926662385463715, 6.377896785736084, 3.0548548698425293, 1.7790255546569824, 0.9447789192199707, 0.6611884236335754, 3.247640609741211, -0.05340128391981125, -0.6745375990867615, 1.1099302768707275, 1.0986971855163574, -0.20162701606750488, -0.7073443531990051, -0.3732908070087433, -0.14736059308052063, -0.024858394637703896, 0.9577566385269165, 2.5017383098602295, 2.085331439971924, -2.207843065261841, -2.0857114791870117, -1.180777907371521, -1.2209975719451904, -5.892605781555176, -2.2799923419952393, -2.3057477474212646, -2.0553078651428223, -7.654836177825928, -7.512762546539307, -5.941270351409912, -5.707162380218506, -5.920308589935303, -5.096529006958008, -4.323911666870117, -4.680298805236816, -4.384183406829834, -5.889354228973389, -4.647495746612549, -3.74141263961792, -1.6859426498413086, 1.3276662826538086, -3.0246193408966064, -3.122396469116211, -3.0341885089874268, -1.4728587865829468, -1.061299204826355, -2.9632294178009033, -3.53519344329834, -3.0013208389282227, -0.5043294429779053, -1.572134256362915, -5.763169288635254, 4.467467784881592, 0.4760186970233917, -6.275606632232666, -0.8539478182792664, 1.2287415266036987, -1.2754777669906616, 2.3266050815582275, 2.0143067836761475, 3.8740429878234863, -3.43499493598938, -1.122295618057251, 0.22958852350711823, -1.0824428796768188, -6.930768013000488, 2.1717963218688965, -0.5099495649337769, -0.28866466879844666, -1.3955187797546387, 0.5555185079574585, 0.008487560786306858, -3.830439805984497, -0.6227790117263794, -0.3467789590358734, 0.19788362085819244, -0.5888499617576599, 0.5585444569587708, -6.443596839904785, -0.882118821144104, -0.6641891002655029, 0.2545921206474304, -0.011849665082991123, -0.4677331745624542, -1.1706691980361938, -2.4758248329162598, -1.2665096521377563, -0.9177460074424744, -0.5615562796592712, -0.16945156455039978, -4.842496871948242, -5.463808059692383, -3.393669843673706, -3.7802765369415283, -0.16411802172660828, -2.9243597984313965, -3.469766616821289, -1.929958462715149, -1.5249595642089844, 0.09455307573080063, 0.2940637171268463, -6.356712818145752, -2.9688708782196045, -1.7194840908050537, -0.9886189103126526, -0.8218236565589905, -3.2009527683258057, 0.061632126569747925, 0.6635765433311462, -1.2382216453552246, -0.9971335530281067, 0.019470958039164543, 0.6671754717826843, 0.3531658947467804, 0.12772180140018463, -0.05946039780974388, -1.4022151231765747, -2.53204083442688, -2.10646390914917, 2.19331955909729, 2.0382144451141357, 0.20711125433444977, 1.1339126825332642, 5.838322162628174, 2.1841650009155273, 2.322908639907837, 2.145693063735962, 1.573807716369629, 7.499920845031738, 5.714427947998047, 5.387157440185547, 5.922677516937256, 5.238670349121094, 4.401350975036621, 4.873429775238037, 4.369207859039307, 5.7771430015563965, 4.840404987335205, 3.9482839107513428, 1.808384895324707, -1.2685608863830566, 3.0990753173828125, 3.087587594985962, 3.0283801555633545, 1.5938576459884644, 1.001339316368103, 2.8978474140167236, 3.696366548538208, 3.145051956176758, 0.6527377963066101, 1.484790325164795, 5.62541389465332, -3.3827757835388184, -1.3616037368774414, 6.31757116317749, 0.8157055974006653, -1.1573904752731323, 1.4023290872573853, -2.2817232608795166, -1.9613368511199951, -3.9134373664855957, 3.5022149085998535, 1.1831471920013428, -0.13234640657901764, 1.2215951681137085, 6.950757026672363, -2.0840206146240234, 0.30289706587791443, 0.9187925457954407, 1.456176996231079, -0.6346155405044556, 0.035035520792007446, 3.731555700302124, 0.5033611059188843, 0.40924566984176636, -0.24243421852588654, 0.4083879292011261, -0.5669792294502258, 6.326224327087402, 1.074952244758606, 0.8087453842163086, -0.40509048104286194, -0.38344430923461914, 0.669874906539917, 1.2650383710861206, 2.5540072917938232, 1.1964179277420044, 0.6418784260749817, 0.5436469912528992, 0.13871504366397858, 5.06109094619751, 5.4087982177734375, 3.424656629562378, 3.82572865486145, -0.1069582849740982, 2.860503911972046, 3.3012142181396484, 1.8204606771469116, 1.488051176071167, -0.05020489543676376, -0.10891380906105042, 6.474694728851318, 3.051229953765869, 1.8003922700881958, 0.9816703796386719, 0.7326294779777527, 3.2426538467407227, -0.24795597791671753, -0.7556759715080261, -1.0224006175994873, -1.0960065126419067, 0.1724272072315216, 0.618081271648407, 0.2703900635242462, 0.161728173494339, 0.044488195329904556, -1.0469489097595215, -2.5955393314361572, -2.0356216430664062, 2.2399470806121826, 1.9626954793930054, 1.1609466075897217, 1.2922126054763794, 5.988289833068848, 2.2544703483581543, 2.410997152328491, 2.2540550231933594, 1.7642277479171753, 7.523647308349609, 5.807666778564453, 5.554626941680908, 5.7545390129089355, 5.135281562805176, 4.462368488311768, 4.680713653564453, 4.363576412200928, 5.796703815460205, 4.660062789916992, 3.772775650024414, 1.6081422567367554, -1.471457600593567, 3.0630686283111572, 3.2786765098571777, 3.0147647857666016, 1.6522928476333618, 0.9880763292312622, 2.998074769973755, 3.621058464050293, 3.078218698501587, 0.5854324698448181, 1.4462122917175293, 5.721438884735107, -2.9753527641296387, -0.5350960493087769, 6.3251423835754395, 0.8918828368186951, -1.178076148033142, 1.2798835039138794, -2.2551615238189697, -1.9484108686447144, -3.759337902069092, 3.4578652381896973, 1.2663029432296753, -0.07196418941020966, 1.2481582164764404, 7.079575538635254, -2.0389509201049805, 0.33912286162376404, 0.8573747277259827, 1.5641136169433594, -0.5602573156356812, 0.009096524678170681, 3.7935914993286133, 0.530432403087616, 0.3795877695083618, -0.29918399453163147, 0.4276634752750397, -0.7347871661186218, 2.9592950344085693, 1.0416816473007202, 0.4138214588165283, -0.5701772570610046, -0.33055979013442993, 1.2272226810455322, 1.2141225337982178, 2.643156051635742, 1.2718297243118286, 1.016147494316101, 0.48940518498420715, 0.25058063864707947, 5.002410888671875, 5.510743141174316, 3.2538001537323, 3.840313673019409, 0.045687563717365265, 2.706317186355591, 3.434723377227783, 1.7798007726669312, 1.3799846172332764, 0.031778641045093536, -0.2800126373767853, 6.452972412109375, 2.868900775909424, 1.7012298107147217, 0.9948225617408752, 0.7590370774269104, 3.325113296508789, -0.22099743783473969, -0.6587223410606384, -1.0300753116607666, -0.9809174537658691, 0.20402590930461884, 0.6747562289237976, 0.36125537753105164, 0.12726211547851562, -0.07617892324924469, -1.1187833547592163, -2.069230556488037, -2.2167840003967285, 2.0338022708892822, 2.032545804977417, 1.0873364210128784, 1.1565704345703125, 5.824941635131836, 2.3353078365325928, 2.3644630908966064, 2.2303528785705566, 7.487512588500977, 7.609893798828125, 5.867670059204102, 5.418933391571045, 5.811473369598389, 5.253249168395996, 4.464521884918213, 4.742184638977051, 4.261347770690918, 5.8816657066345215, 4.7547101974487305, 3.7690134048461914, 1.638009786605835, -1.3821550607681274, 3.147852897644043, 3.074791431427002, 3.158412218093872, 1.5820027589797974, -0.989870548248291, 3.018725633621216, 3.7248706817626953, 3.219202756881714, 0.42725083231925964, 1.8604326248168945, 5.686347007751465, -2.9643173217773438, -0.5248097777366638, 6.372659206390381, 0.981423556804657, -1.2166671752929688, 1.3060123920440674, -2.124894857406616, -2.146759271621704, -3.9191555976867676, 3.454770803451538, 1.1225602626800537, -0.11614386737346649, 1.2448756694793701, 6.994974136352539, -2.1830263137817383, 0.4231380522251129, 0.8697505593299866, 1.413941502571106, -0.44870397448539734, 0.10844480991363525, 3.7305378913879395, 0.6840401887893677, 0.3766346871852875, -0.1865873485803604, 0.5865291953086853, -0.3374776244163513, 6.403009414672852, 1.0956276655197144, 0.2733466625213623, -0.2795400619506836, -0.0930406004190445, 1.0954533815383911, 1.3384860754013062, 2.8791983127593994, 1.2319310903549194, 0.8559791445732117, 0.5842558741569519, 0.09502561390399933, 4.889835834503174, 5.443447113037109, 3.3410708904266357, 3.8299357891082764, -0.06345857679843903, 2.7926387786865234, 3.342074394226074, 2.1019814014434814, 1.304375410079956, -0.05082263797521591, -0.19152170419692993, 6.486573696136475, 2.8879756927490234, 1.724331021308899, 0.9359978437423706, 0.7728381752967834, 3.214877128601074, -0.11851073801517487, -0.6272141337394714, -1.1166294813156128, -1.1121360063552856, 0.18411636352539062, 0.8565714359283447, 0.37297323346138, 0.2280774563550949, -0.08014239370822906, -1.1548789739608765, -2.5157835483551025, -2.1218576431274414, 2.090181589126587, 2.110766649246216, 0.25221696496009827, 1.3033467531204224, 5.888796806335449, 2.25474214553833, 2.3459842205047607, 2.2046945095062256, 1.7174043655395508, 7.515282154083252, 5.754991054534912, 5.4150590896606445, 5.750059604644775, 5.159801483154297, 4.490351676940918, 4.875675201416016, 4.433055400848389, 5.792463779449463, 4.742518901824951, 3.9737443923950195, 1.6564021110534668, -1.4862838983535767, 2.996591567993164, 3.0679144859313965, 3.0173676013946533, 1.498238205909729, 1.094964623451233, 2.8488383293151855, 3.54923152923584, 3.013619899749756, 0.6003484129905701, 1.4759414196014404, 5.80795431137085, -4.4330058097839355, -1.442448616027832, 6.30916166305542, 0.8557291626930237, -1.2023191452026367, 1.2114955186843872, -2.3411848545074463, -1.9778631925582886, -3.8773550987243652, 3.48359751701355, 1.235430121421814, -0.16218973696231842, 1.0505543947219849, 6.992342472076416, -2.062955856323242, 0.38860073685646057, 0.8495431542396545, 1.4897562265396118, -0.4594704806804657, -0.010513165034353733, 3.9040799140930176, 0.671775221824646, 0.3353697657585144, -0.152586430311203, 0.42900630831718445, -0.6769211888313293, 6.255993843078613, 0.9770820140838623, 0.6344008445739746, -0.29145246744155884, -0.0953483060002327, 0.4649762213230133, 1.3594809770584106, 2.630267858505249, 1.272966980934143, 0.6785493493080139, 0.6704978346824646, 0.1687568873167038, 4.839813709259033, 5.330307960510254, 3.4490129947662354, 3.898158311843872, 0.10544763505458832, 2.700875997543335, 3.4022860527038574, 1.733189582824707, 1.427066445350647, -0.005441879853606224, -0.14965549111366272, 6.34743070602417, 3.063389778137207, 1.6905919313430786, 0.7814001441001892, 0.6579870581626892, 3.2099287509918213, -0.18618665635585785, -0.6988555788993835, 1.2149035930633545, 1.16795015335083, -0.22200945019721985, -0.7959122061729431, -0.41466668248176575, -0.14860273897647858, -0.1382313370704651, 1.0391335487365723, 2.4784133434295654, 2.249746084213257, -2.249352216720581, -2.0874972343444824, -0.4213871955871582, -1.1359636783599854, -6.009669303894043, -2.2226104736328125, -2.303112745285034, -2.1491024494171143, -1.5654852390289307, -7.577459812164307, -5.866010665893555, -5.474373817443848, -5.7755351066589355, -5.3064141273498535, -4.283693313598633, -4.689141750335693, -4.359087944030762, -5.8824143409729, -4.778071403503418, -3.740812301635742, -1.6160691976547241, 1.3038142919540405, -2.953028917312622, -3.0940487384796143, -3.118048667907715, -1.4443928003311157, -1.0324426889419556, -2.952965021133423, -3.6631109714508057, -2.997539758682251, -0.5683349967002869, -1.5038022994995117, -5.759454250335693, 2.8457465171813965, 0.39161112904548645, -6.390697002410889, -0.9834965467453003, 1.1485999822616577, -1.2466212511062622, 2.3544962406158447, 2.1072490215301514, 3.9213242530822754, -3.5204172134399414, -1.122330665588379, 0.06938106566667557, -1.1259019374847412, -6.937899112701416, 2.034280776977539, -0.30871596932411194, -0.8398390412330627, -1.530687928199768, 0.5888699293136597, -0.1530705839395523, -3.8922629356384277, -0.5593338012695312, -0.3847090005874634, 0.1662748008966446, -0.49479353427886963, 0.768643319606781, -6.365362167358398, -1.0220333337783813, -0.3567352294921875, 0.5736306309700012, 0.30605846643447876, -0.5093892812728882, -1.348019003868103, -2.491082191467285, -1.1999591588974, -0.9373847842216492, -0.5462061762809753, -0.07326000928878784, -5.006946563720703, -5.399425506591797, -3.3811516761779785, -3.707012176513672, 0.05647135525941849, -2.717548370361328, -3.4018797874450684, -1.9244493246078491, -1.3546781539916992, 0.024731269106268883, 0.1626574695110321, -6.39082670211792, -2.962495803833008, -1.675119161605835, -0.9574204683303833, -0.6156238913536072, -3.189774513244629, 0.18502198159694672, 0.8421322703361511, -1.0222623348236084, -1.143153190612793, 0.013463378883898258, 0.7491047978401184, 0.40147027373313904, 0.1811993420124054, 0.007847269997000694, -0.9783915281295776, -2.4940969944000244, -2.2550060749053955, 2.1688249111175537, 1.9139608144760132, 1.2336885929107666, 1.1167418956756592, 6.020171642303467, 2.2349677085876465, 2.510181188583374, 2.1606338024139404, 1.6287041902542114, 7.620609760284424, 5.948932647705078, 5.5473527908325195, 5.7792582511901855, 5.19249963760376, 4.373182773590088, 4.7597150802612305, 4.292849063873291, 5.758368015289307, 4.848705291748047, 3.81451678276062, 1.6483118534088135, -1.27611243724823, 3.051095724105835, 3.153315305709839, 3.131603240966797, 1.5296975374221802, 1.1238890886306763, 3.039480209350586, 3.573584794998169, 3.0737369060516357, 0.6491555571556091, 1.5693223476409912, 5.661680698394775, -3.2437689304351807, -0.3457508385181427, 6.303846836090088, 1.008841872215271, -1.1312384605407715, 1.4068719148635864, -2.2654953002929688, -2.0463144779205322, -3.7327847480773926, 3.446826457977295, 1.186560034751892, -0.22988276183605194, 1.141365885734558, 7.072263717651367, -2.0258939266204834, 0.43570128083229065, 1.0452723503112793, 1.3772087097167969, -0.43007585406303406, 0.15063299238681793, 3.836416244506836, 0.5418192148208618, 0.36403244733810425, -0.37238746881484985, 0.5682949423789978, -0.7023680806159973, 6.305296897888184, 0.936163067817688, 0.6358593106269836, -0.5677419304847717, -0.037809114903211594, 0.6699109673500061, 1.1641978025436401, 2.4565916061401367, 1.3862637281417847, 1.0064929723739624, 0.663727343082428, 0.11298004537820816, 4.901421546936035, 5.477721214294434, 3.346855878829956, 3.9012832641601562, 0.09644961357116699, 2.699148654937744, 3.494945526123047, 1.8501867055892944, 1.4628239870071411, 0.038194455206394196, -0.15482884645462036, 6.422201633453369, 3.023418426513672, 1.627535104751587, 0.9708508253097534, 0.6563124656677246, 3.1716485023498535, -0.09765737503767014, -0.7356085181236267, -1.2632811069488525, -0.9757750630378723, 0.1456412822008133, 0.7715763449668884, 0.3869102895259857, 0.27734893560409546, 0.07526598870754242, -0.9762293100357056, -2.561676263809204, -2.1265580654144287, 2.0286896228790283, 2.075723648071289, 1.1403844356536865, 1.2498040199279785, 5.931168556213379, 2.2029151916503906, 2.445253610610962, 2.15519118309021, 1.7489018440246582, 7.525898456573486, 5.800742149353027, 5.486359596252441, 5.953525066375732, 5.093734264373779, 4.458773136138916, 4.86409854888916, 4.24324369430542, 5.968506336212158, 4.754179954528809, 3.927828073501587, 1.6784312725067139, -1.3647832870483398, 3.084916353225708, 3.0687427520751953, 3.021444082260132, 1.5372239351272583, -0.8383357524871826, 3.0406997203826904, 3.5715415477752686, 3.0177345275878906, 0.5319532752037048, 1.7094852924346924, 5.823647499084473, -1.0495877265930176, -0.3313985764980316, 6.320600986480713, 1.0248901844024658, -1.1935510635375977, 1.4299181699752808, -2.140989065170288, -1.9564642906188965, -3.869663715362549, 3.498605489730835, 1.2037980556488037, -0.2191070020198822, 1.031865119934082, 6.947019100189209, -2.052544355392456, 0.2894705533981323, 0.8137699961662292, 1.4521355628967285, -0.5344530344009399, 0.07733277976512909, 3.698293447494507, 0.5997402667999268, 0.4596594274044037, -0.2561136782169342, 0.4026574194431305, -0.23997922241687775, 2.909172296524048, 0.9613901972770691, 0.22444286942481995, -0.5839609503746033, -0.141954243183136, 1.2224074602127075, 1.1505941152572632, 3.029334306716919, 1.3948553800582886, 0.9423107504844666, 0.6071872115135193, 0.23435761034488678, 4.915351390838623, 5.523367881774902, 3.2731335163116455, 3.685584545135498, -0.09336978197097778, 2.7627980709075928, 3.400871753692627, 1.8804012537002563, 1.3919806480407715, -0.04051085561513901, -0.2965579926967621, 6.4938483238220215, 2.8596763610839844, 1.5941591262817383, 0.8535481691360474, 0.8350687623023987, 3.2666754722595215, -0.1337282806634903, -0.7185978293418884, -0.4881719648838043, -2.3726656436920166, -0.1354139745235443, 0.41007015109062195, 0.22356638312339783, -0.11823854595422745, -0.04191459342837334, -0.20573462545871735, -1.1697183847427368, -1.0426634550094604, 0.8915672302246094, 4.2851715087890625, 2.458414077758789, 0.4938039481639862, 2.54923677444458, 0.9368886351585388, 1.120974063873291, 0.9774313569068909, 0.5055680871009827, 0.5286432504653931, 0.3642200827598572, 0.3323996067047119, 0.3324313163757324, 0.3339304029941559, 0.2565600275993347, 0.3400682210922241, 0.2231311798095703, 0.28890615701675415, 0.2303858995437622, 0.34407180547714233, 0.0006176748429425061, -0.3528464138507843, 0.20983506739139557, 0.2752494513988495, 0.1491883099079132, -0.009164920076727867, -0.24076879024505615, 0.07223982363939285, 0.0933871790766716, 0.19664359092712402, -0.020693277940154076, 0.03396375849843025, 0.489976704120636, -0.520698070526123, -0.2676529884338379, 0.385456919670105, -0.014354963786900043, -0.34748488664627075, -0.11984354257583618, -0.23356299102306366, -0.32783278822898865, -0.4992142915725708, 0.13648895919322968, 0.035519491881132126, -0.03337791934609413, 0.037562187761068344, 0.481515109539032, -0.3812156915664673, -0.010612674988806248, -0.018269475549459457, -0.05347813665866852, -0.2457127869129181, -0.04255553334951401, 0.10038922727108002, -0.15478916466236115, -0.17115379869937897, -0.15568377077579498, -0.04182932898402214, -0.15703913569450378, 0.4969960153102875, -0.12685450911521912, -0.12540540099143982, -0.35101842880249023, -0.20803843438625336, 0.39255017042160034, 0.3747952878475189, 0.09777461737394333, -0.2392813116312027, -0.03150489926338196, -0.09006363898515701, -0.23807393014431, 0.2210400551557541, -0.08718837797641754, -0.3871171474456787, 0.321759968996048, -0.281955748796463, 0.03998880833387375, -0.21555903553962708, 0.015326566062867641, -0.292760968208313, -0.024461526423692703, -0.14458686113357544, 0.4250515103340149, -0.07795492559671402, 0.08229611814022064, -0.022558560594916344, -0.18561464548110962, 0.08742937445640564, -0.19600357115268707, -0.17274850606918335, 1.1634411811828613, 1.2061887979507446, -0.19250428676605225, -0.6789903044700623, -0.30788543820381165, -0.20130446553230286, -1.0433489084243774, 1.390351414680481, 2.482160806655884, 2.165520191192627, -2.07529354095459, -2.054067373275757, -0.29039350152015686, -1.236459732055664, -5.964238166809082, -2.2441792488098145, -2.45337176322937, -2.135784864425659, -1.5322444438934326, -7.596198558807373, -5.77870512008667, -5.447120189666748, -5.762230396270752, -5.238992691040039, -4.4324631690979, -4.795217037200928, -4.31515645980835, -5.803284645080566, -4.644556999206543, -3.9494428634643555, -1.653674602508545, 1.3703794479370117, -3.1389079093933105, -3.086665391921997, -3.2554705142974854, -1.569161057472229, -1.0932494401931763, -3.013335943222046, -3.7027854919433594, -3.0392394065856934, -0.46050825715065, -1.3539319038391113, -5.78314733505249, 4.504164218902588, 1.295868992805481, -6.35349178314209, -0.7676976919174194, 1.2128064632415771, -1.447594404220581, 2.352041482925415, 2.1511385440826416, 3.82316255569458, -3.5111002922058105, -1.0806256532669067, 0.28926995396614075, -1.0196740627288818, -7.01775598526001, 2.047482490539551, -0.36901941895484924, -1.0376707315444946, -1.4746229648590088, 0.47547033429145813, -0.032845646142959595, -3.770587682723999, -0.680832028388977, -0.31705182790756226, 0.20884990692138672, -0.43002697825431824, 0.7914168238639832, -6.346975326538086, -1.1404894590377808, -0.27313899993896484, 0.49594825506210327, 0.30991673469543457, -0.6608273983001709, -1.233864665031433, -2.682706594467163, -1.387099266052246, -0.820092499256134, -0.6983631253242493, -0.2783139646053314, -5.068745136260986, -5.402896881103516, -3.325408697128296, -3.7116191387176514, 0.019110050052404404, -2.8012444972991943, -3.5018301010131836, -1.6971172094345093, -1.5141593217849731, -0.02155645191669464, 0.19456034898757935, -6.412229537963867, -2.8730740547180176, -1.7730263471603394, -0.8825761675834656, -0.7100264430046082, -3.229623317718506, 0.111324243247509, 0.7550041079521179, 0.5229239463806152, -0.3934052884578705, 0.4494021236896515, -1.2844314575195312, -1.1461303234100342, -0.9471862316131592, -0.48184508085250854, 1.5868885517120361, -1.0619027614593506, -0.7419309020042419, -2.942476749420166, 0.9977480173110962]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (0.8, 1.37)}}, 'et4_eta2': {'discriminator': {'threshold': 0.61499847173690791, 'nodes': [100, 5, 1], 'bias': [0.1416495442390442, 0.0917273536324501, 0.14888767898082733, -0.04687773063778877, 0.033612411469221115, 0.0564887635409832], 'weights': [0.581756591796875, -0.38689595460891724, -1.4645912647247314, -1.4333598613739014, -1.581018090248108, -1.115908145904541, 0.5698398947715759, -1.247531771659851, 0.12504728138446808, 2.482370376586914, 2.431360960006714, 2.273602247238159, 0.37852540612220764, 0.144611194729805, 0.040073834359645844, 0.2846015393733978, -2.8518881797790527, 0.0757441371679306, -0.33886414766311646, -1.1692278385162354, -3.2619733810424805, -4.886256694793701, 0.09398651123046875, -1.1386778354644775, -2.8565423488616943, -1.5504562854766846, -6.6825714111328125, -1.9303826093673706, -18.234264373779297, -2.8824312686920166, -1.2814736366271973, -2.142577648162842, -1.3583049774169922, -0.9495894312858582, -1.7242447137832642, -1.485337257385254, -9.032512664794922, -2.11647629737854, -2.000075578689575, -0.1717694103717804, -1.7989602088928223, -4.064884185791016, -2.4997408390045166, -1.9638032913208008, -1.3527863025665283, -2.530980110168457, -2.6757166385650635, -1.3389031887054443, 0.7322706580162048, -1.6147764921188354, -1.5603357553482056, -1.411029577255249, -4.707601070404053, -2.0605554580688477, -1.182787537574768, 0.3247404396533966, -1.654233455657959, -1.4792747497558594, 1.4332225322723389, -1.4648306369781494, 3.4037587642669678, -0.7914804220199585, -1.3773428201675415, -0.9748098254203796, -1.7981112003326416, -1.2366503477096558, -2.1252827644348145, -1.2274694442749023, -1.133897066116333, -1.336310863494873, -1.3621219396591187, 0.46997955441474915, 0.03448684513568878, 0.2173086404800415, -3.024440288543701, -2.6741464138031006, -2.740393877029419, -2.1167993545532227, -1.9065232276916504, -1.273890733718872, 0.15699931979179382, -0.6674656867980957, -3.8054914474487305, -2.7867767810821533, 0.14551353454589844, 5.9104132652282715, -1.6494784355163574, -1.493892788887024, 0.41633859276771545, -1.3532004356384277, -1.2799110412597656, -1.1865214109420776, -12.882661819458008, -2.708534002304077, -2.3703911304473877, -1.3462586402893066, -0.04463225230574608, 0.0634172260761261, -0.14307387173175812, -0.7493860721588135, 0.624331533908844, -0.3319099545478821, -1.4028029441833496, -1.432462453842163, -1.650894284248352, -1.1406965255737305, 0.6025397181510925, -1.2855747938156128, 0.19959670305252075, 2.4982616901397705, 2.2735466957092285, 2.4246840476989746, 0.4553634226322174, 0.08936864137649536, 0.1311582624912262, 0.39617517590522766, -2.7375380992889404, 0.1265452355146408, -0.4928475022315979, -1.3645174503326416, -3.450955390930176, -5.069662570953369, 6.010491847991943, -1.1299443244934082, -2.9162395000457764, -1.3828439712524414, -6.523721218109131, -1.9435957670211792, -18.175365447998047, -4.8544697761535645, -1.2547545433044434, -2.0425124168395996, -1.295743465423584, -1.1035903692245483, -1.6218727827072144, -1.4932665824890137, -8.968793869018555, -1.9807897806167603, -2.0454328060150146, -0.27600958943367004, -1.8898911476135254, -4.025547504425049, -2.6954073905944824, -1.9785104990005493, -1.3680779933929443, -2.6349480152130127, -2.5782358646392822, -1.4823532104492188, 0.8074877858161926, -1.6718937158584595, -1.6565669775009155, -1.4112842082977295, -4.705615520477295, -2.0217299461364746, -1.1736942529678345, 0.2864823639392853, -1.6903040409088135, -1.5538396835327148, 1.3823657035827637, -1.4413871765136719, 3.3367693424224854, -0.8150039315223694, -1.2524248361587524, -0.9798521399497986, -1.7331271171569824, -1.2518690824508667, -2.1376397609710693, -1.3412749767303467, -1.2559378147125244, -1.1515171527862549, -1.3376590013504028, -0.5129407644271851, 0.4098140299320221, 0.32758745551109314, -3.0089964866638184, -2.708430767059326, -2.7736716270446777, -2.0044891834259033, -1.8417493104934692, -1.360335111618042, -0.03031604364514351, -0.6983081102371216, -3.8915762901306152, -2.7295982837677, 0.15288233757019043, 5.834036350250244, -1.6299433708190918, -1.5219801664352417, 0.507905125617981, -1.1420137882232666, -1.283940315246582, -1.1613298654556274, -12.937507629394531, -2.830153703689575, -2.3496272563934326, -1.3355052471160889, 0.0610378123819828, 0.07120959460735321, -0.24674025177955627, -0.5232481956481934, -0.7768791913986206, -0.04269222542643547, 0.37302982807159424, 0.3743942975997925, 0.5956953167915344, 0.41626232862472534, -0.3297511339187622, 0.22902551293373108, 0.02797701582312584, -1.0573911666870117, -1.0043467283248901, -0.8652474880218506, -0.7001688480377197, 0.22859597206115723, 0.2892363667488098, -0.39173272252082825, 1.0319538116455078, 0.13310158252716064, -0.08140266686677933, 0.29927441477775574, 1.4145119190216064, 2.0886285305023193, -0.22144514322280884, 0.4602801203727722, 1.1516647338867188, 0.565574586391449, 2.883911609649658, 0.7410096526145935, 8.241190910339355, 1.2128138542175293, 0.3351460099220276, 0.8095336556434631, 0.5186111330986023, 0.23221103847026825, 0.6689755916595459, 0.5271771550178528, 4.032434463500977, 0.7397922873497009, 0.7466270923614502, -0.038530126214027405, 0.7031628489494324, 1.7122201919555664, 0.9707109332084656, 0.679175615310669, 0.39778760075569153, 1.142361044883728, 1.1290290355682373, 0.45476406812667847, -0.5605642199516296, 0.7049155235290527, 0.5497601628303528, 0.4192332625389099, 1.94161057472229, 0.9260550737380981, 0.4753219485282898, -0.17405633628368378, 0.6759582161903381, 0.5302416682243347, -0.8510857820510864, 0.5060176253318787, -1.5695650577545166, 0.1299366056919098, 0.3747384548187256, 0.3956664204597473, 0.6052114367485046, 0.5236614942550659, 0.7338953614234924, 0.3463488519191742, 0.3284866511821747, 0.42990943789482117, 0.5080832242965698, -0.29795873165130615, -0.2717497944831848, -0.2828475832939148, 1.294087529182434, 1.086865782737732, 1.210087537765503, 0.8098084926605225, 0.8012542724609375, 0.3895547688007355, 0.33182236552238464, 0.04182581603527069, 1.5352742671966553, 1.1779708862304688, -0.26449793577194214, -2.7262187004089355, 0.5978327393531799, 0.6218563914299011, -0.7817511558532715, 0.48067569732666016, 0.32804039120674133, -0.1880754977464676, 5.819159030914307, 1.0537340641021729, 0.9694578647613525, 0.32649025321006775, -0.0868649110198021, 0.1041400209069252, -0.1043575257062912, 0.1182376891374588, -0.6229959726333618, 0.16744478046894073, 1.3969554901123047, 1.2333827018737793, 1.5443974733352661, 0.947704017162323, -0.42188408970832825, 1.1320701837539673, -0.07529882341623306, -2.5634045600891113, -2.3602521419525146, -2.198295831680298, -0.531038224697113, -0.14220385253429413, -0.14005814492702484, -0.39447101950645447, 2.8902058601379395, 0.010370515286922455, 0.337504506111145, 1.23195219039917, 3.447141170501709, 5.030959606170654, -0.23326095938682556, 1.1086513996124268, 2.8516478538513184, 1.436439037322998, 6.618173599243164, 2.040743827819824, 18.237911224365234, 3.074505567550659, 1.4356138706207275, 2.1096386909484863, 1.1413476467132568, 1.0334633588790894, 1.7350581884384155, 1.4775125980377197, 8.950813293457031, 2.029491901397705, 1.8650645017623901, 0.151828795671463, 1.8766956329345703, 4.003612518310547, 2.552476167678833, 2.1347784996032715, 1.2965524196624756, 2.4863617420196533, 2.491069793701172, 1.459900975227356, -0.8224032521247864, 1.727763295173645, 1.6051439046859741, 1.6376934051513672, 4.719537734985352, 2.2118425369262695, 1.1336716413497925, -0.3403971493244171, 1.6888728141784668, 1.6115145683288574, -1.3358869552612305, 1.505746841430664, -3.32519793510437, 0.7972029447555542, 1.380665898323059, 1.082166314125061, 1.8903379440307617, 1.2481564283370972, 2.227444887161255, 1.2353661060333252, 1.3041725158691406, 1.3060925006866455, 1.3527084589004517, -0.46772220730781555, -0.5223127603530884, -0.2103305160999298, 2.9519202709198, 2.769545316696167, 2.7390973567962646, 2.1053855419158936, 1.9840058088302612, 1.3140904903411865, -0.05805663391947746, 0.5440028309822083, 3.826601982116699, 2.651902437210083, -0.12031984329223633, -5.935788631439209, 1.5015780925750732, 1.5563565492630005, -0.555227518081665, 1.3052659034729004, 1.1375374794006348, 1.1288236379623413, 12.837820053100586, 2.815237045288086, 2.1742961406707764, 1.1478896141052246, -0.08291198313236237, 0.08840353786945343, 0.19835461676120758, 0.5463638305664062, 0.4496197998523712, -0.15365897119045258, -1.303152322769165, -1.4211831092834473, -1.6294633150100708, -1.1218407154083252, 0.513221025466919, -1.0979574918746948, 0.03863683342933655, 2.535245418548584, 2.413844347000122, 2.2838621139526367, 0.3961125910282135, -0.07022036612033844, 0.11505560576915741, 0.38931742310523987, -2.9232537746429443, 0.16309437155723572, -0.2143958956003189, -1.178619384765625, -3.444204807281494, -4.952271938323975, 6.059645175933838, -1.0870082378387451, -2.7587931156158447, -1.5785882472991943, -6.752011299133301, -2.0239031314849854, -18.183874130249023, -3.0692338943481445, -1.4014091491699219, -1.9880406856536865, -1.363227367401123, -0.9414331316947937, -1.560322880744934, -1.5435211658477783, -9.025472640991211, -2.004357099533081, -1.9044069051742554, -0.2705972492694855, -1.8722727298736572, -3.9819154739379883, -2.5931248664855957, -2.024343967437744, -1.0690704584121704, -2.6245663166046143, -2.6267261505126953, -1.3086411952972412, 0.9304255843162537, -1.7328647375106812, -1.5346494913101196, -1.6334125995635986, -4.653397083282471, -2.088351249694824, -1.1151939630508423, 0.23838695883750916, -1.7149772644042969, -1.4859371185302734, 1.2581639289855957, -1.470367431640625, 3.2151098251342773, -0.8481677174568176, -1.4646252393722534, -1.1731973886489868, -1.8418259620666504, -1.3983176946640015, -2.143547296524048, -1.26896071434021, -1.1882612705230713, -1.2540905475616455, -1.2641340494155884, -0.451155424118042, 0.6385239362716675, 0.2657028138637543, -2.9695358276367188, -2.645637035369873, -2.829376220703125, -2.0177202224731445, -1.8429359197616577, -1.4030251502990723, 0.047014832496643066, -0.5733755826950073, -3.9187021255493164, -2.751581907272339, -0.026499062776565552, 5.869612216949463, -1.6958210468292236, -1.4883424043655396, 0.3736911714076996, -1.3362948894500732, -1.2750811576843262, -0.1901623010635376, -12.92725944519043, -2.795802593231201, -2.3234610557556152, -1.1962645053863525, -0.055261313915252686, 0.0872664824128151, -0.27287760376930237, -0.5760724544525146, 1.1626110076904297, 0.5277957320213318, -0.3125312030315399, -3.901346206665039, 2.7279491424560547]}, 'datecode': '2016-10-18 17:04', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (50, 500000), 'etaBin': (1.37, 1.54)}}, 'et2_eta1': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 5, 1], 'bias': [0.25435444712638855, 0.24932298064231873, 0.1606546938419342, 0.17509008944034576, 0.25274309515953064, -0.1329682171344757], 'weights': [2.34734845161438, 2.2353413105010986, -1.4175097942352295, -2.0679333209991455, -1.7088115215301514, -1.090505599975586, -0.9405161738395691, 0.07812463492155075, 3.223778486251831, 4.487850189208984, -1.621321439743042, -18.826236724853516, -3.515526056289673, -5.319347381591797, -4.333478927612305, -16.02056312561035, -14.881732940673828, -15.005784034729004, -29.321186065673828, -12.3950777053833, -6.208489418029785, -5.976852893829346, -5.684929847717285, -4.873940467834473, -5.227859973907471, -4.900532245635986, -5.202627182006836, -5.217679977416992, -5.026147842407227, -5.188652515411377, -3.006340742111206, -3.6230204105377197, -5.149136543273926, -3.7510833740234375, -3.32551908493042, -3.5563111305236816, -3.6126794815063477, -4.35263729095459, -3.3301844596862793, -3.2909648418426514, -3.1816136837005615, -3.1273691654205322, -5.119664192199707, -2.3374550342559814, -2.3226845264434814, 1.0537031888961792, -2.0353944301605225, -2.8840839862823486, -1.0816434621810913, -1.2895511388778687, -1.4665906429290771, -1.879166603088379, -0.6715376377105713, -0.9060519337654114, -3.2911500930786133, -1.6601240634918213, -1.2586548328399658, 0.7846032381057739, -1.4076411724090576, 2.3761954307556152, -0.0068921297788619995, -0.8526430726051331, -1.4239529371261597, -0.9651980400085449, -0.3084358870983124, -2.6593523025512695, -4.51272439956665, -3.846759080886841, -0.264786958694458, -3.1015594005584717, -1.8586152791976929, 1.2396572828292847, 0.4872204065322876, 0.31810009479522705, -2.1604723930358887, -1.9867172241210938, -3.048135757446289, -2.8708887100219727, -1.8841103315353394, -1.1307868957519531, -8.395145416259766, -8.912646293640137, -6.91707706451416, -4.316050052642822, -3.7324368953704834, -3.8086652755737305, -3.946287155151367, -4.903172016143799, -3.338960647583008, -1.9490082263946533, -0.4464111030101776, -0.01041414961218834, -5.482597351074219, -4.337868690490723, -2.302276849746704, -0.5417815446853638, -5.261777400970459, -3.6287102699279785, -2.8670549392700195, -1.1715818643569946, 2.4082601070404053, 2.3155205249786377, -1.30961275100708, -2.0798983573913574, -1.7543258666992188, -0.8788909912109375, -0.9141046404838562, 0.11732571572065353, 3.244760513305664, 4.5515618324279785, -0.570267915725708, -18.782840728759766, -3.6088829040527344, -5.332759857177734, -4.539529323577881, -16.06619644165039, -14.936424255371094, -15.030831336975098, -29.28931427001953, -13.075589179992676, -6.093319892883301, -5.8231916427612305, -5.667521953582764, -4.899781227111816, -5.190850734710693, -4.793137073516846, -4.966039657592773, -5.124669075012207, -4.944052696228027, -5.175408840179443, -3.154536008834839, -3.728513479232788, -5.0548858642578125, -3.758059501647949, -3.194476842880249, -3.508413553237915, -3.485253095626831, -4.196972370147705, -3.2448697090148926, -3.141759157180786, -3.1605613231658936, -3.1169254779815674, -5.169933795928955, -2.4049296379089355, -2.323885679244995, 1.0402504205703735, -2.150291919708252, -2.9381868839263916, -1.1183582544326782, -1.384813666343689, -1.6520863771438599, -1.8024953603744507, 1.1591219902038574, -0.8256304860115051, -3.2385435104370117, -1.8150010108947754, -1.3193364143371582, 0.8193210363388062, -1.221009373664856, 2.3958117961883545, 0.03928287327289581, -1.0275776386260986, -1.508032202720642, -1.0758867263793945, -0.2418442666530609, -2.61417818069458, -4.577299118041992, -3.6503682136535645, -0.31244587898254395, -3.081012010574341, -1.7621029615402222, 1.1646537780761719, 0.2716709077358246, 0.3604987859725952, -2.0217785835266113, -1.954727053642273, -3.020965814590454, -2.881538152694702, -1.9082502126693726, -1.1385557651519775, -8.499287605285645, -9.120352745056152, -6.841338634490967, -4.365355968475342, -3.611335515975952, -3.687152624130249, -3.9019813537597656, -5.091282367706299, -3.431231737136841, -1.9277317523956299, -0.3656170070171356, -0.05825749784708023, -5.426592826843262, -4.340138912200928, -2.459061861038208, -0.41598108410835266, -5.220657825469971, -3.601567029953003, -2.795365333557129, -1.1763371229171753, 2.811112642288208, 2.5227930545806885, -1.444344401359558, -1.5754635334014893, -1.0973962545394897, -0.7491856813430786, -0.9243454337120056, 0.13079145550727844, 3.151118040084839, 6.790395736694336, 0.32513368129730225, -12.827497482299805, -2.957951307296753, -1.7616462707519531, -4.232787609100342, -1.8743022680282593, -1.7567611932754517, -4.316827774047852, 3.419816017150879, -12.018769264221191, -5.7668023109436035, -5.60882568359375, -5.372860431671143, -5.002426624298096, -5.05574893951416, -4.7270708084106445, -5.024880886077881, -5.097719192504883, -5.005908012390137, -4.997485160827637, -3.166358470916748, -3.670208692550659, -5.238664150238037, -3.728379964828491, -3.17771315574646, -3.393096685409546, -3.891113758087158, -4.192734718322754, -3.3598718643188477, -3.155097246170044, -3.2248013019561768, -2.271979570388794, -5.302158832550049, -2.368779420852661, -2.420971155166626, 0.9169970154762268, -2.1893346309661865, -2.8826770782470703, -1.17876136302948, -1.3448166847229004, -1.0073626041412354, -1.7319085597991943, 1.0225878953933716, -0.9852231740951538, -3.2627015113830566, -1.6896803379058838, -1.3609062433242798, 1.10788893699646, -2.0538289546966553, 2.2444591522216797, 0.12137456238269806, 0.04628625884652138, -1.3568137884140015, -0.4794471263885498, -0.407931923866272, -1.2879277467727661, -4.405134677886963, -3.6737868785858154, -0.03872992843389511, -1.610177755355835, -1.7973215579986572, 1.3261101245880127, 0.4872419834136963, 0.4436241090297699, -1.4046887159347534, -2.079847574234009, -3.0631580352783203, -2.9221057891845703, -1.6201002597808838, -0.9972444176673889, -8.556312561035156, -9.002589225769043, -6.866401672363281, -3.0796523094177246, -3.6062872409820557, -3.7342910766601562, -3.9350335597991943, -4.882983207702637, -3.3224947452545166, -1.918792486190796, -0.5560785531997681, -0.13559351861476898, -5.573633670806885, -4.131962776184082, -2.367072582244873, -0.47103238105773926, -5.332761764526367, -3.6747207641601562, -2.871645450592041, -0.8256722092628479, 2.941892623901367, 2.502934455871582, -1.269112467765808, -1.4101308584213257, -1.1652023792266846, -0.800626277923584, -0.7536101937294006, 0.2163701355457306, 3.268038034439087, 6.86021614074707, 0.5129356980323792, -12.83459758758545, -3.1473758220672607, -1.8621606826782227, -4.232149124145508, -1.869612216949463, -1.7273067235946655, -4.113978385925293, 3.2919187545776367, -12.167437553405762, -5.740009784698486, -5.786488056182861, -5.412658214569092, -5.016499042510986, -5.11262321472168, -4.823041915893555, -5.151134014129639, -4.983872413635254, -4.937246799468994, -5.064393997192383, -3.193347454071045, -3.7103846073150635, -5.0858235359191895, -3.9251208305358887, -3.2472145557403564, -3.500729560852051, -3.899669885635376, -4.331266403198242, -3.426748037338257, -3.2863588333129883, -3.291468620300293, -2.3030073642730713, -5.200867652893066, -2.385159730911255, -2.3903801441192627, 1.0167884826660156, -2.19888973236084, -2.824765205383301, -1.1157466173171997, -1.2426419258117676, -1.1002538204193115, -1.6497070789337158, 1.186728835105896, -0.8782953023910522, -3.1967155933380127, -1.8226830959320068, -1.347823977470398, 0.9099755883216858, -2.451645612716675, 2.3240644931793213, -0.005819007754325867, -0.003381119342520833, -1.3195263147354126, -0.6934226751327515, -0.41471731662750244, -1.31814444065094, -4.533324718475342, -3.6912612915039062, 0.03214214742183685, -1.5663814544677734, -1.7064321041107178, 1.3282749652862549, 0.4978797733783722, 0.36116692423820496, -1.4167730808258057, -2.0364906787872314, -3.0129506587982178, -2.945878505706787, -1.5209360122680664, -1.123647928237915, -8.717535018920898, -8.99514102935791, -6.908481597900391, -4.345072269439697, -3.7309775352478027, -3.7125165462493896, -4.065122604370117, -4.99635648727417, -3.3609871864318848, -2.0716211795806885, -0.5877062082290649, -0.0616493858397007, -5.53644323348999, -4.132359504699707, -2.267481565475464, -0.44276005029678345, -5.357322692871094, -3.701948642730713, -2.858717203140259, -1.1447056531906128, 2.38533878326416, 2.5263023376464844, -1.270406723022461, -1.2259048223495483, -1.5087919235229492, -0.7332354784011841, -0.8843678832054138, 0.2249567210674286, 2.7270829677581787, 6.839478015899658, 0.36457327008247375, -12.985332489013672, -13.488051414489746, -2.212155818939209, -4.179521560668945, -10.305965423583984, -2.2630205154418945, -4.2650322914123535, 3.2165136337280273, -12.161434173583984, -5.455844402313232, -5.790342807769775, -5.330578804016113, -4.849613666534424, -5.01917839050293, -4.6553425788879395, -5.030160903930664, -5.154499053955078, -5.052484035491943, -5.025943279266357, -3.1107544898986816, -3.723585367202759, -5.083714485168457, -3.817638397216797, -3.2068088054656982, -3.535679578781128, -3.960758686065674, -4.185840129852295, -3.404463768005371, -3.181771993637085, -3.163426160812378, -2.4307937622070312, -5.159397602081299, -2.318039655685425, -2.4280123710632324, 1.109175682067871, -2.16939640045166, -2.7949440479278564, -1.0821527242660522, -1.2902882099151611, -1.1317893266677856, -1.7080326080322266, 1.100637435913086, -0.8294426202774048, -3.341434955596924, -1.7753850221633911, -1.189115285873413, 0.8867673873901367, -2.335678815841675, 2.3658251762390137, 0.13740785419940948, -0.8321027755737305, -2.6740853786468506, -0.5717334151268005, -0.34603822231292725, -1.2502217292785645, -4.402581691741943, -3.685314655303955, -0.3322296738624573, -1.413826584815979, -1.8322283029556274, 1.199074149131775, 0.28668448328971863, 0.3135620355606079, -1.1069045066833496, -2.049344778060913, -3.238943576812744, -3.0058977603912354, -1.612861156463623, -1.0803155899047852, -8.562191009521484, -9.116655349731445, -6.687618255615234, -4.475407123565674, -3.567601203918457, -3.872127056121826, -3.9123833179473877, -4.910545349121094, -3.3081064224243164, -2.0348949432373047, -0.45677995681762695, -0.10121360421180725, -5.542350769042969, -4.2080183029174805, -2.418548345565796, -0.37975195050239563, -5.366208076477051, -3.721823215484619, -2.790003776550293, -1.1252593994140625, 0.8020282983779907, 1.1572458744049072, 0.5900255441665649, 0.6378750205039978, 1.1789149045944214]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0.8, 1.37)}}, 'et2_eta2': {'discriminator': {'threshold': 0.55999852418899532, 'nodes': [100, 8, 1], 'bias': [-0.07655982673168182, 0.04617781937122345, -0.07329944521188736, 0.0852469801902771, -0.049393802881240845, -0.04781743884086609, 0.0020837648771703243, 0.10123120993375778, 0.28863173723220825], 'weights': [0.22343340516090393, -0.14321954548358917, -0.7969184517860413, -0.741295337677002, -0.9789867997169495, -0.9572865962982178, -0.16236446797847748, -0.5906817317008972, -0.16750997304916382, 2.7913169860839844, 2.56168794631958, 1.4937310218811035, 0.24083633720874786, -0.5946738123893738, 0.19848881661891937, 0.04796139523386955, -1.9238426685333252, 0.20910198986530304, 0.1546224057674408, -0.46144625544548035, -3.088106870651245, -1.3108936548233032, -0.6792631149291992, -1.096684455871582, -0.4145166277885437, -2.5957822799682617, -1.6750906705856323, -2.6148037910461426, -4.941394805908203, -1.0071359872817993, -1.1465017795562744, -1.030295491218567, -0.5925990343093872, -1.6988445520401, -1.0531017780303955, -1.020698070526123, -2.7289516925811768, -1.0833101272583008, 1.142014503479004, -0.7882360219955444, -0.7749398350715637, -0.7853214144706726, 2.313577651977539, -2.747591257095337, 1.867350459098816, -0.9817673563957214, -1.086301565170288, -1.2249387502670288, -0.8839070200920105, -0.8902090191841125, -0.580605685710907, -0.7777495980262756, -2.8894705772399902, -0.8431349396705627, -0.789000928401947, -2.120290994644165, -0.07784846425056458, 3.4826533794403076, -0.4669339954853058, -0.29841503500938416, -0.9088532328605652, -1.1546927690505981, 2.0670769214630127, -0.6617923974990845, 4.524196624755859, 3.1855268478393555, 1.2950915098190308, 0.06424147635698318, -0.904999315738678, -0.8628777265548706, -0.8245858550071716, -1.0090689659118652, 0.2747821807861328, 0.10214386880397797, -2.4779117107391357, -0.9773576855659485, -1.8188464641571045, -1.3777896165847778, -1.2273633480072021, -0.7081152200698853, -0.16788071393966675, -1.1654075384140015, -1.259030818939209, -1.1874983310699463, -0.9264681935310364, -0.9186518788337708, -0.8914804458618164, -0.9218055009841919, 0.7837216854095459, -0.8910134434700012, -0.2089620679616928, 0.16324535012245178, -4.087540626525879, -1.0314360857009888, -0.8699924945831299, -1.015000581741333, -0.10263320058584213, 0.07023771852254868, -0.37558451294898987, -0.30881813168525696, 0.2082013189792633, 0.06330819427967072, -0.8568580746650696, -0.8060777187347412, -0.83689284324646, -0.7497181296348572, -0.1738254874944687, -0.4366702139377594, -0.3223575949668884, 2.9135329723358154, 2.4753031730651855, 1.537800908088684, 0.20792335271835327, -0.5464007258415222, 0.046046413481235504, 0.1231943741440773, -1.8414950370788574, 0.16063444316387177, 0.003367061261087656, -1.217653512954712, -3.2840464115142822, -1.2698521614074707, -0.8337908983230591, -0.9966315031051636, -0.35329461097717285, -1.4399248361587524, -1.5452131032943726, -2.6740429401397705, -4.942326068878174, -1.0309700965881348, -1.060135006904602, -1.056551218032837, -0.6609721183776855, -1.6627198457717896, -0.8930734992027283, -0.9364414215087891, -2.73632550239563, -1.1858092546463013, 1.1292157173156738, -0.8602423071861267, -0.7451333999633789, -0.6334381699562073, 2.317405939102173, -2.7447357177734375, 1.8164399862289429, -0.8790375590324402, -1.0266516208648682, -1.2070320844650269, -1.0807114839553833, -0.9633757472038269, -0.3880324363708496, -0.9220374822616577, -2.911503314971924, -0.6549553275108337, -0.8126870393753052, -2.0710089206695557, -0.20544598996639252, 3.5708484649658203, -0.49633222818374634, -0.1758769303560257, -0.8343421816825867, -1.078677773475647, 1.9122920036315918, -0.8494187593460083, 4.3852691650390625, 3.200863838195801, 1.1445114612579346, -0.09215206652879715, -1.0130023956298828, -0.7751897573471069, -0.7957462668418884, -1.0866068601608276, 0.26328665018081665, -0.11597792059183121, -2.54250168800354, -1.0498559474945068, -1.6831717491149902, -1.3642908334732056, -1.2684246301651, -0.7591524124145508, -0.2174561619758606, -4.891088485717773, -1.4618377685546875, -1.0080394744873047, -0.929750382900238, -0.9019274115562439, -0.913806676864624, -0.8016263842582703, 0.6376355886459351, -0.7236019372940063, -0.21736304461956024, 0.3427373468875885, -4.053901672363281, -0.9434950351715088, -0.9492806792259216, -0.8692220449447632, -0.009448030032217503, 0.11537988483905792, -0.3962923586368561, -0.30279508233070374, -0.11674385517835617, 0.0715663805603981, 0.8507844805717468, 0.8731920123100281, 0.7847808599472046, 0.7785347104072571, 0.173873171210289, 0.5018649697303772, 0.4123990833759308, -2.975001096725464, -1.5538098812103271, -1.5466874837875366, -0.28720423579216003, 0.6159036755561829, -0.1280972957611084, -0.2603619694709778, 1.8770792484283447, -0.2359393686056137, -0.07419365644454956, 1.267500400543213, 3.276418924331665, 1.244958519935608, 0.8461859226226807, 1.0035147666931152, 0.4249263405799866, 1.5108433961868286, 1.6834756135940552, 2.677158832550049, 5.054049968719482, 0.9495651721954346, 1.1234631538391113, 1.0083847045898438, 0.4630945026874542, 1.2207255363464355, 0.9218323826789856, 0.9377996921539307, 2.8223962783813477, 1.2048046588897705, -1.0724740028381348, 0.7850067615509033, 0.9540084600448608, 0.7268407940864563, -2.411339044570923, 2.622981548309326, -1.9048823118209839, 0.954401433467865, 1.019078254699707, 1.1443625688552856, 1.070959210395813, 0.8751644492149353, 0.3850209712982178, 0.9144691824913025, 3.0497469902038574, 0.6741500496864319, 0.8218127489089966, 2.290695905685425, 0.2857479751110077, -3.6748085021972656, 0.46778643131256104, 0.3777141273021698, 0.9003259539604187, 1.1232715845108032, -2.00996994972229, 0.9688726663589478, -4.524957656860352, -3.0184340476989746, -0.9719988107681274, 0.02877887897193432, 0.9630817174911499, 0.952743649482727, 0.9084296226501465, 0.9942100048065186, -0.24129773676395416, -0.11661992967128754, 2.579699993133545, 0.9712111353874207, 1.7772858142852783, 1.3841044902801514, 1.3784581422805786, 0.8533254861831665, 0.26534998416900635, 4.9882988929748535, 1.07706618309021, 1.0975077152252197, 0.7948075532913208, 0.9976577162742615, 0.9716132879257202, 0.7567970156669617, -0.6556764841079712, 0.7230876088142395, 0.3645001947879791, -0.28498318791389465, 4.127756118774414, 1.0028256177902222, 0.8751408457756042, 1.0547360181808472, -0.00014002238458488137, -0.06870749592781067, 0.2670288383960724, 0.2527075707912445, -0.23057374358177185, 0.1159537136554718, 0.733686089515686, 0.7673280239105225, 0.8657631278038025, 0.8761321306228638, 0.09439922869205475, 0.4805983603000641, 0.24639520049095154, -2.8465054035186768, -2.4486613273620605, -1.502673864364624, -0.12065938115119934, 0.48617175221443176, -0.11879396438598633, -0.18583029508590698, 1.862165927886963, -0.15171419084072113, 0.062174439430236816, 0.3802166283130646, 3.2006494998931885, 1.21664297580719, 0.7338136434555054, 0.8903597593307495, 0.27823829650878906, 2.5870518684387207, 1.5798734426498413, 2.5969998836517334, 4.420010566711426, 1.0058954954147339, 1.0823618173599243, 1.0875388383865356, 0.556039035320282, 1.3046209812164307, 0.8941696286201477, 0.8771262168884277, 2.489576816558838, 1.0986230373382568, -1.1534610986709595, 0.8150595426559448, 0.9772729277610779, 0.6446929574012756, -2.452162265777588, 2.827893018722534, -1.8742727041244507, 0.9241117835044861, 1.027500033378601, 1.157573938369751, 0.8824051022529602, 0.8059958815574646, 0.5275769829750061, 0.8900220990180969, 2.9532198905944824, 0.8458910584449768, 0.9371623396873474, 2.289970874786377, 0.07063987851142883, -3.671917676925659, -2.1410415172576904, 0.35559019446372986, 0.9562572836875916, 0.9989854097366333, -1.9538923501968384, 0.6736979484558105, -4.322859764099121, -3.2325096130371094, -1.184324860572815, -0.07266504317522049, 0.8745638728141785, 0.9634345173835754, 0.9299636483192444, 0.9387571811676025, -0.10403236001729965, 0.10685780644416809, 2.486668348312378, 0.9303608536720276, 1.7279841899871826, 1.3289790153503418, 1.3552104234695435, 0.8579573035240173, 0.27706554532051086, 0.998016893863678, 1.27894127368927, 1.118223786354065, 1.0036280155181885, 1.087958574295044, 0.99065101146698, 0.7499627470970154, -0.5614715814590454, 0.8232236504554749, 0.335134357213974, -0.13579979538917542, 3.9406707286834717, 1.0299527645111084, 0.908333420753479, 1.0707021951675415, 0.05540156736969948, 0.08010388165712357, 0.18064694106578827, 0.22991688549518585, -0.053718987852334976, 0.03770876303315163, 0.8211138248443604, 0.9251333475112915, 0.9422194361686707, 0.9227993488311768, 0.20368193089962006, 0.4970192313194275, 0.37606605887413025, -2.9752488136291504, -2.5571131706237793, -1.4064146280288696, -0.25167956948280334, 0.6407450437545776, -0.09174489229917526, -0.24206680059432983, 1.794206142425537, -0.13071288168430328, -0.14342865347862244, 1.181628942489624, 3.1931679248809814, 1.161007285118103, 0.6395425796508789, 0.9108783006668091, 0.27959346771240234, 1.3069024085998535, 1.65396249294281, 2.5047287940979004, 4.858447551727295, 1.0527172088623047, 1.1473751068115234, 0.8762071132659912, 0.532788872718811, 1.2153698205947876, 0.8419976234436035, 0.9237966537475586, 2.7201690673828125, 1.1543779373168945, -1.0917235612869263, 0.8875826001167297, 0.9029335975646973, 0.8400679230690002, -2.4096264839172363, 2.6078319549560547, -1.7664130926132202, 0.9920657277107239, 1.0218231678009033, 1.199558138847351, 0.9727138876914978, 0.8082738518714905, 0.5954812169075012, 0.974108874797821, 2.8985040187835693, 0.6783674359321594, 0.7892172336578369, 2.2352566719055176, 0.08562389016151428, -3.4957809448242188, 0.4810532331466675, 0.22312386333942413, 0.9413687586784363, 1.1608532667160034, -2.055600881576538, 0.8384740352630615, -4.492331504821777, -3.1443004608154297, -1.1783127784729004, -0.041278451681137085, 1.0278916358947754, 0.7890925407409668, 0.9406034350395203, 1.008379578590393, -0.05296599864959717, -0.08233290910720825, 2.5783183574676514, 1.0592559576034546, 1.6081008911132812, 1.3850672245025635, 1.2805626392364502, 0.8270314335823059, 0.09334245324134827, 4.859727382659912, 1.1108125448226929, 1.1218739748001099, 0.9115898013114929, 0.9984079003334045, 0.9409406185150146, 0.9145911931991577, -0.7170349359512329, 0.706082284450531, 0.3673035204410553, -0.30489805340766907, 4.147932052612305, 0.9603983163833618, 0.9659633636474609, 0.8664016723632812, 0.07270254194736481, 0.1184486597776413, 0.24982959032058716, 0.3911813795566559, -0.2137686312198639, 0.02675258368253708, 0.7096277475357056, 0.8169723153114319, 0.7832303047180176, 0.9360334873199463, 0.21627460420131683, 0.6310918927192688, 0.3179105818271637, -2.9908299446105957, -1.7069120407104492, -1.3913296461105347, -0.21819917857646942, 0.5974876880645752, -0.16580218076705933, -0.05874728783965111, 1.940727949142456, -0.04484415054321289, -0.11117886751890182, 0.5372625589370728, 3.31087327003479, 1.2650471925735474, 0.7965402603149414, 0.9625160694122314, 0.41458410024642944, 1.501137614250183, 1.4837394952774048, 2.6789937019348145, 4.883045196533203, 1.0389249324798584, 0.951423704624176, 0.979072093963623, 0.5104587078094482, 1.145853042602539, 0.8391197919845581, 0.9807944297790527, 2.9022035598754883, 1.1616744995117188, -1.138969898223877, 0.7731444835662842, 0.8922306299209595, 0.7459601759910583, -2.270662307739258, 2.6330277919769287, -1.9013599157333374, 0.8186554312705994, 0.992020845413208, 1.2087147235870361, 0.8875907063484192, 0.8083035349845886, 0.5574833750724792, 0.7683736681938171, 3.000155448913574, 0.7997855544090271, 0.8734368085861206, 2.233581304550171, 0.1629600077867508, -3.584202766418457, 0.4153255820274353, 0.32263895869255066, 0.8415730595588684, 1.1370948553085327, -2.091538190841675, 0.9546653032302856, -4.3472900390625, -3.1855340003967285, -1.2434409856796265, 0.04753706231713295, 0.98084956407547, 0.9150350093841553, 0.9125065803527832, 0.9637389779090881, -0.25944823026657104, 0.030952535569667816, 2.5564563274383545, 0.9561443328857422, 1.7862932682037354, 1.3309850692749023, 1.1890255212783813, 0.9176821112632751, 0.27760735154151917, 1.2800241708755493, 1.2340452671051025, 1.1694729328155518, 0.9034730792045593, 0.9675430655479431, 0.9892826080322266, 0.9813922643661499, -0.5980042219161987, 0.6911150813102722, 0.29530248045921326, -0.2832447588443756, 4.106788158416748, 1.0907776355743408, 0.865490734577179, 0.9727181792259216, -0.07646874338388443, -0.0495702289044857, 0.20658829808235168, 0.20768584311008453, 0.04429035261273384, -0.0433923676609993, -0.9134440422058105, -0.7716778516769409, -0.9881393313407898, -0.9322150945663452, -0.2140124887228012, -0.4854046702384949, -0.2995252013206482, 2.8478212356567383, 2.529799222946167, 1.3921564817428589, 0.16275128722190857, -0.6251542568206787, 0.19713158905506134, 0.19618692994117737, -1.8141940832138062, 0.2411600649356842, 0.0529620498418808, -0.3727266788482666, -3.198047637939453, -1.2138251066207886, -0.7363572120666504, -1.021730899810791, -0.23983481526374817, -1.2998919486999512, -1.5453191995620728, -2.6852004528045654, -5.03449010848999, -0.9100886583328247, -1.1855742931365967, -1.0559604167938232, -0.6422983407974243, -1.3397839069366455, -0.862576425075531, -1.0735080242156982, -2.848280668258667, -1.1910055875778198, 1.2000806331634521, -0.7991795539855957, -0.8205350637435913, -0.7647427916526794, 2.2373175621032715, -2.6086435317993164, 1.863047480583191, -0.8125342726707458, -1.074232816696167, -1.1286301612854004, -0.9291890263557434, -0.9568683505058289, -0.5568981766700745, -0.9411821365356445, -2.8534626960754395, -0.7308806777000427, -0.8614240884780884, -2.156174421310425, -0.13684506714344025, 3.5264992713928223, -0.32664069533348083, -0.20393343269824982, -0.7623044848442078, -1.0478729009628296, 2.1414926052093506, -0.5593440532684326, 4.486616134643555, 3.203895092010498, 1.0981566905975342, -0.09826714545488358, -0.9999253749847412, -1.007345199584961, -0.7452923655509949, -0.9030133485794067, 0.1564921885728836, 0.11105343699455261, -2.479482889175415, -1.1055493354797363, -1.6463027000427246, -1.3443597555160522, -1.2502096891403198, -0.8274266123771667, -0.19551128149032593, -4.7850728034973145, -1.292590618133545, -1.1847198009490967, -0.8951672911643982, -1.0380836725234985, -0.9189863204956055, -0.955099880695343, 0.7137960195541382, -0.7855178713798523, -0.14217603206634521, 0.23426973819732666, -4.120105743408203, -0.8958330154418945, -0.9430932402610779, -1.0907455682754517, 0.04573884606361389, 0.04677553474903107, -0.36726489663124084, -0.2497732788324356, -0.28974300622940063, 0.054067306220531464, 0.708282470703125, 0.9231085777282715, 0.8193240165710449, 0.8251836895942688, 0.2579769492149353, 0.5626338124275208, 0.3770608603954315, -2.9594309329986572, -2.6156413555145264, -1.4124524593353271, -0.12167993187904358, 0.5273809432983398, -0.17264917492866516, -0.21231192350387573, 1.785294532775879, -0.18236799538135529, 0.052227526903152466, 0.3973369598388672, 3.160827398300171, 1.266247034072876, 0.8668997287750244, 0.9340139627456665, 0.4354833960533142, 2.513948678970337, 1.6737345457077026, 2.6224794387817383, 4.277675628662109, 0.9889689683914185, 1.0266441106796265, 0.8903666734695435, 0.4771876633167267, 1.227838397026062, 0.8484460115432739, 0.999708890914917, 2.6096272468566895, 1.220813512802124, -1.1966242790222168, 0.9037378430366516, 0.7387562394142151, 0.6823309063911438, -2.363344669342041, 2.836137294769287, -1.7910863161087036, 0.9634130597114563, 1.004923939704895, 1.1682276725769043, 0.8867138028144836, 0.7691341042518616, 0.5510122179985046, 0.858849823474884, 2.9702963829040527, 0.7546311020851135, 0.9539784789085388, 2.2165112495422363, 0.15405817329883575, -3.5655791759490967, -2.1933605670928955, 0.3010120093822479, 0.8021878600120544, 1.1387302875518799, -1.9578548669815063, 0.6887824535369873, -4.507678031921387, -3.0344138145446777, -1.2946633100509644, 0.11034775525331497, 0.9470683336257935, 0.8142690658569336, 0.8681297898292542, 1.0205273628234863, -0.17983399331569672, -0.11393976211547852, 2.572343111038208, 0.9020224213600159, 1.794269323348999, 1.3964163064956665, 1.3418643474578857, 0.932891845703125, 0.05985955148935318, 1.003767728805542, 1.3183605670928955, 1.165875792503357, 0.9224570989608765, 0.8964117169380188, 0.9605047702789307, 0.7478715777397156, -0.6423405408859253, 0.7450972199440002, 0.28280380368232727, -0.12295665591955185, 3.997950553894043, 0.9693208932876587, 0.9316984415054321, 0.9475011825561523, -0.05491603910923004, -0.0025306360330432653, 0.23612764477729797, 0.43988505005836487, 1.668373465538025, 1.1371721029281616, -1.097514271736145, -0.5632918477058411, -1.1591737270355225, -0.7539603114128113, 1.0011816024780273, -2.256110906600952]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (1.37, 1.54)}}, 'et2_eta3': {'discriminator': {'threshold': -0.34000080749392508, 'nodes': [100, 5, 1], 'bias': [0.13335025310516357, 0.248552143573761, 0.2607596516609192, 0.23980382084846497, -0.17763327062129974, 0.2343870997428894], 'weights': [-10.756834030151367, -5.154053688049316, -7.0025458335876465, -2.218642473220825, -1.07419753074646, -2.0236716270446777, -0.4742881953716278, -0.03815107047557831, -0.2741263508796692, -3.1508870124816895, 19.5971622467041, 2.403977870941162, -2.0943031311035156, 7.2989888191223145, 3.9618937969207764, -5.566046237945557, 51.05552291870117, 0.37886664271354675, 4.642994403839111, -0.6491299271583557, 11.151782989501953, 0.11410417407751083, 23.86515235900879, -1.9333291053771973, -10.39181137084961, -0.6153316497802734, 42.109947204589844, -0.2110520750284195, 12.593066215515137, -1.1302924156188965, 26.546398162841797, -8.614419937133789, 0.13233278691768646, 0.25577646493911743, 24.940628051757812, -0.20735733211040497, 5.364617824554443, 0.10353343933820724, 3.115074634552002, 0.14641344547271729, 8.40974235534668, 8.625457763671875, 0.09375984966754913, 1.208945393562317, 0.07423337548971176, 0.15145687758922577, 0.46819332242012024, -16.380521774291992, -0.15161031484603882, 21.851728439331055, 12.557600975036621, 0.10420508682727814, -4.14501428604126, 0.21442590653896332, 18.04941177368164, 0.17690162360668182, -0.0108153922483325, 0.04098479449748993, 0.3071639835834503, 0.1312766969203949, 0.4420854449272156, 23.29166030883789, 0.018159044906497, 0.13832451403141022, 0.8246799111366272, -8.584503173828125, 0.05028685927391052, 3.3795101642608643, -0.12710095942020416, 0.23381438851356506, 0.022220849990844727, -30.590267181396484, -0.12401554733514786, 0.1345580667257309, 0.22404614090919495, -8.626749038696289, 0.12128259986639023, 0.2123095840215683, -0.9947080612182617, 0.15545381605625153, -3.0764477252960205, -1.8702014684677124, 0.42185866832733154, 16.13136100769043, -0.6422619223594666, 0.16187888383865356, -0.9172854423522949, 9.631973266601562, -1.1423531770706177, -2.620586395263672, -2.374701738357544, -3.936511278152466, 0.25551971793174744, -0.02190171182155609, -0.04584646224975586, -0.27712079882621765, 0.14468258619308472, 0.030499180778861046, -3.141718864440918, 88.65790557861328, -2.5324573516845703, -4.374341011047363, 0.6859371066093445, 1.9106290340423584, 0.6596091985702515, 1.8849974870681763, -0.674700140953064, 0.660778820514679, -3.480478525161743, -4.1822190284729, -1.4325149059295654, 1.1752970218658447, 1.7581167221069336, -0.5020906329154968, 4.604200839996338, 1.9714369773864746, 2.4581234455108643, 7.138940334320068, 5.738563060760498, 3.129223585128784, 3.9697062969207764, 3.5533447265625, 1.1901803016662598, 5.782238483428955, 8.86247444152832, 0.523585319519043, -0.02157605066895485, 1.1680787801742554, 3.927422046661377, 2.714078903198242, -0.4944123923778534, 3.6332807540893555, 2.709134817123413, 2.9711852073669434, 5.126705646514893, -0.7336161732673645, 0.9812389016151428, 2.3340704441070557, 1.3021881580352783, 1.3694522380828857, 1.2027201652526855, 1.2100907564163208, 1.289125680923462, 4.048458099365234, 2.1643471717834473, 0.35024294257164, 1.4579193592071533, 3.5349833965301514, -0.15462449193000793, -3.88193416595459, 2.7522335052490234, -0.06720936298370361, 3.204317331314087, -0.019455675035715103, 3.507672071456909, 0.4213518500328064, 0.3603975772857666, 2.0518710613250732, 0.5751850008964539, -1.5830974578857422, 3.848586320877075, 0.9717985987663269, 0.44291964173316956, -0.8807228207588196, 2.290783643722534, -0.23605653643608093, 1.227684497833252, -0.003825950436294079, -4.663488388061523, 1.6658002138137817, 5.13378381729126, 6.0269598960876465, -1.0647153854370117, -0.6556851863861084, 1.803419828414917, 2.9657299518585205, 2.5982794761657715, 2.7404441833496094, 1.6974892616271973, 1.6881728172302246, 0.6873123049736023, 6.274681091308594, 8.36557674407959, 4.364907741546631, 1.637835144996643, 1.103344440460205, 2.2714977264404297, 0.7774200439453125, 0.7928032875061035, 1.8765802383422852, 0.5476711988449097, 0.07748151570558548, 6.8607659339904785, 2.732969045639038, 0.3886774480342865, 2.827256679534912, 0.37176939845085144, -0.013558509759604931, -0.3260025382041931, 8.167928695678711, 53.11573028564453, 31.998504638671875, 0.7986357808113098, -7.163128852844238, -0.6253488659858704, 1.1188615560531616, -1.3782844543457031, 0.7688377499580383, 0.42100590467453003, 1.7917190790176392, -15.676565170288086, 12.676505088806152, -0.9360592365264893, -4.500792503356934, -21.410022735595703, 1.1764541864395142, -1.2546459436416626, -11.680105209350586, -23.284387588500977, -4.306753635406494, -19.183818817138672, 6.2244367599487305, -12.680574417114258, -3.5009639263153076, 12.968194961547852, -9.88486099243164, -82.18316650390625, 0.15911909937858582, 0.6369820833206177, 1.7977516651153564, -0.29602837562561035, 1.5609605312347412, 5.279357433319092, -5.59156608581543, -23.88628578186035, -12.71351146697998, -8.801299095153809, 20.297061920166016, 0.021973656490445137, -0.8585444688796997, -2.9222116470336914, 1.2671905755996704, 0.5269664525985718, 8.260369300842285, -3.2834479808807373, 0.6941452026367188, -14.314531326293945, 24.933794021606445, -8.902850151062012, -11.617528915405273, -30.619714736938477, 13.680442810058594, -20.13739585876465, 10.085596084594727, -14.83609390258789, 26.037694931030273, -0.14633238315582275, 1.1378346681594849, 0.3858771026134491, -7.258084297180176, 0.43984153866767883, 10.910409927368164, -17.31711196899414, -1.007501482963562, -27.515432357788086, -0.1505083441734314, -21.593725204467773, 8.039786338806152, -2.401052236557007, 0.6295750737190247, 0.02726588025689125, 13.659438133239746, 0.3220360279083252, -2.358847141265869, 5.056670665740967, 0.7876736521720886, 1.9370248317718506, -0.09462462365627289, -0.18033425509929657, 0.12362048029899597, -8.971482276916504, 2.0015969276428223, 3.0477662086486816, -7.6233625411987305, 1.0016531944274902, 0.3745057284832001, 1.0311485528945923, 0.21755991876125336, 40.135868072509766, 12.324202537536621, 0.6266895532608032, 2.2410624027252197, 2.065934419631958, 0.9237793684005737, 0.18036027252674103, -16.828275680541992, 0.35438159108161926, -0.1555556058883667, 4.154973030090332, -475.23138427734375, -2.502817153930664, -4.302284240722656, -0.6296444535255432, 1.8844630718231201, 0.6088113188743591, 2.2870635986328125, -0.5094284415245056, 0.7945058941841125, -3.447042942047119, -3.647264003753662, -0.6113442778587341, 1.1077313423156738, 2.127782106399536, -0.40056928992271423, 4.655635356903076, 2.178720712661743, 2.7995572090148926, 7.104198455810547, 5.905070781707764, 3.2854087352752686, 3.934929370880127, 3.707108497619629, 1.3646639585494995, 5.755138874053955, 8.847835540771484, 0.8089349269866943, -0.11532001197338104, 1.146803617477417, 2.426882028579712, 2.8990681171417236, -0.38362497091293335, 3.910571336746216, 2.6533946990966797, 2.781461477279663, 5.299633026123047, -0.5826964378356934, 0.9958195686340332, 2.4386825561523438, 1.2550694942474365, 1.4544106721878052, 1.2984797954559326, 1.8875641822814941, 1.4372845888137817, 4.373566627502441, 2.349292278289795, 0.2892161011695862, 2.2028911113739014, 3.612194299697876, -1.7294856309890747, -0.4223075211048126, 2.4665699005126953, -0.20626167953014374, 2.9696385860443115, -0.010548719204962254, 3.3602588176727295, 0.39201220870018005, 0.32493478059768677, 2.06101393699646, 0.6399164199829102, -1.390122652053833, 2.6932859420776367, 0.8907122611999512, 0.553081750869751, -0.7583954930305481, 2.277139902114868, 0.6291739344596863, 2.7604525089263916, -0.005663110874593258, -5.736014366149902, 1.6331316232681274, 1.4976601600646973, 6.064630508422852, -0.925768256187439, -0.5103186964988708, 1.661220908164978, 3.0831050872802734, 2.750983953475952, 2.756680488586426, 1.649301528930664, 1.712792158126831, 0.26813170313835144, 5.1360344886779785, 8.015815734863281, 4.326051712036133, 1.5424004793167114, 1.0750715732574463, 2.370279550552368, 0.7323935031890869, 0.3343536853790283, 2.009101390838623, 0.6932831406593323, -0.03671253100037575, 6.679688930511475, 2.4077558517456055, 0.3968178927898407, 2.891972780227661, 0.2196534425020218, 0.00961389858275652, -0.5204793810844421, 8.124086380004883, 0.4501791000366211, 1.2842708826065063, 1.2731422185897827, 0.6348394751548767, -0.435335248708725, 0.5225095748901367, 0.43921151757240295, -1.3023449182510376, 3.713515281677246, 6.4112348556518555, 0.842943549156189, -10.726643562316895, -8.334908485412598, -0.16133823990821838, -4.632417678833008, -2.0630006790161133, 3.4924919605255127, -7.2158379554748535, -5.91160249710083, -5.372579097747803, -3.8819172382354736, -5.345448017120361, -0.25050151348114014, -5.493337154388428, -7.339334487915039, -5.2933125495910645, 0.12195873260498047, -0.9954842329025269, -1.3830924034118652, -2.6811864376068115, 0.4685163199901581, -3.6322438716888428, -2.5715246200561523, -2.889451742172241, -5.268944263458252, 0.6407426595687866, -0.7952390313148499, -2.078568696975708, -1.1098804473876953, 0.33429673314094543, -1.1769680976867676, -1.0174493789672852, -1.510162353515625, -3.542238473892212, -1.597876787185669, -0.34909144043922424, -1.2422542572021484, -2.7350168228149414, 2.5111312866210938, 2.6181581020355225, -1.2021911144256592, 0.1684180051088333, -3.4331066608428955, -0.26513049006462097, -3.43839955329895, 6.674975395202637, -0.31000077724456787, -1.8686954975128174, -0.5798888802528381, 4.219579219818115, -3.7151522636413574, -0.4743309020996094, -0.43988871574401855, 0.8754767775535583, -2.315849542617798, 6.703108310699463, -1.2990057468414307, 7.061644077301025, 5.463805675506592, -1.585597276687622, -0.7856287956237793, -6.636855125427246, 1.067458987236023, 0.5610536932945251, -1.2216709852218628, -2.821749210357666, -2.791036367416382, -1.9990876913070679, -1.3242096900939941, -1.6728241443634033, -0.34435802698135376, -4.782454013824463, -7.547537803649902, -0.2774135172367096, -0.8089768886566162, -1.030517339706421, -2.8310625553131104, -0.5920827984809875, 0.15740729868412018, -0.825404167175293, -0.5701107382774353, 0.312010794878006, -1.5172830820083618, -0.5282378792762756, -0.1631062626838684, -1.8005297183990479, -0.6700261235237122, 0.043705716729164124, 0.4681946039199829, -10.75798511505127, -0.8759651780128479, -1.5461176633834839, -1.23297119140625, -1.4937539100646973, 1.4530240297317505]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (30, 40), 'etaBin': (1.54, 2.5)}}, 'et2_eta0': {'discriminator': {'threshold': -0.94999999999999996, 'nodes': [100, 7, 1], 'bias': [0.019224368035793304, 0.45628318190574646, -0.12031170725822449, -0.015363171696662903, -0.049233756959438324, 0.045791663229465485, 0.03335244953632355, -0.09124189615249634], 'weights': [2.4329495429992676, 1.4420313835144043, -0.15772387385368347, -0.45292413234710693, 0.3055766224861145, 0.5392810702323914, 0.5628986954689026, 0.07073460519313812, 1.9584318399429321, 1.8563319444656372, -2.371872663497925, -2.354975938796997, -2.7561957836151123, 2.817047119140625, 0.08973520249128342, -3.268537998199463, -1.070982575416565, -1.8271304368972778, -2.4616522789001465, -2.3151986598968506, -1.887192964553833, -1.8527302742004395, -2.3407819271087646, -2.473985433578491, -1.3908601999282837, -1.4299952983856201, -1.5499542951583862, -2.0558488368988037, -1.5325924158096313, -1.394205927848816, -1.5222370624542236, -1.4686172008514404, -1.5534261465072632, -1.4842036962509155, -1.3858249187469482, -1.3416050672531128, -1.531836748123169, -1.428819179534912, -1.4558062553405762, -0.8207655549049377, -0.8782278299331665, -1.0157896280288696, -0.5276156067848206, -0.8581804037094116, -0.6648080945014954, -0.45357322692871094, -0.8857735395431519, -0.8280180096626282, -0.8657222390174866, -0.8005098700523376, -0.6567687392234802, -0.0016746609471738338, -0.6134666800498962, -0.7531946301460266, -0.7140744924545288, -0.4470549523830414, -0.636455774307251, -0.19409911334514618, -0.41761863231658936, 0.07512872666120529, -0.46277540922164917, 1.4176570177078247, -0.8929492831230164, -0.9296699166297913, -0.8491492867469788, -0.9557816386222839, 0.2912381589412689, -0.44588908553123474, 0.19240215420722961, -0.5164107084274292, -0.6210252046585083, -0.9396032691001892, 0.6607837080955505, 0.14490465819835663, -0.6050184965133667, -1.12909734249115, -1.4073784351348877, -0.8343877196311951, -1.138207197189331, -0.5169039368629456, -1.937561273574829, -1.8662525415420532, -1.915310263633728, -2.233858823776245, -1.7492365837097168, -1.3136546611785889, -1.3534401655197144, -1.400665044784546, -2.9078454971313477, -2.20707631111145, -0.9425890445709229, -0.03192368894815445, -2.7494051456451416, -1.704785704612732, -0.6634554862976074, 0.05951673164963722, -4.10584831237793, -2.448336601257324, -0.41072091460227966, -0.27269992232322693, -1.4788968563079834, -0.8261141777038574, -0.05670209601521492, 0.002791410544887185, -0.28939205408096313, -0.3831201195716858, -0.2669445276260376, -0.39940598607063293, -0.8653852343559265, -1.1035109758377075, 5.203746795654297, 4.88874626159668, -0.08087887614965439, -0.29121914505958557, -0.5097947716712952, 0.4677366018295288, 0.7954995632171631, 0.7813175916671753, 1.2717020511627197, 0.9484448432922363, 0.7764231562614441, 0.809074342250824, 0.8015225529670715, 0.9934772849082947, 0.479518324136734, 0.56662517786026, 0.4497523307800293, 0.5770207047462463, 0.579328715801239, 0.5804927945137024, 0.47426074743270874, 0.5920686721801758, 0.5701936483383179, 0.6489295959472656, 0.47899195551872253, 0.40846553444862366, 0.3863874673843384, 0.4638066589832306, 0.40672117471694946, 0.2634744942188263, 0.15485037863254547, 0.026525290682911873, 0.07605506479740143, 0.11399006843566895, 0.3101194500923157, 0.14307749271392822, 0.16039623320102692, 0.23738282918930054, 0.24280521273612976, 0.26603251695632935, 0.14755947887897491, -0.15468497574329376, 0.23101232945919037, 0.1688367873430252, 0.11484790593385696, -0.033109478652477264, 0.0003158295003231615, -0.14705990254878998, 0.13513056933879852, -0.05535063147544861, -0.6226818561553955, -0.831747829914093, 0.17960545420646667, 0.26952144503593445, 0.0686379075050354, 0.16775889694690704, -0.13495196402072906, 0.09117455780506134, -0.32439175248146057, -0.042516350746154785, 0.1461169421672821, 0.3471764624118805, -0.17577430605888367, -2.5552563667297363, 0.15897704660892487, 0.17573589086532593, -0.05086727440357208, -0.13653911650180817, -1.011115312576294, -0.19663439691066742, 0.20274174213409424, 0.7060439586639404, 0.4570104777812958, 0.4854345917701721, 0.4555254578590393, 0.4067375063896179, 0.5382141470909119, 0.3978714942932129, 0.8932828903198242, 0.6028915047645569, -0.05715129151940346, -0.34641629457473755, 1.0517120361328125, 0.578312337398529, -0.71567702293396, -0.18141664564609528, 1.7424260377883911, 0.9161783456802368, -0.5402849912643433, 0.09533532708883286, 2.562138795852661, 1.5500154495239258, -0.24047265946865082, -0.29138559103012085, 0.3148193657398224, 0.47478795051574707, 0.4756316542625427, 0.40536364912986755, 2.0594069957733154, 1.807045817375183, -2.1784279346466064, -2.0940635204315186, -0.9356326460838318, 2.7754881381988525, -1.3487353324890137, -1.4713248014450073, -1.16933012008667, -2.811002254486084, -3.2187931537628174, -2.675110101699829, -2.3073205947875977, -1.9761515855789185, -2.4064102172851562, -2.545433282852173, -1.5459630489349365, -1.544931411743164, -1.481935739517212, -1.8270764350891113, -1.4253467321395874, -1.4545460939407349, -1.3441903591156006, -1.4803478717803955, -1.5137966871261597, -1.3985644578933716, -1.3568552732467651, -1.302380919456482, -1.5009571313858032, -1.4774668216705322, -1.3306632041931152, -0.9371532797813416, -0.7280012965202332, -0.9935320019721985, -0.6516280770301819, -0.8398025631904602, -0.8120349049568176, -0.3519139289855957, -0.9073634147644043, -0.8254354596138, -0.767120361328125, -0.853701651096344, -0.741077184677124, 0.10455520451068878, -0.7997367978096008, -0.6552387475967407, -0.6452860832214355, -0.540259063243866, -0.6437557935714722, -0.22889691591262817, -0.5302101969718933, 0.02918851189315319, 0.7381013035774231, 1.2349488735198975, -0.8047325015068054, -0.8460726141929626, -0.9038191437721252, -1.0867608785629272, 0.1658903807401657, -0.5121541619300842, 0.26093533635139465, -0.5085957646369934, -0.8133324384689331, -0.9956737160682678, 0.4444533586502075, 0.11229830980300903, -0.6257104873657227, -0.8876718878746033, -1.4783036708831787, -1.317688226699829, -0.8321372866630554, -0.44442787766456604, -1.0517348051071167, -1.8077179193496704, -1.3538740873336792, -2.241945743560791, -1.3934167623519897, -1.329193115234375, -1.4903050661087036, -1.2067742347717285, -2.811061382293701, -2.207946300506592, -0.7235689759254456, 0.36650580167770386, -2.5691821575164795, -1.8738287687301636, -0.6872693300247192, 0.04656132310628891, -4.157707214355469, -2.091909170150757, 0.8802509307861328, -0.2656829059123993, -2.426492929458618, -1.3851568698883057, 0.059051163494586945, 0.3478064239025116, -0.33703580498695374, -0.5045357346534729, -0.5599914193153381, -0.019190818071365356, -1.8953324556350708, -2.4973785877227783, 2.232837677001953, 2.252776861190796, 0.9709047675132751, -2.79278564453125, -0.010164869949221611, 1.5122946500778198, 2.172455310821533, 1.7269326448440552, 2.261995315551758, 2.166290521621704, 1.9688866138458252, 1.962256669998169, 2.439129114151001, 2.336719512939453, 1.4186104536056519, 1.4049092531204224, 1.4736586809158325, 1.847051978111267, 1.5520299673080444, 1.3687318563461304, 1.3582417964935303, 1.5198113918304443, 1.5707532167434692, 1.469887375831604, 1.4525644779205322, 1.336944341659546, 1.303916573524475, 1.4890121221542358, 1.4932266473770142, 0.9043020606040955, 0.7885726094245911, 1.162514328956604, 0.5184091925621033, 0.6969605684280396, 0.8452600836753845, 0.47120940685272217, 0.8056679964065552, 0.90936678647995, 0.7736977338790894, 0.769103467464447, 0.835401177406311, 0.0007846203516237438, 0.7544705271720886, 0.7839801907539368, 0.8243162035942078, 0.606340229511261, 0.6326882243156433, 0.006035619415342808, 0.37757769227027893, -0.09361042827367783, -0.8933119177818298, -1.3733415603637695, 0.720933735370636, 0.7511315941810608, 0.8383000493049622, 1.0988450050354004, -0.22380509972572327, 0.486883282661438, -0.2374916970729828, 0.3708416223526001, 0.754981279373169, 0.8724632263183594, -0.6503762602806091, -0.07306433469057083, 0.5668611526489258, 1.3136569261550903, 1.291954517364502, 0.9644765257835388, 1.1525988578796387, 0.5578071475028992, 2.0050060749053955, 1.7692725658416748, 1.9648202657699585, 2.2346577644348145, 1.573161244392395, 1.225036859512329, 1.2651726007461548, 1.3745157718658447, 2.879516124725342, 2.06929874420166, 0.8042070269584656, 0.046606600284576416, 2.626986026763916, 1.7895833253860474, 0.7479560375213623, -0.13244923949241638, 4.086292266845703, 2.3496358394622803, 0.371665358543396, 0.2165805697441101, 2.4569509029388428, 1.4385862350463867, -0.16386932134628296, -0.3167145848274231, 0.3162664473056793, 0.46230649948120117, 0.4655436873435974, 0.07541755586862564, 2.011347770690918, 1.7762595415115356, -2.383378028869629, -2.045424222946167, -0.9808481335639954, 2.7819881439208984, -1.1634764671325684, -1.6215306520462036, -1.2168718576431274, -2.80134916305542, -3.029503345489502, -2.819157838821411, -2.1202502250671387, -1.8975133895874023, -2.366917133331299, -2.5516650676727295, -1.4806523323059082, -1.435504674911499, -1.5217608213424683, -1.9047131538391113, -1.4785221815109253, -1.4539152383804321, -1.306567907333374, -1.391014814376831, -1.3592268228530884, -1.532035231590271, -1.283663272857666, -1.3940602540969849, -1.3992893695831299, -1.423553705215454, -1.5037975311279297, -0.8926613926887512, -0.9525676965713501, -1.1239711046218872, -0.6273049116134644, -0.8618878722190857, -0.8085115551948547, -0.5689142346382141, -0.8319580554962158, -0.8602641224861145, -0.7267711162567139, -0.8367028832435608, -0.6722570657730103, -0.06398558616638184, -0.6949097514152527, -0.7947496175765991, -0.8108732104301453, -0.6094116568565369, -0.6834646463394165, -0.18662497401237488, -0.4377152919769287, -0.05450530722737312, 0.789487898349762, 1.3558756113052368, -0.8082835078239441, -0.8878145813941956, -0.6686668992042542, -1.0263078212738037, 0.2801620662212372, -0.422963947057724, 0.384494811296463, -0.5766454339027405, -0.6704477071762085, -0.8489841818809509, 0.4937117099761963, 0.08810242265462875, -0.49191591143608093, -1.1825255155563354, -1.4684760570526123, -1.356184720993042, -0.8141841292381287, -0.3850608766078949, -1.064042329788208, -1.9686410427093506, -1.8462729454040527, -2.441925048828125, -1.446154236793518, -1.3654451370239258, -1.475347638130188, -1.2900302410125732, -2.795851230621338, -2.0913033485412598, -0.8997092843055725, -0.07227753102779388, -2.5798871517181396, -1.8058234453201294, -0.6624166965484619, 0.023890217766165733, -4.020058631896973, -2.2059144973754883, -0.18558931350708008, -0.2521713078022003, 3.1621625423431396, 1.3985220193862915, -0.09007403999567032, -0.16138528287410736, 0.24604009091854095, 0.5129308700561523, 0.5637645721435547, 0.10085611045360565, 1.305787205696106, 1.8163641691207886, -2.4210641384124756, -2.391801595687866, -28.43486785888672, -23.484031677246094, -0.9793418645858765, -4.18854284286499, -2.1310503482818604, -2.870819568634033, -3.0719714164733887, -2.8416945934295654, -1.785984754562378, -1.8175822496414185, -2.3831961154937744, -2.4582366943359375, -1.5033769607543945, -1.3726886510849, -1.5788654088974, -1.9010940790176392, -1.3715871572494507, -1.3963435888290405, -1.542748212814331, -1.4265767335891724, -1.498540997505188, -1.44312584400177, -1.4168643951416016, -1.3526530265808105, -1.5110632181167603, -1.4531513452529907, -1.4370427131652832, -0.755885899066925, -1.1705522537231445, -1.0521912574768066, -0.5583027601242065, -0.7097495794296265, -0.7271955609321594, -0.5963847637176514, -0.8199965953826904, -0.9824211597442627, -0.7588356137275696, -0.8616625666618347, -0.8250113129615784, -0.01304912194609642, -0.6456601023674011, -0.7116826772689819, -0.7044937610626221, -0.5820220708847046, -0.5252363681793213, -0.11877278983592987, -0.40739378333091736, 0.08936440199613571, -0.4846968352794647, 1.4016880989074707, -0.8306226134300232, -0.8886826038360596, -0.785695493221283, -0.9155530333518982, 0.06494328379631042, -0.40058434009552, 0.19867633283138275, -0.4699579179286957, -0.7626007795333862, -1.004346251487732, 0.4306110143661499, 0.2243686318397522, -0.6151213049888611, -1.2966523170471191, -1.3448292016983032, -1.3667707443237305, -1.0932161808013916, -0.2092115581035614, -2.1191136837005615, -1.7377432584762573, -1.9527406692504883, -2.3827550411224365, -1.39419686794281, -0.8450744152069092, -1.434301733970642, -1.4196327924728394, -2.9662694931030273, -2.2719085216522217, -0.9973747134208679, -0.10633020102977753, -2.559225082397461, -1.7566699981689453, -0.7702963352203369, 0.009006070904433727, -3.9826912879943848, -2.4611897468566895, -0.40986642241477966, -0.39345476031303406, -2.505054235458374, -1.5627460479736328, 0.20679648220539093, 0.21784821152687073, -0.392333060503006, -0.5391677021980286, -0.5631539821624756, -0.11808450520038605, -2.0265042781829834, -1.8561762571334839, 2.326373815536499, 2.1077661514282227, 0.8973670601844788, -2.8357458114624023, 0.18519389629364014, 1.6604644060134888, 1.2396122217178345, 1.7915445566177368, 2.2420578002929688, 2.1091504096984863, 1.8518445491790771, 1.7843892574310303, 2.500272274017334, 2.4845471382141113, 1.415296196937561, 1.437915325164795, 1.563604712486267, 1.9767711162567139, 1.4405521154403687, 1.5654958486557007, 1.4094858169555664, 1.5619754791259766, 1.346497893333435, 1.4208425283432007, 1.3556067943572998, 1.3054238557815552, 1.4682717323303223, 1.3980369567871094, 1.3724548816680908, 0.9466394186019897, 0.8472837209701538, 1.1444425582885742, 0.48658162355422974, 0.6729785203933716, 0.775073230266571, 0.38670814037323, 0.6818282604217529, 0.8494165539741516, 0.7629603147506714, 0.6344732642173767, 0.7261439561843872, 0.10614152252674103, 0.636592447757721, 0.7263050079345703, 0.7870194315910339, 0.48588988184928894, 0.6175801753997803, 0.04768501967191696, 0.38610199093818665, -0.18572714924812317, -0.920181155204773, -1.304421305656433, 0.8753919005393982, 0.747620165348053, 0.8673272728919983, 0.9083234667778015, -0.25196096301078796, 0.4322338104248047, -0.2709597647190094, 0.47382813692092896, 0.7335174083709717, 0.8570857644081116, -0.5762098431587219, -0.117202028632164, 0.5681395530700684, 1.3236256837844849, 1.4113497734069824, 0.8510667681694031, 0.798176109790802, 0.41843101382255554, 2.0457067489624023, 1.8958936929702759, 1.9216493368148804, 2.364807367324829, 1.752082347869873, 1.1599316596984863, 1.2741354703903198, 1.3849525451660156, 2.8652143478393555, 2.095937728881836, 0.9269382953643799, 0.01417516265064478, 2.731696844100952, 1.8187381029129028, 0.7211563587188721, -0.00786273367702961, 4.172025203704834, 2.287806272506714, 0.1911832094192505, 0.2606365382671356, 0.43680086731910706, -0.1364956498146057, 1.7345826625823975, -0.24970099329948425, 1.3585660457611084, 2.0351836681365967, -2.3376505374908447]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_Pd', 'etBin': (30, 40), 'etaBin': (0, 0.8)}}, 'et0_eta1': {'discriminator': {'threshold': -0.25000081881880759, 'nodes': [100, 5, 1], 'bias': [-0.00734415277838707, -0.04007263109087944, 0.01721646450459957, 0.020719019696116447, 0.046631548553705215, -0.18706800043582916], 'weights': [1.7377108335494995, 1.6247806549072266, -0.6348843574523926, -0.967391848564148, -0.6266287565231323, -0.12843042612075806, -0.24559998512268066, 0.6452810764312744, 1.7221064567565918, 4.701451301574707, 1.5039163827896118, -1.7288532257080078, -3.80412220954895, -4.534799575805664, -11.179051399230957, -6.4496870040893555, -8.357569694519043, -6.8953094482421875, -7.319294452667236, -5.33613920211792, -4.331879138946533, -5.6166863441467285, -4.2194905281066895, -2.046111583709717, -2.654541015625, -3.0550479888916016, -2.8370306491851807, -2.8363215923309326, -1.7923264503479004, -1.9503059387207031, -2.1109097003936768, -1.5169703960418701, -3.1434714794158936, -1.9001425504684448, -1.9343191385269165, -1.5400060415267944, -0.9514163732528687, -1.007479190826416, -0.7397158741950989, -1.6267057657241821, -1.0203564167022705, 1.0543880462646484, 0.6386894583702087, -1.2183719873428345, -0.6848020553588867, -0.7528361082077026, -0.6116979122161865, -0.4854795038700104, 2.340702533721924, -0.8718724250793457, -0.9812522530555725, -0.6533620953559875, -0.8048100471496582, -1.6046602725982666, -1.7465568780899048, -0.6194329261779785, -1.1124358177185059, -0.20086267590522766, -0.4949987530708313, -1.9724587202072144, -0.8920513391494751, -0.9077373743057251, -0.7814194560050964, -0.15274149179458618, 2.1128220558166504, -2.2169740200042725, -0.8975223898887634, 0.5442677140235901, -0.5187479257583618, -0.8365760445594788, -0.6088159084320068, -1.0121889114379883, 0.3801363706588745, 0.10336347669363022, -0.5735204815864563, -1.1391230821609497, -1.2338380813598633, -1.2934484481811523, -0.7137042880058289, -0.41635215282440186, -7.322882652282715, -5.276535987854004, -2.771449565887451, -2.0942189693450928, -1.6656136512756348, -1.0785226821899414, -1.6305023431777954, -1.6055757999420166, -1.3450241088867188, -0.5596164464950562, -0.11945312470197678, 0.35502442717552185, -0.8384147882461548, -1.2007514238357544, -0.4678857624530792, 0.039978619664907455, 1.0076828002929688, -0.952568531036377, -1.2570031881332397, -0.23503649234771729, -1.6402820348739624, -1.5127460956573486, 0.4896644949913025, 0.9996862411499023, 0.6316338777542114, -0.05889454483985901, 0.31666478514671326, -0.5924645066261292, -1.5233347415924072, -4.635391712188721, -1.5924246311187744, 1.7247827053070068, 4.796441078186035, 4.448203086853027, 11.463770866394043, 6.490278244018555, 8.44174861907959, 7.014037132263184, 7.2010955810546875, 5.264009952545166, 4.238999366760254, 5.545492649078369, 4.161722660064697, 2.1480047702789307, 2.6515791416168213, 3.1205153465270996, 2.6546432971954346, 2.9718923568725586, 1.9094560146331787, 1.9614886045455933, 2.300384759902954, 1.7265303134918213, 3.0444772243499756, 1.9394394159317017, 1.9208742380142212, 1.4410552978515625, 1.0585501194000244, 1.0687505006790161, 0.6892903447151184, 1.677449345588684, 1.1359859704971313, -1.1883652210235596, -1.6451480388641357, 1.2536815404891968, 0.7193902730941772, 0.6834232211112976, 0.7398744821548462, 0.5992100238800049, -2.2864277362823486, 0.9311156868934631, 0.3724539875984192, 0.6097988486289978, 0.7879002690315247, 1.588571310043335, 1.5497242212295532, 0.603609561920166, 1.1750744581222534, -0.04816123843193054, 0.6257660388946533, 1.8887654542922974, 1.2753300666809082, 0.9734532237052917, 0.9355945587158203, 0.22402648627758026, -2.003486394882202, 2.329573631286621, 0.8748180270195007, -0.5829601883888245, 0.43745458126068115, 1.018608808517456, 0.6258258819580078, 1.0582246780395508, -0.5872433185577393, -0.039680421352386475, 0.7071413397789001, 1.2217668294906616, 1.2330670356750488, 1.3000836372375488, 0.6549936532974243, 0.46489715576171875, 7.133599281311035, 5.509708404541016, 2.7714719772338867, 2.1431872844696045, 1.6275341510772705, 1.1368684768676758, 1.6586905717849731, 1.6267948150634766, 1.5344808101654053, 0.72353595495224, 0.05223165079951286, -0.193617045879364, 0.811058521270752, 1.2553423643112183, 0.3935408890247345, -0.21197541058063507, -1.1687506437301636, 0.795699954032898, 1.3014763593673706, 0.559053361415863, 1.6971548795700073, 1.6421247720718384, -0.6125500202178955, -0.8785212635993958, -0.6199382543563843, 0.013110571540892124, -0.1995123028755188, 0.6310725808143616, 1.6666274070739746, 4.549563884735107, 1.6783168315887451, -1.602736234664917, -3.60491681098938, -4.563404560089111, -11.225308418273926, -6.517359733581543, -8.52653980255127, -6.908738136291504, -7.293144226074219, -5.438269138336182, -4.447637557983398, -5.533753395080566, -4.112213611602783, -2.0517115592956543, -2.710681915283203, -2.9905197620391846, -2.888941526412964, -2.897081136703491, -1.9851126670837402, -1.8915457725524902, -2.130089044570923, -1.4963324069976807, -3.0612261295318604, -1.890846610069275, -1.8185125589370728, -1.4449262619018555, -1.0545589923858643, -1.0982578992843628, -0.6701894402503967, -1.5313478708267212, -1.0022999048233032, 1.0443370342254639, 1.6642746925354004, -1.2045964002609253, -0.7295986413955688, -0.577769935131073, -0.7165750861167908, -0.44526585936546326, 2.248359203338623, -1.001162052154541, -0.14367026090621948, -0.6079222559928894, -0.845024824142456, -1.5592997074127197, -1.7005757093429565, -0.7219295501708984, -1.256527304649353, -0.21293357014656067, -0.4042748808860779, -2.055356740951538, -1.0993387699127197, -0.8300517797470093, -1.1209880113601685, -0.023806476965546608, 1.9458227157592773, -2.1635842323303223, -0.9274901151657104, 0.5281060338020325, -0.5499939918518066, -0.8031582832336426, -0.7835997343063354, -1.0382599830627441, 0.40964436531066895, 0.15005438029766083, -0.6369092464447021, -1.1605530977249146, -1.2648217678070068, -1.2078478336334229, -0.6887795329093933, -0.5347774028778076, -7.112590789794922, -5.313528060913086, -2.8382933139801025, -2.17812180519104, -1.6449476480484009, -1.1055173873901367, -1.562923789024353, -1.7412986755371094, -1.3868542909622192, -0.6552503705024719, -0.08430500328540802, 0.056784000247716904, -0.8490777015686035, -1.2237876653671265, -0.3313363194465637, 0.1151110976934433, 1.1172733306884766, -0.7849849462509155, -1.1281226873397827, -0.4740486741065979, 0.20113703608512878, 0.46706873178482056, 3.3443868160247803, 0.0019720655400305986, 0.13751398026943207, 0.11463986337184906, -0.054993316531181335, 0.0005939880502410233, 0.11016981303691864, 0.6726107597351074, 0.042212970554828644, -0.03931845352053642, -0.3522316515445709, -4.168498516082764, -1.773709774017334, -0.7661309242248535, 2.926222324371338, 15.713441848754883, 0.20957282185554504, -0.12710338830947876, -0.15954293310642242, -0.03282167389988899, -0.20720987021923065, 0.11721758544445038, 0.041065141558647156, -0.032421231269836426, -0.13650856912136078, -0.127809077501297, -0.07367092370986938, 0.06390083581209183, 0.058594707399606705, -0.10104340314865112, -0.10050068795681, 0.012421872466802597, 0.04457055777311325, -0.13037733733654022, 0.33397701382637024, -0.09054571390151978, -0.013086449354887009, 0.09852015972137451, 0.15304064750671387, 0.07057426124811172, -0.02443324215710163, -0.061001006513834, 0.13005077838897705, 0.10313422977924347, 0.091720350086689, 0.0019253441132605076, 0.19575555622577667, -0.08634136617183685, -0.07270817458629608, -0.08559800684452057, -0.10676305741071701, -0.12269830703735352, -0.13107672333717346, 0.12739445269107819, 0.03380059450864792, 0.1581369936466217, -0.03735366091132164, -0.14027100801467896, -0.0697922334074974, -0.062155693769454956, 0.1611591875553131, 0.03714694455265999, -0.009726821444928646, -0.10127469152212143, 0.05225877836346626, 0.03888211399316788, -0.005761187989264727, -0.08715536445379257, -0.01650351844727993, -0.12151829898357391, -0.11404469609260559, 0.26282382011413574, 0.24459707736968994, -0.058049142360687256, 0.04820716381072998, 0.07749176770448685, 0.11551076918840408, 0.043929558247327805, -0.2830004394054413, 3.160240888595581, -0.022538000717759132, -0.06248863413929939, -0.09175369888544083, 0.05565928295254707, -0.1255132406949997, -0.1596456915140152, 0.2763366401195526, 4.071994781494141, -0.05163346603512764, 0.07486403733491898, 0.21910560131072998, 0.008399086073040962, 0.12011364847421646, 0.24441072344779968, 0.465086966753006, 6.567686557769775, -0.01316999550908804, 0.28601378202438354, 1.7071956396102905, 1.5287998914718628, -0.687768280506134, -0.8502946496009827, -0.5942376255989075, -0.0449761301279068, -0.2746228277683258, 0.6345289349555969, 1.5856270790100098, 4.527773857116699, 1.6942353248596191, -1.653761625289917, -3.6029293537139893, -4.643495559692383, -11.113751411437988, -6.479907989501953, -8.507214546203613, -6.84465217590332, -7.141478538513184, -5.221799373626709, -4.4340386390686035, -3.9746246337890625, -3.389453649520874, -2.0051987171173096, -2.6005899906158447, -2.96285343170166, -2.7049834728240967, -2.9300992488861084, -2.0001440048217773, -2.0101425647735596, -2.2492759227752686, -1.501780390739441, -3.0788395404815674, -1.837992548942566, -1.7952581644058228, -1.4362595081329346, -1.0592143535614014, -1.1495295763015747, -0.6406679749488831, -1.6174167394638062, -1.0759459733963013, 1.0903568267822266, 1.5277600288391113, -1.2756751775741577, -0.7636460661888123, -0.6033079624176025, -0.5029428005218506, -0.46109431982040405, 2.2874879837036133, -0.8831217288970947, -0.18936757743358612, -0.5557740330696106, -0.8890725374221802, -1.5411829948425293, -1.6013349294662476, -0.5776059627532959, -1.2101696729660034, -0.1772131621837616, -0.5562077164649963, -2.024610996246338, -1.1759512424468994, -0.8539146184921265, -1.0952142477035522, -0.15724796056747437, 1.9753937721252441, -2.115135908126831, -1.0516853332519531, 0.5524421334266663, -0.5522418022155762, -0.898411750793457, -0.5980734825134277, -1.1147339344024658, 0.3609904646873474, 0.14524613320827484, -0.5372028350830078, -1.24443781375885, -1.2413482666015625, -1.141768455505371, -0.7879902124404907, -0.47159528732299805, -6.6832194328308105, -5.458854675292969, -2.722381114959717, -2.206742525100708, -1.5248979330062866, -1.1376259326934814, -1.6945186853408813, -1.5754711627960205, -1.3838223218917847, -0.6915212273597717, -0.13499073684215546, 0.19182723760604858, -0.9086313247680664, -1.2486023902893066, -0.3303142189979553, 0.08454875648021698, 1.1562718152999878, -0.9075783491134644, -1.134928584098816, -0.4533402621746063, 0.9840611219406128, -0.7687405347824097, 0.7144935131072998, 0.04092424735426903, 1.0375465154647827]}, 'datecode': '2016-10-18 17:03', 'configuration': {'benchmarkName': 'OperationPoint_L2Calo_SP', 'etBin': (0, 20), 'etaBin': (0.8, 1.37)}}} - return signatures diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerCutDefs.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerCutDefs.py deleted file mode 100755 index 4a07d4ed2023..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerCutDefs.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration - - -class TrigL2CaloRingerCutDefs(): - - _signatureDict = { - 'signature' : ['e','g'], - } - _pidMap = { - 'tight': 'Tight', 'medium':'Medium', 'loose':'Loose', 'vloose':'VeryLoose', - 'lhtight': 'Tight', 'lhmedium': 'Medium', 'lhloose':'Loose', 'lhvloose': 'VeryLoose' - } - - def __init__(self, threshold, IDinfo, trigType): - self._chainPart = dict() - self.Nodes = list() - self.Weights = list() - self.Bias = list() - self.Thresholds = list() - self.EtBins = list() - self.EtaBins = list() - self.NormalisationRings = list() - self.SectionRings = list() - self.NRings = list() - - from AthenaCommon.Logging import logging - logging.getLogger().info("Importing %s",__name__) - logger = logging.getLogger("TrigMultiVarHypo.TrigL2CaloRingerCutDefs") - logger.info(('CutDefs for chain %s')%(trigType)) - - #local variable - discrs = None - - if not (trigType[0] in self._signatureDict['signature']): - raise RuntimeError('Bad signature') - - # Select the correct threshold. - if (float(threshold) < 15): - if self._signatureDict['signature'][0] in trigType: - # ElectronLowEnergyTightConf - # ElectronLowEnergyMediumConf - # ElectronLowEnergyLooseConf - # ElectronLowEnergyVeryLooseConf - key = ('ElectronLowEnergy%sConf')%(IDinfo) - else: - # PhotonLowEnergyTightConf - # PhotonLowEnergyMediumConf - # PhotonLowEnergyLooseConf - # PhotonLowEnergyVeryLooseConf - key = ('PhotonLowEnergy%sConf')%(IDinfo) - else: #(float(threshold) >= 20): - if self._signatureDict['signature'][0] in trigType: - # ElectronHighEnergyTightConf - # ElectronHighEnergyMediumConf - # ElectronHighEnergyLooseConf - # ElectronHighEnergyVeryLooseConf - key = ('ElectronHighEnergy%sConf')%(self._pidMap[IDinfo]) - else: - # PhotonHighEnergyTightConf - # PhotonHighEnergyMediumConf - # PhotonHighEnergyLooseConf - # PhotonHighEnergyVeryLooseConf - key = ('PhotonHighEnergy%sConf')%(self._pidMap[IDinfo]) - - - - try: - #inport all the discriminators - from TrigMultiVarHypo.TrigL2CaloRingerConstants import SignaturesMap - logger.info('discriminator: %s -> key: %s', trigType, key) - discrs = SignaturesMap()[key] - except: - logger.info(('INCORRECT key info: [%s] not configured.')%(key) ) - - - if discrs: - #This is a dep region hypothesis: row is Et bin and col is eta bin - from TrigMultiVarHypo.TrigRingerPreprocessorDefs import Norm1 - - ppList=list(); discrList=list() - for key_, o in discrs.iteritems(): - ppList.append( Norm1() ) - discrList.append( o ) - - logger.info('parser discrimiator with key: [%s]',key) - #prepare the parser to athena phase - self.__parser(discrList, ppList) - - - def __parser(self, discrList, ppList): - - for discr in discrList: - self.Nodes += discr['discriminator']['nodes'] - self.Thresholds.append( discr['discriminator']['threshold'] ) - self.Weights.append( discr['discriminator']['weights'] ) - self.Bias.append( discr['discriminator']['bias'] ) - self.EtBins.append( discr['configuration']['etBin'] ) - self.EtaBins.append( discr['configuration']['etaBin'] ) - - for pp in ppList: - #Prepoc configuration - self.NormalisationRings += pp.NormalisationRings - self.SectionRings += pp.SectionRings - self.NRings += pp.NRings - - - - - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerFexMTInit.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerFexMTInit.py deleted file mode 100755 index 7cb18851af92..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerFexMTInit.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -# - -from TrigMultiVarHypo.TrigL2CaloRingerCutDefs import TrigL2CaloRingerCutDefs -from TrigMultiVarHypo.TrigMultiVarHypoConf import TrigL2CaloRingerFexMT - -def init_ringer(): - - ringer = TrigL2CaloRingerFexMT() - - threshold = 15 - IDinfo = 'loose' - trigType = 'e' - theRingerConfig = TrigL2CaloRingerCutDefs(threshold,IDinfo,trigType) - - #Prepoc configuration - ringer.NRings = theRingerConfig.NRings - ringer.SectionRings = theRingerConfig.SectionRings - ringer.NormalisationRings = theRingerConfig.NormalisationRings - - #MultiLayerPerceptron configuration - ringer.Nodes = theRingerConfig.Nodes - ringer.Threshold = theRingerConfig.Thresholds - ringer.Bias = theRingerConfig.Bias - ringer.Weights = theRingerConfig.Weights - ringer.EtaBins = theRingerConfig.EtaBins - ringer.EtBins = theRingerConfig.EtBins - - ringer = add_monitoring(ringer) - - return ringer - -def add_monitoring(tool): - - - from TriggerJobOpts.TriggerFlags import TriggerFlags - - from AthenaMonitoring.GenericMonitoringTool import GenericMonitoringTool, defineHistogram - monTool = GenericMonitoringTool("RingerFexMon") - - monTool.Histograms = [ defineHistogram('Et', type='TH1F', path='EXPERT', title="E_{T}", xbins=50, xmin=0, xmax=50), - defineHistogram('Eta', type='TH1F', path='EXPERT', title="#eta", xbins=25, xmin=0, xmax=2.5), - defineHistogram('rnnOut', type='TH1F', path='EXPERT', title="NN output", xbins=80, xmin=-1, xmax=1), - defineHistogram('Eta,rnnOut', type='TH2F', path='EXPERT', title="NN output as function of #eta", xbins=15, xmin=0, xmax=2.5, ybins=80, ymin=-1, ymax=1), - defineHistogram('Et,rnnOut', type='TH2F', path='EXPERT', title="NN output as function of E_{T}", xbins=20, xmin=0, xmax=50, ybins=80, ymin=-1, ymax=1), - defineHistogram( "TIME_total", path='EXPERT', title="Total Time;time[ms]", xbins=50, xmin=0, xmax=100 ), - defineHistogram( "TIME_preprocess", path='EXPERT', title="Preprocessing Time;time[ms]", xbins=50, xmin=0, xmax=50 ), - defineHistogram( "TIME_decision", path='EXPERT', title="Decision Time;time[ms]", xbins=50, xmin=0, xmax=50 )] - tool.MonTool = monTool - - monTool.HistPath = 'TrigL2CaloRinger/'+tool.name() - tool.MonTool = monTool - tool += monTool - return tool - - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoConfig.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoConfig.py index bf701bbe5622..35a350abe191 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoConfig.py +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoConfig.py @@ -1,113 +1,16 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration # Authors: joao victor pinto <jodafons@cern.ch> + from TrigMultiVarHypo.TrigMultiVarHypoConf import TrigL2CaloRingerFex, TrigL2CaloRingerHypo from AthenaCommon.SystemOfUnits import GeV - - - -class TrigL2CaloRingerPidConfs: - - """ - This class will be responsible to build all calib - paths and point the hypo to the ATLAS calib area files. - This will be implemented here for now. To switch between - tuning, you just need add this in your job option - e.g: - from TriggerMenu.egamma.EgammaSliceFlags import EgammaSliceFlags - EgammaSliceFlags.ringerVersion = 'RingerSelectorTools/file_of_your_ringer_confs' - """ - - _signatureDict = { - 'signature' : ['e','g'], - } - - _pidMap = { - 'tight' : 'tight' , - 'medium' :'medium' , - 'loose' :'loose' , - 'vloose' :'vloose' , - 'lhtight' : 'tight' , - 'lhmedium': 'medium', - 'lhloose' :'loose' , - 'lhvloose': 'vloose' - } - - # The default path for ringer selectors. The standard cuts will be the ringer v6 tuning for now. - # Last modification in: 2017/02/21 - # MC15c tuning if pileup corrention using data 2016 (periods A to K) to fix all thresholds values - _default_basepath = 'RingerSelectorTools/TrigL2_20170221_v6' - - def __init__(self): - - from AthenaCommon.Logging import logging - self._logger = logging.getLogger("TrigMultiVarHypo.TrigL2CaloRingerPidConfs") - - #TODO: Use this to configurate the calib path from triggerMenu flags - from TriggerMenu.egamma.EgammaSliceFlags import EgammaSliceFlags - if EgammaSliceFlags.ringerVersion(): - self._basePath = EgammaSliceFlags.ringerVersion() - self._logger.info('TrigMultiVarHypo version: %s',self._basePath) - else: - self._basePath = self._default_basepath - self._logger.info('TrigMultiVarHypo version: %s (default)',self._basePath) - - # Electron files - self._electronConstants = { - 'vloose' : 'TrigL2CaloRingerElectronVeryLooseConstants.root', - 'loose' : 'TrigL2CaloRingerElectronLooseConstants.root', - 'medium' : 'TrigL2CaloRingerElectronMediumConstants.root', - 'tight' : 'TrigL2CaloRingerElectronTightConstants.root', - } - self._electronCutDefs = { - 'vloose' : 'TrigL2CaloRingerElectronVeryLooseThresholds.root', - 'loose' : 'TrigL2CaloRingerElectronLooseThresholds.root', - 'medium' : 'TrigL2CaloRingerElectronMediumThresholds.root', - 'tight' : 'TrigL2CaloRingerElectronTightThresholds.root', - } - - #TODO: photon paths for future - self._photonConstants = { - 'vloose' : 'TrigL2CaloRingerPhotonVeryLooseConstants.root', - 'loose' : 'TrigL2CaloRingerPhotonLooseConstants.root', - 'medium' : 'TrigL2CaloRingerPhotonMediumConstants.root', - 'tight' : 'TrigL2CaloRingerPhotonTightConstants.root', - } - self._photonCutDefs = { - 'vloose' : 'TrigL2CaloRingerPhotonVeryLooseThresholds.root', - 'loose' : 'TrigL2CaloRingerPhotonLooseThresholds.root', - 'medium' : 'TrigL2CaloRingerPhotonMediumThresholds.root', - 'tight' : 'TrigL2CaloRingerPhotonTightThresholds.root', - } - - - def get_constants_path(self, trigType, IDinfo): - if not (trigType[0] in self._signatureDict['signature']): - raise RuntimeError('Bad signature') - # is Electron - if self._signatureDict['signature'][0] in trigType: - return self._basePath + '/' +self._electronConstants[self._pidMap[IDinfo]] - else: #is Photon - #TODO: this will be uncoment when we have photon tuning - #return self._basePath + '/' +self._photonConstants[self._pidMap[IDinfo]] - return str() - - def get_cutDefs_path(self, trigType, IDinfo): - if not (trigType[0] in self._signatureDict['signature']): - raise RuntimeError('Bad signature') - # is Electron - if self._signatureDict['signature'][0] in trigType: - return self._basePath + '/' +self._electronCutDefs[self._pidMap[IDinfo]] - else: #is Photon - #TODO: this will be uncoment when we have photon tuning - #return self._basePath + '/' +self._photonCutDefs[self._pidMap[IDinfo]] - return str() - -# Instance object here! -# For future use this object to call all paths -theRingerConfig = TrigL2CaloRingerPidConfs() - +from TrigMultiVarHypo.TrigL2CaloRingerHypoTool import _GetPath +from TrigMultiVarHypo.TrigL2CaloRingerHypoMonitoring import TrigL2CaloRingerHypoValidationMonitoring, \ + TrigL2CaloRingerHypoOnlineMonitoring,\ + TrigL2CaloRingerHypoTimeMonitoring,\ + TrigL2CaloRingerFexTimeMonitoring + # Call all Trigger Ringer Fast configurations here! class TrigL2CaloRingerFexBase( TrigL2CaloRingerFex ): @@ -117,21 +20,15 @@ class TrigL2CaloRingerFexBase( TrigL2CaloRingerFex ): self.HltFeature = "TrigRingerNeuralFex" self.Feature = "TrigT2CaloEgamma" - from TrigMultiVarHypo.TrigL2CaloRingerHypoMonitoring import TrigL2CaloRingerHypoValidationMonitoring, \ - TrigL2CaloRingerHypoOnlineMonitoring,\ - TrigL2CaloRingerHypoTimeMonitoring - validation = TrigL2CaloRingerHypoValidationMonitoring() - online = TrigL2CaloRingerHypoOnlineMonitoring() - time = TrigL2CaloRingerHypoTimeMonitoring() - self.AthenaMonTools = [ time, validation, online ] - self.doTiming = True - -''' - The multi layer perceptron and preprocessing step is called by - Fex because we store the output network. So to complete the trigger - chain you must uses the Fex and Hypo together. -''' + #time = TrigL2CaloRingerFexTimeMonitoring() + #self.AthenaMonTools = [ time ] + #self.doTiming = True + + +# The multi layer perceptron and preprocessing step is called by +# Fex because we store the output network. So to complete the trigger +# chain you must uses the Fex and Hypo together. class TrigL2CaloRingerFex( TrigL2CaloRingerFexBase ): __slots__ = [] def __init__(self, name, threshold, IDinfo, trigType): @@ -140,16 +37,10 @@ class TrigL2CaloRingerFex( TrigL2CaloRingerFexBase ): from AthenaCommon.AppMgr import ToolSvc from LumiBlockComps.LuminosityToolDefault import LuminosityToolOnline ToolSvc += LuminosityToolOnline() + pconstants,pthresholds=_GetPath(trigType,IDinfo) #if this is empty, the fex will work like EtCut - self.CalibPath = theRingerConfig.get_constants_path(trigType, IDinfo) + self.CalibPath =pconstants - # The standard preproc to normalize the rings - from TrigMultiVarHypo.TrigRingerPreprocessorDefs import Norm1 - preproc = Norm1() - - self.SectionRings = preproc.SectionRings - self.NormalisationRings = preproc.NormalisationRings - self.NRings = preproc.NRings @@ -160,17 +51,16 @@ class TrigL2CaloRingerFex_Empty( TrigL2CaloRingerFexBase ): -''' - Hypothesis group for electron trigger, NoCut step (bypass) and - photons chains for future. Because the neural output store, - you must put the Fex and Hypo together in the same sequence - list. For example: - L2SequenceList = [theT2CaloEgamma_Ringer, - theTrigL2CaloRingerFex, theTrigL2CaloRingerHypo] +# Hypothesis group for electron trigger, NoCut step (bypass) and +# photons chains for future. Because the neural output store, +# you must put the Fex and Hypo together in the same sequence +# list. For example: +# L2SequenceList = [theT2CaloEgamma_Ringer, +# theTrigL2CaloRingerFex, theTrigL2CaloRingerHypo] +# +# the same configuration must be passed to fex and hypo when +# you create the objects. - the same configuration must be passed to fex and hypo when - you create the objects. -''' class TrigL2CaloRingerHypo_e_ID(TrigL2CaloRingerHypo): __slots__ = [] @@ -180,7 +70,13 @@ class TrigL2CaloRingerHypo_e_ID(TrigL2CaloRingerHypo): self.HltFeature = 'TrigRingerNeuralFex' self.AcceptAll = False self.EmEtCut = (float(threshold) - 3)*GeV - self.CalibPath = theRingerConfig.get_cutDefs_path(trigType, IDinfo) + pconstants,pthresholds=_GetPath(trigType,IDinfo) + self.CalibPath = pthresholds + #validation = TrigL2CaloRingerHypoValidationMonitoring() + #online = TrigL2CaloRingerHypoOnlineMonitoring() + #time = TrigL2CaloRingerHypoTimeMonitoring() + #self.AthenaMonTools = [ time, validation, online ] + #self.doTiming = True @@ -193,7 +89,14 @@ class TrigL2CaloRingerHypo_g_ID(TrigL2CaloRingerHypo): self.HltFeature = 'TrigRingerNeuralFex' self.AcceptAll = False self.EmEtCut = (float(threshold) - 3)*GeV - self.CalibPath = theRingerConfig.get_cutDefs_path(trigType, IDinfo) + pconstants,pthresholds=_GetPath(trigType,IDinfo) + self.CalibPath = pthresholds + #validation = TrigL2CaloRingerHypoValidationMonitoring() + #online = TrigL2CaloRingerHypoOnlineMonitoring() + #time = TrigL2CaloRingerHypoTimeMonitoring() + #self.AthenaMonTools = [ time, validation, online ] + #self.doTiming = True + class TrigL2CaloRingerHypo_NoCut(TrigL2CaloRingerHypo): @@ -203,6 +106,12 @@ class TrigL2CaloRingerHypo_NoCut(TrigL2CaloRingerHypo): super( TrigL2CaloRingerHypo_NoCut, self ).__init__( name ) self.HltFeature = 'TrigRingerNeuralFex' self.AcceptAll = True + #validation = TrigL2CaloRingerHypoValidationMonitoring() + #online = TrigL2CaloRingerHypoOnlineMonitoring() + #time = TrigL2CaloRingerHypoTimeMonitoring() + #self.AthenaMonTools = [ time, validation, online ] + #self.doTiming = True + class TrigL2CaloRingerHypo_EtCut(TrigL2CaloRingerHypo): __slots__ = [] @@ -212,6 +121,12 @@ class TrigL2CaloRingerHypo_EtCut(TrigL2CaloRingerHypo): self.HltFeature = 'TrigRingerNeuralFex' self.AcceptAll = False self.EmEtCut = (float(threshold) - 3)*GeV + #validation = TrigL2CaloRingerHypoValidationMonitoring() + #online = TrigL2CaloRingerHypoOnlineMonitoring() + #time = TrigL2CaloRingerHypoTimeMonitoring() + #self.AthenaMonTools = [ time, validation, online ] + #self.doTiming = True + @@ -254,4 +169,3 @@ def TrigL2CaloRingerFexHypo_g_EtCut(threshold): - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoMonitoring.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoMonitoring.py index 0e978485526b..1e1f33299df7 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoMonitoring.py +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoMonitoring.py @@ -1,5 +1,5 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig class TrigL2CaloRingerHypoValidationMonitoring(TrigGenericMonitoringToolConfig): @@ -26,7 +26,7 @@ class TrigL2CaloRingerHypoTimeMonitoring(TrigGenericMonitoringToolConfig): def __init__(self, name = "TrigL2CaloRingerHypoTimeMonitoring"): super(TrigL2CaloRingerHypoTimeMonitoring,self).__init__(name) self.defineTarget("Time") - self.Histograms = [defineHistogram('TotalTime', + self.Histograms = [defineHistogram('Total', type='TH1F',title='TotalTime' ,xbins=220,xmin=0.0,xmax=0.2)] @@ -34,17 +34,25 @@ class TrigL2CaloRingerFexTimeMonitoring(TrigGenericMonitoringToolConfig): __slots__ = [] def __init__(self, name = "TrigL2CaloRingerFexTimeMonitoring"): + super(TrigL2CaloRingerFexTimeMonitoring,self).__init__(name) self.defineTarget("Time") - self.Histograms = [defineHistogram('TotalTime', - type='TH1F',title='TotalTime' - ,xbins=220,xmin=0.0,xmax=0.2)] - self.Histograms += [defineHistogram('Decision', + self.Histograms = [defineHistogram('Total', type='TH1F',title='Decision' - ,xbins=220,xmin=0.0,xmax=0.2)] + ,xbins=50,xmin=0.0,xmax=5.0)] + self.Histograms = [defineHistogram('Decision', + type='TH1F',title='Decision' + ,xbins=50,xmin=0.0,xmax=5.0)] self.Histograms += [defineHistogram('Normalization', type='TH1F',title='Normalization' - ,xbins=220,xmin=0.0,xmax=0.2)] + ,xbins=50,xmin=0.0,xmax=0.3)] + self.Histograms += [defineHistogram('Propagation', + type='TH1F',title='Propagation' + ,xbins=50,xmin=0.0,xmax=0.3)] self.Histograms += [defineHistogram('StoreOutput', type='TH1F',title='StoreOutput' - ,xbins=220,xmin=0.0,xmax=0.2)] + ,xbins=50,xmin=0.0,xmax=5.0)] + + + + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoTool.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoTool.py new file mode 100644 index 000000000000..367e58ace837 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigL2CaloRingerHypoTool.py @@ -0,0 +1,143 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +import re + +_pattern = "(?P<mult>\d*)(e(?P<threshold1>\d+))(e(?P<threshold2>\d+))*" +_cpattern = re.compile( _pattern ) +_possibleSel = { 'tight':'Tight', 'medium':'Medium', 'loose':'Loose', 'vloose':'VeryLoose', + 'lhtight':'Tight', 'lhmedium':'Medium', 'lhloose':'Loose', 'lhvloose':'VeryLoose'} + +from AthenaCommon.SystemOfUnits import GeV + + + + + +def _GetPath( cand, sel, basepath = 'RingerSelectorTools/TrigL2_20170221_v6' ): + + from AthenaCommon.Logging import logging + logger = logging.getLogger("TrigMultiVarHypo.GetPath") + from TriggerMenu.egamma.EgammaSliceFlags import EgammaSliceFlags + if EgammaSliceFlags.ringerVersion(): + basepath = EgammaSliceFlags.ringerVersion() + logger.info('TrigMultiVarHypo version: %s', basepath) + if not sel in _possibleSel.keys(): + raise RuntimeError( "Bad selection name: %s" % sel ) + if 'e' in cand: + constant = basepath+'/'+ 'TrigL2CaloRingerElectron{SEL}Constants.root'.format(SEL=_possibleSel[sel]) + threshold = basepath+'/'+ 'TrigL2CaloRingerElectron{SEL}Thresholds.root'.format(SEL=_possibleSel[sel]) + elif 'g' in cand: + constant = basepath+'/'+ 'TrigL2CaloRingerPhoton{SEL}Constants.root'.format(SEL=_possibleSel[sel]) + threshold = basepath+'/'+ 'TrigL2CaloRingerPhoton{SEL}Thresholds.root'.format(SEL=_possibleSel[sel]) + else: + raise RuntimeError( "Bad signature %s" % cand ) + return constant, threshold + + + + + + + + + + +def _HypoTool(name, cand, threshold, sel): + + from TrigMultiVarHypo.TrigMultiVarHypoConf import TrigL2CaloRingerHypoToolMT + tool = TrigL2CaloRingerHypoToolMT( name ) + tool.AcceptAll = False + tool.MonTool = "" + tool.EtCut = (float(threshold)-3.)*GeV + + from TriggerJobOpts.TriggerFlags import TriggerFlags + if 'Validation' in TriggerFlags.enableMonitoring() or 'Online' in TriggerFlags.enableMonitoring(): + + from AthenaMonitoring.GenericMonitoringTool import GenericMonitoringTool,defineHistogram + monTool = GenericMonitoringTool('MonTool'+name) + monTool.Histograms = [ + defineHistogram( "TIME_total", path='EXPERT',title="Total Time;time[ms]",xbins=50, xmin=0,xmax=5,type='TH1F'), + defineHistogram( "TIME_preproc", path='EXPERT',title="Total Time;time[ms]",xbins=50, xmin=0,xmax=5,type='TH1F'), + defineHistogram( "TIME_propagate",path='EXPERT', title="Total Time;time[ms]",xbins=50, xmin=0,xmax=5,type='TH1F'), + defineHistogram('Eta', type='TH1F', path='EXPERT',title="#eta of Clusters; #eta; number of RoIs", xbins=50,xmin=-2.5,xmax=2.5), + defineHistogram('Phi',type='TH1F', path='EXPERT',title="#phi of Clusters; #phi; number of RoIs", xbins=64,xmin=-3.2,xmax=3.2), + defineHistogram('Et',type='TH1F', path='EXPERT',title="E_{T} of Clusters; E_{T} [MeV]; number of RoIs", xbins=60,xmin=0,xmax=5e4), + defineHistogram('RnnOut',type='TH1F', path='EXPERT',title="E_{T} of Clusters; E_{T} [MeV]; number of RoIs", xbins=100,xmin=-10,xmax=10), + ] + + monTool.HistPath='L2CaloHypo_Ringer/'+monTool.name() + tool.MonTool=monTool + + + + + if sel == 'nocut': + tool.AcceptAll = True + elif sel == "etcut": + tool.EtCut = (float(threshold)-3.)*GeV + elif sel in _possibleSel.keys(): # real selection + pconstants, pthresholds = _GetPath( cand, sel ) + tool.ConstantsCalibPath = pconstants + tool.ThresholdsCalibPath = pthresholds + + return tool + + +def _AlgTool(name): + from TrigMultiVarHypo.TrigMultiVarHypoConf import TrigL2CaloRingerHypoAlgMT + return TrigL2CaloRingerHypoAlgMT( name ) + + +def decodeThreshold( threshold ): + """ decodes the thresholds of the form e10, 2e10, e10e15, ... """ + print "TrigL2CaloHypoToolFromName: decoding threshold ", threshold + if threshold[0].isdigit(): # is if the from NeX, return as list [X,X,X...N times...] + assert threshold[1] == 'e', "Two digit multiplicity not supported" + return [ threshold[2:] ] * int( threshold[0] ) + if threshold.count('e') > 1: # is of the form eXeYeZ, return as [X, Y, Z] + return threshold.strip('e').split('e') + if threshold.count('g') > 1: # us of the form gXgYgZ, return as [X, Y, Z] + return threshold.strip('g').split('g') + # inclusive, return as 1 element list + return [ threshold[1:] ] , threshold[0] + + + + + +def createRingerDecisions( name, chains, ClustersKey="CaloClusters",RingerKey="CaloRings" ): + + # set the name of the HypoTool (name=chain) and figure out the threshold and selection from conf """ + from AthenaCommon.Constants import INFO + tool = _AlgTool(name) + from AthenaCommon.AppMgr import ToolSvc + from LumiBlockComps.LuminosityToolDefault import LuminosityToolOnline + ToolSvc+=LuminosityToolOnline() + + if not type(chains) is list: + chains=[chains] + + hypotools = [] + for c in chains: + #print "Configuring ", name + bname = c.split('_') + threshold = bname[1] + sel = bname[2] + dt, cand = decodeThreshold( threshold ) + hypotools.append(_HypoTool( c, cand, dt[0], sel )) + + for t in tool.HypoTools: + t.OutputLevel=INFO + + tool.HypoTools = hypotools + tool.ClustersKey = ClustersKey + tool.RingerKey = RingerKey + return tool + + + + + + + + + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigRingerPreprocessorDefs.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigRingerPreprocessorDefs.py deleted file mode 100644 index cbc72921384d..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/TrigRingerPreprocessorDefs.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration - -class Norm1(object): - - def __init__(self): - from TrigT2CaloEgamma.RingerConstants import Section, Normalisation - - # this part config the TrigRingerPrepoc - self.NormalisationRings = [Normalisation.EVENT, - Normalisation.EVENT, - Normalisation.EVENT, - Normalisation.EVENT, - Normalisation.EVENT, - Normalisation.EVENT, - Normalisation.EVENT]; - - self.SectionRings = [Section.EM, - Section.EM, - Section.EM, - Section.EM, - Section.HAD, - Section.HAD, - Section.HAD]; - - # Only change this if you know what you are doing - # default configuration from RingerFex - self.NRings = [8, 64, 8, 8, 4, 4, 4] - - - -class Sequential(object): - - def __init__(self): - from TrigT2CaloEgamma.RingerConstants import Section, Normalisation - - # this part config the TrigRingerPrepoc - self.NormalisationRings = [Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL, - Normalisation.SEQUENTIAL]; - - self.SectionRings = [Section.EM, - Section.EM, - Section.EM, - Section.EM, - Section.HAD, - Section.HAD, - Section.HAD]; - - # Only change this if you know what you are doing - # default configuration from RingerFex - self.NRings = [8, 64, 8, 8, 4, 4, 4] - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/__init__.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/__init__.py index d1d85aba3415..e71879d76577 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/python/__init__.py +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/python/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration # File: TrigMultiVarHypo/__init__.py diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/share/convert2version1.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/share/convert2version1.py index 97b85ea61d32..bed34abbc669 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/share/convert2version1.py +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/share/convert2version1.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration from RingerCore import Logger, LoggingLevel, retrieve_kw, checkForUnusedVars diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/share/switch_tuning.py b/Trigger/TrigHypothesis/TrigMultiVarHypo/share/switch_tuning.py index 5c041ac43f83..ee36d04b0a8a 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/share/switch_tuning.py +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/share/switch_tuning.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration import argparse mainParser = argparse.ArgumentParser() diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFex.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFex.cxx index ead3fd197d4e..373d8fec9e93 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFex.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFex.cxx @@ -4,42 +4,34 @@ ///Local include(s) #include "TrigMultiVarHypo/TrigL2CaloRingerFex.h" -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" - -///xAOD include(s) #include "xAODTrigCalo/TrigEMCluster.h" #include "xAODTrigRinger/TrigRNNOutput.h" #include "xAODTrigRinger/TrigRNNOutputContainer.h" #include "xAODTrigRinger/TrigRingerRings.h" #include "xAODTrigRinger/TrigRingerRingsContainer.h" +#include "TrigMultiVarHypo/tools/procedures/IModel.h" +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" +#include "TrigMultiVarHypo/tools/procedures/Norm1.h" + + ///std include(s) #include <new> #include <cmath> - -#define SIZEOF_NODES 3 -#define SIZEOF_RINGSETS 7 - #include <iostream> using namespace std; //!=============================================================================================== TrigL2CaloRingerFex::TrigL2CaloRingerFex(const std::string& name, ISvcLocator* pSvcLocator): - HLT::FexAlgo(name, pSvcLocator), m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), + HLT::FexAlgo(name, pSvcLocator), + m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), m_reader("TrigL2CaloRingerReader") { declareProperty("HltFeature" , m_hlt_feature = "TrigRingerNeuralFex" ); declareProperty("Feature" , m_feature = "TrigT2CaloEgamma" ); - declareProperty("NormalisationRings", m_normRings ); - declareProperty("SectionRings" , m_sectionRings ); - declareProperty("NRings" , m_nRings ); declareProperty("CalibPath" , m_calibPath = "" ); declareProperty("LuminosityTool" , m_lumiBlockMuTool, "Luminosity Tool" ); - declareMonitoredVariable("NeuralNetworkOutput", m_output ); - m_useLumiVar=false; - m_useEtaVar=false; m_key = ""; } @@ -49,77 +41,44 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltInitialize() // Retrieve the NeuralNetwork list if(!m_calibPath.empty()){ if(!m_reader.retrieve(m_calibPath, m_discriminators)){ - msg() << MSG::ERROR << "Can not retrieve all information from " << m_calibPath << endmsg; + ATH_MSG_ERROR("Can not retrieve all information from " << m_calibPath); return HLT::BAD_JOB_SETUP; } - m_useLumiVar = m_reader.useLumiVar(); - m_useEtaVar = m_reader.useEtaVar(); - } - - if(m_nRings.size() != m_normRings.size()){ - msg() << MSG::ERROR << "Preproc nRings list dont match with the number of discriminators found" << endmsg; - return HLT::BAD_JOB_SETUP; - } - - if(m_sectionRings.size() != m_normRings.size()){ - msg() << MSG::ERROR << "Preproc section rings list dont match with the number of discriminators found" << endmsg; - return HLT::BAD_JOB_SETUP; } - ///TODO: This is default for now, apply this into the conf file for future - ///Initialize all discriminators - for(unsigned i=0; i<m_discriminators.size(); ++i) - { - TrigRingerPreprocessor *preproc; - try{ - preproc = new TrigRingerPreprocessor(m_nRings,m_normRings,m_sectionRings); - }catch(const std::bad_alloc& xa){ - msg() << MSG::ERROR << "Bad alloc for TrigRingerPrepoc." << endmsg; - return HLT::BAD_JOB_SETUP; - } - ///Hold the pointer configuration - m_preproc.push_back(preproc); - }///Loop over discriminators - - ///Monitoring hitograms if(doTiming()){ + m_totalTimer = addTimer("Total"); m_normTimer = addTimer("Normalization"); - m_decisionTimer = addTimer("Decision"); + m_propagateTimer= addTimer("Propagation"); m_storeTimer = addTimer("StoreOutput"); }///Only if time is set on python config m_useLumiTool=false; if (m_lumiBlockMuTool.retrieve().isFailure()) { - msg() << MSG::WARNING << "Unable to retrieve Luminosity Tool" << endmsg; + ATH_MSG_WARNING("Unable to retrieve Luminosity Tool"); } else { m_useLumiTool=true; // Tell to the execute that the LumiTool is available... - msg() << MSG::INFO << "Successfully retrieved Luminosity Tool" << endmsg; + ATH_MSG_INFO("Successfully retrieved Luminosity Tool"); } - - msg() << MSG::INFO << "Using the Luminosity tool? " << (m_useLumiTool ? "Yes":"No") << endmsg; - msg() << MSG::INFO << "Using lumiVar? " << (m_useLumiVar ? "Yes":"No") << endmsg; - msg() << MSG::INFO << "Using etaVar? " << (m_useEtaVar ? "Yes":"No") << endmsg; - - msg() << MSG::INFO << "TrigL2CaloRingerHypo initialization completed successfully." << endmsg; - msg() << MSG::INFO << "TrigL2CaloRingerHypo initialization completed successfully." << endmsg; + + // NOTE: Norm1 standard normalization used for Run2 (only for ringer shape) + m_preproc.push_back( std::make_shared<Ringer::Norm1>(-999.,999.,-999,999,-999,999.,true) ); + + ATH_MSG_INFO("Using the Luminosity tool? " << (m_useLumiTool ? "Yes":"No") ); + ATH_MSG_INFO( "TrigL2CaloRingerHypo initialization completed successfully." ); return HLT::OK; } //!=============================================================================================== HLT::ErrorCode TrigL2CaloRingerFex::hltFinalize() { - ///release memory - for(unsigned i=0; i<m_discriminators.size();++i){ - if(m_preproc.at(i)) delete m_preproc.at(i); - if(m_discriminators.at(i)) delete m_discriminators.at(i); - }///Loop over all discriminators and prepoc objects - msg() << MSG::INFO << "TrigL2CaloRingerHypo finalization completed successfully." << endmsg; - + ATH_MSG_INFO( "TrigL2CaloRingerHypo finalization completed successfully." ); return HLT::OK; } //!=============================================================================================== HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inputTE*/, HLT::TriggerElement* outputTE){ + if(doTiming()) m_totalTimer->start(); // For now, this must be [avgmu, rnnOutputWithTansig, rnnOutputWithoutTansig] m_output=-999; std::vector<float> output; @@ -127,7 +86,8 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu ///Retrieve rings pattern information const xAOD::TrigRingerRings *ringerShape = get_rings(outputTE); if(!ringerShape){ - msg() << MSG::WARNING << "Can not retrieve xADO::TrigRingerRings from storegate." << endmsg; + ATH_MSG_WARNING( "Can not retrieve xADO::TrigRingerRings from storegate." ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; }///protection @@ -136,16 +96,16 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu ///Check if emCluster link exist if(!emCluster){ - msg() << MSG::WARNING << "Can not found the xAOD::TrigEMCluster link" << endmsg; + ATH_MSG_WARNING( "Can not found the xAOD::TrigEMCluster link" ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; }///protection - msg() << MSG::DEBUG << "Event with roiword: 0x" << std::hex << emCluster->RoIword() << std::dec << endmsg; + ATH_MSG_DEBUG( "Event with roiword: 0x" << std::hex << emCluster->RoIword() << std::dec ); + - ///It's ready to select the correct eta/et bin - MultiLayerPerceptron *discr = nullptr; - TrigRingerPreprocessor *preproc = nullptr; + std::shared_ptr<Ringer::IModel> discr; float eta = std::fabs(emCluster->eta()); float et = emCluster->et()*1e-3; ///in GeV @@ -155,8 +115,8 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu if(m_lumiBlockMuTool){ mu = m_lumiBlockMuTool->actualInteractionsPerCrossing(); // (retrieve mu for the current BCID) avgmu = m_lumiBlockMuTool->averageInteractionsPerCrossing(); - msg() << MSG::DEBUG << "Retrieved Mu Value : " << mu<< endmsg; - msg() << MSG::DEBUG << "Average Mu Value : " << avgmu<< endmsg; + ATH_MSG_DEBUG("Retrieved Mu Value : " << mu); + ATH_MSG_DEBUG("Average Mu Value : " << avgmu); } } @@ -165,7 +125,7 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu // Add avgmu! output.push_back(avgmu); - if(doTiming()) m_decisionTimer->start(); + if(m_discriminators.size() > 0){ @@ -174,57 +134,37 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu if(et > m_discriminators[i]->etmin() && et <= m_discriminators[i]->etmax()){ if(eta > m_discriminators[i]->etamin() && eta <= m_discriminators[i]->etamax()){ discr = m_discriminators[i]; - preproc = m_preproc[i]; break; }// mu conditions }///eta conditions }///Et conditions }///Loop over discriminators - msg() << MSG::DEBUG << "Et = " << et << " GeV, |eta| = " << eta << endmsg; + ATH_MSG_DEBUG( "Et = " << et << " GeV, |eta| = " << eta ); ///Apply the discriminator if(discr){ - const std::vector<float> rings = ringerShape->rings(); std::vector<float> refRings(rings.size()); refRings.assign(rings.begin(), rings.end()); ///pre-processing ringer shape (default is Norm1...) if(doTiming()) m_normTimer->start(); - if(preproc) preproc->ppExecute(refRings); - if(doTiming()) m_normTimer->stop(); - - - float eta_norm=0.0; - float avgmu_norm=0.0; - - // Add extra variables in this order! Do not change this!!! - if(m_useEtaVar){ - if(preproc){ - eta_norm = preproc->normalize_eta(emCluster->eta(), discr->etamin(), discr->etamax()); - refRings.push_back(eta_norm); - } - } - - if(m_useLumiVar){ - if(preproc){ - avgmu_norm = preproc->normalize_mu(avgmu, m_lumiCut); - refRings.push_back(avgmu_norm); - } - } - - m_output=discr->propagate(refRings); - output.push_back(m_output); - output.push_back(discr->getOutputBeforeTheActivationFunction()); + m_preproc.at(0)->execute(refRings); + if(doTiming()) m_normTimer->stop(); + if(doTiming()) m_propagateTimer->start(); + auto answer = discr->propagate(refRings); + if(doTiming()) m_propagateTimer->stop(); + output.push_back(answer.output); + output.push_back(answer.outputBeforeTheActivationFunction); }// has discr? }else{ - msg() << MSG::DEBUG << "There is no discriminator into this Fex." << endmsg; + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); } - if(doTiming()) m_decisionTimer->stop(); - msg() << MSG::DEBUG << "Et = " << et << " GeV, |eta| = " << eta << " and rnnoutput = " << m_output << endmsg; + + ATH_MSG_DEBUG( "Et = " << et << " GeV, |eta| = " << eta << " and rnnoutput = " << m_output ); if(doTiming()) m_storeTimer->start(); ///Store outout information for monitoring and studys @@ -238,15 +178,17 @@ HLT::ErrorCode TrigL2CaloRingerFex::hltExecute(const HLT::TriggerElement* /*inpu hltStatus = getFeatureLink<xAOD::TrigRingerRingsContainer,xAOD::TrigRingerRings>(outputTE, ringer_link); if( (hltStatus != HLT::OK) || (!ringer_link.isValid())){ - msg() << MSG::WARNING << "Failed to access ElementLink to TrigRingerRings" << endmsg; + ATH_MSG_WARNING( "Failed to access ElementLink to TrigRingerRings" ); }else{ rnnOutput->setRingerLink( ringer_link ); } hltStatus = recordAndAttachFeature<xAOD::TrigRNNOutput>(outputTE, rnnOutput, m_key, m_hlt_feature); - if(doTiming()) m_storeTimer->stop(); - + if(doTiming()){ + m_storeTimer->stop(); + m_totalTimer->stop(); + } if (hltStatus != HLT::OK) { - msg() << MSG::WARNING << "Failed to record xAOD::TrigRNNOutput to StoreGate." << endmsg; + ATH_MSG_WARNING( "Failed to record xAOD::TrigRNNOutput to StoreGate." ); return HLT::OK; } diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.cxx deleted file mode 100644 index 3b0bbb061961..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.cxx +++ /dev/null @@ -1,253 +0,0 @@ -/* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration -*/ - -#include "CLHEP/Units/SystemOfUnits.h" -#include "AthenaMonitoring/Monitored.h" - -#include "xAODTrigCalo/TrigEMClusterContainer.h" -#include "xAODTrigCalo/TrigEMClusterAuxContainer.h" -#include "AthenaMonitoring/Monitored.h" - -#include "TrigL2CaloRingerFexMT.h" -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" - -///xAOD include(s) -#include "xAODTrigCalo/TrigEMCluster.h" -#include "xAODTrigRinger/TrigRNNOutput.h" -#include "xAODTrigRinger/TrigRNNOutputContainer.h" -#include "xAODTrigRinger/TrigRingerRings.h" -#include "xAODTrigRinger/TrigRingerRingsContainer.h" - - - -static const size_t SIZEOF_NODES = 3; -static const size_t SIZEOF_RINGSETS = 7; - - -TrigL2CaloRingerFexMT:: TrigL2CaloRingerFexMT(const std::string & name, ISvcLocator* pSvcLocator) - :AthAlgorithm(name, pSvcLocator){ - ATH_MSG_DEBUG( "start RingerMT const:" ); -} - -TrigL2CaloRingerFexMT:: ~TrigL2CaloRingerFexMT(){} - - -StatusCode TrigL2CaloRingerFexMT::initialize(){ - - ATH_MSG_DEBUG( "start RingerMT init:" ); - - ///What is the number of discriminators? - m_nDiscr = m_nodes.size()/SIZEOF_NODES; - m_nPreproc = m_normRings.size()/SIZEOF_RINGSETS; - - ATH_CHECK( m_ringsKey.initialize()); - ATH_CHECK( m_clustersKey.initialize()); - ATH_CHECK( m_outputKey.initialize()); - - if(configurationInvalid()){ - return StatusCode::FAILURE; - } - ///Initialize all discriminators - for(unsigned i=0; i<m_nDiscr; ++i) { - MultiLayerPerceptron *discr = nullptr; - TrigRingerPreprocessor *preproc = nullptr; - - ATH_MSG_INFO( "Create multi layer perceptron discriminator using configuration:"); - ATH_MSG_INFO( " Input layer : " << m_nodes[i*SIZEOF_NODES+0] ); - ATH_MSG_INFO( " Output layer : " << m_nodes[i*SIZEOF_NODES+2] ); - ATH_MSG_INFO( " Eta range : " << m_etaBins[i][0] << " < |eta| <=" << m_etaBins[i][1] ); - ATH_MSG_INFO( " Et range : " << m_etBins[i][0] << " < Et[GeV] <=" << m_etBins[i][1] ); - - - try { - ///Alloc discriminator - ///TODO: find best way to parse this vector. The athena don't accept vector<vector<unsigned int>> - std::vector<unsigned int> nodes(SIZEOF_NODES); - for(unsigned k=0; k<SIZEOF_NODES;++k) nodes[k]= m_nodes[i*SIZEOF_NODES+k]; ///Parser - - discr = new MultiLayerPerceptron(nodes, m_weights[i], m_bias[i], - m_etBins[i][0], m_etBins[i][1], m_etaBins[i][0], - m_etaBins[i][1], -999, 999); - } catch(const std::bad_alloc& ) { - ATH_MSG_ERROR( "Weight vector size is not compatible with nodes vector." ); - return StatusCode::FAILURE; - } catch(int e){ - if (e == BAD_WEIGHT_SIZE) { - ATH_MSG_ERROR( "Weight vector size is not compatible with nodes vector." ); - return StatusCode::FAILURE; - } - else if (e == BAD_BIAS_SIZE) { - ATH_MSG_ERROR( "Bias vector size is not compatible with nodes vector." ); - return StatusCode::FAILURE; - } - }///try and catch alloc protection - - ///hold the pointer configuration - m_discriminators.push_back(discr); - - try{ - ///TODO: find best way to parse this vector. The athena don't accept vector<vector<unsigned int>> - std::vector<unsigned int> nrings(SIZEOF_RINGSETS), normrings(SIZEOF_RINGSETS), sectionrings(SIZEOF_RINGSETS); - - for(unsigned rs = 0; rs < SIZEOF_RINGSETS; ++rs ){ - nrings[rs] = m_nRings[rs+i*SIZEOF_RINGSETS]; - normrings[rs] = m_normRings[rs+i*SIZEOF_RINGSETS]; - sectionrings[rs] = m_sectionRings[rs+i*SIZEOF_RINGSETS]; - } ///parser - - preproc = new TrigRingerPreprocessor( nrings, normrings, sectionrings ); - } catch(const std::bad_alloc& ){ - ATH_MSG_ERROR( "Bad alloc for TrigRingerPrepoc." ); - return StatusCode::FAILURE; - } - - ///Hold the pointer configuration - m_preproc.push_back(preproc); - }///Loop over discriminators - - ATH_MSG_DEBUG( "TrigL2CaloRingerHypo initialization completed successful" ); - - return StatusCode::SUCCESS; -} - - -StatusCode TrigL2CaloRingerFexMT::finalize(){ - ///release memory - for(unsigned i=0; i<m_nDiscr;++i){ - if(m_preproc.at(i)) delete m_preproc.at(i); - if(m_discriminators.at(i)) delete m_discriminators.at(i); - }///Loop over all discriminators and prepoc objects - - ATH_MSG_DEBUG( "TrigL2CaloRingerHypo finalization completed successfully." ); - return StatusCode::SUCCESS; -} - -StatusCode TrigL2CaloRingerFexMT::execute(){ - - ATH_MSG_DEBUG("start RingerMT"); - auto etMon = Monitored::Scalar( "Et", -100. ); - auto etaMon = Monitored::Scalar( "Eta", -100. ); - auto rnnOutMon = Monitored::Scalar( "rnnOut", -100. ); - auto monitorIt = Monitored::Group( m_monTool, etMon, etaMon, rnnOutMon ); - - auto totalTime = Monitored::Timer("TIME_total"); - totalTime.start(); - ATH_MSG_DEBUG( "start RingerMT" ); - - m_output = 999; - auto context = getContext(); - - ///Retrieve rings pattern information - auto ringerShapeHandle = SG::makeHandle( m_ringsKey, context ); - const xAOD::TrigRingerRings* ringerRings = ringerShapeHandle.cptr(); - - - auto clustersHandle = SG::makeHandle( m_clustersKey, context ); - const xAOD::TrigEMClusterContainer* clusters = clustersHandle.cptr(); - CHECK( clusters->size() == 1 ); - - //It's ready to select the correct eta/et bin - ATH_MSG_DEBUG("executing"); - - MultiLayerPerceptron *discr = nullptr; - TrigRingerPreprocessor *preproc = nullptr; - - - float eta = std::fabs(clusters->front()->eta()); - if(eta>2.50) eta=2.50;///fix for events out of the ranger - float et = clusters->front()->et() / CLHEP::GeV; // in GeV - - - if(m_discriminators.size() > 0){ - for(unsigned i=0; i<m_discriminators.size(); ++i){ - if(et > m_discriminators[i]->etmin() && et <= m_discriminators[i]->etmax()){ - if(eta > m_discriminators[i]->etamin() && eta <= m_discriminators[i]->etamax()){ - discr = m_discriminators[i]; - preproc = m_preproc[i]; - break; - }///eta conditions - }///Et conditions - }///Loop over discriminators - - ///get shape - const std::vector<float> rings = ringerRings->rings(); - - ATH_MSG_DEBUG( "rings->rings().size() is: " <<rings.size() ); - - std::vector<float> refRings(rings.size()); - refRings.assign(rings.begin(), rings.end()); - - - ATH_MSG_DEBUG( "Et = " << et << " GeV, |eta| = " << eta ); - auto preprocessTime = Monitored::Timer("TIME_preprocess"); - ///pre-processing shape - preprocessTime.start(); - if(preproc) preproc->ppExecute(refRings); - preprocessTime.stop(); - - ATH_MSG_DEBUG( "after preproc refRings.size() is: " << rings.size() ); - auto decisionTime = Monitored::Timer("TIME_decision"); - ///Apply the discriminator - decisionTime.start(); - if(discr) m_output = discr->propagate(refRings); - decisionTime.stop(); - auto scope = Monitored::Group( m_monTool, preprocessTime, decisionTime ); - - }else{ - ATH_MSG_DEBUG("There is no discriminator into this Fex."); - } - - - ATH_MSG_DEBUG( "Et = " << et << " GeV, |eta| = " << eta << " and rnnoutput = " << m_output ); - ///Store outout information for monitoring and studys - etMon = et; - etaMon = eta; - rnnOutMon = m_output; - - std::unique_ptr<xAOD::TrigRNNOutput> rnnOutput( new xAOD::TrigRNNOutput()); - rnnOutput->makePrivateStore(); - rnnOutput->setRnnDecision(m_output); - - - auto outputHandle = SG::makeHandle (m_outputKey, context); - ATH_CHECK( outputHandle.record(std::move(rnnOutput)) ); - - totalTime.stop(); - auto scope = Monitored::Group( m_monTool, totalTime ); - - return StatusCode::SUCCESS; -} - -bool TrigL2CaloRingerFexMT::configurationInvalid(){ - - if(m_weights.size() != m_nDiscr){ - ATH_MSG_ERROR( "Weight list dont match with the number of discriminators found" ); - return true; - } - - if(m_bias.size() != m_nDiscr){ - ATH_MSG_ERROR( "Bias list dont match with the number of discriminators found" ); - return true; - } - - if((m_etaBins.size() != m_nDiscr) || (m_etBins.size() != m_nDiscr)){ - ATH_MSG_ERROR( "Eta/Et list dont match with the number of discriminators found" ); - return true; - } - - - if(m_nRings.size() != m_normRings.size()){ - ATH_MSG_ERROR( "Preproc nRings list dont match with the number of discriminators found" ); - return true; - } - - if(m_sectionRings.size() != m_normRings.size()){ - ATH_MSG_ERROR("Preproc section rings list dont match with the number of discriminators found"); - return true; - } - - return false; - -} diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.h deleted file mode 100644 index b86c1bd3a4ca..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerFexMT.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration -*/ - - -// standard stuff -#include <vector> -#include <cmath> - -// general athena stuff -#include "GaudiKernel/IToolSvc.h" - -//Gaudi -#include "GaudiKernel/ToolHandle.h" -#include "GaudiKernel/ServiceHandle.h" - -#include "AthenaMonitoring/GenericMonitoringTool.h" -#include "AthenaBaseComps/AthAlgorithm.h" -///Local include(s) -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" - -///xAOD include(s) -#include "xAODTrigCalo/TrigEMClusterContainer.h" -#include "xAODTrigRinger/TrigRNNOutput.h" -#include "xAODTrigRinger/TrigRNNOutputContainer.h" -#include "xAODTrigRinger/TrigRingerRings.h" -#include "xAODTrigRinger/TrigRingerRingsContainer.h" - -#include "TrigTimeAlgs/TrigTimer.h" -#include "AthenaMonitoring/GenericMonitoringTool.h" - - -class TrigL2CaloRingerFexMT : public AthAlgorithm { - - public: - TrigL2CaloRingerFexMT(const std::string & name, ISvcLocator* pSvcLocator); - ~TrigL2CaloRingerFexMT(); - - StatusCode initialize(); - StatusCode finalize(); - StatusCode execute(); - - protected: - TrigTimer* m_storeTimer; - TrigTimer* m_normTimer; - TrigTimer* m_decisionTimer; - - - - private: - - //feature keys - Gaudi::Property<std::string> m_hlt_feature {this, "HltFeature", "TrigRingerNeuralFex", "..."}; - Gaudi::Property<std::string> m_feature {this, "Feature", "TrigRingerNeuralFex", "..."}; - - //Prepoc configuration - Gaudi::Property<std::vector<unsigned int>> m_normRings {this, "NormalisationRings", std::vector<unsigned int>(), "..." }; - Gaudi::Property<std::vector<unsigned int>> m_sectionRings {this, "SectionRings", std::vector<unsigned int>(), "..."}; - Gaudi::Property<std::vector<unsigned int>> m_nRings {this, "NRings", std::vector<unsigned int>(), "..." }; - - //Disriminator configuration - Gaudi::Property<std::vector<unsigned int>> m_nodes {this, "Nodes", std::vector<unsigned int>(), "..."}; - Gaudi::Property<std::vector<std::vector<double>>> m_weights {this, "Weights", std::vector<std::vector<double>>(), "..."}; - Gaudi::Property<std::vector<std::vector<double>>> m_bias {this, "Bias", std::vector<std::vector<double>>(), "..." }; - Gaudi::Property<std::vector<double>> m_threshold {this, "Threshold", std::vector<double>(), "..."}; - Gaudi::Property<std::vector<std::vector<double>>> m_etaBins {this, "EtaBins", std::vector<std::vector<double>>(), "..." }; - Gaudi::Property<std::vector<std::vector<double>>> m_etBins {this, "EtBins", std::vector<std::vector<double>>(), "..."}; - - bool configurationInvalid(); - - //Discriminator holder - std::vector<MultiLayerPerceptron*> m_discriminators; - //Pre-processing holder - std::vector<TrigRingerPreprocessor*> m_preproc; - - - unsigned m_nDiscr; - unsigned m_nPreproc; - float m_output; - - SG::ReadHandleKey<xAOD::TrigRingerRings> m_ringsKey { - this, - "CaloRingsKey", - "CaloRings", - "" - }; - - SG::ReadHandleKey<xAOD::TrigEMClusterContainer> m_clustersKey { - this, - "ClustersKey", - "CaloClusters", - "" - }; - - SG::WriteHandleKey<xAOD::TrigRNNOutput> m_outputKey { - this, - "RNNOutputKey", - "CaloRNNOutput", - "" - }; - - ToolHandle<GenericMonitoringTool> m_monTool { this, "MonTool", "GenericMonitoringTool/RingerFexMon", "Monitoring" }; - -}; - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypo.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypo.cxx index 7be8014552a1..2e5495a13849 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypo.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypo.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ ///Local include(s) #include "TrigMultiVarHypo/TrigL2CaloRingerHypo.h" @@ -11,6 +11,7 @@ #include "xAODTrigRinger/TrigRingerRings.h" #include "xAODTrigRinger/TrigRingerRingsContainer.h" +#include "TrigMultiVarHypo/tools/procedures/Thresholds.h" ///std include(s) #include <new> #include <cmath> @@ -25,7 +26,7 @@ TrigL2CaloRingerHypo::TrigL2CaloRingerHypo(const std::string& name, ISvcLocator* declareProperty("CalibPath" , m_calibPath = "" ); declareProperty("HltFeature" , m_hlt_feature = "TrigRingerNeuralFex" ); - m_useNoActivationFunctionInTheLastLayer=false; + m_removeOutputTansigTF=false; m_doPileupCorrection=false; m_lumiCut=50; } @@ -34,29 +35,31 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltInitialize() { if(!m_calibPath.empty()){ if(!m_reader.retrieve(m_calibPath, m_cutDefs)){ - msg() << MSG::ERROR << "Can not retrieve the information from " << m_calibPath << endmsg; + ATH_MSG_ERROR("Can not retrieve the information from " << m_calibPath); return HLT::BAD_JOB_SETUP; } // retrieve metadata - m_useNoActivationFunctionInTheLastLayer = m_reader.useNoActivationFunctionInTheLastLayer(); + m_removeOutputTansigTF = m_reader.removeOutputTansigTF(); m_doPileupCorrection = m_reader.doPileupCorrection(); m_lumiCut = m_reader.lumiCut(); } - msg() << MSG::INFO << "Using the activation function in the last layer? " << (m_useNoActivationFunctionInTheLastLayer ? "No":"Yes") << endmsg; - msg() << MSG::INFO << "Using pileup correction? " << (m_doPileupCorrection ? "Yes":"No") << endmsg; - msg() << MSG::INFO << "Using lumi threshold equal: " << m_lumiCut << endmsg; + ATH_MSG_INFO("Using the activation function in the last layer? " << (!m_removeOutputTansigTF ? "Yes":"No") ); + ATH_MSG_INFO("Using pileup correction? " << (m_doPileupCorrection ? "Yes":"No") ); + ATH_MSG_INFO("Using lumi threshold equal: " << m_lumiCut); + ATH_MSG_INFO( "TrigL2CaloRingerHypo initialization completed successfully." ); - msg() << MSG::INFO << "TrigL2CaloRingerHypo initialization completed successfully." << endmsg; + ///Monitoring hitograms + if(doTiming()){ + m_totalTimer = addTimer("Total"); + }///Only if time is set on python config + return HLT::OK; } //!=============================================================================================== HLT::ErrorCode TrigL2CaloRingerHypo::hltFinalize() { - for(unsigned i=0; i<m_cutDefs.size();++i){ - if(m_cutDefs[i]) delete m_cutDefs[i]; - } - msg() << MSG::INFO << "TrigL2CaloRingerHypo finalization completed successfully." << endmsg; + ATH_MSG_INFO( "TrigL2CaloRingerHypo finalization completed successfully." ); return HLT::OK; } //!=============================================================================================== @@ -65,15 +68,19 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu pass = false; + if(doTiming()) m_totalTimer->start(); + if (m_acceptAll){ pass = true; - msg() << MSG::DEBUG << "AcceptAll property is set: taking all events" << endmsg; + ATH_MSG_DEBUG( "AcceptAll property is set: taking all events" ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } const xAOD::TrigRNNOutput* rnnOutput = get_rnnOutput(outputTE); if(!rnnOutput){ - msg() << MSG::WARNING << "There is no xAO::TrigRNNOutput into the TriggerElement." << endmsg; + ATH_MSG_WARNING( "There is no xAO::TrigRNNOutput into the TriggerElement." ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } @@ -83,11 +90,13 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu if(ringerShape){ emCluster = ringerShape->emCluster(); if(!emCluster){ - msg() << MSG::WARNING << "There is no link to xAOD::TrigEMCluster into the Ringer object." << endmsg; + ATH_MSG_WARNING( "There is no link to xAOD::TrigEMCluster into the Ringer object." ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } }else{ - msg() << MSG::WARNING << "There is no xAOD::TrigRingerRings link into the rnnOutput object." << endmsg; + ATH_MSG_WARNING( "There is no xAOD::TrigRingerRings link into the rnnOutput object." ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } @@ -97,7 +106,8 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu ///Et threshold if(et < m_emEtCut*1e-3){ - msg() << MSG::DEBUG << "Event reproved by Et threshold. Et = " << et << ", EtCut = " << m_emEtCut*1e-3 << endmsg; + ATH_MSG_DEBUG( "Event reproved by Et threshold. Et = " << et << ", EtCut = " << m_emEtCut*1e-3 ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } @@ -106,7 +116,8 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu // TODO: Maybe this will expanded for future... // This was define as [avgmu, rnnOtput, rnnOutputWithoutTansig] if(rnnOutput->rnnDecision().size() != 3){ - msg() << MSG::INFO << "Event reproved because we can not retrieve the completed information from RnnOutput to run this hypo!" << endmsg; + ATH_MSG_INFO( "Event reproved because we can not retrieve the completed information from RnnOutput to run this hypo!" ); + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } @@ -133,20 +144,20 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu threshold = m_cutDefs[i]->threshold(); } - if(m_useNoActivationFunctionInTheLastLayer) + if(m_removeOutputTansigTF) output=rnnOutput->rnnDecision().at(2); else output=rnnOutput->rnnDecision().at(1); if(output >= threshold){ - msg() << MSG::DEBUG << "Event information:" << endmsg; - msg() << MSG::DEBUG << " " << m_cutDefs[i]->etmin() << "< Et ("<<et<<") GeV" << " <=" << m_cutDefs[i]->etmax() << endmsg; - msg() << MSG::DEBUG << " " << m_cutDefs[i]->etamin() << "< |Eta| ("<<eta<<") " << " <=" << m_cutDefs[i]->etamax() << endmsg; - msg() << MSG::DEBUG << " " << m_cutDefs[i]->mumin() << "< Mu ("<<avgmu<<") " << " <=" << m_cutDefs[i]->mumax() << endmsg; - msg() << MSG::DEBUG << " rnnOutput: " << output << " and threshold: " << m_cutDefs[i]->threshold() << endmsg; + ATH_MSG_DEBUG( "Event information:" ); + ATH_MSG_DEBUG( " " << m_cutDefs[i]->etmin() << " < Et ("<<et<<") GeV " << " <=" << m_cutDefs[i]->etmax() ); + ATH_MSG_DEBUG( " " << m_cutDefs[i]->etamin() << " < |Eta| ("<<eta<<") " << " <=" << m_cutDefs[i]->etamax() ); + ATH_MSG_DEBUG( " " << m_cutDefs[i]->mumin() << " < Mu ("<<avgmu<<") " << " <=" << m_cutDefs[i]->mumax() ); + ATH_MSG_DEBUG( " rnnOutput: " << output << " and threshold: " << m_cutDefs[i]->threshold() ); pass=true; }else{ - msg() << MSG::DEBUG << "Event reproved by discriminator threshold" << endmsg; + ATH_MSG_DEBUG( "Event reproved by discriminator threshold" ); }///Threshold condition break; @@ -155,11 +166,12 @@ HLT::ErrorCode TrigL2CaloRingerHypo::hltExecute(const HLT::TriggerElement* outpu }///Loop over mu }///Loop over cutDefs }else{ - msg() << MSG::DEBUG << "There is no discriminator. Event approved by Et threshold." << endmsg; + ATH_MSG_DEBUG( "There is no discriminator. Event approved by Et threshold." ); ///Only for EtCut pass=true; }///protection + if(doTiming()) m_totalTimer->stop(); return HLT::OK; } //!=============================================================================================== diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.cxx index 5e2a85c76c9c..2f11af3c5b59 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.cxx @@ -4,6 +4,11 @@ #include <map> #include "GaudiKernel/Property.h" #include "TrigL2CaloRingerHypoAlgMT.h" +#include "AthViews/ViewHelper.h" +#include "DecisionHandling/HLTIdentifier.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "AthViews/ViewHelper.h" + using TrigCompositeUtils::DecisionContainer; using TrigCompositeUtils::DecisionAuxContainer; @@ -11,65 +16,91 @@ using TrigCompositeUtils::DecisionIDContainer; using TrigCompositeUtils::decisionIDs; using TrigCompositeUtils::newDecisionIn; using TrigCompositeUtils::linkToPrevious; - +using TrigCompositeUtils::createAndStore; TrigL2CaloRingerHypoAlgMT::TrigL2CaloRingerHypoAlgMT( const std::string& name, ISvcLocator* pSvcLocator ) : ::HypoBase( name, pSvcLocator ) {} + TrigL2CaloRingerHypoAlgMT::~TrigL2CaloRingerHypoAlgMT() {} + StatusCode TrigL2CaloRingerHypoAlgMT::initialize() { - ATH_MSG_INFO ( "Initializing " << name() << "..." ); - ATH_CHECK( m_hypoTools.retrieve() ); - - ATH_CHECK( m_views.initialize() ); - ATH_CHECK( m_decisionsKey.initialize() ); - renounce( m_outputKey ); - ATH_CHECK( m_outputKey.initialize() ); - + ATH_MSG_INFO ( "Initializing " << name() << "..." ); + ATH_CHECK( m_hypoTools.retrieve() ); + ATH_CHECK( m_ringsKey.initialize()); + ATH_CHECK( m_clustersKey.initialize()); + renounce(m_clustersKey); + renounce(m_ringsKey); return StatusCode::SUCCESS; } +StatusCode TrigL2CaloRingerHypoAlgMT::finalize() { + return StatusCode::SUCCESS; +} StatusCode TrigL2CaloRingerHypoAlgMT::execute( const EventContext& context ) const { + ATH_MSG_DEBUG ( "Executing " << name() << "..." ); + auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context ); + if( not previousDecisionsHandle.isValid() ) {//implicit + ATH_MSG_DEBUG( "No implicit RH for previous decisions "<< decisionInput().key()<<": is this expected?" ); + return StatusCode::SUCCESS; + } - // prepare decisions container and link back to the clusters, and decision on clusters - auto decisions = std::make_unique<DecisionContainer>(); - auto aux = std::make_unique<DecisionAuxContainer>(); - decisions->setStore( aux.get() ); - - - //ATH_MSG_DEBUG( "RNNOutput ptr to decision map has size " << clusterToIndexMap.size() ); - - // prepare imput for tools - std::vector<TrigL2CaloRingerHypoToolMT::RNNOutInfo> hypoToolInput; + ATH_MSG_DEBUG( "Running with "<< previousDecisionsHandle->size() <<" implicit ReadHandles for previous decisions"); + // new decisions + // new output decisions + SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); + auto decisions = outputHandle.ptr(); + // input for decision + std::vector<TrigL2CaloRingerHypoToolMT::RingerInfo> hypoToolInput; - auto viewsHandle = SG::makeHandle( m_views, context ); - for ( auto view: *viewsHandle ) { - size_t counter = 0; - auto rnnOutHandle = SG::makeHandle( m_outputKey, context ); - //CHECK( electronsHandle.setProxyDict( view ) ); - //CHECK( electronsHandle.isValid() ); - - for ( auto rnnOutIter = rnnOutHandle->begin(); rnnOutIter != rnnOutHandle->end(); ++rnnOutIter, counter++ ) { - auto d = newDecisionIn( decisions.get() ); - d->setObjectLink( "feature", ElementLink<xAOD::TrigRNNOutputContainer>( view->name()+"_"+m_outputKey.key(), counter ) ); - hypoToolInput.emplace_back( TrigL2CaloRingerHypoToolMT::RNNOutInfo{ d, *rnnOutIter } ); + // loop over previous decisions + size_t counter=0; + for ( auto previousDecision: *previousDecisionsHandle ) { + + // get View + auto view = TrigCompositeUtils::findLink< ViewContainer >( previousDecision, "view" ); + ATH_CHECK( view.isValid() ); + auto ringerShapeHandle = ViewHelper::makeHandle( *(view.link), m_ringsKey, context); + ATH_CHECK( ringerShapeHandle.isValid() ); + ATH_MSG_DEBUG ( "Ringer handle size: " << ringerShapeHandle->size() << "..." ); + // create new decision + auto d = newDecisionIn( decisions, name() ); + hypoToolInput.emplace_back( TrigL2CaloRingerHypoToolMT::RingerInfo{ d, ringerShapeHandle.cptr()->at(0) } ); + + { + auto el = ViewHelper::makeLink( *(view.link), ringerShapeHandle, 0 ); + ATH_CHECK( el.isValid() ); + d->setObjectLink( "feature", el ); } + + TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter ); + counter++; } - for ( auto & tool: m_hypoTools ) { + ATH_MSG_DEBUG( "Found "<<hypoToolInput.size()<<" inputs to tools"); + + for ( auto& tool: m_hypoTools ) { ATH_CHECK( tool->decide( hypoToolInput ) ); - - } - - { - auto handle = SG::makeHandle( m_decisionsKey, context ); - CHECK( handle.record( std::move( decisions ), std::move( aux ) ) ); + } + + + {// make output handle and debug + ATH_MSG_DEBUG ( "Exit with "<<outputHandle->size() <<" decisions"); + TrigCompositeUtils::DecisionIDContainer allPassingIDs; + if ( outputHandle.isValid() ) { + for ( auto decisionObject: *outputHandle ) { + TrigCompositeUtils::decisionIDs( decisionObject, allPassingIDs ); + } + for ( TrigCompositeUtils::DecisionID id : allPassingIDs ) { + ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) ); + } + } } return StatusCode::SUCCESS; diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.h index 2163e6e2840f..554b0a23a80f 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.h +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoAlgMT.h @@ -1,14 +1,14 @@ /* Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ -#ifndef MULTIVARHYPO_TRIGL2CALORINGERHYPOALG_H -#define MULTIVARHYPO_TRIGL2CALORINGERHYPOALG_H 1 +#ifndef TRIGL2CALORINGERHYPOALGMT_H +#define TRIGL2CALORINGERHYPOALGMT_H 1 #include <string> #include "AthenaBaseComps/AthReentrantAlgorithm.h" -#include "xAODTrigRinger/TrigRNNOutput.h" -#include "xAODTrigRinger/TrigRNNOutputContainer.h" +#include "xAODTrigRinger/TrigRingerRings.h" +#include "xAODTrigRinger/TrigRingerRingsContainer.h" #include "DecisionHandling/TrigCompositeUtils.h" #include "DecisionHandling/HypoBase.h" #include "AthViews/View.h" @@ -23,28 +23,17 @@ class TrigL2CaloRingerHypoAlgMT public: TrigL2CaloRingerHypoAlgMT( const std::string& name, ISvcLocator* pSvcLocator ); - virtual ~TrigL2CaloRingerHypoAlgMT(); - virtual StatusCode initialize() override; + virtual StatusCode finalize() override; virtual StatusCode execute(const EventContext& context) const override; private: TrigL2CaloRingerHypoAlgMT(); ToolHandleArray< TrigL2CaloRingerHypoToolMT > m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"}; - - - SG::ReadHandleKey< ViewContainer > m_views {this, "Views", "Unspecified", "Views to read electrons from" }; - SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > m_decisionsKey {this, "RNNOutDecisions", "RNNOutDecisions", "Output decisions"}; - //SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > m_RNNOutdecisionsKey {this, "RNNOutDecisions", "RNNOutDecisions", "Output decisions"}; - - SG::ReadHandleKey<xAOD::TrigRNNOutputContainer> m_outputKey { - this, - "RNNOutputContainer", - "CaloRNNOutput", - "" - }; + SG::ReadHandleKey<xAOD::TrigRingerRingsContainer> m_ringsKey { this, "RingerKey","CaloRings",""}; + SG::ReadHandleKey<xAOD::TrigEMClusterContainer> m_clustersKey { this,"ClustersKey","CaloClusters",""}; diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.cxx index 7b6b8c736fe4..4e59ecef61ee 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.cxx @@ -8,64 +8,88 @@ #include "AthenaMonitoring/Monitored.h" #include "GaudiKernel/SystemOfUnits.h" #include "TrigL2CaloRingerHypoToolMT.h" +#include "AthenaMonitoring/GenericMonitoringTool.h" +#include "AthenaMonitoring/Monitored.h" +using namespace Monitored; using namespace TrigCompositeUtils; +using namespace Ringer; TrigL2CaloRingerHypoToolMT::TrigL2CaloRingerHypoToolMT( const std::string& type, - const std::string& name, - const IInterface* parent ) + const std::string& name, + const IInterface* parent ) + : AthAlgTool( type, name, parent ), - m_decisionId( HLT::Identifier::fromToolName( name ) ) {} + m_selectorTool(), + m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"), + m_decisionId( HLT::Identifier::fromToolName( name ) ) +{ + declareProperty("LumiBlockMuTool", m_lumiBlockMuTool, "Luminosity Tool" ); +} + + StatusCode TrigL2CaloRingerHypoToolMT::initialize() { - ///What is the number of discriminators? - m_nThresholds = m_thresholds.size(); + m_selectorTool.setConstantsCalibPath( m_constantsCalibPath ); + m_selectorTool.setThresholdsCalibPath( m_thresholdsCalibPath ); - if((m_etaBins.size() != m_nThresholds) && (m_etBins.size() != m_nThresholds)){ - ATH_MSG_ERROR("Eta/Et list dont match with the number of thesholds found"); + if(m_selectorTool.initialize().isFailure()) + return StatusCode::FAILURE; + + if (m_lumiBlockMuTool.retrieve().isFailure()) return StatusCode::FAILURE; - } - - ///Initialize all discriminators - for(unsigned i=0; i<m_nThresholds; ++i) - { - ///Hold the pointer configuration - try{ - m_cutDefs.push_back(new TrigL2CaloRingerHypoToolMT::CutDefsHelper(m_thresholds[i],m_etaBins[i][0], - m_etaBins[i][1], m_etBins[i][0],m_etBins[i][1])); - }catch(const std::bad_alloc& xa){ - ATH_MSG_ERROR("Can not alloc cutDefs on memory."); - return StatusCode::FAILURE; - } - }///Loop over discriminators ATH_MSG_INFO("TrigL2CaloRingerHypo initialization completed successfully."); + return StatusCode::SUCCESS; +} + +StatusCode TrigL2CaloRingerHypoToolMT::finalize() { + + if (!m_monTool.empty()){ + ATH_MSG_DEBUG("Retrieving monTool"); + ATH_CHECK(m_monTool.retrieve()); + }else{ + ATH_MSG_INFO("No monTool configured. NO MONITORING"); + } + + if(m_selectorTool.finalize().isFailure()) + return StatusCode::FAILURE; + ATH_MSG_INFO("TrigL2CaloRingerHypo finalization completed successfully."); return StatusCode::SUCCESS; } - TrigL2CaloRingerHypoToolMT::~TrigL2CaloRingerHypoToolMT() {} -bool TrigL2CaloRingerHypoToolMT::decideOnSingleObject( const xAOD::TrigRNNOutput* rnnOutput) const { - +bool TrigL2CaloRingerHypoToolMT::decideOnSingleObject( const xAOD::TrigRingerRings* ringerShape) const { + + auto etMon = Monitored::Scalar("Et",-100); + auto etaMon = Monitored::Scalar("Eta",-100); + auto phiMon = Monitored::Scalar("Phi",-100); + auto rnnOutMon = Monitored::Scalar("RnnOut",-100); + + + auto total_time = Monitored::Timer("TIME_total"); + auto propagate_time = Monitored::Timer("TIME_propagate"); + auto preproc_time = Monitored::Timer("TIME_preproc"); + auto decide_time = Monitored::Timer("TIME_decide"); + auto mon = Monitored::Group(m_monTool,etMon,etaMon,phiMon,rnnOutMon,total_time,propagate_time,preproc_time,decide_time); + + total_time.start(); + + if(m_acceptAll){ ATH_MSG_DEBUG("AcceptAll property is set: taking all events"); return true; } - if(!rnnOutput){ - ATH_MSG_WARNING("There is no xAO::TrigRNNOutput into the TriggerElement."); - return false; - } const xAOD::TrigEMCluster *emCluster = 0; - const xAOD::TrigRingerRings *ringerShape = rnnOutput->ringer(); if(ringerShape){ emCluster = ringerShape->emCluster(); if(!emCluster){ @@ -79,51 +103,47 @@ bool TrigL2CaloRingerHypoToolMT::decideOnSingleObject( const xAOD::TrigRNNOutput float eta = std::fabs(emCluster->eta()); float et = emCluster->et() / Gaudi::Units::GeV; - if(eta>2.50) eta=2.50;///fix for events out of the ranger - float output = rnnOutput->rnnDecision().at(0); + float avgmu = m_lumiBlockMuTool->averageInteractionsPerCrossing(); + + etaMon = emCluster->eta(); + etMon = emCluster->et(); + phiMon = emCluster->phi(); + if(eta>2.50) eta=2.50;///fix for events out of the ranger ///Et threshold - if(et < m_emEtCut){ - ATH_MSG_DEBUG( "Event reproved by Et threshold. Et = " << et << ", EtCut = " << m_emEtCut); + if(et < m_emEtCut/Gaudi::Units::GeV){ + ATH_MSG_DEBUG( "Event reproved by Et threshold. Et = " << et << ", EtCut = " << m_emEtCut/Gaudi::Units::GeV); return false; } + const std::vector<float> rings = ringerShape->rings(); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); - if(m_nThresholds > 0){ - ///Select the correct threshold for each eta/Et region - for(unsigned i=0; i<m_nThresholds;++i){ - if((et > m_cutDefs[i]->etmin()) && (et <= m_cutDefs[i]->etmax())){ - if((eta > m_cutDefs[i]->etamin()) && (eta <= m_cutDefs[i]->etamax())){ - if(output >= m_cutDefs[i]->threshold()){ - ATH_MSG_DEBUG( "Event information:" ); - //ATH_MSG_DEBUG( " " << m_cutDefs[i]->etmin() << "< Et ("<<et<<") GeV" << " <=" << m_cutDefs[i]->etmax() ); - //ATH_MSG_DEBUG( " " << m_cutDefs[i]->etamin() << "< |Eta| ("<<eta<<") " << " <=" << m_cutDefs[i]->etamax() ); - //ATH_MSG_DEBUG( " rnnOutput: " << output << " and threshold: " << m_cutDefs[i]->threshold()); - return true; - }else{ - ATH_MSG_DEBUG( "Event reproved by discriminator threshold" ); - }///Threshold condition - break; - }///Loop over eta - }///Loop over et - }///Loop over cutDefs - }else{ - ATH_MSG_DEBUG( "There is no discriminator. Event approved by Et threshold."); - return true; - }///protection - return false; -} + ATH_MSG_DEBUG("Et = "<< et << " Eta = "<<eta << " mu = " << avgmu << "rsize = "<< refRings.size()); + auto output = m_selectorTool.calculate( refRings, et, eta, avgmu, propagate_time, preproc_time ); + rnnOutMon = output; + ATH_MSG_DEBUG(name()<< " generate as NN output " << output ); + + decide_time.start(); + bool accept = m_selectorTool.accept(output, et,eta,avgmu); + decide_time.stop(); + + total_time.stop(); + return accept; + +} -StatusCode TrigL2CaloRingerHypoToolMT::decide( std::vector<RNNOutInfo>& input ) const { +StatusCode TrigL2CaloRingerHypoToolMT::decide( std::vector<RingerInfo>& input ) const { for ( auto i: input ) { - auto objDecision = decideOnSingleObject( i.rnnOut ); - if ( objDecision == true ) { - addDecisionID( m_decisionId.numeric(), i.decision ); - } + auto objDecision = decideOnSingleObject( i.ringerShape ); + if ( objDecision == true ) { + addDecisionID( m_decisionId.numeric(), i.decision ); + } } return StatusCode::SUCCESS; } diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.h b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.h index fb50c43d5da1..802a1d8c2169 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.h +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/TrigL2CaloRingerHypoToolMT.h @@ -1,8 +1,9 @@ /* Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ -#ifndef TRIGL2CALORINGERTOOL_H -#define TRIGL2CALORINGERTOOL_H 1 + +#ifndef TRIGL2CALORINGERHYPOTOOLMT_H +#define TRIGL2CALORINGERHYPOTOOLMT_H 1 #include "GaudiKernel/Property.h" #include "CLHEP/Units/SystemOfUnits.h" @@ -10,75 +11,45 @@ #include "AthenaMonitoring/GenericMonitoringTool.h" #include "DecisionHandling/HLTIdentifier.h" #include "DecisionHandling/TrigCompositeUtils.h" - -#include "xAODTrigRinger/TrigRNNOutput.h" - - - - +#include "xAODTrigRinger/TrigRingerRings.h" +#include "TrigMultiVarHypo/tools/RingerSelectorTool.h" +#include "LumiBlockComps/ILumiBlockMuTool.h" class TrigL2CaloRingerHypoToolMT : virtual public ::AthAlgTool { - public: - TrigL2CaloRingerHypoToolMT( const std::string& type, - const std::string& name, - const IInterface* parent ); - - virtual ~TrigL2CaloRingerHypoToolMT(); - virtual StatusCode initialize() override; - - - - struct RNNOutInfo { - TrigCompositeUtils::Decision* decision; - const xAOD::TrigRNNOutput* rnnOut; - }; - - StatusCode decide( std::vector<RNNOutInfo>& decisions ) const; - bool decideOnSingleObject( const xAOD::TrigRNNOutput* rnnOut ) const; - - - ///Helper class - class CutDefsHelper{ - private: - double m_etamin; - double m_etamax; - double m_etmin; - double m_etmax; - double m_threshold; + public: + TrigL2CaloRingerHypoToolMT( const std::string& type, + const std::string& name, + const IInterface* parent ); - public: - CutDefsHelper(double th, double etamin, double etamax, - double etmin, double etmax):m_etamin(etamin), - m_etamax(etamax),m_etmin(etmin),m_etmax(etmax), - m_threshold(th) - {;} + virtual ~TrigL2CaloRingerHypoToolMT(); + + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; - ~CutDefsHelper() - {;} - double threshold(){return m_threshold;}; - double etamin(){return m_etamin;}; - double etamax(){return m_etamax;}; - double etmin(){return m_etmin;}; - double etmax(){return m_etmax;}; - };///end of configuration + + bool decideOnSingleObject( const xAOD::TrigRingerRings* ringerShape ) const; - std::vector<TrigL2CaloRingerHypoToolMT::CutDefsHelper*> m_cutDefs; + struct RingerInfo { + TrigCompositeUtils::Decision* decision; + const xAOD::TrigRingerRings* ringerShape; + }; + StatusCode decide( std::vector<RingerInfo>& decisions ) const; - private: - HLT::Identifier m_decisionId; - Gaudi::Property<bool> m_acceptAll{ this, "AcceptAll", false, "Ignore selection" }; - Gaudi::Property<std::vector<double>> m_thresholds; - Gaudi::Property<std::vector<std::vector<double>>> m_etaBins; - Gaudi::Property<std::vector<std::vector<double>>> m_etBins; - Gaudi::Property<double> m_nThresholds; - Gaudi::Property<double> m_emEtCut; + private: + + Ringer::RingerSelectorTool m_selectorTool; + ToolHandle<ILumiBlockMuTool> m_lumiBlockMuTool; + ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; + HLT::Identifier m_decisionId; + Gaudi::Property<bool> m_acceptAll{ this, "AcceptAll", false, "Ignore selection" }; + Gaudi::Property<double> m_emEtCut{this,"EtCut", 0.0, "Et threshold"}; + Gaudi::Property<std::string> m_constantsCalibPath{this, "ConstantsCalibPath", "", "Constants Calib Path"}; + Gaudi::Property<std::string> m_thresholdsCalibPath{this, "ThresholdsCalibPath", "", "Thresholds Calib Path"}; - - //ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; }; //:DECLARE_TOOL_FACTORY( TrigL2CaloRingerHypoToolMT ) diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/components/TrigMultiVarHypo_entries.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/components/TrigMultiVarHypo_entries.cxx old mode 100644 new mode 100755 index 4eb9c6f1c7bc..124b9c4d6e31 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/components/TrigMultiVarHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/components/TrigMultiVarHypo_entries.cxx @@ -1,13 +1,17 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ + + #include "TrigMultiVarHypo/TrigL2CaloRingerFex.h" #include "TrigMultiVarHypo/TrigL2CaloRingerHypo.h" -#include "../TrigL2CaloRingerFexMT.h" +#include "../TrigL2CaloRingerHypoToolMT.h" +#include "../TrigL2CaloRingerHypoAlgMT.h" DECLARE_COMPONENT( TrigL2CaloRingerFex ) DECLARE_COMPONENT( TrigL2CaloRingerHypo ) -DECLARE_COMPONENT( TrigL2CaloRingerFexMT ) +DECLARE_COMPONENT( TrigL2CaloRingerHypoToolMT ) +DECLARE_COMPONENT( TrigL2CaloRingerHypoAlgMT ) diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/preproc/TrigRingerPreprocessor.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/preproc/TrigRingerPreprocessor.cxx deleted file mode 100644 index bfc343700ea6..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/preproc/TrigRingerPreprocessor.cxx +++ /dev/null @@ -1,213 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - -///Local include(s) -#include "TrigMultiVarHypo/preproc/TrigRingerPreprocessor.h" -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" -///std library(s) -#include <numeric> -#include <cmath> - -#include <iostream> -using namespace std; - -using TrigCaloRingsHelper::RingSet; - -//!====================================================================================== -TrigRingerPreprocessor::TrigRingerPreprocessor(std::vector<unsigned int> &nRings, - std::vector<unsigned int> &normRings, - std::vector<unsigned int> §ionRings) -{ - // For each configured ring set, create an ordered RingSet, placing them into a vector. - for (unsigned int i = 0; i < nRings.size(); ++i) { - m_ringsSet.push_back(new RingSet(nRings[i], (RingSet::Normalisation) normRings[i], (RingSet::Section) sectionRings[i])); - } - - m_energyThreshold = -9999; - m_maxRingsAccumulated = std::accumulate(nRings.begin(), nRings.end(), 0); -} -//!====================================================================================== -TrigRingerPreprocessor::~TrigRingerPreprocessor(){ - for(unsigned rs=0; rs<m_ringsSet.size(); ++rs){ - if(m_ringsSet.at(rs)) delete m_ringsSet.at(rs); - } -} -//!====================================================================================== -void TrigRingerPreprocessor::sequential(Pattern& rings, const Feature& stop_energy) { - - //if the energyThreshold is greater than `stop', use stop instead. - Feature stop = stop_energy; - if (m_energyThreshold > stop) { - stop = m_energyThreshold; - } - - Pattern norm(rings.size(), 0); - Feature sum = 0; - - for (unsigned i = 0; i < rings.size(); ++i) - sum += rings[i]; - - norm[0] = std::fabs(sum); - - //if the sum is less than stop, apply layer normalisation to all rings - if (norm[0] < stop) { - //if the normalization factor is smaller than stop, I have to verify if it - //is still too small. A small value will make things go bad... So, I - //verify if the sum is smaller than the layer maxima, if that is the case, - //I have to reconsider the normalization factor to a more reasonable - //value, e.g. the layer absolute maximum - Feature max = -999e30; - Feature min = 999e30; - for (unsigned i = 0; i < rings.size(); ++i) { - if (rings[i] < min) - min = rings[i]; - if (rings[i] > max) - max = rings[i]; - } - if (norm[0] < max) { - Feature new_norm = std::fabs(max); - if (std::fabs(min) > new_norm) new_norm = std::fabs(min); - norm[0] = new_norm; - } - - //if the sum is even less than the threshold, do not apply any - //normalisation at all here! - if (norm[0] < m_energyThreshold) { - return; - } - - for (unsigned i = 0; i < rings.size(); i++) { - rings[i] /= norm[0]; - } - return; - } - - //I'm ok to proceed with the calculations - bool fixed = false; //shall I stop to apply a variant normalisation factor? - for (unsigned int i=1; i<rings.size(); ++i) { - norm[i] = std::fabs(norm[i-1] - rings[i-1]); - //if the normalization factor is less than `stop', just apply a fixed, - //known to be great enough, value instead of that. Otherwise, the noise - //will get too amplified. - if (fixed || norm[i] < stop) { - norm[i] = norm[0]; - if (!fixed) { - fixed = true; - } - } - } - for (unsigned i = 0; i < rings.size(); ++i) { - rings[i] /= norm[i]; - } -} -//!====================================================================================== -void TrigRingerPreprocessor::normalize_rings(std::vector<RingSet*> &rset) { - - //at this point, I have all ring sets, separated - double emsection = 0; // energy at e.m. section - double hadsection = 0; // energy at hadronic section - - //for each RingSet (first iteration) -- apply set dependent norms. - for (auto &jt : rset) - { - //calculate the relevant energies - double setenergy = 0; - for (unsigned i=0; i<jt->pattern().size(); ++i) setenergy += jt->pattern()[i]; - if (jt->section() == RingSet::EM) emsection += setenergy; - else hadsection += setenergy; - - //what is the normalisation strategy here? Can I do something already? - switch(jt->normalisation()) - { - case RingSet::SET: - if (setenergy > m_energyThreshold) { - for (unsigned i = 0; i < jt->pattern().size(); ++i) - jt->pattern()[i] /= fabs(setenergy); - } - break; - case RingSet::SEQUENTIAL: - sequential(jt->pattern()); - break; - default: //do nothing - break; - } - } //for each RingSet (first iteration) - - double event = emsection + hadsection; // event energy - //for each RingSet (third iteration) -- now accumulate and store - for (auto &jt : rset) - { - //what is the normalisation strategy here? Do the rest of options - switch(jt->normalisation()) - { - case RingSet::EVENT: - if (event > m_energyThreshold) { - for (unsigned i = 0; i < jt->pattern().size(); ++i) - jt->pattern()[i] /= fabs(event); - } - break; - case RingSet::SECTION: - if (jt->section() == RingSet::EM) - { - if (emsection > m_energyThreshold) { - for (unsigned i = 0; i < jt->pattern().size(); ++i) - jt->pattern()[i] /= fabs(emsection); - } - }else - { - if (hadsection > m_energyThreshold) { - for (unsigned i = 0; i < jt->pattern().size(); ++i) - jt->pattern()[i] /= fabs(hadsection); - } - } - break; - - default: //do nothing - break; - } - } -} -//!====================================================================================== -bool TrigRingerPreprocessor::ppExecute( Pattern& rings) { - // vector rings 2 RingSets - unsigned ridx = 0; - for (auto& jt : m_ringsSet){ - jt->reset(); //reset this ringset - for (unsigned j = 0; j < jt->max(); j++){ - jt->add( rings.at(ridx) ); - ridx++; - } //for each ring of the RingSet - } //for each RingSet - - // Normalize - normalize_rings(m_ringsSet); - - // RingSets 2 vector rings - rings.clear(); - rings.reserve( m_maxRingsAccumulated ); - for (auto& jt : m_ringsSet) rings.insert(rings.end(), jt->pattern().begin(), jt->pattern().end()); - return true; -} -//!====================================================================================== -float TrigRingerPreprocessor::normalize_eta( float eta, float etamin, float etamax ){ - int s = eta >= 0 ? 1 : -1; - return ((std::abs(eta)-etamin) * s)/(etamax-etamin); -} -//!====================================================================================== -float TrigRingerPreprocessor::normalize_mu(float mu, float mumax ){ - if(mu>mumax) - mu=mumax; - return (mu/mumax); -} - - - - - - - - - - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/MultiLayerPerceptron.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/MultiLayerPerceptron.cxx deleted file mode 100644 index 838382379ed8..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/MultiLayerPerceptron.cxx +++ /dev/null @@ -1,267 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ - -/* - * Neural Network Implementation v3.0 - * Developed by: Dhiana Deva Cavalcanti Rocha - * Contact: dhiana.deva@gmail.com - * Laboratorio de Processamento de Sinais - * Universidade Federal do Rio de Janeiro - */ - - -///Local include(s) -#include "TrigMultiVarHypo/tools/MultiLayerPerceptron.h" - -///std library(s) -#include <cstddef> -#include <vector> -#include <cmath> - -MultiLayerPerceptron::MultiLayerPerceptron(std::vector<unsigned int> &n, - std::vector<REAL> &w, - std::vector<REAL> &b, - REAL etmin, - REAL etmax, - REAL etamin, - REAL etamax, - REAL mumin, - REAL mumax) - : m_nodes(n), - m_weights(0), - m_bias(0), - m_layerOutputs(0), - m_neuronOutputs(0), - m_etmin(etmin), - m_etmax(etmax), - m_etamin(etamin), - m_etamax(etamax), - m_mumin(mumin), - m_mumax(mumax) -{ - if ( !n.size() ) throw BAD_BIAS_SIZE; //Nothing to do - - //Verifying weight vector size - unsigned wSize=0; - for (unsigned k=0; k<n.size()-1; ++k) wSize+=n[k]*n[k+1]; - try{ - if (wSize != w.size() || !w.size() ) throw BAD_WEIGHT_SIZE; - //Verifying bias vector size - unsigned bSize=0; - for (unsigned k=1; k<n.size(); ++k)bSize+=n[k]; - if(bSize != b.size() || !b.size() ) throw BAD_BIAS_SIZE; - }catch(int i){ - throw; - } - //First weight dimension - try{ - m_weights = new REAL **[n.size()-1]; //number of layers excluding input - }catch (const std::bad_alloc& xa){ - m_weights = nullptr; - throw; - } - //First bias dimension - try{ - m_bias = new REAL *[n.size()-1]; //number of layers excluding input - }catch (const std::bad_alloc& xa){ - m_bias = nullptr; - throw; - } - - //First multiplication dimension - try{ - m_neuronOutputs = new REAL *[n.size()]; - m_layerOutputs = new REAL *[n.size()]; //number of layers including input - } catch (const std::bad_alloc& xa){ - m_layerOutputs = nullptr; - m_neuronOutputs = nullptr; - throw; - } - - for (unsigned l = 0; l<n.size(); ++l){ - //Checks if no bad_alloc happened to layerOutputs - if(m_layerOutputs){ - try{ - //Second and last dimension of layerOutputs - m_layerOutputs[l] = new REAL[n[l]]; //number of nodes in current layer - } catch (const std::bad_alloc& xa){ - m_layerOutputs[l] = nullptr; - throw; - } - } - - //Checks if no bad_alloc happened to layerOutputs - if(m_neuronOutputs){ - try{ - //Second and last dimension of layerOutputs - m_neuronOutputs[l] = new REAL[n[l]]; //number of nodes in current layer - } catch (const std::bad_alloc& xa){ - m_neuronOutputs[l] = nullptr; - throw; - } - } - } - - std::vector<REAL>::const_iterator itrB = b.begin(); - std::vector<REAL>::const_iterator itrW = w.begin(); - for (unsigned l = 0; l < n.size()-1; ++l){ - //Checks if no bad_alloc happened to bias - if(m_bias){ - try{ - //Second and last dimension of bias - m_bias[l] = new REAL[n[l+1]]; //number of nodes in next layer - } catch (const std::bad_alloc& xa){ - m_bias[l] = nullptr; - throw; - } - } - //Checks if no bad_alloc happened to m_weights - if(m_weights){ - try{ - //Second dimension of weights - m_weights[l] = new REAL*[n[l+1]]; //number of nodes in next layer - } catch (const std::bad_alloc& xa){ - m_weights[l] = nullptr; - throw; - } - } - for (unsigned i=0; i<n[l+1]; i++){ - //Checks if no bad_alloc happened to weights[l] - if(m_weights){ - if(m_weights[l]){ - try{ - //Third and last dimension of weights - m_weights[l][i]=new REAL [n[l]]; //number of nodes in current layer - } catch (const std::bad_alloc& xa){ - m_weights[l][i] = nullptr; - throw; - } - } - } - //Populating bias matrix - if (m_bias){ - //Checks if no bad_alloc happened to bias[l] - if (m_bias[l]){ - m_bias[l][i]=(*itrB++); - } - } - //Populating weight matrix - for (unsigned j=0; j<n[l]; j++){ - if (m_weights){ - if (m_weights[l]){ - if(m_weights[l][i]){ - m_weights[l][i][j]=(*itrW++); - } - } - } - } - } - - //Populating multiplication matrix so that starting sum equals zero - for (unsigned i=0; i<n[l]; i++){ - //Checks if no bad_alloc happened to layerOutputs[L] - if (m_layerOutputs){ - if (m_layerOutputs[l]){ - m_layerOutputs[l][i]=0; - } - } - if (m_neuronOutputs){ - if (m_neuronOutputs[l]){ - m_neuronOutputs[l][i]=0; - } - } - } - } - -} - -MultiLayerPerceptron::~MultiLayerPerceptron(){ - - for (unsigned l=0; l<m_nodes.size()-1; l++){ - if (m_bias){ - if (m_bias[l]==nullptr){ - delete m_bias[l]; //Deletes null pointer - }else{ - delete[] m_bias[l]; //Deletes array of values at second dimension of bias - } - } - for (unsigned i=0; i<m_nodes[l+1]; i++){ - if (m_weights){ - if(m_weights[l]){ - if (m_weights[l][i]==nullptr){ - delete m_weights[l][i]; //Deletes null pointer - }else{ - delete[] m_weights[l][i]; //Deletes array of values at third dimension of weights - } - } - } - } - if (m_weights){ - if (m_weights[l]==nullptr){ - delete m_weights[l]; //Deletes null pointer - }else{ - delete[] m_weights[l]; //Deletes array of pointers at second dimension of weights - } - } - }//Layers - - for (unsigned l=0; l<m_nodes.size(); l++){ - if(m_layerOutputs){ - if (m_layerOutputs[l]==nullptr){ - delete m_layerOutputs[l]; //Deletes null pointer - } - }else{ - delete[] m_layerOutputs[l]; //Deletes array of values at second dimension of layerOutputs - } - } - - if (m_weights==nullptr){ - delete m_weights; //Deletes null pointer - }else{ - delete[] m_weights; //Deletes array of pointers at first dimension of weights - } - - if (m_bias==nullptr){ - delete m_bias; //Deletes null pointer - }else{ - delete[] m_bias; //Deletes array of pointers at first dimension of bias - } - - if (m_layerOutputs==nullptr){ - delete m_layerOutputs; //Deletes null pointer - }else{ - delete[] m_layerOutputs; //Deletes array of pointers at first dimension of layerOutputs - } -} - -float MultiLayerPerceptron::propagate(std::vector<float> &input){ - - for(unsigned i=0; i<input.size();i++){ - m_layerOutputs[0][i]=(REAL)input[i]; - } - - for(unsigned l=0; l<m_nodes.size()-1;l++){ - for(unsigned i=0; i<m_nodes[l+1]; i++){ - m_layerOutputs[l+1][i]=m_bias[l][i]; - for (unsigned j=0;j<m_nodes[l]; j++) m_layerOutputs[l+1][i]+=m_layerOutputs[l][j]*m_weights[l][i][j]; - m_neuronOutputs[l+1][i] = m_layerOutputs[l+1][i]; // Hold the sum neuron output before apply the activation function - m_layerOutputs[l+1][i] = tanh(m_layerOutputs[l+1][i]); - } - } - return (float)(m_layerOutputs[m_nodes.size()-1][0]); -} - -float MultiLayerPerceptron::getOutput(){ - return (float)(m_layerOutputs[m_nodes.size()-1][0]); -} - -float MultiLayerPerceptron::getOutputBeforeTheActivationFunction(){ - return (float)(m_neuronOutputs[m_nodes.size()-1][0]); -} - - - - - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/RingerSelectorTool.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/RingerSelectorTool.cxx new file mode 100644 index 000000000000..ed84774ad628 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/RingerSelectorTool.cxx @@ -0,0 +1,412 @@ + +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + + +// Use this tool as base to asg or alg mt +#include "TrigMultiVarHypo/tools/RingerSelectorTool.h" +#include "TrigMultiVarHypo/tools/procedures/Norm1.h" +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" + +using namespace Monitored; +using namespace Ringer; + +RingerSelectorTool::RingerSelectorTool(): + asg::AsgMessaging("RingerSelectorTool"), + m_reader("RingerReader"), + m_useTrack(false), + m_useCaloRings(true), + m_useShowerShape(false), + m_useTileCal(true) +{;} + + +RingerSelectorTool::~RingerSelectorTool() +{ + ATH_MSG_INFO("Finalizing this tool...."); +} + + +StatusCode RingerSelectorTool::initialize() +{ + if(!m_thresholdsCalibPath.empty()){ + if(!m_reader.retrieve(m_thresholdsCalibPath, m_cutDefs)){ + ATH_MSG_ERROR("Can not retrieve the information from " << m_thresholdsCalibPath ); + return StatusCode::FAILURE; + } + // retrieve metadata + m_doPileupCorrection = m_reader.doPileupCorrection(); + + m_lumiCut = m_reader.lumiCut(); + } + + // Retrieve the NeuralNetwork list + if(!m_constantsCalibPath.empty()){ + if(!m_reader.retrieve(m_constantsCalibPath, m_discriminators)){ + ATH_MSG_ERROR("Can not retrieve all information from " << m_constantsCalibPath ); + return StatusCode::FAILURE; + } + + m_useShowerShape=m_reader.useShowerShape(); + m_useTrack=m_reader.useTrack(); + m_useCaloRings=m_reader.useCaloRings(); + m_useTileCal=m_reader.useTileCal(); + m_removeOutputTansigTF=m_reader.removeOutputTansigTF(); + + } + + + // Use Norm1 as default for rings normalization only! + for(unsigned i=0; i<m_discriminators.size();++i) m_preprocs.push_back( std::make_shared< Ringer::Norm1 > (-999.,999.,-999.,999.,-999.,999.,true)); + + + + ATH_MSG_INFO("Using the activation function in the last layer? " << (m_removeOutputTansigTF ? "No":"Yes") ); + ATH_MSG_INFO("Using the Correction? " << (m_doPileupCorrection ? "Yes":"No") ); + ATH_MSG_INFO("Using lumi threshold equal: " << m_lumiCut ); + ATH_MSG_INFO("Initialization completed successfully." ); + return StatusCode::SUCCESS; + +} + + +StatusCode RingerSelectorTool::finalize(){ + return StatusCode::SUCCESS; +} + + +double RingerSelectorTool::calculate( std::vector<float>& rings, double et, double eta, double mu, + double eratio, double reta, double rphi, double rhad, double weta2, + double f1, double f3 ) +const { + + float output = -999; + // It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + // Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + + //ATH_MSG_DEBUG(( "ringer->rings().size() is: " <<rings.size()); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + + // norm1 calo rings + if(preproc) preproc->execute(refRings); + + // standards calo variables + refRings.push_back(eratio/1.0); + refRings.push_back(reta/1.0); + refRings.push_back(rphi/1.0); + refRings.push_back(rhad/0.1); + refRings.push_back(weta2/0.02); + refRings.push_back(f1/0.6); + refRings.push_back(f3/0.04); + auto answer = discr->propagate(refRings); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + + }else{ + ATH_MSG_DEBUG("There is no discriminator into this Fex." ); + }// + return output; +} + + + + + +double RingerSelectorTool::calculate( std::vector<float>& rings, double et, double eta, double mu, + double eratio, double reta, double rphi, double rhad, double weta2, + double f1, double f3, double deltaeta1, double deltaPoverP, + double deltaPhiReescaled, double d0significance, double d0pvunbiased, + double eProbabilityHT) +const { + + float output = -999; + ///It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + + ///Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + + //ATH_MSG_DEBUG(( "ringer->rings().size() is: " <<rings.size()); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + + // norm1 calo rings + if(preproc) preproc->execute(refRings); + // standards calo variables + refRings.push_back(eratio/1.0); + refRings.push_back(reta/1.0); + refRings.push_back(rphi/1.0); + refRings.push_back(rhad/0.1); + refRings.push_back(weta2/0.02); + refRings.push_back(f1/0.6); + refRings.push_back(f3/0.04); + // track variables + refRings.push_back(deltaeta1/0.05); + refRings.push_back(deltaPoverP/1.0); + refRings.push_back(deltaPhiReescaled/0.05); + refRings.push_back(d0significance/6.0); + refRings.push_back(d0pvunbiased/0.2); + refRings.push_back(eProbabilityHT/1.0); + // Add extra variables in this order! Do not change this!!! + + auto answer = discr->propagate(refRings); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + + }else{ + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); + }// + return output; +} + + + + +double RingerSelectorTool::calculate( std::vector<float>& rings, double et, double eta, double mu, + double deltaeta1, double deltaPoverP, double deltaPhiReescaled, + double d0significance, double d0pvunbiased, double eProbabilityHT) + +const { + + float output=-999.; + + // It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + + // Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + + //ATH_MSG_DEBUG(( "ringer->rings().size() is: " <<rings.size()); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + if(preproc) preproc->execute(refRings); + refRings.push_back(deltaeta1/0.05); + refRings.push_back(deltaPoverP/1.0); + refRings.push_back(deltaPhiReescaled/0.05); + refRings.push_back(d0significance/6.0); + refRings.push_back(d0pvunbiased/0.2); + refRings.push_back(eProbabilityHT/1.0); + // Add extra variables in this order! Do not change this!!! + + auto answer = discr->propagate(refRings); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + + + }else{ + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); + }// + return output; +} + +double RingerSelectorTool::calculate( std::vector<float>& rings, double et, double eta, double mu) + +const { + + float output = -999; + ///It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + + ///Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + //ATH_MSG_DEBUG(( "ringer->rings().size() is: " <<rings.size()); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + // Apply preprocessor + if(preproc) preproc->execute(refRings); + auto answer = discr->propagate(refRings); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + + + }else{ + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); + }// + + return output; +} + + + +double RingerSelectorTool::calculate( std::vector<float>& rings, double et, double eta, double mu, + Monitored::Timer &propagate_time, + Monitored::Timer &preproc_time) + +const { + + float output = -999; + ///It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + + ///Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + //ATH_MSG_DEBUG(( "ringer->rings().size() is: " <<rings.size()); + std::vector<float> refRings(rings.size()); + refRings.assign(rings.begin(), rings.end()); + // Apply preprocessor + preproc_time.start(); + if(preproc) preproc->execute(refRings); + preproc_time.stop(); + propagate_time.start(); + auto answer = discr->propagate(refRings); + propagate_time.stop(); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + + + }else{ + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); + }// + + return output; +} + + +double RingerSelectorTool::calculate( double et, double eta, double mu, + double deltaeta1, double deltaPoverP, double deltaPhiReescaled, + double d0significance, double d0pvunbiased, double eProbabilityHT) +const { + + ///It's ready to select the correct eta/et bin + std::shared_ptr<Ringer::IModel> discr; + std::shared_ptr<Ringer::INormalization> preproc; + + float output = -999; + ///Apply the discriminator + if(retrieve(et,eta,mu,discr,preproc)){ + std::vector<float> refRings; + refRings.push_back(deltaeta1/0.05); + refRings.push_back(deltaPoverP/1.0); + refRings.push_back(deltaPhiReescaled/0.05); + refRings.push_back(d0significance/6.0); + refRings.push_back(d0pvunbiased/0.2); + refRings.push_back(eProbabilityHT/1.0); + // Add extra variables in this order! Do not change this!!! + auto answer = discr->propagate(refRings); + + if(m_removeOutputTansigTF){ + output = answer.outputBeforeTheActivationFunction; + }else{ + output = answer.output; + } + + }else{ + ATH_MSG_DEBUG( "There is no discriminator into this Fex." ); + }// + return output; +} + + +bool RingerSelectorTool::accept( double discriminant, double et, double eta, double mu) + +const { + + eta = std::fabs(eta); + if(eta>2.50) eta=2.50;///fix for events out of the ranger + et = et*1e-3; ///in GeV + double threshold = 0.0; + double avgmu = mu; + //m_doPileupCorrection=false; + //Apply cut + for(unsigned i=0; i < m_cutDefs.size(); ++i){ + if((avgmu > m_cutDefs[i]->mumin()) && (avgmu <= m_cutDefs[i]->mumax())){ + if((et > m_cutDefs[i]->etmin()) && (et <= m_cutDefs[i]->etmax())){ + if((eta > m_cutDefs[i]->etamin()) && (eta <= m_cutDefs[i]->etamax())){ + + if(m_doPileupCorrection){ + // Limited Pileup + if(avgmu>m_lumiCut) + avgmu=m_lumiCut; + //ATH_MSG_DEBUG(("Apply avgmu == " << avgmu); + threshold = m_cutDefs[i]->threshold(avgmu); + //ATH_MSG_DEBUG(("With correction, thr = "<<threshold); + }else{ + threshold = m_cutDefs[i]->threshold(); + //ATH_MSG_DEBUG( "Without correction, thr = "<<threshold ); + } + } + } + } + }// Loop over cutDefs + + if(discriminant >= threshold){ + //ATH_MSG_DEBUG( "Event approved by discriminator." ); + return true; + //m_accept.setCutResult("NeuralCut", true); + } + + //return m_accept; + return false; +} + + + + +bool RingerSelectorTool::retrieve(double et, double eta, double mu, std::shared_ptr<Ringer::IModel> &discr, std::shared_ptr<Ringer::INormalization> &preproc) + +const { + + eta = std::fabs(eta); + if(eta>2.50) eta=2.50;///fix for events out of the ranger + //et = et*1e-3; ///in GeV + + if(m_discriminators.size() > 0){ + for(unsigned i=0; i<m_discriminators.size(); ++i){ + //ATH_MSG_INFO(m_discriminators[i]->etmin()<<"<Et(" <<et<< ")<="<<m_discriminators[i]->etmax()); + //ATH_MSG_INFO(m_discriminators[i]->etamin()<<"<Eta(" <<eta<< ")<="<<m_discriminators[i]->etamax()); + if(mu > m_discriminators[i]->mumin() && mu <= m_discriminators[i]->mumax()){ + if(et > m_discriminators[i]->etmin() && et <= m_discriminators[i]->etmax()){ + if(eta > m_discriminators[i]->etamin() && eta <= m_discriminators[i]->etamax()){ + discr = m_discriminators[i]; + preproc = m_preprocs[i]; + return true; + }///eta conditions + }///Et conditions + }///Mu conditions + }///Loop over discriminators + } + return false; +} + + + + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigL2CaloRingerReader.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigL2CaloRingerReader.cxx deleted file mode 100644 index 7df0907ad7cf..000000000000 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigL2CaloRingerReader.cxx +++ /dev/null @@ -1,216 +0,0 @@ -/* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -*/ -#include <iostream> -#include "TrigMultiVarHypo/tools/TrigL2CaloRingerReader.h" -#include "TTree.h" -//#include "TFile.h" -#include "TParameter.h" -#include <vector> -// Use this to find the absoluty path -#include "PathResolver/PathResolver.h" - -TrigL2CaloRingerReader::TrigL2CaloRingerReader(const std::string& name) : - asg::AsgMessaging(name), - m_name(name) -{ - m_etaBins=nullptr; - m_etBins=nullptr; - m_thresholds=nullptr; - m_weights=nullptr; - m_bias=nullptr; - // current version - m_version = 3; -} - - -// ======================================================================== - -TrigL2CaloRingerReader::~TrigL2CaloRingerReader() -{;} - -// ======================================================================== -template <class T> -void TrigL2CaloRingerReader::InitBranch(TTree* fChain, std::string branch_name, T* param){ - bool message=true; - std::string bname = branch_name; - if (fChain->GetAlias(bname.c_str())) - bname = std::string(fChain->GetAlias(bname.c_str())); - - if (!fChain->FindBranch(bname.c_str()) && message) { - msg() << MSG::WARNING << " unknown branch " << bname << endmsg; - return; - } - fChain->SetBranchStatus(bname.c_str(), 1.); - fChain->SetBranchAddress(bname.c_str(), param); -} -// ======================================================================== - -bool TrigL2CaloRingerReader::retrieve( std::string &calibPath, std::vector<MultiLayerPerceptron*> &discriminators ) -{ - m_etaBins=nullptr; - m_etBins=nullptr; - m_muBins=nullptr; - m_weights=nullptr; - m_bias=nullptr; - m_nodes=nullptr; - discriminators.clear(); - - // Retrive the - msg() << MSG::INFO << "Checking discriminators CalibPath: "<< calibPath<< endmsg; - auto fullpath = PathResolverFindCalibFile(calibPath); - TFile file(fullpath.c_str(),"READ"); - auto version = ((TParameter<int>*)file.Get("__version__"))->GetVal(); - TTree *t = (TTree*)file.Get("tuning/discriminators"); - - if(version == 2){ - // Link all branches - InitBranch(t, "weights", &m_weights); - InitBranch(t, "bias" , &m_bias ); - InitBranch(t, "nodes" , &m_nodes ); - InitBranch(t, "etaBin" , &m_etaBins ); - InitBranch(t, "etBin" , &m_etBins ); - - for(Long64_t d=0; d<t->GetEntries();++d){ - t->GetEntry(d); - // Create the discriminator object - try{ - discriminators.push_back(new MultiLayerPerceptron(*m_nodes,*m_weights,*m_bias,m_etBins->at(0), - m_etBins->at(1),m_etaBins->at(0),m_etaBins->at(1), -999, 999) ); - //msg() << MSG::INFO << "Added new discriminator into the list." << endmsg; - }catch(const std::bad_alloc& xa){ - msg() << MSG::ERROR << "Can not alloc cutDefs on memory." << endmsg; - return false; - } - } // Loop over ttree events - - // retrieve metadata - m_useEtaVar = ((TParameter<bool>*)file.Get("metadata/UseEtaVar"))->GetVal(); - m_useLumiVar = ((TParameter<bool>*)file.Get("metadata/UseLumiVar"))->GetVal(); - - - // After version 2, the neural networks include mu bins - }else if ( version == m_version ){ // version 3 - // Link all branches - InitBranch(t, "weights", &m_weights); - InitBranch(t, "bias" , &m_bias ); - InitBranch(t, "nodes" , &m_nodes ); - InitBranch(t, "etaBin" , &m_etaBins ); - InitBranch(t, "etBin" , &m_etBins ); - InitBranch(t, "muBin" , &m_muBins ); - - for(Long64_t d=0; d<t->GetEntries();++d){ - t->GetEntry(d); - // Create the discriminator object - try{ - discriminators.push_back(new MultiLayerPerceptron(*m_nodes,*m_weights,*m_bias,m_etBins->at(0), - m_etBins->at(1),m_etaBins->at(0),m_etaBins->at(1), m_muBins->at(0), m_muBins->at(1) ) ); - //msg() << MSG::INFO << "Added new discriminator into the list." << endmsg; - }catch(const std::bad_alloc& xa){ - msg() << MSG::ERROR << "Can not alloc cutDefs on memory." << endmsg; - return false; - } - } // Loop over ttree events - - // retrieve metadata - m_useEtaVar = ((TParameter<bool>*)file.Get("metadata/UseEtaVar"))->GetVal(); - m_useLumiVar = ((TParameter<bool>*)file.Get("metadata/UseLumiVar"))->GetVal(); - - }else{ - msg() << MSG::WARNING << "version not supported" << endmsg; - return false; - } - - msg() << MSG::INFO << "Config file version : " << version << endmsg; - msg() << MSG::INFO << "Total of discriminators retrievied is : " << discriminators.size() << endmsg; - msg() << MSG::INFO << "Using eta variable : " << (m_useEtaVar?"Yes":"No") << endmsg; - msg() << MSG::INFO << "Using lumi variable : " << (m_useLumiVar?"Yes":"No") << endmsg; - file.Close(); - - return true; -} - -// ======================================================================== - -bool TrigL2CaloRingerReader::retrieve( std::string &calibPath, std::vector<TrigCaloRingsHelper::CutDefsHelper*> &cutDefs ) -{ - m_etaBins=nullptr; - m_etBins=nullptr; - m_muBins=nullptr; - m_thresholds=nullptr; - - cutDefs.clear(); - msg() << MSG::INFO <<"Checking thresholds CalibPath: "<< calibPath << endmsg; - auto fullpath = PathResolverFindCalibFile(calibPath); - TFile file(fullpath.c_str(),"READ"); - auto version = ((TParameter<int>*)file.Get("__version__"))->GetVal(); - TTree *t = (TTree*)file.Get("tuning/thresholds"); - - if(version == 2){ - InitBranch(t, "thresholds", &m_thresholds); - InitBranch(t, "etBin" , &m_etBins ); - InitBranch(t, "etaBin" , &m_etaBins ); - - for(Long64_t d=0; d<t->GetEntries();++d){ - t->GetEntry(d); - // Create the discriminator object - try{ - cutDefs.push_back(new TrigCaloRingsHelper::CutDefsHelper(*m_thresholds,m_etaBins->at(0), - m_etaBins->at(1), m_etBins->at(0),m_etBins->at(1),-999 , 999)); - //msg() << MSG::INFO << "Added new cutDef into the list." << endmsg; - }catch(const std::bad_alloc& xa){ - msg() << MSG::ERROR << "Can not alloc cutDefs on memory." << endmsg; - return false; - } - } // Loop over ttree events - - // retrieve metadata - m_useNoActivationFunctionInTheLastLayer = ((TParameter<bool>*)file.Get("metadata/UseNoActivationFunctionInTheLastLayer"))->GetVal(); - m_lumiCut = ((TParameter<int>*)file.Get("metadata/LumiCut"))->GetVal(); - m_doPileupCorrection = ((TParameter<bool>*)file.Get("metadata/DoPileupCorrection"))->GetVal(); - - }else if(version == m_version){ // version 3 - - InitBranch(t, "thresholds", &m_thresholds); - InitBranch(t, "etBin" , &m_etBins ); - InitBranch(t, "etaBin" , &m_etaBins ); - InitBranch(t, "muBin" , &m_muBins ); - - for(Long64_t d=0; d<t->GetEntries();++d){ - t->GetEntry(d); - // Create the discriminator object - try{ - cutDefs.push_back(new TrigCaloRingsHelper::CutDefsHelper(*m_thresholds,m_etaBins->at(0), - m_etaBins->at(1), m_etBins->at(0),m_etBins->at(1), - m_muBins->at(0), m_muBins->at(1)) ); - //msg() << MSG::INFO << "Added new cutDef into the list." << endmsg; - }catch(const std::bad_alloc& xa){ - msg() << MSG::ERROR << "Can not alloc cutDefs on memory." << endmsg; - return false; - } - } // Loop over ttree events - - // retrieve metadata - m_useNoActivationFunctionInTheLastLayer = ((TParameter<bool>*)file.Get("metadata/UseNoActivationFunctionInTheLastLayer"))->GetVal(); - m_lumiCut = ((TParameter<int>*)file.Get("metadata/LumiCut"))->GetVal(); - m_doPileupCorrection = ((TParameter<bool>*)file.Get("metadata/DoPileupCorrection"))->GetVal(); - - }else{ - msg() << MSG::WARNING << "version not supported" << endmsg; - return false; - } - - file.Close(); - - msg() << MSG::INFO << "Config file version : " << version << endmsg; - msg() << MSG::INFO << "Total of cutDefs retrievied is : " << cutDefs.size() << endmsg; - msg() << MSG::INFO << "Using pileup correction : " << (m_doPileupCorrection?"Yes":"No") << endmsg; - msg() << MSG::INFO << "Using useNoActivationFunctionInTheLastLayer : " << (m_useNoActivationFunctionInTheLastLayer?"Yes":"No") << endmsg; - msg() << MSG::INFO << "Using lumi cut : " << (m_lumiCut) << endmsg; - return true; -} - - - - - diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigRingerHelper.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerHelper.cxx similarity index 81% rename from Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigRingerHelper.cxx rename to Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerHelper.cxx index 3b5dc826e4c7..30d10ad0ee8b 100644 --- a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/TrigRingerHelper.cxx +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerHelper.cxx @@ -1,8 +1,8 @@ /* - Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ -#include "TrigMultiVarHypo/tools/TrigRingerHelper.h" -using namespace TrigCaloRingsHelper; +#include "TrigMultiVarHypo/tools/common/RingerHelper.h" +using namespace Ringer; void parseTrigCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, std::string &caloLayerName) diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerReader.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerReader.cxx new file mode 100644 index 000000000000..95a3b7925353 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/common/RingerReader.cxx @@ -0,0 +1,318 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#include <vector> +#include "TTree.h" +#include <iostream> +#include "TParameter.h" +#include "PathResolver/PathResolver.h" + +// ringer file reader +#include "TrigMultiVarHypo/tools/common/RingerReader.h" +// interfaces +#include "TrigMultiVarHypo/tools/procedures/IModel.h" +#include "TrigMultiVarHypo/tools/procedures/IThresholds.h" +// models +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" +#include "TrigMultiVarHypo/tools/procedures/Thresholds.h" +#include "GaudiKernel/StatusCode.h" + +using namespace Ringer; + +RingerReader::RingerReader(std::string name): + asg::AsgMessaging(name), + m_name(name) +{ + m_etaBins=nullptr; + m_etBins=nullptr; + m_thresholds=nullptr; + m_weights=nullptr; + m_bias=nullptr; + m_conv_kernel=nullptr; + m_conv_nodes=nullptr; + m_conv_kernel_i=nullptr; + m_conv_kernel_j=nullptr; + + + // current version + //m_version = 2; // Used for v6 and v8 tuning for Run 2 + m_version = 3; // Should be used for future in Run 3 + m_useCaloRings=true; + m_useTileCal=true; + m_useTrack=false; + m_useShowerShape=false; + +} + + +// ======================================================================== + +RingerReader::~RingerReader() +{;} + +// ======================================================================== +template <class T> +void RingerReader::InitBranch(TTree* fChain, std::string branch_name, T* param){ + bool message=true; + std::string bname = branch_name; + if (fChain->GetAlias(bname.c_str())) + bname = std::string(fChain->GetAlias(bname.c_str())); + + if (!fChain->FindBranch(bname.c_str()) && message) { + ATH_MSG_WARNING( " unknown branch " << bname ); + return; + } + fChain->SetBranchStatus(bname.c_str(), 1.); + fChain->SetBranchAddress(bname.c_str(), param); +} +// ======================================================================== + + +bool RingerReader::retrieve( std::string &calibPath, std::vector< std::shared_ptr<IModel> > &discriminators ) +{ + m_etaBins=nullptr; + m_etBins=nullptr; + m_muBins=nullptr; + m_weights=nullptr; + m_bias=nullptr; + m_nodes=nullptr; + m_tfnames=nullptr; + m_conv_kernel=nullptr; + m_conv_bias=nullptr;; + m_conv_nodes=nullptr; + m_conv_kernel_i=nullptr; + m_conv_kernel_j=nullptr; + m_conv_input_i=nullptr; + m_conv_input_j=nullptr; + m_conv_tfnames=nullptr; + m_useConvLayer=nullptr; + discriminators.clear(); + + ATH_MSG_INFO( "Checking discriminators CalibPath: "<< calibPath ); + + auto fullpath = PathResolverFindCalibFile(calibPath); + TFile file(fullpath.c_str(),"READ"); + auto version = ((TParameter<int>*)file.Get("__version__"))->GetVal(); + TTree *t = (TTree*)file.Get("tuning/discriminators"); + + if(version == 2){ + // Link all branches + InitBranch(t, "weights", &m_weights); + InitBranch(t, "bias" , &m_bias ); + InitBranch(t, "nodes" , &m_nodes ); + InitBranch(t, "etaBin" , &m_etaBins ); + InitBranch(t, "etBin" , &m_etBins ); + + for(Long64_t d=0; d<t->GetEntries();++d){ + t->GetEntry(d); + // Create the discriminator object + try{ + std::vector<std::string> tfnames; + for(unsigned l=0; l<m_nodes->size(); l++) tfnames.push_back("tanh"); // This is default for this version + discriminators.push_back( std::make_shared<MultiLayerPerceptron>(*m_nodes,*m_weights,*m_bias,tfnames,m_etBins->at(0), + m_etBins->at(1),m_etaBins->at(0),m_etaBins->at(1), -999., 999.) ); + ATH_MSG_INFO( "Added new discriminator into the list." ); + }catch(std::bad_alloc &){ + ATH_MSG_ERROR("Can not alloc cutDefs on memory." ); + return false; + } + } // Loop over ttree events + + // retrieve metadata + m_useCaloRings=true; + + + + }else if ( version == m_version ){ // version 3 (development version for Run 3) + + // Dense configuration + InitBranch(t, "dense_weights", &m_weights ); + InitBranch(t, "dense_bias" , &m_bias ); + InitBranch(t, "dense_nodes" , &m_nodes ); + InitBranch(t, "dense_tfnames", &m_tfnames ); + + + // Need to attach the convolutional layer? + InitBranch(t, "useConvLayer" , &m_useConvLayer ); + + if(m_useConvLayer->at(0)){ + InitBranch(t, "conv_kernel_i" , &m_conv_kernel_i ); + InitBranch(t, "conv_kernel_j" , &m_conv_kernel_j ); + InitBranch(t, "conv_input_i" , &m_conv_input_i ); + InitBranch(t, "conv_input_j" , &m_conv_input_j ); + InitBranch(t, "conv_tfnames" , &m_conv_tfnames ); + InitBranch(t, "conv_nodes" , &m_conv_nodes ); + InitBranch(t, "conv_bias" , &m_conv_bias ); + InitBranch(t, "conv_kernel" , &m_conv_kernel ); + InitBranch(t, "conv_frame" , &m_conv_frame ); + } + + // Model params + InitBranch(t, "etaBin" , &m_etaBins ); + InitBranch(t, "etBin" , &m_etBins ); + InitBranch(t, "muBin" , &m_muBins ); + + for(Long64_t d=0; d<t->GetEntries();++d){ + + t->GetEntry(d); + + // Create the discriminator object + try{ + + if(m_useConvLayer->at(0)){ + ATH_MSG_INFO( "Alloc Convolutional Neural Object into the stack..." ); + /* To be include in the future + discriminators.push_back(new ConvMultiLayerPerceptron( + // Dense layers + *m_nodes, *m_weights, *m_bias, *m_tfnames, + // Convolutional layers + *m_conv_frame, + m_conv_input_i->at(0), m_conv_input_j->at(0), *m_conv_nodes, *m_conv_kernel_i, + *m_conv_kernel_j, *m_conv_kernel, *m_conv_bias ,*m_conv_tfnames, + // Model params + m_etBins->at(0),m_etBins->at(1),m_etaBins->at(0),m_etaBins->at(1), m_muBins->at(0), m_muBins->at(1) + ) + ); + */ + }else{ + discriminators.push_back(std::make_shared< MultiLayerPerceptron >( + // Dense layer + *m_nodes,*m_weights,*m_bias,*m_tfnames, + // Model params + m_etBins->at(0),m_etBins->at(1),m_etaBins->at(0),m_etaBins->at(1), m_muBins->at(0), m_muBins->at(1) + ) + ); + + + + } + + ATH_MSG_INFO( "Added new discriminator into the list." ); + }catch(std::bad_alloc &){ + ATH_MSG_ERROR( "Can not alloc cutDefs on memory." ); + return false; + } + + } // Loop over ttree events + + // retrieve metadata + m_useTrack = ((TParameter<bool>*)file.Get("metadata/UseTrack"))->GetVal(); + m_useCaloRings = ((TParameter<bool>*)file.Get("metadata/UseCaloRings"))->GetVal(); + m_useShowerShape = ((TParameter<bool>*)file.Get("metadata/UseShowerShape"))->GetVal(); + m_useTileCal = ((TParameter<bool>*)file.Get("metadata/UseTileCal"))->GetVal(); + + } + else{ + ATH_MSG_WARNING("version not supported" ); + return false; + } + + ATH_MSG_INFO( "Config file version : " << version ); + ATH_MSG_INFO( "RemoveOutputTansigTF? : " << (m_removeOutputTansigTF?"Yes":"No") ); + ATH_MSG_INFO( "Total of discriminators retrievied is : " << discriminators.size() ); + ATH_MSG_INFO( "UseCaloRings? : " << m_useCaloRings ); + ATH_MSG_INFO( "UseShowerShape? : " << m_useShowerShape ); + ATH_MSG_INFO( "UseTrack? : " << m_useTrack ); + ATH_MSG_INFO( "UseTileCal? : " << m_useTileCal ); + file.Close(); + + return true; +} + +// ======================================================================== + + + +bool RingerReader::retrieve( std::string &calibPath, std::vector< std::shared_ptr<IThresholds> > &cutDefs ) +{ + m_etaBins=nullptr; + m_etBins=nullptr; + m_muBins=nullptr; + m_thresholds=nullptr; + + cutDefs.clear(); + ATH_MSG_INFO("Checking thresholds CalibPath: "<< calibPath ); + auto fullpath = PathResolverFindCalibFile(calibPath); + TFile file(fullpath.c_str(),"READ"); + auto version = ((TParameter<int>*)file.Get("__version__"))->GetVal(); + TTree *t = (TTree*)file.Get("tuning/thresholds"); + + if(version == 2){ + InitBranch(t, "thresholds", &m_thresholds); + InitBranch(t, "etBin" , &m_etBins ); + InitBranch(t, "etaBin" , &m_etaBins ); + + for(Long64_t d=0; d<t->GetEntries();++d){ + t->GetEntry(d); + // Create the discriminator object + try{ + cutDefs.push_back( std::make_shared< Thresholds >(*m_thresholds,m_etaBins->at(0), + m_etaBins->at(1), + m_etBins->at(0), + m_etBins->at(1), + -999. , + 999.)); + }catch(std::bad_alloc &){ + ATH_MSG_ERROR( "Can not alloc cutDefs on memory." ); + return false; + } + } // Loop over ttree events + + // retrieve metadata + + m_lumiCut = ((TParameter<int>*)file.Get("metadata/LumiCut"))->GetVal(); + m_doPileupCorrection = ((TParameter<bool>*)file.Get("metadata/DoPileupCorrection"))->GetVal(); + m_removeOutputTansigTF = ((TParameter<bool>*)file.Get("metadata/UseNoActivationFunctionInTheLastLayer"))->GetVal(); + + + }else if ( version == m_version ){ // version 3 (current) + + InitBranch(t, "thresholds", &m_thresholds); + InitBranch(t, "etBin" , &m_etBins ); + InitBranch(t, "etaBin" , &m_etaBins ); + InitBranch(t, "muBin" , &m_muBins ); + + for(Long64_t d=0; d<t->GetEntries();++d){ + t->GetEntry(d); + // Create the discriminator object + try{ + cutDefs.push_back(std::make_shared< Thresholds >( *m_thresholds, + m_etaBins->at(0), + m_etaBins->at(1), + m_etBins->at(0), + m_etBins->at(1), + m_muBins->at(0), + m_muBins->at(1)) ); + + }catch(std::bad_alloc &){ + ATH_MSG_ERROR( "Can not alloc cutDefs on memory." ); + return false; + } + } // Loop over ttree events + + // retrieve metadata + m_lumiCut = ((TParameter<int>*)file.Get("metadata/LumiCut"))->GetVal(); + m_doPileupCorrection = ((TParameter<bool>*)file.Get("metadata/DoPileupCorrection"))->GetVal(); + m_removeOutputTansigTF = ((TParameter<bool>*)file.Get("metadata/RemoveOutputTansigTF"))->GetVal(); + + }else{ + ATH_MSG_WARNING("version not supported" ); + return false; + } + + file.Close(); + ATH_MSG_INFO( "Config file version : " << version ); + ATH_MSG_INFO( "Total of cutDefs retrievied is : " << cutDefs.size() ); + ATH_MSG_INFO( "Using pileup correction : " << (m_doPileupCorrection?"Yes":"No") ); + ATH_MSG_INFO( "Using lumi cut : " << (m_lumiCut) ); + return true; +} + + + + + + + + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/MultiLayerPerceptron.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/MultiLayerPerceptron.cxx new file mode 100644 index 000000000000..98baca25a981 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/MultiLayerPerceptron.cxx @@ -0,0 +1,266 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + + +#include "TrigMultiVarHypo/tools/procedures/MultiLayerPerceptron.h" + +#include <cstddef> +#include <vector> +#include <cmath> +#include <iostream> +using namespace std; +using namespace Ringer; + +MultiLayerPerceptron::MultiLayerPerceptron(std::vector<unsigned int> &n, + std::vector<double> &w, + std::vector<double> &b, + std::vector<std::string> &TF, + double etmin, + double etmax, + double etamin, + double etamax, + double mumin, + double mumax) + : + IModel(etmin,etmax,etamin,etamax,mumin,mumax), + m_nodes(n), + m_weights(0), + m_bias(0), + m_tfnames(TF) +{ + + if ( !n.size() ) throw BAD_BIAS_SIZE; //Nothing to do + + //Verifying weight vector size + unsigned wSize=0; + for (unsigned k=0; k<n.size()-1; ++k) wSize+=n[k]*n[k+1]; + try{ + if (wSize != w.size() || !w.size() ) throw BAD_WEIGHT_SIZE; + //Verifying bias vector size + unsigned bSize=0; + for (unsigned k=1; k<n.size(); ++k)bSize+=n[k]; + if(bSize != b.size() || !b.size() ) throw BAD_BIAS_SIZE; + }catch(int i){ + throw; + } + //First weight dimension + try{ + m_weights = new double **[n.size()-1]; //number of layers excluding input + }catch (const std::bad_alloc &){ + m_weights = nullptr; + throw; + } + //First bias dimension + try{ + m_bias = new double *[n.size()-1]; //number of layers excluding input + }catch (const std::bad_alloc &){ + m_bias = nullptr; + throw; + } + + + std::vector<double>::const_iterator itrB = b.begin(); + std::vector<double>::const_iterator itrW = w.begin(); + for (unsigned l = 0; l < n.size()-1; ++l){ + //Checks if no bad_alloc happened to bias + if(m_bias){ + try{ + //Second and last dimension of bias + m_bias[l] = new double[n[l+1]]; //number of nodes in next layer + } catch (const std::bad_alloc &){ + m_bias[l] = nullptr; + throw; + } + } + //Checks if no bad_alloc happened to m_weights + if(m_weights){ + try{ + //Second dimension of weights + m_weights[l] = new double*[n[l+1]]; //number of nodes in next layer + } catch ( const std::bad_alloc &){ + m_weights[l] = nullptr; + throw; + } + } + for (unsigned i=0; i<n[l+1]; i++){ + //Checks if no bad_alloc happened to weights[l] + if(m_weights){ + if(m_weights[l]){ + try{ + //Third and last dimension of weights + m_weights[l][i]=new double [n[l]]; //number of nodes in current layer + } catch (const std::bad_alloc &){ + m_weights[l][i] = nullptr; + throw; + } + } + } + //Populating bias matrix + if (m_bias){ + //Checks if no bad_alloc happened to bias[l] + if (m_bias[l]){ + m_bias[l][i]=(*itrB++); + } + } + //Populating weight matrix + for (unsigned j=0; j<n[l]; j++){ + if (m_weights){ + if (m_weights[l]){ + if(m_weights[l][i]){ + m_weights[l][i][j]=(*itrW++); + } + } + } + } + } + } +} + + +void MultiLayerPerceptron::release(double** neuronOutputs, double** layerOutputs) const +{ + + for (unsigned l=0; l<m_nodes.size(); l++){ + if(layerOutputs){ + if (layerOutputs[l]==nullptr){ + delete layerOutputs[l]; //Deletes null pointer + } + }else{ + delete[] layerOutputs[l]; //Deletes array of values at second dimension of layerOutputs + } + if(neuronOutputs){ + if (neuronOutputs[l]==nullptr){ + delete neuronOutputs[l]; //Deletes null pointer + } + }else{ + delete[] neuronOutputs[l]; //Deletes array of values at second dimension of layerOutputs + } + } + + if(layerOutputs==nullptr) + delete layerOutputs; + else + delete[] layerOutputs; + + if(neuronOutputs==nullptr) + delete neuronOutputs; + else + delete[] neuronOutputs; + + +} + + + + +MultiLayerPerceptron::~MultiLayerPerceptron(){ + + for (unsigned l=0; l<m_nodes.size()-1; l++){ + if (m_bias){ + if (m_bias[l]==nullptr){ + delete m_bias[l]; //Deletes null pointer + }else{ + delete[] m_bias[l]; //Deletes array of values at second dimension of bias + } + } + for (unsigned i=0; i<m_nodes[l+1]; i++){ + if (m_weights){ + if(m_weights[l]){ + if (m_weights[l][i]==nullptr){ + delete m_weights[l][i]; //Deletes null pointer + }else{ + delete[] m_weights[l][i]; //Deletes array of values at third dimension of weights + } + } + } + } + if (m_weights){ + if (m_weights[l]==nullptr){ + delete m_weights[l]; //Deletes null pointer + }else{ + delete[] m_weights[l]; //Deletes array of pointers at second dimension of weights + } + } + }//Layers + + + if (m_weights==nullptr){ + delete m_weights; //Deletes null pointer + }else{ + delete[] m_weights; //Deletes array of pointers at first dimension of weights + } + + if (m_bias==nullptr){ + delete m_bias; //Deletes null pointer + }else{ + delete[] m_bias; //Deletes array of pointers at first dimension of bias + } +} + + + +Ringer::RnnOutInfo MultiLayerPerceptron::propagate(std::vector<float> &input ) const +{ + double **layerOutputs; + double **neuronOutputs; + //this->malloc(neuronOutputs, layerOutputs); + + //First multiplication dimension + neuronOutputs = new double *[m_nodes.size()]; + layerOutputs = new double *[m_nodes.size()]; //number of layers including input + + for (unsigned l = 0; l<m_nodes.size(); ++l){ + //Second and last dimension of layerOutputs + layerOutputs[l] = new double[m_nodes[l]]; //number of nodes in current layer + //Second and last dimension of layerOutputs + neuronOutputs[l] = new double[m_nodes[l]]; //number of nodes in current layer + } + + + for (unsigned l = 0; l<m_nodes.size()-1; ++l){ + for (unsigned i=0; i<m_nodes[l]; i++){ + //Populating multiplication matrix so that starting sum equals zero + if(l==0) + layerOutputs[0][i]=(double)input.at(i); + else + layerOutputs[l][i]=0; + neuronOutputs[l][i]=0; + } + } + + // Propagate + for(unsigned l=0; l<m_nodes.size()-1;l++){ + for(unsigned i=0; i<m_nodes[l+1]; i++){ + layerOutputs[l+1][i]=m_bias[l][i]; + for (unsigned j=0;j<m_nodes[l]; j++) layerOutputs[l+1][i]+=layerOutputs[l][j]*m_weights[l][i][j]; + neuronOutputs[l+1][i] = layerOutputs[l+1][i]; // Hold the sum neuron output before apply the activation function + //layerOutputs[l+1][i] = this->activation(layerOutputs[l+1][i], m_tfnames[l]); + layerOutputs[l+1][i] = tanh(layerOutputs[l+1][i]); + } + } + + Ringer::RnnOutInfo answer; + answer.output=(float)(layerOutputs[m_nodes.size()-1][0]); + answer.outputBeforeTheActivationFunction=(float)(neuronOutputs[m_nodes.size()-1][0]); + this->release(neuronOutputs,layerOutputs); + return answer; +} + +/* +double MultiLayerPerceptron::activation( double value, std::string &tfname ){ + + // Apply the hiperbolic tangent + if(tfname=="tanh"){ + return tanh(value); + // Applyt the RELU transfer function + }else if(tfname=="relu"){ + return (value > 0) ? value : 0; + }else if(tfname=="linear"){ + return value; + }else{ // Bypass the TF + return value; + } +} +*/ + diff --git a/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/Norm1.cxx b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/Norm1.cxx new file mode 100644 index 000000000000..fe393d414aaf --- /dev/null +++ b/Trigger/TrigHypothesis/TrigMultiVarHypo/src/tools/procedures/Norm1.cxx @@ -0,0 +1,36 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +///Local include(s) +#include "TrigMultiVarHypo/tools/procedures/Norm1.h" +///std library(s) +#include <cmath> +using namespace std; +using namespace Ringer; + + + + +Norm1::Norm1( double etmin, double etmax, double etamin, double etamax, double mumin, double mumax, bool usetilecal): + INormalization(etmin,etmax,etamin,etamax,mumin,mumax), + m_useTileCal(usetilecal) +{;} + + + +void Norm1::execute( std::vector<float> &rings ) const { + + if(!m_useTileCal){ + if(rings.size() == 100){ + // remove the last 12 rings (tilecal) + rings.erase(rings.begin()+88,rings.end()); + } + } + float energy=0.0; + for(unsigned i=0; i<rings.size(); ++i) energy+=rings.at(i); + for(unsigned i=0; i<rings.size(); ++i) rings.at(i)=rings.at(i)/std::fabs(energy); +} + + + -- GitLab From 6058a680e1b3276896ccbb8161bd5111f810e8af Mon Sep 17 00:00:00 2001 From: Bertrand Martin <martindl@cern.ch> Date: Mon, 11 Mar 2019 09:05:24 +0100 Subject: [PATCH 017/163] drop comment --- Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py index 4c5cdb184798..9bcb6b2af825 100644 --- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py +++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py @@ -347,7 +347,6 @@ class TauHypoProvider: ('medium0', 200): [0,3, 200.0*GeV, 2, False], } -# 'massTrkSysMin', 'massTrkSysMax', 'massTrkSysKaonMin', 'massTrkSysKaonMax', 'massTrkSysKaonPiMin', 'massTrkSysKaonPiMax', 'targetMassTrkSysKaonPi', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax' thresholdsEF_dikaon = { ('dikaon', 25): [0.2*GeV, 0.45*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 15.0*GeV, 25.0*GeV, 1.5], ('dikaon', 35): [0.2*GeV, 0.45*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 1000.0*GeV, 0.0*GeV, 25.0*GeV, 35.0*GeV, 1.5], -- GitLab From 84ba11223e882d598099108eda16d91345e87a43 Mon Sep 17 00:00:00 2001 From: Walter Lampl <Walter.Lampl@cern.ch> Date: Mon, 11 Mar 2019 13:55:46 +0100 Subject: [PATCH 018/163] re-instante a way to pass private algo-tools through ComponentAccumulator --- .../CaloRec/python/CaloCellMakerConfig.py | 18 ++++--- .../CaloRec/python/CaloTopoClusterConfig.py | 13 +++-- .../CaloTools/python/CaloNoiseToolConfig.py | 2 +- .../python/ComponentAccumulator.py | 47 +++++++++++-------- Database/IOVDbSvc/python/IOVDbSvcConfig.py | 1 + .../python/LArBadChannelConfig.py | 8 ++-- .../LArCabling/python/LArCablingConfig.py | 9 ++-- .../LArCellRec/python/LArCellBuilderConfig.py | 22 ++++----- .../python/egammaCaloToolsConfig.py | 2 +- 9 files changed, 70 insertions(+), 52 deletions(-) diff --git a/Calorimeter/CaloRec/python/CaloCellMakerConfig.py b/Calorimeter/CaloRec/python/CaloCellMakerConfig.py index 7d35c0ad382e..0fca0d226c2e 100644 --- a/Calorimeter/CaloRec/python/CaloCellMakerConfig.py +++ b/Calorimeter/CaloRec/python/CaloCellMakerConfig.py @@ -15,15 +15,18 @@ def CaloCellMakerCfg(configFlags): result.merge(LArGMCfg(configFlags)) result.merge(TileGMCfg(configFlags)) - acc,theLArCellMaker=LArCellBuilderCfg(configFlags) - result.merge(acc) + larCellBuilder=LArCellBuilderCfg(configFlags) - acc,theLArCellCorrectors=LArCellCorrectorCfg(configFlags) - result.merge(acc) + + + larCellCorrectors=LArCellCorrectorCfg(configFlags) theTileCellBuilder = TileCellBuilder() - cellAlgo=(CaloCellMaker(CaloCellMakerToolNames=[theLArCellMaker,CaloCellContainerFinalizerTool()]+theLArCellCorrectors, - CaloCellsOutputName="AllCalo")) + + cellAlgo=CaloCellMaker(CaloCellMakerToolNames=[larCellBuilder.popPrivateTools(),CaloCellContainerFinalizerTool()]+larCellCorrectors.popPrivateTools(), + CaloCellsOutputName="AllCalo") + result.merge(larCellBuilder) + result.merge(larCellCorrectors) return result,cellAlgo @@ -37,8 +40,9 @@ if __name__=="__main__": Configurable.configurableRun3Behavior=1 from AthenaConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles - ConfigFlags.Input.Files=["myRDO.pool.root",] + ConfigFlags.Input.Files = defaultTestFiles.RAW ConfigFlags.lock() cfg=ComponentAccumulator() diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py index 20f9aec6e030..77cf8db91455 100644 --- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py +++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py @@ -21,7 +21,8 @@ def CaloTopoClusterCfg(configFlags): result.merge(TileGMCfg(configFlags)) #Get CaloNoiseTool - acc,theCaloNoiseTool=CaloNoiseToolCfg(configFlags) + acc=CaloNoiseToolCfg(configFlags) + theCaloNoiseTool=acc.getPublicTool("CaloNoiseTool") result.merge(acc) # maker tools @@ -107,17 +108,19 @@ if __name__=="__main__": from AthenaCommon.Logging import log from AthenaCommon.Constants import DEBUG from AthenaConfiguration.AllConfigFlags import ConfigFlags + from AthenaConfiguration.TestDefaults import defaultTestFiles log.setLevel(DEBUG) - ConfigFlags.Input.isMC = False - ConfigFlags.Input.Files = ["myESD.pool.root"] - ConfigFlags.Output.ESDFileName="esdOut.pool.root" + #ConfigFlags.Input.isMC = False + ConfigFlags.Input.Files = ConfigFlags.Input.Files = defaultTestFiles.ESD + ConfigFlags.Output.ESDFileName= "esdOut.pool.root" ConfigFlags.lock() from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg - #cfg=ComponentAccumulator() + + cfg=MainServicesSerialCfg() cfg.merge(PoolReadCfg(ConfigFlags)) diff --git a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py index d3e6c0010ed0..cdba6579e1aa 100644 --- a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py +++ b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py @@ -97,7 +97,7 @@ def CaloNoiseToolCfg(configFlags): result.addPublicTool(caloNoiseToolDB) - return result,caloNoiseToolDB + return result if __name__ == "__main__": from AthenaCommon.Configurable import Configurable diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index e3df021c15aa..48807fd520e6 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -31,16 +31,13 @@ class ComponentAccumulator(object): self._services=[] #List of service, not yet sure if the order matters here in the MT age self._eventInputs=set() #List of items (as strings) to be read from the input (required at least for BS-reading). self._outputPerStream={} #Dictionary of {streamName,set(items)}, all as strings - + self._privateTools=None #A placeholder to carry a private tool(s) not yet attached to its parent self._theAppProps=dict() #Properties of the ApplicationMgr #Backward compatiblity hack: Allow also public tools: self._publicTools=[] - # small CAs can have only tools - self._privateTools=[] - #To check if this accumulator was merged: self._wasMerged=False @@ -161,7 +158,26 @@ class ComponentAccumulator(object): else: return findSubSequence(self._sequence,sequenceName) - + def setPrivateTools(self,privTool): + if self._privateTools is not None: + raise ConfigurationError("This ComponentAccumulator holds already a private tool. Only one private tool is allowed") + + if isinstance(privTool,collections.Sequence): + for t in privTool: + if not isinstance(t,ConfigurableAlgTool): + raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only configurableAlgTools or lists of ConfigurableAlgTools. Encountered %s in a list" % type(t)) + else: + if not isinstance(privTool,ConfigurableAlgTool): + raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only configurableAlgTools or lists of ConfigurableAlgTools. Encountered %s " % type(privTool)) + + self._privateTools=privTool + return + + def popPrivateTools(self): + tool=self._privateTools + self._privateTools=None + return tool + def addEventAlgo(self, algorithms,sequenceName=None): if not isinstance(algorithms,collections.Sequence): @@ -233,7 +249,7 @@ class ComponentAccumulator(object): raise TypeError("Attempt to add wrong type: %s as service" % type( newSvc ).__name__) pass self._deduplicate(newSvc,self._services) #will raise on conflict - return newSvc + return def addPublicTool(self,newTool): @@ -370,19 +386,6 @@ class ComponentAccumulator(object): """ Returns single service, exception if either not found or to many found""" return self.__getOne( self._services, name, "Services") - def addPrivateTool(self, newTool): - if not isinstance(newTool,ConfigurableAlgTool): - raise TypeError("Attempt to add wrong type: %s as private AlgTool" % type( newTool ).__name__) - self._deduplicate(newTool,self._privateTools) - - def getPrivateTools(self): - return self._privateTools - - def getPrivateTool(self, name=None): - """ Returns single private tool, exception if either not found or to many found""" - return self.__getOne( self._privateTools, name, "PrivateTools") - - def addEventInput(self,condObj): #That's a string, should do some sanity checks on formatting self._eventInput.add(condObj) @@ -428,7 +431,7 @@ class ComponentAccumulator(object): self.addEventAlgorithm(other, sequenceName=sequenceName) #FIXME: At this point we can't distingush event algos from conditions algos. #Might become possible with new Gaudi configurables - elif isinstance(other,ConfigurableAlgTool): + elif isinstance(otherConfigurableAlgTool): self.addPublicTool(other) else: raise RuntimeError("mergeAll called with unexpected parameter of type %s" % type(other)) @@ -441,6 +444,10 @@ class ComponentAccumulator(object): if other is None: raise RuntimeError("merge called on object of type None: did you forget to return a CA from a config function?") + privTool=self._privateTools or other._privateTools + if (privTool is not None): + raise RuntimeError("merge called on a ComponentAccumulator with and dangling private tool %s/%s" % (privTool.getType(),privTool.getName())) + if isinstance(other,collections.Sequence): self._msg.error("Merge called with a: %s " % str(type(other)) + " of length: %d " % len(other)) self._msg.error("where elements are of type : " + ", ".join([ str(type(x).__name__) for x in other]) ) diff --git a/Database/IOVDbSvc/python/IOVDbSvcConfig.py b/Database/IOVDbSvc/python/IOVDbSvcConfig.py index 2a6df21a71f3..3d3d7034bae6 100644 --- a/Database/IOVDbSvc/python/IOVDbSvcConfig.py +++ b/Database/IOVDbSvc/python/IOVDbSvcConfig.py @@ -90,6 +90,7 @@ This allows the possibility of later adding a new IOV using IOVSvc::setRange.""" result,iovDbSvc=IOVDbSvcCfg(configFlags) + #Add class-name to CondInputLoader (if reqired) if className is not None: loadFolders=[] diff --git a/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py b/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py index 2084ae83337d..fd30c40ed52d 100644 --- a/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py +++ b/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py @@ -5,7 +5,7 @@ from IOVDbSvc.IOVDbSvcConfig import addFolders def LArBadChannelCfg(configFlags): - result=LArOnOffIdMappingCfg(configFlags)[0] + result=LArOnOffIdMappingCfg(configFlags) if configFlags.Common.isOnline or configFlags.Input.isMC: foldername="/LAR/BadChannels/BadChannels" @@ -48,7 +48,8 @@ def LArBadChannelMaskerCfg(configFlags,problemsToMask,doMasking=True,ToolName="L result=LArBadChannelCfg(configFlags) bcMasker=LArBadChannelMasker(ToolName,ProblemsToMask=problemsToMask, DoMasking=doMasking) - return result,bcMasker + result.setPrivateTools(bcMasker) + return result @@ -69,7 +70,8 @@ if __name__=="__main__": cfg.merge(LArBadChannelCfg(ConfigFlags)) cfg.merge(LArBadFebCfg(ConfigFlags)) - acc,privTool=LArBadChannelMaskerCfg(ConfigFlags,["allDead",]) + acc=LArBadChannelMaskerCfg(ConfigFlags,["allDead",]) + masker=acc.popPrivateTool() cfg.merge(acc) f=open("LArBCCondAlgos.pkl","w") cfg.store(f) diff --git a/LArCalorimeter/LArCabling/python/LArCablingConfig.py b/LArCalorimeter/LArCabling/python/LArCablingConfig.py index 39dc34077457..afa2f57c9772 100644 --- a/LArCalorimeter/LArCabling/python/LArCablingConfig.py +++ b/LArCalorimeter/LArCabling/python/LArCablingConfig.py @@ -25,7 +25,8 @@ def _larCablingCfg(configFlags,algo,folder): result.addCondAlgo(algo(ReadKey=folder)) result.merge(addFolders(configFlags,folderwithtag,className="AthenaAttributeList",detDb=db)) - return result,None + #print result + return result def LArOnOffIdMappingCfg(configFlags): @@ -51,8 +52,8 @@ if __name__ == "__main__": ConfigFlags.Input.Files = defaultTestFiles.RAW ConfigFlags.lock() - acc = LArOnOffIdMappingCfg( ConfigFlags )[0] - acc.merge(LArFebRodMappingCfg(ConfigFlags)[0]) - acc.merge(LArCalibIdMappingCfg(ConfigFlags)[0]) + acc = LArOnOffIdMappingCfg( ConfigFlags ) + acc.merge(LArFebRodMappingCfg(ConfigFlags)) + acc.merge(LArCalibIdMappingCfg(ConfigFlags)) acc.store( file( "test.pkl", "w" ) ) print "All OK" diff --git a/LArCalorimeter/LArCellRec/python/LArCellBuilderConfig.py b/LArCalorimeter/LArCellRec/python/LArCellBuilderConfig.py index 9ba36ba02a0c..0275c9ee1eec 100644 --- a/LArCalorimeter/LArCellRec/python/LArCellBuilderConfig.py +++ b/LArCalorimeter/LArCellRec/python/LArCellBuilderConfig.py @@ -5,11 +5,13 @@ from LArCellRec.LArCellRecConf import LArCellBuilderFromLArRawChannelTool, LArCe from LArCabling.LArCablingConfig import LArOnOffIdMappingCfg def LArCellBuilderCfg(configFlags): - result=LArOnOffIdMappingCfg(configFlags) + result=ComponentAccumulator() + result.merge(LArOnOffIdMappingCfg(configFlags)) theLArCellBuilder = LArCellBuilderFromLArRawChannelTool() theLArCellBuilder.addDeadOTX = False #Create flag? Requires bad-feb DB access - return result,theLArCellBuilder + result.setPrivateTools(theLArCellBuilder) + return result @@ -26,20 +28,18 @@ def LArCellCorrectorCfg(configFlags): from LArBadChannelTool.LArBadChannelConfig import LArBadChannelMaskerCfg theNoiseMasker=LArCellNoiseMaskingTool() if configFlags.LAr.doCellNoiseMasking: - acc,cellNoiseMaskingTool= LArBadChannelMaskerCfg(configFlags,problemsToMask=["highNoiseHG","highNoiseMG","highNoiseLG","deadReadout","deadPhys"],ToolName="CellNoiseMask") + acc= LArBadChannelMaskerCfg(configFlags,problemsToMask=["highNoiseHG","highNoiseMG","highNoiseLG","deadReadout","deadPhys"],ToolName="CellNoiseMask") + theNoiseMasker.MaskingTool=acc.popPrivateTools() result.merge(acc) - theNoiseMasker.MaskingTool=cellNoiseMaskingTool + pass if configFlags.LAr.doCellSporadicNoiseMasking: - acc,sporadicNoiseMaskingTool=LArBadChannelMaskerCfg(configFlags,problemsToMask=["sporadicBurstNoise",],ToolName="SporadicNoiseMask") + acc=LArBadChannelMaskerCfg(configFlags,problemsToMask=["sporadicBurstNoise",],ToolName="SporadicNoiseMask") + theNoiseMasker.MaskingSporadicTool=acc.popPrivateTools() result.merge(acc) - theNoiseMasker.MaskingSporadicTool=sporadicNoiseMaskingTool pass correctionTools.append(theNoiseMasker) #Many more tools to be added, eg HV correction - - return result,correctionTools - - - + result.setPrivateTools(correctionTools) + return result diff --git a/Reconstruction/egamma/egammaCaloTools/python/egammaCaloToolsConfig.py b/Reconstruction/egamma/egammaCaloTools/python/egammaCaloToolsConfig.py index a40efe7b4efb..b8907c151624 100644 --- a/Reconstruction/egamma/egammaCaloTools/python/egammaCaloToolsConfig.py +++ b/Reconstruction/egamma/egammaCaloTools/python/egammaCaloToolsConfig.py @@ -13,7 +13,7 @@ def CaloFillRectangularClusterCfg(flags): phi_size = 7, cells_name = flags.Egamma.Keys.Input.Cells) - result.addPrivateTool(caloFillRectangularCluster) + result.setPrivateTools(caloFillRectangularCluster) return result #--------------------------------------- -- GitLab From b451fba6328004b1b3099f809f34cb265fc4fb32 Mon Sep 17 00:00:00 2001 From: Walter Lampl <walter.lampl@cern.ch> Date: Tue, 12 Mar 2019 06:46:50 +0000 Subject: [PATCH 019/163] Fix typo in ComponentAccumulator.py --- Control/AthenaConfiguration/python/ComponentAccumulator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index 48807fd520e6..611e554aac26 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -431,7 +431,7 @@ class ComponentAccumulator(object): self.addEventAlgorithm(other, sequenceName=sequenceName) #FIXME: At this point we can't distingush event algos from conditions algos. #Might become possible with new Gaudi configurables - elif isinstance(otherConfigurableAlgTool): + elif isinstance(other,ConfigurableAlgTool): self.addPublicTool(other) else: raise RuntimeError("mergeAll called with unexpected parameter of type %s" % type(other)) -- GitLab From 13705edf212aeead9811c2c1f502c824441a3038 Mon Sep 17 00:00:00 2001 From: Tomasz Bold <tomasz.bold@gmail.com> Date: Tue, 12 Mar 2019 14:55:19 +0100 Subject: [PATCH 020/163] updates along the comments from the big meeting --- .../python/ComponentAccumulator.py | 113 ++++-------------- .../python/ComponentAccumulatorTest.py | 6 +- .../python/PropSetterProxy.py | 79 ++++++++++++ .../TrigUpgradeTest/share/newJOtest.py | 24 ++-- 4 files changed, 112 insertions(+), 110 deletions(-) create mode 100644 Control/AthenaConfiguration/python/PropSetterProxy.py diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index 353770ce4be9..5d806457a5e9 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -592,6 +592,7 @@ class ComponentAccumulator(object): def store(self,outfile,nEvents=10,useBootStrapFile=True,threaded=False): from AthenaCommon.Utils.unixtools import find_datafile import pickle + self._isMergable = True # this is CA we store, it is ok it is not mergable if useBootStrapFile: import glob # first load basics from the bootstrap-pickle @@ -843,6 +844,27 @@ class ComponentAccumulator(object): sc1 = app.terminate() return sc1 + def foreach_component(self, path): + """ Utility to set properties of components using wildcards + + Example: + forcomps(ca, "*/HLTTop/*/*Hypo*").OutputLevel=VERBOSE + + The compoments name & locations in the CF tree are translated into the unix like path. + Components of matching path are taken under consideration in setting the property. + If the property is set succesfully an INFO message is printed. Else, a warning is printed. + + The convention for path of nested components is as follows: + Sequencer - only the name is used in the path + Algorithm - full name - type/instance_name (aka full name) is used + PrivateTools - the name of the property + the type/instance_name are added + PublicTools - are located under ToolSvc/ and type/instance_name is used + Services - located under SvcMgr/ and type/instance_name is used + """ + from AthenaConfiguration.PropSetterProxy import PropSetterProxy + self._isMergable=False + return PropSetterProxy(self, path) + def CAtoGlobalWrapper(cfgmethod,flags): @@ -852,94 +874,3 @@ def CAtoGlobalWrapper(cfgmethod,flags): result.appendToGlobals() return - - -class PropSetterProxy(object): - __compPaths = {} - __scannedCA = None - - def __init__(self, ca, path): - self.__path = path - self.__findComponents( ca ) - - - def __setattr__(self, name, value): - if name.startswith("_PropSetterProxy"): - return super(PropSetterProxy, self).__setattr__(name, value) - - msg = logging.getLogger('foreach_component') - import fnmatch - for component_path, component in PropSetterProxy.__compPaths.iteritems(): - if fnmatch.fnmatch( component_path, self.__path ): - if name in component.getProperties(): - try: - setattr( component, name, value ) - msg.debug( "Set property: %s to value %s of component %s because it matched %s " % ( name, str(value), component_path, self.__path ) ) - except Exception, ex: - msg.warning( "Failed to set property: %s to value %s of component %s because it matched %s, reason: %s" % ( name, str(value), component_path, self.__path, str(ex) ) ) - pass - else: - msg.warning( "No such a property: %s in component %s, tried to set it because it matched %s" % ( name, component_path, self.__path ) ) - - - def __findComponents(self, ca): - if ca is not PropSetterProxy.__scannedCA: - PropSetterProxy.__scannedCA = ca - PropSetterProxy.__compPaths = {} - def __add(path, comp): - if comp.getName() == "": - return - PropSetterProxy.__compPaths[ path ] = comp - - - for svc in ca._services: - PropSetterProxy.__compPaths['SvcMgr/'+svc.getFullName()] = svc - for t in ca._publicTools: - PropSetterProxy.__compPaths['ToolSvc/'+t.getFullName()] = t - - def __nestAlg(startpath, comp): # it actually dives inside the algorithms and (sub) tools - if comp.getName() == "": - return - for name, value in comp.getProperties().iteritems(): - if isinstance( value, ConfigurableAlgTool ) or isinstance( value, PrivateToolHandle ): - __add( startpath+"/"+name+"/"+value.getFullName(), value ) - __nestAlg( startpath+"/"+name+"/"+value.getName(), value ) - if isinstance( value, PrivateToolHandleArray): - for toolIndex,t in enumerate(value): - __add( startpath+"/"+name+"/"+t.getFullName(), t ) - __nestAlg( startpath+"/"+name+"/"+t.getName(), value[toolIndex] ) - - - def __nestSeq( startpath, seq ): - for c in seq.getChildren(): - if isSequence(c): - __nestSeq( startpath+"/"+c.getName(), c ) - else: # the algorithm or tool - __add( startpath+"/"+c.getFullName(), c ) - __nestAlg( startpath+"/"+c.getFullName(), c ) - - __nestSeq("", ca._sequence) - - -def foreach_component(componentAccumulator, path): - """ Utility to set properties of components using wildcards - - Example: - forcomps(ca, "*/HLTTop/*/*Hypo*").OutputLevel=VERBOSE - - The compoments name & locations in the CF tree are translated into the unix like path. - Components of matching path are taken under consideration in setting the property. - If the property is set succesfully an INFO message is printed. Else, a warning is printed. - - The convention for path of nested components is as follows: - Sequencer - only the name is used in the path - Algorithm - full name - type/instance_name (aka full name) is used - PrivateTools - the name of the property + the type/instance_name are added - PublicTools - are located under ToolSvc/ and type/instance_name is used - Services - located under SvcMgr/ and type/instance_name is used - """ - componentAccumulator._isMergable=False - return PropSetterProxy(componentAccumulator, path) - - - diff --git a/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py b/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py index 10bff26b51ca..b97d2d485fe2 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulatorTest.py @@ -2,7 +2,7 @@ # self test of ComponentAccumulator -from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator, foreach_component +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaConfiguration.AthConfigFlags import AthConfigFlags from AthenaCommon.CFElements import findSubSequence,findAlgorithm from AthenaCommon.Configurable import Configurable, ConfigurablePyAlgorithm # guinea pig algorithms @@ -106,9 +106,9 @@ class TestComponentAccumulator( unittest.TestCase ): logging.getLogger('foreach_component').setLevel(DEBUG) algo3 = self.acc.getEventAlgo("Algo3") algo3.OutputLevel = INFO - foreach_component(self.acc, "*/Algo3").OutputLevel = DEBUG # restet to debug level + self.acc.foreach_component("*/Algo3").OutputLevel = DEBUG # restet to debug level self.assertEqual( algo3.OutputLevel, DEBUG, "wrong OutputLevel value for Algo3") - foreach_component(self.acc, "*sub2*/*").OutputLevel = INFO + self.acc.foreach_component("*sub2*/*").OutputLevel = INFO self.assertEqual(self.acc.getEventAlgo("NestedAlgo1").OutputLevel, INFO, "wrong OutputLevel value for NestedAlgo1") self.assertEqual(self.acc.getEventAlgo("NestedAlgo2").OutputLevel, INFO, "wrong OutputLevel value for NestedAlgo1") diff --git a/Control/AthenaConfiguration/python/PropSetterProxy.py b/Control/AthenaConfiguration/python/PropSetterProxy.py new file mode 100644 index 000000000000..e55e6e32fa2b --- /dev/null +++ b/Control/AthenaConfiguration/python/PropSetterProxy.py @@ -0,0 +1,79 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +from AthenaCommon.Logging import logging +from AthenaCommon.CFElements import isSequence +from AthenaCommon.Configurable import ConfigurableAlgTool +from GaudiKernel.GaudiHandles import PrivateToolHandle, PrivateToolHandleArray +class PropSetterProxy(object): + __compPaths = {} + __scannedCA = None + + def __init__(self, ca, path): + self.__path = path + self.__findComponents( ca ) + + def __setattr__(self, name, value): + if name.startswith("_PropSetterProxy"): + return super(PropSetterProxy, self).__setattr__(name, value) + + msg = logging.getLogger('foreach_component') + if name != "OutputLevel": + msg.warning( "Only OutputLevel is allowed to be changed with the foreach_component at the moment" ) + return + + + import fnmatch + for component_path, component in PropSetterProxy.__compPaths.iteritems(): + if fnmatch.fnmatch( component_path, self.__path ): + if name in component.getProperties(): + try: + setattr( component, name, value ) + msg.info( "Set property: %s to value %s of component %s because it matched %s " % ( name, str(value), component_path, self.__path ) ) + except Exception, ex: + msg.warning( "Failed to set property: %s to value %s of component %s because it matched %s, reason: %s" % ( name, str(value), component_path, self.__path, str(ex) ) ) + pass + else: + msg.warning( "No such a property: %s in component %s, tried to set it because it matched %s" % ( name, component_path, self.__path ) ) + + + def __findComponents(self, ca): + if ca is not PropSetterProxy.__scannedCA: + PropSetterProxy.__scannedCA = ca + PropSetterProxy.__compPaths = {} + def __add(path, comp): + if comp.getName() == "": + return + PropSetterProxy.__compPaths[ path ] = comp + + + for svc in ca._services: + PropSetterProxy.__compPaths['SvcMgr/'+svc.getFullName()] = svc + for t in ca._publicTools: + PropSetterProxy.__compPaths['ToolSvc/'+t.getFullName()] = t + + def __nestAlg(startpath, comp): # it actually dives inside the algorithms and (sub) tools + if comp.getName() == "": + return + for name, value in comp.getProperties().iteritems(): + if isinstance( value, ConfigurableAlgTool ) or isinstance( value, PrivateToolHandle ): + __add( startpath+"/"+name+"/"+value.getFullName(), value ) + __nestAlg( startpath+"/"+name+"/"+value.getName(), value ) + if isinstance( value, PrivateToolHandleArray): + for toolIndex,t in enumerate(value): + __add( startpath+"/"+name+"/"+t.getFullName(), t ) + __nestAlg( startpath+"/"+name+"/"+t.getName(), value[toolIndex] ) + + + def __nestSeq( startpath, seq ): + for c in seq.getChildren(): + if isSequence(c): + __nestSeq( startpath+"/"+c.getName(), c ) + else: # the algorithm or tool + __add( startpath+"/"+c.getFullName(), c ) + __nestAlg( startpath+"/"+c.getFullName(), c ) + + __nestSeq("", ca._sequence) + + + + + diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py index 9dee4be183bc..5f29484cadec 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJOtest.py @@ -71,24 +71,16 @@ if mcc: top += mcc -from AthenaConfiguration.ComponentAccumulator import foreach_component from AthenaCommon.Logging import logging logging.getLogger('forcomps').setLevel(DEBUG) -foreach_component(acc, "*/L1Decoder").OutputLevel = DEBUG -foreach_component(acc, "*/L1Decoder/*Tool").OutputLevel = DEBUG # tools -foreach_component(acc, "*HLTTop/*Hypo*").OutputLevel = DEBUG # hypo algs -foreach_component(acc, "*HLTTop/*Hypo*/*Tool*").OutputLevel = DEBUG # hypo tools -foreach_component(acc, "*HLTTop/RoRSeqFilter/*").OutputLevel = DEBUG # filters -foreach_component(acc, "*HLTTop/*Input*").OutputLevel = DEBUG # input makers -foreach_component(acc, "*HLTTop/*GenericMonitoringTool*").OutputLevel = WARNING # silcence mon tools (addressing by type) - - -# # from TrigUpgradeTest.TestUtils import applyMenu -# # applyMenu( acc.getEventAlgo( "L1Decoder" ) ) -# #acc.getEventAlgo( "L1Decoder" ).OutputLevel=DEBUG -# #acc.getEventAlgo( "L2ElectronCaloHypo" ).OutputLevel=DEBUG -# #acc.getEventAlgo( "FastEMCaloAlgo" ).OutputLevel=DEBUG -# #acc.getEventAlgo( "Filter_for_L2PhotonCaloHypo" ).OutputLevel=DEBUG +acc.foreach_component("*/L1Decoder").OutputLevel = DEBUG +acc.foreach_component("*/L1Decoder/*Tool").OutputLevel = DEBUG # tools +acc.foreach_component("*HLTTop/*Hypo*").OutputLevel = DEBUG # hypo algs +acc.foreach_component("*HLTTop/*Hypo*/*Tool*").OutputLevel = DEBUG # hypo tools +acc.foreach_component("*HLTTop/RoRSeqFilter/*").OutputLevel = DEBUG # filters +acc.foreach_component("*HLTTop/*Input*").OutputLevel = DEBUG # input makers +acc.foreach_component("*HLTTop/*GenericMonitoringTool*").OutputLevel = WARNING # silcence mon tools (addressing by type) + acc.printConfig() -- GitLab From 6136df6a9338bf217096b5392c3f4b9f1406919d Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Tue, 12 Mar 2019 17:35:30 +0000 Subject: [PATCH 021/163] Using tryFetch method to query the container cache in order to allow a map of undecoded collections to be created --- .../MuonRPC_CnvTools/src/RpcROD_Decoder.h | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h index 66dd7f1bdcb8..f882e79c570c 100755 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RpcROD_Decoder.h @@ -513,18 +513,23 @@ namespace Muon for( ; it!=collections.end(); ++it) { - // Using RpcPadCache - RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( (*it) ); - - if(lock.alreadyPresent() ){ + // Normally, we would get a write handle and put a lock, but we do not process the decoding in this loop + // Therefore, we just query the cache via the container and process the hashes which have not been decoded yet + // Note that this means different threads may decode the same data if processing simultaneously + // However, only one will be written to the cache using the lock + + bool alreadyPresent = rdoIdc.tryFetch( *it ); + + if(alreadyPresent){ ATH_MSG_DEBUG ( "RPC RDO collection already exist with collection hash = " << static_cast<unsigned int>(*it) << " converting is skipped!"); } else{ - ATH_MSG_DEBUG(" Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); + ATH_MSG_DEBUG ( "Created new Pad Collection Hash ID = " << static_cast<unsigned int>(*it) ); // create new collection - I should be doing this with unique_ptr but it requires changing downstream functions RpcPad* coll = new RpcPad((m_cabling->padHashFunction())->identifier(*it), *it); mapOfCollections[coll->identify()]=coll; + }// endif collection not found in the container }//end loop over vector of hash id @@ -547,23 +552,26 @@ namespace Muon } // All un-decoded collections were decoded successfully, so they are passed back to the IDC - //for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) for (std::map<Identifier,RpcPad*>::const_iterator it=mapOfCollections.begin(); it!=mapOfCollections.end(); ++it) { - // Get the write handle again, but note that lock.alreadyPresent() will be true BUT we have already checked - // for this hash that it was not present before processing, and we still need to attach to the container + // Get the WriteHandle for this hash but we need to then check if it has already been decoded and + // added to the event cache for this hash in a different view RpcPadContainer::IDC_WriteHandle lock = rdoIdc.getWriteHandle( ((*it).second)->identifyHash() ); - // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle - StatusCode status_lock = lock.addOrDelete( std::move( std::unique_ptr<RpcPad>((*it).second))); - - if(status_lock != StatusCode::SUCCESS) - { - ATH_MSG_ERROR("Failed to add RPC PAD collection to container" ); - //report the error condition - } + if(lock.alreadyPresent()){ + ATH_MSG_DEBUG("RpcPad collection with hash " << (int)((*it).second)->identifyHash() << " was already decoded in a parallel view"); + } else{ - ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); + // Take the pointer and pass ownership to unique_ptr and pass to the IDC_WriteHandle + StatusCode status_lock = lock.addOrDelete( std::move( std::unique_ptr<RpcPad>((*it).second) ) ); + + if(status_lock != StatusCode::SUCCESS) + { + ATH_MSG_ERROR("Failed to add RPC PAD collection to container with hash " << (int)((*it).second)->identifyHash() ); + } + else{ + ATH_MSG_DEBUG("Adding RpcPad collection with hash "<<(int)((*it).second)->identifyHash()<<" to the RpcPad Container | size = "<<((*it).second)->size()); + } } } return cnv_sc; -- GitLab From 573fe6bfddf50d4550869ecfa28f008d0b88db15 Mon Sep 17 00:00:00 2001 From: Walter Lampl <Walter.Lampl@cern.ch> Date: Wed, 13 Mar 2019 13:07:54 +0100 Subject: [PATCH 022/163] fix unit tests failing to to private tool bucket --- .../CaloTools/python/CaloNoiseToolConfig.py | 2 +- .../python/LArBadChannelConfig.py | 2 +- .../MuonConfig/share/MuonDataDecodeTest.ref | 1556 ++++++++++++++++- .../share/MuonDataDecodeTest_Cache.ref | 1516 +++++++++++++++- .../python/TrigCaloDataAccessConfig.py | 4 +- 5 files changed, 3074 insertions(+), 6 deletions(-) diff --git a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py index cdba6579e1aa..d8779b5f10e2 100644 --- a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py +++ b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py @@ -109,7 +109,7 @@ if __name__ == "__main__": ConfigFlags.lock() from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator - acc, caloNoiseToolDB = CaloNoiseToolCfg(ConfigFlags) + acc = CaloNoiseToolCfg(ConfigFlags) f=open('test.pkl','w') acc.store(f) diff --git a/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py b/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py index fd30c40ed52d..944b9fb3335c 100644 --- a/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py +++ b/LArCalorimeter/LArBadChannelTool/python/LArBadChannelConfig.py @@ -71,7 +71,7 @@ if __name__=="__main__": cfg.merge(LArBadChannelCfg(ConfigFlags)) cfg.merge(LArBadFebCfg(ConfigFlags)) acc=LArBadChannelMaskerCfg(ConfigFlags,["allDead",]) - masker=acc.popPrivateTool() + masker=acc.popPrivateTools() cfg.merge(acc) f=open("LArBCCondAlgos.pkl","w") cfg.store(f) diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref index 80ddcf2e960b..5a6ded6b6aab 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref @@ -1,10 +1,48 @@ Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : [function] +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:Athena INFO About to setup Rpc Raw data decoding Py:ComponentAccumulator DEBUG Adding component EventSelectorByteStream/EventSelector to the job @@ -34,13 +72,120 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/ByteStreamAttListMetadataSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-centos7-gcc8-opt] [2.0.25/141317d] -- built on [2019-03-11T2107] dynamically loading the flag Detector Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : [function] +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : [function] +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : [function] +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : [function] +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : [function] +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -49,12 +194,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -73,6 +221,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -97,25 +246,37 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component RPCcablingServerSvc/RPCcablingServerSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job @@ -126,12 +287,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -151,6 +315,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -172,17 +337,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component LVL1TGC::TGCRecRoiSvc/LVL1TGC::TGCRecRoiSvc to the job Py:ComponentAccumulator DEBUG Adding component TGCcablingServerSvc/TGCcablingServerSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -191,12 +377,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -216,8 +405,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -258,6 +449,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -272,10 +469,172 @@ Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersiste Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job dynamically loading the flag Muon Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : False +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : False +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : False +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : False +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : False +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : 'CONDBR2' +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : 'data17_13TeV' +Input.RunNumber : [function] +Input.isMC : False +Muon.Align.UseALines : False +Muon.Align.UseAsBuilt : False +Muon.Align.UseBLines : 'none' +Muon.Align.UseILines : False +Muon.Calib.CscF001FromLocalFile : False +Muon.Calib.CscNoiseFromLocalFile : False +Muon.Calib.CscPSlopeFromLocalFile : False +Muon.Calib.CscPedFromLocalFile : False +Muon.Calib.CscRmsFromLocalFile : False +Muon.Calib.CscStatusFromLocalFile : False +Muon.Calib.CscT0BaseFromLocalFile : False +Muon.Calib.CscT0PhaseFromLocalFile : False +Muon.Calib.EventTag : 'MoMu' +Muon.Calib.applyRtScaling : True +Muon.Calib.correctMdtRtForBField : False +Muon.Calib.correctMdtRtForTimeSlewing : False +Muon.Calib.correctMdtRtWireSag : False +Muon.Calib.mdtCalibrationSource : 'MDT' +Muon.Calib.mdtMode : 'ntuple' +Muon.Calib.mdtPropagationSpeedBeta : 0.85 +Muon.Calib.readMDTCalibFromBlob : True +Muon.Calib.useMLRt : True +Muon.Chi2NDofCut : 20.0 +Muon.createTrackParticles : True +Muon.doCSCs : True +Muon.doDigitization : True +Muon.doFastDigitization : False +Muon.doMDTs : True +Muon.doMSVertex : False +Muon.doMicromegas : False +Muon.doPseudoTracking : False +Muon.doRPCClusterSegmentFinding : False +Muon.doRPCs : True +Muon.doSegmentT0Fit : False +Muon.doTGCClusterSegmentFinding : False +Muon.doTGCs : True +Muon.dosTGCs : False +Muon.enableCurvedSegmentFinding : False +Muon.enableErrorTuning : False +Muon.optimiseMomentumResolutionUsingChi2 : False +Muon.patternsOnly : False +Muon.prdToxAOD : False +Muon.printSummary : False +Muon.refinementTool : 'Moore' +Muon.rpcRawToxAOD : False +Muon.segmentOrigin : 'Muon' +Muon.straightLineFitMomentum : 2000.0 +Muon.strategy : [] +Muon.trackBuilder : 'Moore' +Muon.updateSegmentSecondCoordinate : [function] +Muon.useAlignmentCorrections : False +Muon.useLooseErrorTuning : False +Muon.useSegmentMatching : [function] +Muon.useTGCPriorNextBC : False +Muon.useTrackSegmentMatching : True +Muon.useWireSagCorrections : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job @@ -296,12 +655,38 @@ Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... +Py:ConfigurableDb DEBUG loading confDb files... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libMagFieldServices.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libCaloRec.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libTrigUpgradeTest.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libCaloTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArCabling.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libegammaCaloTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArBadChannelTool.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArCellRec.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/WorkDir.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libTrigT2CaloCommon.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/GAUDI/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/Athena/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG loading confDb files... [DONE] +Py:ConfigurableDb DEBUG loaded 1103 confDb packages +Py:ConfigurableDb INFO Read module info for 5461 configurables from 12 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... +Py:ConfigurableDb DEBUG : Found configurable <class 'PoolSvc.PoolSvcConf.PoolSvc'> in module PoolSvc.PoolSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaServices.AthenaServicesConf.MetaDataSvc'> in module AthenaServices.AthenaServicesConf +Py:ConfigurableDb DEBUG : Found configurable <class 'StoreGate.StoreGateConf.StoreGateSvc'> in module StoreGate.StoreGateConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDbSvc... +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... +EventInfoMgtInit: Got release version Athena-22.0.1 Py:Configurable ERROR attempt to add a duplicate (ServiceManager.EventPersistencySvc) ... dupe ignored +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDb... [DONE] @@ -317,9 +702,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -331,21 +730,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job @@ -356,12 +776,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -384,16 +807,32 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component CSCcablingSvc/CSCcablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -402,12 +841,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -426,6 +868,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -450,14 +893,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonRPC_CnvTools.MuonRPC_CnvToolsConf.Muon__RpcRDO_Decoder'> in module MuonRPC_CnvTools.MuonRPC_CnvToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component RPCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonRPC_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.RPCCablingDbTool Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -466,12 +933,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -491,6 +961,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -512,14 +983,36 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component LVL1TGC::TGCRecRoiSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TGCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -528,12 +1021,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -553,8 +1049,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -593,6 +1091,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -632,9 +1136,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -646,14 +1164,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingAlg +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AtlasFieldSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MDTCablingDbTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MuonCalib::MdtCalibDbCoolStrTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -662,12 +1208,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -714,6 +1263,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -726,6 +1281,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -738,6 +1299,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -750,6 +1317,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -762,6 +1335,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -774,6 +1353,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -786,11 +1371,18 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -799,19 +1391,48 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonCSC_CnvTools.MuonCSC_CnvToolsConf.Muon__CscRDO_Decoder'> in module MuonCSC_CnvTools.MuonCSC_CnvToolsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'CscCalibTools.CscCalibToolsConf.CscCalibTool'> in module CscCalibTools.CscCalibToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CSCcablingSvc Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc Py:Athena INFO Print Config +Py:ComponentAccumulator INFO Event Inputs +Py:ComponentAccumulator INFO set([]) +Py:ComponentAccumulator INFO Event Algorithm Sequences +Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ************************************************************ |-Atomic = False |-AuditAlgorithms = False |-AuditBeginRun = False @@ -823,21 +1444,29 @@ Py:Athena INFO Print Config |-AuditRestart = False |-AuditStart = False |-AuditStop = False +|-Cardinality = 0 |-ContinueEventloopOnFPE = False +|-DetStore @0x7f8505b81f90 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 +|-EvtStore @0x7f8505b81f10 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f85041a0560 = [] (default: []) +|-ExtraOutputs @0x7f85041a05f0 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False +|-Members @0x7f85041a0128 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f85041a0440 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False -|-Sequential = False +|-Sequential @0x7f8507d45b00 = True (default: False) |-StopOverride = False |-TimeOut = 0.0 +|-Timeline = True |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** | |-AuditAlgorithms = False | |-AuditBeginRun = False @@ -849,17 +1478,26 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85047a4a50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85047a49d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a06c8 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0680 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0638 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f8504c62908 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f85047a4ad0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -868,6 +1506,11 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7f8504c62a00 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f8504713890 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f85047138d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f850478e758 = [] (default: []) +| | |-ExtraOutputs @0x7f850478e4d0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' @@ -881,6 +1524,10 @@ Py:Athena INFO Print Config | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f8504713990 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85047139d0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f850478e5f0 = [] (default: []) +| | | |-ExtraOutputs @0x7f850478e5a8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -899,15 +1546,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85046f5a10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85046f5990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0908 = [] (default: []) +| |-ExtraOutputs @0x7f85041a09e0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0950 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f850592f9b0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -916,7 +1571,12 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7f850592faa0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f850473aed0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f850473af10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f8504744710 = [] (default: []) +| | |-ExtraOutputs @0x7f8504744560 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -928,6 +1588,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f850473afd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f850467f050 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85047443b0 = [] (default: []) +| | | |-ExtraOutputs @0x7f8504744518 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -946,15 +1610,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85046f7c50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85046f7bd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0a28 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0ab8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0998 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f85049a3a50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -964,6 +1636,11 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CsmContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f850592fd70 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f85042acfd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504234050 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85042a09e0 = [] (default: []) +| | |-ExtraOutputs @0x7f85042a0878 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+MDTCSM' @@ -976,6 +1653,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f8504234110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f8504234150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85042a0908 = [] (default: []) +| | | |-ExtraOutputs @0x7f85042a08c0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -994,15 +1675,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f850478ab10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f850478aa90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0b00 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0b48 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0488 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f85049a3c50 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1012,7 +1701,12 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CscContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f85046cf050 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f850426de90 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f850426ded0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041f19e0 = [] (default: []) +| | |-ExtraOutputs @0x7f85041f1c68 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+CSCRDO' @@ -1024,6 +1718,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f850426df90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f850426dfd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041f1b48 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041f1b00 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1042,19 +1740,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f8505840e68 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f8504227950 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85042278d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0710 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0c20 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0c68 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f85042279d0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1064,11 +1772,16 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f8504195b10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504195b90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f8504202fc8 = [] (default: []) +| | |-ExtraOutputs @0x7f85042027a0 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f850461a590 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1086,6 +1799,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f8504195c10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f8504195c50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f8504202680 = [] (default: []) +| | | |-ExtraOutputs @0x7f85042028c0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1102,20 +1819,30 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f85041a6050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f8504180850 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85041807d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0a70 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0cb0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0cf8 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectorSvc @0x7f85041808d0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 +| |-Timeline = True | |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1125,6 +1852,10 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f8504195c90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504195e50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041a5b00 = [] (default: []) +| | |-ExtraOutputs @0x7f85041a5ab8 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1133,7 +1864,9 @@ Py:Athena INFO Print Config | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f85041a5560 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f85041a5b90 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1149,19 +1882,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f8507dee890 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f8504215810 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f8504215790 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0d88 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0e18 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0dd0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f8504215890 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1172,9 +1915,13 @@ Py:Athena INFO Print Config | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True +| | |-DetStore @0x7f8504195d50 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True +| | |-EvtStore @0x7f8504195fd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041a4ef0 = [] (default: []) +| | |-ExtraOutputs @0x7f85041a4e18 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1201,19 +1948,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f8504886380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f85041fbcd0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85041fbbd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0ef0 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0b90 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0e60 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f85041fbd50 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1223,7 +1980,13 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f8507df1860 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f85041a2de8 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True +| | |-DetStore @0x7f85041af090 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f85041af190 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041b9290 = [] (default: []) +| | |-ExtraOutputs @0x7f85041b9710 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1236,6 +1999,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f85041af1d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85041af210 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041b5fc8 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041b58c0 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -1262,6 +2029,11 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-CscCalibTool @0x7f85041af110 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f85041af0d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85041af150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041b92d8 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041b90e0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -1278,30 +2050,719 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85041da650 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f85041da5d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f8504121050 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0f80 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0fc8 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f850410bf50 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +Py:ComponentAccumulator INFO Condition Algorithms +Py:ComponentAccumulator INFO ['CondInputLoader', 'MuonMDT_CablingAlg'] +Py:ComponentAccumulator INFO Services +Py:ComponentAccumulator INFO ['EventSelector', 'ByteStreamInputSvc', 'EventPersistencySvc', 'ByteStreamCnvSvc', 'ROBDataProviderSvc', 'ByteStreamAddressProviderSvc', 'MetaDataStore', 'InputMetaDataStore', 'MetaDataSvc', 'ProxyProviderSvc', 'ByteStreamAttListMetadataSvc', 'GeoModelSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'RPCcablingServerSvc', 'IOVDbSvc', 'PoolSvc', 'CondSvc', 'DBReplicaSvc', 'MuonRPC_CablingSvc', 'LVL1TGC::TGCRecRoiSvc', 'TGCcablingServerSvc', 'AthenaPoolCnvSvc', 'MuonMDT_CablingSvc', 'AtlasFieldSvc', 'MdtCalibrationDbSvc', 'MdtCalibrationSvc', 'CSCcablingSvc', 'MuonCalib::CscCoolStrSvc'] +Py:ComponentAccumulator INFO Outputs +Py:ComponentAccumulator INFO {} +Py:ComponentAccumulator INFO Public Tools +Py:ComponentAccumulator INFO [ +Py:ComponentAccumulator INFO IOVDbMetaDataTool/IOVDbMetaDataTool, +Py:ComponentAccumulator INFO ByteStreamMetadataTool/ByteStreamMetadataTool, +Py:ComponentAccumulator INFO Muon::MuonIdHelperTool/Muon::MuonIdHelperTool, +Py:ComponentAccumulator INFO RPCCablingDbTool/RPCCablingDbTool, +Py:ComponentAccumulator INFO Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool, +Py:ComponentAccumulator INFO MDTCablingDbTool/MDTCablingDbTool, +Py:ComponentAccumulator INFO MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool, +Py:ComponentAccumulator INFO Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool, +Py:ComponentAccumulator INFO Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool, +Py:ComponentAccumulator INFO Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool, +Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool, +Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, +Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config +/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ +|-Atomic = False +|-AuditAlgorithms = False +|-AuditBeginRun = False +|-AuditEndRun = False +|-AuditExecute = False +|-AuditFinalize = False +|-AuditInitialize = False +|-AuditReinitialize = False +|-AuditRestart = False +|-AuditStart = False +|-AuditStop = False +|-Cardinality = 0 +|-ContinueEventloopOnFPE = False +|-DetStore @0x7f8505b81f90 = ServiceHandle('StoreGateSvc/DetectorStore') +|-Enable = True +|-ErrorCounter = 0 +|-ErrorMax = 1 +|-EvtStore @0x7f8505b81f10 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f85041a0560 = [] (default: []) +|-ExtraOutputs @0x7f85041a05f0 = [] (default: []) +|-FilterCircularDependencies = True +|-IgnoreFilterPassed = False +|-IsIOBound = False +|-Members @0x7f8504749320 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +| (default: []) +|-ModeOR = False +|-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f85041a0440 = [] (default: []) +|-OutputLevel = 0 +|-RegisterForContextService = False +|-Sequential @0x7f8507d45b00 = True (default: False) +|-StopOverride = False +|-TimeOut = 0.0 +|-Timeline = True +|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85047a4a50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85047a49d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a06c8 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0680 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0638 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f8504c62908 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f85047a4ad0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f8504c62a00 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f8504713890 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f85047138d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f850478e758 = [] (default: []) +| | |-ExtraOutputs @0x7f850478e4d0 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f8504713990 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85047139d0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f850478e5f0 = [] (default: []) +| | | |-ExtraOutputs @0x7f850478e5a8 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-Sector13Data = False +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85046f5a10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85046f5990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0908 = [] (default: []) +| |-ExtraOutputs @0x7f85041a09e0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0950 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f850592f9b0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f850592faa0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f850473aed0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f850473af10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f8504744710 = [] (default: []) +| | |-ExtraOutputs @0x7f8504744560 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+TGCRDO' +| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f850473afd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f850467f050 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85047443b0 = [] (default: []) +| | | |-ExtraOutputs @0x7f8504744518 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ShowStatusWords = False +| | | |-SkipCoincidence = False +| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85046f7c50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85046f7bd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0a28 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0ab8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0998 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f85049a3a50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CsmContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f850592fd70 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f85042acfd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504234050 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85042a09e0 = [] (default: []) +| | |-ExtraOutputs @0x7f85042a0878 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f8504234110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f8504234150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85042a0908 = [] (default: []) +| | | |-ExtraOutputs @0x7f85042a08c0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f850478ab10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f850478aa90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0b00 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0b48 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0488 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f85049a3c50 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CscContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f85046cf050 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f850426de90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f850426ded0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041f19e0 = [] (default: []) +| | |-ExtraOutputs @0x7f85041f1c68 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f850426df90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f850426dfd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041f1b48 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041f1b00 = [] (default: []) +| | | |-IsCosmics = False +| | | |-IsOldCosmics = False +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ +|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f8505840e68 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f8504227950 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85042278d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0710 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0c20 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0c68 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f85042279d0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f8504195b10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504195b90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f8504202fc8 = [] (default: []) +| | |-ExtraOutputs @0x7f85042027a0 = [] (default: []) +| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+RPCPAD' +| | |-OutputLevel = 0 +| | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f850461a590 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | | (default: 'Muon::RpcRDO_Decoder') +| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' +| | |-etaphi_coincidenceTime = 20.0 +| | |-overlap_timeTolerance = 10.0 +| | |-processingData = False +| | |-produceRpcCoinDatafromTriggerWords = True +| | |-reduceCablingOverlap = True +| | |-solvePhiAmbiguities = True +| | |-timeShift = -12.5 +| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f8504195c10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f8504195c50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f8504202680 = [] (default: []) +| | | |-ExtraOutputs @0x7f85042028c0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- +| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- +|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f85041a6050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f8504180850 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85041807d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0a70 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0cb0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0cf8 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectorSvc @0x7f85041808d0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Setting = 0 +| |-Timeline = True +| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f8504195c90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f8504195e50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041a5b00 = [] (default: []) +| | |-ExtraOutputs @0x7f85041a5ab8 = [] (default: []) +| | |-FillCoinData = True +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' +| | |-OutputCollection = 'TGC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+TGCRDO' +| | |-TGCHashIdOffset = 26000 +| | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f85041a5560 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f85041a5b90 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-show_warning_level_invalid_A09_SSW6_hit = False +| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- +| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- +|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f8507dee890 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f8504215810 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f8504215790 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0d88 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0e18 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0dd0 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f8504215890 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CalibratePrepData = True +| | |-DecodeData = True +| | |-DetStore @0x7f8504195d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DiscardSecondaryHitTwin = False +| | |-DoPropagationCorrection = False +| | |-DoTofCorrection = True +| | |-EvtStore @0x7f8504195fd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041a4ef0 = [] (default: []) +| | |-ExtraOutputs @0x7f85041a4e18 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |-SortPrepData = False +| | |-TimeWindowLowerBound = -1000000.0 +| | |-TimeWindowSetting = 2 +| | |-TimeWindowUpperBound = -1000000.0 +| | |-TwinCorrectSlewing = False +| | |-Use1DPrepDataTwin = False +| | |-UseAllBOLTwin = False +| | |-UseTwin = True +| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- +| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- +|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f8504886380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f85041fbcd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85041fbbd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f85041a0ef0 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0b90 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0e60 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f8507d45b20 = False (default: False) +| |-RegionSelectionSvc @0x7f85041fbd50 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f8507df1860 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f85041a2de8 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-DecodeData = True +| | |-DetStore @0x7f85041af090 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f85041af190 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f85041b9290 = [] (default: []) +| | |-ExtraOutputs @0x7f85041b9710 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f85041af1d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85041af210 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041b5fc8 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041b58c0 = [] (default: []) +| | | |-IsOnline = True +| | | |-Latency = 100.0 +| | | |-MonitorService = 'MonitorSvc' +| | | |-NSamples = 4 +| | | |-Noise = 3.5 +| | | |-OutputLevel = 0 +| | | |-Pedestal = 2048.0 +| | | |-ReadFromDatabase = True +| | | |-Slope = 0.19 +| | | |-SlopeFromDatabase = False +| | | |-TimeOffsetRange = 1.0 +| | | |-Use2Samples = False +| | | |-integrationNumber = 12.0 +| | | |-integrationNumber2 = 11.66 +| | | |-samplingTime = 50.0 +| | | |-signalWidth = 14.4092 +| | | |-timeOffset = 46.825 +| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- +| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-CscCalibTool @0x7f85041af110 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f85041af0d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f85041af150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f85041b92d8 = [] (default: []) +| | | |-ExtraOutputs @0x7f85041b90e0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- +| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- +|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f85041da650 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f85041da5d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f8504121050 = [] (default: []) +| |-ExtraOutputs @0x7f85041a0f80 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f85041a0fc8 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f850410bf50 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') +| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- +\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- JOs reading stage finished, launching Athena from pickle file +Wed Mar 13 10:50:38 CET 2019 +Preloading tcmalloc_minimal.so +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-centos7-gcc8-opt] [2.0.25/141317d] -- built on [2019-03-11T2107] +Py:Athena INFO including file "AthenaCommon/Preparation.py" +Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads +Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode.pkl ... +Py:ConfigurableDb INFO Read module info for 5461 configurables from 12 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +ApplicationMgr SUCCESS +==================================================================================================================================== + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on pcaz004 on Wed Mar 13 10:50:42 2019 +==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +Py:Athena INFO including file "AthenaCommon/runbatch.py" +StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry +ClassIDSvc INFO getRegistryEntries: read 3440 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) +ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 +ROBDataProviderSvc INFO Initializing ROBDataProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 ROBDataProviderSvc INFO ---> Filter out empty ROB fragments = 'filterEmptyROB':False ROBDataProviderSvc INFO ---> Filter out specific ROBs by Status Code: # ROBs = 0 ROBDataProviderSvc INFO ---> Filter out Sub Detector ROBs by Status Code: # Sub Detectors = 0 @@ -1316,6 +2777,10 @@ ByteStreamAddre... INFO -- Will fill Store with id = 0 PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok] PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 +DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128) will be considered for COOL data +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/Athena/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 10 servers found for host pcaz004.dyndns.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] +DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO Resolved path (via ATLAS_POOLCOND_PATH) is /cvmfs/atlas-condb.cern.ch/repo/conditions/poolcond/PoolFileCatalog.xml @@ -1324,13 +2789,26 @@ PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_ PoolSvc WARNING Unable to locate catalog for prfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml +DbSession INFO Open DbSession +Domain[ROOT_All] INFO > Access DbDomain READ [ROOT_All] IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once +IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbSvc INFO Global tag: CONDBR2-BLKPA-2018-13 set from joboptions IOVDbFolder INFO Inputfile tag override disabled for /GLOBAL/BField/Maps +IOVDbSvc INFO Folder /GLOBAL/BField/Maps will be written to file metadata IOVDbSvc INFO Initialised with 8 connections and 19 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully +MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 +AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 +ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 +MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 +ClassIDSvc INFO getRegistryEntries: read 3314 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4046 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3110 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -1411,6 +2889,10 @@ GeoModelSvc::RD...WARNING Getting PixTBMatComponents with default tag GeoModelSvc::RD...WARNING Getting PixTBMaterials with default tag GeoModelSvc::RD...WARNING Getting InDetMatComponents with default tag GeoModelSvc::RD...WARNING Getting InDetMaterials with default tag +GeoModelSvc.Muo... INFO create MuonDetectorTool - package version = MuonGeoModel-00-00-00 +GeoModelSvc.Muo... INFO (from GeoModelSvc) AtlasVersion = <ATLAS-R2-2016-01-00-01> MuonVersion = <> +GeoModelSvc.Muo... INFO Keys for Muon Switches are (key) ATLAS-R2-2016-01-00-01 (node) ATLAS +GeoModelSvc.Muo... INFO (from GeoModelSvc) in AtlasVersion = <ATLAS-R2-2016-01-00-01> default MuonVersion is <MuonSpectrometer-R.08.01> GeoModelSvc.Muo... INFO Properties have been set as follows: GeoModelSvc.Muo... INFO LayoutName R GeoModelSvc.Muo... INFO IncludeCutouts 0 @@ -1525,6 +3007,7 @@ AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! MuGM:MuonFactory INFO MMIDHELPER retrieved from DetStore MuGM:MuonFactory INFO **************** MuonDetectorFactory001 ************************ MuGM:MuonFactory INFO *** Start building the Muon Geometry Tree ********************** +MuGM:RDBReadAtlas INFO Start retriving dbObjects with tag = <ATLAS-R2-2016-01-00-01> node <ATLAS> RDBAccessSvc WARNING Could not get the tag for XtomoData node. Returning 0 pointer to IRDBQuery MuGM:RDBReadAtlas INFO After getQuery XtomoData In DblQ00Xtomo(data) @@ -1554,6 +3037,7 @@ MuGM:ProcCutouts INFO Processing Cutouts DONE MuGM:RDBReadAtlas INFO ProcessTGCreadout - version 7 wirespacing 1.8 MuGM:RDBReadAtlas INFO Intermediate Objects built from primary numbers MuGM:MuonFactory INFO theMaterialManager retrieven successfully from the DetStore +MuGM:MuonFactory INFO MuonSystem description from OracleTag=<ATLAS-R2-2016-01-00-01> and node=<ATLAS> MuGM:MuonFactory INFO TreeTop added to the Manager MuGM:MuonFactory INFO Muon Layout R.08.01 MuGM:MuonFactory INFO Fine Clash Fixing disabled: (should be ON/OFF for Simulation/Reconstruction) @@ -1577,9 +3061,13 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 42840Kb Time = 0.42S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL +ClassIDSvc INFO getRegistryEntries: read 1455 CLIDRegistry entries for module ALL +AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 +ClassIDSvc INFO getRegistryEntries: read 1794 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... CondInputLoader INFO Adding base classes: + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) -> @@ -1589,12 +3077,17 @@ CondInputLoader INFO Will create WriteCondHandle dependencies for the follo + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) +ClassIDSvc INFO getRegistryEntries: read 1370 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 743 CLIDRegistry entries for module ALL RpcRawDataProvider INFO RpcRawDataProvider::initialize RpcRawDataProvider INFO 'DoSeededDecoding':False +ClassIDSvc INFO getRegistryEntries: read 1699 CLIDRegistry entries for module ALL +MuonRPC_CablingSvc INFO Initializing MuonRPC_CablingSvc - package version MuonRPC_Cabling-00-00-00 ToolSvc.RPCCabl... INFO Initializing - folders names are: conf /RPC/CABLING/MAP_SCHEMA / corr /RPC/CABLING/MAP_SCHEMA_CORR MuonRPC_CablingSvc INFO RPCCablingDbTool retrieved with statusCode = SUCCESS with handle TheRpcCablingDbTool = PublicToolHandle('RPCCablingDbTool/RPCCablingDbTool') MuonRPC_CablingSvc INFO Register call-back against 2 folders listed below MuonRPC_CablingSvc INFO Folder n. 1 </RPC/CABLING/MAP_SCHEMA> found in the DetStore +ClassIDSvc INFO getRegistryEntries: read 501 CLIDRegistry entries for module ALL MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA> MuonRPC_CablingSvc INFO Folder n. 2 </RPC/CABLING/MAP_SCHEMA_CORR> found in the DetStore MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA_CORR> @@ -1609,25 +3102,32 @@ RpcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') RpcRawDataProvi... INFO Tool = RpcRawDataProvider.RPC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc RpcRawDataProvi... INFO initialize() successful in RpcRawDataProvider.RPC_RawDataProviderTool TgcRawDataProvider INFO TgcRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 878 CLIDRegistry entries for module ALL TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder TgcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') TgcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize +ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x120ae200]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL MdtRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') MdtRawDataProvi... INFO Processing configuration for layouts with BME chambers. MdtRawDataProvi... INFO Processing configuration for layouts with BMG chambers. MdtRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') MdtRawDataProvi... INFO Tool = MdtRawDataProvider.MDT_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MdtRawDataProvi... INFO initialize() successful in MdtRawDataProvider.MDT_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 658 CLIDRegistry entries for module ALL CscRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') CscRawDataProvi... INFO Tool = CscRawDataProvider.CSC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc CscRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') CscRawDataProvi... INFO The Muon Geometry version is R.08.01 CscRawDataProvi... INFO initialize() successful in CscRawDataProvider.CSC_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 53 CLIDRegistry entries for module ALL +RpcRdoToRpcPrep... INFO package version = MuonRPC_CnvTools-00-00-00 RpcRdoToRpcPrep... INFO properties are RpcRdoToRpcPrep... INFO processingData 0 RpcRdoToRpcPrep... INFO produceRpcCoinDatafromTriggerWords 1 @@ -1642,21 +3142,35 @@ RpcRdoToRpcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::RpcR TgcRdoToTgcPrep... INFO initialize() successful in TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool TgcRdoToTgcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') MdtCalibrationSvc INFO Processing configuration for layouts with BMG chambers. +ClassIDSvc INFO getRegistryEntries: read 194 CLIDRegistry entries for module ALL AtlasFieldSvc INFO initialize() ... AtlasFieldSvc INFO maps will be chosen reading COOL folder /GLOBAL/BField/Maps +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL AtlasFieldSvc INFO magnet currents will be read from COOL folder /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO Booked callback for /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO initialize() successful MdtRdoToMdtPrep... INFO Processing configuration for layouts with BME chambers. MdtRdoToMdtPrep... INFO Processing configuration for layouts with BMG chambers. MdtRdoToMdtPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for module ALL CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc +ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1b246d00]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. +EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... +ClassIDSvc INFO getRegistryEntries: read 1126 CLIDRegistry entries for module ALL ToolSvc.Luminos... INFO LuminosityTool::initialize() registering ToolSvc.Luminos... INFO LumiFolderName is empty, skipping ToolSvc.Luminos... INFO OnlineLumiCalibrationTool.empty() is TRUE, skipping... @@ -1665,6 +3179,7 @@ ToolSvc.Luminos... INFO BunchLumisTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO BunchGroupTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO LBLBFolderName is empty, skipping... EventSelector INFO Retrieved InputCollections from InputSvc +ByteStreamInputSvc INFO Initializing ByteStreamInputSvc - package version ByteStreamCnvSvc-00-00-00 EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully @@ -1746,6 +3261,7 @@ phi high-pt mu11 mu15 mu15 RPCcabling INFO CablingRPC---InitMaps from COOL: going to read configuration +RPCcabling INFO CablingRPC--->> RPC cabling map from COOL << RPCcabling INFO CablingRPC--- ReadConf: map has size 222202 RPCcabling INFO CablingRPC--- ReadConf: map n. of lines read is 924 RPCcabling INFO CablingRPC--- ReadConf: version is 5.0 Atlas R_07_03_RUN2ver104 @@ -1783,13 +3299,19 @@ AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] Toroids_SCurrent , 4 , 20397.7 AtlasFieldSvc INFO Currents read from DCS: solenoid 7729.99 toroid 20399.9 AtlasFieldSvc INFO Initializing the field map (solenoidCurrent=7729.99 toroidCurrent=20399.9) +AtlasFieldSvc INFO reading the map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +AtlasFieldSvc INFO Initialized the field map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +ClassIDSvc INFO getRegistryEntries: read 672 CLIDRegistry entries for module ALL AthenaEventLoopMgr INFO ===>>> start processing event #186525031, run #327265 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMapSchema_BMG_01 for folder /MDT/CABLING/MAP_SCHEMA IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMezzanineSchema_M5-RUN2 for folder /MDT/CABLING/MEZZANINE_SCHEMA IOVDbSvc INFO Disconnecting from COOLONL_MDT/CONDBR2 MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) readCdoMez->size()= 24 +MuonMDT_CablingAlg INFO Range of input is {[0,l:0] - [INVALID]} MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) readCdoMap->size()= 2312 +MuonMDT_CablingAlg INFO Range of input is {[327264,l:4294640031] - [327265,l:4294640030]} +MuonMDT_CablingAlg INFO recorded new MuonMDT_CablingMap with range {[327264,l:4294640031] - [327265,l:4294640030]} into Conditions Store AthenaEventLoopMgr INFO ===>>> done processing event #186525031, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186524665, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> done processing event #186524665, run #327265 2 events processed so far <<<=== @@ -1831,10 +3353,40 @@ AthenaEventLoopMgr INFO ===>>> start processing event #186580451, run #3272 AthenaEventLoopMgr INFO ===>>> done processing event #186580451, run #327265 20 events processed so far <<<=== Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully +IncidentProcAlg1 INFO Finalize CondInputLoader INFO Finalizing CondInputLoader... +IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/20 (( 0.27 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/202 (( 0.76 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216520 (( 1.37 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/288 (( 0.41 ))s +IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/222235 (( 0.94 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/29402 (( 0.55 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562651 (( 0.63 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8096306 (( 1.77 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/3704 (( 0.97 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322656 (( 0.94 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/350062 (( 0.92 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411187 (( 0.26 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/353376 (( 0.22 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411395 (( 0.12 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/230496 (( 0.22 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/314380 (( 0.77 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3136 (( 0.58 ))s +IOVDbSvc INFO bytes in (( 11.71 ))s +IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.78 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.90 ))s +IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 4.03 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.76 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.97 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.27 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -1858,6 +3410,8 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** +cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 +ChronoStatSvc INFO Time User : Tot= 4.92 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref index 5c116b9ab32b..0c3da702cdbd 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref @@ -1,10 +1,48 @@ Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : [function] +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:Athena INFO About to setup Rpc Raw data decoding Py:ComponentAccumulator DEBUG Adding component EventSelectorByteStream/EventSelector to the job @@ -34,13 +72,120 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/ByteStreamAttListMetadataSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-centos7-gcc8-opt] [2.0.25/141317d] -- built on [2019-03-11T2107] dynamically loading the flag Detector Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : [function] +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : [function] +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : [function] +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : [function] +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : [function] +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -324,10 +469,172 @@ Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersiste Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job dynamically loading the flag Muon Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : False +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : False +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : False +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : False +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : False +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : 'CONDBR2' +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : 'data17_13TeV' +Input.RunNumber : [function] +Input.isMC : False +Muon.Align.UseALines : False +Muon.Align.UseAsBuilt : False +Muon.Align.UseBLines : 'none' +Muon.Align.UseILines : False +Muon.Calib.CscF001FromLocalFile : False +Muon.Calib.CscNoiseFromLocalFile : False +Muon.Calib.CscPSlopeFromLocalFile : False +Muon.Calib.CscPedFromLocalFile : False +Muon.Calib.CscRmsFromLocalFile : False +Muon.Calib.CscStatusFromLocalFile : False +Muon.Calib.CscT0BaseFromLocalFile : False +Muon.Calib.CscT0PhaseFromLocalFile : False +Muon.Calib.EventTag : 'MoMu' +Muon.Calib.applyRtScaling : True +Muon.Calib.correctMdtRtForBField : False +Muon.Calib.correctMdtRtForTimeSlewing : False +Muon.Calib.correctMdtRtWireSag : False +Muon.Calib.mdtCalibrationSource : 'MDT' +Muon.Calib.mdtMode : 'ntuple' +Muon.Calib.mdtPropagationSpeedBeta : 0.85 +Muon.Calib.readMDTCalibFromBlob : True +Muon.Calib.useMLRt : True +Muon.Chi2NDofCut : 20.0 +Muon.createTrackParticles : True +Muon.doCSCs : True +Muon.doDigitization : True +Muon.doFastDigitization : False +Muon.doMDTs : True +Muon.doMSVertex : False +Muon.doMicromegas : False +Muon.doPseudoTracking : False +Muon.doRPCClusterSegmentFinding : False +Muon.doRPCs : True +Muon.doSegmentT0Fit : False +Muon.doTGCClusterSegmentFinding : False +Muon.doTGCs : True +Muon.dosTGCs : False +Muon.enableCurvedSegmentFinding : False +Muon.enableErrorTuning : False +Muon.optimiseMomentumResolutionUsingChi2 : False +Muon.patternsOnly : False +Muon.prdToxAOD : False +Muon.printSummary : False +Muon.refinementTool : 'Moore' +Muon.rpcRawToxAOD : False +Muon.segmentOrigin : 'Muon' +Muon.straightLineFitMomentum : 2000.0 +Muon.strategy : [] +Muon.trackBuilder : 'Moore' +Muon.updateSegmentSecondCoordinate : [function] +Muon.useAlignmentCorrections : False +Muon.useLooseErrorTuning : False +Muon.useSegmentMatching : [function] +Muon.useTGCPriorNextBC : False +Muon.useTrackSegmentMatching : True +Muon.useWireSagCorrections : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py +Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job @@ -348,12 +655,38 @@ Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... +Py:ConfigurableDb DEBUG loading confDb files... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libMagFieldServices.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libCaloRec.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libTrigUpgradeTest.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libCaloTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArCabling.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libegammaCaloTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArBadChannelTool.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libLArCellRec.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/WorkDir.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/wlampl/master/build/x86_64-centos7-gcc8-opt/lib/libTrigT2CaloCommon.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/GAUDI/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/Athena/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG loading confDb files... [DONE] +Py:ConfigurableDb DEBUG loaded 1103 confDb packages +Py:ConfigurableDb INFO Read module info for 5461 configurables from 12 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... +Py:ConfigurableDb DEBUG : Found configurable <class 'PoolSvc.PoolSvcConf.PoolSvc'> in module PoolSvc.PoolSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaServices.AthenaServicesConf.MetaDataSvc'> in module AthenaServices.AthenaServicesConf +Py:ConfigurableDb DEBUG : Found configurable <class 'StoreGate.StoreGateConf.StoreGateSvc'> in module StoreGate.StoreGateConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDbSvc... +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... +EventInfoMgtInit: Got release version Athena-22.0.1 Py:Configurable ERROR attempt to add a duplicate (ServiceManager.EventPersistencySvc) ... dupe ignored +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDb... [DONE] @@ -579,6 +912,7 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersi Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonRPC_CnvTools.MuonRPC_CnvToolsConf.Muon__RpcRDO_Decoder'> in module MuonRPC_CnvTools.MuonRPC_CnvToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc @@ -1076,6 +1410,8 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersi Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonCSC_CnvTools.MuonCSC_CnvToolsConf.Muon__CscRDO_Decoder'> in module MuonCSC_CnvTools.MuonCSC_CnvToolsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'CscCalibTools.CscCalibToolsConf.CscCalibTool'> in module CscCalibTools.CscCalibToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc @@ -1093,8 +1429,13 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Mu Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc Py:Athena INFO Print Config +Py:ComponentAccumulator INFO Event Inputs +Py:ComponentAccumulator INFO set([]) +Py:ComponentAccumulator INFO Event Algorithm Sequences +Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ************************************************************ |-Atomic = False |-AuditAlgorithms = False |-AuditBeginRun = False @@ -1106,21 +1447,29 @@ Py:Athena INFO Print Config |-AuditRestart = False |-AuditStart = False |-AuditStop = False +|-Cardinality = 0 |-ContinueEventloopOnFPE = False +|-DetStore @0x7f16dec04f50 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 +|-EvtStore @0x7f16dec04ed0 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f16dd1998c0 = [] (default: []) +|-ExtraOutputs @0x7f16dd199950 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False +|-Members @0x7f16dd199560 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'MuonCacheCreator/MuonCacheCreator', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f16dd1997a0 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False -|-Sequential = False +|-Sequential @0x7f16e0dc8b00 = True (default: False) |-StopOverride = False |-TimeOut = 0.0 +|-Timeline = True |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** | |-AuditAlgorithms = False | |-AuditBeginRun = False @@ -1132,17 +1481,26 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd827a10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd827990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199a70 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1997e8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199680 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f16ddce5908 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f16dd827a90 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1151,6 +1509,11 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7f16ddce5a00 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f16dd796850 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd796890 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd811758 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd8114d0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' @@ -1164,6 +1527,10 @@ Py:Athena INFO Print Config | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f16dd796950 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd796990 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd8115f0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd8115a8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -1182,15 +1549,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd7789d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd778950 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199cb0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199d88 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199cf8 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f16de9b29b0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1199,7 +1574,12 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7f16de9b2aa0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f16dd7bde90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd7bded0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd7c7710 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd7c7560 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -1211,6 +1591,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f16dd7bdf90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd7bdfd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd7c73b0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd7c7518 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -1229,15 +1613,26 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 0 +| |-CscCacheKey @0x7f16ddb72780 = 'CscCache' (default: 'StoreGateSvc+') +| |-DetStore @0x7f16dd78a7d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DisableViewWarning = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd78a750 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd2f2560 = [] (default: []) +| |-ExtraOutputs @0x7f16dd2f2518 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False +| |-MdtCsmCacheKey @0x7f16ddb72480 = 'MdtCsmCache' (default: 'StoreGateSvc+') | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd2f22d8 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-RpcCacheKey @0x7f16ddb724b0 = 'RpcCache' (default: 'StoreGateSvc+') +| |-TgcCacheKey @0x7f16ddb724e0 = 'TgcCache' (default: 'StoreGateSvc+') +| |-Timeline = True | \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- |=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** | |-AuditAlgorithms = False @@ -1250,15 +1645,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd77ac10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd77ab90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199998 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199dd0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199e18 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f16dda26a50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1267,7 +1670,14 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-CsmContainerCacheKey @0x7f16ddb72480 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f16de9b2d70 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f16dd32ffd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd2b9050 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd323a28 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd323a70 = [] (default: []) | | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x123c1d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+MDTCSM' | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' | | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** @@ -1278,6 +1688,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2b9110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd2b9150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd323908 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd3238c0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -1296,15 +1710,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd80ead0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd80ea50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199ef0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199e60 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199ab8 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f16dda26c50 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1313,8 +1735,15 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-CscContainerCacheKey @0x7f16ddb72780 = 'CscCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f16dd753050 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f16dd2f1e90 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f16dd2f1ed0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd2f2098 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd2f2200 = [] (default: []) | | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x123c1d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+CSCRDO' | | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** | | | |-AuditFinalize = False @@ -1324,6 +1753,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2f1f90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd2f1fd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd273cf8 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd273cb0 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1342,19 +1775,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16de8c3e68 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f16dd2ab8d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd2ab850 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a60e0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199d40 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199f38 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd2ab950 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1364,11 +1807,16 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f16dd21aa90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd21ab10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd2860e0 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd286e18 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f16dd69d590 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1386,6 +1834,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f16dd21ab90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd21abd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd27d098 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd27d050 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1402,20 +1854,30 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16dd22b050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f16dd2057d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd205750 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6098 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199ea8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a6128 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectorSvc @0x7f16dd205850 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 +| |-Timeline = True | |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1425,6 +1887,10 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f16dd21ac10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd21add0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd229170 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd229128 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1433,7 +1899,9 @@ Py:Athena INFO Print Config | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f16dd229050 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f16dd229200 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1449,19 +1917,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16e0e71890 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f16dd29a790 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd29a710 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6290 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a6050 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a6200 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd29a810 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1472,9 +1950,13 @@ Py:Athena INFO Print Config | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True +| | |-DetStore @0x7f16dd21ae10 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True +| | |-EvtStore @0x7f16dd21af90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd22a2d8 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd22a128 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1501,19 +1983,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f16dd909380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f16dd27fd10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd27fc10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6368 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a61b8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a62d8 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd27fd90 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1523,7 +2015,13 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f16e0e74860 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f16dd223de8 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True +| | |-DetStore @0x7f16dd21ad50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd237090 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd23b098 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd23b488 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1536,6 +2034,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2370d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd237290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd236cf8 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd236878 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -1562,6 +2064,11 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-CscCalibTool @0x7f16dd237250 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f16dd237110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd237050 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd2367a0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd236f38 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -1578,30 +2085,751 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd25e610 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f16dd25e590 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6320 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a6170 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a63b0 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f16dd1a0f10 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +Py:ComponentAccumulator INFO Condition Algorithms +Py:ComponentAccumulator INFO ['CondInputLoader', 'MuonMDT_CablingAlg'] +Py:ComponentAccumulator INFO Services +Py:ComponentAccumulator INFO ['EventSelector', 'ByteStreamInputSvc', 'EventPersistencySvc', 'ByteStreamCnvSvc', 'ROBDataProviderSvc', 'ByteStreamAddressProviderSvc', 'MetaDataStore', 'InputMetaDataStore', 'MetaDataSvc', 'ProxyProviderSvc', 'ByteStreamAttListMetadataSvc', 'GeoModelSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'RPCcablingServerSvc', 'IOVDbSvc', 'PoolSvc', 'CondSvc', 'DBReplicaSvc', 'MuonRPC_CablingSvc', 'LVL1TGC::TGCRecRoiSvc', 'TGCcablingServerSvc', 'AthenaPoolCnvSvc', 'MuonMDT_CablingSvc', 'AtlasFieldSvc', 'MdtCalibrationDbSvc', 'MdtCalibrationSvc', 'CSCcablingSvc', 'MuonCalib::CscCoolStrSvc'] +Py:ComponentAccumulator INFO Outputs +Py:ComponentAccumulator INFO {} +Py:ComponentAccumulator INFO Public Tools +Py:ComponentAccumulator INFO [ +Py:ComponentAccumulator INFO IOVDbMetaDataTool/IOVDbMetaDataTool, +Py:ComponentAccumulator INFO ByteStreamMetadataTool/ByteStreamMetadataTool, +Py:ComponentAccumulator INFO Muon::MuonIdHelperTool/Muon::MuonIdHelperTool, +Py:ComponentAccumulator INFO RPCCablingDbTool/RPCCablingDbTool, +Py:ComponentAccumulator INFO Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool, +Py:ComponentAccumulator INFO MDTCablingDbTool/MDTCablingDbTool, +Py:ComponentAccumulator INFO MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool, +Py:ComponentAccumulator INFO Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool, +Py:ComponentAccumulator INFO Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool, +Py:ComponentAccumulator INFO Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool, +Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool, +Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, +Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config +/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ +|-Atomic = False +|-AuditAlgorithms = False +|-AuditBeginRun = False +|-AuditEndRun = False +|-AuditExecute = False +|-AuditFinalize = False +|-AuditInitialize = False +|-AuditReinitialize = False +|-AuditRestart = False +|-AuditStart = False +|-AuditStop = False +|-Cardinality = 0 +|-ContinueEventloopOnFPE = False +|-DetStore @0x7f16dec04f50 = ServiceHandle('StoreGateSvc/DetectorStore') +|-Enable = True +|-ErrorCounter = 0 +|-ErrorMax = 1 +|-EvtStore @0x7f16dec04ed0 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f16dd1998c0 = [] (default: []) +|-ExtraOutputs @0x7f16dd199950 = [] (default: []) +|-FilterCircularDependencies = True +|-IgnoreFilterPassed = False +|-IsIOBound = False +|-Members @0x7f16dd1994d0 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'MuonCacheCreator/MuonCacheCreator', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +| (default: []) +|-ModeOR = False +|-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f16dd1997a0 = [] (default: []) +|-OutputLevel = 0 +|-RegisterForContextService = False +|-Sequential @0x7f16e0dc8b00 = True (default: False) +|-StopOverride = False +|-TimeOut = 0.0 +|-Timeline = True +|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd827a10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd827990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199a70 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1997e8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199680 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f16ddce5908 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f16dd827a90 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f16ddce5a00 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f16dd796850 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd796890 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd811758 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd8114d0 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f16dd796950 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd796990 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd8115f0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd8115a8 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-Sector13Data = False +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd7789d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd778950 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199cb0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199d88 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199cf8 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f16de9b29b0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f16de9b2aa0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f16dd7bde90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd7bded0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd7c7710 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd7c7560 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+TGCRDO' +| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f16dd7bdf90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd7bdfd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd7c73b0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd7c7518 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ShowStatusWords = False +| | | |-SkipCoincidence = False +| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ +|=/***** Algorithm MuonCacheCreator/MuonCacheCreator ************************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 0 +| |-CscCacheKey @0x7f16ddb72780 = 'CscCache' (default: 'StoreGateSvc+') +| |-DetStore @0x7f16dd78a7d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DisableViewWarning = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd78a750 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd2f2560 = [] (default: []) +| |-ExtraOutputs @0x7f16dd2f2518 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MdtCsmCacheKey @0x7f16ddb72480 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd2f22d8 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-RpcCacheKey @0x7f16ddb724b0 = 'RpcCache' (default: 'StoreGateSvc+') +| |-TgcCacheKey @0x7f16ddb724e0 = 'TgcCache' (default: 'StoreGateSvc+') +| |-Timeline = True +| \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- +|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd77ac10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd77ab90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199998 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199dd0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199e18 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f16dda26a50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CsmContainerCacheKey @0x7f16ddb72480 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f16de9b2d70 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f16dd32ffd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd2b9050 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd323a28 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd323a70 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x123c1d8 = 1 (default: 0) +| | |-RdoLocation = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2b9110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd2b9150 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd323908 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd3238c0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd80ead0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd80ea50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd199ef0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199e60 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199ab8 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f16dda26c50 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CscContainerCacheKey @0x7f16ddb72780 = 'CscCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f16dd753050 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f16dd2f1e90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f16dd2f1ed0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd2f2098 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd2f2200 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x123c1d8 = 1 (default: 0) +| | |-RdoLocation = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2f1f90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd2f1fd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd273cf8 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd273cb0 = [] (default: []) +| | | |-IsCosmics = False +| | | |-IsOldCosmics = False +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ +|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16de8c3e68 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f16dd2ab8d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd2ab850 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a60e0 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199d40 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd199f38 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd2ab950 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f16dd21aa90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd21ab10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd2860e0 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd286e18 = [] (default: []) +| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+RPCPAD' +| | |-OutputLevel = 0 +| | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f16dd69d590 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | | (default: 'Muon::RpcRDO_Decoder') +| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' +| | |-etaphi_coincidenceTime = 20.0 +| | |-overlap_timeTolerance = 10.0 +| | |-processingData = False +| | |-produceRpcCoinDatafromTriggerWords = True +| | |-reduceCablingOverlap = True +| | |-solvePhiAmbiguities = True +| | |-timeShift = -12.5 +| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f16dd21ab90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd21abd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd27d098 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd27d050 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- +| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- +|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16dd22b050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f16dd2057d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd205750 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6098 = [] (default: []) +| |-ExtraOutputs @0x7f16dd199ea8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a6128 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectorSvc @0x7f16dd205850 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Setting = 0 +| |-Timeline = True +| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f16dd21ac10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd21add0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd229170 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd229128 = [] (default: []) +| | |-FillCoinData = True +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' +| | |-OutputCollection = 'TGC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+TGCRDO' +| | |-TGCHashIdOffset = 26000 +| | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f16dd229050 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f16dd229200 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-show_warning_level_invalid_A09_SSW6_hit = False +| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- +| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- +|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f16e0e71890 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f16dd29a790 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd29a710 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6290 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a6050 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a6200 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd29a810 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CalibratePrepData = True +| | |-DecodeData = True +| | |-DetStore @0x7f16dd21ae10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DiscardSecondaryHitTwin = False +| | |-DoPropagationCorrection = False +| | |-DoTofCorrection = True +| | |-EvtStore @0x7f16dd21af90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd22a2d8 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd22a128 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |-SortPrepData = False +| | |-TimeWindowLowerBound = -1000000.0 +| | |-TimeWindowSetting = 2 +| | |-TimeWindowUpperBound = -1000000.0 +| | |-TwinCorrectSlewing = False +| | |-Use1DPrepDataTwin = False +| | |-UseAllBOLTwin = False +| | |-UseTwin = True +| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- +| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- +|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f16dd909380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f16dd27fd10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd27fc10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6368 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a61b8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a62d8 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f16e0dc8b20 = False (default: False) +| |-RegionSelectionSvc @0x7f16dd27fd90 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f16e0e74860 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f16dd223de8 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-DecodeData = True +| | |-DetStore @0x7f16dd21ad50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f16dd237090 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f16dd23b098 = [] (default: []) +| | |-ExtraOutputs @0x7f16dd23b488 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f16dd2370d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd237290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd236cf8 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd236878 = [] (default: []) +| | | |-IsOnline = True +| | | |-Latency = 100.0 +| | | |-MonitorService = 'MonitorSvc' +| | | |-NSamples = 4 +| | | |-Noise = 3.5 +| | | |-OutputLevel = 0 +| | | |-Pedestal = 2048.0 +| | | |-ReadFromDatabase = True +| | | |-Slope = 0.19 +| | | |-SlopeFromDatabase = False +| | | |-TimeOffsetRange = 1.0 +| | | |-Use2Samples = False +| | | |-integrationNumber = 12.0 +| | | |-integrationNumber2 = 11.66 +| | | |-samplingTime = 50.0 +| | | |-signalWidth = 14.4092 +| | | |-timeOffset = 46.825 +| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- +| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-CscCalibTool @0x7f16dd237250 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f16dd237110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f16dd237050 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f16dd2367a0 = [] (default: []) +| | | |-ExtraOutputs @0x7f16dd236f38 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- +| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- +|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f16dd25e610 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f16dd25e590 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f16dd1a6320 = [] (default: []) +| |-ExtraOutputs @0x7f16dd1a6170 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f16dd1a63b0 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f16dd1a0f10 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') +| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- +\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- JOs reading stage finished, launching Athena from pickle file +Wed Mar 13 10:51:05 CET 2019 +Preloading tcmalloc_minimal.so +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-centos7-gcc8-opt] [2.0.25/141317d] -- built on [2019-03-11T2107] +Py:Athena INFO including file "AthenaCommon/Preparation.py" +Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads +Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode_Cache.pkl ... +Py:ConfigurableDb INFO Read module info for 5461 configurables from 12 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +ApplicationMgr SUCCESS +==================================================================================================================================== + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on pcaz004 on Wed Mar 13 10:51:09 2019 +==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +Py:Athena INFO including file "AthenaCommon/runbatch.py" +StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry +ClassIDSvc INFO getRegistryEntries: read 3440 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) +ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 +ROBDataProviderSvc INFO Initializing ROBDataProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 ROBDataProviderSvc INFO ---> Filter out empty ROB fragments = 'filterEmptyROB':False ROBDataProviderSvc INFO ---> Filter out specific ROBs by Status Code: # ROBs = 0 ROBDataProviderSvc INFO ---> Filter out Sub Detector ROBs by Status Code: # Sub Detectors = 0 @@ -1616,6 +2844,10 @@ ByteStreamAddre... INFO -- Will fill Store with id = 0 PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok] PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 +DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128) will be considered for COOL data +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-11T2143/Athena/22.0.1/InstallArea/x86_64-centos7-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 10 servers found for host pcaz004.dyndns.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] +DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO Resolved path (via ATLAS_POOLCOND_PATH) is /cvmfs/atlas-condb.cern.ch/repo/conditions/poolcond/PoolFileCatalog.xml @@ -1624,13 +2856,26 @@ PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_ PoolSvc WARNING Unable to locate catalog for prfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml +DbSession INFO Open DbSession +Domain[ROOT_All] INFO > Access DbDomain READ [ROOT_All] IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once +IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbSvc INFO Global tag: CONDBR2-BLKPA-2018-13 set from joboptions IOVDbFolder INFO Inputfile tag override disabled for /GLOBAL/BField/Maps +IOVDbSvc INFO Folder /GLOBAL/BField/Maps will be written to file metadata IOVDbSvc INFO Initialised with 8 connections and 19 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully +MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 +AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 +ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 +MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 +ClassIDSvc INFO getRegistryEntries: read 3314 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4046 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3110 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -1711,6 +2956,10 @@ GeoModelSvc::RD...WARNING Getting PixTBMatComponents with default tag GeoModelSvc::RD...WARNING Getting PixTBMaterials with default tag GeoModelSvc::RD...WARNING Getting InDetMatComponents with default tag GeoModelSvc::RD...WARNING Getting InDetMaterials with default tag +GeoModelSvc.Muo... INFO create MuonDetectorTool - package version = MuonGeoModel-00-00-00 +GeoModelSvc.Muo... INFO (from GeoModelSvc) AtlasVersion = <ATLAS-R2-2016-01-00-01> MuonVersion = <> +GeoModelSvc.Muo... INFO Keys for Muon Switches are (key) ATLAS-R2-2016-01-00-01 (node) ATLAS +GeoModelSvc.Muo... INFO (from GeoModelSvc) in AtlasVersion = <ATLAS-R2-2016-01-00-01> default MuonVersion is <MuonSpectrometer-R.08.01> GeoModelSvc.Muo... INFO Properties have been set as follows: GeoModelSvc.Muo... INFO LayoutName R GeoModelSvc.Muo... INFO IncludeCutouts 0 @@ -1825,6 +3074,7 @@ AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! MuGM:MuonFactory INFO MMIDHELPER retrieved from DetStore MuGM:MuonFactory INFO **************** MuonDetectorFactory001 ************************ MuGM:MuonFactory INFO *** Start building the Muon Geometry Tree ********************** +MuGM:RDBReadAtlas INFO Start retriving dbObjects with tag = <ATLAS-R2-2016-01-00-01> node <ATLAS> RDBAccessSvc WARNING Could not get the tag for XtomoData node. Returning 0 pointer to IRDBQuery MuGM:RDBReadAtlas INFO After getQuery XtomoData In DblQ00Xtomo(data) @@ -1854,6 +3104,7 @@ MuGM:ProcCutouts INFO Processing Cutouts DONE MuGM:RDBReadAtlas INFO ProcessTGCreadout - version 7 wirespacing 1.8 MuGM:RDBReadAtlas INFO Intermediate Objects built from primary numbers MuGM:MuonFactory INFO theMaterialManager retrieven successfully from the DetStore +MuGM:MuonFactory INFO MuonSystem description from OracleTag=<ATLAS-R2-2016-01-00-01> and node=<ATLAS> MuGM:MuonFactory INFO TreeTop added to the Manager MuGM:MuonFactory INFO Muon Layout R.08.01 MuGM:MuonFactory INFO Fine Clash Fixing disabled: (should be ON/OFF for Simulation/Reconstruction) @@ -1877,9 +3128,13 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 42840Kb Time = 0.36S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL +ClassIDSvc INFO getRegistryEntries: read 1455 CLIDRegistry entries for module ALL +AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 +ClassIDSvc INFO getRegistryEntries: read 1794 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... CondInputLoader INFO Adding base classes: + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) -> @@ -1889,12 +3144,17 @@ CondInputLoader INFO Will create WriteCondHandle dependencies for the follo + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) +ClassIDSvc INFO getRegistryEntries: read 1370 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 743 CLIDRegistry entries for module ALL RpcRawDataProvider INFO RpcRawDataProvider::initialize RpcRawDataProvider INFO 'DoSeededDecoding':False +ClassIDSvc INFO getRegistryEntries: read 1699 CLIDRegistry entries for module ALL +MuonRPC_CablingSvc INFO Initializing MuonRPC_CablingSvc - package version MuonRPC_Cabling-00-00-00 ToolSvc.RPCCabl... INFO Initializing - folders names are: conf /RPC/CABLING/MAP_SCHEMA / corr /RPC/CABLING/MAP_SCHEMA_CORR MuonRPC_CablingSvc INFO RPCCablingDbTool retrieved with statusCode = SUCCESS with handle TheRpcCablingDbTool = PublicToolHandle('RPCCablingDbTool/RPCCablingDbTool') MuonRPC_CablingSvc INFO Register call-back against 2 folders listed below MuonRPC_CablingSvc INFO Folder n. 1 </RPC/CABLING/MAP_SCHEMA> found in the DetStore +ClassIDSvc INFO getRegistryEntries: read 501 CLIDRegistry entries for module ALL MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA> MuonRPC_CablingSvc INFO Folder n. 2 </RPC/CABLING/MAP_SCHEMA_CORR> found in the DetStore MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA_CORR> @@ -1909,19 +3169,25 @@ RpcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') RpcRawDataProvi... INFO Tool = RpcRawDataProvider.RPC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc RpcRawDataProvi... INFO initialize() successful in RpcRawDataProvider.RPC_RawDataProviderTool TgcRawDataProvider INFO TgcRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 878 CLIDRegistry entries for module ALL TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder TgcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') TgcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize +ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x108dcc00]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL +MdtRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 MdtRawDataProvi...VERBOSE Starting init MdtRawDataProvi...VERBOSE Getting m_robDataProvider MdtRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') MdtRawDataProvi...VERBOSE Getting MuonDetectorManager MdtRawDataProvi...VERBOSE Getting m_decoder +MdtRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 MdtRawDataProvi... INFO Processing configuration for layouts with BME chambers. MdtRawDataProvi... INFO Processing configuration for layouts with BMG chambers. MdtRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') @@ -1929,15 +3195,20 @@ MdtRawDataProvi... INFO Tool = MdtRawDataProvider.MDT_RawDataProviderTool is MdtRawDataProvi... DEBUG Could not find TrigConf::HLTJobOptionsSvc MdtRawDataProvi... INFO initialize() successful in MdtRawDataProvider.MDT_RawDataProviderTool MdtRawDataProvi... DEBUG Adding private ToolHandle tool MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder (MdtROD_Decoder) +ClassIDSvc INFO getRegistryEntries: read 658 CLIDRegistry entries for module ALL +CscRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 CscRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') CscRawDataProvi...VERBOSE ServiceLocatorHelper::service: found service JobOptionsSvc CscRawDataProvi... INFO Tool = CscRawDataProvider.CSC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc CscRawDataProvi... DEBUG Could not find TrigConf::HLTJobOptionsSvc +CscRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 CscRawDataProvi... DEBUG Found the CscIdHelper. CscRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') CscRawDataProvi... INFO The Muon Geometry version is R.08.01 CscRawDataProvi... INFO initialize() successful in CscRawDataProvider.CSC_RawDataProviderTool CscRawDataProvi... DEBUG Adding private ToolHandle tool CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder (Muon::CscROD_Decoder) +ClassIDSvc INFO getRegistryEntries: read 53 CLIDRegistry entries for module ALL +RpcRdoToRpcPrep... INFO package version = MuonRPC_CnvTools-00-00-00 RpcRdoToRpcPrep... INFO properties are RpcRdoToRpcPrep... INFO processingData 0 RpcRdoToRpcPrep... INFO produceRpcCoinDatafromTriggerWords 1 @@ -1952,21 +3223,35 @@ RpcRdoToRpcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::RpcR TgcRdoToTgcPrep... INFO initialize() successful in TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool TgcRdoToTgcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') MdtCalibrationSvc INFO Processing configuration for layouts with BMG chambers. +ClassIDSvc INFO getRegistryEntries: read 194 CLIDRegistry entries for module ALL AtlasFieldSvc INFO initialize() ... AtlasFieldSvc INFO maps will be chosen reading COOL folder /GLOBAL/BField/Maps +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL AtlasFieldSvc INFO magnet currents will be read from COOL folder /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO Booked callback for /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO initialize() successful MdtRdoToMdtPrep... INFO Processing configuration for layouts with BME chambers. MdtRdoToMdtPrep... INFO Processing configuration for layouts with BMG chambers. MdtRdoToMdtPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for module ALL CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc +ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1aaacd00]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. +EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... +ClassIDSvc INFO getRegistryEntries: read 1126 CLIDRegistry entries for module ALL ToolSvc.Luminos... INFO LuminosityTool::initialize() registering ToolSvc.Luminos... INFO LumiFolderName is empty, skipping ToolSvc.Luminos... INFO OnlineLumiCalibrationTool.empty() is TRUE, skipping... @@ -1975,6 +3260,7 @@ ToolSvc.Luminos... INFO BunchLumisTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO BunchGroupTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO LBLBFolderName is empty, skipping... EventSelector INFO Retrieved InputCollections from InputSvc +ByteStreamInputSvc INFO Initializing ByteStreamInputSvc - package version ByteStreamCnvSvc-00-00-00 EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully @@ -2056,6 +3342,7 @@ phi high-pt mu11 mu15 mu15 RPCcabling INFO CablingRPC---InitMaps from COOL: going to read configuration +RPCcabling INFO CablingRPC--->> RPC cabling map from COOL << RPCcabling INFO CablingRPC--- ReadConf: map has size 222202 RPCcabling INFO CablingRPC--- ReadConf: map n. of lines read is 924 RPCcabling INFO CablingRPC--- ReadConf: version is 5.0 Atlas R_07_03_RUN2ver104 @@ -2093,13 +3380,19 @@ AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] Toroids_SCurrent , 4 , 20397.7 AtlasFieldSvc INFO Currents read from DCS: solenoid 7729.99 toroid 20399.9 AtlasFieldSvc INFO Initializing the field map (solenoidCurrent=7729.99 toroidCurrent=20399.9) +AtlasFieldSvc INFO reading the map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +AtlasFieldSvc INFO Initialized the field map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +ClassIDSvc INFO getRegistryEntries: read 672 CLIDRegistry entries for module ALL AthenaEventLoopMgr INFO ===>>> start processing event #186525031, run #327265 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMapSchema_BMG_01 for folder /MDT/CABLING/MAP_SCHEMA IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMezzanineSchema_M5-RUN2 for folder /MDT/CABLING/MEZZANINE_SCHEMA IOVDbSvc INFO Disconnecting from COOLONL_MDT/CONDBR2 MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) readCdoMez->size()= 24 +MuonMDT_CablingAlg INFO Range of input is {[0,l:0] - [INVALID]} MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) readCdoMap->size()= 2312 +MuonMDT_CablingAlg INFO Range of input is {[327264,l:4294640031] - [327265,l:4294640030]} +MuonMDT_CablingAlg INFO recorded new MuonMDT_CablingMap with range {[327264,l:4294640031] - [327265,l:4294640030]} into Conditions Store MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG fillCollection: starting @@ -2213,6 +3506,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6048000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 1 @@ -2220,6 +3514,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6050000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 @@ -2229,6 +3524,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6248000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 3 @@ -2236,6 +3532,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6250000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Decoding data from TDC number : 7 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -2245,6 +3542,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6448000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 15 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 5 @@ -2252,6 +3550,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6450000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -2387,12 +3686,14 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6049000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 1 csmId : 1 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6051000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 10 @@ -2403,6 +3704,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6249000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 1 csmId : 3 @@ -2410,6 +3712,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6251000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Found the Beginnning of Link @@ -2418,6 +3721,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6449000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 2 chan: 22 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 @@ -2433,6 +3737,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6451000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 5 MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -2540,18 +3845,21 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x604a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 2 csmId : 1 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x6052000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 2 csmId : 2 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x624a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 0 chan: 20 MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 @@ -2563,6 +3871,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x6252000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 5 MdtRawDataProvi... DEBUG Decoding data from TDC number : 7 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 7 chan: 12 @@ -2574,6 +3883,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x644a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 MdtRawDataProvi... DEBUG Decoding data from TDC number : 9 @@ -2595,6 +3905,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x80 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x80 24 8 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 8 @@ -2604,28 +3915,55 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 112 +CscRawDataProvi... DEBUG RPU Header word 0x5000070 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 112 CscRawDataProvi... DEBUG SCA Address = 724315438 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x20202 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x600006c CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 108 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 12 +CscRawDataProvi... DEBUG cluster location word 0x10a2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31725 6 51 :: measphi0 L2 strId 46 nStr 4 T0 nSampWords 8 [7.51.-1.1.1.2.2.0.46] +CscRawDataProvi... DEBUG cluster location word 0x10a35 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 54 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31733 6 51 :: measphi0 L2 strId 54 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.0.54] +CscRawDataProvi... DEBUG cluster location word 0x10c2c +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 45 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31916 7 51 :: measphi0 L3 strId 45 nStr 5 T0 nSampWords 10 [7.51.-1.1.1.2.3.0.45] +CscRawDataProvi... DEBUG cluster location word 0x10c37 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 56 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31927 7 51 :: measphi0 L3 strId 56 nStr 4 T0 nSampWords 8 [7.51.-1.1.1.2.3.0.56] +CscRawDataProvi... DEBUG cluster location word 0x10e2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 32109 8 51 :: measphi0 L4 strId 46 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.0.46] +CscRawDataProvi... DEBUG cluster location word 0x10e39 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 58 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 32121 8 51 :: measphi0 L4 strId 58 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.0.58] +CscRawDataProvi... DEBUG cluster location word 0x10903 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55491 9 51 :: measphi1 L1 strId 4 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.1.1.4] +CscRawDataProvi... DEBUG cluster location word 0x10b08 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55544 9 51 :: measphi1 L2 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.1.9] +CscRawDataProvi... DEBUG cluster location word 0x10b1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55566 9 51 :: measphi1 L2 strId 31 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.1.31] +CscRawDataProvi... DEBUG cluster location word 0x10d07 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 8 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55591 9 51 :: measphi1 L3 strId 8 nStr 5 T0 nSampWords 10 [7.51.-1.1.1.2.3.1.8] +CscRawDataProvi... DEBUG cluster location word 0x10d1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55614 9 51 :: measphi1 L3 strId 31 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.3.1.31] +CscRawDataProvi... DEBUG cluster location word 0x10f08 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55640 9 51 :: measphi1 L4 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.1.9] CscRawDataProvi... DEBUG ****Total Cluster count = 12 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2634,6 +3972,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x81 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x81 16 0 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 0 @@ -2643,38 +3982,52 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 122 +CscRawDataProvi... DEBUG RPU Header word 0xd00007a CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 122 CscRawDataProvi... DEBUG SCA Address = 2358087311 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x2000002 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x7000076 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 7 CscRawDataProvi... DEBUG Cluster Data Words = 118 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 11 CscRawDataProvi... DEBUG cluster location word 0x810 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 17 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 784 0 50 :: measphi0 L1 strId 17 nStr 4 T0 nSampWords 8 [7.50.-1.1.1.2.1.0.17] CscRawDataProvi... DEBUG cluster location word 0x868 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000007 105 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 872 0 50 :: measphi0 L1 strId 105 nStr 7 T0 nSampWords 14 [7.50.-1.1.1.2.1.0.105] CscRawDataProvi... DEBUG cluster location word 0xe11 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x1000000a 18 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 1361 3 50 :: measphi0 L4 strId 18 nStr 10 T0 nSampWords 20 [7.50.-1.1.1.2.4.0.18] CscRawDataProvi... DEBUG cluster location word 0xe41 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 66 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 1409 3 50 :: measphi0 L4 strId 66 nStr 4 T0 nSampWords 8 [7.50.-1.1.1.2.4.0.66] CscRawDataProvi... DEBUG cluster location word 0x916 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24790 4 50 :: measphi1 L1 strId 23 nStr 5 T0 nSampWords 10 [7.50.-1.1.1.2.1.1.23] CscRawDataProvi... DEBUG cluster location word 0xb16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24838 4 50 :: measphi1 L2 strId 23 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.2.1.23] CscRawDataProvi... DEBUG cluster location word 0xd03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24867 4 50 :: measphi1 L3 strId 4 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.4] CscRawDataProvi... DEBUG cluster location word 0xd15 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 22 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24885 4 50 :: measphi1 L3 strId 22 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.22] CscRawDataProvi... DEBUG cluster location word 0xd2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24909 4 50 :: measphi1 L3 strId 46 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.46] CscRawDataProvi... DEBUG cluster location word 0xf15 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 22 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24933 4 50 :: measphi1 L4 strId 22 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.4.1.22] CscRawDataProvi... DEBUG cluster location word 0xf1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24942 4 50 :: measphi1 L4 strId 31 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.4.1.31] CscRawDataProvi... DEBUG ****Total Cluster count = 11 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2683,6 +4036,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x82 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x82 25 9 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 9 @@ -2692,6 +4046,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 50 +CscRawDataProvi... DEBUG RPU Header word 0x5000032 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 50 @@ -2701,13 +4056,24 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x200002e CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 2 CscRawDataProvi... DEBUG Cluster Data Words = 46 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 5 +CscRawDataProvi... DEBUG cluster location word 0x12c17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33431 7 51 :: measphi0 L3 strId 24 nStr 5 T0 nSampWords 10 [7.51.-1.2.1.2.3.0.24] +CscRawDataProvi... DEBUG cluster location word 0x12e16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33622 8 51 :: measphi0 L4 strId 23 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.0.23] +CscRawDataProvi... DEBUG cluster location word 0x12e1a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 27 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33626 8 51 :: measphi0 L4 strId 27 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.0.27] +CscRawDataProvi... DEBUG cluster location word 0x12d24 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 56004 9 51 :: measphi1 L3 strId 37 nStr 4 T0 nSampWords 8 [7.51.-1.2.1.2.3.1.37] +CscRawDataProvi... DEBUG cluster location word 0x12f24 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 56052 9 51 :: measphi1 L4 strId 37 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.1.37] CscRawDataProvi... DEBUG ****Total Cluster count = 5 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2716,6 +4082,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x83 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x83 17 1 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 1 @@ -2725,27 +4092,52 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 116 +CscRawDataProvi... DEBUG RPU Header word 0xd000074 CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 116 CscRawDataProvi... DEBUG SCA Address = 1920169077 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x1010102 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x6000070 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 112 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 11 +CscRawDataProvi... DEBUG cluster location word 0x2818 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2328 0 50 :: measphi0 L1 strId 25 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.1.0.25] +CscRawDataProvi... DEBUG cluster location word 0x2a17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2519 1 50 :: measphi0 L2 strId 24 nStr 6 T0 nSampWords 12 [7.50.-1.2.1.2.2.0.24] +CscRawDataProvi... DEBUG cluster location word 0x2c17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2711 2 50 :: measphi0 L3 strId 24 nStr 5 T0 nSampWords 10 [7.50.-1.2.1.2.3.0.24] +CscRawDataProvi... DEBUG cluster location word 0x2e18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2904 3 50 :: measphi0 L4 strId 25 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.4.0.25] +CscRawDataProvi... DEBUG cluster location word 0x2ebc +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 189 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 3068 3 50 :: measphi0 L4 strId 189 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.4.0.189] +CscRawDataProvi... DEBUG cluster location word 0x2909 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25161 4 50 :: measphi1 L1 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.1.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2b09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25209 4 50 :: measphi1 L2 strId 10 nStr 5 T0 nSampWords 10 [7.50.-1.2.1.2.2.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2d09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25257 4 50 :: measphi1 L3 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.3.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2d16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25270 4 50 :: measphi1 L3 strId 23 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.3.1.23] +CscRawDataProvi... DEBUG cluster location word 0x2f09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25305 4 50 :: measphi1 L4 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.4.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2f28 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 41 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25336 4 50 :: measphi1 L4 strId 41 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.4.1.41] CscRawDataProvi... DEBUG ****Total Cluster count = 11 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2754,6 +4146,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x84 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x84 26 10 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 10 @@ -2763,6 +4156,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 114 +CscRawDataProvi... DEBUG RPU Header word 0x5000072 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 114 @@ -2772,14 +4166,27 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 0 +CscRawDataProvi... DEBUG Second cluster word 0x400006e CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 4 CscRawDataProvi... DEBUG Cluster Data Words = 110 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 6 +CscRawDataProvi... DEBUG cluster location word 0x14c03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 34947 7 51 :: measphi0 L3 strId 4 nStr 5 T0 nSampWords 10 [7.51.-1.3.1.2.3.0.4] +CscRawDataProvi... DEBUG cluster location word 0x14c66 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000013 103 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 35046 7 51 :: measphi0 L3 strId 103 nStr 19 T0 nSampWords 38 [7.51.-1.3.1.2.3.0.103] +CscRawDataProvi... DEBUG cluster location word 0x1491b +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 28 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56283 9 51 :: measphi1 L1 strId 28 nStr 3 T0 nSampWords 6 [7.51.-1.3.1.2.1.1.28] +CscRawDataProvi... DEBUG cluster location word 0x14d09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56361 9 51 :: measphi1 L3 strId 10 nStr 6 T0 nSampWords 12 [7.51.-1.3.1.2.3.1.10] +CscRawDataProvi... DEBUG cluster location word 0x14d1f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 32 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56383 9 51 :: measphi1 L3 strId 32 nStr 3 T0 nSampWords 6 [7.51.-1.3.1.2.3.1.32] +CscRawDataProvi... DEBUG cluster location word 0x14d23 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x1000000d 36 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56387 9 51 :: measphi1 L3 strId 36 nStr 13 T0 nSampWords 26 [7.51.-1.3.1.2.3.1.36] CscRawDataProvi... DEBUG ****Total Cluster count = 6 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2788,6 +4195,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x85 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x85 18 2 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 2 @@ -2797,23 +4205,40 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 90 +CscRawDataProvi... DEBUG RPU Header word 0xd00005a CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 90 CscRawDataProvi... DEBUG SCA Address = 1482250843 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x20100 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 0 +CscRawDataProvi... DEBUG Second cluster word 0x4000056 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 4 CscRawDataProvi... DEBUG Cluster Data Words = 86 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 7 +CscRawDataProvi... DEBUG cluster location word 0x4a18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000008 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4056 1 50 :: measphi0 L2 strId 25 nStr 8 T0 nSampWords 16 [7.50.-1.3.1.2.2.0.25] +CscRawDataProvi... DEBUG cluster location word 0x4a3a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 59 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4090 1 50 :: measphi0 L2 strId 59 nStr 4 T0 nSampWords 8 [7.50.-1.3.1.2.2.0.59] +CscRawDataProvi... DEBUG cluster location word 0x4c1a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 27 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4250 2 50 :: measphi0 L3 strId 27 nStr 6 T0 nSampWords 12 [7.50.-1.3.1.2.3.0.27] +CscRawDataProvi... DEBUG cluster location word 0x4b11 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 18 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25601 4 50 :: measphi1 L2 strId 18 nStr 3 T0 nSampWords 6 [7.50.-1.3.1.2.2.1.18] +CscRawDataProvi... DEBUG cluster location word 0x4b18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25608 4 50 :: measphi1 L2 strId 25 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.2.1.25] +CscRawDataProvi... DEBUG cluster location word 0x4b1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25614 4 50 :: measphi1 L2 strId 31 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.2.1.31] +CscRawDataProvi... DEBUG cluster location word 0x4d14 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 21 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25652 4 50 :: measphi1 L3 strId 21 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.3.1.21] CscRawDataProvi... DEBUG ****Total Cluster count = 7 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2822,6 +4247,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x86 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x86 27 11 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 11 @@ -2831,6 +4257,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 58 +CscRawDataProvi... DEBUG RPU Header word 0x500003a CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 58 @@ -2840,12 +4267,21 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x1000036 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 1 CscRawDataProvi... DEBUG Cluster Data Words = 54 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 4 +CscRawDataProvi... DEBUG cluster location word 0x16c2f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 48 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36527 7 51 :: measphi0 L3 strId 48 nStr 3 T0 nSampWords 6 [7.51.-1.4.1.2.3.0.48] +CscRawDataProvi... DEBUG cluster location word 0x16c56 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000008 87 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36566 7 51 :: measphi0 L3 strId 87 nStr 8 T0 nSampWords 16 [7.51.-1.4.1.2.3.0.87] +CscRawDataProvi... DEBUG cluster location word 0x16e57 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000007 88 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36759 8 51 :: measphi0 L4 strId 88 nStr 7 T0 nSampWords 14 [7.51.-1.4.1.2.4.0.88] +CscRawDataProvi... DEBUG cluster location word 0x16f04 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 5 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 56788 9 51 :: measphi1 L4 strId 5 nStr 5 T0 nSampWords 10 [7.51.-1.4.1.2.4.1.5] CscRawDataProvi... DEBUG ****Total Cluster count = 4 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2854,6 +4290,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x87 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x87 19 3 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 3 @@ -2863,26 +4300,49 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 92 +CscRawDataProvi... DEBUG RPU Header word 0xd00005c CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 92 CscRawDataProvi... DEBUG SCA Address = 404298267 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x1010101 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x6000058 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 88 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 10 +CscRawDataProvi... DEBUG cluster location word 0x6855 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 86 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5461 0 50 :: measphi0 L1 strId 86 nStr 4 T0 nSampWords 8 [7.50.-1.4.1.2.1.0.86] +CscRawDataProvi... DEBUG cluster location word 0x6a7c +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 125 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5692 1 50 :: measphi0 L2 strId 125 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.2.0.125] +CscRawDataProvi... DEBUG cluster location word 0x6c77 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 120 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5879 2 50 :: measphi0 L3 strId 120 nStr 5 T0 nSampWords 10 [7.50.-1.4.1.2.3.0.120] +CscRawDataProvi... DEBUG cluster location word 0x6e71 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 114 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 6065 3 50 :: measphi0 L4 strId 114 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.4.0.114] +CscRawDataProvi... DEBUG cluster location word 0x691b +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 28 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25947 4 50 :: measphi1 L1 strId 28 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.28] +CscRawDataProvi... DEBUG cluster location word 0x691f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 32 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25951 4 50 :: measphi1 L1 strId 32 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.32] +CscRawDataProvi... DEBUG cluster location word 0x6924 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25956 4 50 :: measphi1 L1 strId 37 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.37] +CscRawDataProvi... DEBUG cluster location word 0x6b17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25991 4 50 :: measphi1 L2 strId 24 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.2.1.24] +CscRawDataProvi... DEBUG cluster location word 0x6d17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 26039 4 50 :: measphi1 L3 strId 24 nStr 4 T0 nSampWords 8 [7.50.-1.4.1.2.3.1.24] +CscRawDataProvi... DEBUG cluster location word 0x6f2a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 43 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 26106 4 50 :: measphi1 L4 strId 43 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.4.1.43] CscRawDataProvi... DEBUG ****Total Cluster count = 10 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -2891,6 +4351,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x88 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x88 28 12 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 12 @@ -2900,24 +4361,42 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 74 +CscRawDataProvi... DEBUG RPU Header word 0x500004a CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 74 CscRawDataProvi... DEBUG SCA Address = 1499093852 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x2000001 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x5000046 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 5 CscRawDataProvi... DEBUG Cluster Data Words = 70 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 8 +CscRawDataProvi... DEBUG cluster location word 0x18831 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 50 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 37681 5 51 :: measphi0 L1 strId 50 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.0.50] +CscRawDataProvi... DEBUG cluster location word 0x188ab +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 172 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 37803 5 51 :: measphi0 L1 strId 172 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.0.172] +CscRawDataProvi... DEBUG cluster location word 0x18e03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 38211 8 51 :: measphi0 L4 strId 4 nStr 5 T0 nSampWords 10 [7.51.-1.5.1.2.4.0.4] +CscRawDataProvi... DEBUG cluster location word 0x18908 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57032 9 51 :: measphi1 L1 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.1.9] +CscRawDataProvi... DEBUG cluster location word 0x1892e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000002 47 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57070 9 51 :: measphi1 L1 strId 47 nStr 2 T0 nSampWords 4 [7.51.-1.5.1.2.1.1.47] +CscRawDataProvi... DEBUG cluster location word 0x18b00 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000002 1 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57072 9 51 :: measphi1 L2 strId 1 nStr 2 T0 nSampWords 4 [7.51.-1.5.1.2.2.1.1] +CscRawDataProvi... DEBUG cluster location word 0x18d0d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 14 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57133 9 51 :: measphi1 L3 strId 14 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.3.1.14] +CscRawDataProvi... DEBUG cluster location word 0x18f1c CscRawDataProvi...WARNING DEBUG message limit (500) reached for CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder. Suppressing further output. CscRawDataProvi... DEBUG After processing numColls=32 AthenaEventLoopMgr INFO ===>>> done processing event #186525031, run #327265 1 events processed so far <<<=== @@ -3132,10 +4611,40 @@ CscRawDataProvi... DEBUG After processing numColls=32 AthenaEventLoopMgr INFO ===>>> done processing event #186580451, run #327265 20 events processed so far <<<=== Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully +IncidentProcAlg1 INFO Finalize CondInputLoader INFO Finalizing CondInputLoader... +IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/20 (( 0.27 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/202 (( 1.17 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216520 (( 0.70 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/288 (( 0.49 ))s +IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/222235 (( 1.17 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/29402 (( 0.39 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562651 (( 0.64 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8096306 (( 1.06 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/3704 (( 0.47 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322656 (( 0.61 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/350062 (( 0.75 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411187 (( 0.13 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/353376 (( 0.03 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411395 (( 0.03 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/230496 (( 0.10 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/314380 (( 2.85 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3136 (( 0.68 ))s +IOVDbSvc INFO bytes in (( 11.54 ))s +IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.19 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.27 ))s +IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 5.18 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 1.17 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.47 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.27 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -3159,12 +4668,17 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** +cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 +ChronoStatSvc INFO Time User : Tot= 5.14 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully ApplicationMgr INFO Application Manager Terminated successfully Listing sources of suppressed message: +===================================================== Message Source | Level | Count +-----------------------------+---------+------------- CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder| DEBUG | 35169 MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder| DEBUG | 854603 +===================================================== Py:Athena INFO leaving with code 0: "successful run" diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py index 79f5d951a4b9..172ac995f675 100644 --- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py +++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py @@ -11,8 +11,8 @@ def createLArRoI_Map( flags ): from LArCabling.LArCablingConf import LArCablingLegacyService cablingTool = LArCablingLegacyService() # this is realy a tool # needed by above - acc.merge( LArFebRodMappingCfg( flags )[0] ) - acc.merge( LArCalibIdMappingCfg( flags )[0] ) + acc.merge( LArFebRodMappingCfg( flags )) + acc.merge( LArCalibIdMappingCfg( flags )) from CaloTriggerTool.CaloTriggerToolConf import CaloTriggerTowerService triggerTowerTool = CaloTriggerTowerService() -- GitLab From 8f1462e7382c0aefe56324e83ecb2cf371211f7c Mon Sep 17 00:00:00 2001 From: Walter Lampl <Walter.Lampl@cern.ch> Date: Wed, 13 Mar 2019 13:09:18 +0100 Subject: [PATCH 023/163] ComponentAccumulator: Add doc-strings for setPrivateTool and popPrivateTool, move check for dangling private tool(s) to __del__ --- .../python/ComponentAccumulator.py | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py index 611e554aac26..40c4b80b7cb0 100644 --- a/Control/AthenaConfiguration/python/ComponentAccumulator.py +++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py @@ -51,6 +51,9 @@ class ComponentAccumulator(object): raise RuntimeError("ComponentAccumulator was not merged!") #log = logging.getLogger("ComponentAccumulator") #log.error("The ComponentAccumulator listed below was never merged!") + + if self._privateTools is not None: + raise RuntimeError("Deleting a ComponentAccumulator with and dangling private tool(s)") #pass @@ -159,21 +162,28 @@ class ComponentAccumulator(object): return findSubSequence(self._sequence,sequenceName) def setPrivateTools(self,privTool): + """Use this method to carry private AlgTool(s) to the caller when returning this ComponentAccumulator. + The method accepts either a single private AlgTool or a list of private AlgTools (typically assigned to ToolHandleArray) + """ + if self._privateTools is not None: - raise ConfigurationError("This ComponentAccumulator holds already a private tool. Only one private tool is allowed") + raise ConfigurationError("This ComponentAccumulator holds already a (list of) private tool. Only one (list of) private tool(s) is allowed") if isinstance(privTool,collections.Sequence): for t in privTool: if not isinstance(t,ConfigurableAlgTool): - raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only configurableAlgTools or lists of ConfigurableAlgTools. Encountered %s in a list" % type(t)) + raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only ConfigurableAlgTools or lists of ConfigurableAlgTools. Encountered %s in a list" % type(t)) else: if not isinstance(privTool,ConfigurableAlgTool): - raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only configurableAlgTools or lists of ConfigurableAlgTools. Encountered %s " % type(privTool)) + raise ConfigurationError("ComponentAccumulator.setPrivateTools accepts only cCnfigurableAlgTools or lists of ConfigurableAlgTools. Encountered %s " % type(privTool)) self._privateTools=privTool return def popPrivateTools(self): + """Get the (list of) private AlgTools from this CompoentAccumulator. + The CA will not keep any reference to the AlgTool. + """ tool=self._privateTools self._privateTools=None return tool @@ -444,10 +454,6 @@ class ComponentAccumulator(object): if other is None: raise RuntimeError("merge called on object of type None: did you forget to return a CA from a config function?") - privTool=self._privateTools or other._privateTools - if (privTool is not None): - raise RuntimeError("merge called on a ComponentAccumulator with and dangling private tool %s/%s" % (privTool.getType(),privTool.getName())) - if isinstance(other,collections.Sequence): self._msg.error("Merge called with a: %s " % str(type(other)) + " of length: %d " % len(other)) self._msg.error("where elements are of type : " + ", ".join([ str(type(x).__name__) for x in other]) ) -- GitLab From 54859f36c277845d98f294cd1c169f0ceaa344c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Ma=C5=A1=C3=ADk?= <Jiri.Masik@manchester.ac.uk> Date: Wed, 13 Mar 2019 13:22:45 +0100 Subject: [PATCH 024/163] disable access to the offline conditions in the online mode - it fixes ATLASRECTS-4865 --- .../python/PixelConditionsSummaryToolSetup.py | 7 +------ .../share/InDetRecConditionsAccess.py | 5 +++-- .../TrigUpgradeTest/python/InDetSetup.py | 10 ++++++---- .../TrigValidation/TrigUpgradeTest/share/IDCalo.py | 14 ++------------ 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryToolSetup.py b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryToolSetup.py index 4094ad6eee46..b3fbbe5e864d 100644 --- a/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryToolSetup.py +++ b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryToolSetup.py @@ -78,13 +78,8 @@ class PixelConditionsSummaryToolSetup: from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelTDAQCondAlg condSeq += PixelTDAQCondAlg(name="PixelTDAQCondAlg", ReadKey=PixelTDAQFolder) + PixelDeadMapFolder = "/PIXEL/PixMapOverlay" if (self.useDeadMap): - PixelDeadMapFolder = "/PIXEL/PixMapOverlay" - PixelDeadMapInstance = "PIXEL_OFL" - - if not conddb.folderRequested(PixelDeadMapFolder): - conddb.addFolder(PixelDeadMapInstance, PixelDeadMapFolder, className="CondAttrListCollection") - if not (conddb.folderRequested("/PIXEL/PixMapOverlay") or conddb.folderRequested("/PIXEL/Onl/PixMapOverlay")): conddb.addFolderSplitOnline("PIXEL","/PIXEL/Onl/PixMapOverlay","/PIXEL/PixMapOverlay", className='CondAttrListCollection') diff --git a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py index ef043d6801ff..4cb832a1e9b4 100644 --- a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py +++ b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py @@ -86,9 +86,10 @@ if DetFlags.haveRIO.pixel_on(): conddb.addFolder("PIXEL_OFL","/PIXEL/PixdEdx") else: conddb.addFolder("PIXEL_OFL","/PIXEL/PixdEdx") + + if not conddb.folderRequested("/PIXEL/PixReco"): + conddb.addFolder("PIXEL_OFL", "/PIXEL/PixReco", className="DetCondCFloat") - if not conddb.folderRequested("/PIXEL/PixReco"): - conddb.addFolder("PIXEL_OFL", "/PIXEL/PixReco", className="DetCondCFloat") if not hasattr(condSeq, 'PixelOfflineCalibCondAlg'): from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelOfflineCalibCondAlg diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/InDetSetup.py b/Trigger/TrigValidation/TrigUpgradeTest/python/InDetSetup.py index 690e08dc747d..9da79e352da6 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/python/InDetSetup.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/python/InDetSetup.py @@ -6,9 +6,12 @@ def makeInDetAlgs( whichSignature='' ): #If signature specified add suffix to the algorithms signature = "_" + whichSignature if whichSignature else '' + eventAlgs = [] viewAlgs = [] + from InDetTrigRecExample.InDetTrigFlags import InDetTrigFlags from InDetRecExample.InDetKeys import InDetKeys + #Create IdentifiableCaches from InDetPrepRawDataFormation.InDetPrepRawDataFormationConf import InDet__CacheCreator InDetCacheCreatorTrigViews = InDet__CacheCreator(name = "InDetCacheCreatorTrigViews" + signature, @@ -38,8 +41,7 @@ def makeInDetAlgs( whichSignature='' ): Decoder = InDetPixelRodDecoder) ToolSvc += InDetPixelRawDataProviderTool - from InDetRecExample.InDetJobProperties import InDetFlags - if (InDetFlags.doPrintConfigurables()): + if (InDetTrigFlags.doPrintConfigurables()): print InDetPixelRawDataProviderTool # load the PixelRawDataProvider @@ -55,7 +57,7 @@ def makeInDetAlgs( whichSignature='' ): viewAlgs.append(InDetPixelRawDataProvider) - if (InDetFlags.doPrintConfigurables()): + if (InDetTrigFlags.doPrintConfigurables()): print InDetPixelRawDataProvider @@ -69,7 +71,7 @@ def makeInDetAlgs( whichSignature='' ): InDetSCTRawDataProviderTool = SCTRawDataProviderTool(name = "InDetSCTRawDataProviderTool" + signature, Decoder = InDetSCTRodDecoder) ToolSvc += InDetSCTRawDataProviderTool - if (InDetFlags.doPrintConfigurables()): + if (InDetTrigFlags.doPrintConfigurables()): print InDetSCTRawDataProviderTool # load the SCTRawDataProvider diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/IDCalo.py b/Trigger/TrigValidation/TrigUpgradeTest/share/IDCalo.py index 318c2e2a9f4f..096bf0e4ce5e 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/IDCalo.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/IDCalo.py @@ -34,18 +34,8 @@ allViewAlgorithms = AthSequencer(viewNodeName, Sequential=False, ModeOR=False, S if TriggerFlags.doID: - - from InDetRecExample.InDetJobProperties import InDetFlags - InDetFlags.doCaloSeededBrem = False - InDetFlags.InDet25nsec = True - InDetFlags.doPrimaryVertex3DFinding = False - InDetFlags.doPrintConfigurables = False - InDetFlags.doResolveBackTracks = True - InDetFlags.doSiSPSeededTrackFinder = True - InDetFlags.doTRTPhaseCalculation = True - InDetFlags.doTRTSeededTrackFinder = True - InDetFlags.doTruth = False - InDetFlags.init() + from InDetTrigRecExample.InDetTrigFlags import InDetTrigFlags + InDetTrigFlags.doPixelClusterSplitting = False # PixelLorentzAngleSvc and SCTLorentzAngleSvc include("InDetRecExample/InDetRecConditionsAccess.py") -- GitLab From 83a03b45336280d261ee2a563be4cf27b84631f5 Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 13 Mar 2019 13:45:36 +0000 Subject: [PATCH 025/163] Minor changes before pulling in master --- .../MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx index 96f98cbef9e2..402ed5c8dd1b 100644 --- a/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonRPC_CnvTools/src/RPC_RawDataProviderTool.cxx @@ -304,9 +304,10 @@ StatusCode Muon::RPC_RawDataProviderTool::convert(const ROBFragmentList& vecRobs // store the error condition into the StatusCode and continue } } - // Unsure about this at the moment - //ATH_CHECK( rdoContainerHandle.record (std::move (pad)) ); + ATH_MSG_DEBUG("After processing, number of collections in container : " << pad-> numberOfCollections() ); + + // Only write out the RpcSectorLogigContainer if we activate the flag if(m_WriteOutRpcSectorLogic){ ATH_MSG_DEBUG("Writing out RpcSectorLogicContainer"); ATH_CHECK( logicHandle.record (std::move (logic)) ); -- GitLab From 0bf794806095c11d54b75ae342e76a7585d9e4b9 Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 13 Mar 2019 13:57:19 +0000 Subject: [PATCH 026/163] Update config --- .../python/MuonBytestreamDecodeConfig.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py index 8c7f10f26b4c..c955ef8947c0 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py @@ -1,4 +1,4 @@ -# +1;95;0c# # Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration # from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator @@ -55,7 +55,13 @@ def RpcBytestreamDecodeCfg(flags, forTrigger=False): from MuonRPC_CnvTools.MuonRPC_CnvToolsConf import Muon__RPC_RawDataProviderTool MuonRpcRawDataProviderTool = Muon__RPC_RawDataProviderTool(name = "RPC_RawDataProviderTool", Decoder = RPCRodDecoder ) - MuonRpcRawDataProviderTool.OutputLevel = VERBOSE + if forTrigger: + cacheAcc,cacheAlg = MuonCacheCfg() + acc.merge( cacheAcc ) + MuonRpcRawDataProviderTool.RpcContainerCacheKey = MuonCacheNames.RpcCache + MuonRpcRawDataProviderTool.WriteOutRpcSectorLogic = False + MuonRpcRawDataProviderTool.OutputLevel = DEBUG + acc.addPublicTool( MuonRpcRawDataProviderTool ) # This should be removed, but now defined as PublicTool at MuFastSteering # Setup the RAW data provider algorithm @@ -68,6 +74,7 @@ def RpcBytestreamDecodeCfg(flags, forTrigger=False): RpcRawDataProvider.DoSeededDecoding = True RpcRawDataProvider.RoIs = "MURoIs" # Maybe we don't want to hard code this? + return acc, RpcRawDataProvider def TgcBytestreamDecodeCfg(flags, forTrigger=False): @@ -119,7 +126,7 @@ def MdtBytestreamDecodeCfg(flags, forTrigger=False): # Setup the MDT ROD decoder from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import MdtROD_Decoder - MDTRodDecoder = MdtROD_Decoder(name = "MdtROD_Decoder" ) + MDTRodDecoder = MdtROD_Decoder(name = "MdtROD_Decoder") # RAW data provider tool needs ROB data provider service (should be another Config function?) from ByteStreamCnvSvcBase.ByteStreamCnvSvcBaseConf import ROBDataProviderSvc @@ -130,6 +137,7 @@ def MdtBytestreamDecodeCfg(flags, forTrigger=False): from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import Muon__MDT_RawDataProviderTool MuonMdtRawDataProviderTool = Muon__MDT_RawDataProviderTool(name = "MDT_RawDataProviderTool", Decoder = MDTRodDecoder) + if forTrigger: # Trigger the creation of cache containers cacheAcc,cacheAlg = MuonCacheCfg() @@ -226,12 +234,12 @@ if __name__=="__main__": cfg.addEventAlgo( tgcdecodingAlg ) # Schedule Mdt data decoding - once mergeAll is working can simplify these lines - mdtdecodingAcc, mdtdecodingAlg = MdtBytestreamDecodeCfg( ConfigFlags , True) + mdtdecodingAcc, mdtdecodingAlg = MdtBytestreamDecodeCfg( ConfigFlags ) cfg.merge( mdtdecodingAcc ) cfg.addEventAlgo( mdtdecodingAlg ) # Schedule Csc data decoding - once mergeAll is working can simplify these lines - cscdecodingAcc, cscdecodingAlg = CscBytestreamDecodeCfg( ConfigFlags , True) + cscdecodingAcc, cscdecodingAlg = CscBytestreamDecodeCfg( ConfigFlags ) cfg.merge( cscdecodingAcc ) cfg.addEventAlgo( cscdecodingAlg ) -- GitLab From e84807d18282dde430d23e44049b3750f956a0af Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 13 Mar 2019 13:59:06 +0000 Subject: [PATCH 027/163] Update RDO config --- .../MuonConfig/python/MuonRdoDecodeConfig.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py index f96f53de9347..241ef97febf3 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py @@ -167,16 +167,20 @@ def muonRdoDecodeTestData( forTrigger = False ): log.setLevel(DEBUG) log.info('About to setup Rpc Raw data decoding') - + cfg=ComponentAccumulator() - + # Seem to need this to read BS properly from ByteStreamCnvSvc.ByteStreamConfig import TrigBSReadCfg cfg.merge(TrigBSReadCfg(ConfigFlags )) # Schedule Rpc bytestream data decoding - once mergeAll is working can simplify these lines from MuonConfig.MuonBytestreamDecodeConfig import RpcBytestreamDecodeCfg - rpcdecodingAcc, rpcdecodingAlg = RpcBytestreamDecodeCfg( ConfigFlags ) + rpcdecodingAcc, rpcdecodingAlg = RpcBytestreamDecodeCfg( ConfigFlags, forTrigger ) + # Put into a verbose logging mode to check the caching + if forTrigger: + rpcdecodingAlg.ProviderTool.OutputLevel = DEBUG + cfg.merge( rpcdecodingAcc ) cfg.addEventAlgo( rpcdecodingAlg ) @@ -223,7 +227,6 @@ def muonRdoDecodeTestData( forTrigger = False ): cfg.merge(cscbuildingAcc) cfg.addEventAlgo(cscbuildingAlg) - # Need to add POOL converter - may be a better way of doing this? from AthenaCommon import CfgMgr cfg.addService( CfgMgr.AthenaPoolCnvSvc() ) -- GitLab From 52a23f6cadc9bea2a1afddadbea9f1466b7503fb Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 13 Mar 2019 14:18:33 +0000 Subject: [PATCH 028/163] Tweaking config --- .../MuonConfig/python/MuonBytestreamDecodeConfig.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py index d16cc4169b84..d3bf83c4c775 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py @@ -1,4 +1,4 @@ -1;95;0c# +# # Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration # from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator @@ -56,8 +56,6 @@ def RpcBytestreamDecodeCfg(flags, forTrigger=False): MuonRpcRawDataProviderTool = Muon__RPC_RawDataProviderTool(name = "RPC_RawDataProviderTool", Decoder = RPCRodDecoder ) if forTrigger: - cacheAcc,cacheAlg = MuonCacheCfg() - acc.merge( cacheAcc ) MuonRpcRawDataProviderTool.RpcContainerCacheKey = MuonCacheNames.RpcCache MuonRpcRawDataProviderTool.WriteOutRpcSectorLogic = False MuonRpcRawDataProviderTool.OutputLevel = DEBUG -- GitLab From a874954827d55c18510fb3d8cd1c42d35c04c7a7 Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Wed, 13 Mar 2019 14:24:26 +0000 Subject: [PATCH 029/163] Forcing the push --- .../MuonConfig/python/MuonBytestreamDecodeConfig.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py index d3bf83c4c775..c81299b4f0c1 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py @@ -204,7 +204,7 @@ if __name__=="__main__": ConfigFlags.lock() ConfigFlags.dump() - from AthenaCommon.Logging import log + from AthenaCommon.Logging import log log.setLevel(DEBUG) log.info('About to setup Rpc Raw data decoding') -- GitLab From 2b5b7a74e926a5be02af554576e493111938cabc Mon Sep 17 00:00:00 2001 From: sherwood <peter.sherwood@cern.ch> Date: Wed, 13 Mar 2019 18:12:46 +0100 Subject: [PATCH 030/163] Copyright updates. Use SystemOfUnits --- .../TrigHLTJetHypo/ITrigHLTJetHypoTool.h | 2 +- .../TrigHLTJetHypo/ITrigJetHypoTool.h | 2 +- .../TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h | 2 +- .../TrigHLTJetHypo/TrigEFRazorAllTE.h | 2 +- .../TrigHLTJetHypo/TrigHLTJetHypo2.h | 2 +- .../TrigHLTJetHypo/TrigHLTJetHypoBase.h | 2 +- .../TrigHLTJetHypoUtils/AllJetsGrouper.h | 2 +- .../TrigHLTJetHypoUtils/AntiBasicCleaner.h | 2 +- .../TrigHLTJetHypoUtils/AntiLlpCleaner.h | 2 +- .../TrigHLTJetHypoUtils/AntiLooseCleaner.h | 2 +- .../TrigHLTJetHypoUtils/AntiTightCleaner.h | 2 +- .../TrigHLTJetHypoUtils/BasicCleaner.h | 2 +- .../TrigHLTJetHypoUtils/CleanerBridge.h | 2 +- .../TrigHLTJetHypoUtils/CleanerFactory.h | 2 +- .../TrigHLTJetHypoUtils/CleanerWrapper.h | 2 +- .../TrigHLTJetHypoUtils/CombinationsGen.h | 2 +- .../TrigHLTJetHypoUtils/CombinationsGrouper.h | 2 +- .../TrigHLTJetHypoUtils/ConditionBridge.h | 2 +- .../TrigHLTJetHypoUtils/ConditionsDefs.h | 2 +- .../TrigHLTJetHypoUtils/ConditionsSorter.h | 2 +- .../TrigHLTJetHypoUtils/DescendingEt.h | 2 +- .../TrigHLTJetHypoUtils/DijetCondition.h | 2 +- .../TrigHLTJetHypoUtils/DijetDEtaMassCondition.h | 2 +- .../TrigHLTJetHypoUtils/DijetDPhiCondition.h | 2 +- .../TrigHLTJetHypoUtils/DijetMTCondition.h | 2 +- .../TrigHLTJetHypoUtils/EtaECondition.h | 2 +- .../TrigHLTJetHypo/python/ChainLabelParser.py | 1 + .../TrigHLTJetHypo/python/JetCleanMonitoring.py | 2 +- .../TrigHLTJetHypo/python/ToolSetter.py | 7 +++++++ .../python/TrigEFDPhiMetJetAllTEConfig.py | 2 +- .../python/TrigEFDPhiMetJetAllTEMonitoring.py | 2 +- .../python/TrigEFRazorAllTEConfig.py | 2 +- .../python/TrigEFRazorAllTEMonitoring.py | 2 +- .../python/TrigHLTJetHypo2Monitoring.py | 2 +- .../TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py | 2 +- .../TrigHLTJetHypo/python/TrigJetHypoToolConfig.py | 2 ++ .../TrigHLTJetHypo/python/__init__.py | 2 +- .../TrigHLTJetHypo/python/chainDict2jetLabel.py | 2 ++ .../TrigHLTJetHypo/python/chainDictDumper.py | 2 ++ .../TrigHLTJetHypo/python/constants.py | 2 ++ .../TrigHypothesis/TrigHLTJetHypo/python/node.py | 2 ++ .../TrigHLTJetHypo/python/test_cases.py | 2 ++ .../TrigHLTJetHypo/python/treeVisitors.py | 2 ++ .../TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h | 2 +- .../TrigHLTJetHypo/src/ITrigJetHypoToolMT.h | 2 +- .../TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx | 2 +- .../TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx | 2 +- .../src/TrigHLTJetHypoUtils/DijetCondition.cxx | 14 +++++++++----- .../src/TrigHLTJetHypoUtils/DijetMTCondition.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx | 2 +- .../src/TrigHLTJetHypo_DijetMassDEta.cxx | 2 +- .../src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx | 2 +- .../TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx | 2 +- .../TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx | 2 +- .../TrigHLTJetHypo/src/TrigJetHypoAlgMT.h | 2 +- .../src/TrigJetHypoToolConfig_EtaEt.cxx | 2 +- .../src/TrigJetHypoToolConfig_EtaEt.h | 2 +- .../src/TrigJetHypoToolConfig_dijet.cxx | 2 +- .../src/TrigJetHypoToolConfig_dijet.h | 2 +- .../src/TrigJetHypoToolConfig_simple.cxx | 2 +- .../src/TrigJetHypoToolConfig_simple.h | 2 +- .../TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx | 2 +- .../TrigHLTJetHypo/src/TrigJetHypoToolMT.h | 2 +- .../src/components/TrigHLTJetHypo_entries.cxx | 4 ++++ .../TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx | 2 +- 69 files changed, 93 insertions(+), 63 deletions(-) diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h index c9b692283403..b12c42a11d9f 100755 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ITRIGHLTJETHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h index 39927ef7470f..2df735689083 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h index e83cfe5be147..0c7397fe6cce 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h index 1281f3c32f15..96a881d54960 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h index 98ebef72ecfe..b6ac26f6c03e 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_TRIGHLTJETHYPO2_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h index e4737e6ad77c..bde0538d865e 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_TRIGHLTJETHYPOBASE_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h index b319dace8111..734ebdc64c5a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ALLJETSGROUPER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h index 50e9038960fe..c66a4611e515 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ANTIBASICCLEANER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h index eeeea3736cec..ee8e2d62759a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ANTILLPCLEANER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h index ecc9f59d90af..13785181d35b 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ANTILOOSECLEANER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h index 95c5b322d7c9..6493eb0283bf 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ANTITIGHTCLEANER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h index db3bbb765e2b..c1ed78d04b4c 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_BASICCLEANER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h index 8b5672cb94c9..89bbaf2e8d45 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CLEANERBRIDGE_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h index ffd4b7a8e951..86aa45d9abcd 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CLEANERFACTORY_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h index 8dcd84af7da9..e535373ad972 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CLEANERWRAPPER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h index 558ff7176ba0..d3febb8cc7d8 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTHETHYPO_COMBINATIONSGEN_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h index 822af0d39a85..c3ee42ca53e4 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_COMBINATIONSGROUPER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h index 18112dcfb564..8f0154b546f5 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CONDITIONBRIDGE_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h index beee0988619e..a799e55401d5 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CONDITIONSDEFS_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h index 4f02ba07914a..b6e90762b451 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_CONDITIONSSORTER_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h index 737797625001..6a88c24eb365 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_DESCENDINGET_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h index 5ff7487c70f8..fd9095041c2f 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_DIJETCONDITION_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h index c98416bfbd46..b763ffa1f72b 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_DIJETDETAMASSCONDITION_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h index 984d5b2eb746..be3afbea26e7 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_DIJETDPHICONDITION_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h index 84aef0dc56ad..6a10fd8dae1b 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_DIJETMTCONDITION_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h index a50bcd543e48..c4e55680b442 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ETAECONDITION_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py index 46230e0139dc..8738af9af25f 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py @@ -1,3 +1,4 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from node import Node from constants import (lchars, digits, diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py index 8c3975a10cf8..d4c0a643a61f 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration JetChainsToKeepMonitoring={ #Adding in 2018 for monitoring GSC and large-R diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py index 87c1114df9cf..a8ebc14baad8 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py @@ -1,3 +1,10 @@ +"""Instantiates AlgTools from paramters stored in a node instance""" + +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + + + + from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolConfig_simple, TrigJetHypoToolConfig_dijet, TrigJetNotToolMT, diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py index 139d3a1f6932..4a26b827f7ce 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigEFDPhiMetJetAllTE from TrigHLTJetHypo.TrigEFDPhiMetJetAllTEMonitoring import ( diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py index 6fce97bf28e3..22a6fdac69e4 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py index c78a4697f879..da8d3fc9aff6 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigEFRazorAllTE from TrigHLTJetHypo.TrigEFRazorAllTEMonitoring import ( diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py index a23572ddd8b2..eb38b3a0e6b4 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py index 80436837178e..b1b383a1cc00 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py index 3e7b3e407a86..1d974624f301 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration # from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigHLTJetHypo import TrigHLTJetHypoConf diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py index 908fcb0454ad..11b29338d4a1 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolMT, TrigJetHypoToolConfig_EtaEt) diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py index 74583d364ec2..bbfc91ea870d 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py @@ -1,2 +1,2 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py index 89047bbe9e7f..8b51539d39e0 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + import re # substrings that cannot occur in any chainPartName for simple chains. diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py index 608d8b49228b..f4702a0b48ad 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName from TriggerMenuMT.HLTMenuConfig.Menu.SignatureDicts import JetChainParts import sys diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py index 33afe422d318..10b599fea316 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + lchars = 'abcdefghijklmnopqrstuvwxyz' digits = '0123456789' delims = '()[],' diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py index 7ce56d947df5..0bf899086730 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + from constants import logicals class Node(object): diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py index 549dc54109a0..b928116d28da 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + test_strings = [ 'ijet([(10et, 0eta320)])', 'ijet([(10et, 0eta320)(20et, 0eta320)])', diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py index 5dcc580ce236..d1d5757e5812 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + from constants import lchars import re diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h index 4a0a65fb6ec9..d49d5758f3d4 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOLCONFIG_H #define TRIGHLTJETHYPO_ITRIGJETHYPOTOOLCONFIG_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h index b0f4844ef05a..72d438ef5f5a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOLMT_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx index a7c547ca2ee7..e027e7ba83a8 100755 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx index 85e06ce328c3..552911a8e0ba 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx index 4300b37cbba9..90966c1bec3f 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx index 35928de193f6..e7c8cec34a7a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx @@ -7,6 +7,8 @@ #include <stdexcept> #include <TLorentzVector.h> #include <limits> +#include "GaudiKernel/SystemOfUnits.h" + // #include <iostream> DijetCondition::DijetCondition( double etThreshold0, @@ -56,8 +58,10 @@ bool DijetCondition::isSatisfied(const HypoJetVector& ips) const{ bool DijetCondition::passJetCuts(pHypoJet j0, pHypoJet j1) const { - auto et0 = 0.001 * j0->et(); - auto et1 = 0.001 * j1->et(); + constexpr double invGeV = 1./Gaudi::Units::GeV; + + auto et0 = j0->et() * invGeV; + auto et1 = j1->et() * invGeV; auto eta0 = j0->eta(); auto eta1 = j1->eta(); @@ -78,9 +82,9 @@ bool DijetCondition::passJetCuts(pHypoJet j0, pHypoJet j1) const { bool DijetCondition::passDijetCuts(pHypoJet j0, pHypoJet j1) const { - - auto rj0 = 0.001 * (j0 -> p4()); - auto rj1 = 0.001 * (j1 -> p4()); + constexpr double invGeV = 1./Gaudi::Units::GeV; + auto rj0 = (j0 -> p4()) * invGeV; + auto rj1 = (j1 -> p4()) * invGeV; auto mass = (rj0 + rj1).M(); if (m_massMin > mass or mass >= m_massMax){return false;} diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx index 8e1c5d29314c..3bb2c8c2269c 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h" diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx index 439e78489a37..ba1079b2f131 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx index 06ae5f3324e3..86142dcc6197 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx index 2a6cef035217..243b98ab9a3d 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx index 93dacee0008c..f7e85ee43160 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx index cb2c8d9ae440..ba73e14d3995 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx index 938c20723db5..1354f8dbe0de 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx index 195d0a41d6b0..1efbece2a227 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx index a6ca525b17c7..45fd41423c3a 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "GaudiKernel/Property.h" diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h index d4413eb184e5..3157bf40f2a4 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TrigHLTJetHypo_TrigJetHypoAlgMT_H #define TrigHLTJetHypo_TrigJetHypoAlgMT_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx index fc26f284bb1d..bf74c882428d 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h index 2d07e666129f..356310c44271 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGJETHYPOTOOLConfig_ETAET_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx index c079a5328ca9..a3d7a5f9a805 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /* diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h index 0f47ee6b7ca5..d89255c9b474 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGJETHYPOTOOLConfig_DIJET_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx index 9eaa545f00f7..7a6362a30788 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h index 6f8b04e489d0..b503b12948e1 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGJETHYPOTOOLConfig_SIMPLE_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx index 90fcef396941..9c52d1334d82 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // ******************************************************************** diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h index 0e3744f582bd..7e431a512783 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGJETHYPOTOOLMT_H diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx index d24e32ccc4fa..b8363a2069cc 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx @@ -1,3 +1,7 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + #include "TrigHLTJetHypo/TrigHLTJetHypo2.h" #include "TrigHLTJetHypo/TrigEFRazorAllTE.h" #include "TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h" diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx index 3a79530f2729..ab7261bdc2a1 100644 --- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx +++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h" -- GitLab From 48c691228ba4e91b319c63d9c3f9d630c4157ffa Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Thu, 14 Mar 2019 03:39:39 +0100 Subject: [PATCH 031/163] solve most part of review comments. --- .../Root/TrigEgammaDistTool.cxx | 9 -- .../Root/TrigEgammaEventSelection.cxx | 49 +------- .../Root/TrigEgammaNavTPAnalysisTool.cxx | 1 - .../Root/TrigEgammaNavTPBaseTool.cxx | 1 - .../Root/TrigEgammaPhysValBase.cxx | 109 +----------------- .../TrigEgammaEventSelection.h | 13 +-- .../TrigEgammaPhysValBase.h | 46 +------- .../TrigEgammaAnalysisTools_entries.cxx | 3 - 8 files changed, 4 insertions(+), 227 deletions(-) diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx index 2572366022b4..93b1274d32d7 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx @@ -150,15 +150,6 @@ StatusCode TrigEgammaDistTool::toolExecute(const std::string basePath,TrigInfo i fillL2Calo(dir+"L2Calo",obj); // Fill HLT shower shapes } - /* - const auto vec_l2ringer = fc.get<xAOD::TrigRingerRings>("",TrigDefs::alsoDeactivateTEs); - for(const auto feat : vec_l2ringer){ - if(feat.te()==nullptr) continue; - const auto* obj = getFeature<xAOD::TrigRingerRings>(feat.te()); - // Only consider passing objects - if(!obj) continue; - fillRingerShapes(dir+"L2Calo",obj);// Fill HLT ringer shapes - }*/ const auto vec_l2rnn = fc.get<xAOD::TrigRNNOutput>("",TrigDefs::alsoDeactivateTEs); for(const auto feat : vec_l2rnn){ diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx index fb2df7075283..86b0c5af4c42 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /********************************************************************** * AsgTool: TrigEgammaEventSelection @@ -184,9 +184,6 @@ StatusCode TrigEgammaEventSelection::childBook(){ m_doCaloRings=true; } - // This will needed to emulate objects without all features attached - //if(emulation()) - // emulation()->ExperimentalAndExpertMethods(); ///Alloc pointers alloc_space(); @@ -214,9 +211,6 @@ StatusCode TrigEgammaEventSelection::childExecute(){ if(m_selectionFakes) EventSelectionFakes(); - //if(m_selectionMC) - // EventSelectionMC(); - return StatusCode::SUCCESS; } @@ -324,19 +318,12 @@ bool TrigEgammaEventSelection::fill( TTree *t, const xAOD::Electron *el){ const HLT::TriggerElement* feat=nullptr; - //bool doAccept=false; - //if(trigItem.empty()){ - // Use the support match method from the emulation tool if(getEmulation()) emulation()->match( el, feat ); else{ ATH_MSG_ERROR("Emulation tool was not configurated. Impossible to match! Please, see your python config."); return false; } - //}else{ - // match()->match(el, trigItem, feat); - // doAccept=true; - //} if(feat){ clear(); @@ -441,8 +428,6 @@ bool TrigEgammaEventSelection::fillTDT(const xAOD::Electron *el , const HLT::Tri m_trig_tdt_L2_el_accept->push_back( -1 ); m_trig_tdt_EF_calo_accept->push_back( -1 ); m_trig_tdt_EF_el_accept->push_back( -1 ); - //ATH_MSG_DEBUG("Trigger bitmask was converted to " << int(GetByteFromBools(mask))); - //m_trig_tdt_decision_mask->push_back(GetByteFromBools(mask)); } if(te && getEmulation()){ @@ -470,8 +455,6 @@ bool TrigEgammaEventSelection::fillTDT(const xAOD::Electron *el , const HLT::Tri m_trig_tdt_emu_L2_el_accept->push_back( -1 ); m_trig_tdt_emu_EF_calo_accept->push_back( -1 ); m_trig_tdt_emu_EF_el_accept->push_back( -1 ); - //ATH_MSG_DEBUG("Trigger bitmask was converted to " << int(GetByteFromBools(mask))); - //m_trig_tdt_decision_mask->push_back(GetByteFromBools(mask)); } @@ -570,8 +553,6 @@ bool TrigEgammaEventSelection::ApplyFireTriggers( const xAOD::Electron *el){ StatusCode TrigEgammaEventSelection::childFinalize(){ - //release_space(); - //ATH_MSG_DEBUG( "Number of probes collected is: " <<tree("probes" , m_dir+"/Egamma")->GetEntries()); for(auto& trigItem : m_trigList){ ATH_MSG_DEBUG("From TDT tool:"); @@ -603,9 +584,6 @@ bool TrigEgammaEventSelection::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){ m_trig_L1_emIsol = emTauRoI->emIsol(); m_trig_L1_hadIsol = emTauRoI->hadIsol(); m_trig_L1_hadCore = emTauRoI->hadCore(); - //for(unsigned i=0; i < emTauRoI->thrNames().size();++i){ - // m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i)); - //} return true; } @@ -1103,31 +1081,6 @@ bool TrigEgammaEventSelection::fillHLTElectron( const xAOD::Electron *el ){ el->isolationValue(val,xAOD::Iso::ptvarcone40); m_trig_EF_el_ptCone->push_back(val); - - - - /* - m_trig_EF_el_nblayerhits ->push_back( nblayerhits ); - m_trig_EF_el_nblayerolhits ->push_back( nblayerolhits ); - m_trig_EF_el_npixhits ->push_back( npixhits ); - m_trig_EF_el_npixolhits ->push_back( npixolhits ); - m_trig_EF_el_npixdeadsensors ->push_back( npixdeadsensors ); - m_trig_EF_el_nscthits ->push_back( nscthits ); - m_trig_EF_el_nsctolhits ->push_back( nsctolhits ); - m_trig_EF_el_nsctdeadsensors ->push_back( nsctdeadsensors ); - m_trig_EF_el_ntrthits ->push_back( ntrthits ); - m_trig_EF_el_ntrtolhits ->push_back( ntrtolhits ); - m_trig_EF_el_ntrthightreshits ->push_back( ntrthighthreshits ); - m_trig_EF_el_ntrthighthresolhits ->push_back( ntrthighthresolhits ); - m_trig_EF_el_ntrtxenonhits ->push_back( ntrtxenonhits ); - m_trig_EF_el_expectblayerhit ->push_back( expectblayerhit ); - m_trig_EF_el_expectNextToInnerMostLayer ->push_back( expectNextToInnerMostLayer); - m_trig_EF_el_nNextToInnerMostLayerHits ->push_back( nNextToInnerMostLayerHits ); - m_trig_EF_el_nNextToInnerMostLayerOutliers->push_back( nNextToInnerMostLayerOutliers ); - */ - - - return true; } diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx index e18a851a02a7..c13b73ef8d1f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx @@ -43,7 +43,6 @@ StatusCode TrigEgammaNavTPAnalysisTool::childBook(){ //Set the base directory from the plot() m_dir=plot()->getBasePath(); std::vector<std::string> chains = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*"); - //TrigEgammaAnalysisBaseTool::write_trigger_list(chains); for(const auto trigName:m_trigInputList){ if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx index b9a15b8223d9..fa0d71d180d9 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx @@ -587,7 +587,6 @@ float TrigEgammaNavTPBaseTool::getWTransverseMass( const xAOD::Electron *el ){ bool TrigEgammaNavTPBaseTool::passesEventCleaning() { ATH_MSG_DEBUG("Appling Event Cleaning..."); - //if(m_ismc) return true; bool failsLAr = (m_eventInfo->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error ); bool failsTile = (m_eventInfo->errorState(xAOD::EventInfo::Tile) == xAOD::EventInfo::Error ); bool failsSCT = (m_eventInfo->errorState(xAOD::EventInfo::SCT) == xAOD::EventInfo::Error ); diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx index 3c63338f5693..2b6fe03aa69a 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include <iostream> @@ -44,7 +44,6 @@ void TrigEgammaPhysValBase::InitBranch(TTree* fChain, std::string branch_name, T bname = std::string(fChain->GetAlias(bname.c_str())); if (!fChain->FindBranch(bname.c_str()) && message) { - std::cout << "[WARNING] unknown branch " << bname << std::endl; return; } fChain->SetBranchStatus(bname.c_str(), 1.); @@ -62,7 +61,6 @@ void TrigEgammaPhysValBase::bookEventBranches(TTree *t){ void TrigEgammaPhysValBase::bookTriggerBranches(TTree *t){ // Level L1 cluster - //t->Branch( "trig_isPrescaled", &m_trig_isPrescaled); t->Branch( "trig_L1_eta", &m_trig_L1_eta); t->Branch( "trig_L1_phi", &m_trig_L1_phi); t->Branch( "trig_L1_emClus", &m_trig_L1_emClus); @@ -178,25 +176,6 @@ void TrigEgammaPhysValBase::bookTriggerBranches(TTree *t){ BRANCH( trig_EF_el_lhvloose ); -/* - BRANCH( trig_EF_el_nblayerhits ); - BRANCH( trig_EF_el_nblayerolhits ); - BRANCH( trig_EF_el_npixhits ); - BRANCH( trig_EF_el_npixolhits ); - BRANCH( trig_EF_el_nscthits ); - BRANCH( trig_EF_el_nsctolhits ); - BRANCH( trig_EF_el_ntrthightreshits ); - BRANCH( trig_EF_el_ntrthits ); - BRANCH( trig_EF_el_ntrthighthresolhits ); - BRANCH( trig_EF_el_ntrtolhits ); - BRANCH( trig_EF_el_ntrtxenonhits ); - BRANCH( trig_EF_el_expectblayerhit ); - BRANCH( trig_EF_el_npixdeadsensors ); - BRANCH( trig_EF_el_nsctdeadsensors ); - BRANCH( trig_EF_el_expectNextToInnerMostLayer ); - BRANCH( trig_EF_el_nNextToInnerMostLayerHits ); - BRANCH( trig_EF_el_nNextToInnerMostLayerOutliers); - */ #undef BRANCH @@ -309,8 +288,6 @@ void TrigEgammaPhysValBase::bookTDTBranches(TTree *t){ } -/*void TrigEgammaPhysValBase::bookPhotonBranches(TTree *t){ -} */ void TrigEgammaPhysValBase::bookMonteCarloBranches(TTree *t){ // Monte Carlo @@ -429,31 +406,9 @@ void TrigEgammaPhysValBase::linkElectronBranches( TTree *t ){ InitBranch( t, "el_lhmedium", &m_el_lhMedium ); InitBranch( t, "el_lhtight", &m_el_lhTight ); InitBranch( t, "el_multiLepton", &m_el_multiLepton); - /* - InitBranch( t, "el_nblayerhits", &m_el_nblayerhits); - InitBranch( t, "el_nblayerolhits", &m_el_nblayerolhits); - InitBranch( t, "el_npixhits", &m_el_npixhits); - InitBranch( t, "el_npixolhits", &m_el_npixolhits); - InitBranch( t, "el_npixdeadsensors", &m_el_npixdeadsensors ); - InitBranch( t, "el_nscthits", &m_el_nscthits); - InitBranch( t, "el_nsctolhits", &m_el_nsctolhits); - InitBranch( t, "el_nsctdeadsensors", &m_el_nsctdeadsensors ); - InitBranch( t, "el_ntrthits", &m_el_ntrthits); - InitBranch( t, "el_ntrtolhits", &m_el_ntrtolhits); - InitBranch( t, "el_ntrthighthreshits", &m_el_ntrthighthreshits); - InitBranch( t, "el_ntrthighthresolhits", &m_el_ntrthighthresolhits); - InitBranch( t, "el_ntrtxenonhits", &m_el_ntrtxenonhits); - InitBranch( t, "el_expectblayerhit", &m_el_expectblayerhit); - */ - - - - } -/*void TrigEgammaPhysValBase::linkPhotonBranches( TTree *t ){ -}*/ void TrigEgammaPhysValBase::linkTriggerBranches( TTree *t ){ @@ -574,27 +529,6 @@ void TrigEgammaPhysValBase::linkTriggerBranches( TTree *t ){ INIT( trig_EF_el_lhloose ); INIT( trig_EF_el_lhvloose ); - /* - INIT( trig_EF_el_nblayerhits ); - INIT( trig_EF_el_nblayerolhits ); - INIT( trig_EF_el_npixhits ); - INIT( trig_EF_el_npixolhits ); - INIT( trig_EF_el_nscthits ); - INIT( trig_EF_el_nsctolhits ); - INIT( trig_EF_el_ntrthightreshits ); - INIT( trig_EF_el_ntrthits ); - INIT( trig_EF_el_ntrthighthresolhits ); - INIT( trig_EF_el_ntrtolhits ); - INIT( trig_EF_el_ntrtxenonhits ); - INIT( trig_EF_el_expectblayerhit ); - INIT( trig_EF_el_npixdeadsensors ); - INIT( trig_EF_el_nsctdeadsensors ); - INIT( trig_EF_el_expectNextToInnerMostLayer ); - INIT( trig_EF_el_nNextToInnerMostLayerHits ); - INIT( trig_EF_el_nNextToInnerMostLayerOutliers); - */ - - #undef INIT @@ -998,27 +932,6 @@ void TrigEgammaPhysValBase::alloc_space(){ - /* - m_trig_EF_el_nblayerhits = new std::vector<uint8_t>(); - m_trig_EF_el_nblayerolhits = new std::vector<uint8_t>(); - m_trig_EF_el_npixhits = new std::vector<uint8_t>(); - m_trig_EF_el_npixolhits = new std::vector<uint8_t>(); - m_trig_EF_el_nscthits = new std::vector<uint8_t>(); - m_trig_EF_el_nsctolhits = new std::vector<uint8_t>(); - m_trig_EF_el_ntrthightreshits = new std::vector<uint8_t>(); - m_trig_EF_el_ntrthits = new std::vector<uint8_t>(); - m_trig_EF_el_ntrthighthresolhits = new std::vector<uint8_t>(); - m_trig_EF_el_ntrtolhits = new std::vector<uint8_t>(); - m_trig_EF_el_ntrtxenonhits = new std::vector<uint8_t>(); - m_trig_EF_el_expectblayerhit = new std::vector<uint8_t>(); - m_trig_EF_el_npixdeadsensors = new std::vector<uint8_t>(); - m_trig_EF_el_nsctdeadsensors = new std::vector<uint8_t>(); - m_trig_EF_el_expectNextToInnerMostLayer = new std::vector<uint8_t>(); - m_trig_EF_el_nNextToInnerMostLayerHits = new std::vector<uint8_t>(); - m_trig_EF_el_nNextToInnerMostLayerOutliers = new std::vector<uint8_t>(); - */ - - } void TrigEgammaPhysValBase::release_space(){ @@ -1030,7 +943,6 @@ void TrigEgammaPhysValBase::release_space(){ - //delete m_trig_L1_thrNames ; delete m_trig_L2_calo_energySample; delete m_trig_L2_calo_rings ; delete m_trig_L2_calo_rnnOutput ; @@ -1099,25 +1011,6 @@ void TrigEgammaPhysValBase::release_space(){ delete m_trig_EF_el_trk_deltaPOverP ; delete m_trig_EF_el_trk_summaryValues ; - /* - delete m_trig_EF_el_nblayerhits ; - delete m_trig_EF_el_nblayerolhits ; - delete m_trig_EF_el_npixhits ; - delete m_trig_EF_el_npixolhits ; - delete m_trig_EF_el_nscthits ; - delete m_trig_EF_el_nsctolhits ; - delete m_trig_EF_el_ntrthightreshits ; - delete m_trig_EF_el_ntrthits ; - delete m_trig_EF_el_ntrthighthresolhits ; - delete m_trig_EF_el_ntrtolhits ; - delete m_trig_EF_el_ntrtxenonhits ; - delete m_trig_EF_el_expectblayerhit ; - delete m_trig_EF_el_npixdeadsensors ; - delete m_trig_EF_el_nsctdeadsensors ; - delete m_trig_EF_el_expectNextToInnerMostLayer ; - delete m_trig_EF_el_nNextToInnerMostLayerHits ; - delete m_trig_EF_el_nNextToInnerMostLayerOutliers ; - */ delete m_trig_EF_calo_tight ; delete m_trig_EF_calo_medium ; delete m_trig_EF_calo_loose ; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h index 294e43189f96..eb112b0d1a4a 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H #define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H @@ -78,17 +78,6 @@ class TrigEgammaEventSelection : public TrigEgammaNavTPBaseTool, public TrigEgam - // [*,*,HLT,EFCalo,L2,L2Calo,L1Calo,isGoodMatch] - //uint8_t GetByteFromBools(const bool eightBools[8]) - int GetByteFromBools(const bool eightBools[8]) - { - int ret = 0; - //uint8_t ret = 0; - for (int i=0; i<8; i++) if (eightBools[i] == true) ret |= (1<<i); - return ret; - } - - //ToolHandleArray<ITrigEgammaEmulationTool> m_emulationTools; ToolHandleArray<IAsgElectronIsEMSelector> m_EFCaloElectronIsEMSelectors; ToolHandleArray<IAsgElectronIsEMSelector> m_HLTElectronIsEMSelectors; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h index 53f925f4fe32..6b77c0d095ad 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMAPHYSVALBASE_H @@ -270,50 +270,6 @@ class TrigEgammaPhysValBase bool m_mc_hasZMother{}; bool m_mc_hasWMother{}; - /* - - uint8_t m_el_nblayerhits; - uint8_t m_el_nblayerolhits; - uint8_t m_el_npixhits; - uint8_t m_el_npixolhits; - uint8_t m_el_nscthits; - uint8_t m_el_nsctolhits; - uint8_t m_el_ntrthightreshits; - uint8_t m_el_ntrthits; - uint8_t m_el_ntrthighthresolhits; - uint8_t m_el_ntrtolhits; - uint8_t m_el_ntrtxenonhits; - uint8_t m_el_expectblayerhit; - uint8_t m_el_nsihits ; - uint8_t m_el_nsideadsensors ; - uint8_t m_el_npixdeadsensors ; - uint8_t m_el_nsctdeadsensors ; - uint8_t m_el_expectNextToInnerMostLayer; - uint8_t m_el_nNextToInnerMostLayerHits; - uint8_t m_el_nNextToInnerMostLayerOutliers; - - std::vector<float> *m_trig_EF_el_charge; - std::vector<uint8_t> *m_trig_EF_el_nblayerhits; - std::vector<uint8_t> *m_trig_EF_el_nblayerolhits; - std::vector<uint8_t> *m_trig_EF_el_npixhits; - std::vector<uint8_t> *m_trig_EF_el_npixolhits; - std::vector<uint8_t> *m_trig_EF_el_nscthits; - std::vector<uint8_t> *m_trig_EF_el_nsctolhits; - std::vector<uint8_t> *m_trig_EF_el_ntrthightreshits; - std::vector<uint8_t> *m_trig_EF_el_ntrthits; - std::vector<uint8_t> *m_trig_EF_el_ntrthighthresolhits; - std::vector<uint8_t> *m_trig_EF_el_ntrtolhits; - std::vector<uint8_t> *m_trig_EF_el_ntrtxenonhits; - std::vector<uint8_t> *m_trig_EF_el_expectblayerhit; - std::vector<uint8_t> *m_trig_EF_el_transformed_expectblayerhit; - std::vector<uint8_t> *m_trig_EF_el_nsihits ; - std::vector<uint8_t> *m_trig_EF_el_nsideadsensors ; - std::vector<uint8_t> *m_trig_EF_el_npixdeadsensors ; - std::vector<uint8_t> *m_trig_EF_el_nsctdeadsensors ; - std::vector<uint8_t> *m_trig_EF_el_expectNextToInnerMostLayer; - std::vector<uint8_t> *m_trig_EF_el_nNextToInnerMostLayerHits; - std::vector<uint8_t> *m_trig_EF_el_nNextToInnerMostLayerOutliers; - */ }; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx index 9ca518c5150f..9facf0a35faf 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx @@ -1,6 +1,3 @@ - - - #include "TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h" #include "../TrigEgammaMonTool.h" #include "../TrigEgammaPhysValMonTool.h" -- GitLab From 05625abade74c212a2738bb6b1b0f7a221a5dfd8 Mon Sep 17 00:00:00 2001 From: Walter Lampl <Walter.Lampl@cern.ch> Date: Thu, 14 Mar 2019 11:20:16 +0100 Subject: [PATCH 032/163] LArHVScaleConfig: Fix import of addFolders --- LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py index fbe52c53e456..8dbcce76d5ac 100644 --- a/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py +++ b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py @@ -1,6 +1,7 @@ # Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from IOVDbSvc.IOVDbSvcConfig import addFolders def LArHVScaleCfg(configFlags): result=ComponentAccumulator() @@ -9,8 +10,6 @@ def LArHVScaleCfg(configFlags): result.merge(addFolders(configFlags,["/LAR/IdentifierOfl/HVLineToElectrodeMap<tag>LARHVLineToElectrodeMap-001</tag>"], "LAR_OFL", className="AthenaAttributeList")) elif not configFlags.Common.isOnline: - from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg - result.mergeAll(IOVDbSvcCfg(configFlags)) result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREl/I16"], "DCS_OFL", className="CondAttrListCollection")) result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREL/I8"], "DCS_OFL", className="CondAttrListCollection")) -- GitLab From 63cc84ed068ca305ad2676b393ed59656b2a1c2a Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Thu, 14 Mar 2019 11:50:13 +0000 Subject: [PATCH 033/163] Updating reference files for data decode test. These were updated because some core athena changed, and then also because of small updates to the container decoding --- .../MuonConfig/share/MuonDataDecodeTest.ref | 1777 +++++++++++----- .../share/MuonDataDecodeTest_Cache.ref | 1803 ++++++++++++----- 2 files changed, 2578 insertions(+), 1002 deletions(-) diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref index 9ad83eb8eb9f..d727a4d7a0ac 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref @@ -1,9 +1,44 @@ Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : [function] +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -36,12 +71,116 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/ByteStreamAttListMetadataSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] dynamically loading the flag Detector Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : [function] +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : [function] +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : [function] +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : [function] +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : [function] +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -53,12 +192,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -77,6 +219,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -101,25 +244,37 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component RPCcablingServerSvc/RPCcablingServerSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool to the job @@ -130,12 +285,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -155,6 +313,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -176,17 +335,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component LVL1TGC::TGCRecRoiSvc/LVL1TGC::TGCRecRoiSvc to the job Py:ComponentAccumulator DEBUG Adding component TGCcablingServerSvc/TGCcablingServerSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -195,12 +375,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -220,8 +403,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -262,6 +447,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -276,10 +467,169 @@ Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersiste Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job dynamically loading the flag Muon Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : False +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : False +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : False +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : False +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : False +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : 'CONDBR2' +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : 'data17_13TeV' +Input.RunNumber : [function] +Input.isMC : False +Muon.Align.UseALines : False +Muon.Align.UseAsBuilt : False +Muon.Align.UseBLines : 'none' +Muon.Align.UseILines : False +Muon.Calib.CscF001FromLocalFile : False +Muon.Calib.CscNoiseFromLocalFile : False +Muon.Calib.CscPSlopeFromLocalFile : False +Muon.Calib.CscPedFromLocalFile : False +Muon.Calib.CscRmsFromLocalFile : False +Muon.Calib.CscStatusFromLocalFile : False +Muon.Calib.CscT0BaseFromLocalFile : False +Muon.Calib.CscT0PhaseFromLocalFile : False +Muon.Calib.EventTag : 'MoMu' +Muon.Calib.applyRtScaling : True +Muon.Calib.correctMdtRtForBField : False +Muon.Calib.correctMdtRtForTimeSlewing : False +Muon.Calib.correctMdtRtWireSag : False +Muon.Calib.mdtCalibrationSource : 'MDT' +Muon.Calib.mdtMode : 'ntuple' +Muon.Calib.mdtPropagationSpeedBeta : 0.85 +Muon.Calib.readMDTCalibFromBlob : True +Muon.Calib.useMLRt : True +Muon.Chi2NDofCut : 20.0 +Muon.createTrackParticles : True +Muon.doCSCs : True +Muon.doDigitization : True +Muon.doFastDigitization : False +Muon.doMDTs : True +Muon.doMSVertex : False +Muon.doMicromegas : False +Muon.doPseudoTracking : False +Muon.doRPCClusterSegmentFinding : False +Muon.doRPCs : True +Muon.doSegmentT0Fit : False +Muon.doTGCClusterSegmentFinding : False +Muon.doTGCs : True +Muon.dosTGCs : False +Muon.enableCurvedSegmentFinding : False +Muon.enableErrorTuning : False +Muon.optimiseMomentumResolutionUsingChi2 : False +Muon.patternsOnly : False +Muon.prdToxAOD : False +Muon.printSummary : False +Muon.refinementTool : 'Moore' +Muon.rpcRawToxAOD : False +Muon.segmentOrigin : 'Muon' +Muon.straightLineFitMomentum : 2000.0 +Muon.strategy : [] +Muon.trackBuilder : 'Moore' +Muon.updateSegmentSecondCoordinate : [function] +Muon.useAlignmentCorrections : False +Muon.useLooseErrorTuning : False +Muon.useSegmentMatching : [function] +Muon.useTGCPriorNextBC : False +Muon.useTrackSegmentMatching : True +Muon.useWireSagCorrections : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py @@ -302,12 +652,31 @@ Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... +Py:ConfigurableDb DEBUG loading confDb files... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonByteStream.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/WorkDir.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG loading confDb files... [DONE] +Py:ConfigurableDb DEBUG loaded 1103 confDb packages +Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... +Py:ConfigurableDb DEBUG : Found configurable <class 'PoolSvc.PoolSvcConf.PoolSvc'> in module PoolSvc.PoolSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaServices.AthenaServicesConf.MetaDataSvc'> in module AthenaServices.AthenaServicesConf +Py:ConfigurableDb DEBUG : Found configurable <class 'StoreGate.StoreGateConf.StoreGateSvc'> in module StoreGate.StoreGateConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDbSvc... +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... +EventInfoMgtInit: Got release version Athena-22.0.1 Py:Configurable ERROR attempt to add a duplicate (ServiceManager.EventPersistencySvc) ... dupe ignored +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDb... [DONE] @@ -323,9 +692,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -337,21 +720,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool to the job @@ -362,12 +766,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -390,16 +797,32 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component ROBDataProviderSvc/ROBDataProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component CSCcablingSvc/CSCcablingSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ROBDataProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -408,12 +831,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -432,6 +858,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component RPCCablingDbTool/RPCCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonRPC_CablingSvc/MuonRPC_CablingSvc to the job @@ -456,14 +883,38 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonRPC_CnvTools.MuonRPC_CnvToolsConf.Muon__RpcRDO_Decoder'> in module MuonRPC_CnvTools.MuonRPC_CnvToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component RPCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonRPC_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.RPCCablingDbTool Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -472,12 +923,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -497,6 +951,7 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job @@ -518,14 +973,36 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component LVL1TGC::TGCRecRoiSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TGCcablingServerSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -534,12 +1011,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -559,8 +1039,10 @@ Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingAlg/MuonMDT_CablingAlg to the job Py:ComponentAccumulator DEBUG Adding component MDTCablingDbTool/MDTCablingDbTool to the job Py:ComponentAccumulator DEBUG Adding component MuonMDT_CablingSvc/MuonMDT_CablingSvc to the job @@ -599,6 +1081,12 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component AthenaPoolCnvSvc/AthenaPoolCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job @@ -638,9 +1126,23 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationDbSvc/MdtCalibrationDbSvc to the job Py:ComponentAccumulator DEBUG Adding component MdtCalibrationSvc/MdtCalibrationSvc to the job @@ -652,14 +1154,42 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingAlg +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MuonMDT_CablingSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component AtlasFieldSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component MdtCalibrationSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MDTCablingDbTool +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.MuonCalib::MdtCalibDbCoolStrTool Py:ComponentAccumulator DEBUG Adding component Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -668,12 +1198,15 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -720,6 +1253,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -732,6 +1271,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -744,6 +1289,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -756,6 +1307,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -768,6 +1325,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -780,6 +1343,12 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job @@ -792,11 +1361,18 @@ Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc Py:ComponentAccumulator DEBUG Adding component CondInputLoader/CondInputLoader to the job Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbSvc/IOVDbSvc to the job Py:ComponentAccumulator DEBUG Adding component PoolSvc/PoolSvc to the job Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job @@ -805,19 +1381,48 @@ Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the jo Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component GeoModelSvc/GeoModelSvc to the job Py:ComponentAccumulator DEBUG Adding component DetDescrCnvSvc/DetDescrCnvSvc to the job Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersistencySvc to the job Py:ComponentAccumulator DEBUG Adding component TagInfoMgr/TagInfoMgr to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc Py:ComponentAccumulator DEBUG Adding component Muon::MuonIdHelperTool/Muon::MuonIdHelperTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonCSC_CnvTools.MuonCSC_CnvToolsConf.Muon__CscRDO_Decoder'> in module MuonCSC_CnvTools.MuonCSC_CnvToolsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'CscCalibTools.CscCalibToolsConf.CscCalibTool'> in module CscCalibTools.CscCalibToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader +Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DetDescrCnvSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersistencySvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr +Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CSCcablingSvc Py:ComponentAccumulator DEBUG Adding component MuonCalib::CscCoolStrSvc/MuonCalib::CscCoolStrSvc to the job +Py:ComponentAccumulator DEBUG Reconciled configuration of component IOVDbSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component PoolSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component CondSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component DBReplicaSvc +Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc Py:Athena INFO Print Config +Py:ComponentAccumulator INFO Event Inputs +Py:ComponentAccumulator INFO set([]) +Py:ComponentAccumulator INFO Event Algorithm Sequences +Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ************************************************************ |-Atomic = False |-AuditAlgorithms = False |-AuditBeginRun = False @@ -829,20 +1434,29 @@ Py:Athena INFO Print Config |-AuditRestart = False |-AuditStart = False |-AuditStop = False +|-Cardinality = 0 |-ContinueEventloopOnFPE = False +|-DetStore @0x7fbd4e2eeed0 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 +|-EvtStore @0x7fbd4e2eee50 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7fbd4c928bd8 = [] (default: []) +|-ExtraOutputs @0x7fbd4c928d40 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False +|-Members @0x7fbd4c928ab8 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' +|-NeededResources @0x7fbd4c928e18 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False +|-Sequential = False |-StopOverride = False |-TimeOut = 0.0 +|-Timeline = True |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** | |-AuditAlgorithms = False | |-AuditBeginRun = False @@ -854,29 +1468,45 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fbd4cefd7d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4cefd750 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930050 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c928f80 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c928e60 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fbd4d18a680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7fbd4cefd850 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' -| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7fbd4d1e4620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7fbd4cea4690 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4cea4650 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4cf78170 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4cf78200 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-RpcContainerCacheKey = 'StoreGateSvc+' +| | |-WriteOutRpcSectorLogic = True | | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** | | | |-AuditFinalize = False | | | |-AuditInitialize = False @@ -886,6 +1516,10 @@ Py:Athena INFO Print Config | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7fbd4cea4710 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4cea4750 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4cf78290 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4cf78248 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -904,15 +1538,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fbd4cf0b790 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4cf0b710 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930200 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c9302d8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c930248 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fbd4e09d8c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -921,7 +1563,12 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7fbd4e09d9b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7fbd4ce45c50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4ce45c90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4ce535a8 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4ce533f8 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -933,6 +1580,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fbd4ce45d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4ce45d90 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4ce53248 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4ce533b0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -951,15 +1602,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fbd4cef19d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4cef1950 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930320 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c9303b0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c930290 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fbd4d28bd50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -969,6 +1628,11 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CsmContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7fbd4e09dc80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7fbd4ca01d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4ca01d90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4ca09638 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4ca096c8 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+MDTCSM' @@ -981,6 +1645,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fbd4ca01e50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4ca01e90 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4ca095a8 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4ca09560 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -999,15 +1667,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fbd4cee7bd0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4cee7b50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c9303f8 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c930440 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c930098 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7fbd4c9cc050 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1017,7 +1693,12 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CscContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7fbd4e09de60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7fbd4c9c4c10 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7fbd4c9c4c50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4c9c2d88 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4c9cb050 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+CSCRDO' @@ -1029,6 +1710,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fbd4c9c4d10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4c9c4d50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4c9c2ea8 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4c9c2e60 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1047,19 +1732,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fbd4d06fd20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7fbd4c8ff6d0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4c8ff650 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c9300e0 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c930518 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c930560 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) +| |-RegionSelectionSvc @0x7fbd4c8ff750 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1069,11 +1764,16 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7fbd4c967850 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4c9678d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4c9d4710 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4c9d48c0 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7fbd4c9dd2f0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1091,6 +1791,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fbd4c967950 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4c967990 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4c9d49e0 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4c9d4998 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1107,20 +1811,30 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fbd4c975050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7fbd4c958590 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4c958510 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930368 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c9305a8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c9305f0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) +| |-RegionSelectorSvc @0x7fbd4c958610 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 +| |-Timeline = True | |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1130,6 +1844,10 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7fbd4c967710 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4c967a50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4c9780e0 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4c9787a0 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1138,7 +1856,9 @@ Py:Athena INFO Print Config | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7fbd4c978998 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7fbd4c978440 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1154,19 +1874,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fbd4f21bb50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7fbd4c8f3590 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4c8f3510 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930680 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c930710 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c9306c8 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) +| |-RegionSelectionSvc @0x7fbd4c8f3610 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1177,9 +1907,13 @@ Py:Athena INFO Print Config | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True +| | |-DetStore @0x7fbd4c967cd0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True +| | |-EvtStore @0x7fbd4c967d90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4c984fc8 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4c984e60 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1206,19 +1940,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7fbd4d04f5a0 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7fbd4c960b90 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4c960a90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c9307e8 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c930488 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c930758 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) +| |-RegionSelectionSvc @0x7fbd4c960c10 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1228,7 +1972,13 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7fbd4f284b10 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7fbd4c981c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True +| | |-DetStore @0x7fbd4c967890 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fbd4c98b050 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fbd4ce53f38 = [] (default: []) +| | |-ExtraOutputs @0x7fbd4ce53cf8 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1241,6 +1991,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7fbd4c98b090 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4c98b0d0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4c978fc8 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4c978cb0 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -1267,6 +2021,11 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-CscCalibTool @0x7fbd4c967f90 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7fbd4c9679d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fbd4c967fd0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fbd4c978d40 = [] (default: []) +| | | |-ExtraOutputs @0x7fbd4ce57098 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -1283,507 +2042,449 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fbd4c874390 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7fbd4c874310 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fbd4c930830 = [] (default: []) +| |-ExtraOutputs @0x7fbd4c930878 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fbd4c9308c0 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7fbd4c925cd0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +Py:ComponentAccumulator INFO Condition Algorithms +Py:ComponentAccumulator INFO ['CondInputLoader', 'MuonMDT_CablingAlg'] +Py:ComponentAccumulator INFO Services +Py:ComponentAccumulator INFO ['EventSelector', 'ByteStreamInputSvc', 'EventPersistencySvc', 'ByteStreamCnvSvc', 'ROBDataProviderSvc', 'ByteStreamAddressProviderSvc', 'MetaDataStore', 'InputMetaDataStore', 'MetaDataSvc', 'ProxyProviderSvc', 'ByteStreamAttListMetadataSvc', 'GeoModelSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'RPCcablingServerSvc', 'IOVDbSvc', 'PoolSvc', 'CondSvc', 'DBReplicaSvc', 'MuonRPC_CablingSvc', 'LVL1TGC::TGCRecRoiSvc', 'TGCcablingServerSvc', 'AthenaPoolCnvSvc', 'MuonMDT_CablingSvc', 'AtlasFieldSvc', 'MdtCalibrationDbSvc', 'MdtCalibrationSvc', 'CSCcablingSvc', 'MuonCalib::CscCoolStrSvc'] +Py:ComponentAccumulator INFO Outputs +Py:ComponentAccumulator INFO {} +Py:ComponentAccumulator INFO Public Tools +Py:ComponentAccumulator INFO [ +Py:ComponentAccumulator INFO IOVDbMetaDataTool/IOVDbMetaDataTool, +Py:ComponentAccumulator INFO ByteStreamMetadataTool/ByteStreamMetadataTool, +Py:ComponentAccumulator INFO Muon::MuonIdHelperTool/Muon::MuonIdHelperTool, +Py:ComponentAccumulator INFO RPCCablingDbTool/RPCCablingDbTool, +Py:ComponentAccumulator INFO Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool, +Py:ComponentAccumulator INFO MDTCablingDbTool/MDTCablingDbTool, +Py:ComponentAccumulator INFO MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool, +Py:ComponentAccumulator INFO Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool, +Py:ComponentAccumulator INFO Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool, +Py:ComponentAccumulator INFO Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool, +Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool, +Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, +Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config -/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ -|-Atomic = False -|-AuditAlgorithms = False -|-AuditBeginRun = False -|-AuditEndRun = False -|-AuditExecute = False -|-AuditFinalize = False -|-AuditInitialize = False -|-AuditReinitialize = False -|-AuditRestart = False -|-AuditStart = False -|-AuditStop = False -|-ContinueEventloopOnFPE = False -|-Enable = True -|-ErrorCounter = 0 -|-ErrorMax = 1 -|-FilterCircularDependencies = True -|-IgnoreFilterPassed = False -|-IsIOBound = False -| (default: []) -|-ModeOR = False -|-MonitorService = 'MonitorSvc' -|-OutputLevel = 0 -|-RegisterForContextService = False -|-StopOverride = False -|-TimeOut = 0.0 -|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' -| | |-RdoLocation = 'StoreGateSvc+RPCPAD' -| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-DataErrorPrintLimit = 1000 -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-Sector13Data = False -| | | |-SpecialROBNumber = -1 -| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RdoLocation = 'StoreGateSvc+TGCRDO' -| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-ShowStatusWords = False -| | | |-SkipCoincidence = False -| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CsmContainerCacheKey = 'StoreGateSvc+' -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RdoLocation = 'StoreGateSvc+MDTCSM' -| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | | |-SpecialROBNumber = -1 -| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CscContainerCacheKey = 'StoreGateSvc+' -| | |-EventInfoKey = 'StoreGateSvc+EventInfo' -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RdoLocation = 'StoreGateSvc+CSCRDO' -| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-IsCosmics = False -| | | |-IsOldCosmics = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ -|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-DecodeData = True -| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+RPCPAD' -| | |-OutputLevel = 0 -| | |-RPCInfoFromDb = False -| | | (default: 'Muon::RpcRDO_Decoder') -| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' -| | |-etaphi_coincidenceTime = 20.0 -| | |-overlap_timeTolerance = 10.0 -| | |-processingData = False -| | |-produceRpcCoinDatafromTriggerWords = True -| | |-reduceCablingOverlap = True -| | |-solvePhiAmbiguities = True -| | |-timeShift = -12.5 -| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- -| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- -| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- -|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |-Setting = 0 -| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-DecodeData = True -| | |-FillCoinData = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' -| | |-OutputCollection = 'TGC_Measurements' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+TGCRDO' -| | |-TGCHashIdOffset = 26000 -| | |-dropPrdsWithZeroWidth = True -| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | |-show_warning_level_invalid_A09_SSW6_hit = False -| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- -| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- -|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CalibratePrepData = True -| | |-DecodeData = True -| | |-DiscardSecondaryHitTwin = False -| | |-DoPropagationCorrection = False -| | |-DoTofCorrection = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+MDTCSM' -| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | |-SortPrepData = False -| | |-TimeWindowLowerBound = -1000000.0 -| | |-TimeWindowSetting = 2 -| | |-TimeWindowUpperBound = -1000000.0 -| | |-TwinCorrectSlewing = False -| | |-Use1DPrepDataTwin = False -| | |-UseAllBOLTwin = False -| | |-UseTwin = True -| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- -| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- -|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CSCHashIdOffset = 22000 -| | |-DecodeData = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+CSCRDO' -| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-IsOnline = True -| | | |-Latency = 100.0 -| | | |-MonitorService = 'MonitorSvc' -| | | |-NSamples = 4 -| | | |-Noise = 3.5 -| | | |-OutputLevel = 0 -| | | |-Pedestal = 2048.0 -| | | |-ReadFromDatabase = True -| | | |-Slope = 0.19 -| | | |-SlopeFromDatabase = False -| | | |-TimeOffsetRange = 1.0 -| | | |-Use2Samples = False -| | | |-integrationNumber = 12.0 -| | | |-integrationNumber2 = 11.66 -| | | |-samplingTime = 50.0 -| | | |-signalWidth = 14.4092 -| | | |-timeOffset = 46.825 -| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- -| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- -| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- -| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- -|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| |-RegisterForContextService = False -| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') -| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- -\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +RpcRawDataProvider ExtraOutputs [] +RpcRawDataProvider EvtStore StoreGateSvc +RpcRawDataProvider ExtraInputs [] +RpcRawDataProvider RegionSelectionSvc RegSelSvc +RpcRawDataProvider ProviderTool Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool +RpcRawDataProvider NeededResources [] +RpcRawDataProvider DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider ExtraOutputs [] +TgcRawDataProvider EvtStore StoreGateSvc +TgcRawDataProvider ExtraInputs [] +TgcRawDataProvider NeededResources [] +TgcRawDataProvider ProviderTool Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool +TgcRawDataProvider DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider ExtraOutputs [] +MdtRawDataProvider EvtStore StoreGateSvc +MdtRawDataProvider ExtraInputs [] +MdtRawDataProvider NeededResources [] +MdtRawDataProvider ProviderTool Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool +MdtRawDataProvider DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +CscRawDataProvider ExtraOutputs [] +CscRawDataProvider EvtStore StoreGateSvc +CscRawDataProvider ExtraInputs [] +CscRawDataProvider NeededResources [] +CscRawDataProvider ProviderTool Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool +CscRawDataProvider DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData ExtraOutputs [] +RpcRdoToRpcPrepData DecodingTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool +RpcRdoToRpcPrepData EvtStore StoreGateSvc +RpcRdoToRpcPrepData ExtraInputs [] +RpcRdoToRpcPrepData PrintPrepData False +RpcRdoToRpcPrepData RegionSelectionSvc RegSelSvc +RpcRdoToRpcPrepData NeededResources [] +RpcRdoToRpcPrepData DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData ExtraOutputs [] +TgcRdoToTgcPrepData DecodingTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool +TgcRdoToTgcPrepData EvtStore StoreGateSvc +TgcRdoToTgcPrepData RegionSelectorSvc RegSelSvc +TgcRdoToTgcPrepData ExtraInputs [] +TgcRdoToTgcPrepData PrintPrepData False +TgcRdoToTgcPrepData NeededResources [] +TgcRdoToTgcPrepData DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraOutputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraInputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData ExtraOutputs [] +MdtRdoToMdtPrepData DecodingTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool +MdtRdoToMdtPrepData EvtStore StoreGateSvc +MdtRdoToMdtPrepData ExtraInputs [] +MdtRdoToMdtPrepData PrintPrepData False +MdtRdoToMdtPrepData RegionSelectionSvc RegSelSvc +MdtRdoToMdtPrepData NeededResources [] +MdtRdoToMdtPrepData DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraOutputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraInputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData ExtraOutputs [] +CscRdoToCscPrepData CscRdoToCscPrepDataTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool +CscRdoToCscPrepData EvtStore StoreGateSvc +CscRdoToCscPrepData ExtraInputs [] +CscRdoToCscPrepData PrintPrepData False +CscRdoToCscPrepData RegionSelectionSvc RegSelSvc +CscRdoToCscPrepData NeededResources [] +CscRdoToCscPrepData DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +CscThesholdClusterBuilder ExtraOutputs [] +CscThesholdClusterBuilder EvtStore StoreGateSvc +CscThesholdClusterBuilder ExtraInputs [] +CscThesholdClusterBuilder cluster_builder CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool +CscThesholdClusterBuilder NeededResources [] +CscThesholdClusterBuilder DetStore StoreGateSvc/DetectorStore +CondInputLoader ExtraOutputs [] +CondInputLoader Load [('CondAttrListCollection', '/MDT/CABLING/MEZZANINE_SCHEMA'), ('CondAttrListCollection', '/EXT/DCS/MAGNETS/SENSORDATA'), ('CondAttrListCollection', '/MDT/CABLING/MAP_SCHEMA')] +CondInputLoader EvtStore StoreGateSvc +CondInputLoader ExtraInputs [] +CondInputLoader NeededResources [] +CondInputLoader DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg ExtraOutputs [] +MuonMDT_CablingAlg EvtStore StoreGateSvc +MuonMDT_CablingAlg ExtraInputs [] +MuonMDT_CablingAlg NeededResources [] +MuonMDT_CablingAlg DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +MuonMDT_CablingAlg MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.IOVDbMetaDataTool ExtraOutputs [] +ToolSvc.IOVDbMetaDataTool FoldersToBeModified ['/Simulation/Parameters'] +ToolSvc.IOVDbMetaDataTool MinMaxRunNumbers [] +ToolSvc.IOVDbMetaDataTool EvtStore StoreGateSvc +ToolSvc.IOVDbMetaDataTool AttributesToBeRemoved ['RandomSeedOffset'] +ToolSvc.IOVDbMetaDataTool ExtraInputs [] +ToolSvc.IOVDbMetaDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.ByteStreamMetadataTool ExtraOutputs [] +ToolSvc.ByteStreamMetadataTool EvtStore StoreGateSvc +ToolSvc.ByteStreamMetadataTool ExtraInputs [] +ToolSvc.ByteStreamMetadataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.Muon::MuonIdHelperTool ExtraOutputs [] +ToolSvc.Muon::MuonIdHelperTool EvtStore StoreGateSvc +ToolSvc.Muon::MuonIdHelperTool ExtraInputs [] +ToolSvc.Muon::MuonIdHelperTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool ExtraOutputs [] +ToolSvc.RPCCablingDbTool EvtStore StoreGateSvc +ToolSvc.RPCCablingDbTool ExtraInputs [] +ToolSvc.RPCCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool MapCorrectionFolder /RPC/CABLING/MAP_SCHEMA_CORR +ToolSvc.RPCCablingDbTool MapConfigurationFolder /RPC/CABLING/MAP_SCHEMA +ToolSvc.RPC_RawDataProviderTool ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool ExtraOutputs [] +ToolSvc.MDTCablingDbTool EvtStore StoreGateSvc +ToolSvc.MDTCablingDbTool ExtraInputs [] +ToolSvc.MDTCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +ToolSvc.MDTCablingDbTool MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraOutputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RT_InputFiles ['Muon_RT_default.data'] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TimeSlewingCorrection False +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RtFolder /MDT/RTBLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool MeanCorrectionVsR [-5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool defaultT0 40 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraInputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool UseMLRt True +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool PropagationSpeedBeta 0.85 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TubeFolder /MDT/T0BLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +ToolSvc.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TgcRdoToTgcPrepDataTool ExtraOutputs [] +ToolSvc.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +ToolSvc.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool ExtraInputs [] +ToolSvc.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MdtRdoToMdtPrepDataTool ExtraOutputs [] +ToolSvc.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +ToolSvc.MdtRdoToMdtPrepDataTool ExtraInputs [] +ToolSvc.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +ToolSvc.CscRdoToCscPrepDataTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscThesholdClusterBuilderTool ExtraOutputs [] +ToolSvc.CscThesholdClusterBuilderTool split_fitter CscSplitClusterFitter/CscSplitClusterFitter +ToolSvc.CscThesholdClusterBuilderTool strip_fitter CalibCscStripFitter/CalibCscStripFitter +ToolSvc.CscThesholdClusterBuilderTool cscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscThesholdClusterBuilderTool default_fitter SimpleCscClusterFitter/SimpleCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool precision_fitter QratCscClusterFitter/QratCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool EvtStore StoreGateSvc +ToolSvc.CscThesholdClusterBuilderTool ExtraInputs [] +ToolSvc.CscThesholdClusterBuilderTool DetStore StoreGateSvc/DetectorStore +EventSelector SharedMemoryTool +EventSelector SkipEventSequence [] +EventSelector CounterTool +EventSelector Input [] +EventSelector ByteStreamInputSvc ByteStreamInputSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraOutputs [] +EventSelector.xAODMaker::EventInfoSelectorTool EvtStore StoreGateSvc +EventSelector.xAODMaker::EventInfoSelectorTool BeamCondSvc BeamCondSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraInputs [] +EventSelector.xAODMaker::EventInfoSelectorTool LuminosityTool LuminosityTool +EventSelector.xAODMaker::EventInfoSelectorTool DetStore StoreGateSvc/DetectorStore +ByteStreamInputSvc EventStore StoreGateSvc +ByteStreamInputSvc FullFileName ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +ByteStreamInputSvc AttributeListKeys [] +ByteStreamInputSvc MetaDataStore StoreGateSvc/InputMetaDataStore +EventPersistencySvc CnvServices ['ByteStreamCnvSvc', 'AthenaPoolCnvSvc/AthenaPoolCnvSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'AthenaPoolCnvSvc'] +ByteStreamCnvSvc InitCnvs ['EventInfo', 'ROIB::RoIBResult', 'HLT::HLTResult'] +ByteStreamCnvSvc EventStore StoreGateSvc +ByteStreamCnvSvc ROD2ROBmap [] +ByteStreamCnvSvc ByteStreamOutputSvcList [] +ByteStreamCnvSvc GetDetectorMask True +ROBDataProviderSvc filterRobWithStatus [] +ROBDataProviderSvc filterSubDetWithStatus [] +ByteStreamAddressProviderSvc TypeNames ['TileCellIDC/TileCellIDC', 'MdtDigitContainer/MDT_DIGITS', 'RpcDigitContainer/RPC_DIGITS', 'TgcDigitContainer/TGC_DIGITS', 'CscDigitContainer/CSC_DIGITS', 'ROIB::RecRoIBResult/RecRoIBResult', 'MuCTPI_RIO/MUCTPI_RIO', 'CTP_RIO/CTP_RIO', 'LArRawChannelContainer/LArRawChannels', 'TileRawChannelContainer/TileRawChannelCnt', 'ROIB::RoIBResult/RoIBResult', 'MuCTPI_RDO/MUCTPI_RDO', 'HLT::HLTResult/HLTResult_L2', 'HLT::HLTResult/HLTResult_EF', 'CTP_RDO/CTP_RDO', 'L1TopoRDOCollection/L1TopoRDOCollection'] +ByteStreamAddressProviderSvc TopoProcModuleID [129, 145] +ByteStreamAddressProviderSvc JetProcModuleID [172, 173] +ByteStreamAddressProviderSvc CaloClusterProcModuleID [168, 169, 170, 171] +MetaDataStore IncidentSvc IncidentSvc +MetaDataStore ProxyProviderSvc ProxyProviderSvc +InputMetaDataStore IncidentSvc IncidentSvc +InputMetaDataStore ProxyProviderSvc ProxyProviderSvc +MetaDataSvc MetaDataContainer MetaDataHdr +MetaDataSvc CnvSvc AthenaPoolCnvSvc +ProxyProviderSvc ProviderNames ['ByteStreamAddressProviderSvc', 'IOVDbSvc', 'MetaDataSvc', 'TagInfoMgr'] +GeoModelSvc SupportedGeometry 22 +GeoModelSvc AtlasVersion ATLAS-R2-2016-01-00-01 +GeoModelSvc.MuonDetectorTool ExtraOutputs [] +GeoModelSvc.MuonDetectorTool TheMuonAlignmentTool +GeoModelSvc.MuonDetectorTool EvtStore StoreGateSvc +GeoModelSvc.MuonDetectorTool UseConditionDb 1 +GeoModelSvc.MuonDetectorTool ExtraInputs [] +GeoModelSvc.MuonDetectorTool UseIlinesFromGM 1 +GeoModelSvc.MuonDetectorTool SelectedStJff [] +GeoModelSvc.MuonDetectorTool DetStore StoreGateSvc/DetectorStore +GeoModelSvc.MuonDetectorTool SelectedStations [] +GeoModelSvc.MuonDetectorTool SelectedStJzz [] +DetDescrCnvSvc IdDictFromRDB True +DetDescrCnvSvc IdDictName IdDictParser/ATLAS_IDS.xml +DetDescrCnvSvc DetectorNodes [] +DetDescrCnvSvc DetectorManagers [] +TagInfoMgr ExtraTagValuePairs ['AtlasRelease', 'Athena-22.0.1'] +RPCcablingServerSvc Atlas True +RPCcablingServerSvc useMuonRPC_CablingSvc True +RPCcablingServerSvc forcedUse True +IOVDbSvc Folders ['/MDT/CABLING/MEZZANINE_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_ETA<db>COOLONL_RPC/CONDBR2</db>', '/MDT/RTBLOB<db>COOLOFL_MDT/CONDBR2</db>', '/MDT/T0BLOB<db>COOLOFL_MDT/CONDBR2</db>', '/CSC/STAT <key>CSC_STAT</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/NOISE <key>CSC_NOISE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/PED <key>CSC_PED</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/RMS <key>CSC_RMS</key> <db>COOLOFL_CSC/CONDBR2</db>', '/GLOBAL/BField/Maps <noover/><db>COOLONL_GLOBAL/CONDBR2</db>', '/CSC/T0PHASE <key>CSC_T0PHASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/TGC/CABLING/MAP_SCHEMA<db>COOLONL_TGC/CONDBR2</db>', '/EXT/DCS/MAGNETS/SENSORDATA<db>COOLOFL_DCS/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA_CORR<db>COOLONL_RPC/CONDBR2</db>', '/MDT/CABLING/MAP_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_PHI<db>COOLONL_RPC/CONDBR2</db>', '/CSC/PSLOPE <key>CSC_PSLOPE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA<db>COOLONL_RPC/CONDBR2</db>', '/CSC/T0BASE <key>CSC_T0BASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/FTHOLD <key>CSC_FTHOLD</key> <db>COOLOFL_CSC/CONDBR2</db>'] +IOVDbSvc CacheAlign 3 +IOVDbSvc dbConnection sqlite://;schema=mycool.db;dbname=CONDBR2 +IOVDbSvc GlobalTag CONDBR2-BLKPA-2018-13 +IOVDbSvc FoldersToMetaData ['/GLOBAL/BField/Maps'] +IOVDbSvc DBInstance CONDBR2 +IOVDbSvc overrideTags [] +PoolSvc FrontierRefreshSchema [] +PoolSvc ReadCatalog ['apcfile:poolcond/PoolFileCatalog.xml', 'prfile:poolcond/PoolCat_oflcond.xml', 'apcfile:poolcond/PoolCat_oflcond.xml', 'prfile:poolcond/PoolCat_comcond.xml', 'apcfile:poolcond/PoolCat_comcond.xml'] +PoolSvc MaxFilesOpen 0 +DBReplicaSvc COOLSQLiteVetoPattern /DBRelease/ +MuonRPC_CablingSvc ConfFilePath MuonRPC_Cabling/ +MuonRPC_CablingSvc TheRpcTriggerDbTool RPCTriggerDbTool +MuonRPC_CablingSvc ConfFileName LVL1confAtlas.data +MuonRPC_CablingSvc FeetPadThresolds [] +MuonRPC_CablingSvc TheRpcCablingDbTool RPCCablingDbTool/RPCCablingDbTool +MuonRPC_CablingSvc RPCTriggerRoadsfromCool True +MuonRPC_CablingSvc CorrFileName LVL1confAtlas.corr +MuonRPC_CablingSvc CosmicConfiguration True +TGCcablingServerSvc Atlas True +TGCcablingServerSvc useMuonTGC_CablingSvc True +TGCcablingServerSvc forcedUse True +AthenaPoolCnvSvc InputPoolAttributes [] +AthenaPoolCnvSvc PoolAttributes [] +AthenaPoolCnvSvc PrintInputAttrPerEvt [] +AthenaPoolCnvSvc InputStreamingTool +AthenaPoolCnvSvc OutputPoolFileAllocator [] +AthenaPoolCnvSvc MaxFileSizes [] +MuonMDT_CablingSvc DBTool MDTCablingDbTool/MDTCablingDbTool +MuonMDT_CablingSvc TagInfoManager TagInfoMgr +MuonMDT_CablingSvc ForcedUse True +MuonMDT_CablingSvc UseOldCabling False +AtlasFieldSvc UseDCS True +MdtCalibrationDbSvc CreateSlewingFunctions False +MdtCalibrationDbSvc DBTool MuonCalib::MdtCalibDbAsciiTool +MdtCalibrationDbSvc CreateBFieldFunctions False +MdtCalibrationDbSvc CreateWireSagFunctions False +MdtCalibrationSvc DoTofCorrection True +MdtCalibrationSvc MagFieldSvc AtlasFieldSvc +MdtCalibrationSvc DoWireSagCorrection False +MdtCalibrationSvc TimeWindowSetting 2 +MdtCalibrationSvc DoSlewingCorrection False +MdtCalibrationSvc DoTemperatureCorrection True +MuonCalib::CscCoolStrSvc ParSGKeys ['CSC_PED', 'CSC_NOISE', 'CSC_PSLOPE', 'CSC_STAT', 'CSC_RMS', 'CSC_FTHOLD', 'CSC_T0BASE', 'CSC_T0PHASE'] +MuonCalib::CscCoolStrSvc ParDefaults ['2048', '3.5', '0.189', '0', '2.56', '0', '0', '0'] +MuonCalib::CscCoolStrSvc ParDataTypes ['float', 'float', 'float', 'uint32_t', 'float', 'float', 'float', 'float'] +MuonCalib::CscCoolStrSvc ParFolders ['/CSC/PED', '/CSC/NOISE', '/CSC/PSLOPE', '/CSC/STAT', '/CSC/RMS', '/CSC/FTHOLD', '/CSC/T0BASE', '/CSC/T0PHASE'] +MuonCalib::CscCoolStrSvc ParCats ['CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'ASM'] +MuonCalib::CscCoolStrSvc ParNames ['ped', 'noise', 'pslope', 'status', 'rms', 'f001', 't0base', 't0phase'] JOs reading stage finished, launching Athena from pickle file +Thu Mar 14 11:32:12 GMT 2019 +Preloading tcmalloc_minimal.so +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO including file "AthenaCommon/Preparation.py" +Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads +Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode.pkl ... +Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +[?1034hApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +ApplicationMgr SUCCESS +==================================================================================================================================== + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on ppevm02.ppe.gla.ac.uk on Thu Mar 14 11:32:26 2019 +==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +Py:Athena INFO including file "AthenaCommon/runbatch.py" +StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry +ClassIDSvc INFO getRegistryEntries: read 3383 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) +ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 +ROBDataProviderSvc INFO Initializing ROBDataProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 ROBDataProviderSvc INFO ---> Filter out empty ROB fragments = 'filterEmptyROB':False ROBDataProviderSvc INFO ---> Filter out specific ROBs by Status Code: # ROBs = 0 ROBDataProviderSvc INFO ---> Filter out Sub Detector ROBs by Status Code: # Sub Detectors = 0 @@ -1798,6 +2499,10 @@ ByteStreamAddre... INFO -- Will fill Store with id = 0 PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok] PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 +DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://frontier-atlas.lcg.triumf.ca:3128/ATLAS_frontier)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 1 servers found for host ppevm02.ppe.gla.ac.uk [ATLF ] +DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO Resolved path (via ATLAS_POOLCOND_PATH) is /cvmfs/atlas-condb.cern.ch/repo/conditions/poolcond/PoolFileCatalog.xml @@ -1806,13 +2511,26 @@ PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_ PoolSvc WARNING Unable to locate catalog for prfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml +DbSession INFO Open DbSession +Domain[ROOT_All] INFO > Access DbDomain READ [ROOT_All] IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once +IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbSvc INFO Global tag: CONDBR2-BLKPA-2018-13 set from joboptions IOVDbFolder INFO Inputfile tag override disabled for /GLOBAL/BField/Maps +IOVDbSvc INFO Folder /GLOBAL/BField/Maps will be written to file metadata IOVDbSvc INFO Initialised with 8 connections and 19 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully +MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 +AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 +ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 +MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 +ClassIDSvc INFO getRegistryEntries: read 3291 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4012 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3031 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -1893,6 +2611,10 @@ GeoModelSvc::RD...WARNING Getting PixTBMatComponents with default tag GeoModelSvc::RD...WARNING Getting PixTBMaterials with default tag GeoModelSvc::RD...WARNING Getting InDetMatComponents with default tag GeoModelSvc::RD...WARNING Getting InDetMaterials with default tag +GeoModelSvc.Muo... INFO create MuonDetectorTool - package version = MuonGeoModel-00-00-00 +GeoModelSvc.Muo... INFO (from GeoModelSvc) AtlasVersion = <ATLAS-R2-2016-01-00-01> MuonVersion = <> +GeoModelSvc.Muo... INFO Keys for Muon Switches are (key) ATLAS-R2-2016-01-00-01 (node) ATLAS +GeoModelSvc.Muo... INFO (from GeoModelSvc) in AtlasVersion = <ATLAS-R2-2016-01-00-01> default MuonVersion is <MuonSpectrometer-R.08.01> GeoModelSvc.Muo... INFO Properties have been set as follows: GeoModelSvc.Muo... INFO LayoutName R GeoModelSvc.Muo... INFO IncludeCutouts 0 @@ -2007,6 +2729,7 @@ AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! MuGM:MuonFactory INFO MMIDHELPER retrieved from DetStore MuGM:MuonFactory INFO **************** MuonDetectorFactory001 ************************ MuGM:MuonFactory INFO *** Start building the Muon Geometry Tree ********************** +MuGM:RDBReadAtlas INFO Start retriving dbObjects with tag = <ATLAS-R2-2016-01-00-01> node <ATLAS> RDBAccessSvc WARNING Could not get the tag for XtomoData node. Returning 0 pointer to IRDBQuery MuGM:RDBReadAtlas INFO After getQuery XtomoData In DblQ00Xtomo(data) @@ -2036,6 +2759,7 @@ MuGM:ProcCutouts INFO Processing Cutouts DONE MuGM:RDBReadAtlas INFO ProcessTGCreadout - version 7 wirespacing 1.8 MuGM:RDBReadAtlas INFO Intermediate Objects built from primary numbers MuGM:MuonFactory INFO theMaterialManager retrieven successfully from the DetStore +MuGM:MuonFactory INFO MuonSystem description from OracleTag=<ATLAS-R2-2016-01-00-01> and node=<ATLAS> MuGM:MuonFactory INFO TreeTop added to the Manager MuGM:MuonFactory INFO Muon Layout R.08.01 MuGM:MuonFactory INFO Fine Clash Fixing disabled: (should be ON/OFF for Simulation/Reconstruction) @@ -2059,9 +2783,13 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 44888Kb Time = 1.04S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL +ClassIDSvc INFO getRegistryEntries: read 1455 CLIDRegistry entries for module ALL +AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 +ClassIDSvc INFO getRegistryEntries: read 1794 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... CondInputLoader INFO Adding base classes: + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) -> @@ -2071,12 +2799,17 @@ CondInputLoader INFO Will create WriteCondHandle dependencies for the follo + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) +ClassIDSvc INFO getRegistryEntries: read 1370 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 743 CLIDRegistry entries for module ALL RpcRawDataProvider INFO RpcRawDataProvider::initialize RpcRawDataProvider INFO 'DoSeededDecoding':False +ClassIDSvc INFO getRegistryEntries: read 1699 CLIDRegistry entries for module ALL +MuonRPC_CablingSvc INFO Initializing MuonRPC_CablingSvc - package version MuonRPC_Cabling-00-00-00 ToolSvc.RPCCabl... INFO Initializing - folders names are: conf /RPC/CABLING/MAP_SCHEMA / corr /RPC/CABLING/MAP_SCHEMA_CORR MuonRPC_CablingSvc INFO RPCCablingDbTool retrieved with statusCode = SUCCESS with handle TheRpcCablingDbTool = PublicToolHandle('RPCCablingDbTool/RPCCablingDbTool') MuonRPC_CablingSvc INFO Register call-back against 2 folders listed below MuonRPC_CablingSvc INFO Folder n. 1 </RPC/CABLING/MAP_SCHEMA> found in the DetStore +ClassIDSvc INFO getRegistryEntries: read 501 CLIDRegistry entries for module ALL MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA> MuonRPC_CablingSvc INFO Folder n. 2 </RPC/CABLING/MAP_SCHEMA_CORR> found in the DetStore MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA_CORR> @@ -2091,25 +2824,32 @@ RpcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') RpcRawDataProvi... INFO Tool = RpcRawDataProvider.RPC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc RpcRawDataProvi... INFO initialize() successful in RpcRawDataProvider.RPC_RawDataProviderTool TgcRawDataProvider INFO TgcRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 878 CLIDRegistry entries for module ALL TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder TgcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') TgcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize +ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x161ac100]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL MdtRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') MdtRawDataProvi... INFO Processing configuration for layouts with BME chambers. MdtRawDataProvi... INFO Processing configuration for layouts with BMG chambers. MdtRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') MdtRawDataProvi... INFO Tool = MdtRawDataProvider.MDT_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MdtRawDataProvi... INFO initialize() successful in MdtRawDataProvider.MDT_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 658 CLIDRegistry entries for module ALL CscRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') CscRawDataProvi... INFO Tool = CscRawDataProvider.CSC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc CscRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') CscRawDataProvi... INFO The Muon Geometry version is R.08.01 CscRawDataProvi... INFO initialize() successful in CscRawDataProvider.CSC_RawDataProviderTool +ClassIDSvc INFO getRegistryEntries: read 53 CLIDRegistry entries for module ALL +RpcRdoToRpcPrep... INFO package version = MuonRPC_CnvTools-00-00-00 RpcRdoToRpcPrep... INFO properties are RpcRdoToRpcPrep... INFO processingData 0 RpcRdoToRpcPrep... INFO produceRpcCoinDatafromTriggerWords 1 @@ -2124,18 +2864,31 @@ RpcRdoToRpcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::RpcR TgcRdoToTgcPrep... INFO initialize() successful in TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool TgcRdoToTgcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') MdtCalibrationSvc INFO Processing configuration for layouts with BMG chambers. +ClassIDSvc INFO getRegistryEntries: read 194 CLIDRegistry entries for module ALL AtlasFieldSvc INFO initialize() ... AtlasFieldSvc INFO maps will be chosen reading COOL folder /GLOBAL/BField/Maps +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL AtlasFieldSvc INFO magnet currents will be read from COOL folder /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO Booked callback for /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO initialize() successful MdtRdoToMdtPrep... INFO Processing configuration for layouts with BME chambers. MdtRdoToMdtPrep... INFO Processing configuration for layouts with BMG chambers. MdtRdoToMdtPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for module ALL CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc +ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. +EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... @@ -2147,10 +2900,12 @@ ToolSvc.Luminos... INFO BunchLumisTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO BunchGroupTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO LBLBFolderName is empty, skipping... EventSelector INFO Retrieved InputCollections from InputSvc +ByteStreamInputSvc INFO Initializing ByteStreamInputSvc - package version ByteStreamCnvSvc-00-00-00 EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully ByteStreamInputSvc INFO Picked valid file: /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 +ClassIDSvc INFO getRegistryEntries: read 1159 CLIDRegistry entries for module ALL CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' @@ -2228,6 +2983,7 @@ phi high-pt mu11 mu15 mu15 RPCcabling INFO CablingRPC---InitMaps from COOL: going to read configuration +RPCcabling INFO CablingRPC--->> RPC cabling map from COOL << RPCcabling INFO CablingRPC--- ReadConf: map has size 222202 RPCcabling INFO CablingRPC--- ReadConf: map n. of lines read is 924 RPCcabling INFO CablingRPC--- ReadConf: version is 5.0 Atlas R_07_03_RUN2ver104 @@ -2265,13 +3021,19 @@ AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] Toroids_SCurrent , 4 , 20397.7 AtlasFieldSvc INFO Currents read from DCS: solenoid 7729.99 toroid 20399.9 AtlasFieldSvc INFO Initializing the field map (solenoidCurrent=7729.99 toroidCurrent=20399.9) +AtlasFieldSvc INFO reading the map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +AtlasFieldSvc INFO Initialized the field map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +ClassIDSvc INFO getRegistryEntries: read 672 CLIDRegistry entries for module ALL AthenaEventLoopMgr INFO ===>>> start processing event #186525031, run #327265 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMapSchema_BMG_01 for folder /MDT/CABLING/MAP_SCHEMA IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMezzanineSchema_M5-RUN2 for folder /MDT/CABLING/MEZZANINE_SCHEMA IOVDbSvc INFO Disconnecting from COOLONL_MDT/CONDBR2 MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) readCdoMez->size()= 24 +MuonMDT_CablingAlg INFO Range of input is {[0,l:0] - [INVALID]} MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) readCdoMap->size()= 2312 +MuonMDT_CablingAlg INFO Range of input is {[327264,l:4294640031] - [327265,l:4294640030]} +MuonMDT_CablingAlg INFO recorded new MuonMDT_CablingMap with range {[327264,l:4294640031] - [327265,l:4294640030]} into Conditions Store AthenaEventLoopMgr INFO ===>>> done processing event #186525031, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186524665, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> done processing event #186524665, run #327265 2 events processed so far <<<=== @@ -2311,11 +3073,42 @@ AthenaEventLoopMgr INFO ===>>> start processing event #186568452, run #3272 AthenaEventLoopMgr INFO ===>>> done processing event #186568452, run #327265 19 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186580451, run #327265 19 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> done processing event #186580451, run #327265 20 events processed so far <<<=== +Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully +IncidentProcAlg1 INFO Finalize CondInputLoader INFO Finalizing CondInputLoader... +IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/25 (( 0.27 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/271 (( 0.60 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216598 (( 0.81 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/300 (( 0.55 ))s +IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/444470 (( 0.62 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/58804 (( 0.52 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562972 (( 1.13 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8101322 (( 0.97 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/7408 (( 0.58 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/331329 (( 1.05 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/359591 (( 0.51 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422629 (( 0.52 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/363009 (( 0.48 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422831 (( 0.55 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/236289 (( 0.48 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322855 (( 0.52 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3234 (( 0.37 ))s +IOVDbSvc INFO bytes in (( 10.52 ))s +IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.36 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.24 ))s +IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 4.48 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.60 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.58 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.27 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -2339,6 +3132,8 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** +cObj_ALL INFO Time User : Tot= 10 [ms] Ave/Min/Max=0.556(+- 2.29)/ 0/ 10 [ms] #= 18 +ChronoStatSvc INFO Time User : Tot= 10.9 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref index bca879f265a7..88e725e64ae7 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref @@ -1,9 +1,44 @@ Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : [function] +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -37,12 +72,116 @@ Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/By Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job Py:ComponentAccumulator DEBUG Merging algorithm MuonCacheCreator to a sequence AthAlgSeq +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] dynamically loading the flag Detector Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : [function] +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : [function] +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : [function] +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : [function] +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : [function] +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : [function] +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : [function] +Input.RunNumber : [function] +Input.isMC : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -329,10 +468,169 @@ Py:ComponentAccumulator DEBUG Adding component EvtPersistencySvc/EventPersiste Py:ComponentAccumulator DEBUG Adding component MagField::AtlasFieldSvc/AtlasFieldSvc to the job dynamically loading the flag Muon Flag Name : Value +Beam.BunchSpacing : 25 +Beam.Energy : [function] +Beam.NumberOfCollisions : 0 +Beam.Type : 'collisions' +Beam.estimatedLuminosity : [function] +Calo.Noise.fixedLumiForNoise : -1 +Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTreatEnergyCutAsAbsol : False +Calo.TopoCluster.doTwoGaussianNoise : True +Common.Project : 'Athena' +Common.isOnline : False +Concurrency.NumConcurrentEvents : 0 +Concurrency.NumProcs : 0 +Concurrency.NumThreads : 0 +Detector.Geometry : [function] +Detector.GeometryAFP : False +Detector.GeometryALFA : False +Detector.GeometryBCM : False +Detector.GeometryBpipe : False +Detector.GeometryCSC : False +Detector.GeometryCalo : [function] +Detector.GeometryCavern : False +Detector.GeometryDBM : False +Detector.GeometryForward : [function] +Detector.GeometryFwdRegion : False +Detector.GeometryID : [function] +Detector.GeometryLAr : False +Detector.GeometryLucid : False +Detector.GeometryMDT : False +Detector.GeometryMM : False +Detector.GeometryMuon : [function] +Detector.GeometryPixel : False +Detector.GeometryRPC : False +Detector.GeometrySCT : False +Detector.GeometryTGC : False +Detector.GeometryTRT : False +Detector.GeometryTile : False +Detector.GeometryZDC : False +Detector.GeometrysTGC : False +Detector.Overlay : [function] +Detector.OverlayBCM : False +Detector.OverlayCSC : False +Detector.OverlayCalo : [function] +Detector.OverlayDBM : False +Detector.OverlayID : [function] +Detector.OverlayLAr : False +Detector.OverlayMDT : False +Detector.OverlayMM : False +Detector.OverlayMuon : [function] +Detector.OverlayPixel : False +Detector.OverlayRPC : False +Detector.OverlaySCT : False +Detector.OverlayTGC : False +Detector.OverlayTRT : False +Detector.OverlayTile : False +Detector.OverlaysTGC : False +Detector.Simulate : False +Detector.SimulateAFP : False +Detector.SimulateALFA : False +Detector.SimulateBCM : False +Detector.SimulateBpipe : False +Detector.SimulateCSC : False +Detector.SimulateCalo : False +Detector.SimulateCavern : False +Detector.SimulateDBM : False +Detector.SimulateForward : False +Detector.SimulateFwdRegion : False +Detector.SimulateHGTD : False +Detector.SimulateID : False +Detector.SimulateLAr : False +Detector.SimulateLucid : False +Detector.SimulateMDT : False +Detector.SimulateMM : False +Detector.SimulateMuon : False +Detector.SimulatePixel : False +Detector.SimulateRPC : False +Detector.SimulateSCT : False +Detector.SimulateTGC : False +Detector.SimulateTRT : False +Detector.SimulateTile : False +Detector.SimulateZDC : False +Detector.SimulatesTGC : False +GeoModel.Align.Dynamic : [function] +GeoModel.AtlasVersion : 'ATLAS-R2-2016-01-00-01' +GeoModel.Layout : 'atlas' +GeoModel.Run : 'RUN2' +GeoModel.StripGeoType : 'GMX' +IOVDb.DatabaseInstance : 'CONDBR2' +IOVDb.GlobalTag : 'CONDBR2-BLKPA-2018-13' +Input.Files : ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +Input.ProjectName : 'data17_13TeV' +Input.RunNumber : [function] +Input.isMC : False +Muon.Align.UseALines : False +Muon.Align.UseAsBuilt : False +Muon.Align.UseBLines : 'none' +Muon.Align.UseILines : False +Muon.Calib.CscF001FromLocalFile : False +Muon.Calib.CscNoiseFromLocalFile : False +Muon.Calib.CscPSlopeFromLocalFile : False +Muon.Calib.CscPedFromLocalFile : False +Muon.Calib.CscRmsFromLocalFile : False +Muon.Calib.CscStatusFromLocalFile : False +Muon.Calib.CscT0BaseFromLocalFile : False +Muon.Calib.CscT0PhaseFromLocalFile : False +Muon.Calib.EventTag : 'MoMu' +Muon.Calib.applyRtScaling : True +Muon.Calib.correctMdtRtForBField : False +Muon.Calib.correctMdtRtForTimeSlewing : False +Muon.Calib.correctMdtRtWireSag : False +Muon.Calib.mdtCalibrationSource : 'MDT' +Muon.Calib.mdtMode : 'ntuple' +Muon.Calib.mdtPropagationSpeedBeta : 0.85 +Muon.Calib.readMDTCalibFromBlob : True +Muon.Calib.useMLRt : True +Muon.Chi2NDofCut : 20.0 +Muon.createTrackParticles : True +Muon.doCSCs : True +Muon.doDigitization : True +Muon.doFastDigitization : False +Muon.doMDTs : True +Muon.doMSVertex : False +Muon.doMicromegas : False +Muon.doPseudoTracking : False +Muon.doRPCClusterSegmentFinding : False +Muon.doRPCs : True +Muon.doSegmentT0Fit : False +Muon.doTGCClusterSegmentFinding : False +Muon.doTGCs : True +Muon.dosTGCs : False +Muon.enableCurvedSegmentFinding : False +Muon.enableErrorTuning : False +Muon.optimiseMomentumResolutionUsingChi2 : False +Muon.patternsOnly : False +Muon.prdToxAOD : False +Muon.printSummary : False +Muon.refinementTool : 'Moore' +Muon.rpcRawToxAOD : False +Muon.segmentOrigin : 'Muon' +Muon.straightLineFitMomentum : 2000.0 +Muon.strategy : [] +Muon.trackBuilder : 'Moore' +Muon.updateSegmentSecondCoordinate : [function] +Muon.useAlignmentCorrections : False +Muon.useLooseErrorTuning : False +Muon.useSegmentMatching : [function] +Muon.useTGCPriorNextBC : False +Muon.useTrackSegmentMatching : True +Muon.useWireSagCorrections : False +Output.AODFileName : 'myAOD.pool.root' +Output.ESDFileName : 'myESD.pool.root' +Output.EVNTFileName : 'myEVNT.pool.root' +Output.HISTFileName : 'myHIST.root' +Output.HITSFileName : 'myHITS.pool.root' +Output.RDOFileName : 'myROD.pool.root' +Output.doESD : False +Scheduler.CheckDependencies : True +Scheduler.ShowControlFlow : False +Scheduler.ShowDataDeps : False +Scheduler.ShowDataFlow : False Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py -Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py @@ -355,12 +653,31 @@ Py:ComponentAccumulator DEBUG Adding component CondSvc/CondSvc to the job Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderSvc to the job Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... +Py:ConfigurableDb DEBUG loading confDb files... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonByteStream.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/WorkDir.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG loading confDb files... [DONE] +Py:ConfigurableDb DEBUG loaded 1103 confDb packages +Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... +Py:ConfigurableDb DEBUG : Found configurable <class 'PoolSvc.PoolSvcConf.PoolSvc'> in module PoolSvc.PoolSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaServices.AthenaServicesConf.MetaDataSvc'> in module AthenaServices.AthenaServicesConf +Py:ConfigurableDb DEBUG : Found configurable <class 'StoreGate.StoreGateConf.StoreGateSvc'> in module StoreGate.StoreGateConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDbSvc... +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... +EventInfoMgtInit: Got release version Athena-22.0.1 Py:Configurable ERROR attempt to add a duplicate (ServiceManager.EventPersistencySvc) ... dupe ignored +Py:ConfigurableDb DEBUG : Found configurable <class 'SGComps.SGCompsConf.ProxyProviderSvc'> in module SGComps.SGCompsConf Py:Configurable ERROR attempt to add a duplicate (ServiceManager.ProxyProviderSvc) ... dupe ignored Py:loadBasicEventInfoMgt DEBUG Loading basic services for EventInfoMgt... [DONE] Py:loadBasicIOVDb DEBUG Loading basic services for IOVDb... [DONE] @@ -583,6 +900,7 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersi Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonRPC_CnvTools.MuonRPC_CnvToolsConf.Muon__RpcRDO_Decoder'> in module MuonRPC_CnvTools.MuonRPC_CnvToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool to the job Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc @@ -1080,6 +1398,8 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component EventPersi Py:ComponentAccumulator DEBUG Reconciled configuration of component TagInfoMgr Py:ComponentAccumulator DEBUG Reconciled configuration of component ProxyProviderSvc Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Muon::MuonIdHelperTool +Py:ConfigurableDb DEBUG : Found configurable <class 'MuonCSC_CnvTools.MuonCSC_CnvToolsConf.Muon__CscRDO_Decoder'> in module MuonCSC_CnvTools.MuonCSC_CnvToolsConf +Py:ConfigurableDb DEBUG : Found configurable <class 'CscCalibTools.CscCalibToolsConf.CscCalibTool'> in module CscCalibTools.CscCalibToolsConf Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Reconciled configuration of component CondInputLoader Py:ComponentAccumulator DEBUG Reconciled configuration of component GeoModelSvc @@ -1097,8 +1417,13 @@ Py:ComponentAccumulator DEBUG Reconciled configuration of component ToolSvc.Mu Py:ComponentAccumulator DEBUG Adding component Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job Py:ComponentAccumulator DEBUG Adding component CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool to the job +Py:ConfigurableDb DEBUG : Found configurable <class 'AthenaPoolCnvSvc.AthenaPoolCnvSvcConf.AthenaPoolCnvSvc'> in module AthenaPoolCnvSvc.AthenaPoolCnvSvcConf Py:ComponentAccumulator DEBUG Reconciled configuration of component AthenaPoolCnvSvc Py:Athena INFO Print Config +Py:ComponentAccumulator INFO Event Inputs +Py:ComponentAccumulator INFO set([]) +Py:ComponentAccumulator INFO Event Algorithm Sequences +Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ************************************************************ |-Atomic = False |-AuditAlgorithms = False |-AuditBeginRun = False @@ -1110,20 +1435,29 @@ Py:Athena INFO Print Config |-AuditRestart = False |-AuditStart = False |-AuditStop = False +|-Cardinality = 0 |-ContinueEventloopOnFPE = False +|-DetStore @0x7f0461dd3e90 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 +|-EvtStore @0x7f0461dd3e10 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f0460462098 = [] (default: []) +|-ExtraOutputs @0x7f0460462200 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False +|-Members @0x7f0460410e18 = ['MuonCacheCreator/MuonCacheCreator', 'Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f04604622d8 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False +|-Sequential = False |-StopOverride = False |-TimeOut = 0.0 +|-Timeline = True |=/***** Algorithm MuonCacheCreator/MuonCacheCreator ************************************************* | |-AuditAlgorithms = False | |-AuditBeginRun = False @@ -1135,15 +1469,26 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 0 +| |-CscCacheKey @0x7f0460cef870 = 'CscCache' (default: 'StoreGateSvc+') +| |-DetStore @0x7f0460a5db10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DisableViewWarning = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460a5da90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f0460462320 = [] (default: []) +| |-ExtraOutputs @0x7f0460462488 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False +| |-MdtCsmCacheKey @0x7f0460cef510 = 'MdtCsmCache' (default: 'StoreGateSvc+') | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462368 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-RpcCacheKey @0x7f0460cef540 = 'RpcCache' (default: 'StoreGateSvc+') +| |-TgcCacheKey @0x7f0460cef570 = 'TgcCache' (default: 'StoreGateSvc+') +| |-Timeline = True | \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** | |-AuditAlgorithms = False @@ -1156,29 +1501,45 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False -| |-DoSeededDecoding = False +| |-Cardinality = 1 +| |-DetStore @0x7f0460a44d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding @0x7f0463486b00 = True (default: False) | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460a44cd0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f04604623f8 = [] (default: []) +| |-ExtraOutputs @0x7f0460462518 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f04604623b0 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f0460c6f680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f0460a44dd0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-RoIs @0x7f0462ce6e70 = 'MURoIs' (default: 'StoreGateSvc+OutputRoIs') +| |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' -| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f0460cc9620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f046098b5d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f046098b610 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f0460a23518 = [] (default: []) +| | |-ExtraOutputs @0x7f0460a23560 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x171a1c0 = 2 (default: 0) +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-RpcContainerCacheKey @0x7f0460cef540 = 'RpcCache' (default: 'StoreGateSvc+') +| | |-WriteOutRpcSectorLogic @0x7f0463486b20 = False (default: True) | | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** | | | |-AuditFinalize = False | | | |-AuditInitialize = False @@ -1188,6 +1549,10 @@ Py:Athena INFO Print Config | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f046098b6d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f046098b710 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f0460a232d8 = [] (default: []) +| | | |-ExtraOutputs @0x7f0460a23290 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -1206,15 +1571,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f0460a50d10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460a50c90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f04604627a0 = [] (default: []) +| |-ExtraOutputs @0x7f0460462878 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f04604627e8 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f0461b828c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1223,7 +1596,12 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-Decoder @0x7f0461b829b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f0460927c10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f0460927c50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f046092b9e0 = [] (default: []) +| | |-ExtraOutputs @0x7f046092b830 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -1235,6 +1613,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f0460927d10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f0460927d50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f046092b680 = [] (default: []) +| | | |-ExtraOutputs @0x7f046092b7e8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -1253,15 +1635,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f0460bf7f50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460bf7ed0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f04604628c0 = [] (default: []) +| |-ExtraOutputs @0x7f0460462950 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462830 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f0460d70d50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1270,7 +1660,14 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-CsmContainerCacheKey @0x7f0460cef510 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f0461b82c80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f04604e7d10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f04604e7d50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f04604eca70 = [] (default: []) +| | |-ExtraOutputs @0x7f04604ecb48 = [] (default: []) | | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x171a1d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+MDTCSM' | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' | | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** @@ -1281,6 +1678,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f04604e7e10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f04604e7e50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f04604ec950 = [] (default: []) +| | | |-ExtraOutputs @0x7f04604ec908 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -1299,15 +1700,23 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f0460bf7190 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460bf7110 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f04604629e0 = [] (default: []) +| |-ExtraOutputs @0x7f0460462908 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462710 = [] (default: []) | |-OutputLevel = 0 +| |-ProviderTool @0x7f04604b2050 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False +| |-Timeline = True | |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1316,8 +1725,15 @@ Py:Athena INFO Print Config | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False +| | |-CscContainerCacheKey @0x7f0460cef870 = 'CscCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7f0461b82e60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f04604aabd0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f04604aac10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f046047c248 = [] (default: []) +| | |-ExtraOutputs @0x7f046047c560 = [] (default: []) | | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x171a1d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+CSCRDO' | | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** | | | |-AuditFinalize = False @@ -1327,6 +1743,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f04604aacd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f04604aad10 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f046047c368 = [] (default: []) +| | | |-ExtraOutputs @0x7f046047c320 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1345,19 +1765,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f0460b59d20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f04603e4690 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f04603e4610 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f04604626c8 = [] (default: []) +| |-ExtraOutputs @0x7f0460462b00 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462a28 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f0463486b20 = False (default: False) +| |-RegionSelectionSvc @0x7f04603e4710 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1367,11 +1797,16 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f046044b850 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f046044b8d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f04604bac68 = [] (default: []) +| | |-ExtraOutputs @0x7f04604bacf8 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f04604c22f0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1389,6 +1824,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f046044b950 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f046044b990 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f04604baf38 = [] (default: []) +| | | |-ExtraOutputs @0x7f04604baef0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1405,20 +1844,30 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f046045e050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f046043e590 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f046043e510 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f0460462998 = [] (default: []) +| |-ExtraOutputs @0x7f0460462b48 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462b90 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f0463486b20 = False (default: False) +| |-RegionSelectorSvc @0x7f046043e610 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 +| |-Timeline = True | |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1428,6 +1877,10 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True +| | |-DetStore @0x7f046044bad0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f046044ba10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f046045cb48 = [] (default: []) +| | |-ExtraOutputs @0x7f046045c2d8 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1436,7 +1889,9 @@ Py:Athena INFO Print Config | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f046045c710 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f046045cbd8 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1452,19 +1907,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f0462d00b50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f04603d8550 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f04603d84d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f0460462c20 = [] (default: []) +| |-ExtraOutputs @0x7f0460462cb0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462c68 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f0463486b20 = False (default: False) +| |-RegionSelectionSvc @0x7f04603d85d0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1475,9 +1940,13 @@ Py:Athena INFO Print Config | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True +| | |-DetStore @0x7f046044bcd0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True +| | |-EvtStore @0x7f046044bd90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f046046b488 = [] (default: []) +| | |-ExtraOutputs @0x7f046046b368 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1504,19 +1973,29 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f0460b225a0 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f0460446b50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f0460446a50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f0460462d88 = [] (default: []) +| |-ExtraOutputs @0x7f0460462a70 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462cf8 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False +| |-PrintPrepData @0x7f0463486b20 = False (default: False) +| |-RegionSelectionSvc @0x7f0460446bd0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True | |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** | | |-AuditFinalize = False | | |-AuditInitialize = False @@ -1526,7 +2005,13 @@ Py:Athena INFO Print Config | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f0462d69b10 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f0460468c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True +| | |-DetStore @0x7f046044b9d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f0460471090 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f046045f128 = [] (default: []) +| | |-ExtraOutputs @0x7f046045fb48 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1539,6 +2024,10 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-DetStore @0x7f04604710d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f0460471110 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f046045fdd0 = [] (default: []) +| | | |-ExtraOutputs @0x7f04609a9290 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -1565,6 +2054,11 @@ Py:Athena INFO Print Config | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False +| | | |-CscCalibTool @0x7f046044bfd0 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f046044bf90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f0460471050 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f0460996998 = [] (default: []) +| | | |-ExtraOutputs @0x7f046092bf38 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -1581,524 +2075,472 @@ Py:Athena INFO Print Config | |-AuditRestart = False | |-AuditStart = False | |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f046035c390 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 +| |-EvtStore @0x7f046035c310 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f0460462dd0 = [] (default: []) +| |-ExtraOutputs @0x7f0460462e18 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f0460462e60 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f046040ecd0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +Py:ComponentAccumulator INFO Condition Algorithms +Py:ComponentAccumulator INFO ['CondInputLoader', 'MuonMDT_CablingAlg'] +Py:ComponentAccumulator INFO Services +Py:ComponentAccumulator INFO ['EventSelector', 'ByteStreamInputSvc', 'EventPersistencySvc', 'ByteStreamCnvSvc', 'ROBDataProviderSvc', 'ByteStreamAddressProviderSvc', 'MetaDataStore', 'InputMetaDataStore', 'MetaDataSvc', 'ProxyProviderSvc', 'ByteStreamAttListMetadataSvc', 'GeoModelSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'RPCcablingServerSvc', 'IOVDbSvc', 'PoolSvc', 'CondSvc', 'DBReplicaSvc', 'MuonRPC_CablingSvc', 'LVL1TGC::TGCRecRoiSvc', 'TGCcablingServerSvc', 'AthenaPoolCnvSvc', 'MuonMDT_CablingSvc', 'AtlasFieldSvc', 'MdtCalibrationDbSvc', 'MdtCalibrationSvc', 'CSCcablingSvc', 'MuonCalib::CscCoolStrSvc'] +Py:ComponentAccumulator INFO Outputs +Py:ComponentAccumulator INFO {} +Py:ComponentAccumulator INFO Public Tools +Py:ComponentAccumulator INFO [ +Py:ComponentAccumulator INFO IOVDbMetaDataTool/IOVDbMetaDataTool, +Py:ComponentAccumulator INFO ByteStreamMetadataTool/ByteStreamMetadataTool, +Py:ComponentAccumulator INFO Muon::MuonIdHelperTool/Muon::MuonIdHelperTool, +Py:ComponentAccumulator INFO RPCCablingDbTool/RPCCablingDbTool, +Py:ComponentAccumulator INFO Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool, +Py:ComponentAccumulator INFO MDTCablingDbTool/MDTCablingDbTool, +Py:ComponentAccumulator INFO MuonCalib::MdtCalibDbCoolStrTool/MuonCalib::MdtCalibDbCoolStrTool, +Py:ComponentAccumulator INFO Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool, +Py:ComponentAccumulator INFO Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool, +Py:ComponentAccumulator INFO Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool, +Py:ComponentAccumulator INFO Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool, +Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool, +Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, +Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config -/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ -|-Atomic = False -|-AuditAlgorithms = False -|-AuditBeginRun = False -|-AuditEndRun = False -|-AuditExecute = False -|-AuditFinalize = False -|-AuditInitialize = False -|-AuditReinitialize = False -|-AuditRestart = False -|-AuditStart = False -|-AuditStop = False -|-ContinueEventloopOnFPE = False -|-Enable = True -|-ErrorCounter = 0 -|-ErrorMax = 1 -|-FilterCircularDependencies = True -|-IgnoreFilterPassed = False -|-IsIOBound = False -| (default: []) -|-ModeOR = False -|-MonitorService = 'MonitorSvc' -|-OutputLevel = 0 -|-RegisterForContextService = False -|-StopOverride = False -|-TimeOut = 0.0 -|=/***** Algorithm MuonCacheCreator/MuonCacheCreator ************************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-DisableViewWarning = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| |-RegisterForContextService = False -| \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- -|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' -| | |-RdoLocation = 'StoreGateSvc+RPCPAD' -| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-DataErrorPrintLimit = 1000 -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-Sector13Data = False -| | | |-SpecialROBNumber = -1 -| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') -| | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel = 0 -| | |-RdoLocation = 'StoreGateSvc+TGCRDO' -| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-ShowStatusWords = False -| | | |-SkipCoincidence = False -| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-MonitorService = 'MonitorSvc' -| | |-RdoLocation = 'StoreGateSvc+MDTCSM' -| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | | |-SpecialROBNumber = -1 -| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ -|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') -| |-RegisterForContextService = False -| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-EventInfoKey = 'StoreGateSvc+EventInfo' -| | |-MonitorService = 'MonitorSvc' -| | |-RdoLocation = 'StoreGateSvc+CSCRDO' -| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-IsCosmics = False -| | | |-IsOldCosmics = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- -| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- -| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ -|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-DecodeData = True -| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+RPCPAD' -| | |-OutputLevel = 0 -| | |-RPCInfoFromDb = False -| | | (default: 'Muon::RpcRDO_Decoder') -| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' -| | |-etaphi_coincidenceTime = 20.0 -| | |-overlap_timeTolerance = 10.0 -| | |-processingData = False -| | |-produceRpcCoinDatafromTriggerWords = True -| | |-reduceCablingOverlap = True -| | |-solvePhiAmbiguities = True -| | |-timeShift = -12.5 -| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- -| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- -| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- -|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |-Setting = 0 -| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-DecodeData = True -| | |-FillCoinData = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' -| | |-OutputCollection = 'TGC_Measurements' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+TGCRDO' -| | |-TGCHashIdOffset = 26000 -| | |-dropPrdsWithZeroWidth = True -| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | |-show_warning_level_invalid_A09_SSW6_hit = False -| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- -| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- -|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CalibratePrepData = True -| | |-DecodeData = True -| | |-DiscardSecondaryHitTwin = False -| | |-DoPropagationCorrection = False -| | |-DoTofCorrection = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+MDTCSM' -| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' -| | |-SortPrepData = False -| | |-TimeWindowLowerBound = -1000000.0 -| | |-TimeWindowSetting = 2 -| | |-TimeWindowUpperBound = -1000000.0 -| | |-TwinCorrectSlewing = False -| | |-Use1DPrepDataTwin = False -| | |-UseAllBOLTwin = False -| | |-UseTwin = True -| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- -| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- -|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') -| |-DoSeededDecoding = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' -| |-OutputLevel = 0 -| |-PrintInputRdo = False -| |-RegisterForContextService = False -| |-RoIs = 'StoreGateSvc+OutputRoIs' -| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** -| | |-AuditFinalize = False -| | |-AuditInitialize = False -| | |-AuditReinitialize = False -| | |-AuditRestart = False -| | |-AuditStart = False -| | |-AuditStop = False -| | |-AuditTools = False -| | |-CSCHashIdOffset = 22000 -| | |-DecodeData = True -| | |-MonitorService = 'MonitorSvc' -| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' -| | |-OutputLevel = 0 -| | |-RDOContainer = 'StoreGateSvc+CSCRDO' -| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-IsOnline = True -| | | |-Latency = 100.0 -| | | |-MonitorService = 'MonitorSvc' -| | | |-NSamples = 4 -| | | |-Noise = 3.5 -| | | |-OutputLevel = 0 -| | | |-Pedestal = 2048.0 -| | | |-ReadFromDatabase = True -| | | |-Slope = 0.19 -| | | |-SlopeFromDatabase = False -| | | |-TimeOffsetRange = 1.0 -| | | |-Use2Samples = False -| | | |-integrationNumber = 12.0 -| | | |-integrationNumber2 = 11.66 -| | | |-samplingTime = 50.0 -| | | |-signalWidth = 14.4092 -| | | |-timeOffset = 46.825 -| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- -| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** -| | | |-AuditFinalize = False -| | | |-AuditInitialize = False -| | | |-AuditReinitialize = False -| | | |-AuditRestart = False -| | | |-AuditStart = False -| | | |-AuditStop = False -| | | |-AuditTools = False -| | | |-MonitorService = 'MonitorSvc' -| | | |-OutputLevel = 0 -| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- -| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- -| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- -|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** -| |-AuditAlgorithms = False -| |-AuditBeginRun = False -| |-AuditEndRun = False -| |-AuditExecute = False -| |-AuditFinalize = False -| |-AuditInitialize = False -| |-AuditReinitialize = False -| |-AuditRestart = False -| |-AuditStart = False -| |-AuditStop = False -| |-Enable = True -| |-ErrorCounter = 0 -| |-ErrorMax = 1 -| |-FilterCircularDependencies = True -| |-IsIOBound = False -| |-MonitorService = 'MonitorSvc' -| |-OutputLevel = 0 -| |-RegisterForContextService = False -| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') -| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- -\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- +MuonCacheCreator ExtraOutputs [] +MuonCacheCreator MdtCsmCacheKey MdtCsmCache +MuonCacheCreator TgcCacheKey TgcCache +MuonCacheCreator CscCacheKey CscCache +MuonCacheCreator RpcCacheKey RpcCache +MuonCacheCreator ExtraInputs [] +MuonCacheCreator NeededResources [] +MuonCacheCreator DetStore StoreGateSvc/DetectorStore +MuonCacheCreator EvtStore StoreGateSvc +RpcRawDataProvider ExtraOutputs [] +RpcRawDataProvider DoSeededDecoding True +RpcRawDataProvider EvtStore StoreGateSvc +RpcRawDataProvider RoIs MURoIs +RpcRawDataProvider ExtraInputs [] +RpcRawDataProvider RegionSelectionSvc RegSelSvc +RpcRawDataProvider ProviderTool Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool +RpcRawDataProvider NeededResources [] +RpcRawDataProvider DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool OutputLevel 2 +RpcRawDataProvider.RPC_RawDataProviderTool RpcContainerCacheKey RpcCache +RpcRawDataProvider.RPC_RawDataProviderTool WriteOutRpcSectorLogic False +RpcRawDataProvider.RPC_RawDataProviderTool ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +RpcRawDataProvider.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider ExtraOutputs [] +TgcRawDataProvider EvtStore StoreGateSvc +TgcRawDataProvider ExtraInputs [] +TgcRawDataProvider NeededResources [] +TgcRawDataProvider ProviderTool Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool +TgcRawDataProvider DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +TgcRawDataProvider.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider ExtraOutputs [] +MdtRawDataProvider EvtStore StoreGateSvc +MdtRawDataProvider ExtraInputs [] +MdtRawDataProvider NeededResources [] +MdtRawDataProvider ProviderTool Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool +MdtRawDataProvider DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool OutputLevel 1 +MdtRawDataProvider.MDT_RawDataProviderTool ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +MdtRawDataProvider.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +MdtRawDataProvider.MDT_RawDataProviderTool CsmContainerCacheKey MdtCsmCache +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +CscRawDataProvider ExtraOutputs [] +CscRawDataProvider EvtStore StoreGateSvc +CscRawDataProvider ExtraInputs [] +CscRawDataProvider NeededResources [] +CscRawDataProvider ProviderTool Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool +CscRawDataProvider DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool OutputLevel 1 +CscRawDataProvider.CSC_RawDataProviderTool CscContainerCacheKey CscCache +CscRawDataProvider.CSC_RawDataProviderTool ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +CscRawDataProvider.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData ExtraOutputs [] +RpcRdoToRpcPrepData DecodingTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool +RpcRdoToRpcPrepData EvtStore StoreGateSvc +RpcRdoToRpcPrepData ExtraInputs [] +RpcRdoToRpcPrepData PrintPrepData False +RpcRdoToRpcPrepData RegionSelectionSvc RegSelSvc +RpcRdoToRpcPrepData NeededResources [] +RpcRdoToRpcPrepData DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData ExtraOutputs [] +TgcRdoToTgcPrepData DecodingTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool +TgcRdoToTgcPrepData EvtStore StoreGateSvc +TgcRdoToTgcPrepData RegionSelectorSvc RegSelSvc +TgcRdoToTgcPrepData ExtraInputs [] +TgcRdoToTgcPrepData PrintPrepData False +TgcRdoToTgcPrepData NeededResources [] +TgcRdoToTgcPrepData DetStore StoreGateSvc/DetectorStore +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraOutputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraInputs [] +TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData ExtraOutputs [] +MdtRdoToMdtPrepData DecodingTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool +MdtRdoToMdtPrepData EvtStore StoreGateSvc +MdtRdoToMdtPrepData ExtraInputs [] +MdtRdoToMdtPrepData PrintPrepData False +MdtRdoToMdtPrepData RegionSelectionSvc RegSelSvc +MdtRdoToMdtPrepData NeededResources [] +MdtRdoToMdtPrepData DetStore StoreGateSvc/DetectorStore +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraOutputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraInputs [] +MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData ExtraOutputs [] +CscRdoToCscPrepData CscRdoToCscPrepDataTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool +CscRdoToCscPrepData EvtStore StoreGateSvc +CscRdoToCscPrepData ExtraInputs [] +CscRdoToCscPrepData PrintPrepData False +CscRdoToCscPrepData RegionSelectionSvc RegSelSvc +CscRdoToCscPrepData NeededResources [] +CscRdoToCscPrepData DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +CscThesholdClusterBuilder ExtraOutputs [] +CscThesholdClusterBuilder EvtStore StoreGateSvc +CscThesholdClusterBuilder ExtraInputs [] +CscThesholdClusterBuilder cluster_builder CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool +CscThesholdClusterBuilder NeededResources [] +CscThesholdClusterBuilder DetStore StoreGateSvc/DetectorStore +CondInputLoader ExtraOutputs [] +CondInputLoader Load [('CondAttrListCollection', '/MDT/CABLING/MEZZANINE_SCHEMA'), ('CondAttrListCollection', '/EXT/DCS/MAGNETS/SENSORDATA'), ('CondAttrListCollection', '/MDT/CABLING/MAP_SCHEMA')] +CondInputLoader EvtStore StoreGateSvc +CondInputLoader ExtraInputs [] +CondInputLoader NeededResources [] +CondInputLoader DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg ExtraOutputs [] +MuonMDT_CablingAlg EvtStore StoreGateSvc +MuonMDT_CablingAlg ExtraInputs [] +MuonMDT_CablingAlg NeededResources [] +MuonMDT_CablingAlg DetStore StoreGateSvc/DetectorStore +MuonMDT_CablingAlg MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +MuonMDT_CablingAlg MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.IOVDbMetaDataTool ExtraOutputs [] +ToolSvc.IOVDbMetaDataTool FoldersToBeModified ['/Simulation/Parameters'] +ToolSvc.IOVDbMetaDataTool MinMaxRunNumbers [] +ToolSvc.IOVDbMetaDataTool EvtStore StoreGateSvc +ToolSvc.IOVDbMetaDataTool AttributesToBeRemoved ['RandomSeedOffset'] +ToolSvc.IOVDbMetaDataTool ExtraInputs [] +ToolSvc.IOVDbMetaDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.ByteStreamMetadataTool ExtraOutputs [] +ToolSvc.ByteStreamMetadataTool EvtStore StoreGateSvc +ToolSvc.ByteStreamMetadataTool ExtraInputs [] +ToolSvc.ByteStreamMetadataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.Muon::MuonIdHelperTool ExtraOutputs [] +ToolSvc.Muon::MuonIdHelperTool EvtStore StoreGateSvc +ToolSvc.Muon::MuonIdHelperTool ExtraInputs [] +ToolSvc.Muon::MuonIdHelperTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool ExtraOutputs [] +ToolSvc.RPCCablingDbTool EvtStore StoreGateSvc +ToolSvc.RPCCablingDbTool ExtraInputs [] +ToolSvc.RPCCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPCCablingDbTool MapCorrectionFolder /RPC/CABLING/MAP_SCHEMA_CORR +ToolSvc.RPCCablingDbTool MapConfigurationFolder /RPC/CABLING/MAP_SCHEMA +ToolSvc.RPC_RawDataProviderTool ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool OutputLevel 2 +ToolSvc.RPC_RawDataProviderTool RpcContainerCacheKey RpcCache +ToolSvc.RPC_RawDataProviderTool WriteOutRpcSectorLogic False +ToolSvc.RPC_RawDataProviderTool ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder +ToolSvc.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] +ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] +ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool ExtraOutputs [] +ToolSvc.MDTCablingDbTool EvtStore StoreGateSvc +ToolSvc.MDTCablingDbTool ExtraInputs [] +ToolSvc.MDTCablingDbTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDTCablingDbTool MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA +ToolSvc.MDTCablingDbTool MapFolders /MDT/CABLING/MAP_SCHEMA +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraOutputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RT_InputFiles ['Muon_RT_default.data'] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TimeSlewingCorrection False +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RtFolder /MDT/RTBLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool MeanCorrectionVsR [-5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool defaultT0 40 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraInputs [] +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool UseMLRt True +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool PropagationSpeedBeta 0.85 +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TubeFolder /MDT/T0BLOB +ToolSvc.MuonCalib::MdtCalibDbCoolStrTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder +ToolSvc.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MDT_RawDataProviderTool CsmContainerCacheKey MdtCsmCache +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] +ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool CscContainerCacheKey CscCache +ToolSvc.CSC_RawDataProviderTool ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder +ToolSvc.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] +ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder +ToolSvc.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] +ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.TgcRdoToTgcPrepDataTool ExtraOutputs [] +ToolSvc.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc +ToolSvc.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +ToolSvc.TgcRdoToTgcPrepDataTool ExtraInputs [] +ToolSvc.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.MdtRdoToMdtPrepDataTool ExtraOutputs [] +ToolSvc.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc +ToolSvc.MdtRdoToMdtPrepDataTool ExtraInputs [] +ToolSvc.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder +ToolSvc.CscRdoToCscPrepDataTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool +ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] +ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore +ToolSvc.CscThesholdClusterBuilderTool ExtraOutputs [] +ToolSvc.CscThesholdClusterBuilderTool split_fitter CscSplitClusterFitter/CscSplitClusterFitter +ToolSvc.CscThesholdClusterBuilderTool strip_fitter CalibCscStripFitter/CalibCscStripFitter +ToolSvc.CscThesholdClusterBuilderTool cscCalibTool CscCalibTool/CscCalibTool +ToolSvc.CscThesholdClusterBuilderTool default_fitter SimpleCscClusterFitter/SimpleCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool precision_fitter QratCscClusterFitter/QratCscClusterFitter +ToolSvc.CscThesholdClusterBuilderTool EvtStore StoreGateSvc +ToolSvc.CscThesholdClusterBuilderTool ExtraInputs [] +ToolSvc.CscThesholdClusterBuilderTool DetStore StoreGateSvc/DetectorStore +EventSelector SharedMemoryTool +EventSelector SkipEventSequence [] +EventSelector CounterTool +EventSelector Input [] +EventSelector ByteStreamInputSvc ByteStreamInputSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraOutputs [] +EventSelector.xAODMaker::EventInfoSelectorTool EvtStore StoreGateSvc +EventSelector.xAODMaker::EventInfoSelectorTool BeamCondSvc BeamCondSvc +EventSelector.xAODMaker::EventInfoSelectorTool ExtraInputs [] +EventSelector.xAODMaker::EventInfoSelectorTool LuminosityTool LuminosityTool +EventSelector.xAODMaker::EventInfoSelectorTool DetStore StoreGateSvc/DetectorStore +ByteStreamInputSvc EventStore StoreGateSvc +ByteStreamInputSvc FullFileName ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] +ByteStreamInputSvc AttributeListKeys [] +ByteStreamInputSvc MetaDataStore StoreGateSvc/InputMetaDataStore +EventPersistencySvc CnvServices ['ByteStreamCnvSvc', 'AthenaPoolCnvSvc/AthenaPoolCnvSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'AthenaPoolCnvSvc'] +ByteStreamCnvSvc InitCnvs ['EventInfo', 'ROIB::RoIBResult', 'HLT::HLTResult'] +ByteStreamCnvSvc EventStore StoreGateSvc +ByteStreamCnvSvc ROD2ROBmap [] +ByteStreamCnvSvc ByteStreamOutputSvcList [] +ByteStreamCnvSvc GetDetectorMask True +ROBDataProviderSvc filterRobWithStatus [] +ROBDataProviderSvc filterSubDetWithStatus [] +ByteStreamAddressProviderSvc TypeNames ['TileCellIDC/TileCellIDC', 'MdtDigitContainer/MDT_DIGITS', 'RpcDigitContainer/RPC_DIGITS', 'TgcDigitContainer/TGC_DIGITS', 'CscDigitContainer/CSC_DIGITS', 'ROIB::RecRoIBResult/RecRoIBResult', 'MuCTPI_RIO/MUCTPI_RIO', 'CTP_RIO/CTP_RIO', 'LArRawChannelContainer/LArRawChannels', 'TileRawChannelContainer/TileRawChannelCnt', 'ROIB::RoIBResult/RoIBResult', 'MuCTPI_RDO/MUCTPI_RDO', 'HLT::HLTResult/HLTResult_L2', 'HLT::HLTResult/HLTResult_EF', 'CTP_RDO/CTP_RDO', 'L1TopoRDOCollection/L1TopoRDOCollection'] +ByteStreamAddressProviderSvc TopoProcModuleID [129, 145] +ByteStreamAddressProviderSvc JetProcModuleID [172, 173] +ByteStreamAddressProviderSvc CaloClusterProcModuleID [168, 169, 170, 171] +MetaDataStore IncidentSvc IncidentSvc +MetaDataStore ProxyProviderSvc ProxyProviderSvc +InputMetaDataStore IncidentSvc IncidentSvc +InputMetaDataStore ProxyProviderSvc ProxyProviderSvc +MetaDataSvc MetaDataContainer MetaDataHdr +MetaDataSvc CnvSvc AthenaPoolCnvSvc +ProxyProviderSvc ProviderNames ['ByteStreamAddressProviderSvc', 'IOVDbSvc', 'MetaDataSvc', 'TagInfoMgr'] +GeoModelSvc SupportedGeometry 22 +GeoModelSvc AtlasVersion ATLAS-R2-2016-01-00-01 +GeoModelSvc.MuonDetectorTool ExtraOutputs [] +GeoModelSvc.MuonDetectorTool TheMuonAlignmentTool +GeoModelSvc.MuonDetectorTool EvtStore StoreGateSvc +GeoModelSvc.MuonDetectorTool UseConditionDb 1 +GeoModelSvc.MuonDetectorTool ExtraInputs [] +GeoModelSvc.MuonDetectorTool UseIlinesFromGM 1 +GeoModelSvc.MuonDetectorTool SelectedStJff [] +GeoModelSvc.MuonDetectorTool DetStore StoreGateSvc/DetectorStore +GeoModelSvc.MuonDetectorTool SelectedStations [] +GeoModelSvc.MuonDetectorTool SelectedStJzz [] +DetDescrCnvSvc IdDictFromRDB True +DetDescrCnvSvc IdDictName IdDictParser/ATLAS_IDS.xml +DetDescrCnvSvc DetectorNodes [] +DetDescrCnvSvc DetectorManagers [] +TagInfoMgr ExtraTagValuePairs ['AtlasRelease', 'Athena-22.0.1'] +RPCcablingServerSvc Atlas True +RPCcablingServerSvc useMuonRPC_CablingSvc True +RPCcablingServerSvc forcedUse True +IOVDbSvc Folders ['/MDT/CABLING/MEZZANINE_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_ETA<db>COOLONL_RPC/CONDBR2</db>', '/MDT/RTBLOB<db>COOLOFL_MDT/CONDBR2</db>', '/MDT/T0BLOB<db>COOLOFL_MDT/CONDBR2</db>', '/CSC/STAT <key>CSC_STAT</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/NOISE <key>CSC_NOISE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/PED <key>CSC_PED</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/RMS <key>CSC_RMS</key> <db>COOLOFL_CSC/CONDBR2</db>', '/GLOBAL/BField/Maps <noover/><db>COOLONL_GLOBAL/CONDBR2</db>', '/CSC/T0PHASE <key>CSC_T0PHASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/TGC/CABLING/MAP_SCHEMA<db>COOLONL_TGC/CONDBR2</db>', '/EXT/DCS/MAGNETS/SENSORDATA<db>COOLOFL_DCS/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA_CORR<db>COOLONL_RPC/CONDBR2</db>', '/MDT/CABLING/MAP_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_PHI<db>COOLONL_RPC/CONDBR2</db>', '/CSC/PSLOPE <key>CSC_PSLOPE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA<db>COOLONL_RPC/CONDBR2</db>', '/CSC/T0BASE <key>CSC_T0BASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/FTHOLD <key>CSC_FTHOLD</key> <db>COOLOFL_CSC/CONDBR2</db>'] +IOVDbSvc CacheAlign 3 +IOVDbSvc dbConnection sqlite://;schema=mycool.db;dbname=CONDBR2 +IOVDbSvc GlobalTag CONDBR2-BLKPA-2018-13 +IOVDbSvc FoldersToMetaData ['/GLOBAL/BField/Maps'] +IOVDbSvc DBInstance CONDBR2 +IOVDbSvc overrideTags [] +PoolSvc FrontierRefreshSchema [] +PoolSvc ReadCatalog ['apcfile:poolcond/PoolFileCatalog.xml', 'prfile:poolcond/PoolCat_oflcond.xml', 'apcfile:poolcond/PoolCat_oflcond.xml', 'prfile:poolcond/PoolCat_comcond.xml', 'apcfile:poolcond/PoolCat_comcond.xml'] +PoolSvc MaxFilesOpen 0 +DBReplicaSvc COOLSQLiteVetoPattern /DBRelease/ +MuonRPC_CablingSvc ConfFilePath MuonRPC_Cabling/ +MuonRPC_CablingSvc TheRpcTriggerDbTool RPCTriggerDbTool +MuonRPC_CablingSvc ConfFileName LVL1confAtlas.data +MuonRPC_CablingSvc FeetPadThresolds [] +MuonRPC_CablingSvc TheRpcCablingDbTool RPCCablingDbTool/RPCCablingDbTool +MuonRPC_CablingSvc RPCTriggerRoadsfromCool True +MuonRPC_CablingSvc CorrFileName LVL1confAtlas.corr +MuonRPC_CablingSvc CosmicConfiguration True +TGCcablingServerSvc Atlas True +TGCcablingServerSvc useMuonTGC_CablingSvc True +TGCcablingServerSvc forcedUse True +AthenaPoolCnvSvc InputPoolAttributes [] +AthenaPoolCnvSvc PoolAttributes [] +AthenaPoolCnvSvc PrintInputAttrPerEvt [] +AthenaPoolCnvSvc InputStreamingTool +AthenaPoolCnvSvc OutputPoolFileAllocator [] +AthenaPoolCnvSvc MaxFileSizes [] +MuonMDT_CablingSvc DBTool MDTCablingDbTool/MDTCablingDbTool +MuonMDT_CablingSvc TagInfoManager TagInfoMgr +MuonMDT_CablingSvc ForcedUse True +MuonMDT_CablingSvc UseOldCabling False +AtlasFieldSvc UseDCS True +MdtCalibrationDbSvc CreateSlewingFunctions False +MdtCalibrationDbSvc DBTool MuonCalib::MdtCalibDbAsciiTool +MdtCalibrationDbSvc CreateBFieldFunctions False +MdtCalibrationDbSvc CreateWireSagFunctions False +MdtCalibrationSvc DoTofCorrection True +MdtCalibrationSvc MagFieldSvc AtlasFieldSvc +MdtCalibrationSvc DoWireSagCorrection False +MdtCalibrationSvc TimeWindowSetting 2 +MdtCalibrationSvc DoSlewingCorrection False +MdtCalibrationSvc DoTemperatureCorrection True +MuonCalib::CscCoolStrSvc ParSGKeys ['CSC_PED', 'CSC_NOISE', 'CSC_PSLOPE', 'CSC_STAT', 'CSC_RMS', 'CSC_FTHOLD', 'CSC_T0BASE', 'CSC_T0PHASE'] +MuonCalib::CscCoolStrSvc ParDefaults ['2048', '3.5', '0.189', '0', '2.56', '0', '0', '0'] +MuonCalib::CscCoolStrSvc ParDataTypes ['float', 'float', 'float', 'uint32_t', 'float', 'float', 'float', 'float'] +MuonCalib::CscCoolStrSvc ParFolders ['/CSC/PED', '/CSC/NOISE', '/CSC/PSLOPE', '/CSC/STAT', '/CSC/RMS', '/CSC/FTHOLD', '/CSC/T0BASE', '/CSC/T0PHASE'] +MuonCalib::CscCoolStrSvc ParCats ['CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'ASM'] +MuonCalib::CscCoolStrSvc ParNames ['ped', 'noise', 'pslope', 'status', 'rms', 'f001', 't0base', 't0phase'] JOs reading stage finished, launching Athena from pickle file +Thu Mar 14 11:38:54 GMT 2019 +Preloading tcmalloc_minimal.so +Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO including file "AthenaCommon/Preparation.py" +Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads +Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode_Cache.pkl ... +Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO No duplicates have been found: that's good ! +[?1034hApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +ApplicationMgr SUCCESS +==================================================================================================================================== + Welcome to ApplicationMgr (GaudiCoreSvc v31r0) + running on ppevm02.ppe.gla.ac.uk on Thu Mar 14 11:39:07 2019 +==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully +ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 +Py:Athena INFO including file "AthenaCommon/runbatch.py" +StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry +ClassIDSvc INFO getRegistryEntries: read 3383 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) +ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 +ROBDataProviderSvc INFO Initializing ROBDataProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 ROBDataProviderSvc INFO ---> Filter out empty ROB fragments = 'filterEmptyROB':False ROBDataProviderSvc INFO ---> Filter out specific ROBs by Status Code: # ROBs = 0 ROBDataProviderSvc INFO ---> Filter out Sub Detector ROBs by Status Code: # Sub Detectors = 0 @@ -2113,6 +2555,10 @@ ByteStreamAddre... INFO -- Will fill Store with id = 0 PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok] PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 +DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://frontier-atlas.lcg.triumf.ca:3128/ATLAS_frontier)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 1 servers found for host ppevm02.ppe.gla.ac.uk [ATLF ] +DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO Resolved path (via ATLAS_POOLCOND_PATH) is /cvmfs/atlas-condb.cern.ch/repo/conditions/poolcond/PoolFileCatalog.xml @@ -2121,13 +2567,26 @@ PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_ PoolSvc WARNING Unable to locate catalog for prfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc WARNING Unable to locate catalog for apcfile:poolcond/PoolCat_comcond.xml check your ATLAS_POOLCOND_PATH and DATAPATH variables PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml +DbSession INFO Open DbSession +Domain[ROOT_All] INFO > Access DbDomain READ [ROOT_All] IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once +IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbSvc INFO Global tag: CONDBR2-BLKPA-2018-13 set from joboptions IOVDbFolder INFO Inputfile tag override disabled for /GLOBAL/BField/Maps +IOVDbSvc INFO Folder /GLOBAL/BField/Maps will be written to file metadata IOVDbSvc INFO Initialised with 8 connections and 19 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully +MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 +AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 +ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 +MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 +ClassIDSvc INFO getRegistryEntries: read 3291 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4012 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3031 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -2208,6 +2667,10 @@ GeoModelSvc::RD...WARNING Getting PixTBMatComponents with default tag GeoModelSvc::RD...WARNING Getting PixTBMaterials with default tag GeoModelSvc::RD...WARNING Getting InDetMatComponents with default tag GeoModelSvc::RD...WARNING Getting InDetMaterials with default tag +GeoModelSvc.Muo... INFO create MuonDetectorTool - package version = MuonGeoModel-00-00-00 +GeoModelSvc.Muo... INFO (from GeoModelSvc) AtlasVersion = <ATLAS-R2-2016-01-00-01> MuonVersion = <> +GeoModelSvc.Muo... INFO Keys for Muon Switches are (key) ATLAS-R2-2016-01-00-01 (node) ATLAS +GeoModelSvc.Muo... INFO (from GeoModelSvc) in AtlasVersion = <ATLAS-R2-2016-01-00-01> default MuonVersion is <MuonSpectrometer-R.08.01> GeoModelSvc.Muo... INFO Properties have been set as follows: GeoModelSvc.Muo... INFO LayoutName R GeoModelSvc.Muo... INFO IncludeCutouts 0 @@ -2322,6 +2785,7 @@ AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! MuGM:MuonFactory INFO MMIDHELPER retrieved from DetStore MuGM:MuonFactory INFO **************** MuonDetectorFactory001 ************************ MuGM:MuonFactory INFO *** Start building the Muon Geometry Tree ********************** +MuGM:RDBReadAtlas INFO Start retriving dbObjects with tag = <ATLAS-R2-2016-01-00-01> node <ATLAS> RDBAccessSvc WARNING Could not get the tag for XtomoData node. Returning 0 pointer to IRDBQuery MuGM:RDBReadAtlas INFO After getQuery XtomoData In DblQ00Xtomo(data) @@ -2351,6 +2815,7 @@ MuGM:ProcCutouts INFO Processing Cutouts DONE MuGM:RDBReadAtlas INFO ProcessTGCreadout - version 7 wirespacing 1.8 MuGM:RDBReadAtlas INFO Intermediate Objects built from primary numbers MuGM:MuonFactory INFO theMaterialManager retrieven successfully from the DetStore +MuGM:MuonFactory INFO MuonSystem description from OracleTag=<ATLAS-R2-2016-01-00-01> and node=<ATLAS> MuGM:MuonFactory INFO TreeTop added to the Manager MuGM:MuonFactory INFO Muon Layout R.08.01 MuGM:MuonFactory INFO Fine Clash Fixing disabled: (should be ON/OFF for Simulation/Reconstruction) @@ -2374,9 +2839,13 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 44888Kb Time = 0.96S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL +ClassIDSvc INFO getRegistryEntries: read 1455 CLIDRegistry entries for module ALL +AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 +ClassIDSvc INFO getRegistryEntries: read 1794 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... CondInputLoader INFO Adding base classes: + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) -> @@ -2386,12 +2855,19 @@ CondInputLoader INFO Will create WriteCondHandle dependencies for the follo + ( 'CondAttrListCollection' , 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) + ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) +ClassIDSvc INFO getRegistryEntries: read 1370 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 743 CLIDRegistry entries for module ALL RpcRawDataProvider INFO RpcRawDataProvider::initialize -RpcRawDataProvider INFO 'DoSeededDecoding':False +RpcRawDataProvider INFO 'DoSeededDecoding':True +ClassIDSvc INFO getRegistryEntries: read 1699 CLIDRegistry entries for module ALL +RpcRawDataProvi... DEBUG Property update for OutputLevel : new value = 2 +RpcRawDataProvi... DEBUG Property update for OutputLevel : new value = 2 +MuonRPC_CablingSvc INFO Initializing MuonRPC_CablingSvc - package version MuonRPC_Cabling-00-00-00 ToolSvc.RPCCabl... INFO Initializing - folders names are: conf /RPC/CABLING/MAP_SCHEMA / corr /RPC/CABLING/MAP_SCHEMA_CORR MuonRPC_CablingSvc INFO RPCCablingDbTool retrieved with statusCode = SUCCESS with handle TheRpcCablingDbTool = PublicToolHandle('RPCCablingDbTool/RPCCablingDbTool') MuonRPC_CablingSvc INFO Register call-back against 2 folders listed below MuonRPC_CablingSvc INFO Folder n. 1 </RPC/CABLING/MAP_SCHEMA> found in the DetStore +ClassIDSvc INFO getRegistryEntries: read 501 CLIDRegistry entries for module ALL MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA> MuonRPC_CablingSvc INFO Folder n. 2 </RPC/CABLING/MAP_SCHEMA_CORR> found in the DetStore MuonRPC_CablingSvc INFO initMappingModel registered for call-back against folder </RPC/CABLING/MAP_SCHEMA_CORR> @@ -2404,21 +2880,34 @@ MuonRPC_CablingSvc INFO initTrigRoadsModel registered for call-back against fo RpcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') RpcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') RpcRawDataProvi... INFO Tool = RpcRawDataProvider.RPC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc +RpcRawDataProvi... DEBUG Could not find TrigConf::HLTJobOptionsSvc RpcRawDataProvi... INFO initialize() successful in RpcRawDataProvider.RPC_RawDataProviderTool +RpcRawDataProvi... DEBUG Adding private ToolHandle tool RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder (Muon::RpcROD_Decoder) +RegSelSvc INFO Initializing RegSelSvc - package version RegionSelector-00-00-00 +RegSelSvc INFO DetectorDescription version ATLAS-R2-2016-01-00-01 (obtained from GeoModelSvc) +RegSelSvc INFO DeltaZ = 168 +RegSelSvc INFO detector switches: indet=disabled calo=disabled muon=disabled +RegSelSvc INFO registered Listener with IncidentSvc TgcRawDataProvider INFO TgcRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 987 CLIDRegistry entries for module ALL TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder TgcRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') TgcRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize +ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x13304100]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize +ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL +MdtRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 MdtRawDataProvi...VERBOSE Starting init MdtRawDataProvi...VERBOSE Getting m_robDataProvider MdtRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') MdtRawDataProvi...VERBOSE Getting MuonDetectorManager MdtRawDataProvi...VERBOSE Getting m_decoder +MdtRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 MdtRawDataProvi... INFO Processing configuration for layouts with BME chambers. MdtRawDataProvi... INFO Processing configuration for layouts with BMG chambers. MdtRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') @@ -2426,15 +2915,20 @@ MdtRawDataProvi... INFO Tool = MdtRawDataProvider.MDT_RawDataProviderTool is MdtRawDataProvi... DEBUG Could not find TrigConf::HLTJobOptionsSvc MdtRawDataProvi... INFO initialize() successful in MdtRawDataProvider.MDT_RawDataProviderTool MdtRawDataProvi... DEBUG Adding private ToolHandle tool MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder (MdtROD_Decoder) +ClassIDSvc INFO getRegistryEntries: read 658 CLIDRegistry entries for module ALL +CscRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 CscRawDataProvi... INFO Retrieved service ServiceHandle('ROBDataProviderSvc') CscRawDataProvi...VERBOSE ServiceLocatorHelper::service: found service JobOptionsSvc CscRawDataProvi... INFO Tool = CscRawDataProvider.CSC_RawDataProviderTool is connected to JobOptionsSvc Service = JobOptionsSvc CscRawDataProvi... DEBUG Could not find TrigConf::HLTJobOptionsSvc +CscRawDataProvi... DEBUG Property update for OutputLevel : new value = 1 CscRawDataProvi... DEBUG Found the CscIdHelper. CscRawDataProvi... INFO Retrieved tool Decoder = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') CscRawDataProvi... INFO The Muon Geometry version is R.08.01 CscRawDataProvi... INFO initialize() successful in CscRawDataProvider.CSC_RawDataProviderTool CscRawDataProvi... DEBUG Adding private ToolHandle tool CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder (Muon::CscROD_Decoder) +ClassIDSvc INFO getRegistryEntries: read 53 CLIDRegistry entries for module ALL +RpcRdoToRpcPrep... INFO package version = MuonRPC_CnvTools-00-00-00 RpcRdoToRpcPrep... INFO properties are RpcRdoToRpcPrep... INFO processingData 0 RpcRdoToRpcPrep... INFO produceRpcCoinDatafromTriggerWords 1 @@ -2449,18 +2943,31 @@ RpcRdoToRpcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::RpcR TgcRdoToTgcPrep... INFO initialize() successful in TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool TgcRdoToTgcPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') MdtCalibrationSvc INFO Processing configuration for layouts with BMG chambers. +ClassIDSvc INFO getRegistryEntries: read 194 CLIDRegistry entries for module ALL AtlasFieldSvc INFO initialize() ... AtlasFieldSvc INFO maps will be chosen reading COOL folder /GLOBAL/BField/Maps +ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL AtlasFieldSvc INFO magnet currents will be read from COOL folder /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO Booked callback for /EXT/DCS/MAGNETS/SENSORDATA AtlasFieldSvc INFO initialize() successful MdtRdoToMdtPrep... INFO Processing configuration for layouts with BME chambers. MdtRdoToMdtPrep... INFO Processing configuration for layouts with BMG chambers. MdtRdoToMdtPrep... INFO Retrieved DecodingTool = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for module ALL CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc +ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. +EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... @@ -2472,10 +2979,12 @@ ToolSvc.Luminos... INFO BunchLumisTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO BunchGroupTool.empty() is TRUE, skipping... ToolSvc.Luminos... INFO LBLBFolderName is empty, skipping... EventSelector INFO Retrieved InputCollections from InputSvc +ByteStreamInputSvc INFO Initializing ByteStreamInputSvc - package version ByteStreamCnvSvc-00-00-00 EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully ByteStreamInputSvc INFO Picked valid file: /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 +ClassIDSvc INFO getRegistryEntries: read 1159 CLIDRegistry entries for module ALL CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' @@ -2553,6 +3062,7 @@ phi high-pt mu11 mu15 mu15 RPCcabling INFO CablingRPC---InitMaps from COOL: going to read configuration +RPCcabling INFO CablingRPC--->> RPC cabling map from COOL << RPCcabling INFO CablingRPC--- ReadConf: map has size 222202 RPCcabling INFO CablingRPC--- ReadConf: map n. of lines read is 924 RPCcabling INFO CablingRPC--- ReadConf: version is 5.0 Atlas R_07_03_RUN2ver104 @@ -2590,13 +3100,22 @@ AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] AtlasFieldSvc INFO Trying to read from DCS: [channel name, index, value] Toroids_SCurrent , 4 , 20397.7 AtlasFieldSvc INFO Currents read from DCS: solenoid 7729.99 toroid 20399.9 AtlasFieldSvc INFO Initializing the field map (solenoidCurrent=7729.99 toroidCurrent=20399.9) +AtlasFieldSvc INFO reading the map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +AtlasFieldSvc INFO Initialized the field map from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/atlas/offline/ReleaseData/v20/MagneticFieldMaps/bfieldmap_7730_20400_14m.root +ClassIDSvc INFO getRegistryEntries: read 672 CLIDRegistry entries for module ALL +RegSelSvc INFO handle incident type BeginRun +RegSelSvc INFO >>>>> detectors have been initialized AthenaEventLoopMgr INFO ===>>> start processing event #186525031, run #327265 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMapSchema_BMG_01 for folder /MDT/CABLING/MAP_SCHEMA IOVDbFolder INFO HVS tag CONDBR2-BLKPA-2018-13 resolved to MDTCablingMezzanineSchema_M5-RUN2 for folder /MDT/CABLING/MEZZANINE_SCHEMA IOVDbSvc INFO Disconnecting from COOLONL_MDT/CONDBR2 MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' ) readCdoMez->size()= 24 +MuonMDT_CablingAlg INFO Range of input is {[0,l:0] - [INVALID]} MuonMDT_CablingAlg INFO Size of CondAttrListCollection ( 'CondAttrListCollection' , 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' ) readCdoMap->size()= 2312 +MuonMDT_CablingAlg INFO Range of input is {[327264,l:4294640031] - [327265,l:4294640030]} +MuonMDT_CablingAlg INFO recorded new MuonMDT_CablingMap with range {[327264,l:4294640031] - [327265,l:4294640030]} into Conditions Store +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG fillCollection: starting @@ -2710,6 +3229,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6048000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 1 @@ -2717,6 +3237,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6050000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 @@ -2726,6 +3247,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6248000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 3 @@ -2733,6 +3255,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6250000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Decoding data from TDC number : 7 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -2742,6 +3265,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6448000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 15 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 0 csmId : 5 @@ -2749,6 +3273,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 1 +MdtRawDataProvi... DEBUG Collection ID = 0x6450000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -2884,12 +3409,14 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6049000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 1 csmId : 1 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6051000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 10 @@ -2900,6 +3427,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6249000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 1 csmId : 3 @@ -2907,6 +3435,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6251000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 3 MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Found the Beginnning of Link @@ -2915,6 +3444,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6449000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 2 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 2 chan: 22 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 @@ -2930,6 +3460,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 2 +MdtRawDataProvi... DEBUG Collection ID = 0x6451000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 5 MdtRawDataProvi... DEBUG Decoding data from TDC number : 6 MdtRawDataProvi... DEBUG Decoding data from TDC number : 8 @@ -3037,18 +3568,21 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x604a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 2 csmId : 1 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 0 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x6052000000000000 does not exist, create it MdtRawDataProvi... DEBUG Found the Beginnning of Link MdtRawDataProvi... DEBUG subdetId : 97 mrodId : 2 csmId : 2 MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x624a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 0 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 0 chan: 20 MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 @@ -3060,6 +3594,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 2 MdtRawDataProvi... DEBUG Eta : 2 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x6252000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 5 MdtRawDataProvi... DEBUG Decoding data from TDC number : 7 MdtRawDataProvi... DEBUG Error: corresponding leading edge not found for the trailing edge tdc: 7 chan: 12 @@ -3071,6 +3606,7 @@ MdtRawDataProvi... DEBUG getOfflineIdfromOnlineID result: MdtRawDataProvi... DEBUG Name : 4 MdtRawDataProvi... DEBUG Eta : 1 MdtRawDataProvi... DEBUG Phi : 3 +MdtRawDataProvi... DEBUG Collection ID = 0x644a000000000000 does not exist, create it MdtRawDataProvi... DEBUG Decoding data from TDC number : 1 MdtRawDataProvi... DEBUG Decoding data from TDC number : 4 MdtRawDataProvi... DEBUG Decoding data from TDC number : 9 @@ -3092,6 +3628,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x80 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x80 24 8 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 8 @@ -3101,28 +3638,55 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 112 +CscRawDataProvi... DEBUG RPU Header word 0x5000070 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 112 CscRawDataProvi... DEBUG SCA Address = 724315438 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x20202 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x600006c CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 108 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 12 +CscRawDataProvi... DEBUG cluster location word 0x10a2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31725 6 51 :: measphi0 L2 strId 46 nStr 4 T0 nSampWords 8 [7.51.-1.1.1.2.2.0.46] +CscRawDataProvi... DEBUG cluster location word 0x10a35 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 54 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31733 6 51 :: measphi0 L2 strId 54 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.0.54] +CscRawDataProvi... DEBUG cluster location word 0x10c2c +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 45 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31916 7 51 :: measphi0 L3 strId 45 nStr 5 T0 nSampWords 10 [7.51.-1.1.1.2.3.0.45] +CscRawDataProvi... DEBUG cluster location word 0x10c37 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 56 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 31927 7 51 :: measphi0 L3 strId 56 nStr 4 T0 nSampWords 8 [7.51.-1.1.1.2.3.0.56] +CscRawDataProvi... DEBUG cluster location word 0x10e2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 32109 8 51 :: measphi0 L4 strId 46 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.0.46] +CscRawDataProvi... DEBUG cluster location word 0x10e39 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 58 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 32121 8 51 :: measphi0 L4 strId 58 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.0.58] +CscRawDataProvi... DEBUG cluster location word 0x10903 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55491 9 51 :: measphi1 L1 strId 4 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.1.1.4] +CscRawDataProvi... DEBUG cluster location word 0x10b08 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55544 9 51 :: measphi1 L2 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.1.9] +CscRawDataProvi... DEBUG cluster location word 0x10b1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55566 9 51 :: measphi1 L2 strId 31 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.2.1.31] +CscRawDataProvi... DEBUG cluster location word 0x10d07 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 8 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55591 9 51 :: measphi1 L3 strId 8 nStr 5 T0 nSampWords 10 [7.51.-1.1.1.2.3.1.8] +CscRawDataProvi... DEBUG cluster location word 0x10d1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55614 9 51 :: measphi1 L3 strId 31 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.3.1.31] +CscRawDataProvi... DEBUG cluster location word 0x10f08 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 8 55640 9 51 :: measphi1 L4 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.1.1.2.4.1.9] CscRawDataProvi... DEBUG ****Total Cluster count = 12 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3131,6 +3695,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x81 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x81 16 0 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 0 @@ -3140,38 +3705,52 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 122 +CscRawDataProvi... DEBUG RPU Header word 0xd00007a CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 122 CscRawDataProvi... DEBUG SCA Address = 2358087311 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x2000002 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x7000076 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 7 CscRawDataProvi... DEBUG Cluster Data Words = 118 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 11 CscRawDataProvi... DEBUG cluster location word 0x810 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 17 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 784 0 50 :: measphi0 L1 strId 17 nStr 4 T0 nSampWords 8 [7.50.-1.1.1.2.1.0.17] CscRawDataProvi... DEBUG cluster location word 0x868 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000007 105 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 872 0 50 :: measphi0 L1 strId 105 nStr 7 T0 nSampWords 14 [7.50.-1.1.1.2.1.0.105] CscRawDataProvi... DEBUG cluster location word 0xe11 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x1000000a 18 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 1361 3 50 :: measphi0 L4 strId 18 nStr 10 T0 nSampWords 20 [7.50.-1.1.1.2.4.0.18] CscRawDataProvi... DEBUG cluster location word 0xe41 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 66 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 1409 3 50 :: measphi0 L4 strId 66 nStr 4 T0 nSampWords 8 [7.50.-1.1.1.2.4.0.66] CscRawDataProvi... DEBUG cluster location word 0x916 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24790 4 50 :: measphi1 L1 strId 23 nStr 5 T0 nSampWords 10 [7.50.-1.1.1.2.1.1.23] CscRawDataProvi... DEBUG cluster location word 0xb16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24838 4 50 :: measphi1 L2 strId 23 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.2.1.23] CscRawDataProvi... DEBUG cluster location word 0xd03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24867 4 50 :: measphi1 L3 strId 4 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.4] CscRawDataProvi... DEBUG cluster location word 0xd15 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 22 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24885 4 50 :: measphi1 L3 strId 22 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.22] CscRawDataProvi... DEBUG cluster location word 0xd2d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 46 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24909 4 50 :: measphi1 L3 strId 46 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.3.1.46] CscRawDataProvi... DEBUG cluster location word 0xf15 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 22 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24933 4 50 :: measphi1 L4 strId 22 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.4.1.22] CscRawDataProvi... DEBUG cluster location word 0xf1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 0 24942 4 50 :: measphi1 L4 strId 31 nStr 3 T0 nSampWords 6 [7.50.-1.1.1.2.4.1.31] CscRawDataProvi... DEBUG ****Total Cluster count = 11 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3180,6 +3759,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x82 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x82 25 9 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 9 @@ -3189,6 +3769,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 50 +CscRawDataProvi... DEBUG RPU Header word 0x5000032 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 50 @@ -3198,13 +3779,24 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x200002e CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 2 CscRawDataProvi... DEBUG Cluster Data Words = 46 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 5 +CscRawDataProvi... DEBUG cluster location word 0x12c17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33431 7 51 :: measphi0 L3 strId 24 nStr 5 T0 nSampWords 10 [7.51.-1.2.1.2.3.0.24] +CscRawDataProvi... DEBUG cluster location word 0x12e16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33622 8 51 :: measphi0 L4 strId 23 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.0.23] +CscRawDataProvi... DEBUG cluster location word 0x12e1a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 27 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 33626 8 51 :: measphi0 L4 strId 27 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.0.27] +CscRawDataProvi... DEBUG cluster location word 0x12d24 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 56004 9 51 :: measphi1 L3 strId 37 nStr 4 T0 nSampWords 8 [7.51.-1.2.1.2.3.1.37] +CscRawDataProvi... DEBUG cluster location word 0x12f24 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 9 56052 9 51 :: measphi1 L4 strId 37 nStr 3 T0 nSampWords 6 [7.51.-1.2.1.2.4.1.37] CscRawDataProvi... DEBUG ****Total Cluster count = 5 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3213,6 +3805,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x83 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x83 17 1 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 1 @@ -3222,27 +3815,52 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 116 +CscRawDataProvi... DEBUG RPU Header word 0xd000074 CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 116 CscRawDataProvi... DEBUG SCA Address = 1920169077 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x1010102 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 2 +CscRawDataProvi... DEBUG Second cluster word 0x6000070 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 112 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 11 +CscRawDataProvi... DEBUG cluster location word 0x2818 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2328 0 50 :: measphi0 L1 strId 25 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.1.0.25] +CscRawDataProvi... DEBUG cluster location word 0x2a17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2519 1 50 :: measphi0 L2 strId 24 nStr 6 T0 nSampWords 12 [7.50.-1.2.1.2.2.0.24] +CscRawDataProvi... DEBUG cluster location word 0x2c17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2711 2 50 :: measphi0 L3 strId 24 nStr 5 T0 nSampWords 10 [7.50.-1.2.1.2.3.0.24] +CscRawDataProvi... DEBUG cluster location word 0x2e18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 2904 3 50 :: measphi0 L4 strId 25 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.4.0.25] +CscRawDataProvi... DEBUG cluster location word 0x2ebc +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 189 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 3068 3 50 :: measphi0 L4 strId 189 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.4.0.189] +CscRawDataProvi... DEBUG cluster location word 0x2909 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25161 4 50 :: measphi1 L1 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.1.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2b09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25209 4 50 :: measphi1 L2 strId 10 nStr 5 T0 nSampWords 10 [7.50.-1.2.1.2.2.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2d09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25257 4 50 :: measphi1 L3 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.3.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2d16 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 23 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25270 4 50 :: measphi1 L3 strId 23 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.3.1.23] +CscRawDataProvi... DEBUG cluster location word 0x2f09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25305 4 50 :: measphi1 L4 strId 10 nStr 4 T0 nSampWords 8 [7.50.-1.2.1.2.4.1.10] +CscRawDataProvi... DEBUG cluster location word 0x2f28 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 41 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 1 25336 4 50 :: measphi1 L4 strId 41 nStr 3 T0 nSampWords 6 [7.50.-1.2.1.2.4.1.41] CscRawDataProvi... DEBUG ****Total Cluster count = 11 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3251,6 +3869,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x84 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x84 26 10 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 10 @@ -3260,6 +3879,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 114 +CscRawDataProvi... DEBUG RPU Header word 0x5000072 CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 114 @@ -3269,14 +3889,27 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 0 +CscRawDataProvi... DEBUG Second cluster word 0x400006e CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 4 CscRawDataProvi... DEBUG Cluster Data Words = 110 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 6 +CscRawDataProvi... DEBUG cluster location word 0x14c03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 34947 7 51 :: measphi0 L3 strId 4 nStr 5 T0 nSampWords 10 [7.51.-1.3.1.2.3.0.4] +CscRawDataProvi... DEBUG cluster location word 0x14c66 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000013 103 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 35046 7 51 :: measphi0 L3 strId 103 nStr 19 T0 nSampWords 38 [7.51.-1.3.1.2.3.0.103] +CscRawDataProvi... DEBUG cluster location word 0x1491b +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 28 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56283 9 51 :: measphi1 L1 strId 28 nStr 3 T0 nSampWords 6 [7.51.-1.3.1.2.1.1.28] +CscRawDataProvi... DEBUG cluster location word 0x14d09 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 10 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56361 9 51 :: measphi1 L3 strId 10 nStr 6 T0 nSampWords 12 [7.51.-1.3.1.2.3.1.10] +CscRawDataProvi... DEBUG cluster location word 0x14d1f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 32 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56383 9 51 :: measphi1 L3 strId 32 nStr 3 T0 nSampWords 6 [7.51.-1.3.1.2.3.1.32] +CscRawDataProvi... DEBUG cluster location word 0x14d23 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x1000000d 36 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 10 56387 9 51 :: measphi1 L3 strId 36 nStr 13 T0 nSampWords 26 [7.51.-1.3.1.2.3.1.36] CscRawDataProvi... DEBUG ****Total Cluster count = 6 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3285,6 +3918,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x85 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x85 18 2 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 2 @@ -3294,23 +3928,40 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 90 +CscRawDataProvi... DEBUG RPU Header word 0xd00005a CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 90 CscRawDataProvi... DEBUG SCA Address = 1482250843 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x20100 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 0 +CscRawDataProvi... DEBUG Second cluster word 0x4000056 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 4 CscRawDataProvi... DEBUG Cluster Data Words = 86 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 7 +CscRawDataProvi... DEBUG cluster location word 0x4a18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000008 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4056 1 50 :: measphi0 L2 strId 25 nStr 8 T0 nSampWords 16 [7.50.-1.3.1.2.2.0.25] +CscRawDataProvi... DEBUG cluster location word 0x4a3a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 59 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4090 1 50 :: measphi0 L2 strId 59 nStr 4 T0 nSampWords 8 [7.50.-1.3.1.2.2.0.59] +CscRawDataProvi... DEBUG cluster location word 0x4c1a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000006 27 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 4250 2 50 :: measphi0 L3 strId 27 nStr 6 T0 nSampWords 12 [7.50.-1.3.1.2.3.0.27] +CscRawDataProvi... DEBUG cluster location word 0x4b11 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 18 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25601 4 50 :: measphi1 L2 strId 18 nStr 3 T0 nSampWords 6 [7.50.-1.3.1.2.2.1.18] +CscRawDataProvi... DEBUG cluster location word 0x4b18 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 25 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25608 4 50 :: measphi1 L2 strId 25 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.2.1.25] +CscRawDataProvi... DEBUG cluster location word 0x4b1e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 31 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25614 4 50 :: measphi1 L2 strId 31 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.2.1.31] +CscRawDataProvi... DEBUG cluster location word 0x4d14 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 21 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 2 25652 4 50 :: measphi1 L3 strId 21 nStr 5 T0 nSampWords 10 [7.50.-1.3.1.2.3.1.21] CscRawDataProvi... DEBUG ****Total Cluster count = 7 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3319,6 +3970,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x86 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x86 27 11 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 11 @@ -3328,6 +3980,7 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 58 +CscRawDataProvi... DEBUG RPU Header word 0x500003a CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 58 @@ -3337,12 +3990,21 @@ CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 C CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x1000036 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 1 CscRawDataProvi... DEBUG Cluster Data Words = 54 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 4 +CscRawDataProvi... DEBUG cluster location word 0x16c2f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 48 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36527 7 51 :: measphi0 L3 strId 48 nStr 3 T0 nSampWords 6 [7.51.-1.4.1.2.3.0.48] +CscRawDataProvi... DEBUG cluster location word 0x16c56 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000008 87 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36566 7 51 :: measphi0 L3 strId 87 nStr 8 T0 nSampWords 16 [7.51.-1.4.1.2.3.0.87] +CscRawDataProvi... DEBUG cluster location word 0x16e57 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000007 88 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 36759 8 51 :: measphi0 L4 strId 88 nStr 7 T0 nSampWords 14 [7.51.-1.4.1.2.4.0.88] +CscRawDataProvi... DEBUG cluster location word 0x16f04 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 5 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 11 56788 9 51 :: measphi1 L4 strId 5 nStr 5 T0 nSampWords 10 [7.51.-1.4.1.2.4.1.5] CscRawDataProvi... DEBUG ****Total Cluster count = 4 for RPU ID 5 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3351,6 +4013,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x87 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x87 19 3 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 3 @@ -3360,26 +4023,49 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 92 +CscRawDataProvi... DEBUG RPU Header word 0xd00005c CscRawDataProvi... DEBUG RPU ID original = 13 CscRawDataProvi... DEBUG RPU ID Updated = 11 CscRawDataProvi... DEBUG RPU size = 92 CscRawDataProvi... DEBUG SCA Address = 404298267 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x1010101 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 1 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x6000058 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 6 CscRawDataProvi... DEBUG Cluster Data Words = 88 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 10 +CscRawDataProvi... DEBUG cluster location word 0x6855 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 86 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5461 0 50 :: measphi0 L1 strId 86 nStr 4 T0 nSampWords 8 [7.50.-1.4.1.2.1.0.86] +CscRawDataProvi... DEBUG cluster location word 0x6a7c +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 125 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5692 1 50 :: measphi0 L2 strId 125 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.2.0.125] +CscRawDataProvi... DEBUG cluster location word 0x6c77 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 120 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 5879 2 50 :: measphi0 L3 strId 120 nStr 5 T0 nSampWords 10 [7.50.-1.4.1.2.3.0.120] +CscRawDataProvi... DEBUG cluster location word 0x6e71 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 114 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 6065 3 50 :: measphi0 L4 strId 114 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.4.0.114] +CscRawDataProvi... DEBUG cluster location word 0x691b +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 28 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25947 4 50 :: measphi1 L1 strId 28 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.28] +CscRawDataProvi... DEBUG cluster location word 0x691f +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 32 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25951 4 50 :: measphi1 L1 strId 32 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.32] +CscRawDataProvi... DEBUG cluster location word 0x6924 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 37 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25956 4 50 :: measphi1 L1 strId 37 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.1.1.37] +CscRawDataProvi... DEBUG cluster location word 0x6b17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 25991 4 50 :: measphi1 L2 strId 24 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.2.1.24] +CscRawDataProvi... DEBUG cluster location word 0x6d17 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000004 24 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 26039 4 50 :: measphi1 L3 strId 24 nStr 4 T0 nSampWords 8 [7.50.-1.4.1.2.3.1.24] +CscRawDataProvi... DEBUG cluster location word 0x6f2a +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 43 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 3 26106 4 50 :: measphi1 L4 strId 43 nStr 3 T0 nSampWords 6 [7.50.-1.4.1.2.4.1.43] CscRawDataProvi... DEBUG ****Total Cluster count = 10 for RPU ID 11 CscRawDataProvi... DEBUG end of CscROD_Decode::fillCollection() @@ -3388,6 +4074,7 @@ CscRawDataProvi... DEBUG in CscROD_Decoder::fillCollection :ROD version 401 CscRawDataProvi... DEBUG CscRawDataProvi... DEBUG =================================================== CscRawDataProvi... DEBUG in CscROD_Decode::fillCollection() - ROD version 2 +CscRawDataProvi... DEBUG DetDescr tag = ATLAS-R2-2016-01-00-01 CscRawDataProvi... DEBUG Online ROD id is 0x88 CscRawDataProvi... DEBUG Online ROD / ROD / collection / subDetector IDs are 0x88 28 12 106 CscRawDataProvi... DEBUG CSC RDO collection does not exist - creating a new one with hash = 12 @@ -3397,28 +4084,48 @@ CscRawDataProvi... DEBUG Is Calibration Enabled?: 0 Calibration Amplitude: 5 CscRawDataProvi... DEBUG Calibration Layer: 0 Latency: 126 CscRawDataProvi... DEBUG Is neutron rejection ON?: 0 Is sparsified data?: 1 CscRawDataProvi... DEBUG CscROD_Decoder Total words received = 74 +CscRawDataProvi... DEBUG RPU Header word 0x500004a CscRawDataProvi... DEBUG RPU ID original = 5 CscRawDataProvi... DEBUG RPU ID Updated = 5 CscRawDataProvi... DEBUG RPU size = 74 CscRawDataProvi... DEBUG SCA Address = 1499093852 +CscRawDataProvi... DEBUG Number of Precision Cluster word 0x2000001 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 0 Cluster Counts = 2 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 1 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 2 Cluster Counts = 0 CscRawDataProvi... DEBUG Number of precision Cluster Counts - Layer Index = 3 Cluster Counts = 1 +CscRawDataProvi... DEBUG Second cluster word 0x5000046 CscRawDataProvi... DEBUG Summed Number of Clusters for non-precision layers 5 CscRawDataProvi... DEBUG Cluster Data Words = 70 CscRawDataProvi... DEBUG Total summed Cluster Count for precision and non-precision layers = 8 +CscRawDataProvi... DEBUG cluster location word 0x18831 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 50 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 37681 5 51 :: measphi0 L1 strId 50 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.0.50] +CscRawDataProvi... DEBUG cluster location word 0x188ab +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 172 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 37803 5 51 :: measphi0 L1 strId 172 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.0.172] +CscRawDataProvi... DEBUG cluster location word 0x18e03 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000005 4 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 38211 8 51 :: measphi0 L4 strId 4 nStr 5 T0 nSampWords 10 [7.51.-1.5.1.2.4.0.4] +CscRawDataProvi... DEBUG cluster location word 0x18908 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 9 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57032 9 51 :: measphi1 L1 strId 9 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.1.1.9] +CscRawDataProvi... DEBUG cluster location word 0x1892e +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000002 47 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57070 9 51 :: measphi1 L1 strId 47 nStr 2 T0 nSampWords 4 [7.51.-1.5.1.2.1.1.47] +CscRawDataProvi... DEBUG cluster location word 0x18b00 +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000002 1 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57072 9 51 :: measphi1 L2 strId 1 nStr 2 T0 nSampWords 4 [7.51.-1.5.1.2.2.1.1] +CscRawDataProvi... DEBUG cluster location word 0x18d0d +CscRawDataProvi... DEBUG cluster time size word : stripId (CscIdHelper) 0x10000003 14 CscRawDataProvi... DEBUG idColl clusHashid spuID stationId :: 12 57133 9 51 :: measphi1 L3 strId 14 nStr 3 T0 nSampWords 6 [7.51.-1.5.1.2.3.1.14] +CscRawDataProvi... DEBUG cluster location word 0x18f1c CscRawDataProvi...WARNING DEBUG message limit (500) reached for CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder. Suppressing further output. CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186525031, run #327265 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186524665, run #327265 1 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3428,8 +4135,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186524665, run #327265 2 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186542447, run #327265 2 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3439,8 +4148,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186542447, run #327265 3 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186543405, run #327265 3 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3450,8 +4161,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186543405, run #327265 4 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186548387, run #327265 4 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3461,8 +4174,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186548387, run #327265 5 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186515186, run #327265 5 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3472,8 +4187,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186515186, run #327265 6 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186556019, run #327265 6 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3483,8 +4200,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186556019, run #327265 7 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186542866, run #327265 7 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3494,8 +4213,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186542866, run #327265 8 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186537901, run #327265 8 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3505,8 +4226,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186537901, run #327265 9 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186517811, run #327265 9 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3516,8 +4239,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186517811, run #327265 10 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186534221, run #327265 10 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3527,8 +4252,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186534221, run #327265 11 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186540986, run #327265 11 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3538,8 +4265,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186540986, run #327265 12 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186535104, run #327265 12 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3549,8 +4278,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186535104, run #327265 13 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186539903, run #327265 13 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3560,8 +4291,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186539903, run #327265 14 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186552713, run #327265 14 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3571,8 +4304,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186552713, run #327265 15 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186524730, run #327265 15 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3582,8 +4317,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186524730, run #327265 16 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186547632, run #327265 16 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3593,8 +4330,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186547632, run #327265 17 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186555621, run #327265 17 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3604,8 +4343,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186555621, run #327265 18 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186568452, run #327265 18 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3615,8 +4356,10 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186568452, run #327265 19 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #186580451, run #327265 19 events processed so far <<<=== +RpcRawDataProviderWARNING Cannot retrieve muonRoI MURoIs MdtRawDataProvi...VERBOSE convert(): 264 ROBFragments. MdtRawDataProvi... DEBUG Created container using cache for MdtCsmCache MdtRawDataProvi... DEBUG After processing numColls=1136 @@ -3626,12 +4369,45 @@ CscRawDataProvi... DEBUG Created container using cache for CscCache CscRawDataProvi... DEBUG Before processing numColls=0 CscRawDataProvi... DEBUG vector of ROB ID to decode: size = 32 CscRawDataProvi... DEBUG After processing numColls=32 +RpcRdoToRpcPrep...WARNING Retrieval of RPC RDO container failed ! AthenaEventLoopMgr INFO ===>>> done processing event #186580451, run #327265 20 events processed so far <<<=== +Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully +IncidentProcAlg1 INFO Finalize CondInputLoader INFO Finalizing CondInputLoader... +IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful +RegSelSvc INFO Finalizing RegSelSvc EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/25 (( 0.29 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/271 (( 0.66 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216598 (( 0.80 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/300 (( 0.43 ))s +IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/444470 (( 0.68 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/58804 (( 0.43 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562972 (( 1.07 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8101322 (( 1.02 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/7408 (( 0.56 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/331329 (( 0.71 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/359591 (( 2.08 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422629 (( 0.59 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/363009 (( 0.50 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422831 (( 0.54 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/236289 (( 0.48 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322855 (( 1.12 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3234 (( 0.37 ))s +IOVDbSvc INFO bytes in (( 12.33 ))s +IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.23 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.20 ))s +IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 6.39 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.66 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.56 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.29 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -3655,12 +4431,17 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** +cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 +ChronoStatSvc INFO Time User : Tot= 10.7 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully ApplicationMgr INFO Application Manager Terminated successfully Listing sources of suppressed message: +===================================================== Message Source | Level | Count +-----------------------------+---------+------------- CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder| DEBUG | 35169 MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder| DEBUG | 854603 +===================================================== Py:Athena INFO leaving with code 0: "successful run" -- GitLab From 0e4f8bddf6e475aac0ef2c9b67a9390590043f94 Mon Sep 17 00:00:00 2001 From: Walter Lampl <Walter.Lampl@cern.ch> Date: Thu, 14 Mar 2019 15:47:31 +0100 Subject: [PATCH 034/163] split TileCoolMgr into a class-definition that is compatible with run-3 style configuration flags and a separte file for backward-compatiblity --- .../TileConditions/python/TileCoolMgr.py | 352 +---------------- .../TileConditions/python/TileCoolMgrClass.py | 356 ++++++++++++++++++ 2 files changed, 364 insertions(+), 344 deletions(-) create mode 100644 TileCalorimeter/TileConditions/python/TileCoolMgrClass.py diff --git a/TileCalorimeter/TileConditions/python/TileCoolMgr.py b/TileCalorimeter/TileConditions/python/TileCoolMgr.py index 2726edd2e8b9..ebd2c81d3ac6 100644 --- a/TileCalorimeter/TileConditions/python/TileCoolMgr.py +++ b/TileCalorimeter/TileConditions/python/TileCoolMgr.py @@ -4,258 +4,16 @@ #author: nils.gollub@cern.ch #modifications: lukas.pribyl@cern.ch -import string - -class TileCoolMgr: - - #_______________________________________________________________ - def __init__(self): - - #=== initialize logger with INFO level - from AthenaCommon.Logging import logging - self.__log = logging.getLogger( 'TileCoolMgr' ) - # self.__log.setLevel(logging.INFO) - - #=== Master dictionary for: condId -> [folder, connStr, tag, folder2, type] - self.__idDict = {} - - #=== Available folder types - self.__validTypes = ["SplitMC", "SplitOnline", "OfflineOnly", "Sqlite"] - - #=== do we run on real data (not MC)? - from AthenaCommon.GlobalFlags import globalflags - self.__globalflags = globalflags - self.isData = globalflags.DataSource()=='data' - from AthenaCommon.AthenaCommonFlags import athenaCommonFlags - self.__athenaCommonFlags = athenaCommonFlags - - - #_______________________________________________________________ - def addSource(self, condId, folder, connStr, tag, folder2, type, key = ""): - if type not in self.__validTypes: - self.__log.error("Folder type \'%s\' not recognized!" % type) - if (type != "OfflineOnly") and (folder2 == ""): - self.__log.error("For folder type \'%s\' second folder name required!" % type) - self.__idDict[condId] = [folder, connStr, tag, folder2, type, key] - - #_______________________________________________________________ - def getFolder(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - return idInfo[0] - #_______________________________________________________________ - def getKey(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - elif idInfo[5] != "": return idInfo[5] - elif len(self.getTag(condId)): return self.getTag(condId) - else: - folder = self.getActualFolder(condId) - if folder: return folder - else: - self.__log.error("Cannot find out key for \'%s\'!" % condId) - return None - - #_______________________________________________________________ - def getFolderTwo(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - return idInfo[3] - - #_______________________________________________________________ - def isSplitMC(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - if idInfo[4]=="SplitMC": return True - else: return False - - #_______________________________________________________________ - def isSplitOnline(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - if idInfo[4]=="SplitOnline": return True - else: return False - - #_______________________________________________________________ - def isOfflineOnly(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - if idInfo[4]=="OfflineOnly": return True - else: return False - - #_______________________________________________________________ - def isSqlite(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - return None - else: - if idInfo[4]=="Sqlite": return True - else: return False - - - #_______________________________________________________________ - def setFolder(self, condId, folder): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - self.__log.info("Setting folder for condId \'%s\' to \'%s\'" % (condId,folder)) - idInfo[0] = folder - idInfo[3] = folder - - #_______________________________________________________________ - def setDbConn(self, condId, dbConn): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - self.__log.info("Setting dbConn for condId \'%s\' to \'%s\'" % (condId,dbConn)) - idInfo[1] = dbConn - from string import find - if find(dbConn,".db")>0: - self.__log.info("The data source looks like sqlite file (.db), setting folder type to Sqlite") - self.__idDict[condId][4] = "Sqlite" - - #_______________________________________________________________ - def getDbConn(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - return idInfo[1] - - #_______________________________________________________________ - def setTag(self, condId, tag): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - if len(tag) > 0: - if not tag.startswith('Tile'): - tag = self.getTagPrefix(self.getActualFolder(condId)) + tag - self.__log.info("Setting tag for condId \'%s\' to \'%s\'" % (condId,tag)) - idInfo[2] = tag - - #_______________________________________________________________ - def getTag(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - return idInfo[2] - - #_______________________________________________________________ - def setGlobalDbConn(self, dbConn): - for condId in self.__idDict.keys(): - self.setDbConn(condId,dbConn) - - #_______________________________________________________________ - def setGlobalTag(self, tag): - for condId in self.__idDict.keys(): - self.setTag(condId,tag) - - #_______________________________________________________________ - def getTagPrefix(self, coolFolder): - folderTag="" - for i in coolFolder.lower().split("/")[1:]: - folderTag+=i.capitalize() - folderTag+="-" - return folderTag - - #_______________________________________________________________ - def getConnectionString(self, condId): - idInfo = self.__idDict.get(condId) - if not idInfo: - self.__log.error("CondId \'%s\' not recognized!" % condId) - else: - fullStr = idInfo[1]+" " - if len(idInfo[2]): - fullStr += idInfo[2]+" " - fullStr += idInfo[0] - return fullStr - - - def isMC(self): - return self.__globalflags.DataSource() != 'data' - - def isOnline(self): - return self.__athenaCommonFlags.isOnline() - - - def isSourceAvailable(self, source): - return source in self.__idDict - - - def getActualFolder(self, condId): - if self.isOfflineOnly(condId): return self.getFolder(condId) - elif self.isSplitOnline(condId): - if self.isOnline() and not self.isMC(): return self.getFolder(condId) - else: return self.getFolderTwo(condId) - elif self.isSplitMC(condId): - if self.isMC(): return self.getFolderTwo(condId) - else: return self.getFolder(condId) - elif self.isSqlite(condId): return self.getFolder(condId) - else: return None - - -#-------------------------------------------------------------------------------------------------------- -#=== create object of the user -#-------------------------------------------------------------------------------------------------------- - -#=== fill with default folders: -tileCoolMgr = TileCoolMgr() -defConnStr = 'TILE' -oflConnStr = 'TILE_OFL' -#--- energy calibration - -tileCoolMgr.addSource('oflLasLin', '/TILE/ONL01/CALIB/LAS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/LIN', 'SplitOnline') -tileCoolMgr.addSource('oflCes', '/TILE/ONL01/CALIB/CES', defConnStr, "", '/TILE/OFL02/CALIB/CES', 'SplitOnline') -tileCoolMgr.addSource('oflEms', '/TILE/ONL01/CALIB/EMS', defConnStr, "", '/TILE/OFL02/CALIB/EMS', 'SplitOnline') - -#--- online calib is taken from the folder tag defined in TileOfcCoolPlugin -#--- the tags are fixed only in the case of real data - in both online and offline schema. -tileCoolMgr.addSource('onlCisLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/LIN', 'SplitMC') -tileCoolMgr.addSource('onlLasLin', '/TILE/ONL01/CALIB/LAS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/LIN', 'SplitMC') -tileCoolMgr.addSource('onlCes', '/TILE/ONL01/CALIB/CES', defConnStr, "", '/TILE/OFL02/CALIB/CES', 'SplitMC') -tileCoolMgr.addSource('onlEms', '/TILE/ONL01/CALIB/EMS', defConnStr, "", '/TILE/OFL02/CALIB/EMS', 'SplitMC') - -#--- MuID -tileCoolMgr.addSource('onlMuID' , '/TILE/ONL01/MUID', defConnStr, "", '/TILE/ONL01/MUID', 'SplitMC') - -#--- noise -tileCoolMgr.addSource('onlNoise1gOfni', '/TILE/ONL01/NOISE/OFNI', defConnStr, "", '/TILE/ONL01/NOISE/OFNI', 'SplitMC') - - -#--- status -tileCoolMgr.addSource('onlStatAdc', '/TILE/ONL01/STATUS/ADC', defConnStr, "", '/TILE/ONL01/STATUS/ADC', 'SplitMC') +from TileConditions.TileCoolMgrClass import TileCoolMgr +from AthenaCommon.GlobalFlags import globalflags +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +from IOVDbSvc.CondDB import conddb -#--- OFCs OF2 -tileCoolMgr.addSource('OfcOf2CisPl100', '/TILE/ONL01/FILTER/OF2/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/CIS', 'SplitMC') -tileCoolMgr.addSource('OfcOf2CisPl5p2', '/TILE/ONL01/FILTER/OF2/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/CIS', 'SplitMC') -tileCoolMgr.addSource('OfcOf2Las', '/TILE/ONL01/FILTER/OF2/LAS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/LAS', 'SplitMC') +import string -#--- OFCs OF1 -tileCoolMgr.addSource('OfcOf1CisPl100', '/TILE/ONL01/FILTER/OF1/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/CIS', 'SplitMC') -tileCoolMgr.addSource('OfcOf1CisPl5p2', '/TILE/ONL01/FILTER/OF1/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/CIS', 'SplitMC') -tileCoolMgr.addSource('OfcOf1Las', '/TILE/ONL01/FILTER/OF1/LAS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/LAS', 'SplitMC') +tileCoolMgr = TileCoolMgr(isMC=(globalflags.DataSource()!='data'), + isOnline=athenaCommonFlags.isOnline(), + dbInstance=conddb.GetInstance()) def GetTileOfcCoolSource(ofcType, runType = 'PHY'): return 'Ofc' + string.capwords(ofcType,'/').replace('/','') + runType.lower().capitalize() @@ -270,99 +28,5 @@ def AddTileOfcCoolSource(ofcType, runType = 'PHY', splitOnline = False): else: tileCoolMgr.addSource(ofcSource, ofcFolder, defConnStr, "", ofcFolder, 'SplitMC') -from IOVDbSvc.CondDB import conddb -if conddb.GetInstance() == 'CONDBR2': - - #--- OFCs - tileCoolMgr.addSource('OfcOf2Phy', '/TILE/ONL01/FILTER/OF2/PHY', defConnStr, "", '/TILE/OFL02/FILTER/OF2/PHY', 'SplitOnline') - tileCoolMgr.addSource('OfcOf1Phy', '/TILE/ONL01/FILTER/OF1/PHY', defConnStr, "", '/TILE/OFL02/FILTER/OF1/PHY', 'SplitOnline') - - #--- energy calibration - tileCoolMgr.addSource('oflCisFitLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/LIN', 'SplitOnline') - tileCoolMgr.addSource('oflCisFitNln', '/TILE/ONL01/CALIB/CIS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/NLN', 'SplitOnline') - tileCoolMgr.addSource('oflLasNln', '/TILE/ONL01/CALIB/LAS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/NLN', 'SplitOnline') - tileCoolMgr.addSource('oflLasFib', '/TILE/OFL02/CALIB/LAS/FIBER', oflConnStr, "", "", 'OfflineOnly') - - #--- pulse shape - tileCoolMgr.addSource('oflPlsPhy', '/TILE/OFL02/PULSESHAPE/PHY', oflConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflPlsLas', '/TILE/OFL02/PULSESHAPE/LAS', oflConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflPlsCisPl100', '/TILE/OFL02/PULSESHAPE/CIS/PULSE100', oflConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflPlsCisPl5p2', '/TILE/OFL02/PULSESHAPE/CIS/PULSE5P2', oflConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflPlsCisLk100', '/TILE/OFL02/PULSESHAPE/CIS/LEAK100', oflConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflPlsCisLk5p2', '/TILE/OFL02/PULSESHAPE/CIS/LEAK5P2', oflConnStr, "", "", 'OfflineOnly') - - #--- noise - tileCoolMgr.addSource('oflNoiseAdc', '/TILE/ONL01/NOISE/SAMPLE', defConnStr, "", '/TILE/OFL02/NOISE/SAMPLE', 'SplitOnline') - tileCoolMgr.addSource('onlNoiseAdc', '/TILE/ONL01/NOISE/SAMPLE', defConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflNoiseAcr', '/TILE/OFL02/NOISE/AUTOCR', oflConnStr, "", "", 'OfflineOnly') - - #--- timing - tileCoolMgr.addSource('oflTimeCphy', '/TILE/ONL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/PHY', 'SplitOnline') - tileCoolMgr.addSource('onlTimeCphy', '/TILE/ONL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflTimeClas', '/TILE/ONL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/LAS', 'SplitOnline') - tileCoolMgr.addSource('onlTimeClas', '/TILE/ONL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflTimeCgapLas', '/TILE/ONL01/TIME/CHANNELOFFSET/GAP/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/GAP/LAS', 'SplitOnline') - tileCoolMgr.addSource('onlTimeCgapLas', '/TILE/ONL01/TIME/CHANNELOFFSET/GAP/LAS', defConnStr, "", "", 'OfflineOnly') - tileCoolMgr.addSource('oflTimeCcis', '/TILE/ONL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/CIS', 'SplitOnline') - tileCoolMgr.addSource('onlTimeCcis', '/TILE/ONL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", "", 'OfflineOnly') - - #--- integrator - tileCoolMgr.addSource('oflIntGain', '/TILE/ONL01/INTEGRATOR', defConnStr, "", '/TILE/OFL02/INTEGRATOR', 'SplitOnline') - - #--- status - tileCoolMgr.addSource('oflStatAdc', '/TILE/OFL02/STATUS/ADC', oflConnStr, "", "", 'OfflineOnly') - - - #--- TMDB - tileCoolMgr.addSource('onlTmdbThresholdPhy', '/TILE/ONL01/TMDB/THRESHOLD/PHY', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/PHY', 'SplitMC') - tileCoolMgr.addSource('onlTmdbThresholdLas', '/TILE/ONL01/TMDB/THRESHOLD/LAS', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/LAS', 'SplitMC') - tileCoolMgr.addSource('onlTmdbThresholdCis', '/TILE/ONL01/TMDB/THRESHOLD/CIS', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/CIS', 'SplitMC') - - tileCoolMgr.addSource('onlTmdbDelayPhy', '/TILE/ONL01/TMDB/DELAY/PHY', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/PHY', 'SplitMC') - tileCoolMgr.addSource('onlTmdbDelayLas', '/TILE/ONL01/TMDB/DELAY/LAS', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/LAS', 'SplitMC') - tileCoolMgr.addSource('onlTmdbDelayCis', '/TILE/ONL01/TMDB/DELAY/CIS', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/CIS', 'SplitMC') - - tileCoolMgr.addSource('onlTmdbTmfPhy', '/TILE/ONL01/TMDB/TMF/PHY', defConnStr, "", '/TILE/ONL01/TMDB/TMF/PHY', 'SplitMC') - tileCoolMgr.addSource('onlTmdbTmfLas', '/TILE/ONL01/TMDB/TMF/LAS', defConnStr, "", '/TILE/ONL01/TMDB/TMF/LAS', 'SplitMC') - tileCoolMgr.addSource('onlTmdbTmfCis', '/TILE/ONL01/TMDB/TMF/CIS', defConnStr, "", '/TILE/ONL01/TMDB/TMF/CIS', 'SplitMC') - - tileCoolMgr.addSource('onlTmdbCalibPhy', '/TILE/ONL01/TMDB/CALIB/PHY', defConnStr, "", '/TILE/ONL01/TMDB/CALIB/PHY', 'SplitMC') - - #--- noise - tileCoolMgr.addSource('oflDspThreshold', '/TILE/ONL01/DSP/THRESHOLD', defConnStr, "", '/TILE/OFL02/DSP/THRESHOLD', 'SplitOnline') - - -else: - - #--- OFCs - tileCoolMgr.addSource('OfcOf2Phy', '/TILE/ONL01/FILTER/OF2/PHY', defConnStr, "", '/TILE/ONL01/FILTER/OF2/PHY', 'SplitMC') - tileCoolMgr.addSource('OfcOf1Phy', '/TILE/ONL01/FILTER/OF1/PHY', defConnStr, "", '/TILE/ONL01/FILTER/OF1/PHY', 'SplitMC') - - #--- energy calibration - tileCoolMgr.addSource('oflCisFitLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/LIN', 'SplitOnline') - tileCoolMgr.addSource('oflCisFitNln', '/TILE/OFL01/CALIB/CIS/FIT/NLN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/NLN', 'SplitOnline') - tileCoolMgr.addSource('oflLasNln', '/TILE/OFL01/CALIB/LAS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/NLN', 'SplitOnline') - tileCoolMgr.addSource('oflLasFib', '/TILE/OFL01/CALIB/LAS/FIBER', defConnStr, "", '/TILE/OFL02/CALIB/LAS/FIBER', 'SplitOnline') - #--- pulse shape - tileCoolMgr.addSource('oflPlsPhy', '/TILE/OFL01/PULSESHAPE/PHY', defConnStr, "", '/TILE/OFL02/PULSESHAPE/PHY', 'SplitOnline') - tileCoolMgr.addSource('oflPlsLas', '/TILE/OFL01/PULSESHAPE/LAS', defConnStr, "", '/TILE/OFL02/PULSESHAPE/LAS', 'SplitOnline') - tileCoolMgr.addSource('oflPlsCisPl100', '/TILE/OFL01/PULSESHAPE/CIS/PULSE100', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/PULSE100', 'SplitOnline') - tileCoolMgr.addSource('oflPlsCisPl5p2', '/TILE/OFL01/PULSESHAPE/CIS/PULSE5P2', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/PULSE5P2', 'SplitOnline') - tileCoolMgr.addSource('oflPlsCisLk100', '/TILE/OFL01/PULSESHAPE/CIS/LEAK100', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/LEAK100', 'SplitOnline') - tileCoolMgr.addSource('oflPlsCisLk5p2', '/TILE/OFL01/PULSESHAPE/CIS/LEAK5P2', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/LEAK5P2', 'SplitOnline') - - #--- noise - tileCoolMgr.addSource('oflNoiseAdc', '/TILE/OFL01/NOISE/SAMPLE', defConnStr, "", '/TILE/OFL02/NOISE/SAMPLE', 'SplitOnline') - tileCoolMgr.addSource('oflNoiseAcr', '/TILE/OFL01/NOISE/AUTOCR', defConnStr, "", '/TILE/OFL02/NOISE/AUTOCR', 'SplitOnline') - - #--- timing - tileCoolMgr.addSource('oflTimeCphy', '/TILE/OFL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/PHY', 'SplitOnline') - tileCoolMgr.addSource('oflTimeClas', '/TILE/OFL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/LAS', 'SplitOnline') - tileCoolMgr.addSource('oflTimeCcis', '/TILE/OFL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/CIS', 'SplitOnline') - - #--- integrator - tileCoolMgr.addSource('oflIntGain', '/TILE/OFL01/INTEGRATOR', defConnStr, "", '/TILE/OFL02/INTEGRATOR', 'SplitOnline') - #--- status - tileCoolMgr.addSource('oflStatAdc', '/TILE/OFL01/STATUS/ADC', defConnStr, "", '/TILE/OFL02/STATUS/ADC', 'SplitOnline') diff --git a/TileCalorimeter/TileConditions/python/TileCoolMgrClass.py b/TileCalorimeter/TileConditions/python/TileCoolMgrClass.py new file mode 100644 index 000000000000..62d0e448e343 --- /dev/null +++ b/TileCalorimeter/TileConditions/python/TileCoolMgrClass.py @@ -0,0 +1,356 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +#file: TileCoolMgr.py +#author: nils.gollub@cern.ch +#modifications: lukas.pribyl@cern.ch + +class TileCoolMgr: + + #_______________________________________________________________ + def __init__(self,isMC,isOnline,dbInstance): + + #=== initialize logger with INFO level + from AthenaCommon.Logging import logging + self.__log = logging.getLogger( 'TileCoolMgr' ) + # self.__log.setLevel(logging.INFO) + + #=== Master dictionary for: condId -> [folder, connStr, tag, folder2, type] + self.__idDict = {} + + #=== Available folder types + self.__validTypes = ["SplitMC", "SplitOnline", "OfflineOnly", "Sqlite"] + + #=== do we run on real data (not MC)? + self._isMC=isMC + self._isOnline=isOnline + self._dbInstance=dbInstance + + self.fillMe() + + + def isMC(self): + return self._isMC + + def isOnline(self): + return self._isOnline + + + #_______________________________________________________________ + def addSource(self, condId, folder, connStr, tag, folder2, type, key = ""): + if type not in self.__validTypes: + self.__log.error("Folder type \'%s\' not recognized!" % type) + if (type != "OfflineOnly") and (folder2 == ""): + self.__log.error("For folder type \'%s\' second folder name required!" % type) + self.__idDict[condId] = [folder, connStr, tag, folder2, type, key] + + #_______________________________________________________________ + def getFolder(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + return idInfo[0] + #_______________________________________________________________ + def getKey(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + elif idInfo[5] != "": return idInfo[5] + elif len(self.getTag(condId)): return self.getTag(condId) + else: + folder = self.getActualFolder(condId) + if folder: return folder + else: + self.__log.error("Cannot find out key for \'%s\'!" % condId) + return None + + #_______________________________________________________________ + def getFolderTwo(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + return idInfo[3] + + #_______________________________________________________________ + def isSplitMC(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + if idInfo[4]=="SplitMC": return True + else: return False + + #_______________________________________________________________ + def isSplitOnline(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + if idInfo[4]=="SplitOnline": return True + else: return False + + #_______________________________________________________________ + def isOfflineOnly(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + if idInfo[4]=="OfflineOnly": return True + else: return False + + #_______________________________________________________________ + def isSqlite(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + return None + else: + if idInfo[4]=="Sqlite": return True + else: return False + + + #_______________________________________________________________ + def setFolder(self, condId, folder): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + self.__log.info("Setting folder for condId \'%s\' to \'%s\'" % (condId,folder)) + idInfo[0] = folder + idInfo[3] = folder + + #_______________________________________________________________ + def setDbConn(self, condId, dbConn): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + self.__log.info("Setting dbConn for condId \'%s\' to \'%s\'" % (condId,dbConn)) + idInfo[1] = dbConn + from string import find + if find(dbConn,".db")>0: + self.__log.info("The data source looks like sqlite file (.db), setting folder type to Sqlite") + self.__idDict[condId][4] = "Sqlite" + + #_______________________________________________________________ + def getDbConn(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + return idInfo[1] + + #_______________________________________________________________ + def setTag(self, condId, tag): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + if len(tag) > 0: + if not tag.startswith('Tile'): + tag = self.getTagPrefix(self.getActualFolder(condId)) + tag + self.__log.info("Setting tag for condId \'%s\' to \'%s\'" % (condId,tag)) + idInfo[2] = tag + + #_______________________________________________________________ + def getTag(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + return idInfo[2] + + #_______________________________________________________________ + def setGlobalDbConn(self, dbConn): + for condId in self.__idDict.keys(): + self.setDbConn(condId,dbConn) + + #_______________________________________________________________ + def setGlobalTag(self, tag): + for condId in self.__idDict.keys(): + self.setTag(condId,tag) + + #_______________________________________________________________ + def getTagPrefix(self, coolFolder): + folderTag="" + for i in coolFolder.lower().split("/")[1:]: + folderTag+=i.capitalize() + folderTag+="-" + return folderTag + + #_______________________________________________________________ + def getConnectionString(self, condId): + idInfo = self.__idDict.get(condId) + if not idInfo: + self.__log.error("CondId \'%s\' not recognized!" % condId) + else: + fullStr = idInfo[1]+" " + if len(idInfo[2]): + fullStr += idInfo[2]+" " + fullStr += idInfo[0] + return fullStr + + + def isSourceAvailable(self, source): + return source in self.__idDict + + + def getActualFolder(self, condId): + if self.isOfflineOnly(condId): return self.getFolder(condId) + elif self.isSplitOnline(condId): + if self.isOnline() and not self.isMC(): return self.getFolder(condId) + else: return self.getFolderTwo(condId) + elif self.isSplitMC(condId): + if self.isMC(): return self.getFolderTwo(condId) + else: return self.getFolder(condId) + elif self.isSqlite(condId): return self.getFolder(condId) + else: return None + + + + + def fillMe(self): + defConnStr = 'TILE' + oflConnStr = 'TILE_OFL' + #--- energy calibration + + self.addSource('oflLasLin', '/TILE/ONL01/CALIB/LAS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/LIN', 'SplitOnline') + self.addSource('oflCes', '/TILE/ONL01/CALIB/CES', defConnStr, "", '/TILE/OFL02/CALIB/CES', 'SplitOnline') + self.addSource('oflEms', '/TILE/ONL01/CALIB/EMS', defConnStr, "", '/TILE/OFL02/CALIB/EMS', 'SplitOnline') + + #--- online calib is taken from the folder tag defined in TileOfcCoolPlugin + #--- the tags are fixed only in the case of real data - in both online and offline schema. + self.addSource('onlCisLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/LIN', 'SplitMC') + self.addSource('onlLasLin', '/TILE/ONL01/CALIB/LAS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/LIN', 'SplitMC') + self.addSource('onlCes', '/TILE/ONL01/CALIB/CES', defConnStr, "", '/TILE/OFL02/CALIB/CES', 'SplitMC') + self.addSource('onlEms', '/TILE/ONL01/CALIB/EMS', defConnStr, "", '/TILE/OFL02/CALIB/EMS', 'SplitMC') + + #--- MuID + self.addSource('onlMuID' , '/TILE/ONL01/MUID', defConnStr, "", '/TILE/ONL01/MUID', 'SplitMC') + + #--- noise + self.addSource('onlNoise1gOfni', '/TILE/ONL01/NOISE/OFNI', defConnStr, "", '/TILE/ONL01/NOISE/OFNI', 'SplitMC') + + + #--- status + self.addSource('onlStatAdc', '/TILE/ONL01/STATUS/ADC', defConnStr, "", '/TILE/ONL01/STATUS/ADC', 'SplitMC') + + #--- OFCs OF2 + self.addSource('OfcOf2CisPl100', '/TILE/ONL01/FILTER/OF2/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/CIS', 'SplitMC') + self.addSource('OfcOf2CisPl5p2', '/TILE/ONL01/FILTER/OF2/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/CIS', 'SplitMC') + self.addSource('OfcOf2Las', '/TILE/ONL01/FILTER/OF2/LAS', defConnStr, "", '/TILE/ONL01/FILTER/OF2/LAS', 'SplitMC') + + #--- OFCs OF1 + self.addSource('OfcOf1CisPl100', '/TILE/ONL01/FILTER/OF1/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/CIS', 'SplitMC') + self.addSource('OfcOf1CisPl5p2', '/TILE/ONL01/FILTER/OF1/CIS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/CIS', 'SplitMC') + self.addSource('OfcOf1Las', '/TILE/ONL01/FILTER/OF1/LAS', defConnStr, "", '/TILE/ONL01/FILTER/OF1/LAS', 'SplitMC') + + + if (self._dbInstance == 'CONDBR2'): + #--- OFCs + self.addSource('OfcOf2Phy', '/TILE/ONL01/FILTER/OF2/PHY', defConnStr, "", '/TILE/OFL02/FILTER/OF2/PHY', 'SplitOnline') + self.addSource('OfcOf1Phy', '/TILE/ONL01/FILTER/OF1/PHY', defConnStr, "", '/TILE/OFL02/FILTER/OF1/PHY', 'SplitOnline') + + #--- energy calibration + self.addSource('oflCisFitLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/LIN', 'SplitOnline') + self.addSource('oflCisFitNln', '/TILE/ONL01/CALIB/CIS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/NLN', 'SplitOnline') + self.addSource('oflLasNln', '/TILE/ONL01/CALIB/LAS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/NLN', 'SplitOnline') + self.addSource('oflLasFib', '/TILE/OFL02/CALIB/LAS/FIBER', oflConnStr, "", "", 'OfflineOnly') + + #--- pulse shape + self.addSource('oflPlsPhy', '/TILE/OFL02/PULSESHAPE/PHY', oflConnStr, "", "", 'OfflineOnly') + self.addSource('oflPlsLas', '/TILE/OFL02/PULSESHAPE/LAS', oflConnStr, "", "", 'OfflineOnly') + self.addSource('oflPlsCisPl100', '/TILE/OFL02/PULSESHAPE/CIS/PULSE100', oflConnStr, "", "", 'OfflineOnly') + self.addSource('oflPlsCisPl5p2', '/TILE/OFL02/PULSESHAPE/CIS/PULSE5P2', oflConnStr, "", "", 'OfflineOnly') + self.addSource('oflPlsCisLk100', '/TILE/OFL02/PULSESHAPE/CIS/LEAK100', oflConnStr, "", "", 'OfflineOnly') + self.addSource('oflPlsCisLk5p2', '/TILE/OFL02/PULSESHAPE/CIS/LEAK5P2', oflConnStr, "", "", 'OfflineOnly') + + #--- noise + self.addSource('oflNoiseAdc', '/TILE/ONL01/NOISE/SAMPLE', defConnStr, "", '/TILE/OFL02/NOISE/SAMPLE', 'SplitOnline') + self.addSource('onlNoiseAdc', '/TILE/ONL01/NOISE/SAMPLE', defConnStr, "", "", 'OfflineOnly') + self.addSource('oflNoiseAcr', '/TILE/OFL02/NOISE/AUTOCR', oflConnStr, "", "", 'OfflineOnly') + + #--- timing + self.addSource('oflTimeCphy', '/TILE/ONL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/PHY', 'SplitOnline') + self.addSource('onlTimeCphy', '/TILE/ONL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", "", 'OfflineOnly') + self.addSource('oflTimeClas', '/TILE/ONL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/LAS', 'SplitOnline') + self.addSource('onlTimeClas', '/TILE/ONL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", "", 'OfflineOnly') + self.addSource('oflTimeCgapLas', '/TILE/ONL01/TIME/CHANNELOFFSET/GAP/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/GAP/LAS', 'SplitOnline') + self.addSource('onlTimeCgapLas', '/TILE/ONL01/TIME/CHANNELOFFSET/GAP/LAS', defConnStr, "", "", 'OfflineOnly') + self.addSource('oflTimeCcis', '/TILE/ONL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/CIS', 'SplitOnline') + self.addSource('onlTimeCcis', '/TILE/ONL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", "", 'OfflineOnly') + + #--- integrator + self.addSource('oflIntGain', '/TILE/ONL01/INTEGRATOR', defConnStr, "", '/TILE/OFL02/INTEGRATOR', 'SplitOnline') + + #--- status + self.addSource('oflStatAdc', '/TILE/OFL02/STATUS/ADC', oflConnStr, "", "", 'OfflineOnly') + + + #--- TMDB + self.addSource('onlTmdbThresholdPhy', '/TILE/ONL01/TMDB/THRESHOLD/PHY', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/PHY', 'SplitMC') + self.addSource('onlTmdbThresholdLas', '/TILE/ONL01/TMDB/THRESHOLD/LAS', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/LAS', 'SplitMC') + self.addSource('onlTmdbThresholdCis', '/TILE/ONL01/TMDB/THRESHOLD/CIS', defConnStr, "", '/TILE/ONL01/TMDB/THRESHOLD/CIS', 'SplitMC') + + self.addSource('onlTmdbDelayPhy', '/TILE/ONL01/TMDB/DELAY/PHY', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/PHY', 'SplitMC') + self.addSource('onlTmdbDelayLas', '/TILE/ONL01/TMDB/DELAY/LAS', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/LAS', 'SplitMC') + self.addSource('onlTmdbDelayCis', '/TILE/ONL01/TMDB/DELAY/CIS', defConnStr, "", '/TILE/ONL01/TMDB/DELAY/CIS', 'SplitMC') + + self.addSource('onlTmdbTmfPhy', '/TILE/ONL01/TMDB/TMF/PHY', defConnStr, "", '/TILE/ONL01/TMDB/TMF/PHY', 'SplitMC') + self.addSource('onlTmdbTmfLas', '/TILE/ONL01/TMDB/TMF/LAS', defConnStr, "", '/TILE/ONL01/TMDB/TMF/LAS', 'SplitMC') + self.addSource('onlTmdbTmfCis', '/TILE/ONL01/TMDB/TMF/CIS', defConnStr, "", '/TILE/ONL01/TMDB/TMF/CIS', 'SplitMC') + + self.addSource('onlTmdbCalibPhy', '/TILE/ONL01/TMDB/CALIB/PHY', defConnStr, "", '/TILE/ONL01/TMDB/CALIB/PHY', 'SplitMC') + + #--- noise + self.addSource('oflDspThreshold', '/TILE/ONL01/DSP/THRESHOLD', defConnStr, "", '/TILE/OFL02/DSP/THRESHOLD', 'SplitOnline') + else: + + #--- OFCs + self.addSource('OfcOf2Phy', '/TILE/ONL01/FILTER/OF2/PHY', defConnStr, "", '/TILE/ONL01/FILTER/OF2/PHY', 'SplitMC') + self.addSource('OfcOf1Phy', '/TILE/ONL01/FILTER/OF1/PHY', defConnStr, "", '/TILE/ONL01/FILTER/OF1/PHY', 'SplitMC') + + #--- energy calibration + self.addSource('oflCisFitLin', '/TILE/ONL01/CALIB/CIS/LIN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/LIN', 'SplitOnline') + self.addSource('oflCisFitNln', '/TILE/OFL01/CALIB/CIS/FIT/NLN', defConnStr, "", '/TILE/OFL02/CALIB/CIS/FIT/NLN', 'SplitOnline') + self.addSource('oflLasNln', '/TILE/OFL01/CALIB/LAS/NLN', defConnStr, "", '/TILE/OFL02/CALIB/LAS/NLN', 'SplitOnline') + self.addSource('oflLasFib', '/TILE/OFL01/CALIB/LAS/FIBER', defConnStr, "", '/TILE/OFL02/CALIB/LAS/FIBER', 'SplitOnline') + #--- pulse shape + self.addSource('oflPlsPhy', '/TILE/OFL01/PULSESHAPE/PHY', defConnStr, "", '/TILE/OFL02/PULSESHAPE/PHY', 'SplitOnline') + self.addSource('oflPlsLas', '/TILE/OFL01/PULSESHAPE/LAS', defConnStr, "", '/TILE/OFL02/PULSESHAPE/LAS', 'SplitOnline') + self.addSource('oflPlsCisPl100', '/TILE/OFL01/PULSESHAPE/CIS/PULSE100', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/PULSE100', 'SplitOnline') + self.addSource('oflPlsCisPl5p2', '/TILE/OFL01/PULSESHAPE/CIS/PULSE5P2', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/PULSE5P2', 'SplitOnline') + self.addSource('oflPlsCisLk100', '/TILE/OFL01/PULSESHAPE/CIS/LEAK100', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/LEAK100', 'SplitOnline') + self.addSource('oflPlsCisLk5p2', '/TILE/OFL01/PULSESHAPE/CIS/LEAK5P2', defConnStr, "", '/TILE/OFL02/PULSESHAPE/CIS/LEAK5P2', 'SplitOnline') + + #--- noise + self.addSource('oflNoiseAdc', '/TILE/OFL01/NOISE/SAMPLE', defConnStr, "", '/TILE/OFL02/NOISE/SAMPLE', 'SplitOnline') + self.addSource('oflNoiseAcr', '/TILE/OFL01/NOISE/AUTOCR', defConnStr, "", '/TILE/OFL02/NOISE/AUTOCR', 'SplitOnline') + + #--- timing + self.addSource('oflTimeCphy', '/TILE/OFL01/TIME/CHANNELOFFSET/PHY', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/PHY', 'SplitOnline') + self.addSource('oflTimeClas', '/TILE/OFL01/TIME/CHANNELOFFSET/LAS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/LAS', 'SplitOnline') + self.addSource('oflTimeCcis', '/TILE/OFL01/TIME/CHANNELOFFSET/CIS', defConnStr, "", '/TILE/OFL02/TIME/CHANNELOFFSET/CIS', 'SplitOnline') + + #--- integrator + self.addSource('oflIntGain', '/TILE/OFL01/INTEGRATOR', defConnStr, "", '/TILE/OFL02/INTEGRATOR', 'SplitOnline') + + #--- status + self.addSource('oflStatAdc', '/TILE/OFL01/STATUS/ADC', defConnStr, "", '/TILE/OFL02/STATUS/ADC', 'SplitOnline') + pass + + + +def TileCoolMgrConfig(configflags): + #Instantiate TileCoolMgr based on run3-style config flags + return TileCoolMgr(isMC=configFlags.Input.isMC, + isOnline=configFlags.common.isOnline, + dbInstance=configFlags.IOVDb.DatabaseInstance) + -- GitLab From 589a6cd149d04c400c1db064eeccfcd4c475c194 Mon Sep 17 00:00:00 2001 From: Rupert Tombs <rt500@cam.ac.uk> Date: Mon, 11 Mar 2019 17:51:11 +0000 Subject: [PATCH 035/163] ComponentAccumulator configuration for SCT and Pixel inner detectors. With ToolSetup dependencies also converted to new style. ConfigFlags initialisation set up for Digitization and Overlay. Tests for all new modules Add ConditionsStore StoreGateSvc Remove Pixel config update --- .../python/AllConfigFlags.py | 4 + .../python/OverlayConfigFlags.py | 19 ++ .../PixelConditionsTools/CMakeLists.txt | 4 + .../python/PixelConditionsSummaryConfig.py | 35 +++ .../python/PixelDCSConditionsConfig.py | 31 +++ .../test/PixelConditionsConfig_test.py | 25 ++ .../SCT_ConditionsTools/CMakeLists.txt | 5 + .../python/SCT_DCSConditionsConfig.py | 48 ++++ .../python/SCT_ReadCalibChipDataConfig.py | 33 +++ .../python/SCT_SiliconConditionsConfig.py | 34 +++ .../test/SCT_ConditionsConfig_test.py | 29 ++ .../SiLorentzAngleTool/CMakeLists.txt | 4 + .../python/PixelLorentzAngleConfig.py | 34 +++ .../python/SCT_LorentzAngleConfig.py | 57 ++++ .../test/SiLorentzAngleConfig_test.py | 31 +++ .../SiPropertiesTool/CMakeLists.txt | 5 + .../python/PixelSiPropertiesConfig.py | 25 ++ .../python/SCT_SiPropertiesConfig.py | 25 ++ .../test/SiPropertiesConfig_test.py | 25 ++ .../InDetDetDescr/PixelCabling/CMakeLists.txt | 4 + .../python/PixelCablingConfigNew.py | 100 +++++++ .../test/PixelCablingConfigNew_test.py | 21 ++ .../python/BCM_DigitizationConfigNew.py | 4 +- .../test/BCM_DigitizationConfigNew_test.py | 39 +-- .../SCT_Digitization/CMakeLists.txt | 4 + .../python/SCT_DigitizationConfigNew.py | 254 ++++++++++++++++++ .../test/SCT_DigitizationConfigNew_test.py | 73 +++++ .../python/DigitizationConfigFlags.py | 19 ++ 28 files changed, 970 insertions(+), 21 deletions(-) create mode 100644 Event/EventOverlay/OverlayCommonAlgs/python/OverlayConfigFlags.py create mode 100644 InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryConfig.py create mode 100644 InnerDetector/InDetConditions/PixelConditionsTools/python/PixelDCSConditionsConfig.py create mode 100755 InnerDetector/InDetConditions/PixelConditionsTools/test/PixelConditionsConfig_test.py create mode 100644 InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_DCSConditionsConfig.py create mode 100644 InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_ReadCalibChipDataConfig.py create mode 100644 InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_SiliconConditionsConfig.py create mode 100755 InnerDetector/InDetConditions/SCT_ConditionsTools/test/SCT_ConditionsConfig_test.py create mode 100644 InnerDetector/InDetConditions/SiLorentzAngleTool/python/PixelLorentzAngleConfig.py create mode 100644 InnerDetector/InDetConditions/SiLorentzAngleTool/python/SCT_LorentzAngleConfig.py create mode 100755 InnerDetector/InDetConditions/SiLorentzAngleTool/test/SiLorentzAngleConfig_test.py create mode 100644 InnerDetector/InDetConditions/SiPropertiesTool/python/PixelSiPropertiesConfig.py create mode 100644 InnerDetector/InDetConditions/SiPropertiesTool/python/SCT_SiPropertiesConfig.py create mode 100755 InnerDetector/InDetConditions/SiPropertiesTool/test/SiPropertiesConfig_test.py create mode 100644 InnerDetector/InDetDetDescr/PixelCabling/python/PixelCablingConfigNew.py create mode 100755 InnerDetector/InDetDetDescr/PixelCabling/test/PixelCablingConfigNew_test.py create mode 100644 InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigNew.py create mode 100755 InnerDetector/InDetDigitization/SCT_Digitization/test/SCT_DigitizationConfigNew_test.py create mode 100644 Simulation/Digitization/python/DigitizationConfigFlags.py diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py index 3dbc6b7a75c8..c47cf0cd001e 100644 --- a/Control/AthenaConfiguration/python/AllConfigFlags.py +++ b/Control/AthenaConfiguration/python/AllConfigFlags.py @@ -70,6 +70,8 @@ def _createCfgFlags(): acf.addFlag("GeoModel.Align.Dynamic", lambda prevFlags : (not prevFlags.Detector.Simulate)) acf.addFlag("GeoModel.StripGeoType", "GMX") # Based on CommonGeometryFlags.StripGeoType acf.addFlag("GeoModel.Run","RUN2") # Based on CommonGeometryFlags.Run (InDetGeometryFlags.isSLHC replaced by GeoModel.Run=="RUN4") + acf.addFlag("GeoModel.Type", "UNDEFINED") # Geometry type in {ITKLoI, ITkLoI-VF, etc...} + acf.addFlag("GeoModel.IBLLayout", "UNDEFINED") # IBL layer layout in {"planar", "3D", "noIBL", "UNDEFINED"} #IOVDbSvc Flags: acf.addFlag("IOVDb.GlobalTag",lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("ConditionsTag","CONDBR2-BLKPA-2017-05")) @@ -94,6 +96,8 @@ def _createCfgFlags(): acf.addFlag("Calo.TopoCluster.doTreatEnergyCutAsAbsolute",False) acf.addFlag("Calo.TopoCluster.doTopoClusterLocalCalib",True) +#Random engine Flags: + acf.addFlag("Random.Engine", "dSFMT") # Random service used in {"dSFMT", "Ranlux64", "Ranecu"} def __trigger(): from TriggerJobOpts.TriggerConfigFlags import createTriggerFlags diff --git a/Event/EventOverlay/OverlayCommonAlgs/python/OverlayConfigFlags.py b/Event/EventOverlay/OverlayCommonAlgs/python/OverlayConfigFlags.py new file mode 100644 index 000000000000..19092cba371d --- /dev/null +++ b/Event/EventOverlay/OverlayCommonAlgs/python/OverlayConfigFlags.py @@ -0,0 +1,19 @@ +"""Construct ConfigFlags for Overlay + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.AthConfigFlags import AthConfigFlags + +def createOverlayCfgFlags(): + """Return an AthConfigFlags object with required flags""" + flags = AthConfigFlags() + # Overlay background StoreGate key prefix + flags.addFlag("Overlay.BkgPrefix", "Bkg_") + # Overlay signal StoreGate key prefix + flags.addFlag("Overlay.SigPrefix", "Sig_") + # Are we multithreaded? + flags.addFlag("Overlay.Legacy.MT", False) + # Name of MC EvtStore to overlay + flags.addFlag("Overlay.Legacy.EventStore", "BkgEvent_0_SG") + return flags + diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt b/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt index 0209bebcef78..ac5761032a35 100644 --- a/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt +++ b/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt @@ -51,6 +51,10 @@ atlas_add_component( PixelConditionsTools INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} LINK_LIBRARIES ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaKernel GeoPrimitives GaudiKernel AthenaBaseComps SGTools AthenaPoolUtilities DetDescrConditions Identifier PixelConditionsData PixelCoralClientUtils InDetIdentifier GeoModelUtilities InDetReadoutGeometry PathResolver ${extra_lib} ) +atlas_add_test( PixelConditionsConfig_test + SCRIPT test/PixelConditionsConfig_test.py + PROPERTIES TIMEOUT 30 ) + # Install files from the package: atlas_install_headers( PixelConditionsTools ) atlas_install_joboptions( share/*.py ) diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryConfig.py b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryConfig.py new file mode 100644 index 000000000000..1f5af82d70f2 --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelConditionsSummaryConfig.py @@ -0,0 +1,35 @@ +"""Define methods to configure PixelConditionsSummary + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from IOVDbSvc.IOVDbSvcConfig import addFolders, addFoldersSplitOnline +from PixelConditionsTools.PixelConditionsToolsConf import PixelConditionsSummaryTool +from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelTDAQCondAlg +from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelConfigCondAlg +from PixelConditionsTools.PixelDCSConditionsConfig import PixelDCSConditionsCfg + +def PixelConditionsSummaryCfg(flags, name="PixelConditionsSummary", **kwargs): + """Return configured ComponentAccumulator and tool for PixelDCSConditions""" + acc = ComponentAccumulator() + kwargs.setdefault("UseDCSState", False) + kwargs.setdefault("UseByteStream", False) + kwargs.setdefault("UseTDAQ", False) + kwargs.setdefault("UseDeadMap", True) + PixelDeadMapFolder = "/PIXEL/PixMapOverlay" + if kwargs["UseDCSState"]: + acc.merge(PixelDCSConditionsCfg(flags, DCSConditionsTool=DCSTool)) + if kwargs["UseTDAQ"]: + PixelTDAQFolder = "/TDAQ/Resources/ATLAS/PIXEL/Modules" + acc.merge(addFolders(flags, PixelTDAQFolder, "TDAQ_ONL", "CondAttrListCollection")) + acc.addCondAlgo(PixelTDAQCondAlg(name="PixelTDAQCondAlg", ReadKey=PixelTDAQFolder)) + if kwargs["UseDeadMap"]: + acc.merge(addFolders(flags, PixelDeadMapFolder, "PIXEL_OFL","CondAttrListCollection")) + acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/Onl/PixMapOverlay", + "/PIXEL/PixMapOverlay", "CondAttrListCollection")) + acc.addCondAlgo(PixelConfigCondAlg(name=name + "CondAlg", + UseDeadMap=kwargs["UseDeadMap"], + ReadDeadMapKey=PixelDeadMapFolder)) + tool = PixelConditionsSummaryTool(name=name + "Tool", **kwargs) + return acc, tool + diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelDCSConditionsConfig.py b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelDCSConditionsConfig.py new file mode 100644 index 000000000000..60fd358a48a5 --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsTools/python/PixelDCSConditionsConfig.py @@ -0,0 +1,31 @@ +"""Define methods to configure PixelDCSConditions + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from IOVDbSvc.IOVDbSvcConfig import addFolders +from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelDCSCondStateAlg +from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelDCSCondHVAlg +from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelDCSCondTempAlg + +def PixelDCSConditionsCfg(flags, name="PixelDCSCond", **kwargs): + """Return configured ComponentAccumulator and tool for PixelDCSConditions""" + acc = ComponentAccumulator() + kwargs.setdefault("UseConditions", True) + if flags.Common.isOnline: + hvFolder = "/PIXEL/HLT/DCS/HV" + tempFolder = "/PIXEL/HLT/DCS/TEMPERATURE" + dbInstance = "PIXEL_ONL" + else: + hvFolder = "/PIXEL/DCS/HV" + tempFolder = "/PIXEL/DCS/TEMPERATURE" + dbInstance = "DCS_OFL" + folders = [hvFolder, tempFolder] + if not flags.Input.isMC: + folders.extend(["/PIXEL/DCS/FSMSTATE", "/PIXEL/DCS/FSMSTATUS"]) + acc.addCondAlgo(PixelDCSCondStateAlg(name=name + "StateAlg")) + acc.merge(addFolders(flags, folders, dbInstance, "CondAttrListCollection")) + acc.addCondAlgo(PixelDCSCondHVAlg(name=name + "HVAlg", ReadKey=hvFolder)) + acc.addCondAlgo(PixelDCSCondTempAlg(name=name + "TempAlg", ReadKey=tempFolder)) + return acc + diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/test/PixelConditionsConfig_test.py b/InnerDetector/InDetConditions/PixelConditionsTools/test/PixelConditionsConfig_test.py new file mode 100755 index 000000000000..182a291c0788 --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsTools/test/PixelConditionsConfig_test.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +"""Run tests on PixelConditionsTools/python/*Config.py scripts + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from PixelConditionsTools.PixelDCSConditionsConfig import PixelDCSConditionsCfg +from PixelConditionsTools.PixelConditionsSummaryConfig import PixelConditionsSummaryCfg + +# test setup +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +ConfigFlags.Input.Files = defaultTestFiles.HITS +# test +DCSAcc = PixelDCSConditionsCfg(ConfigFlags, name="DCSTest") +SummaryAcc, SummaryTool = PixelConditionsSummaryCfg(ConfigFlags, name="SummaryTest") +# prevent raise on __del__ +DCSAcc.wasMerged() +SummaryAcc.wasMerged() + diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/CMakeLists.txt b/InnerDetector/InDetConditions/SCT_ConditionsTools/CMakeLists.txt index 6f3c6525d757..6a707095ed0d 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsTools/CMakeLists.txt +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/CMakeLists.txt @@ -52,7 +52,12 @@ atlas_add_test( SCT_RODVetoTool_test LINK_LIBRARIES TestTools SCT_ConditionsToolsLib ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} ENVIRONMENT "JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/share" ) +atlas_add_test( SCT_ConditionsConfig_test + SCRIPT test/SCT_ConditionsConfig_test.py + PROPERTIES TIMEOUT 300 ) + # Install files from the package: atlas_install_headers( SCT_ConditionsTools ) atlas_install_python_modules( python/*.py ) atlas_install_scripts( share/*.py ) + diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_DCSConditionsConfig.py b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_DCSConditionsConfig.py new file mode 100644 index 000000000000..9f09f2eb727d --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_DCSConditionsConfig.py @@ -0,0 +1,48 @@ +"""Define methods to configure SCT_DCSConditions + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from IOVDbSvc.IOVDbSvcConfig import addFolders +from SCT_ConditionsTools.SCT_ConditionsToolsConf import SCT_DCSConditionsTool +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_DCSConditionsStatCondAlg +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_DCSConditionsHVCondAlg +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_DCSConditionsTempCondAlg + +def SCT_DCSConditionsToolCfg(flags, name="InDetSCT_DCSConditionsTool", **kwargs): + """Return a configured SCT_DCSConditionsTool""" + kwargs.setdefault("ReadAllDBFolders", True) + kwargs.setdefault("ReturnHVTemp", True) + return SCT_DCSConditionsTool(name, **kwargs) + +def SCT_DCSConditionsCfg(flags, name="InDetSCT_DCSConditions", **kwargs): + """Return configured ComponentAccumulator and tool for SCT_DCSConditions + + DCSConditionsTool may be provided in kwargs + """ + acc = ComponentAccumulator() + tool = kwargs.get("DCSConditionsTool", SCT_DCSConditionsToolCfg(flags)) + # folder arguments + dbInstance = kwargs.get("dbInstance", "DCS_OFL") + hvFolder = kwargs.get("hvFolder", "/SCT/DCS/HV") + tempFolder = kwargs.get("tempFolder", "/SCT/DCS/MODTEMP") + stateFolder = kwargs.get("stateFolder", "/SCT/DCS/CHANSTAT") + if tool.ReadAllDBFolders == tool.ReturnHVTemp: + acc.merge(addFolders(flags, stateFolder, dbInstance, className="CondAttrListCollection")) + # algo + statArgs = { + "name": name + "StatCondAlg", + "ReturnHVTemp": tool.ReturnHVTemp, + "ReadKeyHV": hvFolder, + "ReadKeyState": stateFolder, + } + statAlg = SCT_DCSConditionsStatCondAlg(**statArgs) + acc.addCondAlgo(statAlg) + if tool.ReturnHVTemp: + acc.merge(addFolders(flags, [hvFolder, tempFolder], dbInstance, className="CondAttrListCollection")) + hvAlg = SCT_DCSConditionsHVCondAlg(name=name + "HVCondAlg", ReadKey=hvFolder) + acc.addCondAlgo(hvAlg) + tempAlg = SCT_DCSConditionsTempCondAlg(name=name + "TempCondAlg", ReadKey=tempFolder) + acc.addCondAlgo(tempAlg) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_ReadCalibChipDataConfig.py b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_ReadCalibChipDataConfig.py new file mode 100644 index 000000000000..0727f41c1158 --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_ReadCalibChipDataConfig.py @@ -0,0 +1,33 @@ +"""Define methods to configure ReadCalibChipDataTool + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline +from SCT_ConditionsTools.SCT_ConditionsToolsConf import SCT_ReadCalibChipDataTool +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_ReadCalibChipNoiseCondAlg +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_ReadCalibChipGainCondAlg + +def SCT_ReadCalibChipDataToolCfg(flags, name="InDetSCT_ReadCalibChipDataTool", **kwargs): + """Return a ReadCalibChipDataTool configured for SCT""" + return SCT_ReadCalibChipDataTool(name, **kwargs) + +def SCT_ReadCalibChipDataCfg(flags, name="SCT_ReadCalibChip", **kwargs): + """Return configured ComponentAccumulator and tool for SCT_ReadCalibChipDataCfg + + Accepts optional noiseFolder and gainFolder keyword arguments + """ + acc = ComponentAccumulator() + # folders + noiseFolder = kwargs.get("noiseFolder", "/SCT/DAQ/Calibration/ChipNoise") + acc.merge(addFoldersSplitOnline(flags, "SCT", noiseFolder, noiseFolder, "CondAttrListCollection")) + gainFolder = kwargs.get("gainFolder", "/SCT/DAQ/Calibration/ChipGain") + acc.merge(addFoldersSplitOnline(flags, "SCT", gainFolder, gainFolder, "CondAttrListCollection")) + # Algorithms + noiseAlg = SCT_ReadCalibChipNoiseCondAlg(name=name + "NoiseCondAlg", ReadKey=noiseFolder) + acc.addCondAlgo(noiseAlg) + gainAlg = SCT_ReadCalibChipGainCondAlg(name=name + "GainCondAlg", ReadKey=gainFolder) + acc.addCondAlgo(gainAlg) + tool = kwargs.get("ReadCalibChipDataTool", SCT_ReadCalibChipDataToolCfg(flags)) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_SiliconConditionsConfig.py b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_SiliconConditionsConfig.py new file mode 100644 index 000000000000..fb841600267f --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/python/SCT_SiliconConditionsConfig.py @@ -0,0 +1,34 @@ +"""Define methods to configure SiPropertiesTool + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_SiliconHVCondAlg +from SCT_ConditionsAlgorithms.SCT_ConditionsAlgorithmsConf import SCT_SiliconTempCondAlg +from SCT_ConditionsTools.SCT_ConditionsToolsConf import SCT_SiliconConditionsTool + +def SCT_SiliconConditionsToolCfg(flags, name="SCT_SiliconConditionsTool", **kwargs): + """Return a configured SCT_SiliconConditionsTool (a.k.a. SiConditionsTool)""" + kwargs.setdefault("UseDB", True) + kwargs.setdefault("ForceUseGeoModel", False) + return SCT_SiliconConditionsTool(name, **kwargs) + +def SCT_SiliconConditionsCfg(flags, name="SCT_Silicon", **kwargs): + """Return configured ComponentAccumulator and tool for SCT_SiliconConditions + + SiConditionsTool and/or DCSConditionsTool may be provided in kwargs + """ + acc = ComponentAccumulator() + tool = kwargs.get("SiConditionsTool", SCT_SiliconConditionsToolCfg(flags)) + if tool.UseDB: + CondArgs = {} + if "DCSConditionsTool" in kwargs: + DCSConditionsTool = kwargs["DCSConditionsTool"] + CondArgs["UseState"] = DCSConditionsTool.ReadAllDBFolders + CondArgs["DCSConditionsTool"] = DCSConditionsTool + hvAlg = SCT_SiliconHVCondAlg(name=name + "HVCondAlg", **CondArgs) + tempAlg = SCT_SiliconTempCondAlg(name=name + "TempCondAlg", **CondArgs) + acc.addCondAlgo(hvAlg) + acc.addCondAlgo(tempAlg) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/test/SCT_ConditionsConfig_test.py b/InnerDetector/InDetConditions/SCT_ConditionsTools/test/SCT_ConditionsConfig_test.py new file mode 100755 index 000000000000..78cdab2ff3f9 --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/test/SCT_ConditionsConfig_test.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +"""Run tests on SCT_ConditionsTools/python/*Config.py scripts + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from SCT_ConditionsTools.SCT_DCSConditionsConfig import SCT_DCSConditionsCfg +from SCT_ConditionsTools.SCT_SiliconConditionsConfig import SCT_SiliconConditionsCfg +from SCT_ConditionsTools.SCT_ReadCalibChipDataConfig import SCT_ReadCalibChipDataCfg + +# test setup +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +ConfigFlags.Input.Files = defaultTestFiles.HITS +# DCS +DCSAcc, DCSTool = SCT_DCSConditionsCfg(ConfigFlags, name="DCSTest") +# Silicon +SiliconAcc, SiliconTool = SCT_SiliconConditionsCfg(ConfigFlags, name="SiliconTest") +# ReadCalibChipData +ReadAcc, ReadTool = SCT_ReadCalibChipDataCfg(ConfigFlags, name="ReadTest") +# prevent raise on __del__ +DCSAcc.wasMerged() +SiliconAcc.wasMerged() +ReadAcc.wasMerged() + diff --git a/InnerDetector/InDetConditions/SiLorentzAngleTool/CMakeLists.txt b/InnerDetector/InDetConditions/SiLorentzAngleTool/CMakeLists.txt index 86125e6f55e0..10122dac8cd6 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleTool/CMakeLists.txt +++ b/InnerDetector/InDetConditions/SiLorentzAngleTool/CMakeLists.txt @@ -41,6 +41,10 @@ atlas_add_test( TestSCTLorentzAngle PROPERTIES TIMEOUT 300 ENVIRONMENT THREADS=5 ) +atlas_add_test( SiLorentzAngleConfig_test + SCRIPT test/SiLorentzAngleConfig_test.py + PROPERTIES TIMEOUT 30 ) + # Install files from the package: atlas_install_headers( SiLorentzAngleTool ) atlas_install_python_modules( python/*.py ) diff --git a/InnerDetector/InDetConditions/SiLorentzAngleTool/python/PixelLorentzAngleConfig.py b/InnerDetector/InDetConditions/SiLorentzAngleTool/python/PixelLorentzAngleConfig.py new file mode 100644 index 000000000000..908a57e1419c --- /dev/null +++ b/InnerDetector/InDetConditions/SiLorentzAngleTool/python/PixelLorentzAngleConfig.py @@ -0,0 +1,34 @@ +"""Define methods to configure SCTLorentzAngleTool + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from SiPropertiesTool.PixelSiPropertiesConfig import PixelSiPropertiesCfg +from SiLorentzAngleTool.SiLorentzAngleToolConf import SiLorentzAngleTool +from SiLorentzAngleTool.SiLorentzAngleToolConf import PixelSiLorentzAngleCondAlg +from PixelConditionsTools.PixelDCSConditionsConfig import PixelDCSConditionsCfg +from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg + +def PixelLorentzAngleToolCfg(flags, name="PixelLorentzAngleTool", **kwargs): + """Return a SiLorentzAngleTool configured for Pixel""" + kwargs.setdefault("DetectorName", "Pixel") + kwargs.setdefault("SiLorentzAngleCondData", "PixelSiLorentzAngleCondData") + kwargs.setdefault("UseMagFieldSvc", True) + return SiLorentzAngleTool(name, **kwargs) + +def PixelLorentzAngleCfg(flags, name="PixelSiLorentzAngleCondAlg", **kwargs): + """Return configured ComponentAccumulator and tool for PixelLorentzAngle + + SiLorentzAngleTool may be provided in kwargs + """ + acc, svc = MagneticFieldSvcCfg(flags) + tool = kwargs.get("SiLorentzAngleTool", PixelLorentzAngleToolCfg(flags)) + acc.merge(PixelDCSConditionsCfg(flags)) + SiPropAcc, SiPropTool = PixelSiPropertiesCfg(flags) + acc.merge(SiPropAcc) + kwargs.setdefault("SiPropertiesTool", SiPropTool) + kwargs.setdefault("UseMagFieldSvc", tool.UseMagFieldSvc) + kwargs.setdefault("UseMagFieldDcs", not flags.Common.isOnline) + acc.addCondAlgo(PixelSiLorentzAngleCondAlg(name, **kwargs)) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SiLorentzAngleTool/python/SCT_LorentzAngleConfig.py b/InnerDetector/InDetConditions/SiLorentzAngleTool/python/SCT_LorentzAngleConfig.py new file mode 100644 index 000000000000..233f4ff54db3 --- /dev/null +++ b/InnerDetector/InDetConditions/SiLorentzAngleTool/python/SCT_LorentzAngleConfig.py @@ -0,0 +1,57 @@ +"""Define methods to configure SCTLorentzAngleTool + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaCommon import Logging +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from SiLorentzAngleTool.SiLorentzAngleToolConf import SiLorentzAngleTool +from SiLorentzAngleTool.SiLorentzAngleToolConf import SCTSiLorentzAngleCondAlg +from SCT_ConditionsTools.SCT_DCSConditionsConfig import SCT_DCSConditionsCfg +from SCT_ConditionsTools.SCT_SiliconConditionsConfig import SCT_SiliconConditionsCfg +from SCT_ConditionsTools.SCT_SiliconConditionsConfig import SCT_SiliconConditionsToolCfg +from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg + +def SCT_LorentzAngleToolCfg(flags, name="SCT_LorentzAngleTool", **kwargs): + """Return a SiLorentzAngleTool configured for SCT""" + kwargs.setdefault("DetectorName", "SCT") + kwargs.setdefault("SiLorentzAngleCondData", "SCTSiLorentzAngleCondData") + kwargs.setdefault("UseMagFieldSvc", True) + return SiLorentzAngleTool(name, **kwargs) + +def SCT_LorentzAngleCfg(flags, name="SCT_SiLorentzAngleCondAlg", + forceUseDB=False, forceUseGeoModel=False, **kwargs): + """Return configured ComponentAccumulator and tool for SCT_LorentzAngle + + SiLorentzAngleTool may be provided in kwargs + """ + if forceUseDB and forceUseGeoModel: + msg = Logging.logging.getLogger("SCT_LorentzAngleCfg") + msg.error("Setting is wrong: both forceUseDB and forceUseGeoModel cannot be True at the same time") + # construct with field services + acc, svc = MagneticFieldSvcCfg(flags) + tool = kwargs.get("SiLorentzAngleTool", SCT_LorentzAngleToolCfg(flags)) + if not forceUseGeoModel: + DCSkwargs = {} + # For HLT + if flags.Common.isOnline and not flags.Input.isMC: + dcs_folder = "/SCT/HLT/DCS" + DCSkwargs["dbInstance"] = "SCT" + DCSkwargs["hvFolder"] = dcs_folder + "/HV" + DCSkwargs["tempFolder"] = dcs_folder + "/MODTEMP" + DCSkwargs["stateFolder"] = dcs_folder + "/CHANSTAT" + DCSAcc, DCSTool = SCT_DCSConditionsCfg(flags, **DCSkwargs) + acc.merge(DCSAcc) + SCAcc, SCTool = SCT_SiliconConditionsCfg(flags, DCSConditionsTool=DCSTool) + else: + SCTool = SCT_SiliconConditionsToolCfg(flags, UseDB=False, ForceUseGeoModel=True) + SCAcc, SCTool = SCT_SiliconConditionsCfg(flags, SiliconConditionsTool=SCTool) + acc.merge(SCAcc) + # set up SCTSiLorentzAngleCondAlg + kwargs.setdefault("UseMagFieldSvc", tool.UseMagFieldSvc) + kwargs.setdefault("UseMagFieldDcs", not flags.Common.isOnline) + kwargs.setdefault("UseGeoModel", forceUseGeoModel) + kwargs.setdefault("useSctDefaults", False) + alg = SCTSiLorentzAngleCondAlg(name, **kwargs) + acc.addCondAlgo(alg) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SiLorentzAngleTool/test/SiLorentzAngleConfig_test.py b/InnerDetector/InDetConditions/SiLorentzAngleTool/test/SiLorentzAngleConfig_test.py new file mode 100755 index 000000000000..1c72737ed6f7 --- /dev/null +++ b/InnerDetector/InDetConditions/SiLorentzAngleTool/test/SiLorentzAngleConfig_test.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +"""Run tests on *LorentzAngleConfig.py + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from SiLorentzAngleTool.SCT_LorentzAngleConfig import SCT_LorentzAngleCfg +from SiLorentzAngleTool.PixelLorentzAngleConfig import PixelLorentzAngleCfg + +# test setup +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +ConfigFlags.Input.Files = defaultTestFiles.HITS +# case online +ConfigFlags.Common.isOnline = True +acc, tool = SCT_LorentzAngleCfg(ConfigFlags, name="SCT_LorentzAngleTestOnline") +acc2, tool = PixelLorentzAngleCfg(ConfigFlags, name="PixelLorentzAngleTestOnline") +acc.merge(acc2) +acc.wasMerged() +# case offline +ConfigFlags.Common.isOnline = False +acc, tool = SCT_LorentzAngleCfg(ConfigFlags, name="SCT_LorentzAngleTestOffline") +acc2, tool = PixelLorentzAngleCfg(ConfigFlags, name="PixelLorentzAngleTestOffline") +acc.merge(acc2) +acc.wasMerged() + diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/CMakeLists.txt b/InnerDetector/InDetConditions/SiPropertiesTool/CMakeLists.txt index c91b4aef25d5..0cc2f935cad8 100644 --- a/InnerDetector/InDetConditions/SiPropertiesTool/CMakeLists.txt +++ b/InnerDetector/InDetConditions/SiPropertiesTool/CMakeLists.txt @@ -43,6 +43,11 @@ atlas_add_test( TestSCTProperties PROPERTIES TIMEOUT 300 ENVIRONMENT THREADS=5 ) +atlas_add_test( SiPropertiesConfig_test + SCRIPT test/SiPropertiesConfig_test.py + PROPERTIES TIMEOUT 300 ) + # Install files from the package: atlas_install_python_modules( python/*.py ) atlas_install_joboptions( share/*.py ) + diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/python/PixelSiPropertiesConfig.py b/InnerDetector/InDetConditions/SiPropertiesTool/python/PixelSiPropertiesConfig.py new file mode 100644 index 000000000000..66de19b5e61c --- /dev/null +++ b/InnerDetector/InDetConditions/SiPropertiesTool/python/PixelSiPropertiesConfig.py @@ -0,0 +1,25 @@ +"""Define methods to configure SiPropertiesTool + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from PixelConditionsTools.PixelDCSConditionsConfig import PixelDCSConditionsCfg +from SiPropertiesTool.SiPropertiesToolConf import SiPropertiesTool +from SiPropertiesTool.SiPropertiesToolConf import PixelSiPropertiesCondAlg + +def PixelSiPropertiesToolCfg(flags, name="PixelSiPropertiesTool", **kwargs): + """Return a SiPropertiesTool configured for Pixel""" + kwargs.setdefault("DetectorName", "Pixel") + kwargs.setdefault("ReadKey", "PixelSiliconPropertiesVector") + return SiPropertiesTool(name=name, **kwargs) + +def PixelSiPropertiesCfg(flags, name="PixelSiPropertiesCondAlg", **kwargs): + """Return configured ComponentAccumulator and tool for PixelSiPropertiesCondAlg + + SiPropertiesTool may be provided in kwargs + """ + acc = PixelDCSConditionsCfg(flags) + tool = kwargs.get("SiPropertiesTool", PixelSiPropertiesToolCfg(flags)) + acc.addCondAlgo(PixelSiPropertiesCondAlg(name, **kwargs)) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/python/SCT_SiPropertiesConfig.py b/InnerDetector/InDetConditions/SiPropertiesTool/python/SCT_SiPropertiesConfig.py new file mode 100644 index 000000000000..db9151a29e3d --- /dev/null +++ b/InnerDetector/InDetConditions/SiPropertiesTool/python/SCT_SiPropertiesConfig.py @@ -0,0 +1,25 @@ +"""Define methods to configure SCT SiProperties + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from SiPropertiesTool.SiPropertiesToolConf import SiPropertiesTool +from SiPropertiesTool.SiPropertiesToolConf import SCTSiPropertiesCondAlg + +def SCT_SiPropertiesToolCfg(flags, name="SCT_SiPropertiesTool", **kwargs): + """Return a SiPropertiesTool configured for SCT""" + kwargs.setdefault("DetectorName", "SCT") + kwargs.setdefault("ReadKey", "SCTSiliconPropertiesVector") + return SiPropertiesTool(name=name, **kwargs) + +def SCT_SiPropertiesCfg(flags, name="SCTSiPropertiesCondAlg", **kwargs): + """Return configured ComponentAccumulator and tool for SCT_SiProperties + + SiConditionsTool and/or SiPropertiesTool may be provided in kwargs + """ + acc = ComponentAccumulator() + tool = kwargs.get("SiPropertiesTool", SCT_SiPropertiesToolCfg(flags)) + alg = SCTSiPropertiesCondAlg(name, **kwargs) + acc.addEventAlgo(alg) + return acc, tool + diff --git a/InnerDetector/InDetConditions/SiPropertiesTool/test/SiPropertiesConfig_test.py b/InnerDetector/InDetConditions/SiPropertiesTool/test/SiPropertiesConfig_test.py new file mode 100755 index 000000000000..b68c74d5ce63 --- /dev/null +++ b/InnerDetector/InDetConditions/SiPropertiesTool/test/SiPropertiesConfig_test.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +"""Run tests on SCT_SiPropertiesConfig.py + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from SiPropertiesTool.SCT_SiPropertiesConfig import SCT_SiPropertiesCfg +from SiPropertiesTool.PixelSiPropertiesConfig import PixelSiPropertiesCfg + +# test setup +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +ConfigFlags.Input.Files = defaultTestFiles.HITS +# test +acc1, tool = SCT_SiPropertiesCfg(ConfigFlags, name="SCT_SiPropertiesConfigTest") +acc2, tool = PixelSiPropertiesCfg(ConfigFlags, name="PixelSiPropertiesConfigTest") +# prevent raise on __del__ +acc1.merge(acc2) +acc1.wasMerged() + diff --git a/InnerDetector/InDetDetDescr/PixelCabling/CMakeLists.txt b/InnerDetector/InDetDetDescr/PixelCabling/CMakeLists.txt index 3cf3b4331657..bf7ce80ff9a5 100644 --- a/InnerDetector/InDetDetDescr/PixelCabling/CMakeLists.txt +++ b/InnerDetector/InDetDetDescr/PixelCabling/CMakeLists.txt @@ -40,6 +40,10 @@ atlas_add_component( PixelCabling ${TDAQ-COMMON_LIBRARIES} GaudiKernel AthenaBaseComps SGTools StoreGateLib AthenaPoolUtilities Identifier InDetIdentifier InDetReadoutGeometry PathResolver PixelCablingLib ) +atlas_add_test( PixelCablingConfigNew_test + SCRIPT test/PixelCablingConfigNew_test.py + PROPERTIES TIMEOUT 30 ) + # Install files from the package: atlas_install_python_modules( python/*.py ) atlas_install_joboptions( share/*.py ) diff --git a/InnerDetector/InDetDetDescr/PixelCabling/python/PixelCablingConfigNew.py b/InnerDetector/InDetDetDescr/PixelCabling/python/PixelCablingConfigNew.py new file mode 100644 index 000000000000..1d631ad0ac62 --- /dev/null +++ b/InnerDetector/InDetDetDescr/PixelCabling/python/PixelCablingConfigNew.py @@ -0,0 +1,100 @@ +"""Define a method to construct configured PixelCablingSvc + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaCommon.Logging import logging +from IOVDbSvc.CondDB import conddb +from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline, addFolders +from PixelCabling.PixelCablingConf import PixelCablingSvc +from RecExConfig.AutoConfiguration import GetRunNumber + +def PixelCablingSvcCfg(flags, name="PixelCablingSvc", **kwargs): + """Return a ComponentAccumulator with configured PixelCablingSvc""" + acc = ComponentAccumulator() + logger = logging.getLogger("PixelCablingSvc") + if flags.Input.isMC: + acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/ReadoutSpeed", "/PIXEL/ReadoutSpeed")) + else: + acc.merge(addFolders(flags, "/PIXEL/ReadoutSpeed", "PIXEL")) + # Add the HitDiscCnfg folder + if (conddb.dbdata == "CONDBR2" or (conddb.dbmc == "OFLP200" and flags.GeoModel.Run == "RUN2")): + acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/HitDiscCnfg", "/PIXEL/HitDiscCnfg")) + # Online mode + if flags.Common.isOnline: + logger.debug("Running in online mode") + # Request the CablingMap folder + # (COOL is the default mapping type) + if (conddb.dbdata == "CONDBR2"): + acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/Onl/CablingMap","/PIXEL/CablingMap")) + logger.debug("Requested CablingMap folder") + else: + kwargs.setdefault("MappingType", "Final") + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_May08.dat") + # Offline mode + else: + logger.debug("Running in offline mode") + # SIMULATION + if flags.Input.isMC: + logger.debug("Running on simulation") + # Set cabling svc to get map from file + kwargs.setdefault("MappingType", "Final") + # ITk: + if flags.GeoModel.Run == "RUN4": + IdMappingDat = "ITk_Atlas_IdMapping.dat" + if flags.GeoModel.Type == "BrlIncl4.0_ref": + IdMappingDat = "ITk_Atlas_IdMapping_InclBrl4.dat" + elif flags.GeoModel.Type == "IBrlExt4.0ref": + IdMappingDat = "ITk_Atlas_IdMapping_IExtBrl4.dat" + elif flags.GeoModel.Type == "BrlExt4.0_ref": + IdMappingDat = "ITk_Atlas_IdMapping_ExtBrl4.dat" + elif flags.GeoModel.Type == "BrlExt3.2_ref": + IdMappingDat = "ITk_Atlas_IdMapping_ExtBrl32.dat" + logger.info("Using ITk pixel mapping: %s" % IdMappingDat) + kwargs.setdefault("MappingFile", IdMappingDat) + # IBL + elif flags.GeoModel.Run == "RUN2" or flags.GeoModel.Run == "RUN3": + # Planar IBL + if flags.GeoModel.IBLLayout == "planar": + # DBM or not + if flags.GeoModel.Run == "RUN2": + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_inclIBL_DBM.dat") + else: + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_inclIBL.dat") + # Hybrid IBL plus DBM + elif flags.GeoModel.IBLLayout == "3D": + #kwargs.setdefault("MappingFile", "Pixels_Atlas_IdMapping_inclIBL3D_DBM.dat") + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_Run2.dat") + elif flags.GeoModel.IBLLayout == "UNDEFINED": + logger.warning("IBL is required, but flags.GeoModel.IBLLayout is \"UNDEFINED\"") + logger.warning("Pixel cabling map cannot be set at this point") + # No IBL + else: + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping.dat") + # DATA + elif not flags.Input.isMC: + runNum = GetRunNumber() + logger.debug("Running on data, run number %d" % runNum) + # For data older than run number 222222, use the appropriate text file + if runNum < 222222: + kwargs.setdefault("MappingType", "Final") + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_May08.dat") + # For Run-2 onwards, get cabling map from database + else: + kwargs.setdefault("MappingType", "COOL") + kwargs.setdefault("KeyCabling", "/PIXEL/CablingMap") + # Request the CablingMap folder + acc.merge(addFoldersSplitOnline(flags, "PIXEL", "/PIXEL/Onl/CablingMap","/PIXEL/CablingMap")) + logger.debug("Requested CablingMap folder") + # Even though we are reading from COOL, set the correct fallback map. + if runNum >= 289350: # 2016 + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_2016.dat") + elif runNum >= 222222 and runNum < 289350: # 2015 + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_Run2.dat") + else: + kwargs.setdefault("MappingFile", "PixelCabling/Pixels_Atlas_IdMapping_May08.dat") + # Unknown input + else: + logger.warning("Unknown input source. Pixel cabling map cannot be set at this point") + acc.addService(PixelCablingSvc(name, **kwargs)) + return acc diff --git a/InnerDetector/InDetDetDescr/PixelCabling/test/PixelCablingConfigNew_test.py b/InnerDetector/InDetDetDescr/PixelCabling/test/PixelCablingConfigNew_test.py new file mode 100755 index 000000000000..16ad79046ad9 --- /dev/null +++ b/InnerDetector/InDetDetDescr/PixelCabling/test/PixelCablingConfigNew_test.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Run tests on PixelCablingConfigNew.py + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from PixelCabling.PixelCablingConfigNew import PixelCablingSvcCfg + +# test setup +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +ConfigFlags.Input.Files = defaultTestFiles.HITS +# test +PixelCablingAcc = PixelCablingSvcCfg(ConfigFlags, name="PixelCablingSvcTest") +# prevent raise on __del__ +PixelCablingAcc.wasMerged() + diff --git a/InnerDetector/InDetDigitization/BCM_Digitization/python/BCM_DigitizationConfigNew.py b/InnerDetector/InDetDigitization/BCM_Digitization/python/BCM_DigitizationConfigNew.py index b8f0e266f737..22fc5f896eb3 100755 --- a/InnerDetector/InDetDigitization/BCM_Digitization/python/BCM_DigitizationConfigNew.py +++ b/InnerDetector/InDetDigitization/BCM_Digitization/python/BCM_DigitizationConfigNew.py @@ -55,10 +55,10 @@ def BCM_DigitizationCfg(configFlags, name="BCM_OverlayDigitization", **kwargs): def BCM_OverlayDigitizationToolCfg(configFlags, name="BCM_OverlayDigitizationTool", **kwargs): """Return tuple (ComponentAccumulator, tool) configured for BCM Overlay Digitization""" - kwargs.setdefault("EvtStore", configFlags.Overlay.EventStore) + kwargs.setdefault("EvtStore", configFlags.Overlay.Legacy.EventStore) return BCM_DigitizationToolCfg(configFlags, name, **kwargs) -def BCM_OverlayDigitization(configFlags, name="BCM_OverlayDigitization", **kwargs): +def BCM_OverlayDigitizationCfg(configFlags, name="BCM_OverlayDigitization", **kwargs): """Return a ComponentAccumulator with BCM Overlay Digitization algorithm""" acc, tool = BCM_OverlayDigitizationToolCfg(configFlags, **kwargs) kwargs.setdefault("DigitizationTool", tool) diff --git a/InnerDetector/InDetDigitization/BCM_Digitization/test/BCM_DigitizationConfigNew_test.py b/InnerDetector/InDetDigitization/BCM_Digitization/test/BCM_DigitizationConfigNew_test.py index 17b3469e2e68..daf3af3ae99f 100755 --- a/InnerDetector/InDetDigitization/BCM_Digitization/test/BCM_DigitizationConfigNew_test.py +++ b/InnerDetector/InDetDigitization/BCM_Digitization/test/BCM_DigitizationConfigNew_test.py @@ -9,37 +9,38 @@ from AthenaCommon.Constants import DEBUG from AthenaCommon.Configurable import Configurable from AthenaConfiguration.AllConfigFlags import ConfigFlags from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg +from AthenaConfiguration.TestDefaults import defaultTestFiles from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg -from BCM_Digitization.BCM_DigitizationConfigFlags import createBCMCfgFlags from BCM_Digitization.BCM_DigitizationConfigNew import BCM_DigitizationCfg +from Digitization.DigitizationConfigFlags import createDigitizationCfgFlags +from OverlayCommonAlgs.OverlayConfigFlags import createOverlayCfgFlags from TrigUpgradeTest.InDetConfig import InDetGMConfig # FIXME This module would ideally be located somewhere else + # Set up logging and new style config log.setLevel(DEBUG) Configurable.configurableRun3Behavior = True -# Provide input -dataDir = "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art" -inputDir = os.environ.get("ATLAS_REFERENCE_DATA", dataDir) -fileDir = "/Tier0ChainTests/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3091/HITS.10504490._000425.pool.root.1" -ConfigFlags.Input.Files = [inputDir + fileDir] -# Specify output +# Configure +ConfigFlags.Input.Files = defaultTestFiles.HITS ConfigFlags.Output.RDOFileName = "myRDO.pool.root" +ConfigFlags.join(createDigitizationCfgFlags()) +ConfigFlags.join(createOverlayCfgFlags()) ConfigFlags.lock() -# Construct ComponentAccumulator -cfg = MainServicesSerialCfg() -cfg.merge(PoolReadCfg(ConfigFlags)) -cfg.merge(InDetGMConfig(ConfigFlags)) # FIXME This sets up the whole ID geometry would be nicer just to set up min required for BCM -# Use BCM tools -BCMflags = createBCMCfgFlags() -acc = BCM_DigitizationCfg(BCMflags) -cfg.merge(acc) +# Construct our accumulator to run +acc = MainServicesSerialCfg() +from StoreGate.StoreGateConf import StoreGateSvc # FIXME remove this once athena is fixed +acc.addService(StoreGateSvc("ConditionStore")) +acc.merge(PoolReadCfg(ConfigFlags)) +acc.merge(InDetGMConfig(ConfigFlags)) # FIXME This sets up the whole ID geometry would be nicer just to set up min required for BCM # Add configuration to write HITS pool file outConfig = OutputStreamCfg(ConfigFlags, "RDO", ItemList=["InDetSimDataCollection#*", "BCM_RDO_Container#*"]) -cfg.merge(outConfig) -cfg.getService("StoreGateSvc").Dump=True -cfg.printConfig(withDetails=True) +acc.merge(outConfig) +# Dump config +acc.getService("StoreGateSvc").Dump=True +acc.getService("ConditionStore").Dump = True +acc.printConfig(withDetails=True) ConfigFlags.dump() # Execute and finish -cfg.run(maxEvents=3) +acc.run(maxEvents=3) diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/CMakeLists.txt b/InnerDetector/InDetDigitization/SCT_Digitization/CMakeLists.txt index 2b9b85790706..9430fcedfd7d 100644 --- a/InnerDetector/InDetDigitization/SCT_Digitization/CMakeLists.txt +++ b/InnerDetector/InDetDigitization/SCT_Digitization/CMakeLists.txt @@ -42,6 +42,10 @@ atlas_add_component( SCT_Digitization INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} CommissionEvent AthenaBaseComps AthenaKernel PileUpToolsLib Identifier xAODEventInfo GaudiKernel SiDigitization InDetRawData InDetSimEvent HitManagement GeneratorObjects SiPropertiesToolLib InDetIdentifier InDetReadoutGeometry InDetSimData ) +atlas_add_test( SCT_DigitizationConfigNew_test + SCRIPT test/SCT_DigitizationConfigNew_test.py + PROPERTIES TIMEOUT 300 ) + # Install files from the package: atlas_install_headers( SCT_Digitization ) atlas_install_python_modules( python/*.py ) diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigNew.py b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigNew.py new file mode 100644 index 000000000000..d54410fc56e1 --- /dev/null +++ b/InnerDetector/InDetDigitization/SCT_Digitization/python/SCT_DigitizationConfigNew.py @@ -0,0 +1,254 @@ +"""Define methods to construct configured SCT Digitization tools and algorithms + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaCommon import Logging +from SCT_Digitization.SCT_DigitizationConf import ( + SCT_RandomDisabledCellGenerator, + SCT_Amp, + SCT_DetailedSurfaceChargesGenerator, + SCT_SurfaceChargesGenerator, + SCT_FrontEnd, + SCT_DigitizationTool, + SCT_Digitization, +) +from PileUpComps.PileUpCompsConf import PileUpXingFolder +from SCT_ConditionsTools.SCT_ConditionsToolsConf import SCT_RadDamageSummaryTool +from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg +from SCT_ConditionsTools.SCT_DCSConditionsConfig import SCT_DCSConditionsCfg +from SCT_ConditionsTools.SCT_SiliconConditionsConfig import SCT_SiliconConditionsCfg +from SCT_ConditionsTools.SCT_ReadCalibChipDataConfig import SCT_ReadCalibChipDataCfg +from SiPropertiesTool.SCT_SiPropertiesConfig import SCT_SiPropertiesCfg +from SiLorentzAngleTool.SCT_LorentzAngleConfig import SCT_LorentzAngleCfg +from StoreGate.StoreGateConf import StoreGateSvc + +# The earliest and last bunch crossing times for which interactions will be sent +# to the SCT Digitization code +def SCT_FirstXing(): + return -50 + +def SCT_LastXing(): + return 25 + +def SCT_DigitizationCommonCfg(flags, name="SCT_DigitizationToolCommon", **kwargs): + """Return ComponentAccumulator with common SCT digitization tool config""" + acc = SCT_GeometryCfg(flags) + if not flags.Digitization.DoInnerDetectorNoise: + kwargs.setdefault("OnlyHitElements", True) + kwargs.setdefault("InputObjectName", "SCT_Hits") + kwargs.setdefault("EnableHits", True) + kwargs.setdefault("BarrelOnly", False) + # Set FixedTime for cosmics for use in SurfaceChargesGenerator + if flags.Beam.Type == "cosmics": + kwargs.setdefault("CosmicsRun", True) + kwargs.setdefault("FixedTime", 10) + if flags.Digitization.DoXingByXingPileUp: + kwargs.setdefault("FirstXing", SCT_FirstXing()) + kwargs.setdefault("LastXing", SCT_LastXing() ) + tool = SCT_DigitizationTool(name, **kwargs) + # attach ToolHandles + frontAcc, frontTool = SCT_FrontEndCfg(flags) + tool.FrontEnd = frontTool + surfAcc, surfTool = SCT_SurfaceChargesGeneratorCfg(flags) + tool.SurfaceChargesGenerator = surfTool + tool.RandomDisabledCellGenerator = SCT_RandomDisabledCellGeneratorCfg(flags) + acc.mergeAll([frontAcc, surfAcc]) + return acc, tool + +def SCT_DigitizationToolCfg(flags, name="SCT_DigitizationTool", **kwargs): + """Return configured digitization tool""" + if flags.Digitization.PileUpPremixingForMT: + kwargs.setdefault("OutputObjectName", flags.Overlay.BkgPrefix + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", flags.Overlay.BkgPrefix + "SCT_SDO_Map") + else: + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 0) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + +def SCT_DigitizationToolHSCfg(flags, name="SCT_DigitizationToolHS", **kwargs): + """Return hard scatter configured digitization tool""" + kwargs.setdefault("OutputObjectName", "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 1) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + +def SCT_DigitizationToolPUCfg(flags, name="SCT_DigitizationToolPU",**kwargs): + """Return pileup configured digitization tool""" + kwargs.setdefault("OutputObjectName", "SCT_PU_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_PU_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 2) + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + +def SCT_DigitizationToolOverlayCfg(flags, name="SCT_OverlayDigitizationTool",**kwargs): + """Return overlay configured digitization tool""" + acc = ComponentAccumulator() + if flags.Overlay.Legacy.MT: + kwargs.setdefault("InputSingleHitsName", "SCT_Hits") + kwargs.setdefault("OutputObjectName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "SCT_RDOs") + kwargs.setdefault("OutputSDOName", "StoreGateSvc+" + flags.Overlay.SigPrefix + "SCT_SDO_Map") + else: + acc.addService(StoreGateSvc(flags.Overlay.Legacy.EventStore)) + kwargs.setdefault("OutputObjectName", flags.Overlay.Legacy.EventStore + "+SCT_RDOs") + kwargs.setdefault("OutputSDOName", flags.Overlay.Legacy.EventStore + "+SCT_SDO_Map") + kwargs.setdefault("HardScatterSplittingMode", 0) + CommonAcc, tool = SCT_DigitizationCommonCfg(flags, name, **kwargs) + acc.merge(CommonAcc) + return acc, tool + +def SCT_DigitizationToolSplitNoMergePUCfg(flags, name="SCT_DigitizationToolSplitNoMergePU",**kwargs): + """Return no merged pileup configured digitization tool""" + kwargs.setdefault("InputObjectName", "PileupSCT_Hits") + kwargs.setdefault("HardScatterSplittingMode", 0) + kwargs.setdefault("OutputObjectName", "SCT_PU_RDOs") + kwargs.setdefault("OutputSDOName", "SCT_PU_SDO_Map") + kwargs.setdefault("OnlyHitElements", True) + kwargs.setdefault("FrontEnd", "PileupSCT_FrontEnd") + return SCT_DigitizationCommonCfg(flags, name, **kwargs) + +def SCT_DigitizationToolGeantinoTruthCfg(flags, name="SCT_GeantinoTruthDigitizationTool", **kwargs): + """Return Geantino truth configured digitization tool""" + kwargs.setdefault("ParticleBarcodeVeto", 0) + return SCT_DigitizationToolCfg(flags, name, **kwargs) + +def SCT_RandomDisabledCellGeneratorCfg(flags, name="SCT_RandomDisabledCellGenerator", **kwargs): + """Return configured random cell disabling tool""" + kwargs.setdefault("TotalBadChannels", 0.01) + return SCT_RandomDisabledCellGenerator(name, **kwargs) + +def SCT_AmpCfg(flags, name="SCT_Amp", **kwargs): + """Return configured amplifier and shaper tool""" + kwargs.setdefault("CrossFactor2sides", 0.1) + kwargs.setdefault("CrossFactorBack", 0.07) + kwargs.setdefault("PeakTime", 21) + kwargs.setdefault("deltaT", 1.0) + kwargs.setdefault("Tmin", -25.0) + kwargs.setdefault("Tmax", 150.0) + return SCT_Amp(name, **kwargs) + +def SCT_SurfaceChargesGeneratorCfg(flags, name="SCT_SurfaceChargesGenerator", **kwargs): + """Return configured (detailed) surface charges tool, conditioned on flags""" + acc = ComponentAccumulator() + kwargs.setdefault("FixedTime", -999) + kwargs.setdefault("SubtractTime", -999) + kwargs.setdefault("SurfaceDriftTime", 10) + kwargs.setdefault("NumberOfCharges", 1) + kwargs.setdefault("SmallStepLength", 5) + kwargs.setdefault("DepletionVoltage", 70) + kwargs.setdefault("BiasVoltage", 150) + kwargs.setdefault("isOverlay", flags.Detector.Overlay) + # kwargs.setdefault("doTrapping", True) # ATL-INDET-INT-2016-019 + # experimental SCT_DetailedSurfaceChargesGenerator config dropped here + tool = SCT_SurfaceChargesGenerator(name, **kwargs) + tool.RadDamageSummaryTool = SCT_RadDamageSummaryTool() + DCSCondAcc, DCSCondTool = SCT_DCSConditionsCfg(flags) + SiliCondAcc, SiliCondTool = SCT_SiliconConditionsCfg(flags, DCSConditionsTool=DCSCondTool) + SiliPropsAcc, SiliPropsTool = SCT_SiPropertiesCfg(flags, SiConditionsTool=SiliCondTool) + LorentzAcc, LorentzTool = SCT_LorentzAngleCfg(flags) + tool.SiConditionsTool = SiliCondTool + tool.SiPropertiesTool = SiliPropsTool + tool.LorentzAngleTool = LorentzTool + acc.mergeAll([DCSCondAcc, SiliCondAcc, SiliPropsAcc, LorentzAcc]) + return acc, tool + +def SCT_FrontEndCfg(flags, name="SCT_FrontEnd", **kwargs): + """Return configured ComponentAccumulator with front-end electronics tool""" + acc = ComponentAccumulator() + # Setup noise treament in SCT_FrontEnd + # To set the mean noise values for the different module types + # Default values set at 0 degrees, plus/minus ~5 enc per plus/minus degree + kwargs.setdefault("NoiseBarrel", 1500.0) + kwargs.setdefault("NoiseBarrel3", 1541.0) + kwargs.setdefault("NoiseInners", 1090.0) + kwargs.setdefault("NoiseMiddles", 1557.0) + kwargs.setdefault("NoiseShortMiddles", 940.0) + kwargs.setdefault("NoiseOuters", 1618.0) + kwargs.setdefault("NOBarrel", 1.5e-5) + kwargs.setdefault("NOBarrel3", 2.1e-5) + kwargs.setdefault("NOInners", 5.0e-9) + kwargs.setdefault("NOMiddles", 2.7e-5) + kwargs.setdefault("NOShortMiddles", 2.0e-9) + kwargs.setdefault("NOOuters", 3.5e-5) + if not flags.Digitization.DoInnerDetectorNoise: + Logging.logging.getLogger("SCT_FrontEndCfg") + log.info("SCT_Digitization:::: Turned off Noise in SCT_FrontEnd") + kwargs.setdefault("NoiseOn", False) + kwargs.setdefault("AnalogueNoiseOn", False) + else: + kwargs.setdefault("NoiseOn", True) + kwargs.setdefault("AnalogueNoiseOn", True) + # In overlay MC, only analogue noise is on. Noise hits are not added. + if flags.Detector.Overlay and flags.Input.isMC: + kwargs["NoiseOn"] = False + kwargs["AnalogueNoiseOn"] = True + # Use Calibration data from Conditions DB, still for testing purposes only + kwargs.setdefault("UseCalibData", True) + # Setup the ReadCalibChip folders and Svc + readAcc, readTool = SCT_ReadCalibChipDataCfg(flags) + kwargs.setdefault("SCT_ReadCalibChipDataTool", readTool) + acc.merge(readAcc) + # DataCompressionMode: 1 is level mode x1x (default), 2 is edge mode 01x, 3 is expanded any hit xxx + if flags.Digitization.PileUpPremixing: + kwargs.setdefault("DataCompressionMode", 3) + elif flags.Detector.Overlay and flags.Input.isMC: + kwargs.setdefault("DataCompressionMode", 2) + elif flags.Beam.BunchSpacing <= 50: + kwargs.setdefault("DataCompressionMode", 1) + else: + kwargs.setdefault("DataCompressionMode", 3) + # DataReadOutMode: 0 is condensed mode and 1 is expanded mode + if flags.Detector.Overlay and flags.Input.isMC: + kwargs.setdefault("DataReadOutMode", 0) + else: + kwargs.setdefault("DataReadOutMode", 1) + return acc, SCT_FrontEnd(name, **kwargs) + +def SCT_FrontEndPileupCfg(flags, name="PileupSCT_FrontEnd", **kwargs): + """Return pileup-configured ComponentAccumulator with front-end electronics tool""" + kwargs.setdefault("NoiseBarrel", 0.0) + kwargs.setdefault("NoiseBarrel3", 0.0) + kwargs.setdefault("NoiseInners", 0.0) + kwargs.setdefault("NoiseMiddles", 0.0) + kwargs.setdefault("NoiseShortMiddles", 0.0) + kwargs.setdefault("NoiseOuters", 0.0) + kwargs.setdefault("NOBarrel", 0.0) + kwargs.setdefault("NOBarrel3", 0.0) + kwargs.setdefault("NOInners", 0.0) + kwargs.setdefault("NOMiddles", 0.0) + kwargs.setdefault("NOShortMiddles", 0.0) + kwargs.setdefault("NOOuters", 0.0) + kwargs.setdefault("NoiseOn", False) + return SCT_FrontEndCfg(flags, name, **kwargs) + +def SiliconRangeCfg(flags, name="SiliconRange", **kwargs): + """Return a configured PileUpXingFolder tool""" + kwargs.setdefault("FirstXing", SCT_FirstXing()) + kwargs.setdefault("LastXing", SCT_LastXing()) + kwargs.setdefault("CacheRefreshFrequency", 1.0) # default 0 no dataproxy reset + kwargs.setdefault("ItemList", ["SiHitCollection#SCT_Hits"] ) + return PileUpXingFolder(name, **kwargs) + +def SCT_DigitizationCfg(toolCfg, flags, name="SCT_Digitization", **kwargs): + """Return a ComponentAccumulator with toolCfg type SCT digitization""" + acc = ComponentAccumulator() + if "DigitizationTool" not in kwargs: + toolAcc, tool = toolCfg(flags) + kwargs["DigitizationTool"] = tool + acc.merge(toolAcc) + alg = SCT_Digitization(name, **kwargs) + acc.addEventAlgo(alg) + return acc + +def SCT_DigitizationHSCfg(flags, name="SCT_DigitizationHS", **kwargs): + """Return a ComponentAccumulator with Hard Scatter SCT digitization""" + return SCT_DigitizationCfg(SCT_DigitizationToolHSCfg, flags, name, **kwargs) + +def SCT_DigitizationPUCfg(flags, name="SCT_DigitizationPU", **kwargs): + """Return a ComponentAccumulator with PileUp SCT digitization""" + return SCT_DigitizationCfg(SCT_DigitizationToolPUCfg, flags, name, **kwargs) + +def SCT_DigitizationOverlayCfg(flags, name="SCT_OverlayDigitization", **kwargs): + """Return a ComponentAccumulator with Overlay SCT digitization""" + return SCT_DigitizationCfg(SCT_DigitizationToolOverlayCfg, flags, name, **kwargs) + diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/test/SCT_DigitizationConfigNew_test.py b/InnerDetector/InDetDigitization/SCT_Digitization/test/SCT_DigitizationConfigNew_test.py new file mode 100755 index 000000000000..334c61141216 --- /dev/null +++ b/InnerDetector/InDetDigitization/SCT_Digitization/test/SCT_DigitizationConfigNew_test.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +"""Run tests on SCT_DigitizationConfigNew.py + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaCommon.Logging import log +from AthenaCommon.Constants import DEBUG +from AthenaCommon.Configurable import Configurable +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from AthenaConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg +from AthenaConfiguration.TestDefaults import defaultTestFiles +from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg +from AtlasGeoModel.InDetGMConfig import InDetGeometryCfg +from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg +from SCT_Digitization.SCT_DigitizationConfigNew import ( + SCT_RandomDisabledCellGeneratorCfg, SCT_AmpCfg, SCT_SurfaceChargesGeneratorCfg, + SCT_FrontEndCfg, SCT_FrontEndPileupCfg, SCT_DigitizationCommonCfg, SCT_DigitizationToolCfg, + SCT_DigitizationToolGeantinoTruthCfg, SCT_DigitizationToolHSCfg, SCT_DigitizationToolPUCfg, + SCT_DigitizationToolSplitNoMergePUCfg, SCT_DigitizationToolOverlayCfg, SCT_DigitizationHSCfg, + SCT_DigitizationPUCfg, SCT_DigitizationOverlayCfg, SiliconRangeCfg, +) +from Digitization.DigitizationConfigFlags import createDigitizationCfgFlags +from OverlayCommonAlgs.OverlayConfigFlags import createOverlayCfgFlags + +# Set up logging and new style config +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True +# Configure +ConfigFlags.join(createDigitizationCfgFlags()) +ConfigFlags.join(createOverlayCfgFlags()) +ConfigFlags.Input.Files = defaultTestFiles.HITS +ConfigFlags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-16" +ConfigFlags.GeoModel.Align.Dynamic = False +ConfigFlags.Concurrency.NumThreads = 1 +ConfigFlags.lock() +# Function tests +acc1, tool = SCT_DigitizationCommonCfg(ConfigFlags) +acc2, tool = SCT_DigitizationToolCfg(ConfigFlags) +acc3, tool = SCT_DigitizationToolHSCfg(ConfigFlags) +acc4, tool = SCT_DigitizationToolPUCfg(ConfigFlags) +acc5, tool = SCT_DigitizationToolOverlayCfg(ConfigFlags) +acc6, tool = SCT_DigitizationToolSplitNoMergePUCfg(ConfigFlags) +acc7, tool = SCT_DigitizationToolGeantinoTruthCfg(ConfigFlags) +tool = SCT_RandomDisabledCellGeneratorCfg(ConfigFlags) +tool = SCT_AmpCfg(ConfigFlags) +acc8, tool = SCT_SurfaceChargesGeneratorCfg(ConfigFlags) +acc9, tool = SCT_FrontEndCfg(ConfigFlags) +accA, tool = SCT_FrontEndPileupCfg(ConfigFlags) +tool = SiliconRangeCfg(ConfigFlags) +accB = SCT_DigitizationHSCfg(ConfigFlags) +accC = SCT_DigitizationPUCfg(ConfigFlags) +accD = SCT_DigitizationOverlayCfg(ConfigFlags) +acc1.mergeAll([acc2, acc3, acc4, acc5, acc6, acc7, acc8, acc9, accA, accB, accC, accD]) +acc1.wasMerged() +# Construct our accumulator to run +acc = MainServicesSerialCfg() +from StoreGate.StoreGateConf import StoreGateSvc # FIXME remove this once athena is fixed +acc.addService(StoreGateSvc("ConditionStore")) +acc.merge(PoolReadCfg(ConfigFlags)) +acc.merge(SCT_DigitizationHSCfg(ConfigFlags)) +# Add configuration to write HITS pool file +outConfig = OutputStreamCfg(ConfigFlags, "RDO", + ItemList=["InDet::SiClusterContainer#*", "SCT_RDO_Container#*"]) +acc.merge(outConfig) +# Dump config +acc.getService("StoreGateSvc").Dump = True +acc.getService("ConditionStore").Dump = True +acc.printConfig(withDetails=True) +ConfigFlags.dump() +# Execute and finish +acc.run(maxEvents=3) + diff --git a/Simulation/Digitization/python/DigitizationConfigFlags.py b/Simulation/Digitization/python/DigitizationConfigFlags.py new file mode 100644 index 000000000000..4345f43b11bc --- /dev/null +++ b/Simulation/Digitization/python/DigitizationConfigFlags.py @@ -0,0 +1,19 @@ +"""Construct ConfigFlags for Digitization + +Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" +from AthenaConfiguration.AthConfigFlags import AthConfigFlags + +def createDigitizationCfgFlags(): + """Return an AthConfigFlags object with required flags""" + flags = AthConfigFlags() + # Run Inner Detector noise simulation + flags.addFlag("Digitization.DoInnerDetectorNoise", True) + # Run pile-up digitization on one bunch crossing at a time? + flags.addFlag("Digitization.DoXingByXingPileUp", False) + # Run pile-up premixing + flags.addFlag("Digitization.PileUpPremixing", False) + # Run pile-up premixing for Multi-Threading + flags.addFlag("Digitization.PileUpPremixingForMT", False) + return flags + -- GitLab From b1224d0883e05c3291c31ba29fa3282504520057 Mon Sep 17 00:00:00 2001 From: Stewart Martin-Haugh <smh@cern.ch> Date: Thu, 14 Mar 2019 09:53:57 +0100 Subject: [PATCH 036/163] Use ID geometry setup from GeoModel --- .../TrigUpgradeTest/python/InDetConfig.py | 55 ++----------------- 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/InDetConfig.py b/Trigger/TrigValidation/TrigUpgradeTest/python/InDetConfig.py index 3c78e4354836..c1140dcbfd78 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/python/InDetConfig.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/python/InDetConfig.py @@ -27,58 +27,14 @@ def InDetIDCCacheCreatorCfg(): acc.addEventAlgo( InDetCacheCreatorTrig ) return acc - - -#Set up ID GeoModel -def InDetGMConfig( flags ): - acc = ComponentAccumulator() - from AtlasGeoModel.GeoModelConfig import GeoModelCfg - gmc,geoModelSvc = GeoModelCfg( flags ) - acc.merge( gmc ) - - from GeometryDBSvc.GeometryDBSvcConf import GeometryDBSvc - acc.addService(GeometryDBSvc("InDetGeometryDBSvc")) - - from AthenaCommon import CfgGetter - geoModelSvc.DetectorTools += [ CfgGetter.getPrivateTool("PixelDetectorTool", checkType=True) ] - -# if (DetFlags.detdescr.BCM_on() ) : - - from BCM_GeoModel.BCM_GeoModelConf import InDetDD__BCM_Builder - bcmTool = InDetDD__BCM_Builder() - acc.addPublicTool( bcmTool ) - geoModelSvc.DetectorTools['PixelDetectorTool'].BCM_Tool = bcmTool - - from BLM_GeoModel.BLM_GeoModelConf import InDetDD__BLM_Builder - blmTool = InDetDD__BLM_Builder() - acc.addPublicTool( blmTool ) - geoModelSvc.DetectorTools['PixelDetectorTool'].BLM_Tool = blmTool - - geoModelSvc.DetectorTools['PixelDetectorTool'].useDynamicAlignFolders = True #InDetGeometryFlags.useDynamicAlignFolders() - -#if ( DetFlags.detdescr.SCT_on() ): - # Current atlas specific code - from AthenaCommon import CfgGetter - geoModelSvc.DetectorTools += [ CfgGetter.getPrivateTool("SCT_DetectorTool", checkType=True) ] - - geoModelSvc.DetectorTools['SCT_DetectorTool'].useDynamicAlignFolders = True #InDetGeometryFlags.useDynamicAlignFolders() - -# if ( DetFlags.detdescr.TRT_on() ): - from TRT_GeoModel.TRT_GeoModelConf import TRT_DetectorTool - trtDetectorTool = TRT_DetectorTool() -# if ( DetFlags.simulate.TRT_on() ): -# trtDetectorTool.DoXenonArgonMixture = True -# trtDetectorTool.DoKryptonMixture = True - trtDetectorTool.useDynamicAlignFolders = True #InDetGeometryFlags.useDynamicAlignFolders() - geoModelSvc.DetectorTools += [ trtDetectorTool ] - acc.addService(geoModelSvc) - return acc - #Set up conditions algorithms def TrigInDetCondConfig( flags ): acc = ComponentAccumulator() - acc.merge(InDetGMConfig(flags)) + from AtlasGeoModel.InDetGMConfig import InDetGeometryCfg + acc.merge(InDetGeometryCfg(flags)) + #acc.merge(InDetGMConfig(flags)) + from IOVDbSvc.IOVDbSvcConfig import addFoldersSplitOnline, addFolders acc.merge(addFoldersSplitOnline(flags, "INDET","/Indet/Onl/AlignL1/ID","/Indet/AlignL1/ID",className="CondAttrListCollection")) acc.merge(addFoldersSplitOnline(flags, "INDET","/Indet/Onl/AlignL2/PIX","/Indet/AlignL2/PIX",className="CondAttrListCollection")) @@ -495,8 +451,7 @@ if __name__ == "__main__": acc.merge( TrigInDetConfig( ConfigFlags ) ) from RegionSelector.RegSelConfig import regSelCfg - rsc, regSel = regSelCfg( ConfigFlags ) - regSel.enableCalo = False # turn off calo, certainly a better way to do this... + rsc = regSelCfg( ConfigFlags ) acc.merge( rsc ) acc.addService(regSel) -- GitLab From 66a5b9f75113173712b3f26baea3eb0ef28a7bd4 Mon Sep 17 00:00:00 2001 From: Vakho Tsulaia <vakhtang.tsulaia@cern.ch> Date: Fri, 15 Mar 2019 00:47:33 +0100 Subject: [PATCH 037/163] Fixed the retrieval of Event Info from event store inside AthenaEventLoopMgr::handle() Fixes ATLASRECTS-4898 --- .../AthenaServices/src/AthenaEventLoopMgr.cxx | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Control/AthenaServices/src/AthenaEventLoopMgr.cxx b/Control/AthenaServices/src/AthenaEventLoopMgr.cxx index ece6bb68f8a6..75a09f43c7f3 100644 --- a/Control/AthenaServices/src/AthenaEventLoopMgr.cxx +++ b/Control/AthenaServices/src/AthenaEventLoopMgr.cxx @@ -1086,21 +1086,6 @@ void AthenaEventLoopMgr::handle(const Incident& inc) } // Construct EventInfo - EventID eventID; - const EventInfo* pEvent=eventStore()->tryConstRetrieve<EventInfo>(); //Try getting EventInfo from old-style object - if (pEvent) { - eventID=*(pEvent->event_ID()); - } - else { //Try getting xAOD::EventInfo object - const xAOD::EventInfo* xAODEvent=eventStore()->tryConstRetrieve<xAOD::EventInfo>(); - if (xAODEvent==nullptr) { - error() << "Failed to get EventID from input. Tried old-style and xAOD::EventInfo" <<endmsg; - return; - } - eventID=eventIDFromxAOD(xAODEvent); - } - - IOpaqueAddress* addr = nullptr; sc = m_evtSelector->next(*m_evtSelCtxt); if(!sc.isSuccess()) { @@ -1126,6 +1111,20 @@ void AthenaEventLoopMgr::handle(const Incident& inc) return; } + EventID eventID; + const EventInfo* pEvent=eventStore()->tryConstRetrieve<EventInfo>(); //Try getting EventInfo from old-style object + if (pEvent) { + eventID=*(pEvent->event_ID()); + } + else { //Try getting xAOD::EventInfo object + const xAOD::EventInfo* xAODEvent=eventStore()->tryConstRetrieve<xAOD::EventInfo>(); + if (xAODEvent==nullptr) { + error() << "Failed to get EventID from input. Tried old-style and xAOD::EventInfo" <<endmsg; + return; + } + eventID=eventIDFromxAOD(xAODEvent); + } + // Need to make sure we have a valid EventContext in place before // doing anything that could fire incidents. unsigned int conditionsRun = eventID.run_number(); -- GitLab From 5a55801e440620662c2a7c8570323a0629f5d58c Mon Sep 17 00:00:00 2001 From: Vakho Tsulaia <vakhtang.tsulaia@cern.ch> Date: Fri, 15 Mar 2019 01:23:57 +0100 Subject: [PATCH 038/163] Finished the migration of LongLivedParticleDPDMaker to xAOD::EventInfo --- .../LongLivedParticleDPDMaker/CMakeLists.txt | 3 +- .../RPVLLTestRates.h | 5 +++- .../src/RPVLLTestRates.cxx | 30 ++++++++----------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt index d4f0ba0143d7..3eefb5f3d620 100644 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt @@ -20,7 +20,6 @@ atlas_depends_on_subdirs( PUBLIC PRIVATE Control/AthenaKernel Event/EventBookkeeperMetaData - Event/EventInfo Event/FourMomUtils Event/xAOD/xAODEventInfo Event/xAOD/xAODJet @@ -35,7 +34,7 @@ atlas_add_component( LongLivedParticleDPDMaker src/*.cxx src/components/*.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps xAODCaloEvent xAODEgamma xAODMuon xAODTracking GaudiKernel MuonSelectorToolsLib TrigDecisionToolLib TrigObjectMatchingLib AthenaKernel EventBookkeeperMetaData EventInfo FourMomUtils xAODEventInfo xAODJet xAODMissingET ) + LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps xAODCaloEvent xAODEgamma xAODMuon xAODTracking GaudiKernel MuonSelectorToolsLib TrigDecisionToolLib TrigObjectMatchingLib AthenaKernel EventBookkeeperMetaData FourMomUtils xAODEventInfo xAODJet xAODMissingET ) # Install files from the package: atlas_install_headers( LongLivedParticleDPDMaker ) diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h index 69a9a8025a46..181e682df0af 100755 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef RPVLL_TESTRATES_H @@ -15,6 +15,8 @@ #include "GaudiKernel/IIncidentListener.h" #include "AthenaBaseComps/AthAlgorithm.h" #include "GaudiKernel/ITHistSvc.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" #include "TH1.h" #include "TH2.h" @@ -39,6 +41,7 @@ class RPVLLTestRates : public AthAlgorithm { int m_EventCounter; ServiceHandle<ITHistSvc> m_tHistSvc; + SG::ReadHandleKey<xAOD::EventInfo> m_evt{this, "EvtInfo", "EventInfo", "EventInfo name"}; std::vector<std::string> m_DecisionLabel; std::vector<int> m_EventNumber; diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx index e47f2a85be88..cd083a3b9569 100755 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx @@ -1,12 +1,10 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "LongLivedParticleDPDMaker/RPVLLTestRates.h" #include "EventBookkeeperMetaData/EventBookkeeperCollection.h" #include "EventBookkeeperMetaData/SkimDecisionCollection.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" #include <iostream> @@ -23,7 +21,6 @@ RPVLLTestRates::RPVLLTestRates(const std::string& name, ISvcLocator* pSvcLocator m_runNum(0), m_lumiBlock(0), m_evtNum(0) - // m_filterPassed(0) { } @@ -40,12 +37,12 @@ StatusCode RPVLLTestRates::initialize() { m_EventCounter=0; - StatusCode sc = m_tHistSvc.retrieve(); - if (sc.isFailure()) return StatusCode::FAILURE; + ATH_CHECK(m_tHistSvc.retrieve()); + ATH_CHECK( m_evt.initialize() ); m_myTree= new TTree("myTree","myTree"); - sc = m_tHistSvc->regTree("/AANT/myTree",m_myTree); - if (sc.isFailure()) msg(MSG::ERROR)<<"Failed to book TTree"<<endmsg; + StatusCode sc = m_tHistSvc->regTree("/AANT/myTree",m_myTree); + if (sc.isFailure()) ATH_MSG_ERROR("Failed to book TTree"); m_myTree->Branch("RunNumber",&m_runNum,"RunNumber/I"); m_myTree->Branch("LumiBlock",&m_lumiBlock,"LumiBlock/I"); @@ -55,7 +52,6 @@ StatusCode RPVLLTestRates::initialize() { } StatusCode RPVLLTestRates::finalize() { - // delete m_filterPassed; return StatusCode::SUCCESS; } @@ -94,19 +90,19 @@ StatusCode RPVLLTestRates::execute() { m_EventCounter++; - const EventInfo* eventInfo = nullptr; - StatusCode sc = evtStore()->retrieve(eventInfo); - if (sc.isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { ATH_MSG_ERROR( "Could not retrieve event info" ); + return StatusCode::FAILURE; } - m_runNum = eventInfo->event_ID()->run_number(); - m_evtNum = eventInfo->event_ID()->event_number(); - m_lumiBlock = eventInfo->event_ID()->lumi_block(); + m_runNum = evt->runNumber(); + m_evtNum = evt->eventNumber(); + m_lumiBlock = evt->lumiBlock(); //// these are the ones that are useful for RPVLL filters const SkimDecisionCollection *SDcoll = 0; - sc = evtStore()->retrieve(SDcoll, "StreamDESDM_RPVLL_SkimDecisionsContainer"); + StatusCode sc = evtStore()->retrieve(SDcoll, "StreamDESDM_RPVLL_SkimDecisionsContainer"); int isAc=0; if (sc.isSuccess()){ @@ -133,7 +129,7 @@ StatusCode RPVLLTestRates::execute() { } } else { - msg(MSG::WARNING )<< "No SkimDecisionCollection was found: key = DESDM_RPVLL_SkimDecisionsContaine"<< endmsg; + ATH_MSG_WARNING("No SkimDecisionCollection was found: key = DESDM_RPVLL_SkimDecisionsContaine"); } -- GitLab From 45dc2054b911d1ceaaaed2ba144a73c9379b7657 Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Fri, 15 Mar 2019 03:55:33 +0100 Subject: [PATCH 039/163] apply the review comments --- .../Root/TrigEgammaEFCaloSelectorTool.cxx | 2 +- .../TrigEgammaEFCaloSelectorTool.h | 3 --- .../TrigEgammaEmulationTool/TrigEgammaEmulationTool.h | 10 +++++----- .../python/TrigEgammaEmulationIsolationConfig.py | 2 ++ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx index fb2b2a9af71f..6273d312216a 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/Root/TrigEgammaEFCaloSelectorTool.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + * Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration * */ /********************************************************************** diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h index 1a7de4802d59..27def77df3c9 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEFCaloSelectorTool.h @@ -10,10 +10,7 @@ #include "TrigEgammaEmulationTool/TrigEgammaSelectorBaseTool.h" #include "AsgTools/AsgTool.h" #include "EgammaAnalysisInterfaces/IAsgElectronIsEMSelector.h" -//#include "ElectronPhotonSelectorTools/IAsgPhotonIsEMSelector.h" #include "EgammaAnalysisInterfaces/IAsgElectronLikelihoodTool.h" -//#include "egammaInterfaces/IEMFourMomBuilder.h" -//#include "egammaInterfaces/IEMShowerBuilder.h" #include <vector> namespace Trig{ diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h index d0946b0e49cf..a3060965f41f 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/TrigEgammaEmulationTool/TrigEgammaEmulationTool.h @@ -123,17 +123,17 @@ class TrigEgammaEmulationTool template<class T> const T* TrigEgammaEmulationTool::getFeature(const HLT::TriggerElement* te,const std::string key){ - if ( te == NULL ) return NULL; - if ( (m_trigdec->ancestor<T>(te,key)).te() == NULL ) - return NULL; + if ( te == nullptr ) return nullptr; + if ( (m_trigdec->ancestor<T>(te,key)).te() == nullptr ) + return nullptr; return ( (m_trigdec->ancestor<T>(te)).cptr() ); } template<class T> bool TrigEgammaEmulationTool::ancestorPassed(const HLT::TriggerElement* te,const std::string key){ - if ( te == NULL ) return false; - if ( (m_trigdec->ancestor<T>(te,key)).te() == NULL ) + if ( te == nullptr ) return false; + if ( (m_trigdec->ancestor<T>(te,key)).te() == nullptr ) return false; return ( (m_trigdec->ancestor<T>(te)).te()->getActiveState()); } diff --git a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py index 652d2222337e..23961e8ee341 100644 --- a/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py +++ b/Trigger/TrigAnalysis/TrigEgammaEmulationTool/python/TrigEgammaEmulationIsolationConfig.py @@ -1,3 +1,5 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + def createIsoToolElectronSelector(): from AthenaCommon.AppMgr import ToolSvc -- GitLab From bf69f948fc0baf43435028233173f99eac1b44fb Mon Sep 17 00:00:00 2001 From: Rafal Bielski <rafal.bielski@cern.ch> Date: Thu, 14 Mar 2019 12:16:54 +0100 Subject: [PATCH 040/163] Add HLT timeout handling and improve handling of other errors --- .../TrigExPartialEB/src/MTCalibPebHypoAlg.cxx | 10 +- .../src/MTCalibPebHypoTool.cxx | 15 +- .../TrigExPartialEB/src/MTCalibPebHypoTool.h | 6 +- .../TrigKernel/TrigKernel/HltPscErrorCode.h | 4 +- .../TrigServices/src/HltEventLoopMgr.cxx | 69 ++++++--- .../TrigServices/src/HltEventLoopMgr.h | 17 ++- .../TrigSteeringEvent/src/HLTResultMT.cxx | 1 + .../src/HLTResultMTByteStreamCnv.cxx | 56 +++++-- .../src/HLTResultMTMaker.cxx | 8 +- .../src/StreamTagMakerTool.cxx | 4 + .../src/TriggerBitsMakerTool.cxx | 6 +- .../TrigP1Test/share/testHLT_timeout.py | 143 ++++++++++++++++++ .../TrigP1Test/test/test_athenaHLT_timeout.sh | 50 ++++++ 13 files changed, 324 insertions(+), 65 deletions(-) create mode 100644 Trigger/TrigValidation/TrigP1Test/share/testHLT_timeout.py create mode 100755 Trigger/TrigValidation/TrigP1Test/test/test_athenaHLT_timeout.sh diff --git a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoAlg.cxx b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoAlg.cxx index 8d9466b1ea96..6ad94e7227bb 100644 --- a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoAlg.cxx +++ b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoAlg.cxx @@ -1,9 +1,10 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "MTCalibPebHypoAlg.h" #include "DecisionHandling/HLTIdentifier.h" +#include "AthenaKernel/AthStatusCode.h" // TrigCompositeUtils types used here using TrigCompositeUtils::Decision; @@ -64,7 +65,12 @@ StatusCode MTCalibPebHypoAlg::execute(const EventContext& eventContext) const { // Call the hypo tools for (const auto& tool: m_hypoTools) { ATH_MSG_DEBUG("Calling " << tool); - ATH_CHECK(tool->decide(toolInput)); + StatusCode sc = tool->decide(toolInput); + if (sc == Athena::Status::TIMEOUT) { + ATH_MSG_ERROR("Timeout reached in hypo tool " << tool->name()); + return sc; + } + else ATH_CHECK(sc); } ATH_MSG_DEBUG( "Exiting with "<< outputHandle->size() <<" decisions"); diff --git a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.cxx b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.cxx index fb805b06bf1f..3786018d9263 100644 --- a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.cxx +++ b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // Trigger includes @@ -8,6 +8,7 @@ // Athena includes #include "AthenaKernel/Timeout.h" +#include "AthenaKernel/AthStatusCode.h" // System includes #include <random> @@ -148,12 +149,8 @@ StatusCode MTCalibPebHypoTool::decide(const MTCalibPebHypoTool::Input& input) co // --------------------------------------------------------------------------- for (unsigned int iCycle = 0; iCycle < m_numBurnCycles; ++iCycle) { if (Athena::Timeout::instance(input.eventContext).reached()) { - if (m_failOnTimeout) { - ATH_MSG_ERROR("Timeout reached in CPU time burning cycle # " << iCycle+1 << " and FailOnTimeout is true"); - return StatusCode::FAILURE; - } - ATH_MSG_INFO("Timeout reached in CPU time burning cycle # " << iCycle+1); - break; + ATH_MSG_ERROR("Timeout reached in CPU time burning cycle # " << iCycle+1); + return Athena::Status::TIMEOUT; } unsigned int burnTime = m_burnTimeRandomly ? randomInteger<unsigned int>(0, m_burnTimePerCycleMillisec) @@ -168,8 +165,8 @@ StatusCode MTCalibPebHypoTool::decide(const MTCalibPebHypoTool::Input& input) co for (const auto& p : m_robAccessDict) { // Check for timeout if (Athena::Timeout::instance(input.eventContext).reached()) { - ATH_MSG_INFO("Timeout reached in ROB retrieval loop"); - break; + ATH_MSG_ERROR("Timeout reached in ROB retrieval loop"); + return Athena::Status::TIMEOUT; } const std::string& instruction = p.first; const std::vector<uint32_t>& robs = p.second; diff --git a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.h b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.h index 9010986303fb..667d44cd7377 100644 --- a/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.h +++ b/HLT/Trigger/TrigControl/TrigExamples/TrigExPartialEB/src/MTCalibPebHypoTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGEXPARTIALEB_MTCALIBPEBHYPOTOOL_H @@ -60,10 +60,6 @@ private: this, "BurnTimeRandomly", true, "If true, burn time per cycle is a random value from uniform distribution between 0 and the given value" }; - Gaudi::Property<bool> m_failOnTimeout { - this, "FailOnTimeout", true, - "If true, the execution will return StatusCode::FAILURE when Athena timeout is detected" - }; Gaudi::Property<std::map<std::string,std::vector<uint32_t> > > m_robAccessDict { this, "ROBAccessDict", {}, "List of prefetch/retrieve operations with given ROB IDs." diff --git a/HLT/Trigger/TrigControl/TrigKernel/TrigKernel/HltPscErrorCode.h b/HLT/Trigger/TrigControl/TrigKernel/TrigKernel/HltPscErrorCode.h index de33953d9619..d8f145bd7805 100644 --- a/HLT/Trigger/TrigControl/TrigKernel/TrigKernel/HltPscErrorCode.h +++ b/HLT/Trigger/TrigControl/TrigKernel/TrigKernel/HltPscErrorCode.h @@ -22,7 +22,8 @@ namespace hltonl { OUTPUT_BUILD_FAILURE = 8, OUTPUT_SEND_FAILURE = 9, AFTER_RESULT_SENT = 10, - COOL_UPDATE = 11 + COOL_UPDATE = 11, + TIMEOUT = 12 }; /// helper class to map HLT PSC error code on a string name or a int index @@ -50,6 +51,7 @@ inline hltonl::MapPscErrorCode::MapPscErrorCode() { add(hltonl::PSCErrorCode::OUTPUT_SEND_FAILURE, "PSCErrorCode::OUTPUT_SEND_FAILURE"); add(hltonl::PSCErrorCode::AFTER_RESULT_SENT, "PSCErrorCode::AFTER_RESULT_SENT"); add(hltonl::PSCErrorCode::COOL_UPDATE, "PSCErrorCode::COOL_UPDATE"); + add(hltonl::PSCErrorCode::TIMEOUT, "PSCErrorCode::TIMEOUT"); // return values in case of invalid code invalidCode("UNDEFINED",-1); } diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.cxx index c49c1fc21767..9db5388955ea 100644 --- a/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.cxx +++ b/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.cxx @@ -10,6 +10,7 @@ #include "TrigSteeringEvent/HLTResultMT.h" // Athena includes +#include "AthenaKernel/AthStatusCode.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/ByteStreamMetadata.h" #include "StoreGate/StoreGateSvc.h" @@ -102,7 +103,10 @@ StatusCode HltEventLoopMgr::initialize() // Setup properties //---------------------------------------------------------------------------- - // read DataFlow configuration properties + // Set the timeout value (cast float to int) + m_softTimeoutValue = static_cast<int>(m_hardTimeout.value() * m_softTimeoutFraction.value()); + + // Read DataFlow configuration properties updateDFProps(); // JobOptions type @@ -124,9 +128,11 @@ StatusCode HltEventLoopMgr::initialize() ATH_MSG_INFO(" ---> ApplicationName = " << m_applicationName); ATH_MSG_INFO(" ---> HardTimeout = " << m_hardTimeout.value()); ATH_MSG_INFO(" ---> SoftTimeoutFraction = " << m_softTimeoutFraction.value()); + ATH_MSG_INFO(" ---> SoftTimeoutValue = " << m_softTimeoutValue); ATH_MSG_INFO(" ---> MaxFrameworkErrors = " << m_maxFrameworkErrors.value()); ATH_MSG_INFO(" ---> FwkErrorDebugStreamName = " << m_fwkErrorDebugStreamName.value()); ATH_MSG_INFO(" ---> AlgErrorDebugStreamName = " << m_algErrorDebugStreamName.value()); + ATH_MSG_INFO(" ---> TimeoutDebugStreamName = " << m_timeoutDebugStreamName.value()); ATH_MSG_INFO(" ---> EventContextWHKey = " << m_eventContextWHKey.key()); ATH_MSG_INFO(" ---> EventInfoRHKey = " << m_eventInfoRHKey.key()); @@ -943,7 +949,8 @@ void HltEventLoopMgr::printSORAttrList(const coral::AttributeList& atr) const // ============================================================================= StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const EventContext& eventContext) { - ATH_MSG_VERBOSE("start of " << __FUNCTION__); + ATH_MSG_VERBOSE("start of " << __FUNCTION__ << " with errorCode = " << hltonl::PrintPscErrorCode(errorCode) + << ", context = " << eventContext << " eventID = " << eventContext.eventID()); // Used by MsgSvc (and possibly others but not relevant here) Gaudi::Hive::setCurrentContext(eventContext); @@ -1014,15 +1021,8 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev } //---------------------------------------------------------------------------- - // Try to retrieve event info for printouts + // Handle SCHEDULING_FAILURE //---------------------------------------------------------------------------- - auto eventInfo = SG::makeHandle(m_eventInfoRHKey,eventContext); - std::ostringstream ss; - if (eventInfo.isValid()) { - ss << *eventInfo->event_ID(); - } - std::string eventInfoString = ss.str(); - if (errorCode==hltonl::PSCErrorCode::SCHEDULING_FAILURE) { // Here we cannot be certain if the scheduler started processing the event or not, so we can only try to drain // the scheduler and continue. Trying to create a debug stream result for this event and clear the event slot may @@ -1030,7 +1030,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "Failure occurred with PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << ". Cannot determine if the" << " event processing started or not. Current local event number is " << eventContext.evt() - << ", slot " << eventContext.slot() << ". " << eventInfoString + << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1057,7 +1057,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "Failed to record the HLT Result in event store while handling a failed event. Likely an issue with the store." << " PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << ", local event number " << eventContext.evt() - << ", slot " << eventContext.slot() << ". " << eventInfoString + << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1066,9 +1066,17 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev // Set error code and make sure the debug stream tag is added //---------------------------------------------------------------------------- hltResultWH->addErrorCode( static_cast<uint32_t>(errorCode) ); - std::string debugStreamName = (errorCode==hltonl::PSCErrorCode::PROCESSING_FAILURE) ? - m_algErrorDebugStreamName.value() : m_fwkErrorDebugStreamName.value(); - hltResultWH->addStreamTag({debugStreamName,eformat::DEBUG_TAG,true}); + switch (errorCode) { + case hltonl::PSCErrorCode::PROCESSING_FAILURE: + hltResultWH->addStreamTag({m_algErrorDebugStreamName.value(), eformat::DEBUG_TAG, true}); + break; + case hltonl::PSCErrorCode::TIMEOUT: + hltResultWH->addStreamTag({m_timeoutDebugStreamName.value(), eformat::DEBUG_TAG, true}); + break; + default: + hltResultWH->addStreamTag({m_fwkErrorDebugStreamName.value(), eformat::DEBUG_TAG, true}); + break; + } //---------------------------------------------------------------------------- // Try to build and send the output @@ -1077,7 +1085,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "The output conversion service failed in connectOutput() while handling a failed event. No HLT result can be" << " recorded for this event. PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << ", local event number " - << eventContext.evt() << ", slot " << eventContext.slot() << ". " << eventInfoString + << eventContext.evt() << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1087,7 +1095,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "Failed to retrieve DataObject for the HLT result object while handling a failed event. No HLT result" << " can be recorded for this event. PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) - << ", local event number " << eventContext.evt() << ", slot " << eventContext.slot() << ". " << eventInfoString + << ", local event number " << eventContext.evt() << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1097,7 +1105,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "Conversion of HLT result object to the output format failed while handling a failed event. No HLT result" << " can be recorded for this event. PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) - << ", local event number " << eventContext.evt() << ", slot " << eventContext.slot() << ". " << eventInfoString + << ", local event number " << eventContext.evt() << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1106,7 +1114,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev ATH_REPORT_MESSAGE(MSG::ERROR) << "The output conversion service failed in commitOutput() while handling a failed event. No HLT result can be" << " recorded for this event. PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << ", local event number " - << eventContext.evt() << ", slot " << eventContext.slot() << ". " << eventInfoString + << eventContext.evt() << ", slot " << eventContext.slot() << ", eventID = " << eventContext.eventID() << " All slots of this HltEventLoopMgr instance will be drained before proceeding."; return drainAllAndProceed(); } @@ -1123,14 +1131,14 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev // Finish handling the failed event //---------------------------------------------------------------------------- - // Unless this is a processing (i.e. algorithm) failure, increment the number of framework failures - if (errorCode != hltonl::PSCErrorCode::PROCESSING_FAILURE) { + // Unless this is a timeout or processing (i.e. algorithm) failure, increment the number of framework failures + if (errorCode != hltonl::PSCErrorCode::TIMEOUT && errorCode != hltonl::PSCErrorCode::PROCESSING_FAILURE) { if ( (++m_nFrameworkErrors)>m_maxFrameworkErrors.value() ) { ATH_REPORT_MESSAGE(MSG::ERROR) << "Failure with PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << " was successfully handled, but the" << " number of tolerable framework errors for this HltEventLoopMgr instance, which is " << m_maxFrameworkErrors.value() << ", was exceeded. Current local event number is " << eventContextCopy.evt() - << ", slot " << eventContextCopy.slot() << ". " << eventInfoString + << ", slot " << eventContextCopy.slot() << ", eventID = " << eventContextCopy.eventID() << " All slots of this HltEventLoopMgr instance will be drained and the loop will exit."; ATH_CHECK(drainAllSlots()); return StatusCode::FAILURE; @@ -1140,7 +1148,7 @@ StatusCode HltEventLoopMgr::failedEvent(hltonl::PSCErrorCode errorCode, const Ev // Even if handling the failed event succeeded, print an error message with failed event details ATH_REPORT_MESSAGE(MSG::ERROR) << "Failed event with PSCErrorCode=" << hltonl::PrintPscErrorCode(errorCode) << " Current local event number is " - << eventContextCopy.evt() << ", slot " << eventContextCopy.slot() << ". " << eventInfoString; + << eventContextCopy.evt() << ", slot " << eventContextCopy.slot() << ", eventID = " << eventContextCopy.eventID(); ATH_MSG_VERBOSE("end of " << __FUNCTION__); return StatusCode::SUCCESS; // continue the event loop @@ -1174,6 +1182,17 @@ void HltEventLoopMgr::runEventTimer() ATH_MSG_VERBOSE("end of " << __FUNCTION__); } +// ============================================================================= +bool HltEventLoopMgr::isTimedOut(const EventContext& eventContext) const { + for (const auto& [key, state] : m_aess->algExecStates(eventContext)) { + if (state.execStatus() == Athena::Status::TIMEOUT) { + ATH_MSG_DEBUG("Algorithm " << key << " returned Athena::Status::TIMEOUT in event " << eventContext.eventID()); + return true; + } + } + return false; +} + // ============================================================================= /** * @brief Retrieves finished events from the scheduler, processes their output and cleans up the slots @@ -1229,9 +1248,11 @@ HltEventLoopMgr::DrainSchedulerStatusCode HltEventLoopMgr::drainScheduler() // Check the event processing status if (m_aess->eventStatus(*thisFinishedEvtContext) != EventStatus::Success) markFailed(); + hltonl::PSCErrorCode errCode = isTimedOut(*thisFinishedEvtContext) ? + hltonl::PSCErrorCode::TIMEOUT : hltonl::PSCErrorCode::PROCESSING_FAILURE; HLT_DRAINSCHED_CHECK(sc, "Processing event with context " << *thisFinishedEvtContext << " failed with status " << m_aess->eventStatus(*thisFinishedEvtContext), - hltonl::PSCErrorCode::PROCESSING_FAILURE, *thisFinishedEvtContext); + errCode, *thisFinishedEvtContext); // Select the whiteboard slot sc = m_whiteboard->selectStore(thisFinishedEvtContext->slot()); diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.h b/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.h index 182d6a8f7a21..e3553adc11ad 100644 --- a/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.h +++ b/HLT/Trigger/TrigControl/TrigServices/src/HltEventLoopMgr.h @@ -153,6 +153,9 @@ private: /// The method executed by the event timeout monitoring thread void runEventTimer(); + /// Uses AlgExecStateSvc to determine if any algorithm in the event returned Athena::Status::TIMEOUT + bool isTimedOut(const EventContext& eventContext) const; + /// Drain the scheduler from all actions that may be queued DrainSchedulerStatusCode drainScheduler(); @@ -212,9 +215,13 @@ private: "Debug stream name for events with HLT framework errors"}; Gaudi::Property<std::string> m_algErrorDebugStreamName{ - this, "AlgErrorDebugStreamName", "HLTError", + this, "AlgErrorDebugStreamName", "HltError", "Debug stream name for events with HLT algorithm errors"}; + Gaudi::Property<std::string> m_timeoutDebugStreamName{ + this, "TimeoutDebugStreamName", "HltTimeout", + "Debug stream name for events with HLT timeout"}; + Gaudi::Property<std::string> m_sorPath{ this, "SORPath", "/TDAQ/RunCtrl/SOR_Params", "Path to StartOfRun parameters in detector store"}; @@ -243,7 +250,7 @@ private: /// Event counter used for local bookkeeping; incremental per instance of HltEventLoopMgr, unrelated to global_id size_t m_localEventNumber{0}; /// Event selector context - IEvtSelector::Context* m_evtSelContext; + IEvtSelector::Context* m_evtSelContext{nullptr}; /// Vector of top level algorithms std::vector<SmartIF<IAlgorithm> > m_topAlgList; /// Vector of event start-processing time stamps in each slot @@ -256,10 +263,10 @@ private: std::condition_variable m_timeoutCond; /// Timeout thread std::unique_ptr<std::thread> m_timeoutThread; - /// Soft timeout value - int m_softTimeoutValue; + /// Soft timeout value set to HardTimeout*SoftTimeoutFraction at initialisation + int m_softTimeoutValue{0}; /// Flag set to false if timer thread should be stopped - std::atomic<bool> m_runEventTimer; + std::atomic<bool> m_runEventTimer{true}; /// Counter of framework errors int m_nFrameworkErrors{0}; /// Application name diff --git a/Trigger/TrigEvent/TrigSteeringEvent/src/HLTResultMT.cxx b/Trigger/TrigEvent/TrigSteeringEvent/src/HLTResultMT.cxx index f1ad2d38c24c..873d3a2db6df 100644 --- a/Trigger/TrigEvent/TrigSteeringEvent/src/HLTResultMT.cxx +++ b/Trigger/TrigEvent/TrigSteeringEvent/src/HLTResultMT.cxx @@ -235,6 +235,7 @@ std::ostream& operator<<(std::ostream& str, const HLT::HLTResultMT& hltResult) { for (const auto& detid : st.dets) printWord(detid,2); str << "]}" << std::endl; } + if (hltResult.getStreamTags().empty()) str << std::endl; // HLT bits std::vector<uint32_t> hltBitWords; diff --git a/Trigger/TrigSteer/TrigHLTResultByteStream/src/HLTResultMTByteStreamCnv.cxx b/Trigger/TrigSteer/TrigHLTResultByteStream/src/HLTResultMTByteStreamCnv.cxx index 1bca9613f6b1..7d7a38d94545 100644 --- a/Trigger/TrigSteer/TrigHLTResultByteStream/src/HLTResultMTByteStreamCnv.cxx +++ b/Trigger/TrigSteer/TrigHLTResultByteStream/src/HLTResultMTByteStreamCnv.cxx @@ -104,6 +104,41 @@ StatusCode HLT::HLTResultMTByteStreamCnv::createRep(DataObject* pObj, IOpaqueAdd // its lifetime has to be at least as long as the lifetime of RawEventWrite which points to the StreamTag data delete m_streamTagData.release(); + // Read the stream tags to check for debug stream tag and decide which HLT ROBFragments to write out + std::set<eformat::helper::SourceIdentifier> resultIdsToWrite; + bool debugEvent=false; + auto isDebugStreamTag = [](const eformat::helper::StreamTag& st){ + return eformat::helper::string_to_tagtype(st.type) == eformat::TagType::DEBUG_TAG; + }; + for (const eformat::helper::StreamTag& st : hltResult->getStreamTags()) { + // Flag debug stream events + if (isDebugStreamTag(st)) debugEvent=true; + // In case of full event building, add the full result ID + if (st.robs.empty() && st.dets.empty()) { + eformat::helper::SourceIdentifier sid(eformat::SubDetector::TDAQ_HLT, fullResultModuleId); + resultIdsToWrite.insert(sid); + } + // In case of partial event building, add the results explicitly requested in the stream tag + for (const uint32_t robid : st.robs) { + eformat::helper::SourceIdentifier sid(robid); + if (sid.subdetector_id() == eformat::SubDetector::TDAQ_HLT) + resultIdsToWrite.insert(sid); + } + } + + // Remove all non-debug stream tags if the event goes to the debug stream. + // Write all HLT results (if available) to the debug stream. + if (debugEvent) { + std::vector<eformat::helper::StreamTag>& writableStreamTags = hltResult->getStreamTagsNonConst(); + writableStreamTags.erase( + std::remove_if(writableStreamTags.begin(),writableStreamTags.end(),std::not_fn(isDebugStreamTag)), + writableStreamTags.end() + ); + for (eformat::helper::StreamTag& st : writableStreamTags) + for (const eformat::helper::SourceIdentifier& sid : resultIdsToWrite) + st.robs.insert(sid.code()); + } + // Fill the stream tags uint32_t nStreamTagWords = eformat::helper::size_word(hltResult->getStreamTags()); m_streamTagData = std::make_unique<uint32_t[]>(nStreamTagWords); @@ -126,22 +161,6 @@ StatusCode HLT::HLTResultMTByteStreamCnv::createRep(DataObject* pObj, IOpaqueAdd const std::vector<uint32_t>& hltBits = hltResult->getHltBitsAsWords(); re->hlt_info(hltBits.size(), hltBits.data()); - // Read the stream tags to decide which HLT ROBFragments to write out - std::set<eformat::helper::SourceIdentifier> resultIdsToWrite; - for (const eformat::helper::StreamTag& st : hltResult->getStreamTags()) { - // In case of full event building, add the full result ID - if (st.robs.empty() && st.dets.empty()) { - eformat::helper::SourceIdentifier sid(eformat::SubDetector::TDAQ_HLT, fullResultModuleId); - resultIdsToWrite.insert(sid); - } - // In case of partial event building, add the results explicitly requested in the stream tag - for (const uint32_t robid : st.robs) { - eformat::helper::SourceIdentifier sid(robid); - if (sid.subdetector_id() == eformat::SubDetector::TDAQ_HLT) - resultIdsToWrite.insert(sid); - } - } - // Clear the FEA stack m_fullEventAssembler.clear(); @@ -152,6 +171,11 @@ StatusCode HLT::HLTResultMTByteStreamCnv::createRep(DataObject* pObj, IOpaqueAdd // Find the serialised data for this module ID const auto it = serialisedData.find(resultId.module_id()); if (it==serialisedData.end()) { + if (debugEvent) { + ATH_MSG_DEBUG("HLT result with ID 0x" << MSG::hex << resultId.code() << MSG::dec + << " requested by a debug stream tag, but missing in the serialised data - skipping this result"); + continue; + } ATH_MSG_ERROR("HLT result with ID 0x" << MSG::hex << resultId.code() << MSG::dec << " requested by a stream tag, but missing in the serialised data"); return StatusCode::FAILURE; diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx index 870b0f171bac..4de4537ec920 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx +++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx @@ -131,8 +131,12 @@ StatusCode HLTResultMTMaker::makeResult(const EventContext& eventContext) const // Fill the object using the result maker tools auto time = Monitored::Timer("TIME_build" ); + StatusCode finalStatus = StatusCode::SUCCESS; for (auto& maker: m_makerTools) { - ATH_CHECK(maker->fill(*hltResult)); + if (StatusCode sc = maker->fill(*hltResult); sc.isFailure()) { + ATH_MSG_ERROR(maker->name() << " failed"); + finalStatus = sc; + } } time.stop(); @@ -151,7 +155,7 @@ StatusCode HLTResultMTMaker::makeResult(const EventContext& eventContext) const Monitored::Group(m_monTool, time, nstreams, nfrags, sizeMain, bitWords); - return StatusCode::SUCCESS; + return finalStatus; } // ============================================================================= diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/StreamTagMakerTool.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/StreamTagMakerTool.cxx index d57eb54ae630..e38acebc8b04 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/StreamTagMakerTool.cxx +++ b/Trigger/TrigSteer/TrigOutputHandling/src/StreamTagMakerTool.cxx @@ -52,6 +52,10 @@ StatusCode StreamTagMakerTool::fill( HLT::HLTResultMT& resultToFill ) const { // obtain chain decisions, using namespace TrigCompositeUtils; auto chainsHandle = SG::makeHandle( m_finalChainDecisions ); + if (!chainsHandle.isValid()) { + ATH_MSG_ERROR("Unable to read in the HLTSummary from the DecisionSummaryMakerAlg"); + return StatusCode::FAILURE; + } const Decision* passRawChains = nullptr; const Decision* rerunChains = nullptr; diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/TriggerBitsMakerTool.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/TriggerBitsMakerTool.cxx index 4daf544ebe4a..a4ec63cd3c59 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/TriggerBitsMakerTool.cxx +++ b/Trigger/TrigSteer/TrigOutputHandling/src/TriggerBitsMakerTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "DecisionHandling/HLTIdentifier.h" #include "TrigOutputHandling/TriggerBitsMakerTool.h" @@ -25,6 +25,10 @@ StatusCode TriggerBitsMakerTool::initialize() { StatusCode TriggerBitsMakerTool::fill( HLT::HLTResultMT& resultToFill ) const { auto chainsHandle = SG::makeHandle( m_finalChainDecisions ); + if (!chainsHandle.isValid()) { + ATH_MSG_ERROR("Unable to read in the HLTSummary from the DecisionSummaryMakerAlg"); + return StatusCode::FAILURE; + } const TrigCompositeUtils::Decision* passRawChains = nullptr; for (const TrigCompositeUtils::Decision* d : *chainsHandle) { diff --git a/Trigger/TrigValidation/TrigP1Test/share/testHLT_timeout.py b/Trigger/TrigValidation/TrigP1Test/share/testHLT_timeout.py new file mode 100644 index 000000000000..f67fbe813b4e --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/share/testHLT_timeout.py @@ -0,0 +1,143 @@ +# +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# + +# This file is based on MTCalibPeb.py + +################################################################################ +# General set up +################################################################################ + +# The top algo sequence +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +# SGInputLoader takes care of unmet input dependencies (e.g. triggering conversion from BS) +from AthenaCommon.AlgScheduler import AlgScheduler +AlgScheduler.setDataLoaderAlg ('SGInputLoader') + +# EventInfoCnvAlg produces xAOD::EventInfo from the plain non-xAOD EventInfo +from xAODEventInfoCnv.xAODEventInfoCreator import xAODMaker__EventInfoCnvAlg +topSequence += xAODMaker__EventInfoCnvAlg() + +################################################################################ +# L1 result decoding +################################################################################ + +# Configure BS converter and address provider for RoIBResult decoding +from AthenaCommon.AppMgr import ServiceMgr as svcMgr +svcMgr.ByteStreamCnvSvc.GetDetectorMask = True +svcMgr.ByteStreamCnvSvc.InitCnvs += [ "ROIB::RoIBResult" ] +svcMgr.ByteStreamAddressProviderSvc.TypeNames += [ "ROIB::RoIBResult/RoIBResult" ] + +# Ensure LVL1ConfigSvc is initialised before L1Decoder handles BeginRun incident +# This should be done by the L1Decoder configuration in new-style job options (with component accumulator) +from TrigConfigSvc.TrigConfigSvcConfig import LVL1ConfigSvc, findFileInXMLPATH +svcMgr += LVL1ConfigSvc() + +# Set the LVL1 menu (needed for initialising LVL1ConfigSvc) +from TriggerJobOpts.TriggerFlags import TriggerFlags +svcMgr.LVL1ConfigSvc.XMLMenuFile = findFileInXMLPATH(TriggerFlags.inputLVL1configFile()) + +# Initialise L1 decoding tools +from L1Decoder.L1DecoderConf import CTPUnpackingTool +ctpUnpacker = CTPUnpackingTool(ForceEnableAllChains = True) +# Can add other tools here if needed + +# Define the "menu" - L1 items do not matter if we set ForceEnableAllChains = True, +# but they have to be defined in the L1 menu xml +chainCTPMap = {"HLT_MTCalibPeb1": "L1_RD0_FILLED", + "HLT_MTCalibPeb2": "L1_RD0_FILLED"} + +# Schedule the L1Decoder algo with the above tools +from L1Decoder.L1DecoderConf import L1Decoder +l1decoder = L1Decoder() +l1decoder.ctpUnpacker = ctpUnpacker +l1decoder.ChainToCTPMapping = chainCTPMap +topSequence += l1decoder + +################################################################################ +# HLT configuration +################################################################################ + +from TrigExPartialEB.TrigExPartialEBConf import MTCalibPebHypoAlg,MTCalibPebHypoTool +hypo = MTCalibPebHypoAlg() +hypo.HypoInputDecisions = "HLTChains" +hypo.HypoOutputDecisions = "MTCalibPebDecisions" + +# Chain 1 - high accept rate, sleeps for up to 2 seconds +hypoTool1 = MTCalibPebHypoTool("HLT_MTCalibPeb1") +hypoTool1.RandomAcceptRate = 0.75 +hypoTool1.BurnTimePerCycleMillisec = 200 +hypoTool1.NumBurnCycles = 10 + +# Chain 2 - lower accept rate, sleeps for up to 3 seconds +hypoTool2 = MTCalibPebHypoTool("HLT_MTCalibPeb2") +hypoTool2.RandomAcceptRate = 0.25 +hypoTool2.BurnTimePerCycleMillisec = 600 +hypoTool2.NumBurnCycles = 5 + +# Add the hypo tools to the algorithm +hypo.HypoTools = [hypoTool1, hypoTool2] + +################################################################################ +# HLT result maker configuration +################################################################################ +from TrigOutputHandling.TrigOutputHandlingConf import HLTResultMTMakerAlg, StreamTagMakerTool, TriggerBitsMakerTool +from TrigOutputHandling.TrigOutputHandlingConfig import TriggerEDMSerialiserToolCfg, HLTResultMTMakerCfg + +# Tool serialising EDM objects to fill the HLT result +serialiser = TriggerEDMSerialiserToolCfg("Serialiser") +serialiser.addCollectionListToMainResult([ + "xAOD::TrigCompositeContainer_v1#"+hypo.HypoOutputDecisions, + "xAOD::TrigCompositeAuxContainer_v2#"+hypo.HypoOutputDecisions+"Aux.decisions", +]) + +# StreamTag definitions +streamPhysicsMain = ['Main', 'physics', "True", "True"] + +# Tool adding stream tags to HLT result +stmaker = StreamTagMakerTool() +stmaker.ChainDecisions = "HLTSummary" +stmaker.PEBDecisionKeys = [hypo.HypoOutputDecisions] +stmaker.ChainToStream = {} +stmaker.ChainToStream["HLT_MTCalibPeb1"] = streamPhysicsMain +stmaker.ChainToStream["HLT_MTCalibPeb2"] = streamPhysicsMain + +# Tool adding HLT bits to HLT result +bitsmaker = TriggerBitsMakerTool() +bitsmaker.ChainDecisions = "HLTSummary" +bitsmaker.ChainToBit = {} +bitsmaker.ChainToBit["HLT_MTCalibPeb1"] = 4 +bitsmaker.ChainToBit["HLT_MTCalibPeb2"] = 32 + +# Configure the HLT result maker to use the above tools +hltResultMaker = svcMgr.HltEventLoopMgr.ResultMaker +hltResultMaker.MakerTools = [ stmaker, bitsmaker, serialiser ] + +################################################################################ +# Control Flow construction +################################################################################ + +from DecisionHandling.DecisionHandlingConf import TriggerSummaryAlg +summary = TriggerSummaryAlg( "TriggerSummaryAlg" ) +summary.InputDecision = "HLTChains" +summary.FinalDecisions = [ hypo.HypoOutputDecisions ] + +from TrigOutputHandling.TrigOutputHandlingConf import DecisionSummaryMakerAlg +summMaker = DecisionSummaryMakerAlg() +summMaker.FinalDecisionKeys = [ hypo.HypoOutputDecisions ] +summMaker.FinalStepDecisions = dict( [ ( tool.getName(), hypo.HypoOutputDecisions ) for tool in hypo.HypoTools ] ) +print summMaker + +# Create a top-level algorithm as a sequence +from AthenaCommon.CFElements import seqOR +hltTop = seqOR( "hltTop", [ hypo, summary, summMaker ] ) +topSequence += hltTop + +# Print configuration for debugging +print("Dump of topSequence") +from AthenaCommon.AlgSequence import dumpSequence +dumpSequence(topSequence) +print("Dump of serviceMgr") +dumpSequence(ServiceMgr) diff --git a/Trigger/TrigValidation/TrigP1Test/test/test_athenaHLT_timeout.sh b/Trigger/TrigValidation/TrigP1Test/test/test_athenaHLT_timeout.sh new file mode 100755 index 000000000000..1ab6c02a472b --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/test/test_athenaHLT_timeout.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# art-description: athenaHLT test of timeout handling +# art-type: build +# art-include: master/Athena +# art-output: *.log +# art-output: *.out +# art-output: *.err +# art-output: *.data +# art-output: *.root + +outputBaseName="output.test_athenaHLT_timeout.data" +nEvents=20 + +(set -x; \ +athenaHLT \ +-n ${nEvents} \ +--timeout 2000 \ +--nprocs 2 \ +--threads 2 \ +--concurrent-events 2 \ +-o ${outputBaseName} \ +-f /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 \ +TrigP1Test/testHLT_timeout.py \ +2>&1 > athena.log) + +status=$? +echo "art-result: ${status} athenaHLT-mother" + +outputFile=`ls ${outputBaseName}* | tail -n 1` + +# Check if there is at least one event with the debug_HltTimeout stream tag +nDebugEvents=`trigbs_dumpHLTContentInBS.py --stag output.test_athenaHLT_timeout.data_Child-001._0001.data | grep "\[('HltTimeout', 'debug')\]" | wc -l` +if [ $nDebugEvents -gt 0 ]; then + echo "Found ${nDebugEvents} events with stream tag debug_HltTimeout in the output file ${outputFile}" + echo "art-result: 0 StreamTags" +else + echo "ERROR no event with stream tag debug_HltTimeout was found in the output file ${outputFile}" + echo "art-result: 0 StreamTags" +fi + +# Check if the number of events in output is the same as number of processed events +nOutputEvents=`trigbs_dumpHLTContentInBS.py --stats output.test_athenaHLT_timeout.data_Child-001._0001.data | grep Global_ID | wc -l` +if [ $nOutputEvents -eq $nEvents ]; then + echo "All ${nEvents} processed events were found in the output file ${outputFile}" + echo "art-result: 0 NOutputEvents" +else + echo "Processed ${nEvents} events, but found ${nOutputEvents} in the output file ${outputFile}" + echo "art-result: 1 NOutputEvents" +fi + -- GitLab From 9c4070fbfb987d3734cb4ac4fb724716ce1e81fb Mon Sep 17 00:00:00 2001 From: Rupert Tombs <rt500@cam.ac.uk> Date: Fri, 15 Mar 2019 10:56:59 +0000 Subject: [PATCH 041/163] Do not run PixelConditionsConfig_test in AthSimulation --- .../InDetConditions/PixelConditionsTools/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt b/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt index ac5761032a35..803c1555eab8 100644 --- a/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt +++ b/InnerDetector/InDetConditions/PixelConditionsTools/CMakeLists.txt @@ -51,9 +51,11 @@ atlas_add_component( PixelConditionsTools INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} LINK_LIBRARIES ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaKernel GeoPrimitives GaudiKernel AthenaBaseComps SGTools AthenaPoolUtilities DetDescrConditions Identifier PixelConditionsData PixelCoralClientUtils InDetIdentifier GeoModelUtilities InDetReadoutGeometry PathResolver ${extra_lib} ) -atlas_add_test( PixelConditionsConfig_test - SCRIPT test/PixelConditionsConfig_test.py - PROPERTIES TIMEOUT 30 ) +if( NOT SIMULATIONBASE ) + atlas_add_test( PixelConditionsConfig_test + SCRIPT test/PixelConditionsConfig_test.py + PROPERTIES TIMEOUT 30 ) +endif() # Install files from the package: atlas_install_headers( PixelConditionsTools ) -- GitLab From 51c78246cc6e79222a1073dab4ad52513a3d5985 Mon Sep 17 00:00:00 2001 From: John Chapman <jchapman@cern.ch> Date: Fri, 15 Mar 2019 11:27:52 +0100 Subject: [PATCH 042/163] Protection against calling G4ThreadInitTool::terminateThread without having called initThread Based on the discussion in ATLASSIM-4062, it seems that with the new version of TBB introduced in `LCG_95` (see !21493) can sometimes try to call `G4ThreadInitTool::terminateThread` without having first called `G4ThreadInitTool::initThread`. This causes the `G4ExHive-test` CI test to fail at random. Adding some protection to `G4ThreadInitTool::terminateThread` to prevent crashes in this case while the experts follow up with the TBB experts. --- .../G4AtlasTools/src/G4ThreadInitTool.cxx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Simulation/G4Atlas/G4AtlasTools/src/G4ThreadInitTool.cxx b/Simulation/G4Atlas/G4AtlasTools/src/G4ThreadInitTool.cxx index e7306476e847..c9716c25046a 100644 --- a/Simulation/G4Atlas/G4AtlasTools/src/G4ThreadInitTool.cxx +++ b/Simulation/G4Atlas/G4AtlasTools/src/G4ThreadInitTool.cxx @@ -114,12 +114,23 @@ void G4ThreadInitTool::initThread() //----------------------------------------------------------------------------- void G4ThreadInitTool::terminateThread() { - ATH_MSG_INFO("terminateThread ==> tbb thread 0x" << + ATH_MSG_DEBUG("terminateThread ==> tbb thread 0x" << std::hex << pthread_self() << std::dec); // Geant4 worker finalization - G4RunManager::GetRunManager()->RunTermination(); - - // Atomic decrement number of initialized threads - m_nInitThreads--; + auto runMgr = G4RunManager::GetRunManager(); + ATH_MSG_DEBUG("G4RunManager ptr" << runMgr); + if(runMgr) { + runMgr->RunTermination(); + ATH_MSG_INFO("terminateThread ==> safely called G4AtlasWorkerRunManager::RunTermination for tbb thread 0x" << + std::hex << pthread_self() << std::dec); + // Atomic decrement number of initialized threads + m_nInitThreads--; + } + else { + ATH_MSG_WARNING("skipping attempt to call terminateThread for tbb thread 0x" << + std::hex << pthread_self() << std::dec << + " without having first called initThread."); + // Not decrementing m_nInitThreads as initThread was not called in this case. + } } -- GitLab From 2c6bb4d376812ab55f66df17cf219335b2988dd2 Mon Sep 17 00:00:00 2001 From: Peter Onyisi <ponyisi@utexas.edu> Date: Fri, 15 Mar 2019 13:55:54 +0100 Subject: [PATCH 043/163] Fix TCT failing due to syntax error --- .../InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py index 6b51841abe78..09902f3087d7 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py @@ -413,7 +413,7 @@ if dumpPixInfo: from AthenaCommon.AlgSequence import AthSequencer condSeq = AthSequencer("AthCondSeq") - if not hasattr(condSeq, "PixelDCSCondStateAlg"): + if not hasattr(condSeq, "PixelDCSCondStateAlg"): from PixelConditionsAlgorithms.PixelConditionsAlgorithmsConf import PixelDCSCondStateAlg condSeq += PixelDCSCondStateAlg(name="PixelDCSCondStateAlg") -- GitLab From 6de833af1ef562f445ed15bd3d61d4582efb3043 Mon Sep 17 00:00:00 2001 From: Ian Connelly <ian.connelly@cern.ch> Date: Fri, 15 Mar 2019 13:28:45 +0000 Subject: [PATCH 044/163] Update the reference files for newer version of athena --- .../MuonConfig/share/MuonDataDecodeTest.ref | 1427 +++++++++------- .../share/MuonDataDecodeTest_Cache.ref | 1516 ++++++++++------- 2 files changed, 1757 insertions(+), 1186 deletions(-) diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref index d727a4d7a0ac..01b352152854 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest.ref @@ -1,11 +1,13 @@ Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -32,13 +34,14 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -71,16 +74,18 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/ByteStreamAttListMetadataSvc to the job Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job -Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc8-opt] [iac_master_rpcrdo/63cc84e] -- built on [2019-03-15T1157] dynamically loading the flag Detector Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -175,12 +180,13 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -469,11 +475,13 @@ dynamically loading the flag Muon Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -624,12 +632,13 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py @@ -653,14 +662,14 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... Py:ConfigurableDb DEBUG loading confDb files... -Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonByteStream.confdb]... Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/WorkDir.confdb]... -Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... -Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... Py:ConfigurableDb DEBUG loading confDb files... [DONE] Py:ConfigurableDb DEBUG loaded 1103 confDb packages -Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO Read module info for 5461 configurables from 5 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... @@ -1436,24 +1445,24 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** |-AuditStop = False |-Cardinality = 0 |-ContinueEventloopOnFPE = False -|-DetStore @0x7fbd4e2eeed0 = ServiceHandle('StoreGateSvc/DetectorStore') +|-DetStore @0x7f36dfab5ed0 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 -|-EvtStore @0x7fbd4e2eee50 = ServiceHandle('StoreGateSvc') -|-ExtraInputs @0x7fbd4c928bd8 = [] (default: []) -|-ExtraOutputs @0x7fbd4c928d40 = [] (default: []) +|-EvtStore @0x7f36dfab5e50 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f36de048560 = [] (default: []) +|-ExtraOutputs @0x7f36de0485f0 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False -|-Members @0x7fbd4c928ab8 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +|-Members @0x7f36de048200 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' -|-NeededResources @0x7fbd4c928e18 = [] (default: []) +|-NeededResources @0x7f36de048440 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False -|-Sequential = False +|-Sequential @0x7f36e1166b00 = True (default: False) |-StopOverride = False |-TimeOut = 0.0 |-Timeline = True @@ -1469,22 +1478,22 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7fbd4cefd7d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de6d8cd0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4cefd750 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930050 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c928f80 = [] (default: []) +| |-EvtStore @0x7f36de6d8c50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de0486c8 = [] (default: []) +| |-ExtraOutputs @0x7f36de048680 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c928e60 = [] (default: []) +| |-NeededResources @0x7f36de048638 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7fbd4d18a680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| |-ProviderTool @0x7f36de95c680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') -| |-RegionSelectionSvc @0x7fbd4cefd850 = ServiceHandle('RegSelSvc') +| |-RegionSelectionSvc @0x7f36de6d8d50 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1496,11 +1505,11 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-Decoder @0x7fbd4d1e4620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') -| | |-DetStore @0x7fbd4cea4690 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4cea4650 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4cf78170 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4cf78200 = [] (default: []) +| | |-Decoder @0x7f36de9b9620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f36de67fb90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de67fb50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de6c9050 = [] (default: []) +| | |-ExtraOutputs @0x7f36de6c9170 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' @@ -1516,10 +1525,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 -| | | |-DetStore @0x7fbd4cea4710 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4cea4750 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4cf78290 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4cf78248 = [] (default: []) +| | | |-DetStore @0x7f36de67fc10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de67fc50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de6bff80 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de6bff38 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -1539,19 +1548,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7fbd4cf0b790 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de665c90 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4cf0b710 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930200 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c9302d8 = [] (default: []) +| |-EvtStore @0x7f36de665c10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048908 = [] (default: []) +| |-ExtraOutputs @0x7f36de0489e0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c930248 = [] (default: []) +| |-NeededResources @0x7f36de048950 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7fbd4e09d8c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| |-ProviderTool @0x7f36df86d8c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1563,12 +1572,12 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-Decoder @0x7fbd4e09d9b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | |-Decoder @0x7f36df86d9b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') -| | |-DetStore @0x7fbd4ce45c50 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4ce45c90 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4ce535a8 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4ce533f8 = [] (default: []) +| | |-DetStore @0x7f36de69f190 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de69f1d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de62f7e8 = [] (default: []) +| | |-ExtraOutputs @0x7f36de62f638 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -1580,10 +1589,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7fbd4ce45d50 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4ce45d90 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4ce53248 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4ce533b0 = [] (default: []) +| | | |-DetStore @0x7f36de69f290 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de69f2d0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de62f488 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de62f5f0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -1603,19 +1612,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7fbd4cef19d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de6cced0 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4cef1950 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930320 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c9303b0 = [] (default: []) +| |-EvtStore @0x7f36de6cce50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048a28 = [] (default: []) +| |-ExtraOutputs @0x7f36de048ab8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c930290 = [] (default: []) +| |-NeededResources @0x7f36de048998 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7fbd4d28bd50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| |-ProviderTool @0x7f36de76ee50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1628,11 +1637,11 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-CsmContainerCacheKey = 'StoreGateSvc+' -| | |-Decoder @0x7fbd4e09dc80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') -| | |-DetStore @0x7fbd4ca01d50 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4ca01d90 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4ca09638 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4ca096c8 = [] (default: []) +| | |-Decoder @0x7f36df86dc80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f36de1ca250 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de1ca290 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de1e0f38 = [] (default: []) +| | |-ExtraOutputs @0x7f36de1e0dd0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+MDTCSM' @@ -1645,10 +1654,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7fbd4ca01e50 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4ca01e90 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4ca095a8 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4ca09560 = [] (default: []) +| | | |-DetStore @0x7f36de1ca350 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de1ca390 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de1e0e60 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de1e0e18 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -1668,19 +1677,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7fbd4cee7bd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de6cc110 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4cee7b50 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c9303f8 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c930440 = [] (default: []) +| |-EvtStore @0x7f36de6cc090 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048b00 = [] (default: []) +| |-ExtraOutputs @0x7f36de048b48 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c930098 = [] (default: []) +| |-NeededResources @0x7f36de048710 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7fbd4c9cc050 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| |-ProviderTool @0x7f36de14f150 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1693,12 +1702,12 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-CscContainerCacheKey = 'StoreGateSvc+' -| | |-Decoder @0x7fbd4e09de60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') -| | |-DetStore @0x7fbd4c9c4c10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-Decoder @0x7f36df86de60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f36de12a110 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' -| | |-EvtStore @0x7fbd4c9c4c50 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4c9c2d88 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4c9cb050 = [] (default: []) +| | |-EvtStore @0x7f36de12a150 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de122ab8 = [] (default: []) +| | |-ExtraOutputs @0x7f36de122d40 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+CSCRDO' @@ -1710,10 +1719,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7fbd4c9c4d10 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4c9c4d50 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4c9c2ea8 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4c9c2e60 = [] (default: []) +| | | |-DetStore @0x7f36de12a210 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de12a250 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de122c20 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de122bd8 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1733,25 +1742,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7fbd4d06fd20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| |-DecodingTool @0x7f36de8d5d20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') -| |-DetStore @0x7fbd4c8ff6d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de159b90 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4c8ff650 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c9300e0 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c930518 = [] (default: []) +| |-EvtStore @0x7f36de159b10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048320 = [] (default: []) +| |-ExtraOutputs @0x7f36de048c20 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c930560 = [] (default: []) +| |-NeededResources @0x7f36de048c68 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) -| |-RegionSelectionSvc @0x7fbd4c8ff750 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de159c10 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1764,16 +1773,16 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True -| | |-DetStore @0x7fbd4c967850 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4c9678d0 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4c9d4710 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4c9d48c0 = [] (default: []) +| | |-DetStore @0x7f36de0c8d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0c8dd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de134950 = [] (default: []) +| | |-ExtraOutputs @0x7f36de134b00 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False -| | |-RdoDecoderTool @0x7fbd4c9dd2f0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | |-RdoDecoderTool @0x7f36de4b84b0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1791,10 +1800,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7fbd4c967950 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4c967990 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4c9d49e0 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4c9d4998 = [] (default: []) +| | | |-DetStore @0x7f36de0c8e50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0c8e90 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de134c20 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de134bd8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1812,25 +1821,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7fbd4c975050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| |-DecodingTool @0x7f36de0d5050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') -| |-DetStore @0x7fbd4c958590 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de0b0a90 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4c958510 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930368 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c9305a8 = [] (default: []) +| |-EvtStore @0x7f36de0b0a10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048a70 = [] (default: []) +| |-ExtraOutputs @0x7f36de048cb0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c9305f0 = [] (default: []) +| |-NeededResources @0x7f36de048cf8 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) -| |-RegionSelectorSvc @0x7fbd4c958610 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectorSvc @0x7f36de0b0b10 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 @@ -1844,10 +1853,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True -| | |-DetStore @0x7fbd4c967710 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4c967a50 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4c9780e0 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4c9787a0 = [] (default: []) +| | |-DetStore @0x7f36de0c8ed0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0c8f50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0d69e0 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0d6998 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1856,9 +1865,9 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True -| | |-outputCoinKey @0x7fbd4c978998 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | |-outputCoinKey @0x7f36de0d6440 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | |-prepDataKeys @0x7fbd4c978440 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | |-prepDataKeys @0x7f36de0d6a70 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1875,25 +1884,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7fbd4f21bb50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| |-DecodingTool @0x7f36e09e8b50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') -| |-DetStore @0x7fbd4c8f3590 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de145a50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4c8f3510 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930680 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c930710 = [] (default: []) +| |-EvtStore @0x7f36de1459d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048d88 = [] (default: []) +| |-ExtraOutputs @0x7f36de048e18 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c9306c8 = [] (default: []) +| |-NeededResources @0x7f36de048dd0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) -| |-RegionSelectionSvc @0x7fbd4c8f3610 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de145ad0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1907,13 +1916,13 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True -| | |-DetStore @0x7fbd4c967cd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DetStore @0x7f36de0dd350 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True -| | |-EvtStore @0x7fbd4c967d90 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4c984fc8 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4c984e60 = [] (default: []) +| | |-EvtStore @0x7f36de0dd2d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0e2b90 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0e2a28 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1941,25 +1950,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-CscRdoToCscPrepDataTool @0x7fbd4d04f5a0 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| |-CscRdoToCscPrepDataTool @0x7f36de841380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') -| |-DetStore @0x7fbd4c960b90 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de12a790 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4c960a90 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c9307e8 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c930488 = [] (default: []) +| |-EvtStore @0x7f36de12af50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048ef0 = [] (default: []) +| |-ExtraOutputs @0x7f36de048b90 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c930758 = [] (default: []) +| |-NeededResources @0x7f36de048e60 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7fbd4f9a1b20 = False (default: False) -| |-RegionSelectionSvc @0x7fbd4c960c10 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de12a810 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1972,13 +1981,13 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 -| | |-CscCalibTool @0x7fbd4f284b10 = PrivateToolHandle('CscCalibTool/CscCalibTool') -| | |-CscRdoDecoderTool @0x7fbd4c981c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-CscCalibTool @0x7f36e09df9b8 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f36de0e3960 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True -| | |-DetStore @0x7fbd4c967890 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7fbd4c98b050 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7fbd4ce53f38 = [] (default: []) -| | |-ExtraOutputs @0x7fbd4ce53cf8 = [] (default: []) +| | |-DetStore @0x7f36de0dd450 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0dd590 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0d34d0 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0d3fc8 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -1991,10 +2000,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7fbd4c98b090 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4c98b0d0 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4c978fc8 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4c978cb0 = [] (default: []) +| | | |-DetStore @0x7f36de0dd5d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0dd610 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de0e7998 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de0e7a28 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -2021,11 +2030,11 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-CscCalibTool @0x7fbd4c967f90 = PublicToolHandle('CscCalibTool') -| | | |-DetStore @0x7fbd4c9679d0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7fbd4c967fd0 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7fbd4c978d40 = [] (default: []) -| | | |-ExtraOutputs @0x7fbd4ce57098 = [] (default: []) +| | | |-CscCalibTool @0x7f36de0dd510 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f36de0dd490 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0dd550 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de0e7908 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de0e78c0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -2043,21 +2052,21 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7fbd4c874390 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7f36de106890 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7fbd4c874310 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7fbd4c930830 = [] (default: []) -| |-ExtraOutputs @0x7fbd4c930878 = [] (default: []) +| |-EvtStore @0x7f36de106810 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de054050 = [] (default: []) +| |-ExtraOutputs @0x7f36de048f80 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7fbd4c9308c0 = [] (default: []) +| |-NeededResources @0x7f36de048fc8 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False | |-Timeline = True -| |-cluster_builder @0x7fbd4c925cd0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| |-cluster_builder @0x7f36de046210 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- @@ -2086,379 +2095,651 @@ Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepD Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config -RpcRawDataProvider ExtraOutputs [] -RpcRawDataProvider EvtStore StoreGateSvc -RpcRawDataProvider ExtraInputs [] -RpcRawDataProvider RegionSelectionSvc RegSelSvc -RpcRawDataProvider ProviderTool Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool -RpcRawDataProvider NeededResources [] -RpcRawDataProvider DetStore StoreGateSvc/DetectorStore -RpcRawDataProvider.RPC_RawDataProviderTool ExtraOutputs [] -RpcRawDataProvider.RPC_RawDataProviderTool EvtStore StoreGateSvc -RpcRawDataProvider.RPC_RawDataProviderTool ExtraInputs [] -RpcRawDataProvider.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -RpcRawDataProvider.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider ExtraOutputs [] -TgcRawDataProvider EvtStore StoreGateSvc -TgcRawDataProvider ExtraInputs [] -TgcRawDataProvider NeededResources [] -TgcRawDataProvider ProviderTool Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool -TgcRawDataProvider DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider.TGC_RawDataProviderTool ExtraOutputs [] -TgcRawDataProvider.TGC_RawDataProviderTool EvtStore StoreGateSvc -TgcRawDataProvider.TGC_RawDataProviderTool ExtraInputs [] -TgcRawDataProvider.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider ExtraOutputs [] -MdtRawDataProvider EvtStore StoreGateSvc -MdtRawDataProvider ExtraInputs [] -MdtRawDataProvider NeededResources [] -MdtRawDataProvider ProviderTool Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool -MdtRawDataProvider DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider.MDT_RawDataProviderTool ExtraOutputs [] -MdtRawDataProvider.MDT_RawDataProviderTool EvtStore StoreGateSvc -MdtRawDataProvider.MDT_RawDataProviderTool ExtraInputs [] -MdtRawDataProvider.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore -CscRawDataProvider ExtraOutputs [] -CscRawDataProvider EvtStore StoreGateSvc -CscRawDataProvider ExtraInputs [] -CscRawDataProvider NeededResources [] -CscRawDataProvider ProviderTool Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool -CscRawDataProvider DetStore StoreGateSvc/DetectorStore -CscRawDataProvider.CSC_RawDataProviderTool ExtraOutputs [] -CscRawDataProvider.CSC_RawDataProviderTool EvtStore StoreGateSvc -CscRawDataProvider.CSC_RawDataProviderTool ExtraInputs [] -CscRawDataProvider.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -CscRawDataProvider.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData ExtraOutputs [] -RpcRdoToRpcPrepData DecodingTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool -RpcRdoToRpcPrepData EvtStore StoreGateSvc -RpcRdoToRpcPrepData ExtraInputs [] -RpcRdoToRpcPrepData PrintPrepData False -RpcRdoToRpcPrepData RegionSelectionSvc RegSelSvc -RpcRdoToRpcPrepData NeededResources [] -RpcRdoToRpcPrepData DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraOutputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraInputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore -TgcRdoToTgcPrepData ExtraOutputs [] -TgcRdoToTgcPrepData DecodingTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool -TgcRdoToTgcPrepData EvtStore StoreGateSvc -TgcRdoToTgcPrepData RegionSelectorSvc RegSelSvc -TgcRdoToTgcPrepData ExtraInputs [] -TgcRdoToTgcPrepData PrintPrepData False -TgcRdoToTgcPrepData NeededResources [] -TgcRdoToTgcPrepData DetStore StoreGateSvc/DetectorStore -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraOutputs [] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraInputs [] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore -MdtRdoToMdtPrepData ExtraOutputs [] -MdtRdoToMdtPrepData DecodingTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool -MdtRdoToMdtPrepData EvtStore StoreGateSvc -MdtRdoToMdtPrepData ExtraInputs [] -MdtRdoToMdtPrepData PrintPrepData False -MdtRdoToMdtPrepData RegionSelectionSvc RegSelSvc -MdtRdoToMdtPrepData NeededResources [] -MdtRdoToMdtPrepData DetStore StoreGateSvc/DetectorStore -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraOutputs [] -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraInputs [] -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData ExtraOutputs [] -CscRdoToCscPrepData CscRdoToCscPrepDataTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool -CscRdoToCscPrepData EvtStore StoreGateSvc -CscRdoToCscPrepData ExtraInputs [] -CscRdoToCscPrepData PrintPrepData False -CscRdoToCscPrepData RegionSelectionSvc RegSelSvc -CscRdoToCscPrepData NeededResources [] -CscRdoToCscPrepData DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool -CscRdoToCscPrepData.CscRdoToCscPrepDataTool EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder -CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore -CscThesholdClusterBuilder ExtraOutputs [] -CscThesholdClusterBuilder EvtStore StoreGateSvc -CscThesholdClusterBuilder ExtraInputs [] -CscThesholdClusterBuilder cluster_builder CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool -CscThesholdClusterBuilder NeededResources [] -CscThesholdClusterBuilder DetStore StoreGateSvc/DetectorStore -CondInputLoader ExtraOutputs [] -CondInputLoader Load [('CondAttrListCollection', '/MDT/CABLING/MEZZANINE_SCHEMA'), ('CondAttrListCollection', '/EXT/DCS/MAGNETS/SENSORDATA'), ('CondAttrListCollection', '/MDT/CABLING/MAP_SCHEMA')] -CondInputLoader EvtStore StoreGateSvc -CondInputLoader ExtraInputs [] -CondInputLoader NeededResources [] -CondInputLoader DetStore StoreGateSvc/DetectorStore -MuonMDT_CablingAlg ExtraOutputs [] -MuonMDT_CablingAlg EvtStore StoreGateSvc -MuonMDT_CablingAlg ExtraInputs [] -MuonMDT_CablingAlg NeededResources [] -MuonMDT_CablingAlg DetStore StoreGateSvc/DetectorStore -MuonMDT_CablingAlg MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA -MuonMDT_CablingAlg MapFolders /MDT/CABLING/MAP_SCHEMA -ToolSvc.IOVDbMetaDataTool ExtraOutputs [] -ToolSvc.IOVDbMetaDataTool FoldersToBeModified ['/Simulation/Parameters'] -ToolSvc.IOVDbMetaDataTool MinMaxRunNumbers [] -ToolSvc.IOVDbMetaDataTool EvtStore StoreGateSvc -ToolSvc.IOVDbMetaDataTool AttributesToBeRemoved ['RandomSeedOffset'] -ToolSvc.IOVDbMetaDataTool ExtraInputs [] -ToolSvc.IOVDbMetaDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.ByteStreamMetadataTool ExtraOutputs [] -ToolSvc.ByteStreamMetadataTool EvtStore StoreGateSvc -ToolSvc.ByteStreamMetadataTool ExtraInputs [] -ToolSvc.ByteStreamMetadataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.Muon::MuonIdHelperTool ExtraOutputs [] -ToolSvc.Muon::MuonIdHelperTool EvtStore StoreGateSvc -ToolSvc.Muon::MuonIdHelperTool ExtraInputs [] -ToolSvc.Muon::MuonIdHelperTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPCCablingDbTool ExtraOutputs [] -ToolSvc.RPCCablingDbTool EvtStore StoreGateSvc -ToolSvc.RPCCablingDbTool ExtraInputs [] -ToolSvc.RPCCablingDbTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPCCablingDbTool MapCorrectionFolder /RPC/CABLING/MAP_SCHEMA_CORR -ToolSvc.RPCCablingDbTool MapConfigurationFolder /RPC/CABLING/MAP_SCHEMA -ToolSvc.RPC_RawDataProviderTool ExtraOutputs [] -ToolSvc.RPC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.RPC_RawDataProviderTool ExtraInputs [] -ToolSvc.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.TGC_RawDataProviderTool ExtraOutputs [] -ToolSvc.TGC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.TGC_RawDataProviderTool ExtraInputs [] -ToolSvc.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.MDTCablingDbTool ExtraOutputs [] -ToolSvc.MDTCablingDbTool EvtStore StoreGateSvc -ToolSvc.MDTCablingDbTool ExtraInputs [] -ToolSvc.MDTCablingDbTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MDTCablingDbTool MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA -ToolSvc.MDTCablingDbTool MapFolders /MDT/CABLING/MAP_SCHEMA -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraOutputs [] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RT_InputFiles ['Muon_RT_default.data'] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TimeSlewingCorrection False -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RtFolder /MDT/RTBLOB -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool MeanCorrectionVsR [-5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool defaultT0 40 -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraInputs [] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool UseMLRt True -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool PropagationSpeedBeta 0.85 -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TubeFolder /MDT/T0BLOB -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool ExtraOutputs [] -ToolSvc.MDT_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool ExtraInputs [] -ToolSvc.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.CSC_RawDataProviderTool ExtraOutputs [] -ToolSvc.CSC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.CSC_RawDataProviderTool ExtraInputs [] -ToolSvc.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.RpcRdoToRpcPrepDataTool ExtraOutputs [] -ToolSvc.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc -ToolSvc.RpcRdoToRpcPrepDataTool ExtraInputs [] -ToolSvc.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder -ToolSvc.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.TgcRdoToTgcPrepDataTool ExtraOutputs [] -ToolSvc.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -ToolSvc.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc -ToolSvc.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -ToolSvc.TgcRdoToTgcPrepDataTool ExtraInputs [] -ToolSvc.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MdtRdoToMdtPrepDataTool ExtraOutputs [] -ToolSvc.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc -ToolSvc.MdtRdoToMdtPrepDataTool ExtraInputs [] -ToolSvc.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool -ToolSvc.CscRdoToCscPrepDataTool EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder -ToolSvc.CscRdoToCscPrepDataTool ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscThesholdClusterBuilderTool ExtraOutputs [] -ToolSvc.CscThesholdClusterBuilderTool split_fitter CscSplitClusterFitter/CscSplitClusterFitter -ToolSvc.CscThesholdClusterBuilderTool strip_fitter CalibCscStripFitter/CalibCscStripFitter -ToolSvc.CscThesholdClusterBuilderTool cscCalibTool CscCalibTool/CscCalibTool -ToolSvc.CscThesholdClusterBuilderTool default_fitter SimpleCscClusterFitter/SimpleCscClusterFitter -ToolSvc.CscThesholdClusterBuilderTool precision_fitter QratCscClusterFitter/QratCscClusterFitter -ToolSvc.CscThesholdClusterBuilderTool EvtStore StoreGateSvc -ToolSvc.CscThesholdClusterBuilderTool ExtraInputs [] -ToolSvc.CscThesholdClusterBuilderTool DetStore StoreGateSvc/DetectorStore -EventSelector SharedMemoryTool -EventSelector SkipEventSequence [] -EventSelector CounterTool -EventSelector Input [] -EventSelector ByteStreamInputSvc ByteStreamInputSvc -EventSelector.xAODMaker::EventInfoSelectorTool ExtraOutputs [] -EventSelector.xAODMaker::EventInfoSelectorTool EvtStore StoreGateSvc -EventSelector.xAODMaker::EventInfoSelectorTool BeamCondSvc BeamCondSvc -EventSelector.xAODMaker::EventInfoSelectorTool ExtraInputs [] -EventSelector.xAODMaker::EventInfoSelectorTool LuminosityTool LuminosityTool -EventSelector.xAODMaker::EventInfoSelectorTool DetStore StoreGateSvc/DetectorStore -ByteStreamInputSvc EventStore StoreGateSvc -ByteStreamInputSvc FullFileName ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] -ByteStreamInputSvc AttributeListKeys [] -ByteStreamInputSvc MetaDataStore StoreGateSvc/InputMetaDataStore -EventPersistencySvc CnvServices ['ByteStreamCnvSvc', 'AthenaPoolCnvSvc/AthenaPoolCnvSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'AthenaPoolCnvSvc'] -ByteStreamCnvSvc InitCnvs ['EventInfo', 'ROIB::RoIBResult', 'HLT::HLTResult'] -ByteStreamCnvSvc EventStore StoreGateSvc -ByteStreamCnvSvc ROD2ROBmap [] -ByteStreamCnvSvc ByteStreamOutputSvcList [] -ByteStreamCnvSvc GetDetectorMask True -ROBDataProviderSvc filterRobWithStatus [] -ROBDataProviderSvc filterSubDetWithStatus [] -ByteStreamAddressProviderSvc TypeNames ['TileCellIDC/TileCellIDC', 'MdtDigitContainer/MDT_DIGITS', 'RpcDigitContainer/RPC_DIGITS', 'TgcDigitContainer/TGC_DIGITS', 'CscDigitContainer/CSC_DIGITS', 'ROIB::RecRoIBResult/RecRoIBResult', 'MuCTPI_RIO/MUCTPI_RIO', 'CTP_RIO/CTP_RIO', 'LArRawChannelContainer/LArRawChannels', 'TileRawChannelContainer/TileRawChannelCnt', 'ROIB::RoIBResult/RoIBResult', 'MuCTPI_RDO/MUCTPI_RDO', 'HLT::HLTResult/HLTResult_L2', 'HLT::HLTResult/HLTResult_EF', 'CTP_RDO/CTP_RDO', 'L1TopoRDOCollection/L1TopoRDOCollection'] -ByteStreamAddressProviderSvc TopoProcModuleID [129, 145] -ByteStreamAddressProviderSvc JetProcModuleID [172, 173] -ByteStreamAddressProviderSvc CaloClusterProcModuleID [168, 169, 170, 171] -MetaDataStore IncidentSvc IncidentSvc -MetaDataStore ProxyProviderSvc ProxyProviderSvc -InputMetaDataStore IncidentSvc IncidentSvc -InputMetaDataStore ProxyProviderSvc ProxyProviderSvc -MetaDataSvc MetaDataContainer MetaDataHdr -MetaDataSvc CnvSvc AthenaPoolCnvSvc -ProxyProviderSvc ProviderNames ['ByteStreamAddressProviderSvc', 'IOVDbSvc', 'MetaDataSvc', 'TagInfoMgr'] -GeoModelSvc SupportedGeometry 22 -GeoModelSvc AtlasVersion ATLAS-R2-2016-01-00-01 -GeoModelSvc.MuonDetectorTool ExtraOutputs [] -GeoModelSvc.MuonDetectorTool TheMuonAlignmentTool -GeoModelSvc.MuonDetectorTool EvtStore StoreGateSvc -GeoModelSvc.MuonDetectorTool UseConditionDb 1 -GeoModelSvc.MuonDetectorTool ExtraInputs [] -GeoModelSvc.MuonDetectorTool UseIlinesFromGM 1 -GeoModelSvc.MuonDetectorTool SelectedStJff [] -GeoModelSvc.MuonDetectorTool DetStore StoreGateSvc/DetectorStore -GeoModelSvc.MuonDetectorTool SelectedStations [] -GeoModelSvc.MuonDetectorTool SelectedStJzz [] -DetDescrCnvSvc IdDictFromRDB True -DetDescrCnvSvc IdDictName IdDictParser/ATLAS_IDS.xml -DetDescrCnvSvc DetectorNodes [] -DetDescrCnvSvc DetectorManagers [] -TagInfoMgr ExtraTagValuePairs ['AtlasRelease', 'Athena-22.0.1'] -RPCcablingServerSvc Atlas True -RPCcablingServerSvc useMuonRPC_CablingSvc True -RPCcablingServerSvc forcedUse True -IOVDbSvc Folders ['/MDT/CABLING/MEZZANINE_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_ETA<db>COOLONL_RPC/CONDBR2</db>', '/MDT/RTBLOB<db>COOLOFL_MDT/CONDBR2</db>', '/MDT/T0BLOB<db>COOLOFL_MDT/CONDBR2</db>', '/CSC/STAT <key>CSC_STAT</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/NOISE <key>CSC_NOISE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/PED <key>CSC_PED</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/RMS <key>CSC_RMS</key> <db>COOLOFL_CSC/CONDBR2</db>', '/GLOBAL/BField/Maps <noover/><db>COOLONL_GLOBAL/CONDBR2</db>', '/CSC/T0PHASE <key>CSC_T0PHASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/TGC/CABLING/MAP_SCHEMA<db>COOLONL_TGC/CONDBR2</db>', '/EXT/DCS/MAGNETS/SENSORDATA<db>COOLOFL_DCS/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA_CORR<db>COOLONL_RPC/CONDBR2</db>', '/MDT/CABLING/MAP_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_PHI<db>COOLONL_RPC/CONDBR2</db>', '/CSC/PSLOPE <key>CSC_PSLOPE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA<db>COOLONL_RPC/CONDBR2</db>', '/CSC/T0BASE <key>CSC_T0BASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/FTHOLD <key>CSC_FTHOLD</key> <db>COOLOFL_CSC/CONDBR2</db>'] -IOVDbSvc CacheAlign 3 -IOVDbSvc dbConnection sqlite://;schema=mycool.db;dbname=CONDBR2 -IOVDbSvc GlobalTag CONDBR2-BLKPA-2018-13 -IOVDbSvc FoldersToMetaData ['/GLOBAL/BField/Maps'] -IOVDbSvc DBInstance CONDBR2 -IOVDbSvc overrideTags [] -PoolSvc FrontierRefreshSchema [] -PoolSvc ReadCatalog ['apcfile:poolcond/PoolFileCatalog.xml', 'prfile:poolcond/PoolCat_oflcond.xml', 'apcfile:poolcond/PoolCat_oflcond.xml', 'prfile:poolcond/PoolCat_comcond.xml', 'apcfile:poolcond/PoolCat_comcond.xml'] -PoolSvc MaxFilesOpen 0 -DBReplicaSvc COOLSQLiteVetoPattern /DBRelease/ -MuonRPC_CablingSvc ConfFilePath MuonRPC_Cabling/ -MuonRPC_CablingSvc TheRpcTriggerDbTool RPCTriggerDbTool -MuonRPC_CablingSvc ConfFileName LVL1confAtlas.data -MuonRPC_CablingSvc FeetPadThresolds [] -MuonRPC_CablingSvc TheRpcCablingDbTool RPCCablingDbTool/RPCCablingDbTool -MuonRPC_CablingSvc RPCTriggerRoadsfromCool True -MuonRPC_CablingSvc CorrFileName LVL1confAtlas.corr -MuonRPC_CablingSvc CosmicConfiguration True -TGCcablingServerSvc Atlas True -TGCcablingServerSvc useMuonTGC_CablingSvc True -TGCcablingServerSvc forcedUse True -AthenaPoolCnvSvc InputPoolAttributes [] -AthenaPoolCnvSvc PoolAttributes [] -AthenaPoolCnvSvc PrintInputAttrPerEvt [] -AthenaPoolCnvSvc InputStreamingTool -AthenaPoolCnvSvc OutputPoolFileAllocator [] -AthenaPoolCnvSvc MaxFileSizes [] -MuonMDT_CablingSvc DBTool MDTCablingDbTool/MDTCablingDbTool -MuonMDT_CablingSvc TagInfoManager TagInfoMgr -MuonMDT_CablingSvc ForcedUse True -MuonMDT_CablingSvc UseOldCabling False -AtlasFieldSvc UseDCS True -MdtCalibrationDbSvc CreateSlewingFunctions False -MdtCalibrationDbSvc DBTool MuonCalib::MdtCalibDbAsciiTool -MdtCalibrationDbSvc CreateBFieldFunctions False -MdtCalibrationDbSvc CreateWireSagFunctions False -MdtCalibrationSvc DoTofCorrection True -MdtCalibrationSvc MagFieldSvc AtlasFieldSvc -MdtCalibrationSvc DoWireSagCorrection False -MdtCalibrationSvc TimeWindowSetting 2 -MdtCalibrationSvc DoSlewingCorrection False -MdtCalibrationSvc DoTemperatureCorrection True -MuonCalib::CscCoolStrSvc ParSGKeys ['CSC_PED', 'CSC_NOISE', 'CSC_PSLOPE', 'CSC_STAT', 'CSC_RMS', 'CSC_FTHOLD', 'CSC_T0BASE', 'CSC_T0PHASE'] -MuonCalib::CscCoolStrSvc ParDefaults ['2048', '3.5', '0.189', '0', '2.56', '0', '0', '0'] -MuonCalib::CscCoolStrSvc ParDataTypes ['float', 'float', 'float', 'uint32_t', 'float', 'float', 'float', 'float'] -MuonCalib::CscCoolStrSvc ParFolders ['/CSC/PED', '/CSC/NOISE', '/CSC/PSLOPE', '/CSC/STAT', '/CSC/RMS', '/CSC/FTHOLD', '/CSC/T0BASE', '/CSC/T0PHASE'] -MuonCalib::CscCoolStrSvc ParCats ['CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'ASM'] -MuonCalib::CscCoolStrSvc ParNames ['ped', 'noise', 'pslope', 'status', 'rms', 'f001', 't0base', 't0phase'] +/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ +|-Atomic = False +|-AuditAlgorithms = False +|-AuditBeginRun = False +|-AuditEndRun = False +|-AuditExecute = False +|-AuditFinalize = False +|-AuditInitialize = False +|-AuditReinitialize = False +|-AuditRestart = False +|-AuditStart = False +|-AuditStop = False +|-Cardinality = 0 +|-ContinueEventloopOnFPE = False +|-DetStore @0x7f36dfab5ed0 = ServiceHandle('StoreGateSvc/DetectorStore') +|-Enable = True +|-ErrorCounter = 0 +|-ErrorMax = 1 +|-EvtStore @0x7f36dfab5e50 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7f36de048560 = [] (default: []) +|-ExtraOutputs @0x7f36de0485f0 = [] (default: []) +|-FilterCircularDependencies = True +|-IgnoreFilterPassed = False +|-IsIOBound = False +|-Members @0x7f36de048170 = ['Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +| (default: []) +|-ModeOR = False +|-MonitorService = 'MonitorSvc' +|-NeededResources @0x7f36de048440 = [] (default: []) +|-OutputLevel = 0 +|-RegisterForContextService = False +|-Sequential @0x7f36e1166b00 = True (default: False) +|-StopOverride = False +|-TimeOut = 0.0 +|-Timeline = True +|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f36de6d8cd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de6d8c50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de0486c8 = [] (default: []) +| |-ExtraOutputs @0x7f36de048680 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048638 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f36de95c680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7f36de6d8d50 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f36de9b9620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7f36de67fb90 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de67fb50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de6c9050 = [] (default: []) +| | |-ExtraOutputs @0x7f36de6c9170 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-RpcContainerCacheKey = 'StoreGateSvc+' +| | |-WriteOutRpcSectorLogic = True +| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7f36de67fc10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de67fc50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de6bff80 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de6bff38 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-Sector13Data = False +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f36de665c90 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de665c10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048908 = [] (default: []) +| |-ExtraOutputs @0x7f36de0489e0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048950 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f36df86d8c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7f36df86d9b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7f36de69f190 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de69f1d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de62f7e8 = [] (default: []) +| | |-ExtraOutputs @0x7f36de62f638 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+TGCRDO' +| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f36de69f290 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de69f2d0 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de62f488 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de62f5f0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ShowStatusWords = False +| | | |-SkipCoincidence = False +| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f36de6cced0 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de6cce50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048a28 = [] (default: []) +| |-ExtraOutputs @0x7f36de048ab8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048998 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f36de76ee50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CsmContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f36df86dc80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7f36de1ca250 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de1ca290 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de1e0f38 = [] (default: []) +| | |-ExtraOutputs @0x7f36de1e0dd0 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f36de1ca350 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de1ca390 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de1e0e60 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de1e0e18 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f36de6cc110 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de6cc090 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048b00 = [] (default: []) +| |-ExtraOutputs @0x7f36de048b48 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048710 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7f36de14f150 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CscContainerCacheKey = 'StoreGateSvc+' +| | |-Decoder @0x7f36df86de60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7f36de12a110 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7f36de12a150 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de122ab8 = [] (default: []) +| | |-ExtraOutputs @0x7f36de122d40 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f36de12a210 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de12a250 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de122c20 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de122bd8 = [] (default: []) +| | | |-IsCosmics = False +| | | |-IsOldCosmics = False +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ +|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f36de8d5d20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7f36de159b90 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de159b10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048320 = [] (default: []) +| |-ExtraOutputs @0x7f36de048c20 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048c68 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de159c10 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f36de0c8d50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0c8dd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de134950 = [] (default: []) +| | |-ExtraOutputs @0x7f36de134b00 = [] (default: []) +| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+RPCPAD' +| | |-OutputLevel = 0 +| | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7f36de4b84b0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | | (default: 'Muon::RpcRDO_Decoder') +| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' +| | |-etaphi_coincidenceTime = 20.0 +| | |-overlap_timeTolerance = 10.0 +| | |-processingData = False +| | |-produceRpcCoinDatafromTriggerWords = True +| | |-reduceCablingOverlap = True +| | |-solvePhiAmbiguities = True +| | |-timeShift = -12.5 +| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f36de0c8e50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0c8e90 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de134c20 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de134bd8 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- +| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- +|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f36de0d5050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7f36de0b0a90 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de0b0a10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048a70 = [] (default: []) +| |-ExtraOutputs @0x7f36de048cb0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048cf8 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectorSvc @0x7f36de0b0b10 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Setting = 0 +| |-Timeline = True +| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7f36de0c8ed0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0c8f50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0d69e0 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0d6998 = [] (default: []) +| | |-FillCoinData = True +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' +| | |-OutputCollection = 'TGC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+TGCRDO' +| | |-TGCHashIdOffset = 26000 +| | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7f36de0d6440 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7f36de0d6a70 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-show_warning_level_invalid_A09_SSW6_hit = False +| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- +| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- +|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7f36e09e8b50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7f36de145a50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de1459d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048d88 = [] (default: []) +| |-ExtraOutputs @0x7f36de048e18 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048dd0 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de145ad0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CalibratePrepData = True +| | |-DecodeData = True +| | |-DetStore @0x7f36de0dd350 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DiscardSecondaryHitTwin = False +| | |-DoPropagationCorrection = False +| | |-DoTofCorrection = True +| | |-EvtStore @0x7f36de0dd2d0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0e2b90 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0e2a28 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |-SortPrepData = False +| | |-TimeWindowLowerBound = -1000000.0 +| | |-TimeWindowSetting = 2 +| | |-TimeWindowUpperBound = -1000000.0 +| | |-TwinCorrectSlewing = False +| | |-Use1DPrepDataTwin = False +| | |-UseAllBOLTwin = False +| | |-UseTwin = True +| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- +| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- +|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7f36de841380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7f36de12a790 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de12af50 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de048ef0 = [] (default: []) +| |-ExtraOutputs @0x7f36de048b90 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048e60 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7f36e1166b20 = False (default: False) +| |-RegionSelectionSvc @0x7f36de12a810 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7f36e09df9b8 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7f36de0e3960 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-DecodeData = True +| | |-DetStore @0x7f36de0dd450 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7f36de0dd590 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7f36de0d34d0 = [] (default: []) +| | |-ExtraOutputs @0x7f36de0d3fc8 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7f36de0dd5d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0dd610 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de0e7998 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de0e7a28 = [] (default: []) +| | | |-IsOnline = True +| | | |-Latency = 100.0 +| | | |-MonitorService = 'MonitorSvc' +| | | |-NSamples = 4 +| | | |-Noise = 3.5 +| | | |-OutputLevel = 0 +| | | |-Pedestal = 2048.0 +| | | |-ReadFromDatabase = True +| | | |-Slope = 0.19 +| | | |-SlopeFromDatabase = False +| | | |-TimeOffsetRange = 1.0 +| | | |-Use2Samples = False +| | | |-integrationNumber = 12.0 +| | | |-integrationNumber2 = 11.66 +| | | |-samplingTime = 50.0 +| | | |-signalWidth = 14.4092 +| | | |-timeOffset = 46.825 +| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- +| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-CscCalibTool @0x7f36de0dd510 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7f36de0dd490 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7f36de0dd550 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7f36de0e7908 = [] (default: []) +| | | |-ExtraOutputs @0x7f36de0e78c0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- +| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- +|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7f36de106890 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7f36de106810 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7f36de054050 = [] (default: []) +| |-ExtraOutputs @0x7f36de048f80 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7f36de048fc8 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7f36de046210 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') +| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- +\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- JOs reading stage finished, launching Athena from pickle file -Thu Mar 14 11:32:12 GMT 2019 +Fri Mar 15 12:38:46 GMT 2019 Preloading tcmalloc_minimal.so -Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc8-opt] [iac_master_rpcrdo/63cc84e] -- built on [2019-03-15T1157] Py:Athena INFO including file "AthenaCommon/Preparation.py" Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup @@ -2466,13 +2747,13 @@ Py:Athena INFO configuring AthenaHive with [1] concurrent threads and Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode.pkl ... -Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO Read module info for 5461 configurables from 5 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! [?1034hApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 ApplicationMgr SUCCESS ==================================================================================================================================== Welcome to ApplicationMgr (GaudiCoreSvc v31r0) - running on ppevm02.ppe.gla.ac.uk on Thu Mar 14 11:32:26 2019 + running on ppevm02.ppe.gla.ac.uk on Fri Mar 15 12:38:59 2019 ==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 @@ -2480,7 +2761,7 @@ Py:Athena INFO including file "AthenaCommon/runbatch.py" StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry -ClassIDSvc INFO getRegistryEntries: read 3383 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3440 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 @@ -2500,7 +2781,7 @@ PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.x PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://frontier-atlas.lcg.triumf.ca:3128/ATLAS_frontier)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data -DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config DBReplicaSvc INFO Total of 1 servers found for host ppevm02.ppe.gla.ac.uk [ATLF ] DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm @@ -2526,11 +2807,11 @@ AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version Athena ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 -ClassIDSvc INFO getRegistryEntries: read 3291 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3314 CLIDRegistry entries for module ALL ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL -ClassIDSvc INFO getRegistryEntries: read 4012 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4046 CLIDRegistry entries for module ALL ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL -ClassIDSvc INFO getRegistryEntries: read 3031 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3110 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -2783,7 +3064,7 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded -GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 44888Kb Time = 1.04S +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 42840Kb Time = 0.92S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL @@ -2832,7 +3113,7 @@ TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x161ac100]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x153a2100]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL @@ -2878,20 +3159,21 @@ ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_PED] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_NOISE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_PSLOPE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_STAT] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_RMS] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_FTHOLD] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_T0BASE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a255a00]+259 bound to CondAttrListCollection[CSC_T0PHASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1a59d400]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... +ClassIDSvc INFO getRegistryEntries: read 1126 CLIDRegistry entries for module ALL ToolSvc.Luminos... INFO LuminosityTool::initialize() registering ToolSvc.Luminos... INFO LumiFolderName is empty, skipping ToolSvc.Luminos... INFO OnlineLumiCalibrationTool.empty() is TRUE, skipping... @@ -2905,7 +3187,6 @@ EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully ByteStreamInputSvc INFO Picked valid file: /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 -ClassIDSvc INFO getRegistryEntries: read 1159 CLIDRegistry entries for module ALL CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' @@ -3081,34 +3362,34 @@ IncidentProcAlg2 INFO Finalize AtlasFieldSvc INFO finalize() successful EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize -IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/25 (( 0.27 ))s -IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/271 (( 0.60 ))s -IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216598 (( 0.81 ))s -IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/300 (( 0.55 ))s +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/20 (( 0.26 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/202 (( 0.66 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216520 (( 0.78 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/288 (( 0.42 ))s IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s -IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/444470 (( 0.62 ))s -IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/58804 (( 0.52 ))s -IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562972 (( 1.13 ))s -IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8101322 (( 0.97 ))s -IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/7408 (( 0.58 ))s -IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/331329 (( 1.05 ))s -IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/359591 (( 0.51 ))s -IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422629 (( 0.52 ))s -IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/363009 (( 0.48 ))s -IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422831 (( 0.55 ))s -IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/236289 (( 0.48 ))s -IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322855 (( 0.52 ))s -IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3234 (( 0.37 ))s -IOVDbSvc INFO bytes in (( 10.52 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/222235 (( 0.62 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/29402 (( 0.42 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562651 (( 1.06 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8096306 (( 0.81 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/3704 (( 0.56 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322656 (( 0.67 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/350062 (( 0.50 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411187 (( 0.51 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/353376 (( 0.47 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411395 (( 0.53 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/230496 (( 0.47 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/314380 (( 0.48 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3136 (( 0.36 ))s +IOVDbSvc INFO bytes in (( 9.58 ))s IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.36 ))s -IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.24 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.20 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 2.91 ))s IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 4.48 ))s -IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.60 ))s -IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.58 ))s -IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.27 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 3.98 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.66 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.56 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.26 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -3132,8 +3413,8 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO **************************************************************************************************** *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** -cObj_ALL INFO Time User : Tot= 10 [ms] Ave/Min/Max=0.556(+- 2.29)/ 0/ 10 [ms] #= 18 -ChronoStatSvc INFO Time User : Tot= 10.9 [s] #= 1 +cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 +ChronoStatSvc INFO Time User : Tot= 10.5 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully diff --git a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref index 88e725e64ae7..1f4ee37443eb 100644 --- a/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref +++ b/MuonSpectrometer/MuonConfig/share/MuonDataDecodeTest_Cache.ref @@ -1,11 +1,13 @@ Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -32,13 +34,14 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py Detector : __detector : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -72,16 +75,18 @@ Py:ComponentAccumulator DEBUG Adding component ByteStreamAttListMetadataSvc/By Py:ComponentAccumulator DEBUG Adding component IOVDbMetaDataTool/IOVDbMetaDataTool to the job Py:ComponentAccumulator DEBUG Adding component ByteStreamMetadataTool/ByteStreamMetadataTool to the job Py:ComponentAccumulator DEBUG Merging algorithm MuonCacheCreator to a sequence AthAlgSeq -Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc8-opt] [iac_master_rpcrdo/63cc84e] -- built on [2019-03-15T1157] dynamically loading the flag Detector Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -176,12 +181,13 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Muon : __muon : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py @@ -470,11 +476,13 @@ dynamically loading the flag Muon Flag Name : Value Beam.BunchSpacing : 25 Beam.Energy : [function] -Beam.NumberOfCollisions : 0 -Beam.Type : 'collisions' +Beam.NumberOfCollisions : [function] +Beam.Type : [function] Beam.estimatedLuminosity : [function] +Calo.Cell.doLArHVCorr : False Calo.Noise.fixedLumiForNoise : -1 Calo.Noise.useCaloNoiseLumi : True +Calo.TopoCluster.doTopoClusterLocalCalib : True Calo.TopoCluster.doTreatEnergyCutAsAbsol : False Calo.TopoCluster.doTwoGaussianNoise : True Common.Project : 'Athena' @@ -625,12 +633,13 @@ Output.HITSFileName : 'myHITS.pool.root' Output.RDOFileName : 'myROD.pool.root' Output.doESD : False Scheduler.CheckDependencies : True -Scheduler.ShowControlFlow : False -Scheduler.ShowDataDeps : False -Scheduler.ShowDataFlow : False +Scheduler.ShowControlFlow : True +Scheduler.ShowDataDeps : True +Scheduler.ShowDataFlow : True Flag categories that can be loaded dynamically Category : Generator name : Defined in DQ : __dq : AthenaConfiguration/AllConfigFlags.py +Egamma : __egamma : AthenaConfiguration/AllConfigFlags.py LAr : __lar : AthenaConfiguration/AllConfigFlags.py Sim : __simulation : AthenaConfiguration/AllConfigFlags.py Trigger : __trigger : AthenaConfiguration/AllConfigFlags.py @@ -654,14 +663,14 @@ Py:ComponentAccumulator DEBUG Adding component ProxyProviderSvc/ProxyProviderS Py:ComponentAccumulator DEBUG Adding component DBReplicaSvc/DBReplicaSvc to the job Py:IOVDbSvc.CondDB DEBUG Loading basic services for CondDBSetup... Py:ConfigurableDb DEBUG loading confDb files... -Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonByteStream.confdb]... Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/WorkDir.confdb]... -Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... -Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... +Py:ConfigurableDb DEBUG -loading [/home/ppe/i/iconnell/projects/MuonTriggerAthenaMT/build_RPC/x86_64-slc6-gcc8-opt/lib/libMuonRPC_CnvTools.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/GAUDI/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Gaudi.confdb]... +Py:ConfigurableDb DEBUG -loading [/cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/lib/Athena.confdb]... Py:ConfigurableDb DEBUG loading confDb files... [DONE] Py:ConfigurableDb DEBUG loaded 1103 confDb packages -Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO Read module info for 5461 configurables from 5 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! Py:ConfigurableDb DEBUG : Found configurable <class 'GaudiCoreSvc.GaudiCoreSvcConf.MessageSvc'> in module GaudiCoreSvc.GaudiCoreSvcConf Py:loadBasicAthenaPool DEBUG Loading basic services for AthenaPool... @@ -1437,24 +1446,24 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** |-AuditStop = False |-Cardinality = 0 |-ContinueEventloopOnFPE = False -|-DetStore @0x7f0461dd3e90 = ServiceHandle('StoreGateSvc/DetectorStore') +|-DetStore @0x7fe2e5219e90 = ServiceHandle('StoreGateSvc/DetectorStore') |-Enable = True |-ErrorCounter = 0 |-ErrorMax = 1 -|-EvtStore @0x7f0461dd3e10 = ServiceHandle('StoreGateSvc') -|-ExtraInputs @0x7f0460462098 = [] (default: []) -|-ExtraOutputs @0x7f0460462200 = [] (default: []) +|-EvtStore @0x7fe2e5219e10 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7fe2e3857290 = [] (default: []) +|-ExtraOutputs @0x7fe2e3857320 = [] (default: []) |-FilterCircularDependencies = True |-IgnoreFilterPassed = False |-IsIOBound = False -|-Members @0x7f0460410e18 = ['MuonCacheCreator/MuonCacheCreator', 'Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +|-Members @0x7fe2e37a6dd0 = ['MuonCacheCreator/MuonCacheCreator', 'Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] | (default: []) |-ModeOR = False |-MonitorService = 'MonitorSvc' -|-NeededResources @0x7f04604622d8 = [] (default: []) +|-NeededResources @0x7fe2e3857170 = [] (default: []) |-OutputLevel = 0 |-RegisterForContextService = False -|-Sequential = False +|-Sequential @0x7fe2e68cab00 = True (default: False) |-StopOverride = False |-TimeOut = 0.0 |-Timeline = True @@ -1470,24 +1479,24 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 0 -| |-CscCacheKey @0x7f0460cef870 = 'CscCache' (default: 'StoreGateSvc+') -| |-DetStore @0x7f0460a5db10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-CscCacheKey @0x7fe2e4141870 = 'CscCache' (default: 'StoreGateSvc+') +| |-DetStore @0x7fe2e4009050 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DisableViewWarning = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460a5da90 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f0460462320 = [] (default: []) -| |-ExtraOutputs @0x7f0460462488 = [] (default: []) +| |-EvtStore @0x7fe2e407df90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857368 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38571b8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False -| |-MdtCsmCacheKey @0x7f0460cef510 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| |-MdtCsmCacheKey @0x7fe2e4141450 = 'MdtCsmCache' (default: 'StoreGateSvc+') | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462368 = [] (default: []) +| |-NeededResources @0x7fe2e38573b0 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False -| |-RpcCacheKey @0x7f0460cef540 = 'RpcCache' (default: 'StoreGateSvc+') -| |-TgcCacheKey @0x7f0460cef570 = 'TgcCache' (default: 'StoreGateSvc+') +| |-RpcCacheKey @0x7fe2e4141480 = 'RpcCache' (default: 'StoreGateSvc+') +| |-TgcCacheKey @0x7fe2e41414e0 = 'TgcCache' (default: 'StoreGateSvc+') | |-Timeline = True | \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- |=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** @@ -1502,24 +1511,24 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7f0460a44d50 = ServiceHandle('StoreGateSvc/DetectorStore') -| |-DoSeededDecoding @0x7f0463486b00 = True (default: False) +| |-DetStore @0x7fe2e406f290 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding @0x7fe2e68cab00 = True (default: False) | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460a44cd0 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f04604623f8 = [] (default: []) -| |-ExtraOutputs @0x7f0460462518 = [] (default: []) +| |-EvtStore @0x7fe2e406f210 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857440 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38574d0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f04604623b0 = [] (default: []) +| |-NeededResources @0x7fe2e3857488 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7f0460c6f680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| |-ProviderTool @0x7fe2e40c0680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') | | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') -| |-RegionSelectionSvc @0x7f0460a44dd0 = ServiceHandle('RegSelSvc') +| |-RegionSelectionSvc @0x7fe2e406f310 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False -| |-RoIs @0x7f0462ce6e70 = 'MURoIs' (default: 'StoreGateSvc+OutputRoIs') +| |-RoIs @0x7fe2e6132f00 = 'MURoIs' (default: 'StoreGateSvc+OutputRoIs') | |-Timeline = True | |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** | | |-AuditFinalize = False @@ -1529,17 +1538,17 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-Decoder @0x7f0460cc9620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') -| | |-DetStore @0x7f046098b5d0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f046098b610 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f0460a23518 = [] (default: []) -| | |-ExtraOutputs @0x7f0460a23560 = [] (default: []) +| | |-Decoder @0x7fe2e411d620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7fe2e3ce6ad0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3ce6b10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3ced3f8 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3ced290 = [] (default: []) | | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel @ 0x171a1c0 = 2 (default: 0) +| | |-OutputLevel @ 0x22561c0 = 2 (default: 0) | | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' | | |-RdoLocation = 'StoreGateSvc+RPCPAD' -| | |-RpcContainerCacheKey @0x7f0460cef540 = 'RpcCache' (default: 'StoreGateSvc+') -| | |-WriteOutRpcSectorLogic @0x7f0463486b20 = False (default: True) +| | |-RpcContainerCacheKey @0x7fe2e4141480 = 'RpcCache' (default: 'StoreGateSvc+') +| | |-WriteOutRpcSectorLogic @0x7fe2e68cab20 = False (default: True) | | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** | | | |-AuditFinalize = False | | | |-AuditInitialize = False @@ -1549,10 +1558,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStop = False | | | |-AuditTools = False | | | |-DataErrorPrintLimit = 1000 -| | | |-DetStore @0x7f046098b6d0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f046098b710 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f0460a232d8 = [] (default: []) -| | | |-ExtraOutputs @0x7f0460a23290 = [] (default: []) +| | | |-DetStore @0x7fe2e3ce6bd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3ce6c10 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3ced320 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3ced2d8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-Sector13Data = False @@ -1572,19 +1581,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7f0460a50d10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e407d250 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460a50c90 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f04604627a0 = [] (default: []) -| |-ExtraOutputs @0x7f0460462878 = [] (default: []) +| |-EvtStore @0x7fe2e407d1d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857758 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857830 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f04604627e8 = [] (default: []) +| |-NeededResources @0x7fe2e38577a0 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7f0461b828c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| |-ProviderTool @0x7fe2e4fd18c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') | | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1596,12 +1605,12 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-Decoder @0x7f0461b829b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | |-Decoder @0x7fe2e4fd19b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') | | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') -| | |-DetStore @0x7f0460927c10 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f0460927c50 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f046092b9e0 = [] (default: []) -| | |-ExtraOutputs @0x7f046092b830 = [] (default: []) +| | |-DetStore @0x7fe2e3d47150 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3d47190 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3dd1bd8 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3dd1a28 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputLevel = 0 | | |-RdoLocation = 'StoreGateSvc+TGCRDO' @@ -1613,10 +1622,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7f0460927d10 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f0460927d50 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f046092b680 = [] (default: []) -| | | |-ExtraOutputs @0x7f046092b7e8 = [] (default: []) +| | | |-DetStore @0x7fe2e3d47250 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3d47290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3dd1878 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3dd19e0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ShowStatusWords = False @@ -1636,19 +1645,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7f0460bf7f50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e4061490 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460bf7ed0 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f04604628c0 = [] (default: []) -| |-ExtraOutputs @0x7f0460462950 = [] (default: []) +| |-EvtStore @0x7fe2e4061410 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857878 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857908 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462830 = [] (default: []) +| |-NeededResources @0x7fe2e38577e8 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7f0460d70d50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| |-ProviderTool @0x7fe2e3ed2e50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') | | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1660,14 +1669,14 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-CsmContainerCacheKey @0x7f0460cef510 = 'MdtCsmCache' (default: 'StoreGateSvc+') -| | |-Decoder @0x7f0461b82c80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') -| | |-DetStore @0x7f04604e7d10 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f04604e7d50 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f04604eca70 = [] (default: []) -| | |-ExtraOutputs @0x7f04604ecb48 = [] (default: []) +| | |-CsmContainerCacheKey @0x7fe2e4141450 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7fe2e4fd1c80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7fe2e3923210 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3923250 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e38d0128 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e38d0098 = [] (default: []) | | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel @ 0x171a1d8 = 1 (default: 0) +| | |-OutputLevel @ 0x22561d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+MDTCSM' | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' | | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** @@ -1678,10 +1687,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7f04604e7e10 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f04604e7e50 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f04604ec950 = [] (default: []) -| | | |-ExtraOutputs @0x7f04604ec908 = [] (default: []) +| | | |-DetStore @0x7fe2e3923310 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3923350 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e38d0050 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e393cfc8 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' @@ -1701,19 +1710,19 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7f0460bf7190 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e4056690 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460bf7110 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f04604629e0 = [] (default: []) -| |-ExtraOutputs @0x7f0460462908 = [] (default: []) +| |-EvtStore @0x7fe2e4056610 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857998 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38578c0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462710 = [] (default: []) +| |-NeededResources @0x7fe2e38576c8 = [] (default: []) | |-OutputLevel = 0 -| |-ProviderTool @0x7f04604b2050 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| |-ProviderTool @0x7fe2e3890150 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') | | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') | |-RegisterForContextService = False | |-Timeline = True @@ -1725,15 +1734,15 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStart = False | | |-AuditStop = False | | |-AuditTools = False -| | |-CscContainerCacheKey @0x7f0460cef870 = 'CscCache' (default: 'StoreGateSvc+') -| | |-Decoder @0x7f0461b82e60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') -| | |-DetStore @0x7f04604aabd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-CscContainerCacheKey @0x7fe2e4141870 = 'CscCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7fe2e4fd1e60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7fe2e38910d0 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-EventInfoKey = 'StoreGateSvc+EventInfo' -| | |-EvtStore @0x7f04604aac10 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f046047c248 = [] (default: []) -| | |-ExtraOutputs @0x7f046047c560 = [] (default: []) +| | |-EvtStore @0x7fe2e3891110 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e388d440 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e388d758 = [] (default: []) | | |-MonitorService = 'MonitorSvc' -| | |-OutputLevel @ 0x171a1d8 = 1 (default: 0) +| | |-OutputLevel @ 0x22561d8 = 1 (default: 0) | | |-RdoLocation = 'StoreGateSvc+CSCRDO' | | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** | | | |-AuditFinalize = False @@ -1743,10 +1752,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7f04604aacd0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f04604aad10 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f046047c368 = [] (default: []) -| | | |-ExtraOutputs @0x7f046047c320 = [] (default: []) +| | | |-DetStore @0x7fe2e38911d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3891210 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e388d560 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e388d518 = [] (default: []) | | | |-IsCosmics = False | | | |-IsOldCosmics = False | | | |-MonitorService = 'MonitorSvc' @@ -1766,25 +1775,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7f0460b59d20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| |-DecodingTool @0x7fe2e3fbcd20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') | | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') -| |-DetStore @0x7f04603e4690 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e38c0b50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f04603e4610 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f04604626c8 = [] (default: []) -| |-ExtraOutputs @0x7f0460462b00 = [] (default: []) +| |-EvtStore @0x7fe2e38c0ad0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857680 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857ab8 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462a28 = [] (default: []) +| |-NeededResources @0x7fe2e38579e0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+RPC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7f0463486b20 = False (default: False) -| |-RegionSelectionSvc @0x7f04603e4710 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e38c0bd0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1797,16 +1806,16 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True -| | |-DetStore @0x7f046044b850 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f046044b8d0 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f04604bac68 = [] (default: []) -| | |-ExtraOutputs @0x7f04604bacf8 = [] (default: []) +| | |-DetStore @0x7fe2e382dd10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e382dd90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e389b128 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e389b518 = [] (default: []) | | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+RPCPAD' | | |-OutputLevel = 0 | | |-RPCInfoFromDb = False -| | |-RdoDecoderTool @0x7f04604c22f0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | |-RdoDecoderTool @0x7fe2e3d1e4b0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') | | | (default: 'Muon::RpcRDO_Decoder') | | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' | | |-etaphi_coincidenceTime = 20.0 @@ -1824,10 +1833,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7f046044b950 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f046044b990 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f04604baf38 = [] (default: []) -| | | |-ExtraOutputs @0x7f04604baef0 = [] (default: []) +| | | |-DetStore @0x7fe2e382de10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e382de50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e389b638 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e389b5f0 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- @@ -1845,25 +1854,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7f046045e050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| |-DecodingTool @0x7fe2e383e050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') | | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') -| |-DetStore @0x7f046043e590 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e3819a50 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f046043e510 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f0460462998 = [] (default: []) -| |-ExtraOutputs @0x7f0460462b48 = [] (default: []) +| |-EvtStore @0x7fe2e38199d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857950 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857b00 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462b90 = [] (default: []) +| |-NeededResources @0x7fe2e3857b48 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+TGC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7f0463486b20 = False (default: False) -| |-RegionSelectorSvc @0x7f046043e610 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectorSvc @0x7fe2e3819ad0 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Setting = 0 @@ -1877,10 +1886,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-DecodeData = True -| | |-DetStore @0x7f046044bad0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f046044ba10 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f046045cb48 = [] (default: []) -| | |-ExtraOutputs @0x7f046045c2d8 = [] (default: []) +| | |-DetStore @0x7fe2e382df10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e382dfd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e383da70 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e383da28 = [] (default: []) | | |-FillCoinData = True | | |-MonitorService = 'MonitorSvc' | | |-OutputCoinCollection = 'TrigT1CoinDataCollection' @@ -1889,9 +1898,9 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-RDOContainer = 'StoreGateSvc+TGCRDO' | | |-TGCHashIdOffset = 26000 | | |-dropPrdsWithZeroWidth = True -| | |-outputCoinKey @0x7f046045c710 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | |-outputCoinKey @0x7fe2e383d4d0 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) -| | |-prepDataKeys @0x7f046045cbd8 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | |-prepDataKeys @0x7fe2e383db00 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] | | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) | | |-show_warning_level_invalid_A09_SSW6_hit = False | | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- @@ -1908,25 +1917,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DecodingTool @0x7f0462d00b50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| |-DecodingTool @0x7fe2e614cb50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') | | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') -| |-DetStore @0x7f04603d8550 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e38aca10 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f04603d84d0 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f0460462c20 = [] (default: []) -| |-ExtraOutputs @0x7f0460462cb0 = [] (default: []) +| |-EvtStore @0x7fe2e38ac990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857bd8 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857c68 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462c68 = [] (default: []) +| |-NeededResources @0x7fe2e3857c20 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7f0463486b20 = False (default: False) -| |-RegionSelectionSvc @0x7f04603d85d0 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e38aca90 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -1940,13 +1949,13 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditTools = False | | |-CalibratePrepData = True | | |-DecodeData = True -| | |-DetStore @0x7f046044bcd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DetStore @0x7fe2e382dc10 = ServiceHandle('StoreGateSvc/DetectorStore') | | |-DiscardSecondaryHitTwin = False | | |-DoPropagationCorrection = False | | |-DoTofCorrection = True -| | |-EvtStore @0x7f046044bd90 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f046046b488 = [] (default: []) -| | |-ExtraOutputs @0x7f046046b368 = [] (default: []) +| | |-EvtStore @0x7fe2e382dd50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3846b48 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e384a5f0 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' | | |-OutputLevel = 0 @@ -1974,25 +1983,25 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-CscRdoToCscPrepDataTool @0x7f0460b225a0 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| |-CscRdoToCscPrepDataTool @0x7fe2e3f62380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') | | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') -| |-DetStore @0x7f0460446b50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e3891610 = ServiceHandle('StoreGateSvc/DetectorStore') | |-DoSeededDecoding = False | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f0460446a50 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f0460462d88 = [] (default: []) -| |-ExtraOutputs @0x7f0460462a70 = [] (default: []) +| |-EvtStore @0x7fe2e3891f10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857d40 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857a28 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462cf8 = [] (default: []) +| |-NeededResources @0x7fe2e3857cb0 = [] (default: []) | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | |-OutputLevel = 0 | |-PrintInputRdo = False -| |-PrintPrepData @0x7f0463486b20 = False (default: False) -| |-RegionSelectionSvc @0x7f0460446bd0 = ServiceHandle('RegSelSvc') +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e3891690 = ServiceHandle('RegSelSvc') | |-RegisterForContextService = False | |-RoIs = 'StoreGateSvc+OutputRoIs' | |-Timeline = True @@ -2005,13 +2014,13 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | |-AuditStop = False | | |-AuditTools = False | | |-CSCHashIdOffset = 22000 -| | |-CscCalibTool @0x7f0462d69b10 = PrivateToolHandle('CscCalibTool/CscCalibTool') -| | |-CscRdoDecoderTool @0x7f0460468c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-CscCalibTool @0x7fe2e61439b8 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7fe2e3838c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') | | |-DecodeData = True -| | |-DetStore @0x7f046044b9d0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | |-EvtStore @0x7f0460471090 = ServiceHandle('StoreGateSvc') -| | |-ExtraInputs @0x7f046045f128 = [] (default: []) -| | |-ExtraOutputs @0x7f046045fb48 = [] (default: []) +| | |-DetStore @0x7fe2e382dc50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e383f090 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3853a70 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3853878 = [] (default: []) | | |-MonitorService = 'MonitorSvc' | | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' | | |-OutputLevel = 0 @@ -2024,10 +2033,10 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-DetStore @0x7f04604710d0 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f0460471110 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f046045fdd0 = [] (default: []) -| | | |-ExtraOutputs @0x7f04609a9290 = [] (default: []) +| | | |-DetStore @0x7fe2e383f3d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e383f290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3853c68 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3853cb0 = [] (default: []) | | | |-IsOnline = True | | | |-Latency = 100.0 | | | |-MonitorService = 'MonitorSvc' @@ -2054,11 +2063,11 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | | | |-AuditStart = False | | | |-AuditStop = False | | | |-AuditTools = False -| | | |-CscCalibTool @0x7f046044bfd0 = PublicToolHandle('CscCalibTool') -| | | |-DetStore @0x7f046044bf90 = ServiceHandle('StoreGateSvc/DetectorStore') -| | | |-EvtStore @0x7f0460471050 = ServiceHandle('StoreGateSvc') -| | | |-ExtraInputs @0x7f0460996998 = [] (default: []) -| | | |-ExtraOutputs @0x7f046092bf38 = [] (default: []) +| | | |-CscCalibTool @0x7fe2e383f4d0 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7fe2e383f410 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e383f110 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3853b90 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3853b48 = [] (default: []) | | | |-MonitorService = 'MonitorSvc' | | | |-OutputLevel = 0 | | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- @@ -2076,21 +2085,21 @@ Py:ComponentAccumulator INFO /***** Algorithm AthSequencer/AthAlgSeq ******** | |-AuditStart = False | |-AuditStop = False | |-Cardinality = 1 -| |-DetStore @0x7f046035c390 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DetStore @0x7fe2e386e850 = ServiceHandle('StoreGateSvc/DetectorStore') | |-Enable = True | |-ErrorCounter = 0 | |-ErrorMax = 1 -| |-EvtStore @0x7f046035c310 = ServiceHandle('StoreGateSvc') -| |-ExtraInputs @0x7f0460462dd0 = [] (default: []) -| |-ExtraOutputs @0x7f0460462e18 = [] (default: []) +| |-EvtStore @0x7fe2e386e7d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857d88 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857dd0 = [] (default: []) | |-FilterCircularDependencies = True | |-IsIOBound = False | |-MonitorService = 'MonitorSvc' -| |-NeededResources @0x7f0460462e60 = [] (default: []) +| |-NeededResources @0x7fe2e3857e18 = [] (default: []) | |-OutputLevel = 0 | |-RegisterForContextService = False | |-Timeline = True -| |-cluster_builder @0x7f046040ecd0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| |-cluster_builder @0x7fe2e37b61d0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') | | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') | \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- \----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- @@ -2119,402 +2128,683 @@ Py:ComponentAccumulator INFO Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepD Py:ComponentAccumulator INFO CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool, Py:ComponentAccumulator INFO ] Py:Athena INFO Save Config -MuonCacheCreator ExtraOutputs [] -MuonCacheCreator MdtCsmCacheKey MdtCsmCache -MuonCacheCreator TgcCacheKey TgcCache -MuonCacheCreator CscCacheKey CscCache -MuonCacheCreator RpcCacheKey RpcCache -MuonCacheCreator ExtraInputs [] -MuonCacheCreator NeededResources [] -MuonCacheCreator DetStore StoreGateSvc/DetectorStore -MuonCacheCreator EvtStore StoreGateSvc -RpcRawDataProvider ExtraOutputs [] -RpcRawDataProvider DoSeededDecoding True -RpcRawDataProvider EvtStore StoreGateSvc -RpcRawDataProvider RoIs MURoIs -RpcRawDataProvider ExtraInputs [] -RpcRawDataProvider RegionSelectionSvc RegSelSvc -RpcRawDataProvider ProviderTool Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool -RpcRawDataProvider NeededResources [] -RpcRawDataProvider DetStore StoreGateSvc/DetectorStore -RpcRawDataProvider.RPC_RawDataProviderTool ExtraOutputs [] -RpcRawDataProvider.RPC_RawDataProviderTool EvtStore StoreGateSvc -RpcRawDataProvider.RPC_RawDataProviderTool OutputLevel 2 -RpcRawDataProvider.RPC_RawDataProviderTool RpcContainerCacheKey RpcCache -RpcRawDataProvider.RPC_RawDataProviderTool WriteOutRpcSectorLogic False -RpcRawDataProvider.RPC_RawDataProviderTool ExtraInputs [] -RpcRawDataProvider.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder -RpcRawDataProvider.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] -RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider ExtraOutputs [] -TgcRawDataProvider EvtStore StoreGateSvc -TgcRawDataProvider ExtraInputs [] -TgcRawDataProvider NeededResources [] -TgcRawDataProvider ProviderTool Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool -TgcRawDataProvider DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider.TGC_RawDataProviderTool ExtraOutputs [] -TgcRawDataProvider.TGC_RawDataProviderTool EvtStore StoreGateSvc -TgcRawDataProvider.TGC_RawDataProviderTool ExtraInputs [] -TgcRawDataProvider.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -TgcRawDataProvider.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] -TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider ExtraOutputs [] -MdtRawDataProvider EvtStore StoreGateSvc -MdtRawDataProvider ExtraInputs [] -MdtRawDataProvider NeededResources [] -MdtRawDataProvider ProviderTool Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool -MdtRawDataProvider DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider.MDT_RawDataProviderTool ExtraOutputs [] -MdtRawDataProvider.MDT_RawDataProviderTool EvtStore StoreGateSvc -MdtRawDataProvider.MDT_RawDataProviderTool OutputLevel 1 -MdtRawDataProvider.MDT_RawDataProviderTool ExtraInputs [] -MdtRawDataProvider.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder -MdtRawDataProvider.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -MdtRawDataProvider.MDT_RawDataProviderTool CsmContainerCacheKey MdtCsmCache -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] -MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore -CscRawDataProvider ExtraOutputs [] -CscRawDataProvider EvtStore StoreGateSvc -CscRawDataProvider ExtraInputs [] -CscRawDataProvider NeededResources [] -CscRawDataProvider ProviderTool Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool -CscRawDataProvider DetStore StoreGateSvc/DetectorStore -CscRawDataProvider.CSC_RawDataProviderTool ExtraOutputs [] -CscRawDataProvider.CSC_RawDataProviderTool EvtStore StoreGateSvc -CscRawDataProvider.CSC_RawDataProviderTool OutputLevel 1 -CscRawDataProvider.CSC_RawDataProviderTool CscContainerCacheKey CscCache -CscRawDataProvider.CSC_RawDataProviderTool ExtraInputs [] -CscRawDataProvider.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder -CscRawDataProvider.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] -CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData ExtraOutputs [] -RpcRdoToRpcPrepData DecodingTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool -RpcRdoToRpcPrepData EvtStore StoreGateSvc -RpcRdoToRpcPrepData ExtraInputs [] -RpcRdoToRpcPrepData PrintPrepData False -RpcRdoToRpcPrepData RegionSelectionSvc RegSelSvc -RpcRdoToRpcPrepData NeededResources [] -RpcRdoToRpcPrepData DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraOutputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ExtraInputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] -RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore -TgcRdoToTgcPrepData ExtraOutputs [] -TgcRdoToTgcPrepData DecodingTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool -TgcRdoToTgcPrepData EvtStore StoreGateSvc -TgcRdoToTgcPrepData RegionSelectorSvc RegSelSvc -TgcRdoToTgcPrepData ExtraInputs [] -TgcRdoToTgcPrepData PrintPrepData False -TgcRdoToTgcPrepData NeededResources [] -TgcRdoToTgcPrepData DetStore StoreGateSvc/DetectorStore -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraOutputs [] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ExtraInputs [] -TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore -MdtRdoToMdtPrepData ExtraOutputs [] -MdtRdoToMdtPrepData DecodingTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool -MdtRdoToMdtPrepData EvtStore StoreGateSvc -MdtRdoToMdtPrepData ExtraInputs [] -MdtRdoToMdtPrepData PrintPrepData False -MdtRdoToMdtPrepData RegionSelectionSvc RegSelSvc -MdtRdoToMdtPrepData NeededResources [] -MdtRdoToMdtPrepData DetStore StoreGateSvc/DetectorStore -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraOutputs [] -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ExtraInputs [] -MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData ExtraOutputs [] -CscRdoToCscPrepData CscRdoToCscPrepDataTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool -CscRdoToCscPrepData EvtStore StoreGateSvc -CscRdoToCscPrepData ExtraInputs [] -CscRdoToCscPrepData PrintPrepData False -CscRdoToCscPrepData RegionSelectionSvc RegSelSvc -CscRdoToCscPrepData NeededResources [] -CscRdoToCscPrepData DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool -CscRdoToCscPrepData.CscRdoToCscPrepDataTool EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder -CscRdoToCscPrepData.CscRdoToCscPrepDataTool ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] -CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore -CscThesholdClusterBuilder ExtraOutputs [] -CscThesholdClusterBuilder EvtStore StoreGateSvc -CscThesholdClusterBuilder ExtraInputs [] -CscThesholdClusterBuilder cluster_builder CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool -CscThesholdClusterBuilder NeededResources [] -CscThesholdClusterBuilder DetStore StoreGateSvc/DetectorStore -CondInputLoader ExtraOutputs [] -CondInputLoader Load [('CondAttrListCollection', '/MDT/CABLING/MEZZANINE_SCHEMA'), ('CondAttrListCollection', '/EXT/DCS/MAGNETS/SENSORDATA'), ('CondAttrListCollection', '/MDT/CABLING/MAP_SCHEMA')] -CondInputLoader EvtStore StoreGateSvc -CondInputLoader ExtraInputs [] -CondInputLoader NeededResources [] -CondInputLoader DetStore StoreGateSvc/DetectorStore -MuonMDT_CablingAlg ExtraOutputs [] -MuonMDT_CablingAlg EvtStore StoreGateSvc -MuonMDT_CablingAlg ExtraInputs [] -MuonMDT_CablingAlg NeededResources [] -MuonMDT_CablingAlg DetStore StoreGateSvc/DetectorStore -MuonMDT_CablingAlg MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA -MuonMDT_CablingAlg MapFolders /MDT/CABLING/MAP_SCHEMA -ToolSvc.IOVDbMetaDataTool ExtraOutputs [] -ToolSvc.IOVDbMetaDataTool FoldersToBeModified ['/Simulation/Parameters'] -ToolSvc.IOVDbMetaDataTool MinMaxRunNumbers [] -ToolSvc.IOVDbMetaDataTool EvtStore StoreGateSvc -ToolSvc.IOVDbMetaDataTool AttributesToBeRemoved ['RandomSeedOffset'] -ToolSvc.IOVDbMetaDataTool ExtraInputs [] -ToolSvc.IOVDbMetaDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.ByteStreamMetadataTool ExtraOutputs [] -ToolSvc.ByteStreamMetadataTool EvtStore StoreGateSvc -ToolSvc.ByteStreamMetadataTool ExtraInputs [] -ToolSvc.ByteStreamMetadataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.Muon::MuonIdHelperTool ExtraOutputs [] -ToolSvc.Muon::MuonIdHelperTool EvtStore StoreGateSvc -ToolSvc.Muon::MuonIdHelperTool ExtraInputs [] -ToolSvc.Muon::MuonIdHelperTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPCCablingDbTool ExtraOutputs [] -ToolSvc.RPCCablingDbTool EvtStore StoreGateSvc -ToolSvc.RPCCablingDbTool ExtraInputs [] -ToolSvc.RPCCablingDbTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPCCablingDbTool MapCorrectionFolder /RPC/CABLING/MAP_SCHEMA_CORR -ToolSvc.RPCCablingDbTool MapConfigurationFolder /RPC/CABLING/MAP_SCHEMA -ToolSvc.RPC_RawDataProviderTool ExtraOutputs [] -ToolSvc.RPC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.RPC_RawDataProviderTool OutputLevel 2 -ToolSvc.RPC_RawDataProviderTool RpcContainerCacheKey RpcCache -ToolSvc.RPC_RawDataProviderTool WriteOutRpcSectorLogic False -ToolSvc.RPC_RawDataProviderTool ExtraInputs [] -ToolSvc.RPC_RawDataProviderTool Decoder Muon::RpcROD_Decoder/RpcROD_Decoder -ToolSvc.RPC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraOutputs [] -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder EvtStore StoreGateSvc -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder ExtraInputs [] -ToolSvc.RPC_RawDataProviderTool.RpcROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.TGC_RawDataProviderTool ExtraOutputs [] -ToolSvc.TGC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.TGC_RawDataProviderTool ExtraInputs [] -ToolSvc.TGC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.TGC_RawDataProviderTool Decoder Muon::TGC_RodDecoderReadout/TgcROD_Decoder -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraOutputs [] -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder EvtStore StoreGateSvc -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder ExtraInputs [] -ToolSvc.TGC_RawDataProviderTool.TgcROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.MDTCablingDbTool ExtraOutputs [] -ToolSvc.MDTCablingDbTool EvtStore StoreGateSvc -ToolSvc.MDTCablingDbTool ExtraInputs [] -ToolSvc.MDTCablingDbTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MDTCablingDbTool MezzanineFolders /MDT/CABLING/MEZZANINE_SCHEMA -ToolSvc.MDTCablingDbTool MapFolders /MDT/CABLING/MAP_SCHEMA -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraOutputs [] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RT_InputFiles ['Muon_RT_default.data'] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TimeSlewingCorrection False -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool RtFolder /MDT/RTBLOB -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool MeanCorrectionVsR [-5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool defaultT0 40 -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool ExtraInputs [] -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool UseMLRt True -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool PropagationSpeedBeta 0.85 -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool TubeFolder /MDT/T0BLOB -ToolSvc.MuonCalib::MdtCalibDbCoolStrTool EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool ExtraOutputs [] -ToolSvc.MDT_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool ExtraInputs [] -ToolSvc.MDT_RawDataProviderTool Decoder MdtROD_Decoder/MdtROD_Decoder -ToolSvc.MDT_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MDT_RawDataProviderTool CsmContainerCacheKey MdtCsmCache -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraOutputs [] -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder EvtStore StoreGateSvc -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder ExtraInputs [] -ToolSvc.MDT_RawDataProviderTool.MdtROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.CSC_RawDataProviderTool ExtraOutputs [] -ToolSvc.CSC_RawDataProviderTool EvtStore StoreGateSvc -ToolSvc.CSC_RawDataProviderTool CscContainerCacheKey CscCache -ToolSvc.CSC_RawDataProviderTool ExtraInputs [] -ToolSvc.CSC_RawDataProviderTool Decoder Muon::CscROD_Decoder/CscROD_Decoder -ToolSvc.CSC_RawDataProviderTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraOutputs [] -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder EvtStore StoreGateSvc -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder ExtraInputs [] -ToolSvc.CSC_RawDataProviderTool.CscROD_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.RpcRdoToRpcPrepDataTool ExtraOutputs [] -ToolSvc.RpcRdoToRpcPrepDataTool EvtStore StoreGateSvc -ToolSvc.RpcRdoToRpcPrepDataTool ExtraInputs [] -ToolSvc.RpcRdoToRpcPrepDataTool RdoDecoderTool Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder -ToolSvc.RpcRdoToRpcPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraOutputs [] -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder EvtStore StoreGateSvc -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ExtraInputs [] -ToolSvc.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.TgcRdoToTgcPrepDataTool ExtraOutputs [] -ToolSvc.TgcRdoToTgcPrepDataTool prepDataKeys ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -ToolSvc.TgcRdoToTgcPrepDataTool EvtStore StoreGateSvc -ToolSvc.TgcRdoToTgcPrepDataTool outputCoinKey ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] -ToolSvc.TgcRdoToTgcPrepDataTool ExtraInputs [] -ToolSvc.TgcRdoToTgcPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.MdtRdoToMdtPrepDataTool ExtraOutputs [] -ToolSvc.MdtRdoToMdtPrepDataTool EvtStore StoreGateSvc -ToolSvc.MdtRdoToMdtPrepDataTool ExtraInputs [] -ToolSvc.MdtRdoToMdtPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool CscCalibTool CscCalibTool/CscCalibTool -ToolSvc.CscRdoToCscPrepDataTool EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool CscRdoDecoderTool Muon::CscRDO_Decoder/CscRDO_Decoder -ToolSvc.CscRdoToCscPrepDataTool ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder CscCalibTool CscCalibTool -ToolSvc.CscRdoToCscPrepDataTool.CscRDO_Decoder DetStore StoreGateSvc/DetectorStore -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraOutputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool EvtStore StoreGateSvc -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool ExtraInputs [] -ToolSvc.CscRdoToCscPrepDataTool.CscCalibTool DetStore StoreGateSvc/DetectorStore -ToolSvc.CscThesholdClusterBuilderTool ExtraOutputs [] -ToolSvc.CscThesholdClusterBuilderTool split_fitter CscSplitClusterFitter/CscSplitClusterFitter -ToolSvc.CscThesholdClusterBuilderTool strip_fitter CalibCscStripFitter/CalibCscStripFitter -ToolSvc.CscThesholdClusterBuilderTool cscCalibTool CscCalibTool/CscCalibTool -ToolSvc.CscThesholdClusterBuilderTool default_fitter SimpleCscClusterFitter/SimpleCscClusterFitter -ToolSvc.CscThesholdClusterBuilderTool precision_fitter QratCscClusterFitter/QratCscClusterFitter -ToolSvc.CscThesholdClusterBuilderTool EvtStore StoreGateSvc -ToolSvc.CscThesholdClusterBuilderTool ExtraInputs [] -ToolSvc.CscThesholdClusterBuilderTool DetStore StoreGateSvc/DetectorStore -EventSelector SharedMemoryTool -EventSelector SkipEventSequence [] -EventSelector CounterTool -EventSelector Input [] -EventSelector ByteStreamInputSvc ByteStreamInputSvc -EventSelector.xAODMaker::EventInfoSelectorTool ExtraOutputs [] -EventSelector.xAODMaker::EventInfoSelectorTool EvtStore StoreGateSvc -EventSelector.xAODMaker::EventInfoSelectorTool BeamCondSvc BeamCondSvc -EventSelector.xAODMaker::EventInfoSelectorTool ExtraInputs [] -EventSelector.xAODMaker::EventInfoSelectorTool LuminosityTool LuminosityTool -EventSelector.xAODMaker::EventInfoSelectorTool DetStore StoreGateSvc/DetectorStore -ByteStreamInputSvc EventStore StoreGateSvc -ByteStreamInputSvc FullFileName ['/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1'] -ByteStreamInputSvc AttributeListKeys [] -ByteStreamInputSvc MetaDataStore StoreGateSvc/InputMetaDataStore -EventPersistencySvc CnvServices ['ByteStreamCnvSvc', 'AthenaPoolCnvSvc/AthenaPoolCnvSvc', 'DetDescrCnvSvc', 'TagInfoMgr', 'AthenaPoolCnvSvc'] -ByteStreamCnvSvc InitCnvs ['EventInfo', 'ROIB::RoIBResult', 'HLT::HLTResult'] -ByteStreamCnvSvc EventStore StoreGateSvc -ByteStreamCnvSvc ROD2ROBmap [] -ByteStreamCnvSvc ByteStreamOutputSvcList [] -ByteStreamCnvSvc GetDetectorMask True -ROBDataProviderSvc filterRobWithStatus [] -ROBDataProviderSvc filterSubDetWithStatus [] -ByteStreamAddressProviderSvc TypeNames ['TileCellIDC/TileCellIDC', 'MdtDigitContainer/MDT_DIGITS', 'RpcDigitContainer/RPC_DIGITS', 'TgcDigitContainer/TGC_DIGITS', 'CscDigitContainer/CSC_DIGITS', 'ROIB::RecRoIBResult/RecRoIBResult', 'MuCTPI_RIO/MUCTPI_RIO', 'CTP_RIO/CTP_RIO', 'LArRawChannelContainer/LArRawChannels', 'TileRawChannelContainer/TileRawChannelCnt', 'ROIB::RoIBResult/RoIBResult', 'MuCTPI_RDO/MUCTPI_RDO', 'HLT::HLTResult/HLTResult_L2', 'HLT::HLTResult/HLTResult_EF', 'CTP_RDO/CTP_RDO', 'L1TopoRDOCollection/L1TopoRDOCollection'] -ByteStreamAddressProviderSvc TopoProcModuleID [129, 145] -ByteStreamAddressProviderSvc JetProcModuleID [172, 173] -ByteStreamAddressProviderSvc CaloClusterProcModuleID [168, 169, 170, 171] -MetaDataStore IncidentSvc IncidentSvc -MetaDataStore ProxyProviderSvc ProxyProviderSvc -InputMetaDataStore IncidentSvc IncidentSvc -InputMetaDataStore ProxyProviderSvc ProxyProviderSvc -MetaDataSvc MetaDataContainer MetaDataHdr -MetaDataSvc CnvSvc AthenaPoolCnvSvc -ProxyProviderSvc ProviderNames ['ByteStreamAddressProviderSvc', 'IOVDbSvc', 'MetaDataSvc', 'TagInfoMgr'] -GeoModelSvc SupportedGeometry 22 -GeoModelSvc AtlasVersion ATLAS-R2-2016-01-00-01 -GeoModelSvc.MuonDetectorTool ExtraOutputs [] -GeoModelSvc.MuonDetectorTool TheMuonAlignmentTool -GeoModelSvc.MuonDetectorTool EvtStore StoreGateSvc -GeoModelSvc.MuonDetectorTool UseConditionDb 1 -GeoModelSvc.MuonDetectorTool ExtraInputs [] -GeoModelSvc.MuonDetectorTool UseIlinesFromGM 1 -GeoModelSvc.MuonDetectorTool SelectedStJff [] -GeoModelSvc.MuonDetectorTool DetStore StoreGateSvc/DetectorStore -GeoModelSvc.MuonDetectorTool SelectedStations [] -GeoModelSvc.MuonDetectorTool SelectedStJzz [] -DetDescrCnvSvc IdDictFromRDB True -DetDescrCnvSvc IdDictName IdDictParser/ATLAS_IDS.xml -DetDescrCnvSvc DetectorNodes [] -DetDescrCnvSvc DetectorManagers [] -TagInfoMgr ExtraTagValuePairs ['AtlasRelease', 'Athena-22.0.1'] -RPCcablingServerSvc Atlas True -RPCcablingServerSvc useMuonRPC_CablingSvc True -RPCcablingServerSvc forcedUse True -IOVDbSvc Folders ['/MDT/CABLING/MEZZANINE_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_ETA<db>COOLONL_RPC/CONDBR2</db>', '/MDT/RTBLOB<db>COOLOFL_MDT/CONDBR2</db>', '/MDT/T0BLOB<db>COOLOFL_MDT/CONDBR2</db>', '/CSC/STAT <key>CSC_STAT</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/NOISE <key>CSC_NOISE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/PED <key>CSC_PED</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/RMS <key>CSC_RMS</key> <db>COOLOFL_CSC/CONDBR2</db>', '/GLOBAL/BField/Maps <noover/><db>COOLONL_GLOBAL/CONDBR2</db>', '/CSC/T0PHASE <key>CSC_T0PHASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/TGC/CABLING/MAP_SCHEMA<db>COOLONL_TGC/CONDBR2</db>', '/EXT/DCS/MAGNETS/SENSORDATA<db>COOLOFL_DCS/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA_CORR<db>COOLONL_RPC/CONDBR2</db>', '/MDT/CABLING/MAP_SCHEMA<db>COOLONL_MDT/CONDBR2</db>', '/RPC/TRIGGER/CM_THR_PHI<db>COOLONL_RPC/CONDBR2</db>', '/CSC/PSLOPE <key>CSC_PSLOPE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/RPC/CABLING/MAP_SCHEMA<db>COOLONL_RPC/CONDBR2</db>', '/CSC/T0BASE <key>CSC_T0BASE</key> <db>COOLOFL_CSC/CONDBR2</db>', '/CSC/FTHOLD <key>CSC_FTHOLD</key> <db>COOLOFL_CSC/CONDBR2</db>'] -IOVDbSvc CacheAlign 3 -IOVDbSvc dbConnection sqlite://;schema=mycool.db;dbname=CONDBR2 -IOVDbSvc GlobalTag CONDBR2-BLKPA-2018-13 -IOVDbSvc FoldersToMetaData ['/GLOBAL/BField/Maps'] -IOVDbSvc DBInstance CONDBR2 -IOVDbSvc overrideTags [] -PoolSvc FrontierRefreshSchema [] -PoolSvc ReadCatalog ['apcfile:poolcond/PoolFileCatalog.xml', 'prfile:poolcond/PoolCat_oflcond.xml', 'apcfile:poolcond/PoolCat_oflcond.xml', 'prfile:poolcond/PoolCat_comcond.xml', 'apcfile:poolcond/PoolCat_comcond.xml'] -PoolSvc MaxFilesOpen 0 -DBReplicaSvc COOLSQLiteVetoPattern /DBRelease/ -MuonRPC_CablingSvc ConfFilePath MuonRPC_Cabling/ -MuonRPC_CablingSvc TheRpcTriggerDbTool RPCTriggerDbTool -MuonRPC_CablingSvc ConfFileName LVL1confAtlas.data -MuonRPC_CablingSvc FeetPadThresolds [] -MuonRPC_CablingSvc TheRpcCablingDbTool RPCCablingDbTool/RPCCablingDbTool -MuonRPC_CablingSvc RPCTriggerRoadsfromCool True -MuonRPC_CablingSvc CorrFileName LVL1confAtlas.corr -MuonRPC_CablingSvc CosmicConfiguration True -TGCcablingServerSvc Atlas True -TGCcablingServerSvc useMuonTGC_CablingSvc True -TGCcablingServerSvc forcedUse True -AthenaPoolCnvSvc InputPoolAttributes [] -AthenaPoolCnvSvc PoolAttributes [] -AthenaPoolCnvSvc PrintInputAttrPerEvt [] -AthenaPoolCnvSvc InputStreamingTool -AthenaPoolCnvSvc OutputPoolFileAllocator [] -AthenaPoolCnvSvc MaxFileSizes [] -MuonMDT_CablingSvc DBTool MDTCablingDbTool/MDTCablingDbTool -MuonMDT_CablingSvc TagInfoManager TagInfoMgr -MuonMDT_CablingSvc ForcedUse True -MuonMDT_CablingSvc UseOldCabling False -AtlasFieldSvc UseDCS True -MdtCalibrationDbSvc CreateSlewingFunctions False -MdtCalibrationDbSvc DBTool MuonCalib::MdtCalibDbAsciiTool -MdtCalibrationDbSvc CreateBFieldFunctions False -MdtCalibrationDbSvc CreateWireSagFunctions False -MdtCalibrationSvc DoTofCorrection True -MdtCalibrationSvc MagFieldSvc AtlasFieldSvc -MdtCalibrationSvc DoWireSagCorrection False -MdtCalibrationSvc TimeWindowSetting 2 -MdtCalibrationSvc DoSlewingCorrection False -MdtCalibrationSvc DoTemperatureCorrection True -MuonCalib::CscCoolStrSvc ParSGKeys ['CSC_PED', 'CSC_NOISE', 'CSC_PSLOPE', 'CSC_STAT', 'CSC_RMS', 'CSC_FTHOLD', 'CSC_T0BASE', 'CSC_T0PHASE'] -MuonCalib::CscCoolStrSvc ParDefaults ['2048', '3.5', '0.189', '0', '2.56', '0', '0', '0'] -MuonCalib::CscCoolStrSvc ParDataTypes ['float', 'float', 'float', 'uint32_t', 'float', 'float', 'float', 'float'] -MuonCalib::CscCoolStrSvc ParFolders ['/CSC/PED', '/CSC/NOISE', '/CSC/PSLOPE', '/CSC/STAT', '/CSC/RMS', '/CSC/FTHOLD', '/CSC/T0BASE', '/CSC/T0PHASE'] -MuonCalib::CscCoolStrSvc ParCats ['CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'CHANNEL', 'ASM'] -MuonCalib::CscCoolStrSvc ParNames ['ped', 'noise', 'pslope', 'status', 'rms', 'f001', 't0base', 't0phase'] +/***** Algorithm AthSequencer/AthAlgSeq ************************************************************ +|-Atomic = False +|-AuditAlgorithms = False +|-AuditBeginRun = False +|-AuditEndRun = False +|-AuditExecute = False +|-AuditFinalize = False +|-AuditInitialize = False +|-AuditReinitialize = False +|-AuditRestart = False +|-AuditStart = False +|-AuditStop = False +|-Cardinality = 0 +|-ContinueEventloopOnFPE = False +|-DetStore @0x7fe2e5219e90 = ServiceHandle('StoreGateSvc/DetectorStore') +|-Enable = True +|-ErrorCounter = 0 +|-ErrorMax = 1 +|-EvtStore @0x7fe2e5219e10 = ServiceHandle('StoreGateSvc') +|-ExtraInputs @0x7fe2e3857290 = [] (default: []) +|-ExtraOutputs @0x7fe2e3857320 = [] (default: []) +|-FilterCircularDependencies = True +|-IgnoreFilterPassed = False +|-IsIOBound = False +|-Members @0x7fe2e3e6e908 = ['MuonCacheCreator/MuonCacheCreator', 'Muon::RpcRawDataProvider/RpcRawDataProvider', 'Muon::TgcRawDataProvider/TgcRawDataProvider', 'Muon::MdtRawDataProvider/MdtRawDataProvider', 'Muon::CscRawDataProvider/CscRawDataProvider', 'RpcRdoToRpcPrepData/RpcRdoToRpcPrepData', 'TgcRdoToTgcPrepData/TgcRdoToTgcPrepData', 'MdtRdoToMdtPrepData/MdtRdoToMdtPrepData', 'CscRdoToCscPrepData/CscRdoToCscPrepData', 'CscThresholdClusterBuilder/CscThesholdClusterBuilder'] +| (default: []) +|-ModeOR = False +|-MonitorService = 'MonitorSvc' +|-NeededResources @0x7fe2e3857170 = [] (default: []) +|-OutputLevel = 0 +|-RegisterForContextService = False +|-Sequential @0x7fe2e68cab00 = True (default: False) +|-StopOverride = False +|-TimeOut = 0.0 +|-Timeline = True +|=/***** Algorithm MuonCacheCreator/MuonCacheCreator ************************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 0 +| |-CscCacheKey @0x7fe2e4141870 = 'CscCache' (default: 'StoreGateSvc+') +| |-DetStore @0x7fe2e4009050 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DisableViewWarning = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e407df90 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857368 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38571b8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MdtCsmCacheKey @0x7fe2e4141450 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e38573b0 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-RpcCacheKey @0x7fe2e4141480 = 'RpcCache' (default: 'StoreGateSvc+') +| |-TgcCacheKey @0x7fe2e41414e0 = 'TgcCache' (default: 'StoreGateSvc+') +| |-Timeline = True +| \----- (End of Algorithm MuonCacheCreator/MuonCacheCreator) ---------------------------------------- +|=/***** Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fe2e406f290 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding @0x7fe2e68cab00 = True (default: False) +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e406f210 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857440 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38574d0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e3857488 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7fe2e40c0680 = PrivateToolHandle('Muon::RPC_RawDataProviderTool/RPC_RawDataProviderTool') +| | (default: 'Muon::RPC_RawDataProviderTool/RpcRawDataProviderTool') +| |-RegionSelectionSvc @0x7fe2e406f310 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs @0x7fe2e6132f00 = 'MURoIs' (default: 'StoreGateSvc+OutputRoIs') +| |-Timeline = True +| |=/***** Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7fe2e411d620 = PrivateToolHandle('Muon::RpcROD_Decoder/RpcROD_Decoder') +| | |-DetStore @0x7fe2e3ce6ad0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3ce6b10 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3ced3f8 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3ced290 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x22561c0 = 2 (default: 0) +| | |-RPCSec = 'StoreGateSvc+RPC_SECTORLOGIC' +| | |-RdoLocation = 'StoreGateSvc+RPCPAD' +| | |-RpcContainerCacheKey @0x7fe2e4141480 = 'RpcCache' (default: 'StoreGateSvc+') +| | |-WriteOutRpcSectorLogic @0x7fe2e68cab20 = False (default: True) +| | |=/***** Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DataErrorPrintLimit = 1000 +| | | |-DetStore @0x7fe2e3ce6bd0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3ce6c10 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3ced320 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3ced2d8 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-Sector13Data = False +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool Muon::RpcROD_Decoder/RpcRawDataProvider.RPC_RawDataProviderTool.RpcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RPC_RawDataProviderTool/RpcRawDataProvider.RPC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::RpcRawDataProvider/RpcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fe2e407d250 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e407d1d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857758 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857830 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e38577a0 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7fe2e4fd18c0 = PrivateToolHandle('Muon::TGC_RawDataProviderTool/TGC_RawDataProviderTool') +| | (default: 'Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-Decoder @0x7fe2e4fd19b0 = PrivateToolHandle('Muon::TGC_RodDecoderReadout/TgcROD_Decoder') +| | | (default: 'Muon::TGC_RodDecoderReadout/TGC_RodDecoderReadout') +| | |-DetStore @0x7fe2e3d47150 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3d47190 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3dd1bd8 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3dd1a28 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel = 0 +| | |-RdoLocation = 'StoreGateSvc+TGCRDO' +| | |=/***** Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7fe2e3d47250 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3d47290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3dd1878 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3dd19e0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ShowStatusWords = False +| | | |-SkipCoincidence = False +| | | \----- (End of Private AlgTool Muon::TGC_RodDecoderReadout/TgcRawDataProvider.TGC_RawDataProviderTool.TgcROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::TGC_RawDataProviderTool/TgcRawDataProvider.TGC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::TgcRawDataProvider/TgcRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fe2e4061490 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e4061410 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857878 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857908 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e38577e8 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7fe2e3ed2e50 = PrivateToolHandle('Muon::MDT_RawDataProviderTool/MDT_RawDataProviderTool') +| | (default: 'Muon::MDT_RawDataProviderTool/MdtRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CsmContainerCacheKey @0x7fe2e4141450 = 'MdtCsmCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7fe2e4fd1c80 = PrivateToolHandle('MdtROD_Decoder/MdtROD_Decoder') +| | |-DetStore @0x7fe2e3923210 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e3923250 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e38d0128 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e38d0098 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x22561d8 = 1 (default: 0) +| | |-RdoLocation = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |=/***** Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7fe2e3923310 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3923350 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e38d0050 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e393cfc8 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | | |-SpecialROBNumber = -1 +| | | \----- (End of Private AlgTool MdtROD_Decoder/MdtRawDataProvider.MDT_RawDataProviderTool.MdtROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::MDT_RawDataProviderTool/MdtRawDataProvider.MDT_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::MdtRawDataProvider/MdtRawDataProvider) ------------------------------ +|=/***** Algorithm Muon::CscRawDataProvider/CscRawDataProvider *************************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fe2e4056690 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e4056610 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857998 = [] (default: []) +| |-ExtraOutputs @0x7fe2e38578c0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e38576c8 = [] (default: []) +| |-OutputLevel = 0 +| |-ProviderTool @0x7fe2e3890150 = PrivateToolHandle('Muon::CSC_RawDataProviderTool/CSC_RawDataProviderTool') +| | (default: 'Muon::CSC_RawDataProviderTool/CscRawDataProviderTool') +| |-RegisterForContextService = False +| |-Timeline = True +| |=/***** Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CscContainerCacheKey @0x7fe2e4141870 = 'CscCache' (default: 'StoreGateSvc+') +| | |-Decoder @0x7fe2e4fd1e60 = PrivateToolHandle('Muon::CscROD_Decoder/CscROD_Decoder') +| | |-DetStore @0x7fe2e38910d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EventInfoKey = 'StoreGateSvc+EventInfo' +| | |-EvtStore @0x7fe2e3891110 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e388d440 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e388d758 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputLevel @ 0x22561d8 = 1 (default: 0) +| | |-RdoLocation = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7fe2e38911d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e3891210 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e388d560 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e388d518 = [] (default: []) +| | | |-IsCosmics = False +| | | |-IsOldCosmics = False +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscROD_Decoder/CscRawDataProvider.CSC_RawDataProviderTool.CscROD_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CSC_RawDataProviderTool/CscRawDataProvider.CSC_RawDataProviderTool) ----- +| \----- (End of Algorithm Muon::CscRawDataProvider/CscRawDataProvider) ------------------------------ +|=/***** Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fe2e3fbcd20 = PrivateToolHandle('Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepDataTool') +| | (default: 'Muon::RpcRdoToPrepDataTool/RpcRdoToPrepDataTool') +| |-DetStore @0x7fe2e38c0b50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e38c0ad0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857680 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857ab8 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e38579e0 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+RPC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e38c0bd0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7fe2e382dd10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e382dd90 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e389b128 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e389b518 = [] (default: []) +| | |-InputCollection = 'StoreGateSvc+RPC_triggerHits' +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+RPCPAD' +| | |-OutputLevel = 0 +| | |-RPCInfoFromDb = False +| | |-RdoDecoderTool @0x7fe2e3d1e4b0 = PrivateToolHandle('Muon::RpcRDO_Decoder/Muon::RpcRDO_Decoder') +| | | (default: 'Muon::RpcRDO_Decoder') +| | |-TriggerOutputCollection = 'StoreGateSvc+RPC_Measurements' +| | |-etaphi_coincidenceTime = 20.0 +| | |-overlap_timeTolerance = 10.0 +| | |-processingData = False +| | |-produceRpcCoinDatafromTriggerWords = True +| | |-reduceCablingOverlap = True +| | |-solvePhiAmbiguities = True +| | |-timeShift = -12.5 +| | |=/***** Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7fe2e382de10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e382de50 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e389b638 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e389b5f0 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::RpcRDO_Decoder/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool.Muon::RpcRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::RpcRdoToPrepDataTool/RpcRdoToRpcPrepData.RpcRdoToRpcPrepDataTool) ----- +| \----- (End of Algorithm RpcRdoToRpcPrepData/RpcRdoToRpcPrepData) ---------------------------------- +|=/***** Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fe2e383e050 = PrivateToolHandle('Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepDataTool') +| | (default: 'Muon::TgcRdoToPrepDataTool/TgcPrepDataProviderTool') +| |-DetStore @0x7fe2e3819a50 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e38199d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857950 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857b00 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e3857b48 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+TGC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectorSvc @0x7fe2e3819ad0 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Setting = 0 +| |-Timeline = True +| |=/***** Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-DecodeData = True +| | |-DetStore @0x7fe2e382df10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e382dfd0 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e383da70 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e383da28 = [] (default: []) +| | |-FillCoinData = True +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCoinCollection = 'TrigT1CoinDataCollection' +| | |-OutputCollection = 'TGC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+TGCRDO' +| | |-TGCHashIdOffset = 26000 +| | |-dropPrdsWithZeroWidth = True +| | |-outputCoinKey @0x7fe2e383d4d0 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-prepDataKeys @0x7fe2e383db00 = ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy'] +| | | (default: ['StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy', 'StoreGateSvc+dummy']) +| | |-show_warning_level_invalid_A09_SSW6_hit = False +| | \----- (End of Private AlgTool Muon::TgcRdoToPrepDataTool/TgcRdoToTgcPrepData.TgcRdoToTgcPrepDataTool) ----- +| \----- (End of Algorithm TgcRdoToTgcPrepData/TgcRdoToTgcPrepData) ---------------------------------- +|=/***** Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DecodingTool @0x7fe2e614cb50 = PrivateToolHandle('Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepDataTool') +| | (default: 'Muon::MdtRdoToPrepDataTool/MdtPrepDataProviderTool') +| |-DetStore @0x7fe2e38aca10 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e38ac990 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857bd8 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857c68 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e3857c20 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e38aca90 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool ****** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CalibratePrepData = True +| | |-DecodeData = True +| | |-DetStore @0x7fe2e382dc10 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-DiscardSecondaryHitTwin = False +| | |-DoPropagationCorrection = False +| | |-DoTofCorrection = True +| | |-EvtStore @0x7fe2e382dd50 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3846b48 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e384a5f0 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+MDT_DriftCircles' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+MDTCSM' +| | |-ReadKey = 'ConditionStore+MuonMDT_CablingMap' +| | |-SortPrepData = False +| | |-TimeWindowLowerBound = -1000000.0 +| | |-TimeWindowSetting = 2 +| | |-TimeWindowUpperBound = -1000000.0 +| | |-TwinCorrectSlewing = False +| | |-Use1DPrepDataTwin = False +| | |-UseAllBOLTwin = False +| | |-UseTwin = True +| | \----- (End of Private AlgTool Muon::MdtRdoToPrepDataTool/MdtRdoToMdtPrepData.MdtRdoToMdtPrepDataTool) ----- +| \----- (End of Algorithm MdtRdoToMdtPrepData/MdtRdoToMdtPrepData) ---------------------------------- +|=/***** Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData ******************************************* +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-CscRdoToCscPrepDataTool @0x7fe2e3f62380 = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') +| | (default: 'Muon::CscRdoToCscPrepDataTool/CscRdoToPrepDataTool') +| |-DetStore @0x7fe2e3891610 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-DoSeededDecoding = False +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e3891f10 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857d40 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857a28 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e3857cb0 = [] (default: []) +| |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| |-OutputLevel = 0 +| |-PrintInputRdo = False +| |-PrintPrepData @0x7fe2e68cab20 = False (default: False) +| |-RegionSelectionSvc @0x7fe2e3891690 = ServiceHandle('RegSelSvc') +| |-RegisterForContextService = False +| |-RoIs = 'StoreGateSvc+OutputRoIs' +| |-Timeline = True +| |=/***** Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool ***** +| | |-AuditFinalize = False +| | |-AuditInitialize = False +| | |-AuditReinitialize = False +| | |-AuditRestart = False +| | |-AuditStart = False +| | |-AuditStop = False +| | |-AuditTools = False +| | |-CSCHashIdOffset = 22000 +| | |-CscCalibTool @0x7fe2e61439b8 = PrivateToolHandle('CscCalibTool/CscCalibTool') +| | |-CscRdoDecoderTool @0x7fe2e3838c18 = PrivateToolHandle('Muon::CscRDO_Decoder/CscRDO_Decoder') +| | |-DecodeData = True +| | |-DetStore @0x7fe2e382dc50 = ServiceHandle('StoreGateSvc/DetectorStore') +| | |-EvtStore @0x7fe2e383f090 = ServiceHandle('StoreGateSvc') +| | |-ExtraInputs @0x7fe2e3853a70 = [] (default: []) +| | |-ExtraOutputs @0x7fe2e3853878 = [] (default: []) +| | |-MonitorService = 'MonitorSvc' +| | |-OutputCollection = 'StoreGateSvc+CSC_Measurements' +| | |-OutputLevel = 0 +| | |-RDOContainer = 'StoreGateSvc+CSCRDO' +| | |=/***** Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool ******* +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-DetStore @0x7fe2e383f3d0 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e383f290 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3853c68 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3853cb0 = [] (default: []) +| | | |-IsOnline = True +| | | |-Latency = 100.0 +| | | |-MonitorService = 'MonitorSvc' +| | | |-NSamples = 4 +| | | |-Noise = 3.5 +| | | |-OutputLevel = 0 +| | | |-Pedestal = 2048.0 +| | | |-ReadFromDatabase = True +| | | |-Slope = 0.19 +| | | |-SlopeFromDatabase = False +| | | |-TimeOffsetRange = 1.0 +| | | |-Use2Samples = False +| | | |-integrationNumber = 12.0 +| | | |-integrationNumber2 = 11.66 +| | | |-samplingTime = 50.0 +| | | |-signalWidth = 14.4092 +| | | |-timeOffset = 46.825 +| | | \----- (End of Private AlgTool CscCalibTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscCalibTool) ----- +| | |=/***** Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder ***** +| | | |-AuditFinalize = False +| | | |-AuditInitialize = False +| | | |-AuditReinitialize = False +| | | |-AuditRestart = False +| | | |-AuditStart = False +| | | |-AuditStop = False +| | | |-AuditTools = False +| | | |-CscCalibTool @0x7fe2e383f4d0 = PublicToolHandle('CscCalibTool') +| | | |-DetStore @0x7fe2e383f410 = ServiceHandle('StoreGateSvc/DetectorStore') +| | | |-EvtStore @0x7fe2e383f110 = ServiceHandle('StoreGateSvc') +| | | |-ExtraInputs @0x7fe2e3853b90 = [] (default: []) +| | | |-ExtraOutputs @0x7fe2e3853b48 = [] (default: []) +| | | |-MonitorService = 'MonitorSvc' +| | | |-OutputLevel = 0 +| | | \----- (End of Private AlgTool Muon::CscRDO_Decoder/CscRdoToCscPrepData.CscRdoToCscPrepDataTool.CscRDO_Decoder) ----- +| | \----- (End of Private AlgTool Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepData.CscRdoToCscPrepDataTool) ----- +| \----- (End of Algorithm CscRdoToCscPrepData/CscRdoToCscPrepData) ---------------------------------- +|=/***** Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder ****************************** +| |-AuditAlgorithms = False +| |-AuditBeginRun = False +| |-AuditEndRun = False +| |-AuditExecute = False +| |-AuditFinalize = False +| |-AuditInitialize = False +| |-AuditReinitialize = False +| |-AuditRestart = False +| |-AuditStart = False +| |-AuditStop = False +| |-Cardinality = 1 +| |-DetStore @0x7fe2e386e850 = ServiceHandle('StoreGateSvc/DetectorStore') +| |-Enable = True +| |-ErrorCounter = 0 +| |-ErrorMax = 1 +| |-EvtStore @0x7fe2e386e7d0 = ServiceHandle('StoreGateSvc') +| |-ExtraInputs @0x7fe2e3857d88 = [] (default: []) +| |-ExtraOutputs @0x7fe2e3857dd0 = [] (default: []) +| |-FilterCircularDependencies = True +| |-IsIOBound = False +| |-MonitorService = 'MonitorSvc' +| |-NeededResources @0x7fe2e3857e18 = [] (default: []) +| |-OutputLevel = 0 +| |-RegisterForContextService = False +| |-Timeline = True +| |-cluster_builder @0x7fe2e37b61d0 = PublicToolHandle('CscThresholdClusterBuilderTool/CscThesholdClusterBuilderTool') +| | (default: 'CscThresholdClusterBuilderTool/CscThresholdClusterBuilderTool') +| \----- (End of Algorithm CscThresholdClusterBuilder/CscThesholdClusterBuilder) --------------------- +\----- (End of Algorithm AthSequencer/AthAlgSeq) --------------------------------------------------- JOs reading stage finished, launching Athena from pickle file -Thu Mar 14 11:38:54 GMT 2019 +Fri Mar 15 12:37:55 GMT 2019 Preloading tcmalloc_minimal.so -Py:Athena INFO using release [AthenaExternals-22.0.1] [x86_64-slc6-gcc8-opt] [2.0.22/2840e19] -- built on [2019-02-26T2109] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc8-opt] [iac_master_rpcrdo/63cc84e] -- built on [2019-03-15T1157] Py:Athena INFO including file "AthenaCommon/Preparation.py" Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup @@ -2522,13 +2812,13 @@ Py:Athena INFO configuring AthenaHive with [1] concurrent threads and Py:AlgScheduler INFO setting up AvalancheSchedulerSvc/AvalancheSchedulerSvc with 1 threads Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO now loading MuonRdoDecode_Cache.pkl ... -Py:ConfigurableDb INFO Read module info for 5460 configurables from 5 genConfDb files +Py:ConfigurableDb INFO Read module info for 5461 configurables from 5 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! [?1034hApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 ApplicationMgr SUCCESS ==================================================================================================================================== Welcome to ApplicationMgr (GaudiCoreSvc v31r0) - running on ppevm02.ppe.gla.ac.uk on Thu Mar 14 11:39:07 2019 + running on ppevm02.ppe.gla.ac.uk on Fri Mar 15 12:38:09 2019 ==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0 @@ -2536,7 +2826,7 @@ Py:Athena INFO including file "AthenaCommon/runbatch.py" StatusCodeSvc INFO initialize AthDictLoaderSvc INFO in initialize... AthDictLoaderSvc INFO acquired Dso-registry -ClassIDSvc INFO getRegistryEntries: read 3383 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3440 CLIDRegistry entries for module ALL CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) ByteStreamAddre... INFO Initializing ByteStreamAddressProviderSvc - package version ByteStreamCnvSvcBase-00-00-00 @@ -2556,7 +2846,7 @@ PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.x PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://frontier-atlas.lcg.triumf.ca:3128/ATLAS_frontier)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data -DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-26T2150/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-03-13T2154/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/share/dbreplica.config DBReplicaSvc INFO Total of 1 servers found for host ppevm02.ppe.gla.ac.uk [ATLF ] DBReplicaSvc INFO COOL SQLite replicas will be excluded if matching pattern /DBRelease/ PoolSvc INFO Successfully setup replica sorting algorithm @@ -2582,11 +2872,11 @@ AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version Athena ToolSvc.ByteStr... INFO Initializing ToolSvc.ByteStreamMetadataTool - package version ByteStreamCnvSvc-00-00-00 MetaDataSvc INFO Found MetaDataTools = PublicToolHandleArray(['IOVDbMetaDataTool/IOVDbMetaDataTool','ByteStreamMetadataTool/ByteStreamMetadataTool']) IOVDbSvc INFO Opening COOL connection for COOLONL_MDT/CONDBR2 -ClassIDSvc INFO getRegistryEntries: read 3291 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3314 CLIDRegistry entries for module ALL ClassIDSvc INFO getRegistryEntries: read 163 CLIDRegistry entries for module ALL -ClassIDSvc INFO getRegistryEntries: read 4012 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 4046 CLIDRegistry entries for module ALL ClassIDSvc INFO getRegistryEntries: read 129 CLIDRegistry entries for module ALL -ClassIDSvc INFO getRegistryEntries: read 3031 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 3110 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Opening COOL connection for COOLONL_RPC/CONDBR2 @@ -2839,7 +3129,7 @@ MuGM:MuonFactory INFO ***************************************************** MGM::MuonDetect... INFO Init A/B Line Containers - done - size is respectively 1758/0 MGM::MuonDetect... INFO No Aline for CSC wire layers loaded -GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 44888Kb Time = 0.96S +GeoModelSvc INFO GeoModelSvc.MuonDetectorTool SZ= 42840Kb Time = 0.92S GeoModelSvc.Muo... INFO CondAttrListCollection not found in the DetectorStore GeoModelSvc.Muo... INFO Unable to register callback on CondAttrListCollection for any folder in the list GeoModelSvc.Muo... INFO This is OK unless you expect to read alignment and deformations from COOL @@ -2897,7 +3187,7 @@ TgcRawDataProvi... INFO Tool = TgcRawDataProvider.TGC_RawDataProviderTool is MuonTGC_CablingSvc INFO for 1/12 sector initialize ToolSvc.TGCCabl... INFO initialize ClassIDSvc INFO getRegistryEntries: read 273 CLIDRegistry entries for module ALL -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x13304100]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonTGC_CablingSvc[0x15d87600]+219 bound to CondAttrListCollection[/TGC/CABLING/MAP_SCHEMA] TgcRawDataProvi... INFO initialize() successful in TgcRawDataProvider.TGC_RawDataProviderTool MdtRawDataProvider INFO MdtRawDataProvider::initialize ClassIDSvc INFO getRegistryEntries: read 922 CLIDRegistry entries for module ALL @@ -2957,20 +3247,21 @@ ClassIDSvc INFO getRegistryEntries: read 60 CLIDRegistry entries for CscRdoToCscPrep... INFO The Geometry version is MuonSpectrometer-R.08.01 MuonCalib::CscC... INFO Initializing CscCoolStrSvc ClassIDSvc INFO getRegistryEntries: read 181 CLIDRegistry entries for module ALL -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_PED] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_NOISE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_PSLOPE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_STAT] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_RMS] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_FTHOLD] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_T0BASE] -IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x19b6fa00]+259 bound to CondAttrListCollection[CSC_T0PHASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_PED] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_NOISE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_PSLOPE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_STAT] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_RMS] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_FTHOLD] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_T0BASE] +IOVSvcTool INFO Still in initialize phase, not tiggering callback for MuonCalib::CscCoolStrSvc[0x1afb5400]+259 bound to CondAttrListCollection[CSC_T0PHASE] CscRdoToCscPrep... INFO Retrieved CscRdoToCscPrepDataTool = PrivateToolHandle('Muon::CscRdoToCscPrepDataTool/CscRdoToCscPrepDataTool') HistogramPersis...WARNING Histograms saving not required. EventSelector INFO Initializing EventSelector - package version ByteStreamCnvSvc-00-00-00 EventSelector WARNING InputCollections not properly set, checking EventStorageInputSvc properties EventSelector INFO Retrieved StoreGateSvc name of '':StoreGateSvc EventSelector INFO reinitialization... +ClassIDSvc INFO getRegistryEntries: read 1126 CLIDRegistry entries for module ALL ToolSvc.Luminos... INFO LuminosityTool::initialize() registering ToolSvc.Luminos... INFO LumiFolderName is empty, skipping ToolSvc.Luminos... INFO OnlineLumiCalibrationTool.empty() is TRUE, skipping... @@ -2984,7 +3275,6 @@ EventSelector INFO reinitialization... AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully ByteStreamInputSvc INFO Picked valid file: /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1 -ClassIDSvc INFO getRegistryEntries: read 1159 CLIDRegistry entries for module ALL CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/EXT/DCS/MAGNETS/SENSORDATA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MAP_SCHEMA' CondInputLoader INFO created CondCont<CondAttrListCollection> with key 'ConditionStore+/MDT/CABLING/MEZZANINE_SCHEMA' @@ -4380,34 +4670,34 @@ AtlasFieldSvc INFO finalize() successful RegSelSvc INFO Finalizing RegSelSvc EventInfoByteSt... INFO finalize IdDictDetDescrCnv INFO in finalize -IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/25 (( 0.29 ))s -IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/271 (( 0.66 ))s -IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216598 (( 0.80 ))s -IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/300 (( 0.43 ))s +IOVDbFolder INFO Folder /EXT/DCS/MAGNETS/SENSORDATA (AttrListColl) db-read 1/2 objs/chan/bytes 4/4/20 (( 0.26 ))s +IOVDbFolder INFO Folder /GLOBAL/BField/Maps (AttrListColl) db-read 1/1 objs/chan/bytes 3/3/202 (( 0.63 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 2312/2437/216520 (( 0.82 ))s +IOVDbFolder INFO Folder /MDT/CABLING/MEZZANINE_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 24/24/288 (( 0.43 ))s IOVDbFolder INFO Folder /MDT/RTBLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s IOVDbFolder INFO Folder /MDT/T0BLOB (AttrListColl) db-read 0/0 objs/chan/bytes 0/1186/0 (( 0.00 ))s -IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/444470 (( 0.68 ))s -IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/58804 (( 0.43 ))s -IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562972 (( 1.07 ))s -IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8101322 (( 1.02 ))s -IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/7408 (( 0.56 ))s -IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/331329 (( 0.71 ))s -IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/359591 (( 2.08 ))s -IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422629 (( 0.59 ))s -IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/363009 (( 0.50 ))s -IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/422831 (( 0.54 ))s -IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/236289 (( 0.48 ))s -IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322855 (( 1.12 ))s -IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3234 (( 0.37 ))s -IOVDbSvc INFO bytes in (( 12.33 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/222235 (( 0.68 ))s +IOVDbFolder INFO Folder /RPC/CABLING/MAP_SCHEMA_CORR (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/29402 (( 0.56 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_ETA (AttrListColl) db-read 1/1 objs/chan/bytes 1613/1613/7562651 (( 1.04 ))s +IOVDbFolder INFO Folder /RPC/TRIGGER/CM_THR_PHI (AttrListColl) db-read 1/1 objs/chan/bytes 1612/1612/8096306 (( 0.96 ))s +IOVDbFolder INFO Folder /TGC/CABLING/MAP_SCHEMA (AttrListColl) db-read 1/1 objs/chan/bytes 1/1/3704 (( 0.67 ))s +IOVDbFolder INFO Folder /CSC/FTHOLD (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/322656 (( 0.71 ))s +IOVDbFolder INFO Folder /CSC/NOISE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/350062 (( 0.54 ))s +IOVDbFolder INFO Folder /CSC/PED (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411187 (( 0.58 ))s +IOVDbFolder INFO Folder /CSC/PSLOPE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/353376 (( 0.49 ))s +IOVDbFolder INFO Folder /CSC/RMS (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/411395 (( 0.61 ))s +IOVDbFolder INFO Folder /CSC/STAT (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/230496 (( 0.57 ))s +IOVDbFolder INFO Folder /CSC/T0BASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/314380 (( 0.53 ))s +IOVDbFolder INFO Folder /CSC/T0PHASE (AttrListColl) db-read 1/1 objs/chan/bytes 32/32/3136 (( 0.44 ))s +IOVDbSvc INFO bytes in (( 10.55 ))s IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=CONDBR2 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.23 ))s -IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.20 ))s +IOVDbSvc INFO Connection COOLONL_MDT/CONDBR2 : nConnect: 2 nFolders: 2 ReadTime: (( 1.25 ))s +IOVDbSvc INFO Connection COOLONL_RPC/CONDBR2 : nConnect: 2 nFolders: 4 ReadTime: (( 3.25 ))s IOVDbSvc INFO Connection COOLOFL_MDT/CONDBR2 : nConnect: 1 nFolders: 2 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 6.39 ))s -IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.66 ))s -IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.56 ))s -IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.29 ))s +IOVDbSvc INFO Connection COOLOFL_CSC/CONDBR2 : nConnect: 2 nFolders: 8 ReadTime: (( 4.48 ))s +IOVDbSvc INFO Connection COOLONL_GLOBAL/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.63 ))s +IOVDbSvc INFO Connection COOLONL_TGC/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.67 ))s +IOVDbSvc INFO Connection COOLOFL_DCS/CONDBR2 : nConnect: 2 nFolders: 1 ReadTime: (( 0.26 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ToolSvc.ByteStr... INFO in finalize() @@ -4432,7 +4722,7 @@ ToolSvc.TGCCabl... INFO finalize *****Chrono***** INFO The Final CPU consumption ( Chrono ) Table (ordered) *****Chrono***** INFO **************************************************************************************************** cObj_ALL INFO Time User : Tot= 0 [us] Ave/Min/Max= 0(+- 0)/ 0/ 0 [us] #= 18 -ChronoStatSvc INFO Time User : Tot= 10.7 [s] #= 1 +ChronoStatSvc INFO Time User : Tot= 10.5 [s] #= 1 *****Chrono***** INFO **************************************************************************************************** ChronoStatSvc.f... INFO Service finalized successfully ApplicationMgr INFO Application Manager Finalized successfully -- GitLab From dd4bb5f714807a123db74a4ba34a142561c77163 Mon Sep 17 00:00:00 2001 From: John Kenneth Anders <john.kenneth.anders@cern.ch> Date: Mon, 11 Mar 2019 10:27:22 +0000 Subject: [PATCH 045/163] Merge branch '21.0-FastCaloSimDev' into '21.0' 21.0-FastCaloSim: Removing LoadFCalGeometryFromFiles function See merge request atlas/athena!21722 (cherry picked from commit 0553871027d71c1522e6827f9bd78c8ddd224ae0) 301a82c4 Removing LoadFCalGeometryFromFiles function --- .../CaloGeometry.h | 3 +- .../src/CaloGeometry.cxx | 75 ------------------- 2 files changed, 1 insertion(+), 77 deletions(-) diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/ISF_FastCaloSimParametrization/CaloGeometry.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/ISF_FastCaloSimParametrization/CaloGeometry.h index ffad36c45c07..f7b161a9bfef 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/ISF_FastCaloSimParametrization/CaloGeometry.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/ISF_FastCaloSimParametrization/CaloGeometry.h @@ -66,10 +66,9 @@ class CaloGeometry : virtual public ICaloGeometry { TGraph* DrawGeoSampleForPhi0(int sample, int calocol, bool print=false); TCanvas* DrawGeoForPhi0(); + FCAL_ChannelMap* GetFCAL_ChannelMap(){return &m_FCal_ChannelMap;} void SetFCal_ChannelMap(const FCAL_ChannelMap* fcal_ChannnelMap){m_FCal_ChannelMap=*fcal_ChannnelMap;} - - virtual bool LoadFCalGeometryFromFiles(TString filename1,TString filename2,TString filename3); // Initialize m_FCal_ChannelMap void calculateFCalRminRmax(); virtual bool checkFCalGeometryConsistency(); virtual void PrintMapInfo(int i, int j); diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/src/CaloGeometry.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/src/CaloGeometry.cxx index 09231e67a9c6..a62e63d45b23 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/src/CaloGeometry.cxx +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/src/CaloGeometry.cxx @@ -899,81 +899,6 @@ std::string CaloGeometry::SamplingName(int sample) return CaloSampling::getSamplingName(sample); } -bool CaloGeometry::LoadFCalGeometryFromFiles(TString filename1,TString filename2,TString filename3){ - - vector<ifstream*> electrodes(3); - - electrodes[0]=new ifstream(filename1); - electrodes[1]=new ifstream(filename2); - electrodes[2]=new ifstream(filename3); - - - int thisTubeId; - int thisTubeI; - int thisTubeJ; - //int thisTubeID; - //int thisTubeMod; - double thisTubeX; - double thisTubeY; - TString tubeName; - - //int second_column; - string seventh_column; - string eight_column; - int ninth_column; - - - - - - int i; - for(int imodule=1;imodule<=3;imodule++){ - - i=0; - while(1){ - - (*electrodes[imodule-1]) >> tubeName; - if(electrodes[imodule-1]->eof())break; - (*electrodes[imodule-1]) >> thisTubeId; // ????? - (*electrodes[imodule-1]) >> thisTubeI; - (*electrodes[imodule-1]) >> thisTubeJ; - (*electrodes[imodule-1]) >> thisTubeX; - (*electrodes[imodule-1]) >> thisTubeY; - (*electrodes[imodule-1]) >> seventh_column; - (*electrodes[imodule-1]) >> eight_column; - (*electrodes[imodule-1]) >> ninth_column; - - tubeName.ReplaceAll("'",""); - string tubeNamestring=tubeName.Data(); - - std::istringstream tileStream1(std::string(tubeNamestring,1,1)); - std::istringstream tileStream2(std::string(tubeNamestring,3,2)); - std::istringstream tileStream3(std::string(tubeNamestring,6,3)); - int a1=0,a2=0,a3=0; - if (tileStream1) tileStream1 >> a1; - if (tileStream2) tileStream2 >> a2; - if (tileStream3) tileStream3 >> a3; - - stringstream s; - - - m_FCal_ChannelMap.add_tube(tubeNamestring, imodule, thisTubeId, thisTubeI,thisTubeJ, thisTubeX, thisTubeY,seventh_column); - - i++; - } - } - - - m_FCal_ChannelMap.finish(); // Creates maps - - for(int imodule=1;imodule<=3;imodule++) delete electrodes[imodule-1]; - electrodes.clear(); - - this->calculateFCalRminRmax(); - return this->checkFCalGeometryConsistency(); - -} - void CaloGeometry::calculateFCalRminRmax(){ m_FCal_rmin.resize(3,FLT_MAX); -- GitLab From 413227bb4a10c6a10e5130efd8153594d84a29eb Mon Sep 17 00:00:00 2001 From: John Kenneth Anders <john.kenneth.anders@cern.ch> Date: Mon, 11 Mar 2019 10:28:47 +0000 Subject: [PATCH 046/163] Merge branch 'QballSimFix2_ALTMCPROD-6719_21.0' into '21.0' Patch preInclude.Qball.py to work-around missing specialConfiguration metadata See merge request atlas/athena!21660 (cherry picked from commit 29c9a5d790b0ff49ab4441ec8892addb23da9ecc) ddad4098 Patch preInclude.Qball.py to work-around missing specialConfiguration metadata --- .../share/specialConfig/preInclude.Qball.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Simulation/SimulationJobOptions/share/specialConfig/preInclude.Qball.py b/Simulation/SimulationJobOptions/share/specialConfig/preInclude.Qball.py index 5b686b1ad2cf..a6123bd0a938 100644 --- a/Simulation/SimulationJobOptions/share/specialConfig/preInclude.Qball.py +++ b/Simulation/SimulationJobOptions/share/specialConfig/preInclude.Qball.py @@ -37,8 +37,6 @@ def load_files_for_qball_scenario(MASS, CHARGE): del BLINE1 del BLINE2 -assert "MASS" in simdict -assert "CHARGE" in simdict doG4SimConfig = True from AthenaCommon.AthenaCommonFlags import athenaCommonFlags import PyUtils.AthFile as af @@ -52,13 +50,16 @@ try: else: from G4AtlasApps.SimFlags import simFlags if not "InteractingPDGCodes" in simFlags.specialConfiguration.get_Value(): - CODE=10000000+int(float(simdict["CHARGE"])*100) + assert "CHARGE" in simFlags.specialConfiguration.get_Value() + CODE=10000000+int(float(simFlags.specialConfiguration.get_Value()["CHARGE"])*100) simFlags.specialConfiguration.get_Value()['InteractingPDGCodes'] = str([CODE,-1*CODE]) simdict = simFlags.specialConfiguration.get_Value() except: from G4AtlasApps.SimFlags import simFlags simdict = simFlags.specialConfiguration.get_Value() +assert "MASS" in simdict +assert "CHARGE" in simdict load_files_for_qball_scenario(simdict["MASS"], simdict["CHARGE"]) if doG4SimConfig: -- GitLab From c9784a45dd3e1cc3ba4635e36bc7c127e410d9df Mon Sep 17 00:00:00 2001 From: John Kenneth Anders <john.kenneth.anders@cern.ch> Date: Wed, 13 Mar 2019 15:42:33 +0000 Subject: [PATCH 047/163] Merge branch '21.0-fix-dcsc' into '21.0' Fix failure on invalid LumiAccounting data (affected 301915 and 301918) See merge request atlas/athena!21859 (cherry picked from commit 17869351050366564c42cf6547ba3f255b45053e) ac49dc79 Fix failure on invalid LumiAccounting data (affected 301915 and 301918) --- .../python/subdetectors/global_system.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/DataQuality/DCSCalculator2/python/subdetectors/global_system.py b/DataQuality/DCSCalculator2/python/subdetectors/global_system.py index d63ec4023b96..7d4b02bf0e41 100644 --- a/DataQuality/DCSCalculator2/python/subdetectors/global_system.py +++ b/DataQuality/DCSCalculator2/python/subdetectors/global_system.py @@ -48,10 +48,14 @@ class TDAQ_Busy(DCSC_Defect_Global_Variable): counter=0 for since, until, (state,) in events: - if state.Run == 0: continue + if state.Run == 0 or state.Run is None: continue #print state if state is not None: - deadfrac = 1-state.LiveFraction + if state.LiveFraction is None: + deadfrac=1 + print 'WARNING: LiveFraction is "None" for', state.Run, state.LumiBlock + else: + deadfrac = 1-state.LiveFraction if deadfrac < self.deadfraction_threshold: continue yield DefectIOV(RunLumi(state.Run, state.LumiBlock), @@ -65,7 +69,7 @@ class TDAQ_Busy(DCSC_Defect_Global_Variable): #print counter_max events = process_iovs(iovs) for since, until, (state,) in events: - if state is not None: + if state is not None and state.Run is not None: deadfrac = 1-state.LiveFraction if deadfrac < self.deadfraction_threshold: continue -- GitLab From 0652e31a82ffd78d4c274ca4ec9fead42ce0bd4c Mon Sep 17 00:00:00 2001 From: Nils Erik Krumnack <nils.erik.krumnack@cern.ch> Date: Mon, 11 Mar 2019 21:38:56 +0000 Subject: [PATCH 048/163] Merge branch '21.2-directIO-art-updating-daod-turls' into '21.2' DirectIOART: Renamed TURLs for xAODChecker tests in 21.2/AnalysisBase See merge request atlas/athena!21781 (cherry picked from commit f6db1174c1862c1c86d121bf8c2a875e6c3a2a15) c31cc5ce Renamed TURLs for xAODChecker tests in 21.2/AnalysisBase --- Tools/DirectIOART/generateARTtests.py | 6 +++--- .../test/test_directioart_analysisbase_xaodchecker_davs.sh | 2 +- .../test/test_directioart_analysisbase_xaodchecker_https.sh | 2 +- .../test/test_directioart_analysisbase_xaodchecker_root.sh | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tools/DirectIOART/generateARTtests.py b/Tools/DirectIOART/generateARTtests.py index d55aef995ef6..3953108018ce 100755 --- a/Tools/DirectIOART/generateARTtests.py +++ b/Tools/DirectIOART/generateARTtests.py @@ -9,9 +9,9 @@ HAMMERCLOUD_FILE = "mc15_13TeV.423202.Pythia8B_A14_CTEQ6L1_Jpsie3e13.merge.AOD.e PROJECTS = ["AthAnalysis", "AthDerivation", "AthSimulation", "Athena", "AnalysisBase"] XAODCHECKER_TURLS = { - "ROOT" : "root://lcg-lrz-rootd.grid.lrz.de:1094/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU, - "DAVS" : "davs://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU - "HTTPS" : "https://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU + "ROOT" : "root://lcg-lrz-rootd.grid.lrz.de:1094/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU, + "DAVS" : "davs://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU + "HTTPS" : "https://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1", # LRZ-LMU } RECO_TF_TURLS = { diff --git a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_davs.sh b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_davs.sh index c4306e3f5217..b5d39409bad9 100755 --- a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_davs.sh +++ b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_davs.sh @@ -6,7 +6,7 @@ set -e -xAODChecker davs://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 +xAODChecker davs://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 echo "art-result: $? DirectIOART_AnalysisBase_xAODChecker_protocol_DAVS" diff --git a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_https.sh b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_https.sh index 73877cbec82d..29c73dcceaeb 100755 --- a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_https.sh +++ b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_https.sh @@ -6,7 +6,7 @@ set -e -xAODChecker https://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 +xAODChecker https://lcg-lrz-http.grid.lrz.de:443/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 echo "art-result: $? DirectIOART_AnalysisBase_xAODChecker_protocol_HTTPS" diff --git a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_root.sh b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_root.sh index 1f34aa499793..abea51cc1486 100755 --- a/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_root.sh +++ b/Tools/DirectIOART/test/test_directioart_analysisbase_xaodchecker_root.sh @@ -6,7 +6,7 @@ set -e -xAODChecker root://lcg-lrz-rootd.grid.lrz.de:1094/pnfs/lrz-muenchen.de/data/atlas/dq2/atlasdatadisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 +xAODChecker root://lcg-lrz-rootd.grid.lrz.de:1094/pnfs/lrz-muenchen.de/data/atlas/dq2/atlaslocalgroupdisk/rucio/data18_13TeV/e6/c2/DAOD_MUON0.14316152._000001.pool.root.1 echo "art-result: $? DirectIOART_AnalysisBase_xAODChecker_protocol_ROOT" -- GitLab From 12fb1599d3e297a11a86056221964049a63614ef Mon Sep 17 00:00:00 2001 From: John Derek Chapman <chapman@hep.phy.cam.ac.uk> Date: Fri, 15 Mar 2019 11:59:28 +0000 Subject: [PATCH 049/163] Merge branch 'NSWMMFastDigi0313' into '21.3' Apply MMSimHit in MM fast digitization (ATLASSIM-3755) See merge request atlas/athena!21904 (cherry picked from commit 84f662910dd5a3939a27b16204f6de514f9e62c2) d7793694 Apply MMSimHit in MM fast digitization. b43bf604 Add MMSimHit results in the output. 3a8349ad Merge remote-tracking branch 'upstream/21.3' into NSWMMFastDigi0313 --- .../src/MM_FastDigitizer.cxx | 41 ++++--------------- .../src/MM_FastDigitizer.h | 8 +--- Simulation/Digitization/python/DigiOutput.py | 1 + 3 files changed, 11 insertions(+), 39 deletions(-) diff --git a/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.cxx b/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.cxx index fcc59733e263..811f2985b31b 100644 --- a/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.cxx +++ b/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ //Gaudi - Core @@ -15,7 +15,7 @@ #include "MM_FastDigitizer.h" #include "MuonSimEvent/MM_SimIdToOfflineId.h" -#include "MuonSimEvent/GenericMuonSimHitCollection.h" +#include "MuonSimEvent/MMSimHitCollection.h" #include "MuonSimEvent/MicromegasHitIdHelper.h" #include "MuonReadoutGeometry/MuonDetectorManager.h" @@ -44,9 +44,9 @@ using namespace Muon; /*******************************************************************************/ MM_FastDigitizer::MM_FastDigitizer(const std::string& name, ISvcLocator* pSvcLocator) : AthAlgorithm(name, pSvcLocator) , m_activeStore(NULL) , m_detManager(NULL) , m_idHelper(NULL) - , m_file(NULL) , m_ntuple(NULL) , m_slx(0.) , m_sly(0.) , m_slz(0.) , m_dlx(0.) , m_dly(0.) , m_dlz(0.) + , m_file(NULL) , m_ntuple(NULL) , m_dlx(0.) , m_dly(0.) , m_dlz(0.) , m_sulx(0.) , m_suly(0.) , m_tsulx(0.) , m_tsuly(0.) , m_tsulz(0.) , m_stsulx(0.) , m_stsuly(0.) , m_stsulz(0.) - , m_ang(0.) , m_shift(0.) , m_resx(0.) , m_resy(0.) , m_resz(0.) , m_suresx(0.) , m_suresy(0.) , m_err(0.) , m_res(0.) + , m_ang(0.) , m_shift(0.) , m_suresx(0.) , m_suresy(0.) , m_err(0.) , m_res(0.) , m_pull(0.) , m_is(0) , m_seta(0) , m_sphi(0) , m_sml(0) , m_sl(0) , m_ss(0) , m_ieta(0) , m_iphi(0) , m_iml(0) , m_il(0) , m_ich(0) , m_istr(0) , m_exitcode(0) , m_mode(0) , m_pdg(0) , m_trkid(0) , m_gpx(0.) , m_gpy(0.) , m_gpz(0.) , m_gpr(0.) , m_gpp(0.) , m_dgpx(0.) , m_dgpy(0.) , m_dgpz(0.), m_dgpr(0.) , m_dgpp(0.) , m_tofCorrection(0.) @@ -131,9 +131,6 @@ StatusCode MM_FastDigitizer::initialize() { m_file = new TFile("MM_plots.root","RECREATE"); m_ntuple = new TTree("a","a"); - m_ntuple->Branch("slx",&m_slx); - m_ntuple->Branch("sly",&m_sly); - m_ntuple->Branch("slz",&m_slz); m_ntuple->Branch("dlx",&m_dlx); m_ntuple->Branch("dly",&m_dly); m_ntuple->Branch("dlz",&m_dlz); @@ -147,11 +144,8 @@ StatusCode MM_FastDigitizer::initialize() { m_ntuple->Branch("stsulz",&m_stsulz); m_ntuple->Branch("ang",&m_ang); m_ntuple->Branch("shift",&m_shift); - m_ntuple->Branch("resx",&m_resx); - m_ntuple->Branch("resy",&m_resy); m_ntuple->Branch("suresx",&m_suresx); m_ntuple->Branch("suresy",&m_suresy); - m_ntuple->Branch("resz",&m_resz); m_ntuple->Branch("err",&m_err); m_ntuple->Branch("res",&m_res); m_ntuple->Branch("pull",&m_pull); @@ -214,7 +208,7 @@ StatusCode MM_FastDigitizer::execute() { // as the MMPrepDataContainer only allows const accesss, need a local vector as well. std::vector<MMPrepDataCollection*> localMMVec(m_idHelper->module_hash_max()); - const DataHandle< GenericMuonSimHitCollection > collGMSH; + const DataHandle< MMSimHitCollection > collGMSH; if ( evtStore()->retrieve( collGMSH,m_inputObjectName ).isFailure()) { ATH_MSG_WARNING("No MM hits found in SG"); return StatusCode::FAILURE; @@ -228,26 +222,17 @@ StatusCode MM_FastDigitizer::execute() { std::map<Identifier,int> hitsPerChannel; int nhits = 0; - GenericMuonSimHitCollection::const_iterator iterMM; - - const GenericMuonSimHit* previousHit = 0; + MMSimHitCollection::const_iterator iterMM; for (iterMM=collGMSH->begin();iterMM!=collGMSH->end();++iterMM) { - const GenericMuonSimHit& hit = *iterMM; + const MMSimHit& hit = *iterMM; // SimHits without energy loss are not recorded. // not needed because of already done in sensitive detector // https://svnweb.cern.ch/trac/atlasoff/browser/MuonSpectrometer/MuonG4/MuonG4SD/trunk/src/MicromegasSensitiveDetector.cxx?rev=542333#L65 // if(hit.depositEnergy()==0.) continue; - if( previousHit && abs(hit.particleEncoding())==13 && abs(previousHit->particleEncoding())==13 ) { - Amg::Vector3D diff = previousHit->localPosition() - hit.localPrePosition(); - ATH_MSG_VERBOSE("second hit from a muon: prev " << previousHit->localPosition() << " current " << hit.localPrePosition() - << " diff " << diff ); - if( diff.mag() < 0.1 ) continue; - } - - m_globalHitTime = hit.globalpreTime(); + m_globalHitTime = hit.globalTime(); m_tofCorrection = hit.globalPosition().mag()/CLHEP::c_light; m_bunchTime = m_globalHitTime - m_tofCorrection; const float stripPropagationTime = 0.; @@ -265,7 +250,7 @@ StatusCode MM_FastDigitizer::execute() { ATH_MSG_VERBOSE("MM hit: r " << hit.globalPosition().perp() << " z " << hit.globalPosition().z() << " mclink " << hit.particleLink() ); // convert simHit id to offline layer id; make sanity checks; retrieve the associated detector element. - int simId = hit.GenericId(); + int simId = hit.MMId(); Identifier layid = simToOffline.convert(simId); // sanity checks @@ -388,9 +373,6 @@ StatusCode MM_FastDigitizer::execute() { std::string stName = m_idHelper->stationNameString(m_idHelper->stationName(layid)); int isSmall = stName[2] == 'S'; - m_slx = hit.localPosition().x(); - m_sly = hit.localPosition().y(); - m_slz = hit.localPosition().z(); m_dlx = lpos.x(); m_dly = lpos.y(); m_sulx = posOnSurf.x(); @@ -403,9 +385,6 @@ StatusCode MM_FastDigitizer::execute() { m_stsulz = hitAfterTimeShiftOnSurface.z(); m_ang = inAngle_XZ; m_shift = shiftTimeOffset; - m_resx = hit.localPosition().x() - lpos.x(); - m_resy = hit.localPosition().y() - lpos.y(); - m_resz = hit.localPosition().z() - lpos.z(); m_suresx = posOnSurf.x()-hitOnSurface.x(); m_suresy = posOnSurf.y()-hitOnSurface.y(); m_err = -99999.; @@ -506,7 +485,6 @@ StatusCode MM_FastDigitizer::execute() { ATH_MSG_VERBOSE(" Calculated truth hitOnSurfaceGlobal: r " << hitOnSurfaceGlobal.perp() << " phi " << hitOnSurfaceGlobal.phi() << " z " << hitOnSurfaceGlobal.z()); ATH_MSG_VERBOSE(" detEl: r " << repos.perp() << " phi " << repos.phi() << " z " << repos.z()); ATH_MSG_VERBOSE(" Surface center: r " << surf.center().perp() << " phi " << surf.center().phi() << " z " << surf.center().z()); - ATH_MSG_VERBOSE("Local hit in Det Element Frame: x " << hit.localPosition().x() << " y " << hit.localPosition().y() << " z " << hit.localPosition().z()); ATH_MSG_DEBUG(" hit: " << m_idHelperTool->toString(id) << " hitx " << posOnSurf.x() << " hitOnSurface.x() " << hitOnSurface.x() << " residual " << posOnSurf.x() - hitOnSurface.x() << " pull " << (posOnSurf.x() - hitOnSurface.x())/resolution ); Amg::Vector3D CurrentHitInDriftGap = slpos; @@ -592,7 +570,6 @@ StatusCode MM_FastDigitizer::execute() { m_ntuple->Fill(); // OLD CODE ENDS HERE - previousHit = &hit; } if( msgLvl(MSG::DEBUG) ){ diff --git a/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.h b/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.h index d75c16fad84b..59801a2f9e5e 100644 --- a/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.h +++ b/MuonSpectrometer/MuonDigitization/MuonFastDigitization/src/MM_FastDigitizer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef MUONDIGITIZATION_MM_FASTDIGITIZER_H @@ -62,9 +62,6 @@ class MM_FastDigitizer : public AthAlgorithm { TFile* m_file; TTree* m_ntuple; - float m_slx; // local position simhit in G4 - float m_sly; - float m_slz; float m_dlx; // local position simhit in GeoModel frame float m_dly; float m_dlz; @@ -78,9 +75,6 @@ class MM_FastDigitizer : public AthAlgorithm { float m_stsulz; float m_ang; // local angel float m_shift; // m_shift due to bunch offset - float m_resx; // residuals in local G4 - GeoModel - float m_resy; - float m_resz; float m_suresx; // residuals g4 - RE stripPosition in tracking frame float m_suresy; float m_err; // error diff --git a/Simulation/Digitization/python/DigiOutput.py b/Simulation/Digitization/python/DigiOutput.py index 5c5f562832d4..0b4f1521e7f7 100644 --- a/Simulation/Digitization/python/DigiOutput.py +++ b/Simulation/Digitization/python/DigiOutput.py @@ -175,6 +175,7 @@ def getStreamRDO_ItemList(log): StreamRDO_ItemList+=["Muon::MM_RawDataContainer#*"] # the sensitive detector must not be removed w/o checking with the atlas-muon-nsw-sim-dev list StreamRDO_ItemList+=["GenericMuonSimHitCollection#MicromegasSensitiveDetector"] + StreamRDO_ItemList+=["MMSimHitCollection#MicromegasSensitiveDetector"] # LVL1 Emulation Output if DetFlags.simulateLVL1.LAr_on(): if DetFlags.writeRDOPool.LAr_on(): -- GitLab From 667e93c08e804b81625b70c699f8910e3d82e364 Mon Sep 17 00:00:00 2001 From: John Derek Chapman <chapman@hep.phy.cam.ac.uk> Date: Sun, 10 Mar 2019 22:10:04 +0000 Subject: [PATCH 050/163] Merge branch 'TriggerTest-CI-ref-path' into '21.3' Fix branch name determination in TriggerTest post-exec See merge request atlas/athena!21757 (cherry picked from commit b86236bb57723473dbfae41dea2e8920850a6b73) 39f7703f fix branch name determination in TriggerTest post-exec --- .../TriggerTest/test/exec_art_triggertest_post.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Trigger/TrigValidation/TriggerTest/test/exec_art_triggertest_post.sh b/Trigger/TrigValidation/TriggerTest/test/exec_art_triggertest_post.sh index 85a0d3c6bf34..5a2a2b76de5e 100755 --- a/Trigger/TrigValidation/TriggerTest/test/exec_art_triggertest_post.sh +++ b/Trigger/TrigValidation/TriggerTest/test/exec_art_triggertest_post.sh @@ -2,6 +2,15 @@ echo $(date "+%FT%H:%M %Z")" Execute TriggerTest post processing for test ${NAME}" +### Find the branch name +if [ -n "${AtlasBuildBranch}" ]; then + export BRANCH=${AtlasBuildBranch} # available after asetup +elif [ -n "${gitlabTargetBranch}" ]; then + export BRANCH=${gitlabTargetBranch} # available in CI +else + echo "WARNING Cannot determine the branch name, both variables AtlasBuildBranch and gitlabTargetBranch are empty" +fi + ### DEFAULTS if [ -z ${JOB_LOG} ]; then @@ -13,7 +22,7 @@ if [ -z ${TEST} ]; then fi if [ -z ${REF_FOLDER} ]; then - export REF_FOLDER="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/${TEST}/ref/${AtlasBuildBranch}/test_${NAME}" + export REF_FOLDER="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/${TEST}/ref/${BRANCH}/test_${NAME}" fi ### -- GitLab From 5255f7de5c1469df30af505a5ae24550c4769201 Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Fri, 15 Mar 2019 16:12:02 +0100 Subject: [PATCH 051/163] remove ringer dists in E/G dist tool and substitute all 1e3 to GeV Gaudi unit --- .../Root/TrigEgammaDistTool.cxx | 50 ------------------- .../Root/TrigEgammaEventSelection.cxx | 36 +++++++------ .../Root/TrigEgammaNavBaseTool.cxx | 4 +- .../Root/TrigEgammaNavTPBaseTool.cxx | 9 ++-- .../TrigEgammaDistTool.h | 1 - 5 files changed, 23 insertions(+), 77 deletions(-) diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx index 93b1274d32d7..93525c633b68 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx @@ -151,17 +151,6 @@ StatusCode TrigEgammaDistTool::toolExecute(const std::string basePath,TrigInfo i } - const auto vec_l2rnn = fc.get<xAOD::TrigRNNOutput>("",TrigDefs::alsoDeactivateTEs); - for(const auto feat : vec_l2rnn){ - if(feat.te()==nullptr) continue; - const auto* obj = getFeature<xAOD::TrigRNNOutput>(feat.te()); - // Only consider passing objects - if(!obj) continue; - //cd(dir+"HLT"); - //if(ancestorPassed<xAOD::TrigRNNOutput>(feat.te())) - // hist1("rejection")->Fill("L2Calo",1); - fillRnnDistribution(dir+"L2Calo",obj);// Fill HLT Rnn distribution output - } const auto vec_clus = fc.get<xAOD::CaloClusterContainer>("TrigEFCaloCalibFex",TrigDefs::alsoDeactivateTEs); for(const auto feat : vec_clus){ @@ -332,45 +321,6 @@ void TrigEgammaDistTool::fillRingerShapes(const std::string dir, const xAOD::Tri } } -void TrigEgammaDistTool::fillRnnDistribution(const std::string dir, const xAOD::TrigRNNOutput *rnn){ - // ringer threshold grid for mc15c, 2016 and 2017 - float ringer_thres_et_bins[6]={15.,20.,30.,40.,50.,50000.}; - float ringer_thres_eta_bins[6]={0.,0.8,1.37,1.54,2.37,2.5}; - - if(!rnn) ATH_MSG_DEBUG("Online pointer fails"); - else{ - if(rnn->rnnDecision().empty() || rnn->rnnDecision().size()!=3){ - ATH_MSG_DEBUG("Invalid RNN Decision. skip object..."); - return; - } - - auto emCluster=rnn->ringer()->emCluster(); - float eta=std::abs(emCluster->eta()); - float et=emCluster->et()*1e-3; - float output=rnn->rnnDecision()[2]; - float avgmu=rnn->rnnDecision()[0]; - - cd(dir); - hist1("discriminant")->Fill(output); - hist2("discriminantVsMu")->Fill(output,avgmu); - cd(dir+"/discriminant_binned"); - for (unsigned etBinIdx=0; etBinIdx<6-1; ++etBinIdx){ - for (unsigned etaBinIdx=0; etaBinIdx<6-1; ++etaBinIdx){ - if( ( et < ringer_thres_et_bins[etBinIdx] && ringer_thres_et_bins[etBinIdx+1] >= et) - && ( eta < ringer_thres_eta_bins[etaBinIdx] && ringer_thres_eta_bins[etaBinIdx+1] >= eta)){ - std::stringstream ss1,ss2; - ss1 << "discriminant_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; - ss2 << "discriminantVsMu_et_"<<etBinIdx<<"_eta_"<<etaBinIdx; - hist1(ss1.str())->Fill(output); - hist2(ss2.str())->Fill(output,avgmu); - } - } - } - ATH_MSG_DEBUG("L2 Calo distributions."); - } -} - - void TrigEgammaDistTool::fillShowerShapes(const std::string dir,const xAOD::Egamma *eg){ cd(dir); diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx index 86b0c5af4c42..d85e8c7f90c4 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx @@ -15,7 +15,7 @@ **********************************************************************/ #include "TrigEgammaAnalysisTools/TrigEgammaEventSelection.h" - +#include "GaudiKernel/SystemOfUnits.h" using namespace std; TrigEgammaEventSelection::TrigEgammaEventSelection( const std::string& myname ): @@ -238,7 +238,6 @@ bool TrigEgammaEventSelection::EventSelectionFakes(){ ATH_MSG_INFO("In EventSelectonFakes..."); - double GeV = 1000.; for(const auto& elTag : *m_offElectrons){ @@ -250,7 +249,7 @@ bool TrigEgammaEventSelection::EventSelectionFakes(){ if(!elTag->trackParticle()) continue; // Default is 4 GeV - if( !(elTag->e()/cosh(elTag->trackParticle()->eta()) > m_probeMinEt*GeV) ) continue; + if( !(elTag->e()/cosh(elTag->trackParticle()->eta()) > m_probeMinEt*Gaudi::Units::GeV) ) continue; //fiducial detector acceptance region float absEta = fabs(elTag->caloCluster()->etaBE(2)); @@ -270,7 +269,7 @@ bool TrigEgammaEventSelection::EventSelectionFakes(){ if(!elProbe->trackParticle()) continue; // Must be higher than 4 GeV - if( (getEt(elProbe)) < 4*GeV) continue; + if( (getEt(elProbe)) < 4*Gaudi::Units::GeV) continue; if(!TrigEgammaNavTPBaseTool::ApplyElectronPid(elProbe,"LHMedium")) continue; @@ -504,38 +503,37 @@ bool TrigEgammaEventSelection::fillTrigCaloRings( const HLT::TriggerElement *fea bool TrigEgammaEventSelection::ApplyFireTriggers( const xAOD::Electron *el){ - float GeV = 1000.0; float et = getEt(el); std::string trigger=""; - if(et < 5*GeV){ + if(et < 5*Gaudi::Units::GeV){ return false; - }else if(et >= 5*GeV && et < 10*GeV){ + }else if(et >= 5*Gaudi::Units::GeV && et < 10*Gaudi::Units::GeV){ trigger = "HLT_e5_etcut"; - }else if(et >= 10*GeV && et < 15*GeV){ + }else if(et >= 10*Gaudi::Units::GeV && et < 15*Gaudi::Units::GeV){ trigger = "HLT_e10_etcut_L1EM7"; - }else if(et >= 15*GeV && et < 20*GeV){ + }else if(et >= 15*Gaudi::Units::GeV && et < 20*Gaudi::Units::GeV){ trigger = "HLT_e15_etcut_L1EM7"; - }else if(et >= 20*GeV && et < 25*GeV){ + }else if(et >= 20*Gaudi::Units::GeV && et < 25*Gaudi::Units::GeV){ trigger = "HLT_e20_etcut_L1EM12"; - }else if(et >= 25*GeV && et < 30*GeV){ + }else if(et >= 25*Gaudi::Units::GeV && et < 30*Gaudi::Units::GeV){ trigger = "HLT_e25_etcut_L1EM15"; - }else if(et >= 30*GeV && et < 40*GeV){ + }else if(et >= 30*Gaudi::Units::GeV && et < 40*Gaudi::Units::GeV){ trigger = "HLT_e30_etcut_L1EM15"; - }else if(et >= 40*GeV && et < 50*GeV){ + }else if(et >= 40*Gaudi::Units::GeV && et < 50*Gaudi::Units::GeV){ trigger = "HLT_e40_etcut_L1EM15"; - }else if(et >= 50*GeV && et < 60*GeV){ + }else if(et >= 50*Gaudi::Units::GeV && et < 60*Gaudi::Units::GeV){ trigger = "HLT_e50_etcut_L1EM15"; - }else if(et >= 50*GeV && et < 60*GeV){ + }else if(et >= 50*Gaudi::Units::GeV && et < 60*Gaudi::Units::GeV){ trigger = "HLT_e60_etcut"; - }else if(et >= 60*GeV && et < 70*GeV){ + }else if(et >= 60*Gaudi::Units::GeV && et < 70*Gaudi::Units::GeV){ trigger = "HLT_e70_etcut"; - }else if(et >= 70*GeV && et < 80*GeV){ + }else if(et >= 70*Gaudi::Units::GeV && et < 80*Gaudi::Units::GeV){ trigger = "HLT_e80_etcut"; - }else if(et >= 80*GeV && et < 100*GeV){ + }else if(et >= 80*Gaudi::Units::GeV && et < 100*Gaudi::Units::GeV){ trigger = "HLT_e100_etcut"; - }else if(et >= 100*GeV && et < 120*GeV){ + }else if(et >= 100*Gaudi::Units::GeV && et < 120*Gaudi::Units::GeV){ trigger = "HLT_e120_etcut"; }else{ return true; diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx index 73cf6e0b6b5b..4f313a969095 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx @@ -16,7 +16,7 @@ #include "TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h" #include "TrigConfxAOD/xAODConfigTool.h" #include "PATCore/AcceptData.h" - +#include "GaudiKernel/SystemOfUnits.h" #include "string" #include <algorithm> #include "boost/algorithm/string.hpp" @@ -274,7 +274,7 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem, ATH_MSG_DEBUG("No caloCluster"); continue; } - if( !(getCluster_et(eg) > (etthr-5.)*1.e3)) continue; //Take 2GeV above threshold + if( !(getCluster_et(eg) > (etthr-5.)*Gaudi::Units::GeV)) continue; //Take 2GeV above threshold if(!eg->passSelection(m_photonPid)) continue; if(m_doUnconverted){ if (eg->vertex()){ diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx index fa0d71d180d9..90610ba04a1e 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx @@ -22,6 +22,7 @@ #include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h" #include "TrigConfxAOD/xAODConfigTool.h" #include "xAODEventInfo/EventInfo.h" +#include "GaudiKernel/SystemOfUnits.h" #include "PATCore/AcceptData.h" #include "string" #include <algorithm> @@ -328,7 +329,6 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){ // Require offline tight electron // Match to e24_tight1_L1EM20V ATH_MSG_DEBUG("Selecting Tag Electron"); - double GeV = 1000.; //Check constituents const xAOD::TrackParticle *trk = el->trackParticle(); @@ -351,7 +351,7 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){ hist1(m_anatype+"_TagCutCounter")->Fill("GoodPid",1); ATH_MSG_DEBUG("Selecting Tag Electron Et"); //Require Et > 25 GeV - if( !(el->e()/cosh(el->trackParticle()->eta()) > m_tagMinEt*GeV) ){ + if( !(el->e()/cosh(el->trackParticle()->eta()) > m_tagMinEt*Gaudi::Units::GeV) ){ return false; } hist1(m_anatype+"_TagCutCounter")->Fill("Et",1); @@ -464,7 +464,6 @@ bool TrigEgammaNavTPBaseTool::ApplyElectronPid(const xAOD::Electron *eg, const s bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){ - double GeV = 1000.; //Check constituents if(!el->trackParticle()){ ATH_MSG_DEBUG("No track Particle"); @@ -484,7 +483,7 @@ bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){ } } hist1(m_anatype+"_ProbeCutCounter")->Fill("Eta",1); - /*if( !(el->e()/cosh(el->trackParticle()->eta()) > (etthr-5.0)*GeV) ){ + /*if( !(el->e()/cosh(el->trackParticle()->eta()) > (etthr-5.0)*Gaudi::Units::GeV) ){ return false; } hist1("ProbeCutCounter")->Fill("Et",1);*/ @@ -501,7 +500,7 @@ bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){ for(const auto &i_jet : *m_jets){ TLorentzVector jet; jet.SetPtEtaPhiE(i_jet->pt(), i_jet->eta(), i_jet->phi(), i_jet->e()); - if( (jet.Et() > 20*GeV) && (jet.DeltaR(probeCandidate) < 0.4)) jetsAroundProbeElectron++; + if( (jet.Et() > 20*Gaudi::Units::GeV) && (jet.DeltaR(probeCandidate) < 0.4)) jetsAroundProbeElectron++; } //reject if more than 1 jet close to the probe electron if ( jetsAroundProbeElectron >= 2 ) { diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h index 71379e7fec15..15f403b7845b 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h @@ -33,7 +33,6 @@ private: void fillL2Electron(const std::string,const xAOD::TrigElectron *); void fillL2Calo(const std::string,const xAOD::TrigEMCluster *); void fillRingerShapes(const std::string,const xAOD::TrigRingerRings *); - void fillRnnDistribution(const std::string,const xAOD::TrigRNNOutput *); void fillL1Calo(const std::string,const xAOD::EmTauRoI *); /*! Include more detailed histograms */ bool m_detailedHists; -- GitLab From c6f77268bdb3a794800dedde0dd8a0abc84e127e Mon Sep 17 00:00:00 2001 From: joaoVictorPinto <jodafons@cern.ch> Date: Fri, 15 Mar 2019 16:15:06 +0100 Subject: [PATCH 052/163] remove ringer dists in E/G dist tool and substitute all 1e3 to GeV Gaudi unit --- .../TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx index d85e8c7f90c4..bf313f2bde98 100644 --- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx +++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx @@ -279,7 +279,7 @@ bool TrigEgammaEventSelection::EventSelectionFakes(){ el1.SetPtEtaPhiE(elTag->pt(), elTag->trackParticle()->eta(), elTag->trackParticle()->phi(), elTag->e()); el2.SetPtEtaPhiE(elProbe->pt(), elProbe->trackParticle()->eta(), elProbe->trackParticle()->phi(), elProbe->e()); float tpPairMass = (el1 + el2).M(); - if( !((tpPairMass > m_ZeeMassMin*1.e3) && (tpPairMass < m_ZeeMassMax*1.e3))){ + if( !((tpPairMass > m_ZeeMassMin*Gaudi::Units::GeV) && (tpPairMass < m_ZeeMassMax*Gaudi::Units::GeV))){ ATH_MSG_DEBUG("tag and probe pair not in Z mass window"); continue; }else{ -- GitLab From b7ffcebfe55984fed164abb646fd260bc0acc580 Mon Sep 17 00:00:00 2001 From: Vakho Tsulaia <vakhtang.tsulaia@cern.ch> Date: Fri, 15 Mar 2019 22:52:23 +0100 Subject: [PATCH 053/163] Migrated 5 tools from the TrkValTools package to xAOD::EventInfo --- .../BasicValTrkParticleNtupleTool.h | 6 ++- .../TrkValTools/JetTruthNtupleTool.h | 6 ++- .../TrkValTools/TrkValTools/TrackDiff.h | 9 ++-- .../TrkValTools/TrkValTools/TruthNtupleTool.h | 6 ++- .../src/BasicValTrkParticleNtupleTool.cxx | 46 +++++++++---------- .../src/EventToTrackLinkNtupleTool.cxx | 9 +--- .../TrkValTools/src/JetTruthNtupleTool.cxx | 25 ++++------ .../TrkValTools/src/TrackDiff.cxx | 18 +++----- .../src/TrackInformationNtupleTool.cxx | 46 +++++++++---------- .../src/TrackInformationNtupleTool.h | 5 +- .../TrkValTools/src/TruthNtupleTool.cxx | 19 ++++---- 11 files changed, 91 insertions(+), 104 deletions(-) diff --git a/Tracking/TrkValidation/TrkValTools/TrkValTools/BasicValTrkParticleNtupleTool.h b/Tracking/TrkValidation/TrkValTools/TrkValTools/BasicValTrkParticleNtupleTool.h index aa3497d30e6f..c8bf1012c257 100644 --- a/Tracking/TrkValidation/TrkValTools/TrkValTools/BasicValTrkParticleNtupleTool.h +++ b/Tracking/TrkValidation/TrkValTools/TrkValTools/BasicValTrkParticleNtupleTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef Trk_BasicValTrkParticleNtupleTool_h @@ -9,6 +9,8 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "GaudiKernel/ToolHandle.h" #include "TrkValInterfaces/IValidationNtupleTool.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" #include <vector> class TTree; @@ -163,6 +165,8 @@ private: mutable unsigned long m_idHitPattern; //!< bit word carrying information about hit layers static const float s_errorEntry; //!< error entry costant + + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; diff --git a/Tracking/TrkValidation/TrkValTools/TrkValTools/JetTruthNtupleTool.h b/Tracking/TrkValidation/TrkValTools/TrkValTools/JetTruthNtupleTool.h index 50c3ea365e25..fd7e6682fd74 100644 --- a/Tracking/TrkValidation/TrkValTools/TrkValTools/JetTruthNtupleTool.h +++ b/Tracking/TrkValidation/TrkValTools/TrkValTools/JetTruthNtupleTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -16,6 +16,8 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "GaudiKernel/ToolHandle.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" #include "TrkValInterfaces/IJetTruthNtupleTool.h" #include <vector> @@ -72,6 +74,8 @@ private: mutable float m_mc_jetThrust; mutable float m_mc_jetEnergy; mutable float m_mc_jetMomentum; + + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; diff --git a/Tracking/TrkValidation/TrkValTools/TrkValTools/TrackDiff.h b/Tracking/TrkValidation/TrkValTools/TrkValTools/TrackDiff.h index 019f3121bed7..1804399f4dff 100755 --- a/Tracking/TrkValidation/TrkValTools/TrkValTools/TrackDiff.h +++ b/Tracking/TrkValidation/TrkValTools/TrkValTools/TrackDiff.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -19,9 +19,10 @@ #include "TrkValInterfaces/ITrackDiff.h" #include "TrkEventPrimitives/TrackStateDefs.h" #include "TrkValEvent/TrackStateData.h" -//#include <vector> #include "AthContainers/DataVector.h" -//class INTupleSvc; +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" + class AtlasDetectorID; class TTree; @@ -153,6 +154,8 @@ private: mutable int m_PRD_MismatchesSum[Trk::TrackState::NumberOfMeasurementTypes]; mutable int m_trackSum; + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; + /** extract data from a Trk::Track into a list of Trk::TrackStateData */ DataVector< const Trk::TrackStateData >* extractDataFromTrack( const Trk::Track& ) const; diff --git a/Tracking/TrkValidation/TrkValTools/TrkValTools/TruthNtupleTool.h b/Tracking/TrkValidation/TrkValTools/TrkValTools/TruthNtupleTool.h index 37f940a5e732..56e817ab6255 100644 --- a/Tracking/TrkValidation/TrkValTools/TrkValTools/TruthNtupleTool.h +++ b/Tracking/TrkValidation/TrkValTools/TrkValTools/TruthNtupleTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -17,6 +17,8 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "GaudiKernel/ToolHandle.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" #include "TrkValInterfaces/ITruthNtupleTool.h" #include "TrkValInterfaces/ITrackTruthClassifier.h" @@ -99,6 +101,8 @@ private: mutable std::vector< std::vector<TH1D*> > m_truthTrackCounts; mutable std::vector<const Trk::ITrackTruthClassifier*> m_trackTruthClassifiers; //!< the truth classifiers + + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; diff --git a/Tracking/TrkValidation/TrkValTools/src/BasicValTrkParticleNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/BasicValTrkParticleNtupleTool.cxx index c953054a7040..d784fc15a180 100644 --- a/Tracking/TrkValidation/TrkValTools/src/BasicValTrkParticleNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/BasicValTrkParticleNtupleTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -13,16 +13,11 @@ #include "TTree.h" -//Gaudi #include "GaudiKernel/ITHistSvc.h" #include "EventPrimitives/EventPrimitivesHelpers.h" #include "TrkParticleBase/TrackParticleBase.h" -// #include "TrkParameters/Perigee.h" #include "TrkTrackSummary/TrackSummary.h" - -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" #include "TrkValTools/BasicValTrkParticleNtupleTool.h" #include <bitset> @@ -85,6 +80,8 @@ Trk::BasicValTrkParticleNtupleTool::~BasicValTrkParticleNtupleTool() {} // initialize StatusCode Trk::BasicValTrkParticleNtupleTool::initialize() { + ATH_CHECK( m_evt.initialize() ); + // create ntuple tree if (m_bookNewNtuple) { // --------------------------- @@ -92,7 +89,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::initialize() { ITHistSvc *tHistSvc; StatusCode sc = service("THistSvc", tHistSvc); if (sc.isFailure()) { - msg(MSG::ERROR) << "Unable to retrieve pointer to THistSvc" << endmsg; + ATH_MSG_ERROR("Unable to retrieve pointer to THistSvc"); return sc; } @@ -105,7 +102,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::initialize() { std::string fullNtupleName = "/"+m_ntupleFileName+"/"+m_ntupleDirName+"/"+m_ntupleTreeName; sc = tHistSvc->regTree(fullNtupleName, m_nt); if (sc.isFailure()) { - msg(MSG::ERROR) << "Unable to register TTree : " << fullNtupleName << endmsg; + ATH_MSG_ERROR("Unable to register TTree : " << fullNtupleName); return sc; } // add the ntuple branches (this function has to be called by the client of this tool, if m_bookNewNtuple is set to false...) @@ -121,7 +118,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::initialize() { /////////////////////////////////////// StatusCode Trk::BasicValTrkParticleNtupleTool::finalize() { - msg(MSG::DEBUG) << "start finalize() in " << name() << endmsg; + ATH_MSG_DEBUG("start finalize() in " << name()); if (m_nt) { delete m_nt; m_nt = 0; @@ -181,7 +178,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::addNtupleItems( TTree* tree ) con StatusCode Trk::BasicValTrkParticleNtupleTool::writeTrackParticleData ( const Trk::TrackParticleBase& track) const { if (!m_nt) { - msg(MSG::ERROR) << "writeTrackParticleData(...) can only be used, if property BookNewNtuple is set to true" << endmsg; + ATH_MSG_ERROR("writeTrackParticleData(...) can only be used, if property BookNewNtuple is set to true" ); return StatusCode::FAILURE; } StatusCode sc; @@ -202,37 +199,36 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::fillTrackParticleData ( // --------------------------------------- // detect new event, reset TrackParticle counter if new event - const EventInfo* eventInfo; - if ((evtStore()->retrieve(eventInfo)).isFailure()) { - msg(MSG::WARNING) << "Could not retrieve event info" << endmsg; + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { + ATH_MSG_WARNING("Could not retrieve event info"); m_runNumber = (int)s_errorEntry; m_eventNumber = (int)s_errorEntry; return StatusCode::FAILURE; } - const EventID* myEventID=eventInfo->event_ID(); - if (m_lastEventNumber!=myEventID->event_number()) { + if (m_lastEventNumber!=evt->eventNumber()) { // we have a new event, reset TrackParticleID: m_TrackIDcounter = 0; - m_lastEventNumber = myEventID->event_number(); + m_lastEventNumber = evt->eventNumber(); } m_TrackIDcounter++; m_TrackID = (unsigned char)m_TrackIDcounter; - m_eventNumber = myEventID->event_number(); - m_runNumber = myEventID->run_number(); + m_eventNumber = evt->eventNumber(); + m_runNumber = evt->runNumber(); ATH_MSG_VERBOSE ("Event: " << m_eventNumber << ", Run: "<< m_runNumber << " TrackID: " << m_TrackID); //---------------------------------------------- // fill track parameters in ntuple const Trk::Perigee* perpars = track.perigee(); - if (perpars != NULL && fillTrkParticlePerigee(perpars).isFailure()) msg(MSG::WARNING) << "Perigee parameters could not be written to ntuple" << endmsg; + if (perpars != NULL && fillTrkParticlePerigee(perpars).isFailure()) ATH_MSG_WARNING("Perigee parameters could not be written to ntuple"); const Trk::TrackSummary* summary = track.trackSummary(); - if((!summary) || fillTrkParticleSummary(summary).isFailure()) msg(MSG::WARNING) << "Summary parameters could not be written to ntuple" << endmsg; + if((!summary) || fillTrkParticleSummary(summary).isFailure()) ATH_MSG_WARNING("Summary parameters could not be written to ntuple"); const Trk::FitQuality* fitQuality = track.fitQuality(); - if((!fitQuality) || fillFitQualityData(fitQuality).isFailure() ) msg(MSG::WARNING) << "Fit Quality data could not be written to ntuple" << endmsg; + if((!fitQuality) || fillFitQualityData(fitQuality).isFailure() ) ATH_MSG_WARNING("Fit Quality data could not be written to ntuple"); return StatusCode::SUCCESS; } @@ -246,7 +242,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::fillTrkParticlePerigee(const Trk: ATH_MSG_VERBOSE ("in fillTrackPerigee"); if (!perigee) { - msg(MSG::WARNING) << "Something is wrong - track has no perigee at all!" << endmsg; + ATH_MSG_WARNING("Something is wrong - track has no perigee at all!"); m_Rec_d0 = 0; m_Rec_z0 = 0; m_Rec_phi0 = 0; @@ -287,7 +283,7 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::fillTrkParticleSummary(const Trk: ATH_MSG_VERBOSE ("in fillTrackSummary"); if (!summary) { - msg(MSG::WARNING) << "Something is wrong - track has no summary at all!" << endmsg; + ATH_MSG_WARNING("Something is wrong - track has no summary at all!"); m_numberOfPixelHits = 0; m_numberOfSCTHits = 0; @@ -321,14 +317,14 @@ StatusCode Trk::BasicValTrkParticleNtupleTool::fillTrkParticleSummary(const Trk: StatusCode Trk::BasicValTrkParticleNtupleTool::fillFitQualityData(const Trk::FitQuality* fitQuality) const { if (!fitQuality) { - msg(MSG::WARNING) << "Something is wrong - track has no fit quality data !!" << endmsg; + ATH_MSG_WARNING("Something is wrong - track has no fit quality data !!"); m_chi2 = 0; return StatusCode::FAILURE; } if(fitQuality->numberDoF() == 0) { - msg(MSG::WARNING) << "Number of DOF is zero !! Could not normalize chi2 " << endmsg; + ATH_MSG_WARNING("Number of DOF is zero !! Could not normalize chi2 "); return StatusCode::FAILURE; } diff --git a/Tracking/TrkValidation/TrkValTools/src/EventToTrackLinkNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/EventToTrackLinkNtupleTool.cxx index e895b76abc25..7ececf2ac1fe 100644 --- a/Tracking/TrkValidation/TrkValTools/src/EventToTrackLinkNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/EventToTrackLinkNtupleTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -12,16 +12,9 @@ /////////////////////////////////////////////////////////////////// #include "TTree.h" -//Gaudi -// #include "GaudiKernel/SmartDataPtr.h" #include "GaudiKernel/ITHistSvc.h" -// #include "GaudiKernel/ISvcLocator.h" -// #include "GaudiKernel/PropertyMgr.h" #include "TrkValTools/EventToTrackLinkNtupleTool.h" #include "CommissionEvent/ComTime.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" -#include "EventInfo/TriggerInfo.h" const std::string Trk::EventToTrackLinkNtupleTool::s_trackTypeName = "Trk::Track"; const std::string Trk::EventToTrackLinkNtupleTool::s_trkParticleTypeName = "Rec::TrackParticle"; diff --git a/Tracking/TrkValidation/TrkValTools/src/JetTruthNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/JetTruthNtupleTool.cxx index a98b8e7b2699..51a1d14ff97f 100644 --- a/Tracking/TrkValidation/TrkValTools/src/JetTruthNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/JetTruthNtupleTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -9,11 +9,8 @@ // (c) ATLAS Detector software /////////////////////////////////////////////////////////////////// -//Gaudi -// #include "GaudiKernel/SmartDataPtr.h" #include "GaudiKernel/ITHistSvc.h" #include "GaudiKernel/ISvcLocator.h" -// #include "GaudiKernel/PropertyMgr.h" // Trk #include "TrkValTools/JetTruthNtupleTool.h" @@ -22,9 +19,6 @@ // Truth #include "TrkTruthData/TrackTruth.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" - #include "HepMC/GenParticle.h" #include <TGraphAsymmErrors.h> @@ -62,6 +56,8 @@ Trk::JetTruthNtupleTool::~JetTruthNtupleTool() {} // initialize StatusCode Trk::JetTruthNtupleTool::initialize() { + ATH_CHECK( m_evt.initialize() ); + // --------------------------- // retrieve pointer to THistSvc ITHistSvc *tHistSvc; @@ -125,22 +121,17 @@ StatusCode Trk::JetTruthNtupleTool::writeJetTruthData ( const int& nTruthRecordsAtCurrentEvent // const std::vector<unsigned int>& /*particleToJetIndex*/ ) const { - - StatusCode sc; - ATH_MSG_VERBOSE ( "in writeJetTruthData(...)" ); // --------------------------------------- // fill event data - const EventInfo* eventInfo = nullptr; - sc = evtStore()->retrieve(eventInfo); - if (sc.isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { ATH_MSG_WARNING ( "Could not retrieve event info" ); + return StatusCode::FAILURE; } - const EventID* myEventID=eventInfo->event_ID(); - - m_runNumber=myEventID->run_number(); - m_eventNumber=myEventID->event_number(); + m_runNumber=evt->runNumber(); + m_eventNumber=evt->eventNumber(); for (std::vector<Trk::GenParticleJet>::const_iterator itJet = jets.begin(); itJet < jets.end(); ++itJet ) { diff --git a/Tracking/TrkValidation/TrkValTools/src/TrackDiff.cxx b/Tracking/TrkValidation/TrkValTools/src/TrackDiff.cxx index 79ca8c0ae8ee..beb3919dd431 100755 --- a/Tracking/TrkValidation/TrkValTools/src/TrackDiff.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/TrackDiff.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -29,8 +29,6 @@ #include "TrkTrack/Track.h" #include "AtlasDetDescr/AtlasDetectorID.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" // constructor Trk::TrackDiff::TrackDiff( @@ -106,6 +104,8 @@ Trk::TrackDiff::~TrackDiff() {} // initialize StatusCode Trk::TrackDiff::initialize() { + ATH_CHECK( m_evt.initialize() ); + StatusCode sc; if (m_writeNtuple) { // --------------------------- @@ -232,22 +232,18 @@ StatusCode Trk::TrackDiff::diff ( const Trk::Track& referenceTrack, const Trk::Track& comparedTrack ) const { - StatusCode sc; - ATH_MSG_VERBOSE ( "in diff(trk, trk)" ); resetVariables(); // --------------------------------------- // fill event data - const EventInfo* eventInfo; - sc = evtStore()->retrieve(eventInfo); - if (sc.isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { ATH_MSG_ERROR ("Could not retrieve event info"); + return StatusCode::FAILURE; } - const EventID* myEventID=eventInfo->event_ID(); - - m_eventNumber = myEventID->event_number(); + m_eventNumber = evt->eventNumber(); if (referenceTrack.perigeeParameters()) { m_trackPhi = referenceTrack.perigeeParameters()->parameters()[Trk::phi0]; m_trackEta = referenceTrack.perigeeParameters()->eta(); diff --git a/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.cxx index 099f8f8450a8..aa3fc54c0576 100644 --- a/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -21,8 +21,6 @@ #include "TrkTrack/TrackInfo.h" #include "TrkTrackSummary/TrackSummary.h" #include "TrkFitterUtils/ProtoTrackStateOnSurface.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" // constructor Trk::TrackInformationNtupleTool::TrackInformationNtupleTool( @@ -57,7 +55,7 @@ Trk::TrackInformationNtupleTool::~TrackInformationNtupleTool() {} /////////////////////////////////////// StatusCode Trk::TrackInformationNtupleTool::initialize() { - ATH_MSG_DEBUG ("nothing specific initialized in " << name()); + ATH_CHECK( m_evt.initialize() ); return StatusCode::SUCCESS; } @@ -103,25 +101,24 @@ StatusCode Trk::TrackInformationNtupleTool::fillTrackData ( ATH_MSG_VERBOSE ("in fillTrackData(trk, indx)"); // --------------------------------------- // detect new event, reset Track counter if new event - const EventInfo* eventInfo; - if ((evtStore()->retrieve(eventInfo)).isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if(!evt.isValid()) { msg(MSG::WARNING) << "Could not retrieve event info" << endmsg; m_runNumber = (int)s_errorEntry; m_eventNumber = (int)s_errorEntry; } else { - const EventID* myEventID=eventInfo->event_ID(); - if (m_lastEventNumber!=myEventID->event_number()) { + if (m_lastEventNumber!=evt->eventNumber()) { // we have a new event, reset TrackID: m_TrackIDcounter = 0; - m_lastEventNumber = myEventID->event_number(); + m_lastEventNumber = evt->eventNumber(); } // --------------------------------------------- // track id (increase if a new iteration was started = iterationIndex==0) if (iterationIndex == 0) m_TrackIDcounter++; m_TrackID = m_TrackIDcounter; m_iterIndex = iterationIndex; - m_eventNumber = myEventID->event_number(); - m_runNumber = myEventID->run_number(); + m_eventNumber = evt->eventNumber(); + m_runNumber = evt->runNumber(); } ATH_MSG_VERBOSE ("Event: " << m_eventNumber << ", Run: " << m_runNumber << " TrackID: " << m_TrackID @@ -178,22 +175,21 @@ StatusCode Trk::TrackInformationNtupleTool::fillTrackParticleData ATH_MSG_VERBOSE ("in fillTrackData(trk, indx)"); // --------------------------------------- // detect new event, reset Track counter if new event - const EventInfo* eventInfo; - if ((evtStore()->retrieve(eventInfo)).isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if(!evt.isValid()) { msg(MSG::WARNING) << "Could not retrieve event info" << endmsg; m_runNumber = (int)s_errorEntry; m_eventNumber = (int)s_errorEntry; } else { - const EventID* myEventID=eventInfo->event_ID(); - if (m_lastEventNumber!=myEventID->event_number()) { + if (m_lastEventNumber!=evt->eventNumber()) { // we have a new event, reset TrackID: m_TrackIDcounter = 0; - m_lastEventNumber = myEventID->event_number(); + m_lastEventNumber = evt->eventNumber(); } // --------------------------------------------- m_TrackID = m_TrackIDcounter++; - m_eventNumber = myEventID->event_number(); - m_runNumber = myEventID->run_number(); + m_eventNumber = evt->eventNumber(); + m_runNumber = evt->runNumber(); } ATH_MSG_VERBOSE ("Event: " << m_eventNumber << ", Run: " << m_runNumber << " TrackID: " << m_TrackID); @@ -238,17 +234,17 @@ StatusCode Trk::TrackInformationNtupleTool::fillProtoTrajectoryData //const Trk::FitterStatusCode fitStatCode) const { ATH_MSG_VERBOSE ("in fillProtoTrajectoryData(protoTraj, indx)"); - const EventInfo* eventInfo; - if ((evtStore()->retrieve(eventInfo)).isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if(!evt.isValid()) { msg(MSG::ERROR) << "Could not retrieve event info" << endmsg; + return StatusCode::FAILURE; } - const EventID* myEventID=eventInfo->event_ID(); - if (m_lastEventNumber!=myEventID->event_number()) { + if (m_lastEventNumber!=evt->eventNumber()) { // we have a new event! // reset TrackID: m_TrackIDcounter = 0; - m_lastEventNumber = myEventID->event_number(); + m_lastEventNumber = evt->eventNumber(); } // --------------------------------------------- // track id (increase if a new iteration was started = iterationIndex==0) @@ -257,8 +253,8 @@ StatusCode Trk::TrackInformationNtupleTool::fillProtoTrajectoryData } m_TrackID = m_TrackIDcounter; m_iterIndex = iterationIndex; - m_eventNumber = myEventID->event_number(); - m_runNumber = myEventID->run_number(); + m_eventNumber = evt->eventNumber(); + m_runNumber = evt->runNumber(); ATH_MSG_VERBOSE ("Event: " << m_eventNumber << MSG::VERBOSE << " TrackID: " << m_TrackID << " iteration index: " << m_iterIndex); m_fitStatusCode = fitStatCode; diff --git a/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.h b/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.h index 8e02cd80e8d3..ef193bad9fd3 100644 --- a/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.h +++ b/Tracking/TrkValidation/TrkValTools/src/TrackInformationNtupleTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -15,6 +15,8 @@ #include "AthenaBaseComps/AthAlgTool.h" #include "TrkValInterfaces/ITrackValidationNtupleTool.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" namespace Trk { @@ -95,6 +97,7 @@ private: mutable int m_ndof; //!< number of degrees of freedom of track fit mutable int m_nHits; //!< number of measurements on the track (including outliers) + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; diff --git a/Tracking/TrkValidation/TrkValTools/src/TruthNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/TruthNtupleTool.cxx index 79970a52b49d..a0e5117a52c1 100644 --- a/Tracking/TrkValidation/TrkValTools/src/TruthNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/TruthNtupleTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -21,8 +21,6 @@ // Truth #include "TrkTruthData/TrackTruth.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" #include "HepMC/GenParticle.h" #include "HepMC/GenVertex.h" @@ -81,6 +79,8 @@ Trk::TruthNtupleTool::~TruthNtupleTool() {} // initialize StatusCode Trk::TruthNtupleTool::initialize() { + ATH_CHECK( m_evt.initialize() ); + if (m_etaBins.size()<2) { ATH_MSG_ERROR ("Vector of eta bins too small"); return StatusCode::FAILURE; @@ -254,20 +254,17 @@ StatusCode Trk::TruthNtupleTool::finalize() { StatusCode Trk::TruthNtupleTool::writeTruthData ( const std::vector< Trk::ValidationTrackTruthData >& truthData) const { - StatusCode sc; - ATH_MSG_DEBUG ("in writeTruthData(...) with ValTrackTruthData size = "<<truthData.size()); // --------------------------------------- // fill event data - const EventInfo* eventInfo = nullptr; - sc = evtStore()->retrieve(eventInfo); - if (sc.isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { ATH_MSG_WARNING ("Could not retrieve event info"); + return StatusCode::FAILURE; } - const EventID* myEventID=eventInfo->event_ID(); - m_runNumber=myEventID->run_number(); - m_eventNumber=myEventID->event_number(); + m_runNumber=evt->runNumber(); + m_eventNumber=evt->eventNumber(); const HepMC::GenParticle* genParticle = 0; const Trk::TrackParameters* truePerigee = 0; -- GitLab From 5a7e374e83464f41a0ebdb7ddcf68593d5bbe74e Mon Sep 17 00:00:00 2001 From: Vakho Tsulaia <vakhtang.tsulaia@cern.ch> Date: Sat, 16 Mar 2019 00:27:35 +0100 Subject: [PATCH 054/163] Several PhysicsAnalysis packages migrated to xAOD::EventInfo --- .../src/PileUpInfoAssociatorTool.h | 3 +- .../egammaD3PDAnalysis/CMakeLists.txt | 3 +- .../src/egammaTimeCorrAlg.h | 5 +- .../DerivationFrameworkMCTruth/CMakeLists.txt | 3 +- .../HardTruthThinning.h | 5 +- .../src/HardTruthThinning.cxx | 19 +++---- .../ElectronPhotonTagTools/EgammaTagTool.h | 18 +++---- .../src/EgammaTagTool.cxx | 52 ++++++++----------- .../TagEvent/GlobalEventAttributeNames.h | 4 +- .../LongLivedParticleDPDMaker/CMakeLists.txt | 3 +- .../RPVLLTestRates.h | 6 ++- .../src/RPVLLTestRates.cxx | 21 ++++---- 12 files changed, 62 insertions(+), 80 deletions(-) diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/src/PileUpInfoAssociatorTool.h b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/src/PileUpInfoAssociatorTool.h index ca336e1363e2..1dc9672b9630 100644 --- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/src/PileUpInfoAssociatorTool.h +++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/src/PileUpInfoAssociatorTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /** @@ -13,7 +13,6 @@ #ifndef TRUTHD3P3MAKER_PILEUPINFOASSOCIATORTOOL_H #define TRUTHD3P3MAKER_PILEUPINFOASSOCIATORTOOL_H -#include "EventInfo/EventInfo.h" #include "EventInfo/PileUpEventInfo.h" #include "D3PDMakerUtils/MultiAssociationTool.h" diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt index 18b5cc52fcaf..10c8fb0f0995 100644 --- a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt +++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt @@ -16,7 +16,6 @@ atlas_depends_on_subdirs( PRIVATE Control/AthenaBaseComps Control/AthenaKernel Control/CxxUtils - Event/EventInfo Event/EventKernel Event/xAOD/xAODCaloEvent Event/xAOD/xAODEgamma @@ -36,7 +35,7 @@ atlas_depends_on_subdirs( PRIVATE atlas_add_component( egammaD3PDAnalysis src/*.cxx src/components/*.cxx - LINK_LIBRARIES CaloClusterCorrectionLib CaloEvent CaloGeoHelpers CaloRecLib AthContainers AthenaBaseComps AthenaKernel CxxUtils EventInfo EventKernel xAODCaloEvent xAODEgamma xAODTruth GaudiKernel LArCablingLib D3PDMakerUtils MCTruthClassifierLib RecoToolInterfaces egammaEvent TrkCaloExtension VxVertex ) + LINK_LIBRARIES CaloClusterCorrectionLib CaloEvent CaloGeoHelpers CaloRecLib AthContainers AthenaBaseComps AthenaKernel CxxUtils EventKernel xAODCaloEvent xAODEgamma xAODTruth GaudiKernel LArCablingLib D3PDMakerUtils MCTruthClassifierLib RecoToolInterfaces egammaEvent TrkCaloExtension VxVertex ) # Install files from the package: atlas_install_headers( egammaD3PDAnalysis ) diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/src/egammaTimeCorrAlg.h b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/src/egammaTimeCorrAlg.h index 811f3ff631a1..85379ff790da 100644 --- a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/src/egammaTimeCorrAlg.h +++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/src/egammaTimeCorrAlg.h @@ -1,7 +1,7 @@ // This file's extension implies that it's C, but it's really -*- C++ -*-. /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id: egammaTimeCorrAlg.h 604352 2014-07-01 04:52:11Z ssnyder $ @@ -23,9 +23,6 @@ #include "VxVertex/VxContainer.h" #include "VxVertex/RecVertex.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" - #include "CaloInterface/ICaloClusterTimeTool.h" #include <vector> diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/CMakeLists.txt b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/CMakeLists.txt index a2a5dc3a2e02..58a15924e427 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/CMakeLists.txt +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/CMakeLists.txt @@ -14,7 +14,6 @@ atlas_depends_on_subdirs( PUBLIC PhysicsAnalysis/DerivationFramework/DerivationFrameworkInterfaces PRIVATE Control/AthenaKernel - Event/EventInfo Event/xAOD/xAODBase Event/xAOD/xAODJet Generators/GeneratorObjects @@ -34,7 +33,7 @@ atlas_add_library( DerivationFrameworkMCTruthLib INCLUDE_DIRS ${HEPPDT_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS} PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} LINK_LIBRARIES ${HEPPDT_LIBRARIES} ${FASTJET_LIBRARIES} ${HEPMC_LIBRARIES} AthenaBaseComps xAODEventInfo xAODTruth GaudiKernel SGtests ExpressionEvaluationLib MCTruthClassifierLib - PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaKernel EventInfo xAODBase xAODJet GeneratorObjects ) + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaKernel xAODBase xAODJet GeneratorObjects ) atlas_add_component( DerivationFrameworkMCTruth src/components/*.cxx diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/DerivationFrameworkMCTruth/HardTruthThinning.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/DerivationFrameworkMCTruth/HardTruthThinning.h index 9dc3911d0929..8ea9852662c3 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/DerivationFrameworkMCTruth/HardTruthThinning.h +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/DerivationFrameworkMCTruth/HardTruthThinning.h @@ -36,7 +36,8 @@ #include "DerivationFrameworkMCTruth/DecayGraphHelper.h" #include "xAODTruth/TruthParticleContainer.h" #include "GaudiKernel/ToolHandle.h" - +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" class IThinningSvc; namespace DerivationFramework { @@ -59,8 +60,8 @@ namespace DerivationFramework { // handle to the thinning service ServiceHandle<IThinningSvc> m_thinningSvc; + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; // TruthParticle container names - std::string m_eventInfoName; std::string m_truthParticleName; std::string m_truthVertexName; std::string m_hardParticleName; diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/src/HardTruthThinning.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/src/HardTruthThinning.cxx index 2095f7def953..5bdd8400e7e8 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/src/HardTruthThinning.cxx +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMCTruth/src/HardTruthThinning.cxx @@ -21,13 +21,9 @@ #include "xAODJet/JetContainer.h" #include "xAODBase/IParticle.h" #include "xAODBase/IParticleContainer.h" -#include "xAODEventInfo/EventInfo.h" -//#include "EventKernel/PdtPdg.h" #include "AthenaKernel/errorcheck.h" #include "HepPID/ParticleIDMethods.hh" #include "GaudiKernel/SystemOfUnits.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" #include <vector> #include <string> @@ -60,9 +56,6 @@ DerivationFramework::HardTruthThinning::HardTruthThinning( declareInterface<DerivationFramework::IThinningTool>(this); declareProperty("ThinningService", m_thinningSvc); - declareProperty("EventInfo", m_eventInfoName, - "EventInfo name"); - declareProperty("TruthParticles", m_truthParticleName, "truth particle container name"); @@ -116,6 +109,8 @@ DerivationFramework::HardTruthThinning::~HardTruthThinning() { StatusCode DerivationFramework::HardTruthThinning::initialize() { + ATH_CHECK( m_evt.initialize() ); + m_evtCount = -1; m_errCount = 0; @@ -151,14 +146,12 @@ StatusCode DerivationFramework::HardTruthThinning::doThinning() const //bool doExtra = false; - // Retrieve Event/EventInfo -- FIXME - - const EventInfo* eventInfo = 0; - if( !evtStore()->retrieve( eventInfo, m_eventInfoName).isSuccess() ){ - ATH_MSG_ERROR("No EventInfo found with name " <<m_eventInfoName ); + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if(!evt.isValid()) { + ATH_MSG_ERROR("Failed to retrieve EventInfo"); return StatusCode::FAILURE; } - long long int evtNum = eventInfo->event_ID()->event_number(); + long long int evtNum = evt->eventNumber(); // Retrieve truth particles and vertices diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/ElectronPhotonTagTools/EgammaTagTool.h b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/ElectronPhotonTagTools/EgammaTagTool.h index bb34fa968b58..4e1fe2d63839 100755 --- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/ElectronPhotonTagTools/EgammaTagTool.h +++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/ElectronPhotonTagTools/EgammaTagTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef EGAMMATAGTOOL_H @@ -14,17 +14,13 @@ Purpose : build the Egamma Tag objects - AnalysisTag.h. The Egamma Analysis Tag fragment is built here *****************************************************************************/ #include "StoreGate/StoreGateSvc.h" +#include "StoreGate/ReadHandleKey.h" #include "AthenaBaseComps/AthAlgTool.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventType.h" -#include "EventInfo/EventID.h" -//#include "egammaEvent/ElectronContainer.h" +#include "xAODEventInfo/EventInfo.h" #include "xAODEgamma/EgammaContainer.h" #include "xAODEgamma/PhotonContainer.h" #include "xAODEgamma/ElectronContainer.h" #include "xAODMissingET/MissingETContainer.h" -//#include "egammaEvent/PhotonContainer.h" -//#include "MissingETEvent/MissingET.h" #include "TagEvent/TagFragmentCollection.h" #include "AthenaPoolUtilities/AthenaAttributeSpecification.h" #include <vector> @@ -51,12 +47,12 @@ public: private: bool ZeeSelection (const xAOD::ElectronContainer* eleColl, - const DataHandle<EventInfo>& eventInfo); + SG::ReadHandle<xAOD::EventInfo> eventInfo); bool WenuSelection (const xAOD::ElectronContainer* eleColl, const xAOD::MissingETContainer* metTopo, - const DataHandle<EventInfo>& eventInfo); + SG::ReadHandle<xAOD::EventInfo> eventInfo); void dumpEventDetails(const xAOD::Electron*, - const DataHandle<EventInfo>& eventInfo); + SG::ReadHandle<xAOD::EventInfo> eventInfo); private: @@ -78,6 +74,8 @@ private: double m_welectronPtCut; double m_invMass; + + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; #endif // ELECTRONTAGTOOL_H diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/src/EgammaTagTool.cxx b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/src/EgammaTagTool.cxx index a7a602169467..fec9448da381 100755 --- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/src/EgammaTagTool.cxx +++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonTagTools/src/EgammaTagTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /***************************************************************************** @@ -52,6 +52,7 @@ EgammaTagTool::EgammaTagTool (const std::string& type, const std::string& name, StatusCode EgammaTagTool::initialize() { ATH_MSG_DEBUG("in initialize()"); + ATH_CHECK( m_evt.initialize() ); return StatusCode::SUCCESS; } @@ -81,8 +82,11 @@ StatusCode EgammaTagTool::execute(TagFragmentCollection& egammaTagCol, const int const xAOD::MissingETContainer* metTopo = nullptr; ATH_CHECK( evtStore()->retrieve(metTopo, m_missingEtObject) ); - const DataHandle<EventInfo> eventInfo; - ATH_CHECK( evtStore()->retrieve(eventInfo) ); + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if(!evt.isValid()) { + ATH_MSG_ERROR("Failed to retrieve EventInfo"); + return StatusCode::FAILURE; + } /** Flags for Z and W events */ m_flagZeeEvent = false; @@ -91,12 +95,12 @@ StatusCode EgammaTagTool::execute(TagFragmentCollection& egammaTagCol, const int //=================================================== // Zee event reconstruction //=================================================== - m_flagZeeEvent = ZeeSelection (eleColl, eventInfo); + m_flagZeeEvent = ZeeSelection (eleColl, evt); //=================================================== // Wenu event reconstruction //=================================================== - m_flagWenuEvent = WenuSelection (eleColl, metTopo, eventInfo); + m_flagWenuEvent = WenuSelection (eleColl, metTopo, evt); //=================================================== @@ -121,7 +125,7 @@ StatusCode EgammaTagTool::finalize() { bool EgammaTagTool::ZeeSelection (const xAOD::ElectronContainer* eleColl, - const DataHandle<EventInfo>& eventInfo) + SG::ReadHandle<xAOD::EventInfo> eventInfo) { ATH_MSG_DEBUG("in ZeeSelection()"); @@ -173,7 +177,7 @@ bool EgammaTagTool::ZeeSelection (const xAOD::ElectronContainer* eleColl, if ( (m_massZLow < invMass) && (invMass < m_massZHigh) ) m_flagZeeEvent = true; /** Print the details of Zee Candidate if outputLevel=DEBUG */ - if (m_flagZeeEvent) { + if (m_flagZeeEvent && msgLvl(MSG::DEBUG)) { ATH_MSG_DEBUG("***** First electron candidate of Zee *****" ); dumpEventDetails(electrons_positive[i], eventInfo); ATH_MSG_DEBUG("***** Second electron candidate of Zee *****" ); @@ -190,7 +194,7 @@ bool EgammaTagTool::ZeeSelection (const xAOD::ElectronContainer* eleColl, bool EgammaTagTool::WenuSelection (const xAOD::ElectronContainer* eleColl, const xAOD::MissingETContainer* metTopo, - const DataHandle<EventInfo>& eventInfo) + SG::ReadHandle<xAOD::EventInfo> eventInfo) { ATH_MSG_DEBUG("in WenuSelection()"); @@ -212,7 +216,7 @@ bool EgammaTagTool::WenuSelection (const xAOD::ElectronContainer* eleColl, if (select) m_flagWenuEvent = true; - if (m_flagWenuEvent) { + if (m_flagWenuEvent && msgLvl(MSG::DEBUG)) { ATH_MSG_DEBUG("***** Electron Candidate in Wenu *****" ); dumpEventDetails(*eleItr, eventInfo); } @@ -223,30 +227,20 @@ bool EgammaTagTool::WenuSelection (const xAOD::ElectronContainer* eleColl, } void EgammaTagTool::dumpEventDetails(const xAOD::Electron* eleItr, - const DataHandle<EventInfo>& eventInfo) + SG::ReadHandle<xAOD::EventInfo> eventInfo) { - ATH_MSG_DEBUG("Event info : " - << " runNumber = " << eventInfo->event_ID()->run_number() - << " lumiBlock = " << eventInfo->event_ID()->lumi_block() - << " eventNumber = " << eventInfo->event_ID()->event_number() - ); + << " runNumber = " << eventInfo->runNumber() + << " lumiBlock = " << eventInfo->lumiBlock() + << " eventNumber = " << eventInfo->eventNumber() + ); ATH_MSG_DEBUG("Electrons : " - <<" pt = " << eleItr->pt() - <<" eta = " << eleItr->eta() - <<" phi = " << eleItr->phi() - <<" charge = " << eleItr->charge() - // <<" loosePP = " << eleItr->passID(egammaPID::ElectronIDLoosePP) - // <<" mediumPP = " << eleItr->passID(egammaPID::ElectronIDMediumPP) - // <<" tightPP = " << eleItr->passID(egammaPID::ElectronIDTightPP) - ); - - ATH_MSG_DEBUG("Event MET_topo : " - // <<" pt = " << metTopo->et() - // <<" phi = " << metTopo->phi() - ); + <<" pt = " << eleItr->pt() + <<" eta = " << eleItr->eta() + <<" phi = " << eleItr->phi() + <<" charge = " << eleItr->charge() + ); ATH_MSG_DEBUG("Invariant mass = " << m_invMass ); - } diff --git a/PhysicsAnalysis/EventTag/TagEvent/TagEvent/GlobalEventAttributeNames.h b/PhysicsAnalysis/EventTag/TagEvent/TagEvent/GlobalEventAttributeNames.h index 4e30cccaf2c1..4fdb5f9a9fc4 100755 --- a/PhysicsAnalysis/EventTag/TagEvent/TagEvent/GlobalEventAttributeNames.h +++ b/PhysicsAnalysis/EventTag/TagEvent/TagEvent/GlobalEventAttributeNames.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef EVENTTAGALGS_GLOBALEVENTATTRIBUTENAMES_H @@ -9,7 +9,7 @@ Author - Ketevi A. Assamagan Feb 2006 ****************************************/ -//#include "EventInfo/EventInfo.h" + #include "AthenaPoolUtilities/AthenaAttributeSpecification.h" #include "GlobalGroupAndUnitNames.h" #include <string> diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt index d4f0ba0143d7..3eefb5f3d620 100644 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/CMakeLists.txt @@ -20,7 +20,6 @@ atlas_depends_on_subdirs( PUBLIC PRIVATE Control/AthenaKernel Event/EventBookkeeperMetaData - Event/EventInfo Event/FourMomUtils Event/xAOD/xAODEventInfo Event/xAOD/xAODJet @@ -35,7 +34,7 @@ atlas_add_component( LongLivedParticleDPDMaker src/*.cxx src/components/*.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps xAODCaloEvent xAODEgamma xAODMuon xAODTracking GaudiKernel MuonSelectorToolsLib TrigDecisionToolLib TrigObjectMatchingLib AthenaKernel EventBookkeeperMetaData EventInfo FourMomUtils xAODEventInfo xAODJet xAODMissingET ) + LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps xAODCaloEvent xAODEgamma xAODMuon xAODTracking GaudiKernel MuonSelectorToolsLib TrigDecisionToolLib TrigObjectMatchingLib AthenaKernel EventBookkeeperMetaData FourMomUtils xAODEventInfo xAODJet xAODMissingET ) # Install files from the package: atlas_install_headers( LongLivedParticleDPDMaker ) diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h index 69a9a8025a46..0c6afed0b3a6 100755 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/LongLivedParticleDPDMaker/RPVLLTestRates.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef RPVLL_TESTRATES_H @@ -15,6 +15,8 @@ #include "GaudiKernel/IIncidentListener.h" #include "AthenaBaseComps/AthAlgorithm.h" #include "GaudiKernel/ITHistSvc.h" +#include "StoreGate/ReadHandleKey.h" +#include "xAODEventInfo/EventInfo.h" #include "TH1.h" #include "TH2.h" @@ -51,6 +53,8 @@ class RPVLLTestRates : public AthAlgorithm { int m_lumiBlock; int m_evtNum; std::vector<int> m_filterPassed; + + SG::ReadHandleKey<xAOD::EventInfo> m_evt {this, "EvtInfo", "EventInfo", "EventInfo name"}; }; #endif diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx index e47f2a85be88..b60a32be4097 100755 --- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx +++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/src/RPVLLTestRates.cxx @@ -1,12 +1,10 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "LongLivedParticleDPDMaker/RPVLLTestRates.h" #include "EventBookkeeperMetaData/EventBookkeeperCollection.h" #include "EventBookkeeperMetaData/SkimDecisionCollection.h" -#include "EventInfo/EventInfo.h" -#include "EventInfo/EventID.h" #include <iostream> @@ -23,7 +21,6 @@ RPVLLTestRates::RPVLLTestRates(const std::string& name, ISvcLocator* pSvcLocator m_runNum(0), m_lumiBlock(0), m_evtNum(0) - // m_filterPassed(0) { } @@ -43,6 +40,8 @@ StatusCode RPVLLTestRates::initialize() { StatusCode sc = m_tHistSvc.retrieve(); if (sc.isFailure()) return StatusCode::FAILURE; + ATH_CHECK( m_evt.initialize() ); + m_myTree= new TTree("myTree","myTree"); sc = m_tHistSvc->regTree("/AANT/myTree",m_myTree); if (sc.isFailure()) msg(MSG::ERROR)<<"Failed to book TTree"<<endmsg; @@ -94,19 +93,19 @@ StatusCode RPVLLTestRates::execute() { m_EventCounter++; - const EventInfo* eventInfo = nullptr; - StatusCode sc = evtStore()->retrieve(eventInfo); - if (sc.isFailure()) { + SG::ReadHandle<xAOD::EventInfo> evt(m_evt); + if (!evt.isValid()) { ATH_MSG_ERROR( "Could not retrieve event info" ); + return StatusCode::FAILURE; } - m_runNum = eventInfo->event_ID()->run_number(); - m_evtNum = eventInfo->event_ID()->event_number(); - m_lumiBlock = eventInfo->event_ID()->lumi_block(); + m_runNum = evt->runNumber(); + m_evtNum = evt->eventNumber(); + m_lumiBlock = evt->lumiBlock(); //// these are the ones that are useful for RPVLL filters const SkimDecisionCollection *SDcoll = 0; - sc = evtStore()->retrieve(SDcoll, "StreamDESDM_RPVLL_SkimDecisionsContainer"); + StatusCode sc = evtStore()->retrieve(SDcoll, "StreamDESDM_RPVLL_SkimDecisionsContainer"); int isAc=0; if (sc.isSuccess()){ -- GitLab From 4dec34b72b04675440d613ad09096708a6d027b1 Mon Sep 17 00:00:00 2001 From: scott snyder <sss@karma> Date: Fri, 15 Mar 2019 15:55:55 +0100 Subject: [PATCH 055/163] CaloIdentifier: Fix cppcheck warnings. Fix cppcheck warnings, including: - Use preincrement in iteration; - Initialize members in an initializer list; - Pass std::string by reference; - Format string type match. --- .../CaloIdentifier/CaloCell_Base_ID.h | 2 +- .../CaloIdentifier/CaloCell_Base_ID.icc | 2 +- .../CaloIdentifier/CaloID_Exception.h | 6 +- .../CaloIdentifier/CaloNeighbours.h | 16 ++-- .../CaloIdentifier/LArFCAL_Base_ID.h | 8 +- .../CaloIdentifier/LArID_Exception.h | 6 +- .../CaloIdentifier/LArMiniFCAL_ID.h | 8 +- .../CaloIdentifier/TileID_Exception.h | 6 +- .../CaloIdentifier/src/CaloCellGroup.cxx | 7 +- .../CaloIdentifier/src/CaloHelpersTest.cxx | 4 +- .../CaloIdentifier/src/CaloIDHelper.cxx | 3 +- .../CaloIdentifier/src/CaloID_Exception.cxx | 6 +- .../CaloIdentifier/src/CaloNeighbours.cxx | 88 +++++-------------- .../CaloIdentifier/src/LArEM_region.cxx | 34 +++---- .../CaloIdentifier/src/LArFCAL_Base_ID.cxx | 2 +- .../CaloIdentifier/src/LArHEC_region.cxx | 26 +++--- .../CaloIdentifier/src/LArMiniFCAL_ID.cxx | 2 +- .../CaloIdentifier/src/TileNeighbour.cxx | 4 +- .../CaloIdentifier/test/CaloCell_ID_test.cxx | 6 +- .../CaloIdentifier/test/LArEM_ID_test.cxx | 6 +- .../CaloIdentifier/test/LArFCAL_ID_test.cxx | 6 +- .../CaloIdentifier/test/LArHEC_ID_test.cxx | 6 +- .../test/LArHEC_SuperCell_ID_test.cxx | 6 +- .../test/LArMiniFCAL_ID_test.cxx | 6 +- .../CaloIdentifier/test/TileID_test.cxx | 6 +- .../test/jgtower_id_test_common.cxx | 4 +- .../CaloIdentifier/test/test_cell_id.cxx | 8 +- .../CaloIdentifier/test/test_lar_id.cxx | 20 +---- 28 files changed, 109 insertions(+), 195 deletions(-) diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.h b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.h index 09686c48e588..5d5c4d7f8efb 100644 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.h @@ -71,7 +71,7 @@ public: ~CaloCell_Base_ID(); - int GetSubCaloName( const std::string SubCaloName ) const; + int GetSubCaloName( const std::string& SubCaloName ) const; /// Initialization from the identifier dictionary virtual int initialize_from_dictionary(const IdDictMgr& dict_mgr) override; diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.icc b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.icc index dfee1d461ae3..17898761b685 100644 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.icc +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloCell_Base_ID.icc @@ -980,7 +980,7 @@ inline float CaloCell_Base_ID::phi0(const Identifier regId) const } //--------------------------------------------------------------------------- -inline int CaloCell_Base_ID::GetSubCaloName(const std::string SubCaloName )const +inline int CaloCell_Base_ID::GetSubCaloName(const std::string& SubCaloName )const { if(SubCaloName=="LAREM"){ return(LAREM); diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloID_Exception.h b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloID_Exception.h index 05e870582cb0..8b3962b0f4ce 100755 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloID_Exception.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloID_Exception.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /* date of creation : 10/X/2002 */ @@ -28,12 +28,12 @@ public: /** * constructor to be used */ - CaloID_Exception(std::string lMessage , int lCode) ; + CaloID_Exception(const std::string& lMessage , int lCode); /** * set error message */ - void message(std::string lMessage) ; + void message(const std::string& lMessage); /** * return error message <br> diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloNeighbours.h b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloNeighbours.h index 5f18578f929a..7ce61e473a60 100755 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/CaloNeighbours.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/CaloNeighbours.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef CALOIDENTIFIER_CALONEIGHBOURS_H @@ -43,7 +43,7 @@ class CaloNeighbourRegion { enum {SIDE = 2, SAMPL = 3, REGION = 4, ETA = 5, PHI = 6, TILESECTION = 1, TILEPHI = 3, TILEETA = 4, TILESAMPL = 5, FCALETA = 4, FCALPHI = 5}; - CaloNeighbourRegion(const std::string name, + CaloNeighbourRegion(const std::string& name, const CaloCell_Base_ID * theCaloId); virtual ~CaloNeighbourRegion(); @@ -86,8 +86,8 @@ class CaloNeighbourRegion { bool m_isValidMinus,m_isValidPlus; IdentifierHash m_minHashMinus,m_maxHashMinus,m_minHashPlus,m_maxHashPlus; - std::vector< std::vector<IdentifierHash>* > m_neighbours_plus; - std::vector< std::vector<IdentifierHash>* > m_neighbours_minus; + std::vector< std::unique_ptr<std::vector<IdentifierHash> > > m_neighbours_plus; + std::vector< std::unique_ptr<std::vector<IdentifierHash> > > m_neighbours_minus; }; class CaloNeighbours { @@ -106,12 +106,14 @@ public: int get_prevInCalo(const IdentifierHash &id,std::vector<IdentifierHash>& neighbourList) const; - int get_neighbours(const IdentifierHash &id, const std::vector<CaloNeighbourRegion*> ®ions, std::vector<IdentifierHash>& neighbourList) const; + int get_neighbours(const IdentifierHash &id, + const std::vector<std::unique_ptr<CaloNeighbourRegion> > ®ions, + std::vector<IdentifierHash>& neighbourList) const; private: const CaloCell_Base_ID * m_calo_id; - std::vector<CaloNeighbourRegion*> m_next_regions; - std::vector<CaloNeighbourRegion*> m_prev_regions; + std::vector<std::unique_ptr<CaloNeighbourRegion> > m_next_regions; + std::vector<std::unique_ptr<CaloNeighbourRegion> > m_prev_regions; }; #endif // CALOIDENTIFIER_CALONEIGHBOURS_H diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/LArFCAL_Base_ID.h b/Calorimeter/CaloIdentifier/CaloIdentifier/LArFCAL_Base_ID.h index ea7cdf5f1c16..63af168d53c3 100755 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/LArFCAL_Base_ID.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/LArFCAL_Base_ID.h @@ -176,19 +176,19 @@ private: int initLevelsFromDict(const std::string& group_name) ; int init_hashes(void) ; - int init_neighbours_from_file(std::string filename, std::vector<std::set<IdentifierHash> > &vec); + int init_neighbours_from_file(const std::string& filename, std::vector<std::set<IdentifierHash> > &vec); - int init_neighbours_2d(std::string filename) + int init_neighbours_2d(const std::string& filename) { return init_neighbours_from_file(filename, m_neighbours_2d_vec); } - int init_neighbours_3d_next(std::string filename) + int init_neighbours_3d_next(const std::string& filename) { return init_neighbours_from_file(filename, m_neighbours_3d_next_vec); } - int init_neighbours_3d_prev(std::string filename) + int init_neighbours_3d_prev(const std::string& filename) { return init_neighbours_from_file(filename, m_neighbours_3d_prev_vec); } diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/LArID_Exception.h b/Calorimeter/CaloIdentifier/CaloIdentifier/LArID_Exception.h index c6e63c9d95cb..26d403aede1b 100755 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/LArID_Exception.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/LArID_Exception.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /* Generated by Together */ @@ -28,12 +28,12 @@ public: /** * constructor to be used */ - LArID_Exception(std::string l_message , int l_code) : m_message ( l_message ) , m_code ( l_code ) { } + LArID_Exception(const std::string& l_message , int l_code) : m_message ( l_message ) , m_code ( l_code ) { } /** * set error message */ - void message(std::string l_message) { m_message = l_message ;} + void message(const std::string& l_message) { m_message = l_message ;} /** * return error message <br> diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/LArMiniFCAL_ID.h b/Calorimeter/CaloIdentifier/CaloIdentifier/LArMiniFCAL_ID.h index b3dc8a743352..4247f7c41fc6 100644 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/LArMiniFCAL_ID.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/LArMiniFCAL_ID.h @@ -222,19 +222,19 @@ private: int init_hashes(void) ; - int init_neighbors_from_file(std::string filename, std::vector<std::set<IdentifierHash> > &vec); + int init_neighbors_from_file(const std::string& filename, std::vector<std::set<IdentifierHash> > &vec); - int init_neighbors_2d(std::string filename) + int init_neighbors_2d(const std::string& filename) { return init_neighbors_from_file(filename, m_neighbors_2d_vec); } - int init_neighbors_3d_next(std::string filename) + int init_neighbors_3d_next(const std::string& filename) { return init_neighbors_from_file(filename, m_neighbors_3d_next_vec); } - int init_neighbors_3d_prev(std::string filename) + int init_neighbors_3d_prev(const std::string& filename) { return init_neighbors_from_file(filename, m_neighbors_3d_prev_vec); } diff --git a/Calorimeter/CaloIdentifier/CaloIdentifier/TileID_Exception.h b/Calorimeter/CaloIdentifier/CaloIdentifier/TileID_Exception.h index 84489df4a6c0..02a3c9413de1 100755 --- a/Calorimeter/CaloIdentifier/CaloIdentifier/TileID_Exception.h +++ b/Calorimeter/CaloIdentifier/CaloIdentifier/TileID_Exception.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #ifndef TILEID_EXCEPTION_H @@ -24,12 +24,12 @@ public: /** * constructor to be used */ - TileID_Exception(std::string l_message , int l_code) : m_message ( l_message ) , m_code ( l_code ) { } + TileID_Exception(const std::string& l_message , int l_code) : m_message ( l_message ) , m_code ( l_code ) { } /** * set error message */ - void message(std::string l_message) { m_message = l_message ;} + void message(const std::string& l_message) { m_message = l_message ;} /** * return error message diff --git a/Calorimeter/CaloIdentifier/src/CaloCellGroup.cxx b/Calorimeter/CaloIdentifier/src/CaloCellGroup.cxx index 1d7614720268..51943e5bf4f1 100644 --- a/Calorimeter/CaloIdentifier/src/CaloCellGroup.cxx +++ b/Calorimeter/CaloIdentifier/src/CaloCellGroup.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "CaloIdentifier/CaloCellGroup.h" @@ -289,10 +289,7 @@ void CaloCellGroupList::dump(const CaloCell_ID* caloCellId) { m_groups[i].printDef(); } std::cout << "Results: "<< std::endl; - std::vector<Identifier>::const_iterator it=caloCellId->cell_begin(); - std::vector<Identifier>::const_iterator it_e=caloCellId->cell_end(); - for(;it!=it_e;it++) { - const Identifier id=(*it); + for (const Identifier& id : caloCellId->cell_range()) { std::cout << "Values for " << caloCellId->show_to_string(id); const std::vector<float>& x=this->valuesForCell(id); std::cout << " ["; diff --git a/Calorimeter/CaloIdentifier/src/CaloHelpersTest.cxx b/Calorimeter/CaloIdentifier/src/CaloHelpersTest.cxx index 3f1180950f7b..465a636d9e1d 100644 --- a/Calorimeter/CaloIdentifier/src/CaloHelpersTest.cxx +++ b/Calorimeter/CaloIdentifier/src/CaloHelpersTest.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /* */ @@ -16,8 +16,8 @@ CaloHelpersTest::CaloHelpersTest() + : m_parser (std::make_unique<IdDictParser>()) { - m_parser = std::make_unique<IdDictParser>(); m_parser->register_external_entity("LArCalorimeter", "IdDictLArCalorimeter.xml"); IdDictMgr& idd = m_parser->parse("IdDictParser/ATLAS_IDS.xml"); m_em_idHelper.set_quiet (true); diff --git a/Calorimeter/CaloIdentifier/src/CaloIDHelper.cxx b/Calorimeter/CaloIdentifier/src/CaloIDHelper.cxx index 57e3b11c3c20..f7074232d324 100644 --- a/Calorimeter/CaloIdentifier/src/CaloIDHelper.cxx +++ b/Calorimeter/CaloIdentifier/src/CaloIDHelper.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id$ @@ -268,6 +268,7 @@ CaloIDHelper::fill_vec_of_dict_regions (const std::string& group_name /*= ""*/) m_vecOfDictRegions.push_back (m_dict->find_region(expRegId,group_name)); } } + // cppcheck-suppress assertWithSideEffect assert (m_vecOfDictRegions.size() == regions().hash_max()); return 0; } diff --git a/Calorimeter/CaloIdentifier/src/CaloID_Exception.cxx b/Calorimeter/CaloIdentifier/src/CaloID_Exception.cxx index 7c9d8d90cff4..9449fc91b124 100755 --- a/Calorimeter/CaloIdentifier/src/CaloID_Exception.cxx +++ b/Calorimeter/CaloIdentifier/src/CaloID_Exception.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "CaloIdentifier/CaloID_Exception.h" @@ -12,11 +12,11 @@ CaloID_Exception::CaloID_Exception() : m_message("No error message") , m_code( 999 ) { } -CaloID_Exception::CaloID_Exception(std::string lMessage , int lCode) : +CaloID_Exception::CaloID_Exception(const std::string& lMessage , int lCode) : m_message ( lMessage ) , m_code ( lCode ) { } -void CaloID_Exception::message(std::string lMessage) +void CaloID_Exception::message(const std::string& lMessage) { m_message = lMessage ;} std::string CaloID_Exception::message() const diff --git a/Calorimeter/CaloIdentifier/src/CaloNeighbours.cxx b/Calorimeter/CaloIdentifier/src/CaloNeighbours.cxx index ceed400254e9..7fd705fb8b56 100755 --- a/Calorimeter/CaloIdentifier/src/CaloNeighbours.cxx +++ b/Calorimeter/CaloIdentifier/src/CaloNeighbours.cxx @@ -39,10 +39,11 @@ //############################################################################### -CaloNeighbourRegion::CaloNeighbourRegion(const std::string name, +CaloNeighbourRegion::CaloNeighbourRegion(const std::string& name, const CaloCell_Base_ID *theCaloId) : + m_name(name), m_type(nextInCalo), - m_calo_id(0), + m_calo_id(theCaloId), m_hasPhi(false), m_iPhiSource(0), m_iPhiTarget(0), @@ -52,30 +53,12 @@ CaloNeighbourRegion::CaloNeighbourRegion(const std::string name, m_isValidMinus(false), m_isValidPlus(false) { - m_name = name; - m_calo_id = theCaloId; } //############################################################################### CaloNeighbourRegion::~CaloNeighbourRegion() { - std::vector< std::vector<IdentifierHash>* >::iterator nIter = m_neighbours_plus.begin(); - std::vector< std::vector<IdentifierHash>* >::iterator nIterEnd = m_neighbours_plus.end(); - for(; nIter != nIterEnd; nIter++ ) { - if ( (*nIter) ) { - delete (*nIter); - (*nIter) = 0; - } - } - nIter = m_neighbours_minus.begin(); - nIterEnd = m_neighbours_minus.end(); - for(; nIter != nIterEnd; nIter++ ) { - if ( (*nIter) ) { - delete (*nIter); - (*nIter) = 0; - } - } } //############################################################################### @@ -231,12 +214,10 @@ int CaloNeighbourRegion::setNeighbours(ExpandedIdentifier& id1, // get hash ID's for the source IdentifierHash myHash = m_calo_id->calo_cell_hash (myId); // get ID's and hash ID's for the target - std::vector<ExpandedIdentifier>::const_iterator idIter = id2.begin(); - std::vector<ExpandedIdentifier>::const_iterator idIterEnd = id2.end(); std::vector<IdentifierHash> theTargetHashIDs; - for ( ; idIter != idIterEnd; idIter++ ) { + for (const ExpandedIdentifier& eid : id2) { Identifier myTargetId; - ExpandedIdentifier myNExpID(*idIter); + ExpandedIdentifier myNExpID(eid); if ( getId(myNExpID,myTargetId,m_targetRange,side,dphi2) ) { return 1; } @@ -260,25 +241,19 @@ int CaloNeighbourRegion::setNeighbours(ExpandedIdentifier& id1, void CaloNeighbourRegion::initializeVectors(std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>& neighbourMapPlus, std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>& neighbourMapMinus) { if ( m_isValidMinus ) { - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_iterator first = neighbourMapMinus.begin(); - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_iterator end = neighbourMapMinus.end(); - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_reverse_iterator last = neighbourMapMinus.rbegin(); - m_minHashMinus = (*first).first; - m_maxHashMinus = (*last).first; - m_neighbours_minus.resize((unsigned int)(m_maxHashMinus-m_minHashMinus+1),0); - for(;first != end;first++) { - m_neighbours_minus[(unsigned int)((*first).first-m_minHashMinus)] = new std::vector<IdentifierHash>((*first).second); + m_minHashMinus = neighbourMapMinus.begin()->first; + m_maxHashMinus = neighbourMapMinus.rbegin()->first; + m_neighbours_minus.resize((unsigned int)(m_maxHashMinus-m_minHashMinus+1)); + for (const auto& p : neighbourMapMinus) { + m_neighbours_minus[(unsigned int)(p.first-m_minHashMinus)] = std::make_unique<std::vector<IdentifierHash> >(p.second); } } if ( m_isValidPlus ) { - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_iterator first = neighbourMapPlus.begin(); - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_iterator end = neighbourMapPlus.end(); - std::map<IdentifierHash, std::vector<IdentifierHash>, ltIdHash>::const_reverse_iterator last = neighbourMapPlus.rbegin(); - m_minHashPlus = (*first).first; - m_maxHashPlus = (*last).first; - m_neighbours_plus.resize((unsigned int)(m_maxHashPlus-m_minHashPlus+1),0); - for(;first != end;first++) { - m_neighbours_plus[(unsigned int)((*first).first-m_minHashPlus)] = new std::vector<IdentifierHash>((*first).second); + m_minHashPlus = neighbourMapPlus.begin()->first; + m_maxHashPlus = neighbourMapPlus.rbegin()->first; + m_neighbours_plus.resize((unsigned int)(m_maxHashPlus-m_minHashPlus+1)); + for (const auto& p : neighbourMapPlus) { + m_neighbours_plus[(unsigned int)(p.first-m_minHashPlus)] = std::make_unique<std::vector<IdentifierHash> >(p.second); } } @@ -315,23 +290,6 @@ CaloNeighbours::CaloNeighbours() : CaloNeighbours::~CaloNeighbours() { - std::vector<CaloNeighbourRegion*>::iterator rIter = m_next_regions.begin(); - std::vector<CaloNeighbourRegion*>::iterator rIterEnd = m_next_regions.end(); - for(; rIter != rIterEnd; rIter++ ) { - if ((*rIter)) { - delete (*rIter); - (*rIter) = 0; - } - } - - rIter = m_prev_regions.begin(); - rIterEnd = m_prev_regions.end(); - for(; rIter != rIterEnd; rIter++ ) { - if ((*rIter)) { - delete (*rIter); - (*rIter) = 0; - } - } } //############################################################################### @@ -430,7 +388,7 @@ int CaloNeighbours::initialize(const CaloCell_Base_ID* caloID, // } // std::cout << std::endl; // create new CaloNeighbourRegion - CaloNeighbourRegion * myRegion = new CaloNeighbourRegion(cName,m_calo_id); + auto myRegion = std::make_unique<CaloNeighbourRegion>(cName,m_calo_id); if ( isNext ) myRegion->setType(nextInCalo); else @@ -473,9 +431,9 @@ int CaloNeighbours::initialize(const CaloCell_Base_ID* caloID, } while (!fin.eof() && !endOfBlock); myRegion->initializeVectors(neighbourMapPlus,neighbourMapMinus); if (isNext) - m_next_regions.push_back(myRegion); + m_next_regions.push_back(std::move(myRegion)); else - m_prev_regions.push_back(myRegion); + m_prev_regions.push_back(std::move(myRegion)); } else { std::cout << "CaloNeighbours::initialize ERROR Invalid neighbour dat file, exiting ... " << std::endl; @@ -504,13 +462,13 @@ int CaloNeighbours::get_prevInCalo(const IdentifierHash &id,std::vector<Identifi //############################################################################### -int CaloNeighbours::get_neighbours(const IdentifierHash &id, const std::vector<CaloNeighbourRegion*> ®ions, std::vector<IdentifierHash>& neighbourList) const +int CaloNeighbours::get_neighbours(const IdentifierHash &id, + const std::vector<std::unique_ptr<CaloNeighbourRegion> > ®ions, + std::vector<IdentifierHash>& neighbourList) const { int result = 0; - std::vector<CaloNeighbourRegion*>::const_iterator rIter = regions.begin(); - std::vector<CaloNeighbourRegion*>::const_iterator rIterEnd = regions.end(); - for(; rIter != rIterEnd; rIter++ ) { - result = (*rIter)->getNeighbours(id,neighbourList); + for (const std::unique_ptr<CaloNeighbourRegion>& p : regions) { + result = p->getNeighbours(id,neighbourList); if ( result != 0 ) return result; } diff --git a/Calorimeter/CaloIdentifier/src/LArEM_region.cxx b/Calorimeter/CaloIdentifier/src/LArEM_region.cxx index 9effee8da571..ba35d0b5e298 100755 --- a/Calorimeter/CaloIdentifier/src/LArEM_region.cxx +++ b/Calorimeter/CaloIdentifier/src/LArEM_region.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "LArEM_region.h" @@ -28,24 +28,24 @@ LArEM_region::LArEM_region(unsigned int& minHash, short int& nbEtaBins, short in float minEta, float granulEta, float minPhi, float granulPhi, bool fullSym, bool isBarrelMiddle, short int& prevEtaReg, short int& nextEtaReg, std::vector<short int>& prevSampReg, std::vector<short int>& nextSampReg, - std::vector<short int>& prevSubdetReg, std::vector<short int>& nextSubdetReg) + std::vector<short int>& prevSubdetReg, std::vector<short int>& nextSubdetReg) + : m_hashMin (minHash), + m_nbEtaBins (nbEtaBins), + m_nPhi (nPhi), + m_minEta (minEta), + m_granulEta (granulEta), + m_minPhi (minPhi), + m_granulPhi (granulPhi), + m_fullSym (fullSym), + m_isFirstBarrelRegion (isBarrelMiddle), + m_prevEtaReg (prevEtaReg), + m_nextEtaReg (nextEtaReg), + m_prevSampReg (prevSampReg), + m_nextSampReg (nextSampReg), + m_prevSubdetReg (prevSubdetReg), + m_nextSubdetReg (nextSubdetReg) { - m_hashMin = minHash; - m_nbEtaBins = nbEtaBins; - m_minEta = minEta; - m_granulEta = granulEta; - m_minPhi = minPhi; - m_granulPhi = granulPhi; - m_nPhi = nPhi; - m_fullSym = fullSym; - m_isFirstBarrelRegion = isBarrelMiddle; - m_prevEtaReg = prevEtaReg; - m_nextEtaReg = nextEtaReg; - m_prevSampReg = prevSampReg; - m_nextSampReg = nextSampReg; - m_prevSubdetReg = prevSubdetReg; - m_nextSubdetReg = nextSubdetReg; } diff --git a/Calorimeter/CaloIdentifier/src/LArFCAL_Base_ID.cxx b/Calorimeter/CaloIdentifier/src/LArFCAL_Base_ID.cxx index 552ad48abcea..88b00023daba 100755 --- a/Calorimeter/CaloIdentifier/src/LArFCAL_Base_ID.cxx +++ b/Calorimeter/CaloIdentifier/src/LArFCAL_Base_ID.cxx @@ -604,7 +604,7 @@ int LArFCAL_Base_ID::get_neighbours(const IdentifierHash id, const LArNeighbou return result; } -int LArFCAL_Base_ID::init_neighbours_from_file(std::string filename, std::vector<std::set<IdentifierHash> > & vec) +int LArFCAL_Base_ID::init_neighbours_from_file(const std::string& filename, std::vector<std::set<IdentifierHash> > & vec) { MsgStream log(m_msgSvc, "LArFCAL_Base_ID" ); diff --git a/Calorimeter/CaloIdentifier/src/LArHEC_region.cxx b/Calorimeter/CaloIdentifier/src/LArHEC_region.cxx index 0408316c927e..12f8cd667605 100755 --- a/Calorimeter/CaloIdentifier/src/LArHEC_region.cxx +++ b/Calorimeter/CaloIdentifier/src/LArHEC_region.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ #include "LArHEC_region.h" @@ -26,20 +26,20 @@ LArHEC_region::LArHEC_region(unsigned int& minHash, short int& nbEtaBins, short float minEta, float granulEta, float minPhi, float granulPhi, bool fullSym, short int& prevEtaReg, short int& nextEtaReg, std::vector<short int>& prevSampReg, std::vector<short int>& nextSampReg) + : m_hashMin (minHash), + m_nbEtaBins (nbEtaBins), + m_nPhi (nPhi), + m_minEta (minEta), + m_granulEta (granulEta), + m_minPhi (minPhi), + m_granulPhi (granulPhi), + m_fullSym (fullSym), + m_prevEtaReg (prevEtaReg), + m_nextEtaReg (nextEtaReg), + m_prevSampReg(prevSampReg), + m_nextSampReg(nextSampReg) { - m_hashMin = minHash; - m_nbEtaBins = nbEtaBins; - m_minEta = minEta; - m_granulEta = granulEta; - m_minPhi = minPhi; - m_granulPhi = granulPhi; - m_nPhi = nPhi; - m_fullSym = fullSym; - m_prevEtaReg = prevEtaReg; - m_nextEtaReg = nextEtaReg; - m_prevSampReg = prevSampReg; - m_nextSampReg = nextSampReg; } diff --git a/Calorimeter/CaloIdentifier/src/LArMiniFCAL_ID.cxx b/Calorimeter/CaloIdentifier/src/LArMiniFCAL_ID.cxx index 909376d2351d..c970bbfd0cba 100644 --- a/Calorimeter/CaloIdentifier/src/LArMiniFCAL_ID.cxx +++ b/Calorimeter/CaloIdentifier/src/LArMiniFCAL_ID.cxx @@ -650,7 +650,7 @@ int LArMiniFCAL_ID::init_hashes(void) } -int LArMiniFCAL_ID::init_neighbors_from_file(std::string filename, std::vector<std::set<IdentifierHash> > & vec) +int LArMiniFCAL_ID::init_neighbors_from_file(const std::string& filename, std::vector<std::set<IdentifierHash> > & vec) { MsgStream log(m_msgSvc, "LArMiniFCAL_ID" ); diff --git a/Calorimeter/CaloIdentifier/src/TileNeighbour.cxx b/Calorimeter/CaloIdentifier/src/TileNeighbour.cxx index 835776a7ae72..cde6b742ea91 100755 --- a/Calorimeter/CaloIdentifier/src/TileNeighbour.cxx +++ b/Calorimeter/CaloIdentifier/src/TileNeighbour.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /*************************************************************************** @@ -40,7 +40,7 @@ typedef struct { Identifier id; IdentifierHash hash_id; - short int index; + short int index = 0; std::string name; std::vector<std::string> neighbours[4]; diff --git a/Calorimeter/CaloIdentifier/test/CaloCell_ID_test.cxx b/Calorimeter/CaloIdentifier/test/CaloCell_ID_test.cxx index 19ac74a36c16..13e740b0f925 100644 --- a/Calorimeter/CaloIdentifier/test/CaloCell_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/CaloCell_ID_test.cxx @@ -41,11 +41,7 @@ void test_neighbours (const CaloCell_ID& calo_id) std::vector<IdentifierHash> neighbourList; assert (calo_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList) == 0); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { assert (hash_min <= neighbourHash && neighbourHash <= hash_max); } } diff --git a/Calorimeter/CaloIdentifier/test/LArEM_ID_test.cxx b/Calorimeter/CaloIdentifier/test/LArEM_ID_test.cxx index 848417883a56..e6369c07f635 100644 --- a/Calorimeter/CaloIdentifier/test/LArEM_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/LArEM_ID_test.cxx @@ -55,11 +55,7 @@ void test4 (const LArEM_ID& em_id) for (unsigned int iCell = 0 ; iCell < em_id.channel_hash_max(); ++iCell){ em_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/LArFCAL_ID_test.cxx b/Calorimeter/CaloIdentifier/test/LArFCAL_ID_test.cxx index ebf0f640f8af..ba939b242b4e 100644 --- a/Calorimeter/CaloIdentifier/test/LArFCAL_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/LArFCAL_ID_test.cxx @@ -43,11 +43,7 @@ void test4 (const LArFCAL_ID& fcal_id) for (unsigned int iCell = 0 ; iCell < fcal_id.channel_hash_max(); ++iCell){ fcal_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/LArHEC_ID_test.cxx b/Calorimeter/CaloIdentifier/test/LArHEC_ID_test.cxx index 05b360ba84c8..f2e40652d22e 100644 --- a/Calorimeter/CaloIdentifier/test/LArHEC_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/LArHEC_ID_test.cxx @@ -54,11 +54,7 @@ void test_neighbors (const LArHEC_ID& idhelper) for (unsigned int iCell = 0 ; iCell < idhelper.channel_hash_max(); ++iCell){ idhelper.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/LArHEC_SuperCell_ID_test.cxx b/Calorimeter/CaloIdentifier/test/LArHEC_SuperCell_ID_test.cxx index 0b49c4b09051..c7c8f87ad5e3 100644 --- a/Calorimeter/CaloIdentifier/test/LArHEC_SuperCell_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/LArHEC_SuperCell_ID_test.cxx @@ -52,11 +52,7 @@ void test_neighbors (const LArHEC_SuperCell_ID& idhelper) for (unsigned int iCell = 0 ; iCell < idhelper.channel_hash_max(); ++iCell){ idhelper.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/LArMiniFCAL_ID_test.cxx b/Calorimeter/CaloIdentifier/test/LArMiniFCAL_ID_test.cxx index 7861d1d7baff..fae19f14526b 100644 --- a/Calorimeter/CaloIdentifier/test/LArMiniFCAL_ID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/LArMiniFCAL_ID_test.cxx @@ -218,11 +218,7 @@ void test_neighbors (const LArMiniFCAL_ID& idhelper) for (unsigned int iCell = 0 ; iCell < idhelper.channel_hash_max(); ++iCell){ idhelper.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/TileID_test.cxx b/Calorimeter/CaloIdentifier/test/TileID_test.cxx index 6f0a36028d28..463188216365 100644 --- a/Calorimeter/CaloIdentifier/test/TileID_test.cxx +++ b/Calorimeter/CaloIdentifier/test/TileID_test.cxx @@ -81,11 +81,7 @@ void test_neighbors (const TileID& idhelper) for (unsigned int iCell = 0 ; iCell < idhelper.cell_hash_max(); ++iCell){ idhelper.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } diff --git a/Calorimeter/CaloIdentifier/test/jgtower_id_test_common.cxx b/Calorimeter/CaloIdentifier/test/jgtower_id_test_common.cxx index 0067c53df4c4..583a078328bd 100644 --- a/Calorimeter/CaloIdentifier/test/jgtower_id_test_common.cxx +++ b/Calorimeter/CaloIdentifier/test/jgtower_id_test_common.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id$ @@ -70,7 +70,7 @@ void CellCounter::report() { int towerSum = 0; for(int regI=0; regI<N_REG; ++regI){ - printf ("Region %2d: %6d\n", regI, m_counts[regI]); + printf ("Region %2d: %6u\n", regI, m_counts[regI]); towerSum+=m_counts[regI]; } printf ("Total: %6d\n", towerSum); diff --git a/Calorimeter/CaloIdentifier/test/test_cell_id.cxx b/Calorimeter/CaloIdentifier/test/test_cell_id.cxx index 4438a617c3c1..7e6a669999e4 100755 --- a/Calorimeter/CaloIdentifier/test/test_cell_id.cxx +++ b/Calorimeter/CaloIdentifier/test/test_cell_id.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Header: /build/atlas/cvs/atlas/offline/Calorimeter/CaloIdentifier/test/test_cell_id.cxx,v 1.19 2006-03-20 20:32:50 ssnyder Exp $ @@ -568,11 +568,7 @@ check_cell_neighbours(IdDictMgr& idd) std::cout << "return code of get_neighbours not ok for iCell = " << iCell << "cellId = " << calo_id->show_to_string(cellId) << std::endl; } else { - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min || neighbourHash > hash_max) { std::cout << " neighbour index " << neighbourHash << " outside of det boundaries for iCell " << iCell << std::endl; error = true; diff --git a/Calorimeter/CaloIdentifier/test/test_lar_id.cxx b/Calorimeter/CaloIdentifier/test/test_lar_id.cxx index 90992010687c..d0f80f52b303 100755 --- a/Calorimeter/CaloIdentifier/test/test_lar_id.cxx +++ b/Calorimeter/CaloIdentifier/test/test_lar_id.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Header: /build/atlas/cvs/atlas/offline/Calorimeter/CaloIdentifier/test/test_lar_id.cxx,v 1.25 2007-02-19 15:56:25 fledroit Exp $ @@ -1695,11 +1695,7 @@ static void check_lar_neighbour(IdDictMgr& idd) em_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList); - std::vector<IdentifierHash>::iterator first=neighbourList.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList) { if(neighbourHash < hash_min ) { hash_min = neighbourHash; } @@ -1738,11 +1734,7 @@ static void check_lar_neighbour(IdDictMgr& idd) hec_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList2); - std::vector<IdentifierHash>::iterator first=neighbourList2.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList2.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList2) { if(neighbourHash < hash_min2 ) { hash_min2 = neighbourHash; } @@ -1781,11 +1773,7 @@ static void check_lar_neighbour(IdDictMgr& idd) fcal_id.get_neighbours(iCell, LArNeighbours::all3D, neighbourList3); - std::vector<IdentifierHash>::iterator first=neighbourList3.begin(); - std::vector<IdentifierHash>::iterator last=neighbourList3.end(); - for (;last!=first; first++){ - - IdentifierHash neighbourHash=(*first); + for (IdentifierHash neighbourHash : neighbourList3) { if(neighbourHash < hash_min3 ) { hash_min3 = neighbourHash; } -- GitLab From 11806a387cbe140f1a2ce792bd80be06dbf454d1 Mon Sep 17 00:00:00 2001 From: scott snyder <sss@karma> Date: Fri, 15 Mar 2019 15:56:22 +0100 Subject: [PATCH 056/163] LArIdentifier: Enable thread-safety checker. Enable thread-safety static checker. --- .../LArIdentifier/LArIdentifier/ATLAS_CHECK_THREAD_SAFETY | 1 + 1 file changed, 1 insertion(+) create mode 100644 LArCalorimeter/LArIdentifier/LArIdentifier/ATLAS_CHECK_THREAD_SAFETY diff --git a/LArCalorimeter/LArIdentifier/LArIdentifier/ATLAS_CHECK_THREAD_SAFETY b/LArCalorimeter/LArIdentifier/LArIdentifier/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 000000000000..d428f4b1dec4 --- /dev/null +++ b/LArCalorimeter/LArIdentifier/LArIdentifier/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +LArCalorimeter/LArIdentifier -- GitLab From cefe141f3b6885e2d8166ab93a983fbf9c831919 Mon Sep 17 00:00:00 2001 From: scott snyder <sss@karma> Date: Fri, 15 Mar 2019 15:56:44 +0100 Subject: [PATCH 057/163] TileIdentifier: Enable thread-safety static checker. Enable thread-safety static checker. --- .../TileIdentifier/TileIdentifier/ATLAS_CHECK_THREAD_SAFETY | 1 + 1 file changed, 1 insertion(+) create mode 100644 TileCalorimeter/TileIdentifier/TileIdentifier/ATLAS_CHECK_THREAD_SAFETY diff --git a/TileCalorimeter/TileIdentifier/TileIdentifier/ATLAS_CHECK_THREAD_SAFETY b/TileCalorimeter/TileIdentifier/TileIdentifier/ATLAS_CHECK_THREAD_SAFETY new file mode 100644 index 000000000000..1f78367fb36b --- /dev/null +++ b/TileCalorimeter/TileIdentifier/TileIdentifier/ATLAS_CHECK_THREAD_SAFETY @@ -0,0 +1 @@ +TileCalorimeter/TileIdentifier -- GitLab From 6bf50f313ee8ab2797dbb06a5ec76f6d7eebaf3d Mon Sep 17 00:00:00 2001 From: scott snyder <sss@karma> Date: Tue, 12 Mar 2019 14:55:47 +0100 Subject: [PATCH 058/163] TrigOutputHandling: Fix compilation to clang. Streaming operators should live within the namespace of the class they're streaming. Best not to define stream operators for types in std::; use formatting functions instead. --- .../src/HLTResultMTMaker.cxx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx index 870b0f171bac..48618245884d 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx +++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTResultMTMaker.cxx @@ -5,6 +5,7 @@ #include "TrigOutputHandling/HLTResultMTMaker.h" #include "AthenaMonitoring/Monitored.h" #include "GaudiKernel/IJobOptionsSvc.h" +#include <sstream> // Local helpers namespace { @@ -32,15 +33,17 @@ namespace { return removedIds; } /// Print helper for set<uint32_t> - std::ostream& operator<<(std::ostream& str, const std::set<uint32_t>& set) { + std::string format(const std::set<uint32_t>& set) { + std::ostringstream ss; for (const uint32_t id : set) - str << "0x" << std::hex << std::setfill('0') << std::setw(8) << id << std::dec << " "; - return str; + ss << "0x" << std::hex << std::setfill('0') << std::setw(8) << id << std::dec << " "; + return ss.str(); } /// Print helper for set<eformat::SubDetector> - std::ostream& operator<<(std::ostream& str, const std::set<eformat::SubDetector>& set) { - for (const eformat::SubDetector id : set) str << eformat::helper::SubDetectorDictionary.string(id) << " "; - return str; + std::string format(const std::set<eformat::SubDetector>& set) { + std::ostringstream ss; + for (const eformat::SubDetector id : set) ss << eformat::helper::SubDetectorDictionary.string(id) << " "; + return ss.str(); } } @@ -161,14 +164,14 @@ void HLTResultMTMaker::validatePEBInfo(HLT::HLTResultMT& hltResult) const { for (eformat::helper::StreamTag& st : hltResult.getStreamTagsNonConst()) { std::set<uint32_t> removedROBs = removeDisabled(st.robs,m_enabledROBs); if (!removedROBs.empty()) - ATH_MSG_WARNING("StreamTag " << st.type << "_" << st.name << " requested disabled ROBs: " << removedROBs + ATH_MSG_WARNING("StreamTag " << st.type << "_" << st.name << " requested disabled ROBs: " << format(removedROBs) << " - these ROBs were removed from the StreamTag by " << name()); else ATH_MSG_VERBOSE("No disabled ROBs were requested by StreamTag " << st.type << "_" << st.name); std::set<eformat::SubDetector> removedSubDets = removeDisabled(st.dets,m_enabledSubDets); if (!removedSubDets.empty()) - ATH_MSG_WARNING("StreamTag " << st.type << "_" << st.name << " requested disabled SubDets: " << removedSubDets + ATH_MSG_WARNING("StreamTag " << st.type << "_" << st.name << " requested disabled SubDets: " << format(removedSubDets) << " - these SubDets were removed from the StreamTag by " << name()); else ATH_MSG_VERBOSE("No disabled SubDets were requested by StreamTag " << st.type << "_" << st.name); -- GitLab From 5f8e536b63f06ecde2a10654b3686b9d1b7f57b2 Mon Sep 17 00:00:00 2001 From: Frank Winklmeier <frank.winklmeier@cern.ch> Date: Sat, 16 Mar 2019 15:46:25 +0000 Subject: [PATCH 059/163] Remove dictionary rule for deleted class ILArBadChanTool --- .../LArBadChannelTool/LArBadChannelTool/selection.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/LArCalorimeter/LArBadChannelTool/LArBadChannelTool/selection.xml b/LArCalorimeter/LArBadChannelTool/LArBadChannelTool/selection.xml index 92958d1cba7a..f4342b557b39 100644 --- a/LArCalorimeter/LArBadChannelTool/LArBadChannelTool/selection.xml +++ b/LArCalorimeter/LArBadChannelTool/LArBadChannelTool/selection.xml @@ -27,8 +27,5 @@ <class name="std::pair<bool,LArBadChannelEnum::ProblemType>"/> <class name="ILArBadChannelMasker"/> -<class name="ILArBadChanTool"/> -<!-- <class name="LArBadChannelMasker"/> --> -<!-- <class name="LArBadChanTool"/> --> </lcgdict> -- GitLab From 4e068bcb9684dcb25689b49b87a4ee54ba82ccc5 Mon Sep 17 00:00:00 2001 From: scott snyder <sss@karma> Date: Sat, 16 Mar 2019 16:44:28 +0100 Subject: [PATCH 060/163] TrigT1Interfaces: Make RoIDecoder interfaces const. Rework CPRoIDecoder and JEPRoIDecoder to make interfaces const, removing all data-dependent data members. --- .../TrigT1Interfaces/CPRoIDecoder.h | 28 +-- .../TrigT1Interfaces/JEPRoIDecoder.h | 82 +++---- .../TrigT1Interfaces/RoIDecoder.h | 22 +- .../TrigT1Interfaces/src/CPRoIDecoder.cxx | 105 ++++---- .../TrigT1Interfaces/src/JEPRoIDecoder.cxx | 232 ++++++++---------- .../TrigT1Interfaces/src/RecEmTauRoI.cxx | 4 +- .../TrigT1Interfaces/src/RecEnergyRoI.cxx | 23 +- .../TrigT1/TrigT1Interfaces/src/RecJetRoI.cxx | 4 +- .../TrigT1Interfaces/src/RoIDecoder.cxx | 70 +----- 9 files changed, 194 insertions(+), 376 deletions(-) diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/CPRoIDecoder.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/CPRoIDecoder.h index 6a8411527998..2d02c45257d9 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/CPRoIDecoder.h +++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/CPRoIDecoder.h @@ -1,6 +1,6 @@ // Dear emacs, this is -*- c++ -*- /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /*************************************************************************** CPRoIDecoder.h - description @@ -39,28 +39,18 @@ namespace LVL1 { TrigT1CaloDefs::RoIType roiType( unsigned int word ) const; /** RoI coordinate information */ - CoordinateRange coordinate( const unsigned int roiWord ); - unsigned int crate( const unsigned int roiWord ); - unsigned int module( const unsigned int roiWord ); - unsigned int chip( const unsigned int roiWord ); - unsigned int localcoord( const unsigned int roiWord ); + virtual CoordinateRange coordinate( const unsigned int roiWord ) const override; + unsigned int crate( const unsigned int roiWord ) const; + unsigned int module( const unsigned int roiWord ) const; + unsigned int chip( const unsigned int roiWord ) const; + unsigned int localcoord( const unsigned int roiWord ) const; /** Thresholds passed (Run 1 RoIs) */ - const std::vector< unsigned int >& thresholdsPassed( const unsigned int word ); + const std::vector< unsigned int > thresholdsPassed( const unsigned int word ) const; /** ET and Isolation information (Run 2 RoIs) */ - unsigned int et( const unsigned int roiWord ); - unsigned int isolationWord( const unsigned int roiWord ); - - protected: - /** get information from CP RoI word and store in member variables. */ - void decodeWord( const unsigned int word ); - - private: - unsigned int m_cpm; - unsigned int m_cp; - unsigned int m_lc; - + unsigned int et( const unsigned int roiWord ) const; + unsigned int isolationWord( const unsigned int roiWord ) const; }; // class CPRoIDecoder } // namespace LVL1 diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/JEPRoIDecoder.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/JEPRoIDecoder.h index e90fb62c1728..0969e074d926 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/JEPRoIDecoder.h +++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/JEPRoIDecoder.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /*************************************************************************** JEPRoIDecoder.h - description @@ -37,85 +37,63 @@ namespace LVL1 { unsigned int jetRoIVersion( unsigned int word ) const; /** Return eta/phi coordinate object */ - CoordinateRange coordinate( const unsigned int roiWord ); + virtual CoordinateRange coordinate( const unsigned int roiWord ) const override; /** Return hardware coordinates */ - unsigned int crate( const unsigned int word ); - unsigned int module( const unsigned int word ); - unsigned int row( const unsigned int word ); - unsigned int column( const unsigned int word ); + unsigned int crate( const unsigned int word ) const; + unsigned int module( const unsigned int word ) const; + unsigned int row( const unsigned int word ) const; + unsigned int column( const unsigned int word ) const; /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - const std::vector< unsigned int >& thresholdsPassed( const unsigned int word ); - std::vector<unsigned int>& fwdThresholdsPassed( const unsigned int word ); + const std::vector< unsigned int > thresholdsPassed( const unsigned int word ) const; + const std::vector<unsigned int> fwdThresholdsPassed( const unsigned int word ) const; /** Return ET values from Run 2 Jet RoIs */ - unsigned int etLarge( const unsigned int word ); - unsigned int etSmall( const unsigned int word ); + unsigned int etLarge( const unsigned int word ) const; + unsigned int etSmall( const unsigned int word ) const; /** returns the (signed) Ex energy projection. If the RoIWord looks invalid, then zero will be returned. */ - int energyX( unsigned int energyRoIWord0 ); + int energyX( unsigned int energyRoIWord0 ) const; /** returns the (signed) Ex energy projection. If the RoIWord looks invalid, then zero will be returned. */ - int energyY( unsigned int energyRoIWord1 ); + int energyY( unsigned int energyRoIWord1 ) const; /** returns the (signed) Ex energy projection. If the RoIWord looks invalid, then zero will be returned. */ - int energyT( unsigned int energyRoIWord2 ); + int energyT( unsigned int energyRoIWord2 ) const; /** returns overflow flag energy RoIWord */ - bool energyOverflow( unsigned int energyRoIWord ); + bool energyOverflow( unsigned int energyRoIWord ) const; /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& mEtSigThresholdsPassed( const unsigned int energyRoIWord0 ); + std::vector<unsigned int> mEtSigThresholdsPassed( const unsigned int energyRoIWord0 ) const; /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& etSumThresholdsPassed( const unsigned int energyRoIWord1 ); + std::vector<unsigned int> etSumThresholdsPassed( const unsigned int energyRoIWord1 ) const; /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& etMissThresholdsPassed( const unsigned int energyRoIWord2 ); + std::vector<unsigned int> etMissThresholdsPassed( const unsigned int energyRoIWord2 ) const; /** returns true if thresh is passed*/ - bool mEtSigThresholdPassed( const unsigned int energyRoIWord0, const unsigned int thresh ); + bool mEtSigThresholdPassed( const unsigned int energyRoIWord0, const unsigned int thresh ) const; /** returns true if thresh is passed*/ - bool sumEtThresholdPassed( const unsigned int energyRoIWord1, const unsigned int thresh ); + bool sumEtThresholdPassed( const unsigned int energyRoIWord1, const unsigned int thresh ) const; /** returns true if thresh is passed*/ - bool etMissThresholdPassed( const unsigned int energyRoIWord2, const unsigned int thresh ); + bool etMissThresholdPassed( const unsigned int energyRoIWord2, const unsigned int thresh ) const; - protected: - /** get information from Jet RoI word and store in member variables. */ - void decodeWord( const unsigned int word ); - /** No descriptions */ - void decodeEnergyWord0( const unsigned int energyRoIWord0 ); - /** No descriptions */ - void decodeEnergyWord1( const unsigned int energyRoIWord1 ); - /** No descriptions */ - void decodeEnergyWord2( const unsigned int energyRoIWord2 ); + private: + unsigned int mEtSigThresholdsFlags( const unsigned int energyRoIWord0 ) const; + unsigned int sumEtThresholdsFlags( const unsigned int energyRoIWord1 ) const; + unsigned int missEtThresholdsFlags( const unsigned int energyRoIWord1 ) const; + /** No descriptions */ int decodeEnergyComponent( const unsigned int energyRoIWord ) const; - private: /** return a CoordinateRange for the JEMs coving -2.4<eta<2.4 */ - CoordinateRange midJEMCoordinate() const; + CoordinateRange midJEMCoordinate(const unsigned int jem, const unsigned int roiWord) const; /** returns a CoordinateRange for the end JEMs, i.e. 2.4<eta<4.9 */ - CoordinateRange leftEndJEMCoordinate() const; + CoordinateRange leftEndJEMCoordinate(const unsigned int jem, const unsigned int roiWord) const; /** returns a CoordinateRange for the end JEMs, i.e. 2.4<eta<4.9 */ - CoordinateRange rightEndJEMCoordinate() const; + CoordinateRange rightEndJEMCoordinate(const unsigned int jem, const unsigned int roiWord) const; /** set phi coords for Jet RoI */ - void setPhiCoords( double& phiMin, double& phiMax ) const; - - unsigned int m_fwdThresholdsPassed; - unsigned int m_jem; - unsigned int m_row; - unsigned int m_col; - unsigned int m_mEtSigThresholdsPassed; - unsigned int m_sumEtThresholdsPassed; - unsigned int m_missEtThresholdsPassed; - unsigned int m_etLarge; - unsigned int m_etSmall; - int m_ex; - int m_ey; - int m_et; - std::vector<unsigned int> m_mEtSigThreshPassedVec; - std::vector<unsigned int> m_sumEtThreshPassedVec; - std::vector<unsigned int> m_missEtThreshPassedVec; - std::vector<unsigned int> m_fwdThreshPassedVec; - + void setPhiCoords( const unsigned int jem, const unsigned int roiWord, + double& phiMin, double& phiMax ) const; }; // class JEPRoIDecoder } // namespace LVL1 diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/RoIDecoder.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/RoIDecoder.h index 6535cbb9314a..ac8810af827e 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/RoIDecoder.h +++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/RoIDecoder.h @@ -1,7 +1,7 @@ // Dear emacs, this is -*- c++ -*- // $Id: RoIDecoder.h 187728 2009-05-27 16:18:06Z krasznaa $ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /*************************************************************************** RoIDecoder.h - description @@ -43,31 +43,13 @@ namespace LVL1 { public: RoIDecoder(); virtual ~RoIDecoder(); - virtual CoordinateRange coordinate( const unsigned int word ) = 0; - /** returns the crate associated with the RoI word */ - unsigned int crate( const unsigned int word ); - /** returns a vector containing the numbers of threshold passed i.e. if the - vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - const std::vector< unsigned int >& thresholdsPassed( const unsigned int word ); - /** examines an 32bit RoI word, extracts the RoI type and returns one of: - - CpRoIWordType, - - JetRoIWordType, - - JetEtRoIWordType, - - EnergyRoIWordType*/ - TrigT1CaloDefs::RoIType roiType( unsigned int word ) const; + virtual CoordinateRange coordinate( const unsigned int word ) const = 0; protected: - /** get information from CP RoI word and store in member variables. */ - virtual void decodeWord( const unsigned int word ) = 0; /** returns the value of bits in word between bit "start" and bit "start" + "length" */ unsigned int extractBits( unsigned int word, const unsigned int start, const unsigned int length ) const; - /** print thresholds passed */ - void dumpThresholdsPassed() const; - unsigned int m_crate; - unsigned int m_thresholdsPassed; - std::vector< unsigned int > m_threshPassedVec; bool m_DEBUG; }; // class RoIDecoder diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/CPRoIDecoder.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/CPRoIDecoder.cxx index 476e339c9175..62aa87b74086 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/CPRoIDecoder.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/CPRoIDecoder.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /*************************************************************************** CPRoIDecoder.cxx - description @@ -13,13 +13,13 @@ #include "TrigT1Interfaces/CPRoIDecoder.h" -using namespace std; +using std::cout; +using std::endl; namespace LVL1 { CPRoIDecoder::CPRoIDecoder() - : m_cpm( 0 ), m_cp( 0 ), m_lc( 0 ) { - + { } CPRoIDecoder::~CPRoIDecoder() { @@ -47,9 +47,7 @@ namespace LVL1 { /** Return coordinate information for RoI */ - CoordinateRange CPRoIDecoder::coordinate( const unsigned int roiWord ) { - - decodeWord( roiWord ); + CoordinateRange CPRoIDecoder::coordinate( const unsigned int roiWord ) const { //phi const double cratePhiSize = M_PI / 2.0; @@ -66,27 +64,32 @@ namespace LVL1 { // (where each cell is 0.1x0.1) // so - unsigned int top = ( m_lc & 2 ) >> 1; // top=1, bot=0 - double localCoordEta = ( ( ( m_lc & 4 ) >> 1 ) + ( m_lc & 1 ) ) * localCoordEtaSize; + unsigned int crate = this->crate (roiWord); + unsigned int cpm = this->module (roiWord); + unsigned int cp = this->chip (roiWord); + unsigned int lc = this->localcoord (roiWord); + + unsigned int top = ( lc & 2 ) >> 1; // top=1, bot=0 + double localCoordEta = ( ( ( lc & 4 ) >> 1 ) + ( lc & 1 ) ) * localCoordEtaSize; - double phiMin = ( static_cast< double >( m_crate ) * cratePhiSize ) + - ( static_cast< double >( m_cp ) * fpgaPhiSize ) + ( top * localCoordPhiSize ); - double phiMax = ( static_cast< double >( m_crate ) * cratePhiSize ) + - ( static_cast< double >( m_cp ) * fpgaPhiSize ) + ( top * localCoordPhiSize ) + 2. * localCoordPhiSize; - double etaMin = ( ( static_cast< double >( static_cast< int >( m_cpm ) - 8 ) ) * cpmEtaSize ) + localCoordEta; + double phiMin = ( static_cast< double >( crate ) * cratePhiSize ) + + ( static_cast< double >( cp ) * fpgaPhiSize ) + ( top * localCoordPhiSize ); + double phiMax = ( static_cast< double >( crate ) * cratePhiSize ) + + ( static_cast< double >( cp ) * fpgaPhiSize ) + ( top * localCoordPhiSize ) + 2. * localCoordPhiSize; + double etaMin = ( ( static_cast< double >( static_cast< int >( cpm ) - 8 ) ) * cpmEtaSize ) + localCoordEta; - double etaMax = ( static_cast< double >( static_cast< int >( m_cpm ) - 8 ) * cpmEtaSize ) + localCoordEta + 2. * localCoordEtaSize; + double etaMax = ( static_cast< double >( static_cast< int >( cpm ) - 8 ) * cpmEtaSize ) + localCoordEta + 2. * localCoordEtaSize; if ( RoIDecoder::m_DEBUG ) { cout << "phiMin : " << phiMin << "phiMax : " << phiMax << endl << "etaMin : " << etaMin << "etaMax : " << etaMax << endl << "Phi" << endl << "===" << endl - << "Crate phi min : " << ( m_crate * cratePhiSize ) << " (size: " << ( cratePhiSize ) << ")" << endl - << "CP FPGA phi min : " << ( m_cp * fpgaPhiSize ) << " (size: " << ( fpgaPhiSize ) << ")" << endl + << "Crate phi min : " << ( crate * cratePhiSize ) << " (size: " << ( cratePhiSize ) << ")" << endl + << "CP FPGA phi min : " << ( cp * fpgaPhiSize ) << " (size: " << ( fpgaPhiSize ) << ")" << endl << "Local coord min : " << ( top * localCoordPhiSize ) << " (size: " << ( localCoordPhiSize ) << ")" << endl << "Eta" << endl << "===" << endl - << "CPM eta min : " << ( ( m_cpm - 8 ) * cpmEtaSize ) << " (size: " << ( cpmEtaSize ) << ")" << endl + << "CPM eta min : " << ( ( cpm - 8 ) * cpmEtaSize ) << " (size: " << ( cpmEtaSize ) << ")" << endl << "CP FPGA phi min : " << localCoordEta << " (size: " << ( localCoordEtaSize ) << ")" << endl; } @@ -98,57 +101,35 @@ namespace LVL1 { } /** Decode crate number from RoI word */ - unsigned int CPRoIDecoder::crate( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_crate; + unsigned int CPRoIDecoder::crate( const unsigned int roiWord ) const { + int offset = 0; + if (roiType( roiWord ) == TrigT1CaloDefs::CpRoIWordType) offset = 2; + return extractBits( roiWord, 27+offset, 2 ); } /** Decode module number from RoI word */ - unsigned int CPRoIDecoder::module( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_cpm; + unsigned int CPRoIDecoder::module( const unsigned int roiWord ) const { + int offset = 0; + if (roiType( roiWord ) == TrigT1CaloDefs::CpRoIWordType) offset = 2; + return extractBits( roiWord, 23+offset, 4 ); } /** Decode CP chip number from RoI word */ - unsigned int CPRoIDecoder::chip( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_cp; + unsigned int CPRoIDecoder::chip( const unsigned int roiWord ) const { + int offset = 0; + if (roiType( roiWord ) == TrigT1CaloDefs::CpRoIWordType) offset = 2; + return extractBits( roiWord, 20+offset, 3 ); } /** Decode local coordinate from RoI word */ - unsigned int CPRoIDecoder::localcoord( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_lc; - } - - /** get information from RoI word and store in member variables. */ - void CPRoIDecoder::decodeWord( const unsigned int word ) { - + unsigned int CPRoIDecoder::localcoord( const unsigned int roiWord ) const { int offset = 0; - if (roiType( word ) == TrigT1CaloDefs::CpRoIWordType) offset = 2; - - m_thresholdsPassed = extractBits( word, 1, 16 ); - m_crate = extractBits( word, 27+offset, 2 ); - m_cpm = extractBits( word, 23+offset, 4 ); - m_cp = extractBits( word, 20+offset, 3 ); - m_lc = extractBits( word, 17+offset, 3 ); - - if ( RoIDecoder::m_DEBUG ) { - - cout << "CPRoIDecoder: RoIWord being analysed - " << hex << word << dec << endl; - cout << "Crate : " << m_crate << endl - << "CPM : " << m_cpm << endl - << "CP : " << m_cp << endl - << "LC : " << m_lc << endl; - - } - - return; - + if (roiType( roiWord ) == TrigT1CaloDefs::CpRoIWordType) offset = 2; + return extractBits( roiWord, 17+offset, 3 ); } - + /** Extract cluster ET from Run 2 RoI word */ - unsigned int CPRoIDecoder::et( const unsigned int roiWord ) { + unsigned int CPRoIDecoder::et( const unsigned int roiWord ) const { unsigned int type = roiType( roiWord ); if ( type == TrigT1CaloDefs::EMRoIWordType || type == TrigT1CaloDefs::TauRoIWordType ) @@ -158,7 +139,7 @@ namespace LVL1 { } /** Extract isolation results from Run 2 RoI word */ - unsigned int CPRoIDecoder::isolationWord( const unsigned int roiWord ) { + unsigned int CPRoIDecoder::isolationWord( const unsigned int roiWord ) const { unsigned int type = roiType( roiWord ); if ( type == TrigT1CaloDefs::EMRoIWordType || type == TrigT1CaloDefs::TauRoIWordType ) @@ -169,20 +150,20 @@ namespace LVL1 { /** Override default version by adding a check on Run 1/Run 2*/ - const std::vector<unsigned int>& CPRoIDecoder::thresholdsPassed( const unsigned int word ) { + const std::vector<unsigned int> CPRoIDecoder::thresholdsPassed( const unsigned int word ) const { - m_threshPassedVec.clear(); + std::vector<unsigned int> threshPassedVec; if (roiType(word) == TrigT1CaloDefs::CpRoIWordType) { unsigned int hitmask = word&0xffff; for ( unsigned int thresh = 0; thresh < 16; ++thresh ) { if ( ( 1 << thresh ) & hitmask ) { - m_threshPassedVec.push_back( thresh + 1 ); + threshPassedVec.push_back( thresh + 1 ); } } } - return m_threshPassedVec; + return threshPassedVec; } diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx index 630f3ba0f19f..af29afac4b90 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/JEPRoIDecoder.cxx @@ -15,15 +15,13 @@ #include "TrigT1Interfaces/JEPRoIDecoder.h" #include "TrigT1Interfaces/TrigT1CaloDefs.h" -using namespace std; +using std::cout; +using std::endl; namespace LVL1 { JEPRoIDecoder::JEPRoIDecoder() - : m_fwdThresholdsPassed( 0 ), m_jem( 0 ), m_row( 0 ), m_col( 0 ), - m_mEtSigThresholdsPassed( 0 ), m_sumEtThresholdsPassed( 0 ), m_missEtThresholdsPassed( 0 ), - m_etLarge(0), m_etSmall(0), m_ex( 0 ), m_ey( 0 ), m_et( 0 ) { - + { } JEPRoIDecoder::~JEPRoIDecoder() { @@ -65,141 +63,108 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const { else return 999; } - CoordinateRange JEPRoIDecoder::coordinate( const unsigned int roiWord ) { + CoordinateRange JEPRoIDecoder::coordinate( const unsigned int roiWord ) const { - decodeWord( roiWord ); - unsigned int temp = m_jem % 8; + const unsigned int jem = this->module (roiWord); + unsigned int temp = jem % 8; if ( temp == 0 ){ - return leftEndJEMCoordinate(); + return leftEndJEMCoordinate(jem, roiWord); } else if( temp == 7 ){ - return rightEndJEMCoordinate(); - } else return midJEMCoordinate(); + return rightEndJEMCoordinate(jem, roiWord); + } else return midJEMCoordinate(jem, roiWord); } /** Extract crate number from Jet RoI word */ - unsigned int JEPRoIDecoder::crate( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_crate; + unsigned int JEPRoIDecoder::crate( const unsigned int roiWord ) const { + return extractBits( roiWord, 29, 1 ); } /** Extract module number from Jet RoI word */ - unsigned int JEPRoIDecoder::module( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_jem; + unsigned int JEPRoIDecoder::module( const unsigned int roiWord ) const { + return extractBits( roiWord, 25, 4 ); } /** Extract RoI row number within module from Jet RoI word */ - unsigned int JEPRoIDecoder::row( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_row; + unsigned int JEPRoIDecoder::row( const unsigned int roiWord ) const { + unsigned int rl = extractBits( roiWord, 20, 2 ); + unsigned int frame = extractBits( roiWord, 22, 3 ); + return ( frame & 3 ) * 2 + ( rl >> 1 ); } /** Extract RoI column number within module from Jet RoI word */ - unsigned int JEPRoIDecoder::column( const unsigned int roiWord ) { - decodeWord( roiWord ); - return m_col; + unsigned int JEPRoIDecoder::column( const unsigned int roiWord ) const { + unsigned int rl = extractBits( roiWord, 20, 2 ); + unsigned int frame = extractBits( roiWord, 22, 3 ); + return ( frame >> 2 ) * 2 + ( rl & 1 ); } - /** Override default version by adding a check on Run 1/Run 2*/ - const std::vector<unsigned int>& JEPRoIDecoder::thresholdsPassed( const unsigned int word ) { + /** Check on Run 1/Run 2*/ + const std::vector<unsigned int> JEPRoIDecoder::thresholdsPassed( const unsigned int word ) const { - m_threshPassedVec.clear(); + std::vector<unsigned int> threshPassedVec; if (jetRoIVersion(word) == 1) { - decodeWord( word ); + unsigned int thresholdsPassed = extractBits( word, 1, 8 ); for ( unsigned int thresh = 0; thresh < 16; ++thresh ) { - if ( ( 1 << thresh ) & m_thresholdsPassed ) { - m_threshPassedVec.push_back( thresh + 1 ); + if ( ( 1 << thresh ) & thresholdsPassed ) { + threshPassedVec.push_back( thresh + 1 ); } } } - return m_threshPassedVec; + return threshPassedVec; } /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& JEPRoIDecoder::fwdThresholdsPassed( const unsigned int word ) { + const std::vector<unsigned int> JEPRoIDecoder::fwdThresholdsPassed( const unsigned int word ) const { - m_fwdThreshPassedVec.clear(); + std::vector<unsigned int> fwdThreshPassedVec; if (jetRoIVersion(word) == 1) { - decodeWord( word ); + unsigned int fwdThresholdsPassed = extractBits( word, 9, 4 ); for ( unsigned int thresh = 0; thresh < 4;thresh++ ) { - if ( ( 1 << thresh ) & m_fwdThresholdsPassed ) { - m_fwdThreshPassedVec.push_back( thresh + 1 ); + if ( ( 1 << thresh ) & fwdThresholdsPassed ) { + fwdThreshPassedVec.push_back( thresh + 1 ); } } //endfor } - return m_fwdThreshPassedVec; + return fwdThreshPassedVec; } /** Extract larger cluster ET value from Jet RoI word */ - unsigned int JEPRoIDecoder::etLarge( const unsigned int word ) { + unsigned int JEPRoIDecoder::etLarge( const unsigned int word ) const { if (jetRoIVersion(word) == 1) return 0; - decodeWord( word ); - return m_etLarge; + return extractBits( word, 1, 10 ); } /** Extract smaller cluster ET value from Jet RoI word */ - unsigned int JEPRoIDecoder::etSmall( const unsigned int word ) { + unsigned int JEPRoIDecoder::etSmall( const unsigned int word ) const { if (jetRoIVersion(word) == 1) return 0; - decodeWord( word ); - return m_etSmall; - } - - - /** get information from RoI word and store in member variables. */ - void JEPRoIDecoder::decodeWord( const unsigned int word ) { - - // Run 1 data - m_thresholdsPassed = extractBits( word, 1, 8 ); - m_fwdThresholdsPassed = extractBits( word, 9, 4 ); - - // Run 2 data - m_etLarge = extractBits( word, 1, 10 ); - m_etSmall = extractBits( word, 11, 9 ); - - // Common to both - unsigned int rl = extractBits( word, 20, 2 ); - unsigned int frame = extractBits( word, 22, 3 ); - m_jem = extractBits( word, 25, 4 ); - m_crate = extractBits( word, 29, 1 ); - - m_col = ( frame >> 2 ) * 2 + ( rl & 1 ); - m_row = ( frame & 3 ) * 2 + ( rl >> 1 ); - - - if ( RoIDecoder::m_DEBUG ) { - cout << "JEPRoIDecoder: RoIWord being analysed - " << hex << word << dec << endl; - cout << "Crate : " << m_crate << endl - << "jem : " << m_jem << endl - << "row : " << m_row << endl - << "col : " << m_col << endl; - } //end debug output - - return; + return extractBits( word, 11, 9 ); } /** return a CoordinateRange for the JEMs coving -2.4<eta<2.4 */ - CoordinateRange JEPRoIDecoder::midJEMCoordinate() const { + CoordinateRange JEPRoIDecoder::midJEMCoordinate(const unsigned int jem, + const unsigned int roiWord) const { double phiMin = 0.0; double phiMax = 0.0; - setPhiCoords( phiMin, phiMax ); + setPhiCoords( jem, roiWord, phiMin, phiMax ); //eta const double JEMEtaSize = 0.8; const double jeEtaSize = 0.2; - int etaBin = ( m_jem % 8 ) - 4; //bins range from -4 to +3 - double etaMin = ( etaBin * JEMEtaSize ) + ( jeEtaSize * m_col ); + const unsigned int col = this->column (roiWord); + int etaBin = ( jem % 8 ) - 4; //bins range from -4 to +3 + double etaMin = ( etaBin * JEMEtaSize ) + ( jeEtaSize * col ); double etaMax = etaMin + 2. * jeEtaSize; // there is one nasty "special case" as well @@ -211,14 +176,15 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const { } /** returns a CoordinateRange for the end JEMs, i.e. 2.4<eta<4.9 */ - CoordinateRange JEPRoIDecoder::leftEndJEMCoordinate() const { + CoordinateRange JEPRoIDecoder::leftEndJEMCoordinate(const unsigned int jem, + const unsigned int roiWord) const { double phiMin = 0.0; double phiMax = 0.0; - setPhiCoords( phiMin, phiMax ); + setPhiCoords( jem, roiWord, phiMin, phiMax ); double etaMin = 0.0; double etaMax = 0.0; - switch ( m_col ) { + switch ( this->column (roiWord) ) { case 0: etaMin = -4.9; etaMax = -2.9; break; @@ -238,13 +204,14 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const { } /** returns a CoordinateRange for the end JEMs, i.e. 2.4<eta<4.9 */ - CoordinateRange JEPRoIDecoder::rightEndJEMCoordinate() const { + CoordinateRange JEPRoIDecoder::rightEndJEMCoordinate(const unsigned int jem, + const unsigned int roiWord) const { double phiMin = 0.0; double phiMax = 0.0; - setPhiCoords( phiMin, phiMax ); + setPhiCoords( jem, roiWord, phiMin, phiMax ); double etaMin = 0.0; double etaMax = 0.0; - switch ( m_col ) { + switch ( this->column (roiWord) ) { case 0: etaMin = 2.4; etaMax = 2.9; break; @@ -264,43 +231,44 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const { } /** set phi coords for Jet RoI */ - void JEPRoIDecoder::setPhiCoords( double& phiMin, double& phiMax ) const { + void JEPRoIDecoder::setPhiCoords( const unsigned int jem, const unsigned int roiWord, + double& phiMin, double& phiMax ) const { + + const unsigned int row = this->row (roiWord); + const unsigned int crate = this->crate (roiWord); const double jemPhiSize = M_PI / 2; const double jePhiSize = M_PI / 16; - int crateModifier = ( m_jem / 8 ) * 2; //=0 or 2 - phiMin = ( m_crate + crateModifier ) * jemPhiSize + ( jePhiSize * m_row ); + int crateModifier = ( jem / 8 ) * 2; //=0 or 2 + phiMin = ( crate + crateModifier ) * jemPhiSize + ( jePhiSize * row ); phiMax = phiMin + 2. * jePhiSize; return; } /** returns the (signed) Ex energy projection. If the RoIWord looks invalid, then zero will be returned. */ - int JEPRoIDecoder::energyX( unsigned int energyRoIWord0 ) { + int JEPRoIDecoder::energyX( unsigned int energyRoIWord0 ) const { if ( roiType( energyRoIWord0 ) != TrigT1CaloDefs::EnergyRoIWordType0 ) return 0; // wrong type of word - decodeEnergyWord0( energyRoIWord0 ); - return m_ex; + return decodeEnergyComponent( energyRoIWord0 ); } /** returns the (signed) Ey energy projection. If the RoIWord looks invalid, then zero will be returned. */ - int JEPRoIDecoder::energyY( unsigned int energyRoIWord1 ) { + int JEPRoIDecoder::energyY( unsigned int energyRoIWord1 ) const { if ( roiType( energyRoIWord1 ) != TrigT1CaloDefs::EnergyRoIWordType1 ) return 0; // wrong type of word - decodeEnergyWord1( energyRoIWord1 ); - return m_ey; + return decodeEnergyComponent( energyRoIWord1 ); } /** returns the ETSum value. If the RoIWord looks invalid, then zero will be returned. */ - int JEPRoIDecoder::energyT( unsigned int energyRoIWord2 ) { + int JEPRoIDecoder::energyT( unsigned int energyRoIWord2 ) const { if ( roiType( energyRoIWord2 ) != TrigT1CaloDefs::EnergyRoIWordType2 ) return 0; // wrong type of word - decodeEnergyWord2( energyRoIWord2 ); - return m_et; + return extractBits( energyRoIWord2, 1, 15 ); } /** returns the overflow flag for an Energy RoIWord */ - bool JEPRoIDecoder::energyOverflow( unsigned int energyRoIWord ) { + bool JEPRoIDecoder::energyOverflow( unsigned int energyRoIWord ) const { if ( extractBits( energyRoIWord, 16, 1 ) != 0 ) { return true; @@ -311,86 +279,80 @@ unsigned int LVL1::JEPRoIDecoder::jetRoIVersion( unsigned int word ) const { /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& JEPRoIDecoder::mEtSigThresholdsPassed( const unsigned int energyRoIWord0 ) { + std::vector<unsigned int> JEPRoIDecoder::mEtSigThresholdsPassed( const unsigned int energyRoIWord0 ) const { - m_mEtSigThreshPassedVec.clear(); + std::vector<unsigned int> mEtSigThreshPassedVec; + unsigned int passed = mEtSigThresholdsFlags( energyRoIWord0 ); for ( unsigned int thresh = 0; thresh < TrigT1CaloDefs::numOfMEtSigThresholds; thresh++ ) { - if ( mEtSigThresholdPassed( energyRoIWord0, thresh ) ) { - m_mEtSigThreshPassedVec.push_back( thresh + 1 ); + if ( passed & (1<<thresh)) { + mEtSigThreshPassedVec.push_back( thresh + 1 ); } } //endfor - return m_mEtSigThreshPassedVec; + return mEtSigThreshPassedVec; } /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& JEPRoIDecoder::etSumThresholdsPassed( const unsigned int energyRoIWord1 ) { + std::vector<unsigned int> JEPRoIDecoder::etSumThresholdsPassed( const unsigned int energyRoIWord1 ) const { - m_sumEtThreshPassedVec.clear(); - for ( unsigned int thresh = 0; thresh < TrigT1CaloDefs::numOfSumEtThresholds; thresh++ ) { - if ( sumEtThresholdPassed( energyRoIWord1, thresh ) ) { - m_sumEtThreshPassedVec.push_back( thresh + 1 ); + std::vector<unsigned int> sumEtThreshPassedVec; + unsigned int passed = sumEtThresholdsFlags( energyRoIWord1 ); +for ( unsigned int thresh = 0; thresh < TrigT1CaloDefs::numOfSumEtThresholds; thresh++ ) { + if ( passed & (1<<thresh)) { + sumEtThreshPassedVec.push_back( thresh + 1 ); } } //endfor - return m_sumEtThreshPassedVec; + return sumEtThreshPassedVec; } /** returns a vector containing the numbers of threshold passed i.e. if the vector contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ - std::vector<unsigned int>& JEPRoIDecoder::etMissThresholdsPassed( const unsigned int energyRoIWord2 ) { + std::vector<unsigned int> JEPRoIDecoder::etMissThresholdsPassed( const unsigned int energyRoIWord2 ) const { - m_missEtThreshPassedVec.clear(); + std::vector<unsigned int> missEtThreshPassedVec; + unsigned int passed = missEtThresholdsFlags( energyRoIWord2 ); for ( unsigned int thresh = 0; thresh < TrigT1CaloDefs::numOfMissingEtThresholds; thresh++ ) { - if ( etMissThresholdPassed( energyRoIWord2, thresh ) ) { - m_missEtThreshPassedVec.push_back( thresh + 1 ); + if ( passed & (1<<thresh)) { + missEtThreshPassedVec.push_back( thresh + 1 ); } } //endfor - return m_missEtThreshPassedVec; + return missEtThreshPassedVec; } /** returns true if thresh is passed*/ - bool JEPRoIDecoder::mEtSigThresholdPassed( const unsigned int energyRoIWord0, const unsigned int thresh ) { + bool JEPRoIDecoder::mEtSigThresholdPassed( const unsigned int energyRoIWord0, const unsigned int thresh ) const { - decodeEnergyWord0( energyRoIWord0 ); - return ( ( 1 << thresh ) & m_mEtSigThresholdsPassed ); + return ( ( 1 << thresh ) & mEtSigThresholdsFlags( energyRoIWord0 ) ); } /** returns true if thresh is passed*/ - bool JEPRoIDecoder::sumEtThresholdPassed( const unsigned int energyRoIWord1, const unsigned int thresh ) { + bool JEPRoIDecoder::sumEtThresholdPassed( const unsigned int energyRoIWord1, const unsigned int thresh ) const { - decodeEnergyWord1( energyRoIWord1 ); - return ( ( 1 << thresh ) & m_sumEtThresholdsPassed ); + return ( ( 1 << thresh ) & sumEtThresholdsFlags( energyRoIWord1) ); } /** returns true if thresh is passed*/ - bool JEPRoIDecoder::etMissThresholdPassed( const unsigned int energyRoIWord2, const unsigned int thresh ) { + bool JEPRoIDecoder::etMissThresholdPassed( const unsigned int energyRoIWord2, const unsigned int thresh ) const { - decodeEnergyWord2( energyRoIWord2 ); - return ( ( 1 << thresh ) & m_missEtThresholdsPassed ); + return ( ( 1 << thresh ) & missEtThresholdsFlags( energyRoIWord2 ) ); } - void JEPRoIDecoder::decodeEnergyWord0( const unsigned int energyRoIWord0 ) { + unsigned int JEPRoIDecoder::mEtSigThresholdsFlags( const unsigned int energyRoIWord0 ) const { - m_ex = decodeEnergyComponent( energyRoIWord0 ); - m_mEtSigThresholdsPassed = extractBits( energyRoIWord0, 17, TrigT1CaloDefs::numOfMEtSigThresholds ); - return; + return extractBits( energyRoIWord0, 17, TrigT1CaloDefs::numOfMEtSigThresholds ); } - void JEPRoIDecoder::decodeEnergyWord1( const unsigned int energyRoIWord1 ) { + unsigned int JEPRoIDecoder::sumEtThresholdsFlags( const unsigned int energyRoIWord1 ) const { - m_ey = decodeEnergyComponent( energyRoIWord1 ); - m_sumEtThresholdsPassed = extractBits( energyRoIWord1, 17, TrigT1CaloDefs::numOfSumEtThresholds ); - return; + return extractBits( energyRoIWord1, 17, TrigT1CaloDefs::numOfSumEtThresholds ); } - void JEPRoIDecoder::decodeEnergyWord2( const unsigned int energyRoIWord2 ) { + unsigned int JEPRoIDecoder::missEtThresholdsFlags( const unsigned int energyRoIWord2 ) const { - m_et = extractBits( energyRoIWord2, 1, 15 ); - m_missEtThresholdsPassed = extractBits( energyRoIWord2, 17, TrigT1CaloDefs::numOfMissingEtThresholds ); - return; + return extractBits( energyRoIWord2, 17, TrigT1CaloDefs::numOfMissingEtThresholds ); } int JEPRoIDecoder::decodeEnergyComponent( const unsigned int energyRoIWord ) const { diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/RecEmTauRoI.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/RecEmTauRoI.cxx index b86338e0a390..33c6103289fa 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/RecEmTauRoI.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/RecEmTauRoI.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id: RecEmTauRoI.cxx 796120 2017-02-08 03:20:47Z ssnyder $ /*************************************************************************** @@ -91,7 +91,7 @@ void RecEmTauRoI::constructRun1( m_hadCoreIsolation.clear(); m_thresholdType.clear(); - const vector<unsigned int> &passed_thresholds = + const vector<unsigned int> passed_thresholds = m_decoder->thresholdsPassed(m_roiWord); // diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/RecEnergyRoI.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/RecEnergyRoI.cxx index e6c13aba1412..de77ceb00f5e 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/RecEnergyRoI.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/RecEnergyRoI.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id: RecEnergyRoI.cxx 342657 2011-01-28 23:42:18Z watsona $ /*************************************************************************** @@ -164,11 +164,8 @@ namespace LVL1 { vector< unsigned int >* RecEnergyRoI::etMissThresholdsPassed() const { JEPRoIDecoder get; - vector< unsigned int >* newVec = new std::vector< unsigned int >; - for( vector< unsigned int >::const_iterator i = get.etMissThresholdsPassed( m_roiWord2 ).begin(); - i != get.etMissThresholdsPassed( m_roiWord2 ).end(); ++i ) { - newVec->push_back( *i ); - } + vector< unsigned int >* newVec = new std::vector< unsigned int > + ( get.etMissThresholdsPassed( m_roiWord2 ) ); return newVec; } @@ -177,11 +174,8 @@ namespace LVL1 { vector< unsigned int >* RecEnergyRoI::sumEtThresholdsPassed() const { JEPRoIDecoder get; - vector< unsigned int >* newVec = new std::vector< unsigned int >; - for( vector< unsigned int >::const_iterator i = get.etSumThresholdsPassed( m_roiWord1 ).begin(); - i != get.etSumThresholdsPassed( m_roiWord1 ).end(); ++i ) { - newVec->push_back( *i ); - } + vector< unsigned int >* newVec = new std::vector< unsigned int > + ( get.etSumThresholdsPassed( m_roiWord1 ) ); return newVec; } @@ -190,11 +184,8 @@ namespace LVL1 { vector< unsigned int >* RecEnergyRoI::mEtSigThresholdsPassed() const { JEPRoIDecoder get; - vector< unsigned int >* newVec = new std::vector< unsigned int >; - for( vector< unsigned int >::const_iterator i = get.mEtSigThresholdsPassed( m_roiWord0 ).begin(); - i != get.mEtSigThresholdsPassed( m_roiWord0 ).end(); ++i ) { - newVec->push_back( *i ); - } + vector< unsigned int >* newVec = new std::vector< unsigned int > + (get.mEtSigThresholdsPassed( m_roiWord0 )); return newVec; } diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/RecJetRoI.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/RecJetRoI.cxx index c4d5d6466171..7cf57a9c7361 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/RecJetRoI.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/RecJetRoI.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id: RecJetRoI.cxx 796120 2017-02-08 03:20:47Z ssnyder $ /*************************************************************************** @@ -96,7 +96,7 @@ void RecJetRoI::constructRun1( // // Extract the properties of the passed thresholds: // - const vector<unsigned int> &passed_thresholds = + const vector<unsigned int> passed_thresholds = (this->isForwardJet() ? m_decoder->fwdThresholdsPassed(m_roiWord) : m_decoder->thresholdsPassed(m_roiWord)); diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/RoIDecoder.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/RoIDecoder.cxx index fa19e6fa58d7..3dff53cade6c 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/RoIDecoder.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/RoIDecoder.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ // $Id: RoIDecoder.cxx 187728 2009-05-27 16:18:06Z krasznaa $ /*************************************************************************** @@ -22,7 +22,7 @@ #include <iostream> LVL1::RoIDecoder::RoIDecoder(): - m_crate( 0 ), m_thresholdsPassed( 0 ), m_DEBUG( false ) { + m_DEBUG( false ) { } @@ -48,69 +48,3 @@ unsigned int LVL1::RoIDecoder::extractBits( unsigned int word, const unsigned in return ( word & bitmask ); // return only bits in bitmask } -/** print thresholds passed */ -void LVL1::RoIDecoder::dumpThresholdsPassed() const{ - - for( unsigned int thresh = 0; thresh < 16; ++thresh ) { - if( ( 1 << thresh ) & m_thresholdsPassed ) { - std::cout << "Threshold " << ( thresh + 1 ) << " : passed" << std::endl; - } - } - return; -} - -/** returns the crate associated with the RoI word */ -unsigned int LVL1::RoIDecoder::crate( const unsigned int word ){ - decodeWord(word); - return m_crate; -} - -/** returns a vector containing the numbers of threshold passed i.e. if the vector - contains 1,3,5 it means that this RoI passed thresholds 1,3 and 5.*/ -const std::vector< unsigned int >& LVL1::RoIDecoder::thresholdsPassed( const unsigned int word ) { - - decodeWord( word ); - m_threshPassedVec.clear(); - for( unsigned int thresh = 0; thresh < 16; ++thresh ){ - if( ( 1 << thresh ) & m_thresholdsPassed ) { - m_threshPassedVec.push_back( thresh + 1 ); - } - } - return m_threshPassedVec; -} - -/** examines an 32bit RoI word, extracts the RoI type and returns it*/ -LVL1::TrigT1CaloDefs::RoIType LVL1::RoIDecoder::roiType( unsigned int word ) const{ - unsigned int temp=extractBits(word, 31, 2); - if (temp == TrigT1CaloDefs::cpRoIType) { - return TrigT1CaloDefs::CpRoIWordType; - } - else if (temp == TrigT1CaloDefs::jetRoIType) { - unsigned int temp2 = extractBits(word, 30, 1); - if (temp2 == TrigT1CaloDefs::jetRoI) { - return TrigT1CaloDefs::JetRoIWordType; - } - else if (temp2 == TrigT1CaloDefs::jetEtRoI) { - return TrigT1CaloDefs::JetEtRoIWordType; - } - else { - return TrigT1CaloDefs::RoIWordTypeError; - } - } - else if (temp == TrigT1CaloDefs::energyRoIType) { - unsigned int temp2 = extractBits(word, 29, 2); - if (temp2 == TrigT1CaloDefs::energyRoI0) { - return TrigT1CaloDefs::EnergyRoIWordType0; - } - else if (temp2 == TrigT1CaloDefs::energyRoI1) { - return TrigT1CaloDefs::EnergyRoIWordType1; - } - else if (temp2 == TrigT1CaloDefs::energyRoI2) { - return TrigT1CaloDefs::EnergyRoIWordType2; - } - else { - return TrigT1CaloDefs::RoIWordTypeError; - } - } - return TrigT1CaloDefs::RoIWordTypeError; -} -- GitLab From 05045a16c36f65aa51bf3cc16d12f6b71d01a572 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Sat, 16 Mar 2019 23:06:59 +0100 Subject: [PATCH 061/163] GeneratorObjects: Fix a couple more HepMcParticleLink issues. Fix potential infinite loop in looking up event container. Treat barcode of 0x7fffffff as null. --- Generators/GeneratorObjects/src/HepMcParticleLink.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Generators/GeneratorObjects/src/HepMcParticleLink.cxx b/Generators/GeneratorObjects/src/HepMcParticleLink.cxx index bbbdc2afb3f8..42d20ddc2f2b 100644 --- a/Generators/GeneratorObjects/src/HepMcParticleLink.cxx +++ b/Generators/GeneratorObjects/src/HepMcParticleLink.cxx @@ -233,7 +233,7 @@ HepMcParticleLink::index_type HepMcParticleLink::eventIndex() const m_extBarcode.eventIndex (index, position); if (index == ExtendedBarCode::UNDEFINED) { // Don't trip the assertion for a null link. - if (barcode() == 0) return 0; + if (barcode() == 0 || barcode() == 0x7fffffff) return 0; cptr(); m_extBarcode.eventIndex (index, position); assert (index != ExtendedBarCode::UNDEFINED); @@ -326,8 +326,8 @@ SG::DataProxy* HepMcParticleLink::find_proxy (const IProxyDict* sg) const EBC_EVCOLL evColl = getEventCollection(); assert (evColl < EBC_NCOLLKINDS); unsigned int hint_orig = s_hints[evColl]; + if (hint_orig >= NKEYS) hint_orig = 0; unsigned int hint = hint_orig; - if (hint >= NKEYS) hint = 0; do { SG::DataProxy* proxy = sg->proxy (clid, s_keys[evColl][hint]); if (proxy) { -- GitLab From aabb6060b8873af5593024d5e1f6d2189db246d2 Mon Sep 17 00:00:00 2001 From: Susumu Oda <susumu.oda@cern.ch> Date: Sun, 17 Mar 2019 15:43:19 +0100 Subject: [PATCH 062/163] Make 'const static' 'static const' --- .../SCT_CalibAlgs/src/SCT_CalibHitmapTool.cxx | 6 ++-- .../SCT_CalibAlgs/src/SCT_CalibHvTool.cxx | 4 +-- .../SCT_GeoModel/SCT_ComponentFactory.h | 2 +- .../SCT_Monitoring/SCTMotherTrigMonTool.h | 2 +- .../TrigFTK/TrigFTKSim/TrigFTKSim/FTKRawHit.h | 32 +++++++++---------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHitmapTool.cxx b/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHitmapTool.cxx index d3ee38ea9e5a..2289686944e7 100644 --- a/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHitmapTool.cxx +++ b/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHitmapTool.cxx @@ -30,9 +30,9 @@ using namespace std; using namespace SCT_CalibAlgs; -const static string pathRoot{"/HitMaps/"}; -const static string detectorNames[]{"negativeEndcap", "barrel", "positiveEndcap"}; -const static string detectorPaths[]{"SCTEC/", "SCTB/","SCTEA/"}; +static const string pathRoot{"/HitMaps/"}; +static const string detectorNames[]{"negativeEndcap", "barrel", "positiveEndcap"}; +static const string detectorPaths[]{"SCTEC/", "SCTB/","SCTEA/"}; SCT_CalibHitmapTool::SCT_CalibHitmapTool(const std::string& type, const std::string& name, const IInterface* parent): base_class(type, name, parent), diff --git a/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHvTool.cxx b/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHvTool.cxx index 1239b093f586..6865c698e467 100644 --- a/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHvTool.cxx +++ b/InnerDetector/InDetCalibAlgs/SCT_CalibAlgs/src/SCT_CalibHvTool.cxx @@ -18,9 +18,9 @@ using namespace std; using namespace SCT_CalibAlgs; -const static string detectorNames[]{"negativeEndcap", "barrel", "positiveEndcap"}; +static const string detectorNames[]{"negativeEndcap", "barrel", "positiveEndcap"}; -const static string detectorPaths[]{"SCTEC/", "SCTB/","SCTEA/"}; +static const string detectorPaths[]{"SCTEC/", "SCTB/","SCTEA/"}; namespace { void initQueue(std::queue<int>& q, const int numvals, const int setval) { diff --git a/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_ComponentFactory.h b/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_ComponentFactory.h index cb3a123995b9..0886db0c5aff 100644 --- a/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_ComponentFactory.h +++ b/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_ComponentFactory.h @@ -40,7 +40,7 @@ protected: private: std::string m_name; - const static double s_epsilon; + static const double s_epsilon; }; diff --git a/InnerDetector/InDetMonitoring/SCT_Monitoring/SCT_Monitoring/SCTMotherTrigMonTool.h b/InnerDetector/InDetMonitoring/SCT_Monitoring/SCT_Monitoring/SCTMotherTrigMonTool.h index d889f703a425..58fda5162473 100644 --- a/InnerDetector/InDetMonitoring/SCT_Monitoring/SCT_Monitoring/SCTMotherTrigMonTool.h +++ b/InnerDetector/InDetMonitoring/SCT_Monitoring/SCT_Monitoring/SCTMotherTrigMonTool.h @@ -50,7 +50,7 @@ protected: ///Check if the event passes L1 item bool isCalibrationNoise(const std::string& L1_Item); ///Abbreviations for level 1 trigger types - const static std::string m_triggerNames[8]; + static const std::string m_triggerNames[8]; ///Format and output (INFO msg level) the fired triggers StatusCode printTriggers() const; //@deprecated improper camel casing on old method diff --git a/Trigger/TrigFTK/TrigFTKSim/TrigFTKSim/FTKRawHit.h b/Trigger/TrigFTK/TrigFTKSim/TrigFTKSim/FTKRawHit.h index f00fd372ec4c..1e68d8cf5a25 100644 --- a/Trigger/TrigFTK/TrigFTKSim/TrigFTKSim/FTKRawHit.h +++ b/Trigger/TrigFTK/TrigFTKSim/TrigFTKSim/FTKRawHit.h @@ -229,22 +229,22 @@ public: friend std::istream& clusterC( std::istream & , FTKRawHit& ); // These are now public because they are needed by FTKHit and FTKCoord - const static int row_coord_mask = 0x00000FFF; ///< Bitmask marking the location of the row coordinate in m_hw_word for pixel(12 bits) - const static int phi_width_mask = 0x00007000; ///< Bitmask marking the location of the row width in m_hw_word for pixel(3 bits) - const static int split_mask = 0x00008000; ///< Bitmask marking the location of the split cluster flag in m_hw_word for pixel(1 bit) - const static int column_coord_mask = 0x0FFF0000; ///< Bitmask marking the location of the column coordinate in m_hw_word for pixel(12 bits) - const static int eta_width_mask = 0x70000000; ///< Bitmask marking the location of the column width in m_hw_word for pixel(3 bits) - - const static int row_coord_bit = 0; ///< Starting bit of row coordinate in m_hw_word for pixel - const static int phi_width_bit = 12; ///< Starting bit of row width in m_hw_word for pixel - const static int split_bit = 15; ///< Bit for the split cluster flag in m_hw_word for pixel - const static int column_coord_bit = 16; ///< Starting bit of column coordinate in m_hw_word for pixel - const static int eta_width_bit = 28; ///< Starting bit of column width in m_hw_word for pixel - - const static int strip_coord_mask = 0x07FF; ///< Bitmask marking the location of the strip coordinate in m_hw_word for SCT (3 bits) - const static int strip_coord_bit = 0; ///< Starting bit of strip coordinate in m_hw_word for SCT - const static int strip_width_mask = 0x7000; ///< Bitmask marking the location of the strip width in m_hw_word for SCT (3 bits) - const static int strip_width_bit = 12; ///< Starting bit of strip width in m_hw_word for SCT + static const int row_coord_mask = 0x00000FFF; ///< Bitmask marking the location of the row coordinate in m_hw_word for pixel(12 bits) + static const int phi_width_mask = 0x00007000; ///< Bitmask marking the location of the row width in m_hw_word for pixel(3 bits) + static const int split_mask = 0x00008000; ///< Bitmask marking the location of the split cluster flag in m_hw_word for pixel(1 bit) + static const int column_coord_mask = 0x0FFF0000; ///< Bitmask marking the location of the column coordinate in m_hw_word for pixel(12 bits) + static const int eta_width_mask = 0x70000000; ///< Bitmask marking the location of the column width in m_hw_word for pixel(3 bits) + + static const int row_coord_bit = 0; ///< Starting bit of row coordinate in m_hw_word for pixel + static const int phi_width_bit = 12; ///< Starting bit of row width in m_hw_word for pixel + static const int split_bit = 15; ///< Bit for the split cluster flag in m_hw_word for pixel + static const int column_coord_bit = 16; ///< Starting bit of column coordinate in m_hw_word for pixel + static const int eta_width_bit = 28; ///< Starting bit of column width in m_hw_word for pixel + + static const int strip_coord_mask = 0x07FF; ///< Bitmask marking the location of the strip coordinate in m_hw_word for SCT (3 bits) + static const int strip_coord_bit = 0; ///< Starting bit of strip coordinate in m_hw_word for SCT + static const int strip_width_mask = 0x7000; ///< Bitmask marking the location of the strip width in m_hw_word for SCT (3 bits) + static const int strip_width_bit = 12; ///< Starting bit of strip width in m_hw_word for SCT const float SCT_row_scaling = 2.; const float PIX_row_scaling = 8.; -- GitLab From aa62fef83ec2a79c0305479ee62bf6b9698c66ed Mon Sep 17 00:00:00 2001 From: Frank Winklmeier <frank.winklmeier@cern.ch> Date: Mon, 18 Mar 2019 08:43:05 +0000 Subject: [PATCH 063/163] Revert "Merge branch 'remove_old_calo' into 'master'" This reverts merge request !21910 --- .../TrigT2CaloCosmic/CMakeLists.txt | 33 + .../TrigT2CaloCosmic/CosmicHadEnFex.h | 47 + .../TrigT2CaloCosmic/CosmicSamp2Fex.h | 73 + .../TrigT2CaloCosmic/T2CaloCosmic.h | 77 + .../python/TrigT2CaloCosmicConfig.py | 91 + .../TrigT2CaloCosmic/python/__init__.py | 6 + .../TrigT2CaloCosmic/src/CosmicHadEnFex.cxx | 181 ++ .../TrigT2CaloCosmic/src/CosmicSamp2Fex.cxx | 184 ++ .../TrigT2CaloCosmic/src/T2CaloCosmic.cxx | 270 +++ .../components/TrigT2CaloCosmic_entries.cxx | 16 + .../TrigT2CaloJet/CMakeLists.txt | 57 + .../TrigT2CaloJet/EtaPhiSampleHash.h | 69 + .../TrigT2CaloJet/GridsHandler.h | 42 + .../TrigT2CaloJet/HashedTrig3Momentum.h | 39 + .../TrigT2CaloJet/T2AllRoiUnpacking.h | 233 +++ .../TrigT2CaloJet/T2CaloFastJet.h | 148 ++ .../TrigT2CaloJet/TrigT2CaloJet/T2CaloJet.h | 97 ++ .../TrigT2CaloJet/T2CaloJetBaseTool.h | 58 + .../TrigT2CaloJet/T2CaloJetCalibTool.h | 77 + .../TrigT2CaloJet/T2CaloJetConeTool.h | 77 + .../TrigT2CaloJet/T2CaloJetGridFromCells.h | 118 ++ .../T2CaloJetGridFromFEBHeader.h | 87 + .../TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h | 46 + .../TrigT2CaloJet/T2L1CaloFullScanJet.h | 95 + .../TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJet.h | 82 + .../TrigT2CaloJet/T2L1CaloJetCalibTool.h | 68 + .../T2L1CaloJetFullScanBaseTool.h | 54 + .../T2L1CaloJetFullScanFastJetTool.h | 128 ++ .../TrigT2CaloJet/TrigT2CaloJet/T2L1Tools.h | 136 ++ .../TrigT2CaloJet/T2L1ToolsDict.h | 10 + .../TrigT2CaloJet/T2L1TowerCalibTool.h | 69 + .../TrigT2CaloJet/T2L1Unpacking.h | 116 ++ .../TrigT2CaloJet/Trig3MomentumMerger.h | 33 + .../TrigT2CaloJet/TrigT2CaloJet/selection.xml | 3 + .../python/CalibrationFactorsL15.py | 126 ++ .../python/TrigT2CaloJetConfig.py | 1541 +++++++++++++++++ .../python/TrigT2CaloJetMonitoring.py | 630 +++++++ .../share/jobOfragment_TrigT2CaloJet.py | 139 ++ .../jobOfragment_TrigT2CaloJet_RomeCalib.py | 181 ++ .../TrigT2CaloJet/src/EtaPhiSampleHash.cxx | 84 + .../TrigT2CaloJet/src/GridsHandler.cxx | 72 + .../TrigT2CaloJet/src/HashedTrig3Momentum.cxx | 55 + .../TrigT2CaloJet/src/T2AllRoiUnpacking.cxx | 496 ++++++ .../TrigT2CaloJet/src/T2CaloFastJet.cxx | 824 +++++++++ .../TrigT2CaloJet/src/T2CaloJet.cxx | 491 ++++++ .../TrigT2CaloJet/src/T2CaloJetBaseTool.cxx | 61 + .../TrigT2CaloJet/src/T2CaloJetCalibTool.cxx | 422 +++++ .../TrigT2CaloJet/src/T2CaloJetConeTool.cxx | 352 ++++ .../src/T2CaloJetGridFromCells.cxx | 443 +++++ .../src/T2CaloJetGridFromFEBHeader.cxx | 381 ++++ .../src/T2CaloJetGridFromLvl1Ppr.cxx | 92 + .../TrigT2CaloJet/src/T2L1CaloFullScanJet.cxx | 322 ++++ .../TrigT2CaloJet/src/T2L1CaloJet.cxx | 371 ++++ .../src/T2L1CaloJetCalibTool.cxx | 236 +++ .../src/T2L1CaloJetFullScanBaseTool.cxx | 57 + .../src/T2L1CaloJetFullScanFastJetTool.cxx | 568 ++++++ .../TrigT2CaloJet/src/T2L1TowerCalibTool.cxx | 255 +++ .../TrigT2CaloJet/src/T2L1Unpacking.cxx | 649 +++++++ .../TrigT2CaloJet/src/Trig3MomentumMerger.cxx | 140 ++ .../src/components/TrigT2CaloJet_entries.cxx | 35 + .../TrigT2CaloTau/CMakeLists.txt | 42 + .../TrigT2CaloTau/T2CalibrationTau.h | 52 + .../TrigT2CaloTau/TrigT2CaloTau/T2CaloTau.h | 144 ++ .../TrigT2CaloTau/T2CaloTauErrorHandler.h | 25 + .../TrigT2CaloTau/T2CaloTauErrorMon.h | 53 + .../TrigT2CaloTau/TauAllCaloDRFex.h | 90 + .../TrigT2CaloTau/doc/packagedoc.h | 21 + .../python/TrigT2CaloTauConfig.py | 104 ++ .../python/TrigT2CaloTauMonitoring.py | 109 ++ .../TrigT2CaloTau/src/T2CaloTau.cxx | 663 +++++++ .../TrigT2CaloTau/src/TauAllCaloDRFex.cxx | 1186 +++++++++++++ .../src/components/TrigT2CaloTau_entries.cxx | 7 + .../TrigT2CaloTileMon/CMakeLists.txt | 36 + .../TrigT2CaloTileMon/T2CaloTileMon.h | 76 + .../TrigT2CaloTileMon/TileMonHadEnFex.h | 80 + .../TrigT2CaloTileMon/TrigT2TileJet.h | 50 + .../TrigT2CaloTileMon/TrigT2Tower.h | 80 + .../python/TrigT2CaloTileMonConfig.py | 36 + .../TrigT2CaloTileMon/src/T2CaloTileMon.cxx | 156 ++ .../TrigT2CaloTileMon/src/TileMonHadEnFex.cxx | 424 +++++ .../TrigT2CaloTileMon/src/TrigT2TileJet.cxx | 97 ++ .../TrigT2CaloTileMon/src/TrigT2Tower.cxx | 131 ++ .../components/TrigT2CaloTileMon_entries.cxx | 6 + 83 files changed, 15611 insertions(+) create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloCosmic/CMakeLists.txt create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicHadEnFex.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicSamp2Fex.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/T2CaloCosmic.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/TrigT2CaloCosmicConfig.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/__init__.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicHadEnFex.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicSamp2Fex.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/T2CaloCosmic.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/components/TrigT2CaloCosmic_entries.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/CMakeLists.txt create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/EtaPhiSampleHash.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/GridsHandler.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/HashedTrig3Momentum.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2AllRoiUnpacking.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloFastJet.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJet.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetBaseTool.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetCalibTool.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetConeTool.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromCells.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloFullScanJet.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJet.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetCalibTool.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Tools.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1ToolsDict.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1TowerCalibTool.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Unpacking.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/Trig3MomentumMerger.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/selection.xml create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/python/CalibrationFactorsL15.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetConfig.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetMonitoring.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet_RomeCalib.py create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/EtaPhiSampleHash.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/GridsHandler.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/HashedTrig3Momentum.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2AllRoiUnpacking.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloFastJet.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJet.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetBaseTool.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetCalibTool.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetConeTool.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromCells.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromFEBHeader.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromLvl1Ppr.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloFullScanJet.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJet.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetCalibTool.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanBaseTool.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanFastJetTool.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1TowerCalibTool.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1Unpacking.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/Trig3MomentumMerger.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloJet/src/components/TrigT2CaloJet_entries.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTau/CMakeLists.txt create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CalibrationTau.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTau.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorHandler.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorMon.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/TauAllCaloDRFex.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTau/doc/packagedoc.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauConfig.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauMonitoring.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTau/src/T2CaloTau.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTau/src/TauAllCaloDRFex.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTau/src/components/TrigT2CaloTau_entries.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTileMon/CMakeLists.txt create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/T2CaloTileMon.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TileMonHadEnFex.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2TileJet.h create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2Tower.h create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/python/TrigT2CaloTileMonConfig.py create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/T2CaloTileMon.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TileMonHadEnFex.cxx create mode 100755 Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2TileJet.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2Tower.cxx create mode 100644 Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/components/TrigT2CaloTileMon_entries.cxx diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/CMakeLists.txt new file mode 100644 index 000000000000..4991e6f18ca2 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/CMakeLists.txt @@ -0,0 +1,33 @@ +################################################################################ +# Package: TrigT2CaloCosmic +################################################################################ + +# Declare the package name: +atlas_subdir( TrigT2CaloCosmic ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + DetectorDescription/IRegionSelector + GaudiKernel + Trigger/TrigAlgorithms/TrigT2CaloCommon + Trigger/TrigEvent/TrigCaloEvent + Trigger/TrigEvent/TrigSteeringEvent + PRIVATE + Calorimeter/CaloGeoHelpers + Calorimeter/CaloIdentifier + Trigger/TrigT1/TrigT1Interfaces ) + +# Component(s) in the package: +atlas_add_library( TrigT2CaloCosmicLib + src/*.cxx + PUBLIC_HEADERS TrigT2CaloCosmic + LINK_LIBRARIES IRegionSelector GaudiKernel TrigCaloEvent TrigSteeringEvent TrigT2CaloCommonLib + PRIVATE_LINK_LIBRARIES CaloGeoHelpers CaloIdentifier TrigT1Interfaces ) + +atlas_add_component( TrigT2CaloCosmic + src/components/*.cxx + LINK_LIBRARIES IRegionSelector GaudiKernel TrigT2CaloCommonLib TrigCaloEvent TrigSteeringEvent CaloGeoHelpers CaloIdentifier TrigT1Interfaces TrigT2CaloCosmicLib ) + +# Install files from the package: +atlas_install_python_modules( python/*.py ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicHadEnFex.h b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicHadEnFex.h new file mode 100755 index 000000000000..ae55ad0e2196 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicHadEnFex.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: CosmicHadEnFex.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic + + AUTHOR: D.O.Damazio + + PURPOSE: Based on Cluster position defined in the second + EM Calorimeter layer, calculates total Had cluster + energy. + *******************************************************************/ + +#ifndef TRIGT2CALOCOSMIC_COSMICHADENFEX_H +#define TRIGT2CALOCOSMIC_COSMICHADENFEX_H + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "GaudiKernel/AlgTool.h" + +/** Feature extraction Tool for LVL2 Calo. Hadronic EndCaps + and Tile Calorimeter. All Samples */ +class CosmicHadEnFex: public IAlgToolCalo { + public: + /** Constructor */ + CosmicHadEnFex(const std::string & type, const std::string & name, + const IInterface* parent); + /** Destructor */ + virtual ~CosmicHadEnFex(); + /** @brief execute feature extraction for the EM Calorimeter + * second layer + * @param[out] rtrigEmCluster is the output cluster. + * @param[in] eta/phi-min/max = RoI definition. + */ + using IAlgToolCalo::execute; + StatusCode execute(TrigEMCluster &rtrigEmCluster,double etamin, + double etamax, double phimin, double phimax); + private: + float m_THR_1; + float m_THR_2; + +}; + + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicSamp2Fex.h b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicSamp2Fex.h new file mode 100755 index 000000000000..7833b89ca7a9 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/CosmicSamp2Fex.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: CosmicSamp2Fex.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic + + AUTHOR: D.O. Damazio + + PURPOSE: Calculates energy weighted cluster position around + hottest cell in RoI for LAr second layer. + *******************************************************************/ + +#ifndef TRIGT2CALOCOSMIC_CALOSAMP2FEXCOSMIC_H +#define TRIGT2CALOCOSMIC_CALOSAMP2FEXCOSMIC_H + + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "GaudiKernel/AlgTool.h" + +#include "IRegionSelector/IRoiDescriptor.h" + +/** Feature extraction Tool for LVL2 Calo. Second EM Calorimeter sample. */ +class CosmicSamp2Fex: public IAlgToolCalo { + public: + /** Constructor */ + CosmicSamp2Fex(const std::string & type, const std::string & name, + const IInterface* parent); + /** Destructor */ + virtual ~CosmicSamp2Fex(); + /** @brief execute feature extraction for the EM Calorimeter + * second layer + * @param[out] rtrigEmCluster is the output cluster. + * @param[in] eta/phi-min/max = RoI definition. + */ + using IAlgToolCalo::execute; + // StatusCode execute(TrigEMCluster &rtrigEmCluster,double etamin, + // double etamax, double phimin, double phimax); + StatusCode execute(TrigEMCluster &rtrigEmCluster, + const IRoiDescriptor& roi, + const CaloDetDescrElement*& /*caloDDE*/); + + /** Special initialize for Samp2 to include eta as a + trigger timer item monitored parameter. Important + to compare time performance as a function of cluster + position. + */ + StatusCode initialize() { + // Very important to call base class initialize + if ( IAlgToolCalo::initialize().isFailure() ) { + *(new MsgStream(AlgTool::msgSvc(), name())) + << MSG::FATAL + << "Could not init base class IAlgTooCalo" << endmsg; + } + std::string basename(name().substr(25,5)+"."); + if (m_timersvc) { + m_timer[0]->propName(basename+"Eta"); + } + return StatusCode::SUCCESS; + } + + private: + double etaSizeLArEMSamp2(const double eta, const int calo) const; + double phiSizeLArEMSamp2(const double eta, const int calo) const; + float m_THR_1; + float m_THR_2; + +}; + + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/T2CaloCosmic.h b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/T2CaloCosmic.h new file mode 100755 index 000000000000..944639bc7948 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/TrigT2CaloCosmic/T2CaloCosmic.h @@ -0,0 +1,77 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: T2CaloCosmic.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic + + AUTHOR: D.O. Damazio + + PURPOSE: Based on T2CaloBase works as main driver for the LVL2 + Calorimeter Cosmic Algorithm. Receives and decodes LVL1 + information (RoI position), creates the TrigEMCluster to + be the output of LVL2 Calo with extracted features. Call + IAlgToolCalos to perform FEX. + *******************************************************************/ + +#ifndef TRIGT2CALOCOSMIC_T2CALOCOSMIC_H +#define TRIGT2CALOCOSMIC_T2CALOCOSMIC_H + +#include <string> +#include "TrigT2CaloCommon/T2CaloBase.h" + +class IAlgToolCalo; +class T2CaloEgammaMon; +class MsgStream; +class TrigEMCluster; + +/** Main LVL2 Algorithm. Processes LVL1 information, call FEX + IAlgToolCalos and produces the TrigEMCluster output. */ +class T2CaloCosmic: public T2CaloBase { + + + public: + /** Constructor */ + T2CaloCosmic(const std::string & name, ISvcLocator* pSvcLocator); + /** Destructor */ + ~T2CaloCosmic(); + + /** hltExecute will call FEX IAlgToolCalo::execute() to process RoI. + called by the Steering per EMRoI. */ + HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE); + /** hltInitialize. Called by the Steering. */ + HLT::ErrorCode hltInitialize(); + /** hltFinalize. Called by the Steering. */ + HLT::ErrorCode hltFinalize(); + + private: + + /** Monitoring Tool */ + // T2CaloEgammaMon* m_monitoring; + /** To support new monitoring. Values must be copied to + this monitored Cluster for each RoI. */ + const TrigEMCluster* m_monitoredCluster; + /** To monitor rCore */ + float m_rCore; + /** To monitor eRatio */ + float m_eRatio; + /** Forced LVL1 eta */ + float m_l1eta; + /** Forced LVL1 phi */ + float m_l1phi; + + // Properties: + std::string m_trigEmClusterKey; + /** Will monitoring be used or not */ + //bool m_mon; + /** Coordinates to be used by the tools (in order by tool) */ + std::vector<float> m_etamin; + std::vector<float> m_etamax; + std::vector<float> m_phimin; + std::vector<float> m_phimax; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/TrigT2CaloCosmicConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/TrigT2CaloCosmicConfig.py new file mode 100755 index 000000000000..0cae5c1d6b02 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/TrigT2CaloCosmicConfig.py @@ -0,0 +1,91 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + + +from TrigT2CaloCosmic.TrigT2CaloCosmicConf import CosmicSamp2Fex +from TrigT2CaloCosmic.TrigT2CaloCosmicConf import CosmicHadEnFex +from TrigT2CaloCosmic.TrigT2CaloCosmicConf import T2CaloCosmic + +#from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram +#from TrigMonitorBase.TrigGenericMonitoringToolConfig import TrigGenericMonitoringToolConfig + +#from AthenaCommon.Constants import VERBOSE,DEBUG + +class CosmicHadEnFex1(CosmicHadEnFex): + __slots__ = [] + def __init__ (self, name="CosmicHadEnFex1"): + super(CosmicHadEnFex1,self).__init__(name) + self.THR_1=200 + +class CosmicHadEnFex2(CosmicHadEnFex): + __slots__ = [] + def __init__ (self, name="CosmicHadEnFex2"): + super(CosmicHadEnFex2,self).__init__(name) + self.THR_1=200 + +class CosmicSamp2Fex1(CosmicSamp2Fex): + __slots__ = [] + def __init__ (self, name="CosmicSamp2Fex1"): + super(CosmicSamp2Fex1,self).__init__(name) + self.THR_1=420 + +class CosmicSamp2Fex2(CosmicSamp2Fex): + __slots__ = [] + def __init__ (self, name="CosmicSamp2Fex2"): + super(CosmicSamp2Fex2,self).__init__(name) + self.THR_1=420 + + +class T2CaloCosmic_Cosmic (T2CaloCosmic): + __slots__ = [] + def __init__ (self, name="T2CaloCosmic_Cosmic"): + super(T2CaloCosmic_Cosmic, self).__init__(name) + # here put your customizations + self.IAlgToolList= [CosmicHadEnFex1(), + CosmicHadEnFex2(), + CosmicSamp2Fex1(), + CosmicSamp2Fex2()] + #self.EtaMin=[0.2,0,0.2,-1.0] + #self.EtaMax=[ 0.6, 1.0, 0.6, 0] + self.EtaMin=[1.0, 0.1, 0.1, -0.1] + self.EtaMax=[ 2.4, 2.4, 2.4, 2.4 ] + self.PhiMin=[1.3, -1.8, 1.3, -1.8] + self.PhiMax=[1.8, -1.3, 1.8, -1.3] + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.TimerNtuple="T2CaloCosmic.T2CaEgtTot" + self.TrigEMClusterKey="T2CaloCosmic" +# self.Monitoring=False +# self.OutputLevel = DEBUG +# self.AthenaMonTools = [ TrigT2CaloCosmicValMonitoring(), +# TrigT2CaloCosmicOnMonitoring() ] + +class T2CaloCosmic_Cosmic_NoHad (T2CaloCosmic): + __slots__ = [] + def __init__ (self, name="T2CaloCosmic_Cosmic_NoHad"): + super(T2CaloCosmic_Cosmic_NoHad, self).__init__(name) + # here put your customizations + self.IAlgToolList= [CosmicSamp2Fex()] + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.TimerNtuple="T2CaloCosmic.T2CaEgtTot" + self.TrigEMClusterKey="T2CaloTrigEMCluster" +# self.Monitoring=False +# self.OutputLevel = DEBUG +# self.AthenaMonTools = [ TrigT2CaloCosmicValMonitoring(), +# TrigT2CaloCosmicOnMonitoring() ] + +class T2CaloCosmic_Cosmic_NoEm (T2CaloCosmic): + __slots__ = [] + def __init__ (self, name="T2CaloCosmic_Cosmic_NoEm"): + super(T2CaloCosmic_Cosmic_NoEm, self).__init__(name) + # here put your customizations + self.IAlgToolList= [CosmicHadEnFex()] + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.TimerNtuple="T2CaloCosmic.T2CaEgtTot" + self.TrigEMClusterKey="T2CaloTrigEMCluster" +# self.Monitoring=False +# self.OutputLevel = DEBUG +# self.AthenaMonTools = [ TrigT2CaloCosmicValMonitoring(), +# TrigT2CaloCosmicOnMonitoring() ] + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/__init__.py b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/__init__.py new file mode 100755 index 000000000000..0cbf9c602dfc --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/python/__init__.py @@ -0,0 +1,6 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + + +__version__ = "1.0.0" +__author__ = "Denis.Oiveira.Damazio@cern.ch" +__all__ = [ "TrigT2CaloCosmicConfig" ] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicHadEnFex.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicHadEnFex.cxx new file mode 100755 index 000000000000..35192b4467d2 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicHadEnFex.cxx @@ -0,0 +1,181 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: CosmicHadEnFex.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic +// +// AUTHOR: M.P. Casado +// +// REFERENCES: Based on Trigger/TrigT2CaloCosmic/T2EmHadAlgorithm.cxx +// +// ******************************************************************** + +#include "TrigCaloEvent/TrigEMCluster.h" +#include "CaloGeoHelpers/CaloSampling.h" + +#include "TrigT2CaloCosmic/CosmicHadEnFex.h" +#include "TrigT2CaloCommon/Calo_Def.h" + + +CosmicHadEnFex::CosmicHadEnFex(const std::string & type, const std::string & name, + const IInterface* parent): IAlgToolCalo(type, name, parent), + m_THR_1(400),m_THR_2(100) + { + declareProperty("THR_1",m_THR_1); + declareProperty("THR_2",m_THR_2); + //#ifndef NDEBUG +/* + // 1 -> CaloType HAD, 0 -> First Layer + m_geometry[0] = new T2Geometry(1,0); + // 1 -> CaloType HAD, 1 -> Second Layer + m_geometry[1] = new T2Geometry(1,1); + // 1 -> CaloType HAD, 2 -> Third Layer + m_geometry[2] = new T2Geometry(1,2); +*/ +//#endif +} + +CosmicHadEnFex::~CosmicHadEnFex(){ +} + +StatusCode CosmicHadEnFex::execute(TrigEMCluster &rtrigEmCluster,double etamin, + double etamax, double phimin, double phimax){ + + m_lardecoded=false; + m_tiledecoded=false; + // Time total AlgTool time + if (!m_timersvc.empty()) m_timer[0]->start(); + + // MsgStream log(msgSvc(), name()); + if (msgLvl(MSG::DEBUG)) ATH_MSG_DEBUG("in execute(TrigEMCluster &)"); + + double deta = 0.; // eta difference current cell - seed + double dphi = 0.; // phi difference current cell - seed + + CaloSampling::CaloSample samp; + + double energyEta = rtrigEmCluster.eta(); + double energyPhi = rtrigEmCluster.phi(); + rtrigEmCluster.set_ehad1(0.); + + // Dump eta-phi strip ranges into arrays + // Define variables here so that their scope covers both the Tile and HEC loops + // Use arrays of length 3 since there is no samp 0 in the HAD calorimeters + // this avoids wasting memory but makes the code slightly less clear + + // Time Region Selector + if (!m_timersvc.empty()) { + m_timer[1]->start(); + m_timer[1]->pause(); + m_timer[2]->start(); + m_timer[2]->pause(); + m_timer[3]->start(); + m_timer[3]->pause(); + m_timer[4]->start(); + m_timer[4]->pause(); + } + double seedEnergy = 0.; + double seedPhi = 0; + double seedEta = 999.; + + // TILECAL Assuming no knowledge about first sample + + // Time to access RegionSelector + if (!m_timersvc.empty()) m_timer[1]->resume(); + + // Region Selector, no sample needed + // Get detector offline ID's for Collections + m_data->RegionSelector(0,etamin,etamax,phimin,phimax,TILE); + + if (!m_timersvc.empty()) m_timer[1]->pause(); + + for (unsigned int iR=0;iR<m_data->TileContSize();iR++) { + + // Time to access Collection (and ByteStreamCnv ROBs) + if (!m_timersvc.empty()) m_timer[2]->resume(); + // For the first sample you will create the containers + // For the others no + if ( m_data->LoadCollections(m_itBegin,m_itEnd,iR,!iR).isFailure() ) + return StatusCode::FAILURE; + m_tiledecoded=true; + if ( m_saveCells ) IAlgToolCalo::storeCells(); + // Finished to access Collection + if (!m_timersvc.empty()) m_timer[2]->pause(); + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->resume(); + + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { //loop over cells + + //double etaCell = (*m_itt)->eta(); + //double phiCell = (*m_itt)->phi(); + //double energyCell = (*m_itt)->energy(); + if ((*m_itt)->energy() > seedEnergy && (*m_itt)->energy() > m_THR_1) { + seedEnergy = (*m_itt)->energy(); + seedEta = (*m_itt)->eta(); + seedPhi = (*m_itt)->phi(); + } + } + if (!m_timersvc.empty()) m_timer[3]->pause(); + } + energyEta = seedEta; + energyPhi = seedPhi; + rtrigEmCluster.setEta(seedEta); + rtrigEmCluster.setPhi(seedPhi); + rtrigEmCluster.setEnergy(seedEnergy); + rtrigEmCluster.set_ehad1(0.); + rtrigEmCluster.set_e277(999); + rtrigEmCluster.set_e2tsts1(999); + + for (unsigned int iR=0;iR<m_data->TileContSize();iR++) { + + // Time to access Collection (and ByteStreamCnv ROBs) + if (!m_timersvc.empty()) m_timer[2]->resume(); + // For the first sample you will create the containers + // For the others no + if ( m_data->LoadCollections(m_itBegin,m_itEnd,iR,!iR).isFailure() ) + return StatusCode::FAILURE; + // Finished to access Collection + if (!m_timersvc.empty()) m_timer[2]->pause(); + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->resume(); + + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { //loop over cells + + double etaCell = (*m_itt)->eta(); + double phiCell = (*m_itt)->phi(); + double energyCell = (*m_itt)->energy(); + + // find position of current cell w.r.t. seed + deta = fabs( etaCell - energyEta ); + dphi = fabs( phiCell - energyPhi ); + if ( dphi > M_PI ) dphi = 2.* M_PI - dphi; // wrap 0 -> 6.28 + // hadronic measurements: energy sum in 0.1*0.1 + if ( deta <= 0.1 && + dphi <= 0.1 && energyCell>m_THR_2){ + //samp = CaloSampling::getSampling(*(*m_itt)); + samp = (*m_itt)->caloDDE()->getSampling(); + rtrigEmCluster.setEnergy(samp,rtrigEmCluster.energy(samp) + energyCell); + rtrigEmCluster.setRawEnergy(samp,rtrigEmCluster.rawEnergy(samp) + energyCell); + } + + } // end of loop over cells + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->pause(); + + } // End of loop over TileCal drawers + + + // Stop all timers + if (!m_timersvc.empty()){ + m_timer[4]->stop(); + m_timer[3]->stop(); + m_timer[2]->stop(); + m_timer[1]->stop(); + m_timer[0]->stop(); + } + + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicSamp2Fex.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicSamp2Fex.cxx new file mode 100755 index 000000000000..985b61cc1a12 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/CosmicSamp2Fex.cxx @@ -0,0 +1,184 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: CosmicSamp2Fex.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic +// +// AUTHOR: M.P. Casado +// +// +// ******************************************************************** + +#include "CaloIdentifier/LArEM_ID.h" + +#include "TrigCaloEvent/TrigEMCluster.h" +#include "CaloGeoHelpers/CaloSampling.h" + +#include "TrigT2CaloCosmic/CosmicSamp2Fex.h" +#include "TrigT2CaloCommon/Calo_Def.h" + + +CosmicSamp2Fex::CosmicSamp2Fex(const std::string & type, const std::string & name, + const IInterface* parent): IAlgToolCalo(type, name, parent) + { + declareProperty("THR_1",m_THR_1 = 400.0); + declareProperty("THR_2",m_THR_2 = 100.0); + //#ifndef NDEBUG + // Create Geometry object + // 0 -> CaloType EM, 2 -> Second Layer + // m_geometry[0] = new T2Geometry(0,2); + //#endif +} + +CosmicSamp2Fex::~CosmicSamp2Fex(){ +} + +StatusCode CosmicSamp2Fex::execute(TrigEMCluster &rtrigEmCluster, + const IRoiDescriptor& roi, + const CaloDetDescrElement*& /*caloDDE*/) { + + m_lardecoded=false; + m_tiledecoded=false; + // Time total AlgTool time + if (!m_timersvc.empty()) m_timer[0]->start(); + + if (msgLvl(MSG::DEBUG)) + ATH_MSG_DEBUG("in execute(TrigEMCluster&)"); + + // Time to access RegionSelector + if (!m_timersvc.empty()) m_timer[1]->start(); + + // Region Selector, sampling 2 + int sampling = 2; + // Get detector offline ID's for Collections + m_data->RegionSelector(sampling, roi); + + // Finished to access RegionSelector + if (!m_timersvc.empty()) m_timer[1]->stop(); + // Time to access Collection (and ByteStreamCnv ROBs) + if (!m_timersvc.empty()) m_timer[2]->start(); + + if ( m_data->LoadCollections(m_iBegin,m_iEnd).isFailure() ) + return StatusCode::FAILURE; + m_lardecoded=true; + if ( m_saveCells ) IAlgToolCalo::storeCells(); + // Finished to access Collection + if (!m_timersvc.empty()) m_timer[2]->stop(); + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->start(); + + //double energyEta = 0.; + //double energyPhi = 0.; + + // add these variables to take care of phi wrap-around + //double energyNegPhi = 0.; //SRA + //double energyNegPhiConv = 0.; //SRA + //double energyPosPhi = 0.; //SRA + + + // 1. Find seed cell (highest Et in ROI .. layer 2) + // 2. Find Et weighted eta, phi in 3*7 cell (layer 2) (photon + e id) + // 3. Find Et in cells of sizes 3*3, 3*7, 7*7 (layer 2 + strips) + // (3*7 for photon + e id) + // 4. Find cluster width in 3*5 cell, layer 2 (photon id, needs + // parabolic parametrisation) + // 5. Find strip energies and eta (2*5 window) + // 6. Find frac73 (photon id), (E1-E2)/(E1+E2) (e + photon id) + + double seedEnergy = 0.; + double seedPhi = 0.; + double seedEta = 999.; + + //const LArEM_ID* emID = m_larMgr->getEM_ID(); + for(m_it = m_iBegin;m_it != m_iEnd; ++m_it) { + if ((*m_it)->energy() > seedEnergy && (*m_it)->energy() > m_THR_1) { + seedEnergy = (*m_it)->energy(); + seedEta = (*m_it)->eta(); + seedPhi = (*m_it)->phi(); + } + } + + for(m_it = m_iBegin;m_it != m_iEnd; ++m_it) { + + double etaCell = (*m_it)->eta(); + double phiCell = (*m_it)->phi(); + double energyCell = (*m_it)->energy(); + + // find position of current cell w.r.t. seed + float deta = fabs( etaCell - seedEta ); + float dphi = fabs( phiCell - seedPhi ); + if ( dphi > M_PI ) dphi = 2.* M_PI - dphi; // wrap 0 -> 6.28 + // hadronic measurements: energy sum in 0.1*0.1 + if ( deta <= 0.1 && + dphi <= 0.1 && energyCell>m_THR_2){ + //CaloSampling::CaloSample samp = CaloSampling::getSampling(*(*m_it)); + CaloSampling::CaloSample samp = (*m_it)->caloDDE()->getSampling(); + rtrigEmCluster.setEnergy(samp,rtrigEmCluster.energy(samp) + energyCell); + rtrigEmCluster.setRawEnergy(samp,rtrigEmCluster.rawEnergy(samp) + energyCell); + } + } + + //double totalEnergy = 0; + //CaloSampling::CaloSample samp; + + + if (!m_timersvc.empty()) m_timer[3]->stop(); + // Save EMShowerMinimal time + if (!m_timersvc.empty()) m_timer[4]->start(); + + + // Update cluster Variables + + rtrigEmCluster.set_e277(999); + rtrigEmCluster.set_e2tsts1(999); + rtrigEmCluster.setRawEnergy( seedEnergy ); + rtrigEmCluster.setEnergy( seedEnergy ); + rtrigEmCluster.setEta(seedEta); + rtrigEmCluster.setPhi(seedPhi); + rtrigEmCluster.setRawEta(seedEta); + rtrigEmCluster.setRawPhi(seedPhi); + + // Finished save EMShowerMinimal time + if (!m_timersvc.empty()) m_timer[4]->stop(); + + + // Time total AlgTool time + if (!m_timersvc.empty()) m_timer[0]->stop(); + + return StatusCode::SUCCESS; +} + +double CosmicSamp2Fex::etaSizeLArEMSamp2(double cellEta, int calo) const{ + double sizeEta; + if( calo == Calorimeter::EMBAR ){ + if ( fabs(cellEta) < 1.4 ){ + sizeEta = 0.025; + }else{ + sizeEta = 0.075; + } + } else { + if ( fabs(cellEta) < 2.5 ){ + sizeEta = 0.025; + } else{ + sizeEta = 0.1; + } + } + return sizeEta; +} + +double CosmicSamp2Fex::phiSizeLArEMSamp2(double cellEta, int calo) const{ + double sizePhi; + if( calo == Calorimeter::EMBAR ){ + sizePhi = 0.025; + } else { + if ( fabs(cellEta) < 2.5 ){ + sizePhi = 0.025; + } else { + sizePhi = 0.1; + } + } + return sizePhi; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/T2CaloCosmic.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/T2CaloCosmic.cxx new file mode 100755 index 000000000000..ea59fd90b945 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/T2CaloCosmic.cxx @@ -0,0 +1,270 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloCosmic.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloCosmic +// +// AUTHOR: D.O. Damazio +// +// - Add variables for job option controlled region limits, set defaults +// to most likely values. +// - Add function EtaPhiRange to return the maximum and minimum eta or phi +// values to use when calculating energy sums over a region - R. Soluk +// ******************************************************************** + +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IToolSvc.h" +#include "GaudiKernel/StatusCode.h" + +#include "TrigT1Interfaces/RecEmTauRoI.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" +#include "TrigSteeringEvent/PhiHelper.h" + + +#include "TrigCaloEvent/TrigEMClusterContainer.h" + +#include "TrigT2CaloCosmic/T2CaloCosmic.h" +//#include "TrigT2CaloCosmic/T2CaloCosmicMon.h" +#include "TrigT2CaloCommon/IAlgToolCalo.h" + +class ISvcLocator; + +T2CaloCosmic::T2CaloCosmic(const std::string & name, ISvcLocator* pSvcLocator) + : T2CaloBase(name, pSvcLocator) +{ + declareProperty("TrigEMClusterKey",m_trigEmClusterKey = "T2CaloTrigEMCluster"); + declareProperty("L1ForceEta",m_l1eta = -10.0); + declareProperty("L1ForcePhi",m_l1phi = -10.0); + declareProperty("EtaMin",m_etamin); + declareProperty("EtaMax",m_etamax); + declareProperty("PhiMin",m_phimin); + declareProperty("PhiMax",m_phimax); +} + +T2CaloCosmic::~T2CaloCosmic() +{ +} + + +HLT::ErrorCode T2CaloCosmic::hltInitialize() +{ + // Support for new monitoring + declareMonitoredObject("Eta", + m_monitoredCluster,&TrigEMCluster::eta); + declareMonitoredObject("Phi", + m_monitoredCluster,&TrigEMCluster::phi); + declareMonitoredObject("Et", + m_monitoredCluster,&TrigEMCluster::et); + declareMonitoredObject("Had1Et", + m_monitoredCluster,&TrigEMCluster::ehad1); + declareMonitoredObject("weta2", + m_monitoredCluster,&TrigEMCluster::weta2); + // More complicated variables to be monitored + declareMonitoredVariable("Rcore", m_rCore ); + declareMonitoredVariable("Eratio",m_eRatio); + + return HLT::OK; +} + + +HLT::ErrorCode T2CaloCosmic::hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE) +{ + // Time total T2CaloCosmic execution time. + if ( m_timersvc ) m_timer[0]->start(); + + if (msgLvl(MSG::DEBUG)) + ATH_MSG_DEBUG("in execute()"); + + + //bool status = false; + + // Some debug output: + if (msgLvl(MSG::DEBUG)) { + msg (MSG::DEBUG) << "outputTE->getId(): " << outputTE->getId() << endmsg; + + msg(MSG::DEBUG) << "inputTE->getId(): " << inputTE->getId() << endmsg; + } + + const TrigRoiDescriptor* roiDescriptor = 0; + + HLT::ErrorCode hltStatus = getFeature(inputTE, roiDescriptor); + + if ( hltStatus == HLT::OK ) { + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << *roiDescriptor << endmsg; + } else { + msg(MSG::WARNING) << " Failed to find RoiDescriptor " << endmsg; + return hltStatus; + } + + // Some debug output: + + msg(MSG::DEBUG) << "Message to count events. LVL1 phi=" + << roiDescriptor->phi() + << " & LVL1 eta=" + << roiDescriptor->eta() + << endmsg; + + // End LVL1 part + double etamin, etamax, phimin, phimax; + double eta, phi; + + int roiword = roiDescriptor->roiWord(); + + // if ( !m_trustRoiLimits ) { + if ( (m_l1eta<-9.9)&&(m_l1phi<-9.9)){ + eta = roiDescriptor->eta(); + phi = roiDescriptor->phi(); + } + else { + eta = m_l1eta; + phi = HLT::wrapPhi(m_l1phi); + } + + etamin = std::max(-2.5, eta - m_etaWidth); + etamax = std::min( 2.5, eta + m_etaWidth); + phimin = HLT::wrapPhi( phi - m_phiWidth); + phimax = HLT::wrapPhi( phi + m_phiWidth); + + TrigRoiDescriptor* newroi = new TrigRoiDescriptor( eta, etamin, etamax, phi, phimin, phimax ); + attachFeature( outputTE, newroi, "T2CaloCosmic" ); + roiDescriptor = newroi; + + // } + + + + if (msgLvl(MSG::DEBUG)) { + msg(MSG::DEBUG) << " etamin = "<< *roiDescriptor << endmsg; + // (*m_log) << MSG::DEBUG << " etamin = "<< etamin << endmsg; + // (*m_log) << MSG::DEBUG << " etamax = "<< etamax << endmsg; + // (*m_log) << MSG::DEBUG << " phimin = "<< phimin << endmsg; + // (*m_log) << MSG::DEBUG << " phimax = "<< phimax << endmsg; + } + + + if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Making TrigEMCluster "<< endmsg; + + std::vector<xAOD::TrigEMCluster*> vec_clus; + std::cout << "m_emAlgTools.size() = " << m_emAlgTools.size() << std::endl; + // Ok, ignoring LVL1 and forcing a position + int counter=0; + + ToolHandleArray<IAlgToolCalo>::iterator it = m_emAlgTools.begin(); + if ( m_timersvc ) m_timer[1]->start(); + for (; it < m_emAlgTools.end(); it++) { + xAOD::TrigEMCluster* ptrigEmCluster = new xAOD::TrigEMCluster(); + // It is a good idea to clear the energies + for(int i=0;i<MAXSIZE;i++) + ptrigEmCluster->setEnergy((CaloSampling::CaloSample )i,0.); + + // Add RoI word to TrigEMCluster + (*ptrigEmCluster).setRoIword(roiword); + (*ptrigEmCluster).setEta1(10+counter); + etamin=m_etamin[counter]; + etamax=m_etamax[counter]; + phimin=m_phimin[counter]; + phimax=m_phimax[counter]; + // if ((*it)->execute(*ptrigEmCluster,etamin,etamax,phimin,phimax).isFailure() ) { + if ((*it)->execute(*ptrigEmCluster,*roiDescriptor, caloDDENull).isFailure() ) { + ATH_MSG_WARNING("T2Calo AlgToolCosmic returned Failure"); + return HLT::TOOL_FAILURE; + } + // If you do not have any hot cell in top or bottom, stop algo + if ( (counter==0 || counter==1) && (*ptrigEmCluster).energy()==0) + return HLT::OK; + counter++; + vec_clus.push_back(ptrigEmCluster); + } + // support to new monitoring + m_rCore=0; + m_eRatio=0; +/* + if ( ptrigEmCluster->e277()!=0 ) + m_rCore = ptrigEmCluster->e237()/ptrigEmCluster->e277(); + if ( ptrigEmCluster->emaxs1()+ptrigEmCluster->e2tsts1() !=0){ + m_eRatio = ptrigEmCluster->emaxs1()-ptrigEmCluster->e2tsts1(); + m_eRatio /= ptrigEmCluster->emaxs1()+ptrigEmCluster->e2tsts1(); + } +*/ + if ( m_timersvc ) m_timer[1]->stop(); + for(size_t i=0;i<vec_clus.size();i++){ + xAOD::TrigEMCluster* ptrigEmCluster=vec_clus[i]; + + // Print out Cluster produced + msg(MSG::DEBUG) << " Values of Cluster produced: "<< endmsg; + msg(MSG::DEBUG) << " REGTEST: emEnergy = "<< (*ptrigEmCluster).energy() << endmsg; + msg(MSG::DEBUG) << " REGTEST: hadEnergy = "<< (*ptrigEmCluster).ehad1() << endmsg; + msg(MSG::DEBUG) << " REGTEST: rCore = " << ((*ptrigEmCluster).e237() )/ ((*ptrigEmCluster).e277()) << endmsg; + msg(MSG::DEBUG) << " REGTEST: energyRatio = " + << (((*ptrigEmCluster).emaxs1()-(*ptrigEmCluster).e2tsts1())/ + ((*ptrigEmCluster).emaxs1()+(*ptrigEmCluster).e2tsts1())) + << endmsg; + msg(MSG::DEBUG) << " REGTEST: clusterWidth = " << (*ptrigEmCluster).weta2() << endmsg; + msg(MSG::DEBUG) << " REGTEST: frac73 = " << (*ptrigEmCluster).fracs1() << endmsg; + msg(MSG::DEBUG) << " REGTEST: eta = "<< (*ptrigEmCluster).eta() << endmsg; + msg(MSG::DEBUG) << " REGTEST: phi = "<< (*ptrigEmCluster).phi() << endmsg; + msg(MSG::DEBUG) << " REGTEST: roiWord = " << (*ptrigEmCluster).RoIword() << endmsg; + + // Fill monitoring hists: +/* + if (m_mon) + if ( m_monitoring->fillT2CaloCosmicHists(ptrigEmCluster).isFailure() ) + (*m_log) << MSG::DEBUG << " Failled to Monitor" << endmsg; +*/ + + std::string key = ""; + + hltStatus = recordAndAttachFeature(outputTE, ptrigEmCluster, key, "TrigT2CaloCosmic"); + if (hltStatus != HLT::OK){ + if(msgLvl(MSG::DEBUG)) ATH_MSG_ERROR("Write of TrigEMCluster into outputTE failed"); + return hltStatus; + } + } + + // Create a new RoiDescriptor with updated eta and phi. + // Note that the steering will propagate l1Id and roiId automatically + // so no need to set them. +/* + TrigEMCluster* ptrigEmCluster = vec_clus[0]; + TrigRoiDescriptor* newRoiDescriptor = + new TrigRoiDescriptor(roiDescriptor->l1Id(), roiDescriptor->roiId(), + ptrigEmCluster->eta(), ptrigEmCluster->phi()); + + hltStatus = attachFeature(outputTE,newRoiDescriptor,"TrigT2CaloCosmic"); + + if ( hltStatus != HLT::OK ) { + (*m_log) << MSG::ERROR << "Write of update TrigRoiDescriptor into outputTE failed" + << endmsg; + return hltStatus; + } +*/ + +//#ifndef NDEBUG + // (*m_log) << MSG::DEBUG << "Recorded an RoiDescriptor " +// << " phi " << newRoiDescriptor->phi0() +// << " eta " << newRoiDescriptor->eta0() << endmsg; +//#endif + + // Some debug output: + if (msgLvl(MSG::DEBUG)) { + msg(MSG::DEBUG) << "We assume success, set TE with Id " + << outputTE->getId() << " active to signal positive result." + << endmsg; + } + + // Time total T2CaloCosmic execution time. + if ( m_timersvc ) m_timer[0]->stop(); + + return HLT::OK; +} + + +HLT::ErrorCode T2CaloCosmic::hltFinalize(){ + // if ( msgLvl() <= MSG::INFO ) + if (msgLvl(MSG::DEBUG)) ATH_MSG_DEBUG("in finalize()"); + return HLT::OK; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/components/TrigT2CaloCosmic_entries.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/components/TrigT2CaloCosmic_entries.cxx new file mode 100644 index 000000000000..f6ffcb69cfca --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloCosmic/src/components/TrigT2CaloCosmic_entries.cxx @@ -0,0 +1,16 @@ +#include "TrigT2CaloCosmic/T2CaloCosmic.h" +//#include "TrigT2CaloCosmic/T2CaloCosmicMon.h" +//#include "TrigT2CaloCosmic/T2CaloCosmicSamp1.h" +#include "TrigT2CaloCosmic/CosmicSamp2Fex.h" +//#include "TrigT2CaloCosmic/CosmicSamp1Fex.h" +//#include "TrigT2CaloCosmic/CosmicEmEnFex.h" +#include "TrigT2CaloCosmic/CosmicHadEnFex.h" + +DECLARE_COMPONENT( T2CaloCosmic ) +//DECLARE_COMPONENT( T2CaloCosmicSamp1 ) +DECLARE_COMPONENT( CosmicSamp2Fex ) +//DECLARE_COMPONENT( CosmicSamp1Fex ) +//DECLARE_COMPONENT( CosmicEmEnFex ) +DECLARE_COMPONENT( CosmicHadEnFex ) +//DECLARE_COMPONENT( T2CaloCosmicMon ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigT2CaloJet/CMakeLists.txt new file mode 100644 index 000000000000..feea8bb7f8d2 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/CMakeLists.txt @@ -0,0 +1,57 @@ +################################################################################ +# Package: TrigT2CaloJet +################################################################################ + +# Declare the package name: +atlas_subdir( TrigT2CaloJet ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Calorimeter/CaloInterface + Calorimeter/CaloRec + Control/AthContainers + DetectorDescription/IRegionSelector + GaudiKernel + Trigger/TrigAlgorithms/TrigT2CaloCommon + Trigger/TrigEvent/TrigCaloEvent + Trigger/TrigEvent/TrigParticle + Trigger/TrigEvent/TrigSteeringEvent + Trigger/TrigSteer/TrigInterfaces + Trigger/TrigTools/TrigT2CaloCalibration + Trigger/TrigTools/TrigTimeAlgs + PRIVATE + Calorimeter/CaloGeoHelpers + Control/AthenaKernel + Trigger/TrigT1/TrigT1CaloByteStream + Trigger/TrigT1/TrigT1CaloEvent + Trigger/TrigT1/TrigT1CaloToolInterfaces + Trigger/TrigT1/TrigT1Interfaces ) + +# External dependencies: +find_package( Boost COMPONENTS filesystem thread system ) +find_package( FastJet ) +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Component(s) in the package: +atlas_add_library( TrigT2CaloJetLib + src/*.cxx + PUBLIC_HEADERS TrigT2CaloJet + INCLUDE_DIRS ${FASTJET_INCLUDE_DIRS} + PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${FASTJET_LIBRARIES} AthContainers IRegionSelector GaudiKernel TrigCaloEvent TrigParticle TrigSteeringEvent CaloRecLib TrigT2CaloCommonLib TrigInterfacesLib TrigT2CaloCalibrationLib TrigTimeAlgsLib TrigT1CaloEventLib + PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${ROOT_LIBRARIES} CaloGeoHelpers AthenaKernel TrigT1CaloToolInterfaces TrigT1Interfaces ) + +atlas_add_component( TrigT2CaloJet + src/components/*.cxx + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} CaloRecLib AthContainers IRegionSelector GaudiKernel TrigT2CaloCommonLib TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib TrigT2CaloCalibrationLib TrigTimeAlgsLib CaloGeoHelpers AthenaKernel TrigT1CaloEventLib TrigT1CaloToolInterfaces TrigT1Interfaces TrigT2CaloJetLib ) + +atlas_add_dictionary( T2L1ToolsDict + TrigT2CaloJet/T2L1ToolsDict.h + TrigT2CaloJet/selection.xml + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} CaloRecLib AthContainers IRegionSelector GaudiKernel TrigT2CaloCommonLib TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib TrigT2CaloCalibrationLib TrigTimeAlgsLib CaloGeoHelpers AthenaKernel TrigT1CaloEventLib TrigT1CaloToolInterfaces TrigT1Interfaces TrigT2CaloJetLib ) + +# Install files from the package: +atlas_install_python_modules( python/*.py ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/EtaPhiSampleHash.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/EtaPhiSampleHash.h new file mode 100644 index 000000000000..39f6c5b4ba41 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/EtaPhiSampleHash.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include <stdlib.h> +#include <vector> + +#include "TrigCaloEvent/Trig3Momentum.h" // needed for CaloSample (no fwd decl for enum) + +class HashedTrig3Momentum; + + +/*! + @brief Class providing a map hash <--> (eta,phi,CaloSample). + + The function encoding (eta,phi,sample) into an int relies on a given + granularity in (eta,phi). All the points that fall in the same + 'tile' have the same hash. Currently using this with granularity + (eta x phi) = (0.1 x 0.1). Phi values are recorded in [-pi,+pi). Use + 'testEtaPhiSampleHash' to verify that it works also for your + granularity. + + This is the encoding of the 32-bit word (assumes int is 32-bit): + + 31 25 16 15 6 5 0 + +------+----------+----------+-------+ + |unused| phi | eta | sample| + +------+----------+----------+-------+ + + + */ +class EtaPhiSampleHash { +public: + static const u_short kMaxNetaBins = 1024; // 10 bits + static const u_short kMaxNphiBins = 1024; // 10 bits + static const u_short kMaxNsamples = 64; // 6 bits + static const u_int kTenBits = (kMaxNetaBins-1); + static const u_int kSixBits = (kMaxNsamples-1); + // Generalized (i.e. non-int) const must be assigned in the cpp if gcc<4.4 + static const double kMinEta; + static const double kMaxEta; + static const double kMinPhi; + static const double kMaxPhi; + +public: + EtaPhiSampleHash(const u_short &nEtaBins=100 /* 2*5.0/0.1*/, + const u_short &nPhiBins=64 /* 2*pi /0.1*/, + double minEta=kMinEta, double maxEta=kMaxEta, + double minPhi=kMinPhi, double maxPhi=kMaxPhi); + u_int hash(const double &eta, const double &phi, + const CaloSampling::CaloSample &sample) const; + u_int hash(const Trig3Momentum &t3m) const; + u_int hash(const HashedTrig3Momentum &mg) const; + bool etaPhiSample(const u_int &hash, double &eta, double &phi, + CaloSampling::CaloSample &sample) const; +private: + void checkValues(); +private: + double m_minEta; + double m_maxEta; + double m_minPhi; + double m_maxPhi; + double m_dEta; + double m_dPhi; + double m_invDeta; + double m_invDphi; + u_short m_nEtaBins; + u_short m_nPhiBins; +}; diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/GridsHandler.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/GridsHandler.h new file mode 100644 index 000000000000..afb1ae2d65b1 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/GridsHandler.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_GRIDSHANDLER_H +#define TRIGT2CALOJET_GRIDSHANDLER_H + + +/*! + @brief Handles the separate grids for the different calorimeter compartments. + + April 2012 + davide.gerbaudo@gmail.com +*/ + +#include <stdlib.h> +#include <vector> +#include <map> +#include <algorithm> + +#include "TrigCaloEvent/Trig3Momentum.h" + +class HashedTrig3Momentum; + +typedef std::vector< HashedTrig3Momentum > Vmc; +typedef std::map< const CaloSampling::CaloSample, Vmc > CsVmcMap; +typedef std::pair<const CaloSampling::CaloSample, Vmc > CsVmcPair; +typedef std::vector< Trig3Momentum > Vt3m; + +class GridsHandler { + public: + GridsHandler(); + Vmc& grid(const CaloSampling::CaloSample &sample); + void clearAllGrids(); + void appendAllGrids(Vt3m &output) const; + private: + CsVmcMap m_grids; + std::vector< CaloSampling::CaloSample > m_allSamples; +}; + +#endif + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/HashedTrig3Momentum.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/HashedTrig3Momentum.h new file mode 100644 index 000000000000..754cb9326450 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/HashedTrig3Momentum.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_HASHEDTRIG3MOMENTUM_H +#define TRIGT2CALOJET_HASHEDTRIG3MOMENTUM_H + +/*! + @brief Trig3Momentum with a hash; allows to merge energies from several Trig3Momentum. + + Eta and phi positions are computed as a weighted average of the + contributions from different locations in (eta,phi), where the + weight is abs(energy). + + April 2012 + davide.gerbaudo@gmail.com + */ + +#include "TrigCaloEvent/Trig3Momentum.h" + +typedef unsigned short u_short; +typedef unsigned u_int; + +class HashedTrig3Momentum : public Trig3Momentum { + public: + HashedTrig3Momentum(); + HashedTrig3Momentum(const Trig3Momentum &t3m, + const u_int &hash); + u_int hash() const {return m_hash;}; + void addE(const double &eta, const double &phi, const double &energy); + void addE(const Trig3Momentum &t3m); + void reset(); + private: + void updateWeightedCoord(const double &eta, const double &phi, const double &energy); + private: + u_int m_hash; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2AllRoiUnpacking.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2AllRoiUnpacking.h new file mode 100644 index 000000000000..14f644efa823 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2AllRoiUnpacking.h @@ -0,0 +1,233 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2AllRoiUnpacking.h +// PACKAGE: Trigger/TrigAlgorithms/T2AllRoiUnpacking +// +// AUTHOR: gerbaudo@cern.ch +// +// Description: Unpack several L2 calorimeter ROIs and store them in a single output grid. +// Used T2L1Unpacking (by Matthew Tamsett) as a template for this AllTEAlgo. +// Updates: +// Apr2012 (gerbaudo@cern.ch) +// add the option to merge EM cells to a coarser granularity. +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2ALLROIUNPACKING_H +#define TRIGT2CALOJET_T2ALLROIUNPACKING_H + +#include "TrigT2CaloJet/Trig3MomentumMerger.h" +#include "TrigT2CaloJet/T2CaloJetGridFromCells.h" +#include "TrigInterfaces/AllTEAlgo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" +#include "GaudiKernel/ToolHandle.h" + +#include <ostream> + +class ITrigTimerSvc; +class TrigT2Jet; +class Trig3Momentum; +//class ITrigDataAccess; + +class T2AllRoiUnpacking: public HLT::AllTEAlgo { + + + public: + T2AllRoiUnpacking(const std::string & name, ISvcLocator* pSvcLocator); + ~T2AllRoiUnpacking(); + HLT::ErrorCode hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& input, + unsigned int output); + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + //! N of elements initially allocated in the grid + /*! This is just a reasonable initial size for the vector (currently + using 2^13, which corresponds to ~10 ROI at low lumi after noise + suppr.). Also, this should be a static member (problems without + namespace?). + */ + const size_t kAllocatedGridCells_; + private: + // functions + //! Process one trigger element + /*! + Cells are stored in m_grid, which should be allocated beforehand. + @param te TriggerElement to be processed + @param grid where the cells are stored + */ + HLT::ErrorCode processTriggerElement(const HLT::TriggerElement *te, + std::vector<Trig3Momentum> *grid); + bool initializeTimers(); //!< initialize the timers + bool initializeHelperTools(); //!< initialize tools + void resetTimers(); //!< reset the monitoring timers + bool inputIsValid(const std::vector<std::vector<HLT::TriggerElement*> >& input) const; + HLT::TriggerElement* setupOutputTe(unsigned int type_out) ; //!< prepare the output trigger element + void storeTimers(); //!< store timings in the monitoring variables + HLT::ErrorCode finalizeOutput(HLT::TriggerElement* outputTE); //! finalize the output TE (allocate TrigT2Jet and attach its grid) + void finalizeAccessories(); //!< finalize everything that's not the output + void determineOverlaps(const EtaPhiRectangle &l2Roi); //!< determine overlaps and store them in m_overlapRegions + // Properties: + std::string m_jetOutputKey; + double m_roiEtaHalfWidth; //!< half width (in eta) of the L2 ROI that will be read out + double m_roiPhiHalfWidth; //!< half width (in phi) of the L2 ROI that will be read out + bool m_mergeEmCells; //!< whether or not the EM cells shoud be merged + // non-configurable datamembers (see T2CaloJetGridFromCells.cxx for details) + std::vector<Trig3Momentum> m_tmpGrid; //!< tmp grid used to extract before merge + std::vector<int> m_ttEmSamplings; //!< all possible EM samplings values + std::vector<int> m_ttHecSamplings; //!< all possible HEC samplings values + int m_tileSampling; //!< tilecal sampling + bool m_prepare; //!< prepare T2CaloJetGridFromCells + Trig3MomentumMerger m_tmm; //!< cell merger + + + protected: + ToolHandle< T2CaloJetGridFromCells > m_caloGridFromCellsTool; + bool m_retrievedGridTool; + std::vector<Trig3Momentum>* m_grid; + //! @f$ (\eta,\phi) @f$ regions that have been already processed + /*! This datamember is reset at each event */ + std::vector< EtaPhiRectangle > m_processedRegions; + //! @f$ (\eta,\phi) @f$ regions that overlap with regions that have already been processed + /*! This datamember is reset at each TriggerElement */ + std::vector< EtaPhiRectangle > m_overlapRegions; + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + TrigTimer *m_cell_unpacking_timer; //!< unpacking time ('addCell' only) + TrigTimer *m_unpacking_timer; //!< unpacking time (geometry, overlap, and 'addCell') + TrigTimer *m_RoI_timer; //!< time required to set up the output TE ('addRoI') + TrigTimer *m_merge_timer; //!< time required merge the EM cells ('mergeEmCells') + + // output + TrigT2Jet *m_jet; + + // Monitored Variables + float m_UnpckTime; //!< see corresponding timer for details + float m_cellUnpckTime; //!< see corresponding timer for details + float m_RoITime; //!< see corresponding timer for details + float m_mergeTime; //!< see corresponding timer for details +}; + +//---------------------------------------------------------- +// +// helper classes +// +//---------------------------------------------------------- + +/*! \brief A class describing a rectangle in @f$ \eta @f$, @f$ \phi @f$ + * + * An EtaPhiRectangle object can be used to keep track of a rectangle + * in these coordinates. It is meant to be a simple object that takes + * care of the @f$ 2\pi @f$ ambigiuties and that can perform simple operations + * such as compute the overlap between two rectangles. While the + * minimum and maximum @f$ \phi @f$ values can be provided in any range, + * internally all @f$ \phi angles @f$ are stored and handled within + * (@f$ -\pi @f$,@f$ +\pi @f$]. + * Maybe at some point you could use TVector2.h (but they store x,y) or gsl::polar. + */ + +//! \todo should probably define an EtaPhiPair instead of EtaPhiPoint...and use it everywhere +typedef std::pair< double, double > EtaPhiPoint; +//---------------------------------------------------------- +class EtaPhiRectangle{ + public: + //! default c'tor + EtaPhiRectangle(): + m_etaMin(0.), m_etaMax(0.), m_etaCen(0.), m_etaHw(0.), + m_phiMin(0.), m_phiMax(0.), m_phiCen(0.), m_phiHw(0.), + m_wrapsAroundPi(false) {}; + //! constructor: defined like this because these are usually the edges we get for an ROI + EtaPhiRectangle(const double &etaMin, const double &etaMax, + const double &phiMin, const double &phiMax); + double area() const { return 2.0*m_etaHw*2.0*m_phiHw; }; + double eta() const { return m_etaCen; }; + double phi() const { return m_phiCen; }; + double etaMin() const { return m_etaMin; }; + double etaMax() const { return m_etaMax; }; + double phiMin() const { return m_phiMin; }; + double phiMax() const { return m_phiMax; }; + double etaHalfWidth() const {return m_etaHw; }; + double phiHalfWidth() const {return m_phiHw; }; + //! determine whether a given point in (@f$ \eta @f$, @f$ \phi @f$) is inside this EtaPhiRectangle + bool contains(const EtaPhiPoint &point) const; + //! same as above, but less safe agaist eta-phi swap + bool contains(const double &eta, const double &phi) const { return contains(std::make_pair(eta,phi));}; + //! determine whether two rectangles overlap + static double overlappingArea(const EtaPhiRectangle &lhs, + const EtaPhiRectangle &rhs); + //! compute the rectangle corresponding to the overlapping area + static EtaPhiRectangle overlappingRectangle(const EtaPhiRectangle &lhs, + const EtaPhiRectangle &rhs); + //! convert any angle to its equivalent in ( @f$ -\pi @f$, @f$ +\pi @f$] + static double phi_mpi_pi(const double &val); + //! convert any angle to its equivalent in ( 0 , @f$ +2\pi @f$] + static double phi_zero_2pi(const double &val); + //! print the rectangle + void print(std::ostream& stream) const; + + protected: + //! compute the location of the center of the rectangle + /*! In fact this method is initializing the internal representation + of the rectangle, with center, half width, etc. + */ + void computeCenterCoord(); + private: + double m_etaMin; //!< minimum eta + double m_etaMax; //!< maximum eta + double m_etaCen; //!< central eta + double m_etaHw; //!< eta half width + double m_phiMin; //!< minimum phi + double m_phiMax; //!< maximum phi + double m_phiCen; //!< central phi + double m_phiHw; //!< phi half width + bool m_wrapsAroundPi; //!< whether the rectangle crosses over @f$ \phi = \pi @f$ + +}; // end EtaPhiRectangle + +std::ostream& operator<< (std::ostream& stream, const EtaPhiRectangle &epr); + +//---------------------------------------------------------- + +/*! \brief compute L2 roi boundaries + +Given a L1 ROI descriptor, compute the boundaries of a calorimeter +L2 ROI. We want to the ROI dimensions (halfWidths) to be +configurable, so we pass them in through the c'tor. The +calculation is done accounting for upper boundaries, and treating +for the FCAL in a special way. + +\param trd the L1 ROI descriptor +\param etaHalfWidth desired half width in eta at L2 (usually 0.5) +\param phiHalfWidth desired half width in phi at L2 (usually 0.5) +*/ +class L2CaloRoiBoundsCalculator { + public: + L2CaloRoiBoundsCalculator(const TrigRoiDescriptor* trd, + const double &etaHalfWidth, + const double &phiHalfWidth); + double etaMin() const {return m_etaMin; } ; + double etaMax() const {return m_etaMax; } ; + double phiMin() const {return m_phiMin; } ; + double phiMax() const {return m_phiMax; } ; + private: + //! actually compute and store the bounds + void computeBounds(const TrigRoiDescriptor* trd, + const double &etaHalfWidth, + const double &phiHalfWidth); + double m_etaMin, m_etaMax; //!< eta range + double m_phiMin, m_phiMax; //!< phi range + double m_roiEtaLimit; //!< a reasonable maximum in @f$ \eta @f$ (4.8, does not include FCAL) + double m_fcalEtaMin; //!< FCAL minumum @f$ \eta @f$ (3.0) + double m_fcalEtaMax; //!< FCAL maxumum @f$ \eta @f$ (5.0) + double m_minFcalEtaCenter; //!< if the \eta center is above this (3.2), then we think it's FCAL +}; // end L2CaloRoiBoundsCalculator + +//---------------------------------------------------------- + + +//---------------------------------------------------------- + + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloFastJet.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloFastJet.h new file mode 100644 index 000000000000..900db6ab5784 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloFastJet.h @@ -0,0 +1,148 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloFastJet.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett, tamsett@cern.ch +// +// Description: Level 2 FastJet FEX algorithm. +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2CALOFASTJET_H +#define TRIGT2CALOJET_T2CALOFASTJET_H + +//#include "TrigInterfaces/FexAlgo.h" +#include "TrigInterfaces/AllTEAlgo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" +#include "fastjet/JetDefinition.hh" +#include "fastjet/AreaDefinition.hh" +#include "fastjet/ClusterSequence.hh" +#include "fastjet/ClusterSequenceArea.hh" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigCaloEvent/TrigT2JetContainer.h" +#include "TrigT2CaloJet/T2L1Tools.h" + +namespace fastjet{ + class PseudoJet; + class JetDefinition; + class AreaDefinition; + class ClusterSequence; + class ClusterSequenceArea; +} + +class ITrigTimerSvc; +class TrigT2Jet; +class T2CaloJetBaseTool; +class T2L1Tools; + + + +//class T2CaloFastJet: public HLT::FexAlgo { +class T2CaloFastJet: public HLT::AllTEAlgo { + + public: + T2CaloFastJet(const std::string & name, ISvcLocator* pSvcLocator); + ~T2CaloFastJet(); + + //HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, + // HLT::TriggerElement* outputTE); + HLT::ErrorCode hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& input, + unsigned int output); + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + + private: + // Properties: + std::string m_jetInputKey; + std::string m_jetOutputKey; + int m_inputType; + int m_outputType; + int m_secondOutputType; // this is used to set a different RoI word for the subsequent algorithm + double m_cellMinEnergy; //!< minimum cell energy required + // Tools + ToolHandleArray< T2CaloJetBaseTool > m_tools; // for calibration + + protected: + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + ITrigTimerSvc *m_pTimerService; // pointer to Timer Service + //TrigTimer *m_total_timer; + TrigTimer *m_unpack_timer; + TrigTimer *m_fastjet_timer; + TrigTimer *m_pu_subtraction_timer; + TrigTimer *m_cleaning_timer; + TrigTimer *m_calibration_timer; + TrigTimer *m_RoI_timer; + + // fast jet + double m_distanceParameter; + double m_pTmin; + std::vector<fastjet::PseudoJet> m_particles; + fastjet::JetDefinition * m_jet_def; + std::vector<fastjet::PseudoJet> m_jets; + std::vector<fastjet::PseudoJet> m_constituents; + fastjet::ClusterSequence* m_cluster_sequence; + + // cleaning: + bool m_doCleaning; + bool m_doT2L1Cleaning; // L1.5 m_jets do not have provenance, quality or time defined so a simpler cleaning must be applied + float m_leadingCellFraction; + int m_cellQualityThresholdLAr; + std::vector<double> m_cellenergies; + + // navigation + bool m_writeMultipleOutputTEs; + /* Default behaviour is to write a single output TE with a vector of jets attached. + * This does not fit all use cases, so a switch is available which enables the writing of one output TE per jet. + */ + + // pileup subtraction switch + bool m_doPileupSubtraction; + //double m_pu_distanceParameter; + fastjet::JetDefinition * m_pu_jet_def; + fastjet::AreaDefinition * m_pu_area_def; + fastjet::ClusterSequenceArea* m_pu_cluster_sequence; + fastjet::ClusterSequenceArea* m_pu_area_cluster_sequence; + double m_rho; + double m_sigma; + double m_area; + + + // Monitored Variables + //float m_TotalTime; // The total time + float m_UnpackTime; // The time to unpack + float m_FastJetTime; // The time to run fast jet + float m_puSubTime; // The time to do pileup subtraction + float m_CleaningTime; // The time to clean the jets + float m_CalibrationTime;// The time to calibrate the jets + float m_RoITime; // The RoI making time + int m_nGrid; // The number of grid elements given + int m_nJets; // The number of jets found + std::vector<double> m_et; // transverse energy + std::vector<double> m_et_em; // electromagnetic transverse energy + std::vector<double> m_et_had; // hadronic transverse energy + std::vector<double> m_e; // energy + std::vector<double> m_e_em; // electromagnetic energy + std::vector<double> m_e_had; // hadronic energy + std::vector<double> m_em_frac; // electromagnetic fraction + std::vector<double> m_eta; // eta + std::vector<double> m_phi; // phi + std::vector<int> m_nLeadingTowers; // number of leading towers + + + // outputs + TrigT2Jet *m_jet; + + // L1.5 tools + T2L1Tools m_t2l1_tools; + +}; + +#endif + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJet.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJet.h new file mode 100755 index 000000000000..afe6b3ce1d20 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJet.h @@ -0,0 +1,97 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloJet.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Kyle Cranmer +// +// Description: Level2 Jet algorithm. Basically copied from L2 EM and +// Tau algs with some cleanup. +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2CALOJET_H +#define TRIGT2CALOJET_T2CALOJET_H + +#include <string> +#include "TrigT2CaloCommon/T2CaloBase.h" +#include "GaudiKernel/ToolHandle.h" +#include "TrigCaloEvent/TrigCaloCluster.h" + +class StoreGateSvc; +//class TriggerElement; +//class TrigRoiDescriptor; +class T2CaloJetBaseTool; +class TrigT2Jet; + +class T2CaloJet: public T2CaloBase { + + + public: + T2CaloJet(const std::string & name, ISvcLocator* pSvcLocator); + ~T2CaloJet(); + + HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE); + + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + + private: + + // double m_etamin, m_etamax, m_phimin, m_phimax; + // TriggerElement* m_inputTE ; + // TrigRoiDescriptor* m_roiDescriptor; + TrigT2Jet* m_jet; + TrigCaloCluster *m_layerInfo; + + //std::vector<T2CaloJetBaseTool*> m_tools; + ToolHandleArray< T2CaloJetBaseTool > m_tools; + + // Properties: + std::string m_jetOutputKey; + std::string m_clusterOutputKey; + //std::vector<std::string> m_toolNames; + bool m_clearJetGrid; + bool m_fillLayerInfo; + + // Monitored Variables + double m_dR; + double m_e; // total energy of the jet after calibration + double m_et; + double m_ehad0; // hadronic energy before calibration + double m_eem0; // electromagnetic energy before calibration + + double m_ethad0; // transverse energy : hadronic component before calibration + double m_etem0; // transverse energy : electromagnetic component before calibration + + double m_eta; + double m_phi; + + double m_etaIDWidth; + double m_phiIDWidth; + + unsigned int m_conversionError; + unsigned int m_algorithmError; + + + + protected: + + std::vector<TrigTimer*> m_timer; + const TrigTimer *m_timeLArUnpck; + const TrigTimer *m_timeTileUnpck; + const TrigTimer *m_timeHECUnpck; + + public: + + inline TrigT2Jet* GetTrigT2Jet() const {return m_jet;} +//inline TrigCaloCluster* GetTrigCaloCluster() const {return m_layerInfo;} + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetBaseTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetBaseTool.h new file mode 100755 index 000000000000..ea63bbc43f37 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetBaseTool.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETBASETOOL_H +#define TRIGT2CALOJET_T2CALOJETBASETOOL_H + +/******************************************************************** + +NAME: T2CaloJetBaseTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Base Tool for all T2CaloJet tools require + an T2CaloJet object as its input. The derived + tool must implement an execute(TrigT2Jet*) method. + +********************************************************************/ + +class TrigT2Jet; + + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" + +#include "IRegionSelector/IRoiDescriptor.h" + +static const InterfaceID IID_T2CaloJetBaseTool("T2CaloJetBaseTool", 1, 0); + +class T2CaloJetBaseTool : public IAlgToolCalo +{ + public: + + T2CaloJetBaseTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetBaseTool(); + + virtual StatusCode initialize(); + using IAlgToolCalo::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + // virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax); + + virtual StatusCode execute(TrigT2Jet* jet, const IRoiDescriptor& roi, + const CaloDetDescrElement*& /*caloDDE*/); + + virtual TrigTimer* getTimer(const std::string& /*name*/){ return 0;}; + + static const InterfaceID& interfaceID() { return IID_T2CaloJetBaseTool; } + + +}; + +#endif // TRIGT2CALOJET_T2CALOJETBASETOOL diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetCalibTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetCalibTool.h new file mode 100755 index 000000000000..0201d2382dee --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetCalibTool.h @@ -0,0 +1,77 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETCALIBTOOL_H +#define TRIGT2CALOJET_T2CALOJETCALIBTOOL_H + +/******************************************************************** + +NAME: T2CaloJetCalibTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Patricia Conde Muino <Patricia.Conde.Muino@cern.ch> + Nuno Anjos <Nuno.Anjos@cern.ch> +CREATED: May 2006 + +PURPOSE: Calibration tool for LVL2 jets. + It uses T2JESCalibTool / T2GSCalibTool / T2SamplingCalibTool + from TrigTools/TrigT2CaloCalibration. + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/ToolHandle.h" +#include "TrigT2CaloCalibration/IT2HadCalibTool.h" +//#include "TrigCaloEvent/TrigCaloCluster.h" + +class TrigT2Jet; + +class T2CaloJetCalibTool : public T2CaloJetBaseTool +{ + public: + + T2CaloJetCalibTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetCalibTool(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax); + + private: + + MsgStream * m_log; + int m_outputLevel; + + ToolHandle < IT2HadCalibTool > m_t2JetCalibTool; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolTile1; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolFcal1; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolEm3Bar; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolHec0; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolEm3Fwd; + ToolHandle < IT2HadCalibTool > m_t2JetCorrToolPsBar; + + bool m_useFEBJets; +//bool m_fillLayerInfo; + bool m_doJetCalib; + bool m_doJetCorrTile1; + bool m_doJetCorrFcal1; + bool m_doJetCorrEm3Bar; + bool m_doJetCorrHec0; + bool m_doJetCorrEm3Fwd; + bool m_doJetCorrPsBar; + +//TrigCaloCluster *m_layer_info; + +// StatusCode calculateHadEMEnergy(TrigT2Jet* Jet, double *HadEnergy, double *EMEnergy); + StatusCode calculateLayerFracs(TrigT2Jet* Jet, double *fTile1, double *fFcal1, double *fEm3, double *fHec0, double *fPs); + +}; + +#endif // TRIGT2CALOJET_T2CALOJETCALIBTOOL diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetConeTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetConeTool.h new file mode 100755 index 000000000000..a58185228495 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetConeTool.h @@ -0,0 +1,77 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETCONETOOL_H +#define TRIGT2CALOJET_T2CALOJETCONETOOL_H + +/******************************************************************** + +NAME: T2CaloJetConeTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Cone Tool for all T2CaloJet. Does simple cone alg after data + preparation. + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/AlgTool.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" + +class TrigT2Jet; + +class T2CaloJetConeTool : public T2CaloJetBaseTool +{ + public: + + T2CaloJetConeTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetConeTool(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + //virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax); + virtual StatusCode execute(TrigT2Jet* jet, const IRoiDescriptor& roi); + + void coneIteration(TrigT2Jet* jet, int coneIter); + + private: + int m_nIterations; + double m_coneRadius; + //int niterations; + //double etot_jet; + //Cell check + int m_inCone, m_outCone, m_totalCell; + // cleaning: + int m_cellQualityThresholdLAr; + float m_leadingCellFraction; + + std::vector<double> m_datav; + std::vector<double> m_range1; + std::vector<double> m_range2; + std::vector<int> m_ndiv; + std::vector<std::string> m_dataObject; + std::vector<std::string> m_dataaxis; + + //New timers + ITrigTimerSvc *m_pTimerService; // pointer to Timer Service + TrigTimer *m_fcal_timer; + TrigTimer *m_other_timer; + + //FCal cone sizes + std::vector<double> m_fj_cone_sizes; + + // cleaning: + std::vector<double> m_cellenergies; + +}; + +#endif // TRIGT2CALOJET_T2CALOJETCONETOOL diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromCells.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromCells.h new file mode 100644 index 000000000000..3ff3ff22a1d0 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromCells.h @@ -0,0 +1,118 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETGRIDFROMCELLS_H +#define TRIGT2CALOJET_T2CALOJETGRIDFROMCELLS_H + +/******************************************************************** + +NAME: T2CaloJetGridFromCells.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Data preparation from cells, uses the + TrigT2CaloCommon/CommonAccessTool + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/AlgTool.h" + +//#include "LArRecEvent/LArCellCollection.h" +//#include "TileEvent/TileCellIDC.h" +//#include "LArRecEvent/LArCellIDC.h" +//#include "LArRawUtils/LArTT_Selector.h" +//#include "TrigT2CaloCommon/LArCellCont.h" +#include "TrigT2CaloCommon/TrigDataAccess.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" +#include "GaudiKernel/MsgStream.h" +#include "CaloInterface/ICalorimeterNoiseTool.h" + +class TrigT2Jet; +class Trig3Momentum; +class ITrigDataAccess; +class EtaPhiRectangle; + +class T2CaloJetGridFromCells : public T2CaloJetBaseTool +{ + public: + T2CaloJetGridFromCells(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetGridFromCells(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + +// virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, +// double phimin, double phimax); + virtual StatusCode execute(TrigT2Jet * jet,const IRoiDescriptor& roi ); + + virtual TrigTimer* getTimer(const std::string& name); + + StatusCode addAllCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid); + + + StatusCode addLArCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare); + + StatusCode addTileCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare); + //! set the regions to be skipped + void setForbiddenRegions(const std::vector< EtaPhiRectangle > ®ions) { m_forbiddenRegions = regions; } ; + private: + bool isInVetoRegion(const double &eta, const double &phi); + private: + Trig3Momentum* m_gridElement; + + + // New way with TrigDataAccess doing BS conversion + // iterators to LArCells. Note the different type from the above + LArTT_Selector<LArCellCont>::const_iterator m_iBegin; + LArTT_Selector<LArCellCont>::const_iterator m_iEnd; + LArTT_Selector<LArCellCont>::const_iterator m_it; + + TileCellCollection::const_iterator m_itBegin; + TileCellCollection::const_iterator m_itEnd; + TileCellCollection::const_iterator m_itt; + + + + //int ncell_roi; + //int nnegcell_roi; + //double eem_roi; + //double etot_roi; + + bool m_applyNoiseCut; + double m_noiseCutValue; + // cell based jet cleaning: + bool m_doHECcellQualityCleaning; + int m_cellQualityThresholdHEC; + + ToolHandle<LArCablingLegacyService> m_cablingSvc; + ToolHandle<ICalorimeterNoiseTool> m_noiseTool; + std::vector< EtaPhiRectangle > m_forbiddenRegions; //!< regions to be skipped + + protected: + + ITrigTimerSvc* m_timerSvc; + /** Timer Items for the main algorithms. */ + std::map<std::string, TrigTimer*> m_timers; + + bool m_doTiming; +}; + +#endif // TRIGT2CALOJET_T2CALOJETGRIDFROMCELLS diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h new file mode 100755 index 000000000000..cfc9eecd375d --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h @@ -0,0 +1,87 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETGRIDFROMFEBHEADER_H +#define TRIGT2CALOJET_T2CALOJETGRIDFROMFEBHEADER_H + +/******************************************************************** + +NAME: T2CaloJetGridFromFEBHeader.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> + Ignacio Aracena <ignacio.aracena@cern.ch> +CREATED: November, 2005 + +PURPOSE: Data preparation from FEB Headers (Ex/Ey) + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/AlgTool.h" +//#include "LArRecEvent/LArFebEnergyIDC.h" +#include "TrigT2CaloCommon/TrigDataAccess.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" +#include "GaudiKernel/MsgStream.h" + +class TrigT2Jet; +class Trig3Momentum; +class ITrigDataAccess; + +class T2CaloJetGridFromFEBHeader : public T2CaloJetBaseTool +{ + public: + + T2CaloJetGridFromFEBHeader(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetGridFromFEBHeader(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual TrigTimer* getTimer(const std::string& name); + + virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax); + + StatusCode addFebEnergies(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid); + + StatusCode addLArFebEnergy(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare); + + StatusCode addTileCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare); + private: + // ITrigDataAccess *m_data; + Trig3Momentum* m_gridElement; + std::vector<int>* m_usedfeb; + std::map<std::string, TrigTimer*> m_timers; + +protected: + ITrigTimerSvc* m_timerSvc; + bool m_doTiming; + + // New way with TrigDataAccess doing BS conversion + // iterators to LArFEBEnergy. Note the different type from the above + LArFebEnergyCollection::const_iterator m_iFebBegin; + LArFebEnergyCollection::const_iterator m_iFebEnd; + LArFebEnergyCollection::const_iterator m_Febit; + + TileCellCollection::const_iterator m_itBegin; + TileCellCollection::const_iterator m_itEnd; + TileCellCollection::const_iterator m_itt; + +}; + +#endif // TRIGT2CALOJET_T2CALOJETGRIDFROMFEBHEADER diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h new file mode 100755 index 000000000000..8e05ce479112 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2CALOJETGRIDFROMLVL1PPR_H +#define TRIGT2CALOJET_T2CALOJETGRIDFROMLVL1PPR_H + +/******************************************************************** + +NAME: T2CaloJetGridFromLvl1Ppr.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Data preparation tool from Lvl1 Trigger Towers (accessed via Lvl1 PPr Bytestream) + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/AlgTool.h" + +class TrigT2Jet; +class Trig3Momentum; + +class T2CaloJetGridFromLvl1Ppr : public T2CaloJetBaseTool +{ + public: + + T2CaloJetGridFromLvl1Ppr(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2CaloJetGridFromLvl1Ppr(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax); + private: + Trig3Momentum* m_gridElement; + +}; + +#endif // TRIGT2CALOJET_T2CALOJETGRIDFROMLVL1PPR diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloFullScanJet.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloFullScanJet.h new file mode 100644 index 000000000000..2c781d5f9066 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloFullScanJet.h @@ -0,0 +1,95 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1CaloFullScanJet.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett +// +// Description: Level2 Jet Full scan algorithm. Based on L2 MET +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2L1CaloFullScanJet_H +#define TRIGT2CALOJET_T2L1CaloFullScanJet_H + +#include "TrigInterfaces/AllTEAlgo.h" +#include <vector> + +#include <string> +#include "GaudiKernel/ToolHandle.h" +#include "TrigT2CaloCommon/T2CaloBase.h" +#include "TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h" + +class StoreGateSvc; +class TrigT2Jet; +class ITrigTimerSvc; + +namespace LVL1BS{ + class ITrigT1CaloDataAccess; +} + +namespace LVL1{ + class IL1JetTools; +} + +class T2L1CaloFullScanJet: public HLT::AllTEAlgo { + + + public: + T2L1CaloFullScanJet(const std::string & name, ISvcLocator* pSvcLocator); + ~T2L1CaloFullScanJet(); + + HLT::ErrorCode hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& input, + unsigned int output); + + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + + private: + + const TrigT2Jet* m_jet; + DataVector<TrigT2Jet>* m_jets; + ToolHandleArray< T2L1CaloJetFullScanBaseTool > m_tools; + + // Properties: + std::string m_jetOutputKey; + bool m_recordOutput; + + // Monitored Variables + int m_nJets; // The number of jets found + int m_nTowers; // The number of trigger towers + float m_UnpckTime; // The unpacking time, includes L1 unpack + tower storage time + float m_L1_UnpckTime; // The L1 unpacking time + float m_FastJetTime; // The FastJet time + float m_JetFindingTime; // The complete jet finding time + float m_TotalTime; // The total time + float m_RoITime; // The RoI making time + std::vector<double> m_e; // energy + std::vector<double> m_et; // transverse energy + std::vector<double> m_ehad; // hadronic energy + std::vector<double> m_eem; // electromagnetic energy + std::vector<double> m_ethad; // hadronic transverse energy + std::vector<double> m_etem; // electromagnetic transverse energy + std::vector<double> m_emfrac; // electromagnetic fraction + std::vector<double> m_eta; // eta + std::vector<double> m_phi; // phi + std::vector<int> m_nLeadingTowers; // number of leading towers + + + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + + + protected: + + std::vector<TrigTimer*> m_timer; + + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJet.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJet.h new file mode 100755 index 000000000000..50d1b428819e --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJet.h @@ -0,0 +1,82 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloJet.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Kyle Cranmer +// +// Description: Level2 Jet algorithm. Basically copied from L2 EM and +// Tau algs with some cleanup. +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2L1CALOJET_H +#define TRIGT2CALOJET_T2L1CALOJET_H + +#include <string> +#include "TrigInterfaces/FexAlgo.h" +#include "AthContainers/ConstDataVector.h" +#include "GaudiKernel/ToolHandle.h" + +class StoreGateSvc; +class TrigT2Jet; + +namespace LVL1BS{ + class ITrigT1CaloDataAccess; +} +namespace LVL1{ + class IL1JetTools; + class JetElement; +} + +class T2L1CaloJet: public HLT::FexAlgo { + + + public: + T2L1CaloJet(const std::string & name, ISvcLocator* pSvcLocator); + ~T2L1CaloJet(); + + HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE); + + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + + private: + + TrigT2Jet* m_jet; + + + // Properties: + std::string m_jetOutputKey; + + // Monitored Variables + double m_e; // total energy of the jet after calibration + double m_et; + //double m_ehad0; // hadronic energy before calibration + //double m_eem0; // electromagnetic energy before calibration + double m_eta; + double m_phi; + + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + + + + protected: + + std::vector<TrigTimer*> m_timer; + ToolHandle< LVL1BS::ITrigT1CaloDataAccess > m_dataL1; + ToolHandle< LVL1::IL1JetTools > m_jetL1Tools; + ConstDataVector<DataVector<LVL1::JetElement> >* m_storedJEs; + bool m_retrievedJetTool; + + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetCalibTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetCalibTool.h new file mode 100644 index 000000000000..8959104891f0 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetCalibTool.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2L1CALOJETTOOL_H +#define TRIGT2CALOJET_T2L1CALOJETTOOL_H + +/******************************************************************** + +NAME: T2L1CaloJetCalibTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch>, Carlos Sandoval <csandova@mail.cern.ch> +CREATED: December 2010 + + +PURPOSE: Calibration tool for L1 towers. + + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/ToolHandle.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/AlgTool.h" +#include "CaloRec/ToolWithConstantsMixin.h" + +class TrigT2Jet; +class Trig3Momentum; + +class T2L1CaloJetCalibTool : public T2CaloJetBaseTool, + public CaloRec::ToolWithConstantsMixin +{ + public: + + T2L1CaloJetCalibTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2L1CaloJetCalibTool(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(TrigT2Jet* jet,double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/); + + using AlgTool::setProperty; + virtual StatusCode setProperty (const std::string& propname, + const std::string& value); + virtual StatusCode setProperty (const Property& p); + + protected: + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + int GetEtaBin(double jet_eta); + double GetCalibFactor(int etabin, double energy); + + CaloRec::Array<2> m_CalibConstants; + + // Bins + std::vector<double> m_eta_bin_lower_edges; + + +}; + +#endif // TRIGT2CALOJET_T2L1CALOJETTOOL diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h new file mode 100644 index 000000000000..36e9437485b4 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2L1CALOJETFULLSCANBASETOOL_H +#define TRIGT2CALOJET_T2L1CALOJETFULLSCANBASETOOL_H + +/******************************************************************** + +NAME: T2L1CaloJetFullScanBaseTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett +CREATED: July, 2011 + +PURPOSE: Base Tool for all T2L1CaloJet tools that require + a vector of T2CaloJet objects as its input. The derived + tool must implement an execute(vector<T2CaloJet*>) method. + + +********************************************************************/ + +class TrigT2Jet; + + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" + +static const InterfaceID IID_T2L1CaloJetFullScanBaseTool("T2L1CaloJetFullScanBaseTool", 1, 0); + +class T2L1CaloJetFullScanBaseTool : public IAlgToolCalo +{ + public: + + T2L1CaloJetFullScanBaseTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2L1CaloJetFullScanBaseTool(); + + virtual StatusCode initialize(); + using IAlgToolCalo::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(DataVector<TrigT2Jet>*, int&, float&, float&, float&, float&); + + virtual TrigTimer* getTimer(const std::string& /*name*/){ return 0;}; + + static const InterfaceID& interfaceID() { return IID_T2L1CaloJetFullScanBaseTool; } + + +}; + +#endif // TRIGT2CALOJET_T2L1CaloJetFullScanBaseTool diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h new file mode 100644 index 000000000000..beb50ef75d7f --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h @@ -0,0 +1,128 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2L1CALOJETFULLSCANFASTJETTOOL_H +#define TRIGT2CALOJET_T2L1CALOJETFULLSCANFASTJETTOOL_H + +/******************************************************************** + +NAME: T2L1CaloJetFullScanFastJetTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett +CREATED: July, 2011 + +PURPOSE: FastJet Tool for all T2L1CaloJet tools that require + a vector of T2CaloJet objects as its input. The derived + tool must implement an execute(vector<T2CaloJet*>) method. + + +********************************************************************/ + +class TrigT2Jet; +class ITrigTimerSvc; + +namespace LVL1BS{ + class ITrigT1CaloDataAccess; +} + +namespace LVL1{ + class IL1JetTools; + class JetElement; + class TriggerTower; +} + +namespace fastjet{ + class PseudoJet; + class JetDefinition; + class ClusterSequence; +} + +// Extra tools for the RoI IDs +namespace T2L1{ + enum roi_types_enums { + NONE = 0x01, + L1SW8x8 = 0x02, + A4TT = 0x04, + A10TT = 0x08, + A4JE = 0x10, + A10JE = 0x20, + UNKNOWN = 0x40, + INPUT = 0x10000, + OUTPUT = 0x100, + BLANKWORD = 0x70000000 + }; +} + +#include "TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h" +#include "GaudiKernel/AlgTool.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" + +#include "fastjet/JetDefinition.hh" + +#include <vector> + +class T2L1CaloJetFullScanFastJetTool : public T2L1CaloJetFullScanBaseTool +{ + public: + + T2L1CaloJetFullScanFastJetTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2L1CaloJetFullScanFastJetTool(); + + virtual StatusCode initialize(); + using T2L1CaloJetFullScanBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(DataVector<TrigT2Jet>*, int&, float&, float&, float&, float&); + + protected: + ToolHandle< LVL1BS::ITrigT1CaloDataAccess > m_dataL1; + + double m_coneRadius; + double m_pTmin; + bool m_retrievedJetTool; + int m_inputType; + + TrigT2Jet* m_jet; + std::vector<float> m_l1_tower_information; + + double m_etaMin; + double m_etaMax; + double m_phiMin; + double m_phiMax; + bool m_fullScan; + + + ITrigTimerSvc *m_pTimerService; // pointer to Timer Service + TrigTimer *m_total_timer; + TrigTimer *m_unpacking_timer; + TrigTimer *m_load_collection_timer; + TrigTimer *m_jet_finding_timer; + TrigTimer *m_fastjet_timer; + + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + bool m_doTriggerTowers; // bool to switch to trigger towers mode, default mode is Jet Elements + // fast jet + std::vector<fastjet::PseudoJet> m_particles; + fastjet::JetDefinition * m_jet_def; + //fastjet::ClusterSequence cs; + std::vector<fastjet::PseudoJet> m_jets; + std::vector<fastjet::PseudoJet> m_constituents; + + // cleaning: + float m_leadingCellFraction; + std::vector<double> m_cellenergies; + + // debug + bool m_doCleaning; + bool m_doJetFinding; + +}; + +#endif // TRIGT2CALOJET_T2L1CaloJetFullScanFastJetTool diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Tools.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Tools.h new file mode 100644 index 000000000000..502e621bdefa --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Tools.h @@ -0,0 +1,136 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1Tools.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett, tamsett@cern.ch +// +// Description: Common tools and definitions for the L1.5 jet trigger +// ******************************************************************** +#ifndef TRIGT2CALOJET_T2L1TOOLS_H +# define TRIGT2CALOJET_T2L1TOOLS_H 1 +#ifndef GAUDIKERNEL_CLASSID_H +# include "GaudiKernel/ClassID.h" +#endif + +#include <string> +#include <map> + + +class T2L1Tools{ + public: + + enum roi_types_enums { + NONE = 0x01, + L1SW8x8 = 0x02, + L2CONE = 0x03, + A4TT = 0x04, + A4TT_JES = 0x05, + A4TT_TC = 0x06, + A4TT_TC_JES = 0x07, + A4TT_PU_SUB = 0x08, + A10TT = 0x09, + A4JE = 0x10, + A4JE_JES = 0x11, + A4JE_TC = 0x12, + A4JE_TC_JES = 0x13, + A4JE_PU_SUB = 0x14, + A4CC = 0x15, + A4CC_JES = 0x16, + A10JE = 0x20, + UNCALIBRATED = 0x30, + CALIBRATED = 0x31, + UNKNOWN = 0x40, + SET_INPUT = 0x10000, + GET_INPUT = 0x10000*255, + SET_OUTPUT = 0x100, + GET_OUTPUT = 0x100*255, + BLANKWORD = 0x70000000 + }; + + int MapStringToEnum(std::string name_string){ + + std::map <std::string, int> L15NameMap; + L15NameMap["NONE"] = NONE; + L15NameMap["L1SW8x8"] = L1SW8x8; + L15NameMap["L2CONE"] = L2CONE; + L15NameMap["A4TT"] = A4TT; + L15NameMap["A4TT_JES"] = A4TT_JES; + L15NameMap["A4TT_TC"] = A4TT_TC; + L15NameMap["A4TT_TC_JES"] = A4TT_TC_JES; + L15NameMap["A4TT_PU_SUB"] = A4TT_PU_SUB; + L15NameMap["A10TT"] = A10TT; + L15NameMap["A4JE"] = A4JE; + L15NameMap["A4JE_JES"] = A4JE_JES; + L15NameMap["A4JE_TC"] = A4JE_TC; + L15NameMap["A4JE_TC_JES"] = A4JE_TC_JES; + L15NameMap["A4JE_PU_SUB"] = A4JE_PU_SUB; + L15NameMap["A10JE"] = A10JE; + L15NameMap["A4CC"] = A4CC; + L15NameMap["A4CC_JES"] = A4CC_JES; + L15NameMap["CALIBRATED"] = CALIBRATED; + L15NameMap["UNCALIBRATED"] = UNCALIBRATED; + + std::map <std::string, int>::const_iterator mask_map_iterator = L15NameMap.find(name_string); + if (mask_map_iterator == L15NameMap.end()){ + return UNKNOWN; + } else { + return mask_map_iterator->second; + } + } + + std::string MapEnumToString(int enum_int){ + + std::map <int, std::string> L15NameMap; + L15NameMap[NONE] = "NONE"; + L15NameMap[L1SW8x8] = "L1SW8x8"; + L15NameMap[L2CONE] = "L2CONE"; + L15NameMap[A4TT] = "A4TT"; + L15NameMap[A4TT_JES] = "A4TT_JES"; + L15NameMap[A4TT_TC] = "A4TT_TC"; + L15NameMap[A4TT_TC_JES] = "A4TT_TC_JES"; + L15NameMap[A4TT_PU_SUB] = "A4TT_PU_SUB"; + L15NameMap[A10TT] = "A10TT"; + L15NameMap[A4JE] = "A4JE"; + L15NameMap[A4JE_JES] = "A4JE_JES"; + L15NameMap[A4JE_TC] = "A4JE_TC"; + L15NameMap[A4JE_TC_JES] = "A4JE_TC_JES"; + L15NameMap[A4JE_PU_SUB] = "A4JE_PU_SUB"; + L15NameMap[A10JE] = "A10JE"; + L15NameMap[A4CC] = "A4CC"; + L15NameMap[A4CC_JES] = "A4CC_JES"; + L15NameMap[CALIBRATED] = "CALIBRATED"; + L15NameMap[UNCALIBRATED] = "UNCALIBRATED"; + + std::map <int, std::string>::const_iterator mask_map_iterator = L15NameMap.find(enum_int); + if (mask_map_iterator == L15NameMap.end()){ + return "UNKNOWN"; + } else { + return mask_map_iterator->second; + } + } + + void RoIWordToStrings(int RoIWord, std::string & input_type_string, std::string & output_type_string, int & counter){ + if ( (RoIWord & BLANKWORD) == BLANKWORD) { // L1.5 jets + unsigned int output_enum = (RoIWord >> 8) & 255 ; + unsigned int input_enum = (RoIWord >> 16) & 255 ; + input_type_string = MapEnumToString(input_enum); + output_type_string = MapEnumToString(output_enum); + counter = RoIWord & 255; + } else { // others, probably L2 jets + input_type_string = "NON_L15"; + output_type_string = "L2CONE"; + counter = 0; + } + + } + + +}; // end of class + + +#endif // TRIGT2CALOJET_T2L1TOOLS_H diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1ToolsDict.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1ToolsDict.h new file mode 100644 index 000000000000..45c7641f6968 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1ToolsDict.h @@ -0,0 +1,10 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2L1TOOLSDICT_H +#define TRIGT2CALOJET_T2L1TOOLSDICT_H 1 + +#include "TrigT2CaloJet/T2L1Tools.h" + +#endif // TRIGT2CALOJET_T2L1TOOLSDICT_H diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1TowerCalibTool.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1TowerCalibTool.h new file mode 100644 index 000000000000..695b01987836 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1TowerCalibTool.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_T2L1TOWERCALIBTOOL_H +#define TRIGT2CALOJET_T2L1TOWERCALIBTOOL_H + +/******************************************************************** + +NAME: T2L1TowerCalibTool.h +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch>, Carlos Sandoval <csandova@mail.cern.ch> +CREATED: December 2010 + + +PURPOSE: Calibration tool for L1 towers. + + +********************************************************************/ + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "GaudiKernel/ToolHandle.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/AlgTool.h" +#include "CaloRec/ToolWithConstantsMixin.h" + +class TrigT2Jet; +class Trig3Momentum; + +class T2L1TowerCalibTool : public T2CaloJetBaseTool, + public CaloRec::ToolWithConstantsMixin +{ + public: + + T2L1TowerCalibTool(const std::string& type, const std::string& name, + const IInterface* parent); + + ~T2L1TowerCalibTool(); + + virtual StatusCode initialize(); + using T2CaloJetBaseTool::execute; + virtual StatusCode execute(); + virtual StatusCode finalize(); + + virtual StatusCode execute(TrigT2Jet* jet,double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/); + + using AlgTool::setProperty; + virtual StatusCode setProperty (const std::string& propname, + const std::string& value); + virtual StatusCode setProperty (const Property& p); + + protected: + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + Trig3Momentum *m_grid_element; + + int GetEtaBin(double jet_eta); + int GetPhiBin(double jet_phi); + int GetEtBin(double jet_et); + double GetEtaCalibFactor(int etabin, int phibin, int etbin); + + CaloRec::Array<2> m_CalibConstants; + + +}; + +#endif // TRIGT2CALOJET_T2L1TOWERCALIBTOOL diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Unpacking.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Unpacking.h new file mode 100644 index 000000000000..404196dc5693 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/T2L1Unpacking.h @@ -0,0 +1,116 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1Unpacking.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett +// +// Description: Unpack the L1Calo towers for use with L1.5 +// ******************************************************************** + +#ifndef TRIGT2CALOJET_T2L1UNPACKING_H +#define TRIGT2CALOJET_T2L1UNPACKING_H + +#include "TrigInterfaces/AllTEAlgo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" +#include "GaudiKernel/ToolHandle.h" +#include "TrigT2CaloCommon/TrigDataAccess.h" + + +class ITrigTimerSvc; +class TrigT2Jet; +class Trig3Momentum; +class T2CaloJetBaseTool; + +namespace LVL1BS{ + class ITrigT1CaloDataAccess; +} + +namespace LVL1{ + class IL1JetTools; + class JetElement; + class TriggerTower; +} + + +class T2L1Unpacking: public HLT::AllTEAlgo { + + + public: + T2L1Unpacking(const std::string & name, ISvcLocator* pSvcLocator); + ~T2L1Unpacking(); + + HLT::ErrorCode hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& input, + unsigned int output); + + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + + CaloSampling::CaloSample determineCaloSampling(double fabs_eta, bool isEM); + double determineTriggerTowerEta(double eta, bool isEM); + + private: + // Properties: + std::string m_jetOutputKey; + //int m_outputType; // record the type of output towers, e.g. calibrated, uncalibrated + //std::string m_outputString; // mapped to enum in initalize, this should be changed so that its directly configured in the config + bool m_doTriggerTowers; // bool to switch to trigger towers mode, default mode is Jet Elements + // Tools + ToolHandleArray< T2CaloJetBaseTool > m_tools; // for calibration + + protected: + /** For Logging, in all tools we should use (*m_log) to avoid recalling of the MsgStream all the time. */ + MsgStream* m_log; + + ITrigTimerSvc *m_pTimerService; // pointer to Timer Service + //TrigTimer *m_total_timer; + TrigTimer *m_l1_unpacking_timer; + TrigTimer *m_unpacking_timer; + TrigTimer *m_calibration_timer; + TrigTimer *m_RoI_timer; + + ToolHandle< LVL1BS::ITrigT1CaloDataAccess > m_dataL1; + bool m_retrievedJetTool; + + /// no longer needed - the the RoiDescriptor directly !! + double m_etaMin; + double m_etaMax; + double m_phiMin; + double m_phiMax; + bool m_fullScan; + + // output + TrigT2Jet *m_jet; + Trig3Momentum *m_grid_element; + + // Monitored Variables + float m_UnpckTime; // The total unpacking time + float m_L1UnpckTime; // The L1 unpacking time + float m_CalibrationTime;// The time to calibrate the jets + //float m_TotalTime; // The total time + float m_RoITime; // The RoI making time + int m_nTowers; // The number of towers found + int m_nEMTowers; // The number of EM towers found + int m_nHADTowers; // The number of HAD towers found + std::vector<double> m_et; // transverse energy + std::vector<double> m_et_had; // hadronic transverse energy + std::vector<double> m_et_em; // electromagnetic transverse energy + std::vector<double> m_eta; // eta + std::vector<double> m_eta_em; // eta of EM towers + std::vector<double> m_eta_had; // eta of HAD towers + std::vector<double> m_phi; // phi + std::vector<double> m_phi_em; // phi of EM towers + std::vector<double> m_phi_had; // phi of HAD towers + + + + + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/Trig3MomentumMerger.h b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/Trig3MomentumMerger.h new file mode 100644 index 000000000000..7f60a0c817ae --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/Trig3MomentumMerger.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOJET_TRIG3MOMENTUMMERGER_H +#define TRIGT2CALOJET_TRIG3MOMENTUMMERGER_H + +#include "TrigT2CaloJet/GridsHandler.h" +#include "TrigT2CaloJet/EtaPhiSampleHash.h" +#include "TrigT2CaloJet/HashedTrig3Momentum.h" + +/*! + @brief Merge Trig3Momentum to a finite granularity + + Merge some input Trig3Momentum collection into an output + Trig3Momentum collection with a predefined granularity. + + April 2012 + davide.gerbaudo@gmail.com +*/ + +class Trig3MomentumMerger { + public: + Trig3MomentumMerger(); + bool mergeCells(const Vt3m &input, Vt3m &output); + private: + unsigned int expectedLength(const Vt3m &input); + private: + EtaPhiSampleHash m_hashMap; + GridsHandler m_gridsHandler; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/selection.xml b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/selection.xml new file mode 100644 index 000000000000..b87b09fad7a1 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/TrigT2CaloJet/selection.xml @@ -0,0 +1,3 @@ +<lcgdict> + <class name="T2L1Tools" /> +</lcgdict> diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/python/CalibrationFactorsL15.py b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/CalibrationFactorsL15.py new file mode 100644 index 000000000000..1c2ad9602e2a --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/CalibrationFactorsL15.py @@ -0,0 +1,126 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +binEdgeDict = {} +binEdgeDict[ 'L2FS_em_residual_factors_eta' ] = [-4.9, -4.0, -3.2, -2.5, -1.6, -0.8, 0.0, 0.8, 1.6, 2.5, 3.2, 4.0, 4.9] + + +energyCorrDict= {} +## L2FS EM scale residual corrections +# Matthew Tamsett <tamsett@cern.ch> +# Rajivalochan Subramaniam <rajiv.lochan@cern.ch> +# [i]: eta: -4.9, -4.0, -3.2, -2.5, -1.6, -0.8, 0.0, 0.8, 1.6, 2.5, 3.2, 4.0, 4.9 +## Jet energy calibration +## [0]+[1]*(log10(x)^-1)+[2]*(log10(x)^-1)^2+... +energyCorrDict[ 'L2FS_em_residual_factors' ] = [ + [1.50000e-01, 1.50000e-01, -7.56261e-01, 1.32880e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 0 -4.9< eta <-4.0 + [-2.50000e-02, -2.50000e-02, -2.50000e-02, -2.50000e-02, -2.34682e-01 , 0.0000e+00, 0.0000e+00], ## bin 1 -4.0< eta <-3.2 + [-4.47860e-02, 1.91685e-01, -4.59624e-01, 0.0000e+00, 0.0000e+00 , 0.0000e+00, 0.0000e+00], ## bin 2 -3.2<eta -2.5 + [6.03751e-02, -9.63390e-02, -3.05565e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 3 -2.5<eta<-1.6 + [-8.89929e-03, 2.22643e-02, -3.83097e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 4 -1.6<eta<-0.8 + [5.73233e-02, -5.45971e-02, -3.30586e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 5 -0.8<eta< 0 + [5.73233e-02, -5.45971e-02, -3.30586e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 6 0.0<eta< 0.8 + [-8.89929e-03, 2.22643e-02, -3.83097e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 7 0.8<eta< 1.6 + [6.03751e-02, -9.63390e-02, -3.05565e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 8 1.6<eta<2.5 + [-4.47860e-02, 1.91685e-01, -4.59624e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 9 2.5<eta<3.2 + [-2.50000e-02, -2.50000e-02, -2.50000e-02, -2.50000e-02, -2.34682e-01 , 0.0000e+00, 0.0000e+00], ## bin 10 3.2< eta <4 + [1.50000e-01, 1.50000e-01, -7.56261e-01, 1.32880e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00], ## bin 11 4.0< eta<4.9 +] + + +## Jet element calibration +energyCorrDict[ 'JE_factors' ] = [ +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 0.732649, 0.657187, 0.582351, 0.568978, 0.787708, 0.797072, 0.788461, 0.758857, 0.709569, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[0.963072, 0.917165, 0.858138, 0.788752, 0.790744, 0.934746, 0.899513, 0.890402, 0.871661, 0.793681, 0.807622, 0.94587, 0.922921, 0.903774, 0.894499, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1.01831, 0.995006, 0.930382, 0.869178, 0.874385, 0.990226, 0.938528, 0.933349, 0.92158, 0.827567, 0.838162, 0.966597, 0.949608, 0.952079, 0.942151, 0.923921, 1, 1, 1, 1, 1], +[1.04632, 1.0065, 0.998164, 0.943681, 0.991454, 1.01259, 0.989524, 0.975407, 0.954918, 0.853876, 0.870036, 0.97283, 0.96642, 0.968738, 0.963785, 0.954188, 0.909048, 1, 1, 0.758403, 1], +[1.03808, 1.02677, 1.02914, 0.9612, 1.01392, 1.02696, 0.997101, 0.9781, 0.950607, 0.861182, 0.875115, 0.975573, 0.966072, 0.964686, 0.950734, 0.94877, 0.930003, 0.968884, 1, 0.673215, 1], +[1.05728, 1.04072, 1.03521, 0.971556, 1.00436, 1.02207, 0.997667, 0.976948, 0.960568, 0.862825, 0.877273, 0.971429, 0.966273, 0.967753, 0.965021, 0.963443, 0.957007, 0.907368, 1, 0.777622, 1], +[1.0335, 1.04651, 1.01774, 1.01502, 1.01123, 1.00854, 0.992301, 0.974068, 0.957547, 0.863424, 0.876279, 0.967542, 0.96582, 0.968138, 0.965577, 0.963099, 0.955318, 0.953505, 0.969231, 0.811548, 1], +[1.05667, 1.07414, 1.12747, 1.17586, 1.0306, 1.05539, 1.04156, 1.0482, 1.01271, 1.00957, 0.986511, 1.00956, 1.00419, 0.997957, 0.990016, 0.980192, 0.972004, 0.964872, 0.969231, 0.841827, 1], +[1.06822, 1.13373, 1.22308, 1.16611, 1.01388, 1.06828, 1.06539, 1.08269, 1.08061, 1.08864, 0.975235, 1.02304, 1.02052, 1.0031, 0.990162, 0.986197, 0.980423, 0.968884, 0.876923, 0.853859, 1], +[1.088, 1.08228, 1.15033, 1.16992, 1.02095, 1.05037, 1.04923, 1.05511, 1.03741, 1.04549, 0.998608, 1.04065, 1.04638, 1.04287, 1.03978, 1.03551, 1.03327, 1.01964, 0.969231, 0.928778, 1], +[1.06134, 1.07087, 1.13335, 1.1473, 1.01166, 1.05035, 1.03923, 1.05272, 1.03184, 1.02643, 0.985362, 1.03035, 1.03848, 1.03402, 1.03025, 1.02781, 1.02005, 1.01456, 1.04615, 0.947696, 1], +[1.02439, 1.02975, 1.03728, 1.09439, 0.974983, 1.00738, 1.00662, 1.016, 0.999814, 0.975261, 0.958696, 0.999569, 1.00895, 1.00741, 1.00495, 1.00166, 0.999155, 0.993898, 0.992308, 0.97022, 1], +[1.00698, 1.00495, 0.991761, 1.01249, 0.981476, 0.999528, 0.99939, 1.00238, 0.99601, 0.96414, 0.987203, 0.998647, 1.00389, 1.00354, 1.00338, 1.00247, 1.00239, 1.00077, 1.00879, 0.979493, 1], +[1.01036, 1.00545, 1.0073, 1.01002, 0.986233, 1.00075, 1.00497, 0.997815, 0.999706, 0.982039, 1.00018, 1.00176, 1.00353, 1.0034, 1.00322, 1.00395, 1.00239, 1.00677, 0.995604, 1.00742, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1.00326, 1.00893, 0.981908, 1.00688, 0.983689, 1.00378, 0.998563, 0.995499, 1.00682, 0.997098, 0.992604, 0.994677, 0.998323, 0.997436, 0.997583, 0.997269, 0.995517, 0.990071, 0.984615, 0.997593, 1], +[1.00419, 0.99139, 0.988142, 0.989949, 0.987665, 0.993987, 0.995894, 0.989736, 0.987683, 0.984006, 0.99745, 0.991238, 0.99326, 0.992002, 0.9916, 0.992211, 0.988493, 0.989086, 0.982657, 0.995758, 1], +[1.00033, 0.999973, 0.986212, 0.992648, 0.990341, 0.996469, 0.990997, 0.98742, 0.982071, 0.966529, 0.996929, 0.988278, 0.99071, 0.990932, 0.990534, 0.990377, 0.991391, 0.986356, 0.986982, 0.995863, 1], +[0.997823, 0.997993, 0.996516, 0.980383, 0.973388, 0.988612, 0.992555, 0.990589, 0.98603, 0.955803, 0.982497, 0.985134, 0.989585, 0.989439, 0.98986, 0.987933, 0.988564, 0.983245, 0.988811, 0.975359, 1], +[1.00145, 1.00299, 1.01761, 1.03578, 0.971403, 0.991637, 1.001, 0.996646, 0.978679, 0.98986, 0.961125, 0.985624, 0.993008, 0.991249, 0.98943, 0.986799, 0.987093, 0.976908, 1, 0.95216, 1], +[1.02765, 1.05224, 1.08272, 1.12208, 0.995723, 1.0241, 1.02565, 1.0367, 1.01459, 1.03169, 0.985472, 1.02033, 1.02764, 1.02175, 1.01865, 1.01438, 1.00701, 1.01059, 0.976923, 0.938199, 1], +[1.0787, 1.08527, 1.10586, 1.15524, 1.02656, 1.03945, 1.04886, 1.04752, 1.03223, 1.00483, 1.00023, 1.03519, 1.03736, 1.03311, 1.02905, 1.02496, 1.01955, 1.00925, 1.03077, 0.928851, 1], +[1.05407, 1.07286, 1.14085, 1.13365, 1.00321, 1.04376, 1.04587, 1.05198, 1.04193, 1.05515, 0.976433, 1.01714, 1.01288, 0.994341, 0.979535, 0.976823, 0.978074, 0.949956, 0.923077, 0.837593, 1], +[1.06226, 1.12014, 1.17891, 1.18049, 1.03381, 1.07113, 1.05943, 1.05496, 1.04184, 1.04432, 1.00074, 1.01669, 1.00968, 1.00158, 0.991343, 0.981698, 0.971028, 0.963456, 1, 0.853603, 1], +[1.0421, 1.04362, 1.03215, 1.00733, 1.00688, 1.01012, 0.995392, 0.975134, 0.961122, 0.859542, 0.894761, 0.968768, 0.968193, 0.971021, 0.968925, 0.966411, 0.963923, 0.962293, 1, 0.810748, 1], +[1.05884, 1.04375, 1.03846, 1.01044, 1.01915, 1.01851, 1.0016, 0.986813, 0.966459, 0.867083, 0.886514, 0.973076, 0.970679, 0.972459, 0.970648, 0.96881, 0.972509, 0.968884, 1, 0.774462, 1], +[1.05683, 1.0476, 1.0008, 0.97346, 1.02024, 1.02595, 0.994583, 0.98965, 0.959866, 0.867563, 0.885586, 0.975321, 0.969133, 0.970606, 0.968159, 0.961191, 0.957472, 1, 1, 0.728722, 1], +[1.0544, 1.021, 1.02373, 0.981706, 1.00512, 1.01978, 0.989929, 0.974602, 0.95836, 0.854214, 0.865464, 0.972314, 0.965047, 0.967045, 0.961512, 0.947749, 0.83201, 1, 1, 0.656396, 1], +[1.0136, 0.986109, 0.94201, 0.874168, 0.89865, 0.987246, 0.936149, 0.93741, 0.92277, 0.831139, 0.848595, 0.973952, 0.952389, 0.952801, 0.940302, 0.93932, 1, 1, 1, 0.709617, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[0.957084, 0.91684, 0.85538, 0.78333, 0.773765, 0.931254, 0.895317, 0.88877, 0.877844, 0.796638, 0.797414, 0.944883, 0.920993, 0.903721, 0.774315, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 0.832556, 0.698693, 0.639456, 0.692557, 0.777771, 0.792767, 0.849111, 0.708267, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +] + +## Trigger Towers +energyCorrDict[ 'TT_factors' ] = [ +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 0.732649, 0.657187, 0.582351, 0.568978, 0.787708, 0.797072, 0.788461, 0.758857, 0.709569, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[0.963072, 0.917165, 0.858138, 0.788752, 0.790744, 0.934746, 0.899513, 0.890402, 0.871661, 0.793681, 0.807622, 0.94587, 0.922921, 0.903774, 0.894499, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1.01831, 0.995006, 0.930382, 0.869178, 0.874385, 0.990226, 0.938528, 0.933349, 0.92158, 0.827567, 0.838162, 0.966597, 0.949608, 0.952079, 0.942151, 0.923921, 1, 1, 1, 1, 1], +[1.04632, 1.0065, 0.998164, 0.943681, 0.991454, 1.01259, 0.989524, 0.975407, 0.954918, 0.853876, 0.870036, 0.97283, 0.96642, 0.968738, 0.963785, 0.954188, 0.909048, 1, 1, 0.758403, 1], +[1.03808, 1.02677, 1.02914, 0.9612, 1.01392, 1.02696, 0.997101, 0.9781, 0.950607, 0.861182, 0.875115, 0.975573, 0.966072, 0.964686, 0.950734, 0.94877, 0.930003, 0.968884, 1, 0.673215, 1], +[1.05728, 1.04072, 1.03521, 0.971556, 1.00436, 1.02207, 0.997667, 0.976948, 0.960568, 0.862825, 0.877273, 0.971429, 0.966273, 0.967753, 0.965021, 0.963443, 0.957007, 0.907368, 1, 0.777622, 1], +[1.0335, 1.04651, 1.01774, 1.01502, 1.01123, 1.00854, 0.992301, 0.974068, 0.957547, 0.863424, 0.876279, 0.967542, 0.96582, 0.968138, 0.965577, 0.963099, 0.955318, 0.953505, 0.969231, 0.811548, 1], +[1.05667, 1.07414, 1.12747, 1.17586, 1.0306, 1.05539, 1.04156, 1.0482, 1.01271, 1.00957, 0.986511, 1.00956, 1.00419, 0.997957, 0.990016, 0.980192, 0.972004, 0.964872, 0.969231, 0.841827, 1], +[1.06822, 1.13373, 1.22308, 1.16611, 1.01388, 1.06828, 1.06539, 1.08269, 1.08061, 1.08864, 0.975235, 1.02304, 1.02052, 1.0031, 0.990162, 0.986197, 0.980423, 0.968884, 0.876923, 0.853859, 1], +[1.088, 1.08228, 1.15033, 1.16992, 1.02095, 1.05037, 1.04923, 1.05511, 1.03741, 1.04549, 0.998608, 1.04065, 1.04638, 1.04287, 1.03978, 1.03551, 1.03327, 1.01964, 0.969231, 0.928778, 1], +[1.06134, 1.07087, 1.13335, 1.1473, 1.01166, 1.05035, 1.03923, 1.05272, 1.03184, 1.02643, 0.985362, 1.03035, 1.03848, 1.03402, 1.03025, 1.02781, 1.02005, 1.01456, 1.04615, 0.947696, 1], +[1.02439, 1.02975, 1.03728, 1.09439, 0.974983, 1.00738, 1.00662, 1.016, 0.999814, 0.975261, 0.958696, 0.999569, 1.00895, 1.00741, 1.00495, 1.00166, 0.999155, 0.993898, 0.992308, 0.97022, 1], +[1.00698, 1.00495, 0.991761, 1.01249, 0.981476, 0.999528, 0.99939, 1.00238, 0.99601, 0.96414, 0.987203, 0.998647, 1.00389, 1.00354, 1.00338, 1.00247, 1.00239, 1.00077, 1.00879, 0.979493, 1], +[1.01036, 1.00545, 1.0073, 1.01002, 0.986233, 1.00075, 1.00497, 0.997815, 0.999706, 0.982039, 1.00018, 1.00176, 1.00353, 1.0034, 1.00322, 1.00395, 1.00239, 1.00677, 0.995604, 1.00742, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1.00326, 1.00893, 0.981908, 1.00688, 0.983689, 1.00378, 0.998563, 0.995499, 1.00682, 0.997098, 0.992604, 0.994677, 0.998323, 0.997436, 0.997583, 0.997269, 0.995517, 0.990071, 0.984615, 0.997593, 1], +[1.00419, 0.99139, 0.988142, 0.989949, 0.987665, 0.993987, 0.995894, 0.989736, 0.987683, 0.984006, 0.99745, 0.991238, 0.99326, 0.992002, 0.9916, 0.992211, 0.988493, 0.989086, 0.982657, 0.995758, 1], +[1.00033, 0.999973, 0.986212, 0.992648, 0.990341, 0.996469, 0.990997, 0.98742, 0.982071, 0.966529, 0.996929, 0.988278, 0.99071, 0.990932, 0.990534, 0.990377, 0.991391, 0.986356, 0.986982, 0.995863, 1], +[0.997823, 0.997993, 0.996516, 0.980383, 0.973388, 0.988612, 0.992555, 0.990589, 0.98603, 0.955803, 0.982497, 0.985134, 0.989585, 0.989439, 0.98986, 0.987933, 0.988564, 0.983245, 0.988811, 0.975359, 1], +[1.00145, 1.00299, 1.01761, 1.03578, 0.971403, 0.991637, 1.001, 0.996646, 0.978679, 0.98986, 0.961125, 0.985624, 0.993008, 0.991249, 0.98943, 0.986799, 0.987093, 0.976908, 1, 0.95216, 1], +[1.02765, 1.05224, 1.08272, 1.12208, 0.995723, 1.0241, 1.02565, 1.0367, 1.01459, 1.03169, 0.985472, 1.02033, 1.02764, 1.02175, 1.01865, 1.01438, 1.00701, 1.01059, 0.976923, 0.938199, 1], +[1.0787, 1.08527, 1.10586, 1.15524, 1.02656, 1.03945, 1.04886, 1.04752, 1.03223, 1.00483, 1.00023, 1.03519, 1.03736, 1.03311, 1.02905, 1.02496, 1.01955, 1.00925, 1.03077, 0.928851, 1], +[1.05407, 1.07286, 1.14085, 1.13365, 1.00321, 1.04376, 1.04587, 1.05198, 1.04193, 1.05515, 0.976433, 1.01714, 1.01288, 0.994341, 0.979535, 0.976823, 0.978074, 0.949956, 0.923077, 0.837593, 1], +[1.06226, 1.12014, 1.17891, 1.18049, 1.03381, 1.07113, 1.05943, 1.05496, 1.04184, 1.04432, 1.00074, 1.01669, 1.00968, 1.00158, 0.991343, 0.981698, 0.971028, 0.963456, 1, 0.853603, 1], +[1.0421, 1.04362, 1.03215, 1.00733, 1.00688, 1.01012, 0.995392, 0.975134, 0.961122, 0.859542, 0.894761, 0.968768, 0.968193, 0.971021, 0.968925, 0.966411, 0.963923, 0.962293, 1, 0.810748, 1], +[1.05884, 1.04375, 1.03846, 1.01044, 1.01915, 1.01851, 1.0016, 0.986813, 0.966459, 0.867083, 0.886514, 0.973076, 0.970679, 0.972459, 0.970648, 0.96881, 0.972509, 0.968884, 1, 0.774462, 1], +[1.05683, 1.0476, 1.0008, 0.97346, 1.02024, 1.02595, 0.994583, 0.98965, 0.959866, 0.867563, 0.885586, 0.975321, 0.969133, 0.970606, 0.968159, 0.961191, 0.957472, 1, 1, 0.728722, 1], +[1.0544, 1.021, 1.02373, 0.981706, 1.00512, 1.01978, 0.989929, 0.974602, 0.95836, 0.854214, 0.865464, 0.972314, 0.965047, 0.967045, 0.961512, 0.947749, 0.83201, 1, 1, 0.656396, 1], +[1.0136, 0.986109, 0.94201, 0.874168, 0.89865, 0.987246, 0.936149, 0.93741, 0.92277, 0.831139, 0.848595, 0.973952, 0.952389, 0.952801, 0.940302, 0.93932, 1, 1, 1, 0.709617, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[0.957084, 0.91684, 0.85538, 0.78333, 0.773765, 0.931254, 0.895317, 0.88877, 0.877844, 0.796638, 0.797414, 0.944883, 0.920993, 0.903721, 0.774315, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 0.832556, 0.698693, 0.639456, 0.692557, 0.777771, 0.792767, 0.849111, 0.708267, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetConfig.py new file mode 100755 index 000000000000..0d6f6473dd83 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetConfig.py @@ -0,0 +1,1541 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +# Monitoring classes are loaded for each algorithm + +from AthenaCommon.Logging import logging +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloJetGridFromCells +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloJetGridFromFEBHeader +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloJetConeTool +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloJetCalibTool +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1CaloJet +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1CaloFullScanJet +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1CaloJetFullScanFastJetTool +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1Unpacking +from TrigT2CaloJet.TrigT2CaloJetConf import T2AllRoiUnpacking +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloFastJet +from TrigT2CaloJet.TrigT2CaloJetConf import T2CaloJet +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1TowerCalibTool +from TrigT2CaloJet.TrigT2CaloJetConf import T2L1CaloJetCalibTool + +import TrigT2CaloJet.CalibrationFactorsL15 as CalibrationFactorsL15 + +from TrigT2CaloCalibration.TrigT2CaloCalibrationConf import T2SampCalibTool +from TrigT2CaloCalibration.TrigT2CaloCalibrationConf import T2JESCalibTool +from TrigT2CaloCalibration.TrigT2CaloCalibrationConf import T2GSCalibTool + +#import JetCalibTools.EtaMassEnergyFactors as EtaMassEnergyFactors +#import JetCalibTools.Tile1FractionConstants as Tile1FractionConstants +#import JetCalibTools.HEC0FractionConstants as HEC0FractionConstants +#import JetCalibTools.EM3FractionConstants as EM3FractionConstants +#import JetCalibTools.FCAL1FractionConstants as FCAL1FractionConstants +#import JetCalibTools.PresamplerFractionConstants as PresamplerFractionConstants + +from AthenaCommon.Constants import VERBOSE,DEBUG,INFO +from AthenaPython import PyAthena # for L1.5 enums + +class T2AllRoiUnpacking_test(T2AllRoiUnpacking): + __slots__ = [] + def __init__(self, name="T2AllRoiUnpacking_test", noisecut=2.): + super( T2AllRoiUnpacking_test, self ).__init__(name) + from TrigT2CaloJet.TrigT2CaloJetMonitoring import T2AllRoiUnpackingTimeOnlineMonitoring, T2AllRoiUnpackingTimeValidationMonitoring + online = T2AllRoiUnpackingTimeOnlineMonitoring() + validation = T2AllRoiUnpackingTimeValidationMonitoring() + self.AthenaMonTools = [online, validation, ] + self.doTiming=True + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2CaloJetGridFromCells() + from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault + theNoiseTool = CaloNoiseToolDefault() + ToolSvc += theNoiseTool + # add the tool used to get & fill the calorimeter cells + t2calojetgridfromcellsTool = T2CaloJetGridFromCells() + t2calojetgridfromcellsTool.doTiming = True + t2calojetgridfromcellsTool.doHECcellQualityCleaning = False + t2calojetgridfromcellsTool.applyNoiseCut = True # gerbaudo@cern.ch: should I set also the threshold? (default is 2.0) + t2calojetgridfromcellsTool.noiseTool = theNoiseTool + t2calojetgridfromcellsTool.applyNoiseCut = True + t2calojetgridfromcellsTool.noiseCutValue = noisecut + + self.GridFromCellsTool = t2calojetgridfromcellsTool + # here put your customizations + self.L2RoiEtaHalfWidth = 0.5 + self.L2RoiPhiHalfWidth = 0.5 + #self.MergeEmCells=False #default True + +## L1.5 unpackers +class T2L1Unpacking_Base (T2L1Unpacking): + __slots__ = [] + def __init__(self, name): + super( T2L1Unpacking_Base, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2L1UnpackingValidationMonitoring, TrigT2L1UnpackingOnlineMonitoring, TrigT2L1UnpackingCosmicMonitoring + validation = TrigT2L1UnpackingValidationMonitoring() + online = TrigT2L1UnpackingOnlineMonitoring() + cosmic = TrigT2L1UnpackingCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1Unpacking_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + +class T2L1Unpacking_TT (T2L1Unpacking_Base): + __slots__ = [] + def __init__(self, name="T2L1Unpacking_TT"): + super( T2L1Unpacking_TT, self ).__init__(name) + # here put your customizations + self.doTriggerTowers = True + +class T2L1Unpacking_TT_TowerCalib (T2L1Unpacking_Base): + __slots__ = [] + def __init__(self, name="T2L1Unpacking_TT_TowerCalib"): + super( T2L1Unpacking_TT_TowerCalib, self ).__init__(name) + # here put your customizations + self.doTriggerTowers = True + # add in the calibration tool + t2l1towercalibtool = T2L1TowerCalibTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1TowerCalibTool() + energyCorr = [ [ ] ] + energyCorr = CalibrationFactorsL15.energyCorrDict['TT_factors'] + t2l1towercalibtool.Calib_Factors = str(energyCorr) + self.T2JetTools = [t2l1towercalibtool] + +class T2L1Unpacking_JE (T2L1Unpacking_Base): + __slots__ = [] + def __init__(self, name="T2L1Unpacking_JE"): + super( T2L1Unpacking_JE, self ).__init__(name) + # here put your customizations + self.doTriggerTowers = False + +class T2L1Unpacking_JE_TowerCalib (T2L1Unpacking_Base): + __slots__ = [] + def __init__(self, name="T2L1Unpacking_JE_TowerCalib"): + super( T2L1Unpacking_JE_TowerCalib, self ).__init__(name) + # here put your customizations + self.doTriggerTowers = False + # add in the calibration tool + t2l1towercalibtool = T2L1TowerCalibTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1TowerCalibTool() + energyCorr = [ [ ] ] + energyCorr = CalibrationFactorsL15.energyCorrDict['JE_factors'] + t2l1towercalibtool.Calib_Factors = str(energyCorr) + self.T2JetTools = [t2l1towercalibtool] + +class T2CaloFastJet_CC (T2CaloFastJet): + "T2CaloFastJet FEX to be used with calorimeter cells" + __slots__ = [] + def __init__(self, name="T2CaloFastJet_CC"): + super( T2CaloFastJet_CC, self ).__init__(name) + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2CaloFastJetValidationMonitoring, TrigT2CaloFastJetOnlineMonitoring, TrigT2CaloFastJetCosmicMonitoring + validation = TrigT2CaloFastJetValidationMonitoring() + online = TrigT2CaloFastJetOnlineMonitoring() + cosmic = TrigT2CaloFastJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2CaloFastJet_CC_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = False # do the regular cell-based cleaning + self.outputType = PyAthena.T2L1Tools.A4CC + +class T2CaloFastJet_CC_JESCalib (T2CaloFastJet_CC): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_CC_JESCalib"): + super( T2CaloFastJet_CC_JESCalib, self ).__init__(name) + # here put your customizations + self.outputType = PyAthena.T2L1Tools.A4CC_JES + # add in the calibration tool + t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + t2jescalibtool.MinEtCut = 1 + # Jet calibration factors + energyCorr = [ [ ] ] +# energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + t2jescalibtool.JES_Factors = str(energyCorr) + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + t2calojetcalibtool.doJetCalib = True + t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + self.T2JetTools = [t2calojetcalibtool] + +class T2CaloFastJet_CC_JESCalib_L15 (T2CaloFastJet_CC_JESCalib): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_CC_JESCalib_L15"): + super( T2CaloFastJet_CC_JESCalib_L15, self ).__init__(name) + # here put your customizations + self.inputType = PyAthena.T2L1Tools.A4TT +class T2CaloFastJet_CC_JESCalib_L15had (T2CaloFastJet_CC_JESCalib): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_CC_JESCalib_L15had"): + super( T2CaloFastJet_CC_JESCalib_L15had, self ).__init__(name) + # here put your customizations + self.inputType = PyAthena.T2L1Tools.A4TT_JES + + +## L1.5 FastJet FEXes +class T2CaloFastJet_Base (T2CaloFastJet): + __slots__ = [] + def __init__(self, name): + super( T2CaloFastJet_Base, self ).__init__(name) + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2CaloFastJetValidationMonitoring, TrigT2CaloFastJetOnlineMonitoring, TrigT2CaloFastJetCosmicMonitoring + validation = TrigT2CaloFastJetValidationMonitoring() + online = TrigT2CaloFastJetOnlineMonitoring() + cosmic = TrigT2CaloFastJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2CaloFastJet_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + +############### +# All non-multiple output TE algorithms should not be used with current L1.5 L2 interface +############### +#class T2CaloFastJet_a4JE (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4JE"): + #super( T2CaloFastJet_a4JE, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4JE + +#class T2CaloFastJet_a4JE_TowerCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4JE_TowerCalib"): + #super( T2CaloFastJet_a4JE_TowerCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.inputType = PyAthena.T2L1Tools.CALIBRATED + #self.outputType = PyAthena.T2L1Tools.A4JE_TC + + +#class T2CaloFastJet_a4JE_JESCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4JE_JESCalib"): + #super( T2CaloFastJet_a4JE_JESCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4JE_JES + + ## add in the calibration tool + #t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + #t2jescalibtool.MinEtCut = 1 + ## Jet calibration factors + #energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + #t2jescalibtool.JES_Factors = str(energyCorr) + + #t2calojetcalibtool = T2CaloJetCalibTool() + #t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + #t2calojetcalibtool.doJetCalib = True + #t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + #self.T2JetTools = [t2calojetcalibtool] + + +#class T2CaloFastJet_a4JE_TowerCalib_JESCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4JE_TowerCalib_JESCalib"): + #super( T2CaloFastJet_a4JE_TowerCalib_JESCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.inputType = PyAthena.T2L1Tools.CALIBRATED + #self.outputType = PyAthena.T2L1Tools.A4JE_TC_JES + + ## add in the calibration tool + #t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + #t2jescalibtool.MinEtCut = 1 + ## Jet calibration factors + #energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + #t2jescalibtool.JES_Factors = str(energyCorr) + + #t2calojetcalibtool = T2CaloJetCalibTool() + #t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + #t2calojetcalibtool.doJetCalib = True + #t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + #self.T2JetTools = [t2calojetcalibtool] + + +#class T2CaloFastJet_a10JE (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a10JE"): + #super( T2CaloFastJet_a10JE, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.distanceParameter = 1.0 + #self.outputType = PyAthena.T2L1Tools.A10JE + +class T2CaloFastJet_a4JE (T2CaloFastJet_Base): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_a4JE"): + super( T2CaloFastJet_a4JE, self ).__init__(name) + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = True + self.outputType = PyAthena.T2L1Tools.A4JE + self.writeMultipleOutputTEs = True + self.secondOutputType = PyAthena.T2L1Tools.L2CONE +class T2CaloFastJet_a10JE (T2CaloFastJet_Base): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_a10JE"): + super( T2CaloFastJet_a10JE, self ).__init__(name) + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = True + self.outputType = PyAthena.T2L1Tools.A10JE + self.distanceParameter = 1.0 + self.writeMultipleOutputTEs = True + self.secondOutputType = PyAthena.T2L1Tools.L2CONE +############### +# All non-multiple output TE algorithms should not be used with current L1.5 L2 interface +############### +#class T2CaloFastJet_a4JE_PileupSubtraction (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4JE_PileupSubtraction"): + #super( T2CaloFastJet_a4JE_PileupSubtraction, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4JE_PU_SUB + #self.doPileupSubtraction = True + +#class T2CaloFastJet_a4TT (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4TT"): + #super( T2CaloFastJet_a4TT, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4TT + +#class T2CaloFastJet_a4TT_TowerCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4TT_TowerCalib"): + #super( T2CaloFastJet_a4TT_TowerCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.inputType = PyAthena.T2L1Tools.CALIBRATED + #self.outputType = PyAthena.T2L1Tools.A4TT_TC + + +#class T2CaloFastJet_a4TT_JESCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4TT_JESCalib"): + #super( T2CaloFastJet_a4TT_JESCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4TT_JES + + ## add in the calibration tool + #t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + #t2jescalibtool.MinEtCut = 1 + ## Jet calibration factors + #energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + #t2jescalibtool.JES_Factors = str(energyCorr) + + #t2calojetcalibtool = T2CaloJetCalibTool() + #t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + #t2calojetcalibtool.doJetCalib = True + #t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + #self.T2JetTools = [t2calojetcalibtool] + + +#class T2CaloFastJet_a4TT_TowerCalib_JESCalib (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4TT_TowerCalib_JESCalib"): + #super( T2CaloFastJet_a4TT_TowerCalib_JESCalib, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.inputType = PyAthena.T2L1Tools.CALIBRATED + #self.outputType = PyAthena.T2L1Tools.A4TT_TC_JES + + ## add in the calibration tool + #t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + #t2jescalibtool.MinEtCut = 1 + ## Jet calibration factors + #energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + #t2jescalibtool.JES_Factors = str(energyCorr) + + #t2calojetcalibtool = T2CaloJetCalibTool() + #t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + #t2calojetcalibtool.doJetCalib = True + #t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + #t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + #self.T2JetTools = [t2calojetcalibtool] + + +#class T2CaloFastJet_a10TT (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a10TT"): + #super( T2CaloFastJet_a10TT, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.distanceParameter = 1.0 + #self.outputType = PyAthena.T2L1Tools.A10TT + + +class T2CaloFastJet_a4TT (T2CaloFastJet_Base): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_a4TT"): + super( T2CaloFastJet_a4TT, self ).__init__(name) + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = True + self.outputType = PyAthena.T2L1Tools.A4TT + self.writeMultipleOutputTEs = True + self.secondOutputType = PyAthena.T2L1Tools.L2CONE + +class T2CaloFastJet_a10TT (T2CaloFastJet_Base): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_a10TT"): + super( T2CaloFastJet_a10TT, self ).__init__(name) + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = True + self.outputType = PyAthena.T2L1Tools.A10TT + self.distanceParameter = 1.0 + self.writeMultipleOutputTEs = True + self.secondOutputType = PyAthena.T2L1Tools.L2CONE + +class T2CaloFastJet_a4TT_JESCalib (T2CaloFastJet_Base): + __slots__ = [] + def __init__(self, name="T2CaloFastJet_a4TT_JESCalib"): + super( T2CaloFastJet_a4TT_JESCalib, self ).__init__(name) + # here put your customizations + self.doCleaning = True + self.doT2L1Cleaning = True + self.outputType = PyAthena.T2L1Tools.A4TT_JES + self.pTmin = 10000. # here we could lower the pTmin cut so we can calibrate jets up. + + # add in the calibration tool + t2l1calojetcalibtool = T2L1CaloJetCalibTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1CaloJetCalibTool() + # Jet calibration factors + energyCorr = [ [ ] ] + energyCorr = CalibrationFactorsL15.energyCorrDict['L2FS_em_residual_factors'] ### DEBUG FACTORS replace with real ones + Eta_bins = CalibrationFactorsL15.binEdgeDict['L2FS_em_residual_factors_eta'] + t2l1calojetcalibtool.Calib_Factors = str(energyCorr) + t2l1calojetcalibtool.Eta_bin_edges = Eta_bins + assert len(Eta_bins)-1 == len(energyCorr), "T2CaloFastJet_a4TT_JESCalib eta bin length %i-1 != number of x bins in energy correction matrix %i"%(len(Eta_bins),len(energyCorr)) + + # add in the calibration tool + t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + t2jescalibtool.MinEtCut = 1 + # Jet calibration factors + energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] # as a test, eventually we'll have our own constants + t2jescalibtool.JES_Factors = str(energyCorr) + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + t2calojetcalibtool.doJetCalib = True + t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + self.T2JetTools = [t2l1calojetcalibtool,t2calojetcalibtool] + + self.writeMultipleOutputTEs = True + self.secondOutputType = PyAthena.T2L1Tools.L2CONE + +#class T2CaloFastJet_a4TT_PileupSubtraction (T2CaloFastJet_Base): + #__slots__ = [] + #def __init__(self, name="T2CaloFastJet_a4TT_PileupSubtraction"): + #super( T2CaloFastJet_a4TT_PileupSubtraction, self ).__init__(name) + ## here put your customizations + #self.doCleaning = True + #self.doT2L1Cleaning = True + #self.outputType = PyAthena.T2L1Tools.A4TT_PU_SUB + #self.doPileupSubtraction = True + +## depreciated L1.5 FEXes +class T2L1CaloFullScanFastJet_JE_Jet (T2L1CaloFullScanJet): + __slots__ = [] + def __init__(self, name="T2L1CaloFullScanFastJet_JE_Jet"): + super( T2L1CaloFullScanFastJet_JE_Jet, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2L1CaloJetValidationMonitoring, TrigT2L1CaloJetOnlineMonitoring, TrigT2L1CaloJetCosmicMonitoring + validation = TrigT2L1CaloJetValidationMonitoring() + online = TrigT2L1CaloJetOnlineMonitoring() + cosmic = TrigT2L1CaloJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1CaloFullScanJet_JE_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + # here put your customizations + t2l1fullscanfastjettool = T2L1CaloJetFullScanFastJetTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1CaloJetFullScanFastJetTool() + t2l1fullscanfastjettool.coneRadius = 0.4 + t2l1fullscanfastjettool.doTriggerTowers = False + t2l1fullscanfastjettool.doCleaning = True + + self.T2JetTools = [t2l1fullscanfastjettool] + +class T2L1CaloFullScanFastJet_TT_Jet (T2L1CaloFullScanJet): + __slots__ = [] + def __init__(self, name="T2L1CaloFullScanFastJet_TT_Jet"): + super( T2L1CaloFullScanFastJet_TT_Jet, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2L1CaloJetValidationMonitoring, TrigT2L1CaloJetOnlineMonitoring, TrigT2L1CaloJetCosmicMonitoring + validation = TrigT2L1CaloJetValidationMonitoring() + online = TrigT2L1CaloJetOnlineMonitoring() + cosmic = TrigT2L1CaloJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1CaloFullScanJet_TT_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + # here put your customizations + t2l1fullscanfastjettool = T2L1CaloJetFullScanFastJetTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1CaloJetFullScanFastJetTool() + t2l1fullscanfastjettool.coneRadius = 0.4 + t2l1fullscanfastjettool.doTriggerTowers = True + t2l1fullscanfastjettool.doCleaning = True + t2l1fullscanfastjettool.doJetFinding = True + + self.T2JetTools = [t2l1fullscanfastjettool] + + # debug + self.recordOutput = True + +class T2L1CaloFullScanFastJet_10_TT_Jet (T2L1CaloFullScanJet): + __slots__ = [] + def __init__(self, name="T2L1CaloFullScanFastJet_10_TT_Jet"): + super( T2L1CaloFullScanFastJet_10_TT_Jet, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2L1CaloJetValidationMonitoring, TrigT2L1CaloJetOnlineMonitoring, TrigT2L1CaloJetCosmicMonitoring + validation = TrigT2L1CaloJetValidationMonitoring() + online = TrigT2L1CaloJetOnlineMonitoring() + cosmic = TrigT2L1CaloJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1CaloFullScanJet_10_TT_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + # here put your customizations + t2l1fullscanfastjettool = T2L1CaloJetFullScanFastJetTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1CaloJetFullScanFastJetTool() + t2l1fullscanfastjettool.coneRadius = 1.0 + t2l1fullscanfastjettool.doTriggerTowers = True + + self.T2JetTools = [t2l1fullscanfastjettool] + + +class T2L1CaloFullScanFastJet_10_JE_Jet (T2L1CaloFullScanJet): + __slots__ = [] + def __init__(self, name="T2L1CaloFullScanFastJet_10_JE_Jet"): + super( T2L1CaloFullScanFastJet_10_JE_Jet, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2L1CaloJetValidationMonitoring, TrigT2L1CaloJetOnlineMonitoring, TrigT2L1CaloJetCosmicMonitoring + validation = TrigT2L1CaloJetValidationMonitoring() + online = TrigT2L1CaloJetOnlineMonitoring() + cosmic = TrigT2L1CaloJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1CaloFullScanJet_10_JE_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + # here put your customizations + t2l1fullscanfastjettool = T2L1CaloJetFullScanFastJetTool() + from AthenaCommon.AppMgr import ToolSvc + ToolSvc += T2L1CaloJetFullScanFastJetTool() + t2l1fullscanfastjettool.coneRadius = 1.0 + t2l1fullscanfastjettool.doTriggerTowers = False + + self.T2JetTools = [t2l1fullscanfastjettool] + + +class T2L1CaloJet_Jet (T2L1CaloJet): + __slots__ = [] + def __init__(self, name="T2L1CaloJet_Jet"): + super( T2L1CaloJet_Jet, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2VirtualL1CaloJetValidationMonitoring, TrigT2VirtualL1CaloJetOnlineMonitoring, TrigT2VirtualL1CaloJetCosmicMonitoring + validation = TrigT2VirtualL1CaloJetValidationMonitoring() + online = TrigT2VirtualL1CaloJetOnlineMonitoring() + cosmic = TrigT2VirtualL1CaloJetCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2L1CaloJet_Time") + time.TimerHistLimits = [0,20] + self.doTiming=True + + self.AthenaMonTools = [ validation, online, time, cosmic] + + +class T2CaloJetBase (T2CaloJet): + __slots__ = [] + def __init__(self, name): + super( T2CaloJetBase, self ).__init__(name) + + from TrigT2CaloJet.TrigT2CaloJetMonitoring import TrigT2CaloJetValidationMonitoring, TrigT2CaloJetOnlineMonitoring, TrigT2CaloJetCosmicMonitoring, TrigT2CaloJetTimeMonitoring + validation = TrigT2CaloJetValidationMonitoring() + online = TrigT2CaloJetOnlineMonitoring() + cosmic = TrigT2CaloJetCosmicMonitoring() + timeUnp = TrigT2CaloJetTimeMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("T2CaloJet_Time") + + self.AthenaMonTools = [ validation, online, time, timeUnp, cosmic] + + # are these the correct widths for the jets ?? + # really the best thing to do would be for T2CaloJet + # to determine the jet size *itself*, perhaps even on + # a jet-by-jet basis + self.EtaIDWidth = 0.2 + self.PhiIDWidth = 0.2 + + +### Classes for non-calibrated L2 jets #### + +class T2CaloJet_Jet_noCalib (T2CaloJetBase): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noCalib"): + super(T2CaloJet_Jet_noCalib, self).__init__(name) + + # here put your customizations + t2calojetconetool = T2CaloJetConeTool() + t2calojetconetool.coneRadius = 0.4 + t2calojetconetool.numberOfIterations = 3 + t2calojetconetool.coneFJRadius=[1.0,0.7,0.4] + t2calojetconetool.cellQualityThresholdLAr = 4000 + t2calojetconetool.leadingCellFraction = 0.9 + + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.clearJetGrid = False + #self.OutputLevel = INFO + + t2calojetgridfromcells = T2CaloJetGridFromCells() + t2calojetgridfromcells.doTiming = True + t2calojetgridfromcells.doHECcellQualityCleaning = False + + self.jetOutputKey = "TrigT2CaloJet" + + self.T2JetTools = [t2calojetgridfromcells, + t2calojetconetool + ] + +class T2CaloJet_Jet_noCalib_cellCleaning (T2CaloJet_Jet_noCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noCalib_cellCleaning"): + super(T2CaloJet_Jet_noCalib_cellCleaning, self).__init__(name) + + t2calojetgridfromcells = T2CaloJetGridFromCells("T2CaloJetGridFromCells_cellCleaning") + t2calojetgridfromcells.doHECcellQualityCleaning = True + t2calojetgridfromcells.cellQualityThresholdHEC = 65535 + + +class T2CaloJet_Jet_noCalib_noiseCut (T2CaloJet_Jet_noCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noCalib_noiseCut",noisecut=2.): + mlog = logging.getLogger( 'T2CaloJet_Jet_noCalib_noiseCut:' ) + try: + from AthenaCommon.AppMgr import ToolSvc + from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault + theNoiseTool = CaloNoiseToolDefault() + ToolSvc += theNoiseTool + #cellTool.CaloNoiseTool=theCaloNoiseTool + except Exception: + mlog.error("could not get handle to CaloNoiseToolDefault") + print traceback.format_exc() + return False + + super(T2CaloJet_Jet_noCalib_noiseCut, self).__init__(name) + #self.t2calojetgridfromcells = T2CaloJetGridFromCells() + self.T2JetTools[0].noiseTool = theNoiseTool + self.T2JetTools[0].applyNoiseCut = True + self.T2JetTools[0].noiseCutValue = noisecut + +### Classes for L2 jets calibrated with the offline JES correction ### + +class T2CaloJet_Jet_JESCalib (T2CaloJetBase): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib"): + super(T2CaloJet_Jet_JESCalib, self).__init__(name) + + # here put your customizations + t2calojetconetool = T2CaloJetConeTool() + t2calojetconetool.coneRadius = 0.4 + t2calojetconetool.numberOfIterations = 3 + t2calojetconetool.coneFJRadius=[1.0,0.7,0.4] + t2calojetconetool.cellQualityThresholdLAr = 4000 + t2calojetconetool.leadingCellFraction = 0.9 + + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.clearJetGrid = False + #self.OutputLevel = INFO + + t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + t2jescalibtool.MinEtCut = 1 + # Jet calibration factors + energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] + t2jescalibtool.JES_Factors = str(energyCorr) + + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + t2calojetcalibtool.doJetCalib = True + t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + t2calojetgridfromcells = T2CaloJetGridFromCells() + t2calojetgridfromcells.doTiming = True + t2calojetgridfromcells.doHECcellQualityCleaning = False + + self.jetOutputKey = "TrigT2CaloJet" + + self.T2JetTools = [t2calojetgridfromcells, + t2calojetconetool, + t2calojetcalibtool] + +class T2CaloJet_Jet_JESCalib_cellCleaning (T2CaloJet_Jet_JESCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib_cellCleaning"): + + t2calojetgridfromcells = T2CaloJetGridFromCells("T2CaloJetGridFromCells_cellCleaning") + t2calojetgridfromcells.doHECcellQualityCleaning = True + t2calojetgridfromcells.cellQualityThresholdHEC = 65535 + + +class T2CaloJet_Jet_JESCalib_noiseCut (T2CaloJet_Jet_JESCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib_noiseCut",noisecut=2.): + mlog = logging.getLogger( 'T2CaloJet_Jet_JESCalib_noiseCut:' ) + try: + from AthenaCommon.AppMgr import ToolSvc + from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault + theNoiseTool = CaloNoiseToolDefault() + ToolSvc += theNoiseTool + #cellTool.CaloNoiseTool=theCaloNoiseTool + except Exception: + mlog.error("could not get handle to CaloNoiseToolDefault") + print traceback.format_exc() + return False + + super(T2CaloJet_Jet_JESCalib_noiseCut, self).__init__(name) + #self.t2calojetgridfromcells = T2CaloJetGridFromCells() + self.T2JetTools[0].noiseTool = theNoiseTool + self.T2JetTools[0].applyNoiseCut = True + self.T2JetTools[0].noiseCutValue = noisecut + +class T2CaloJet_Jet_JESCalib_writeLayers (T2CaloJet_Jet_JESCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib_writeLayers"): + super(T2CaloJet_Jet_JESCalib_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +class T2CaloJet_Jet_JESCalib_cellCleaning_writeLayers (T2CaloJet_Jet_JESCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib_cellCleaning_writeLayers"): + super(T2CaloJet_Jet_JESCalib_cellCleaning_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +class T2CaloJet_Jet_JESCalib_noiseCut_writeLayers (T2CaloJet_Jet_JESCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_JESCalib_noiseCut_writeLayers"): + super(T2CaloJet_Jet_JESCalib_noiseCut_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +### Classes for jets calibrated with the offline GSC procedure ### + +class T2CaloJet_Jet_GSCalib (T2CaloJetBase): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib"): + super(T2CaloJet_Jet_GSCalib, self).__init__(name) + + # here put your customizations + t2calojetconetool = T2CaloJetConeTool() + t2calojetconetool.coneRadius = 0.4 + t2calojetconetool.numberOfIterations = 3 + t2calojetconetool.coneFJRadius=[1.0,0.7,0.4] + t2calojetconetool.cellQualityThresholdLAr = 4000 + t2calojetconetool.leadingCellFraction = 0.9 + + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.clearJetGrid = False + #self.OutputLevel = INFO + + t2jescalibtool = T2JESCalibTool("T2JESCalibTool_Jet") + t2jescalibtool.MinEtCut = 1 + energyCorr = [ [ ] ] + #energyCorr = EtaMassEnergyFactors.energyCorrDict['AntiKt4TopoJets_EM'] + t2jescalibtool.JES_Factors = str(energyCorr) + + t2gscalibtooltile1 = T2GSCalibTool("T2GSCalibToolTile1_Jet") + etaFit = [] + etabins = [] + ptbins = [] + layerFracBins = [] + #etaFit = Tile1FractionConstants.tile1EtaFitDict['AntiKt4TopoJets'] + #etabins = Tile1FractionConstants.tile1EtaBinsDict['AntiKt4TopoJets'] + #ptbins = Tile1FractionConstants.tile1PtBinsDict['AntiKt4TopoJets'] + #layerFracBins = Tile1FractionConstants.tile1LayerFracBinsDict['AntiKt4TopoJets'] + t2gscalibtooltile1.CalibConstants = str(etaFit) + t2gscalibtooltile1.EtaBins = etabins + t2gscalibtooltile1.EtaMin = -1.7 + t2gscalibtooltile1.EtaMax = 1.7 + t2gscalibtooltile1.PtBins = ptbins + t2gscalibtooltile1.PtMin = 1000.0 + t2gscalibtooltile1.JetPropertyBins = layerFracBins + + t2gscalibtoolfcal1 = T2GSCalibTool("T2GSCalibToolFcal1_Jet") + etaFit = [] + etabins = [] + ptbins = [] + layerFracBins = [] + #etaFit = FCAL1FractionConstants.fcal1EtaFitDict['AntiKt4TopoJets'] + #etabins = FCAL1FractionConstants.fcal1EtaBinsDict['AntiKt4TopoJets'] + #ptbins = FCAL1FractionConstants.fcal1PtBinsDict['AntiKt4TopoJets'] + #layerFracBins = FCAL1FractionConstants.fcal1LayerFracBinsDict['AntiKt4TopoJets'] + t2gscalibtoolfcal1.CalibConstants = str(etaFit) + t2gscalibtoolfcal1.EtaBins = etabins + t2gscalibtoolfcal1.EtaMin = -4.4 + t2gscalibtoolfcal1.EtaGapMin = -3.5 + t2gscalibtoolfcal1.EtaGapMax = 3.5 + t2gscalibtoolfcal1.EtaMax = 4.4 + t2gscalibtoolfcal1.PtBins = ptbins + t2gscalibtoolfcal1.PtMin = 1000.0 + t2gscalibtoolfcal1.JetPropertyBins = layerFracBins + + t2gscalibtoolem3bar = T2GSCalibTool("T2GSCalibToolEm3Bar_Jet") + t2gscalibtoolem3fwd = T2GSCalibTool("T2GSCalibToolEm3Fwd_Jet") + etaFit = [] + etabins = [] + ptbins = [] + layerFracBins = [] + #etaFit = EM3FractionConstants.em3EtaFitDict['AntiKt4TopoJets'] + #etabins = EM3FractionConstants.em3EtaBinsDict['AntiKt4TopoJets'] + #ptbins = EM3FractionConstants.em3PtBinsDict['AntiKt4TopoJets'] + #layerFracBins = EM3FractionConstants.em3LayerFracBinsDict['AntiKt4TopoJets'] + t2gscalibtoolem3bar.CalibConstants = str(etaFit) + t2gscalibtoolem3bar.EtaBins = etabins + t2gscalibtoolem3bar.EtaMin = -1.2 + t2gscalibtoolem3bar.EtaMax = 1.2 + t2gscalibtoolem3bar.PtBins = ptbins + t2gscalibtoolem3bar.PtMin = 1000 + t2gscalibtoolem3bar.JetPropertyBins = layerFracBins + t2gscalibtoolem3fwd.CalibConstants = str(etaFit) + t2gscalibtoolem3fwd.EtaBins = etabins + t2gscalibtoolem3fwd.EtaMin = -3.0 + t2gscalibtoolem3fwd.EtaGapMin = -1.7 + t2gscalibtoolem3fwd.EtaGapMax = 1.7 + t2gscalibtoolem3fwd.EtaMax = 3.0 + t2gscalibtoolem3fwd.PtBins = ptbins + t2gscalibtoolem3fwd.PtMin = 1000.0 + t2gscalibtoolem3fwd.JetPropertyBins = layerFracBins + + t2gscalibtoolhec0 = T2GSCalibTool("T2GSCalibToolHec0_Jet") + etaFit = [] + etabins = [] + ptbins = [] + layerFracBins = [] + #etaFit = HEC0FractionConstants.hec0EtaFitDict['AntiKt4TopoJets'] + #etabins = HEC0FractionConstants.hec0EtaBinsDict['AntiKt4TopoJets'] + #ptbins = HEC0FractionConstants.hec0PtBinsDict['AntiKt4TopoJets'] + #layerFracBins = HEC0FractionConstants.hec0LayerFracBinsDict['AntiKt4TopoJets'] + t2gscalibtoolhec0.CalibConstants = str(etaFit) + t2gscalibtoolhec0.EtaBins = etabins + t2gscalibtoolhec0.EtaMin = -3.0 + t2gscalibtoolhec0.EtaGapMin = -1.4 + t2gscalibtoolhec0.EtaGapMax = 1.4 + t2gscalibtoolhec0.EtaMax = 3.0 + t2gscalibtoolhec0.PtBins = ptbins + t2gscalibtoolhec0.PtMin = 1000.0 + t2gscalibtoolhec0.JetPropertyBins = layerFracBins + + t2gscalibtoolpsbar = T2GSCalibTool("T2GSCalibToolPsBar_Jet") + etaFit = [] + etabins = [] + ptbins = [] + layerFracBins = [] + #etaFit = PresamplerFractionConstants.presEtaFitDict['AntiKt4TopoJets'] + #etabins = PresamplerFractionConstants.presEtaBinsDict['AntiKt4TopoJets'] + #ptbins = PresamplerFractionConstants.presPtBinsDict['AntiKt4TopoJets'] + #layerFracBins = PresamplerFractionConstants.presLayerFracBinsDict['AntiKt4TopoJets'] + t2gscalibtoolpsbar.CalibConstants = str(etaFit) + t2gscalibtoolpsbar.EtaBins = etabins + t2gscalibtoolpsbar.EtaMin = -1.7 + t2gscalibtoolpsbar.EtaMax = 1.7 + t2gscalibtoolpsbar.PtBins = ptbins + t2gscalibtoolpsbar.PtMin = 1000.0 + t2gscalibtoolpsbar.JetPropertyBins = layerFracBins + + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2JetCalibTool = t2jescalibtool + t2calojetcalibtool.T2JetCorrToolTile1 = t2gscalibtooltile1 + t2calojetcalibtool.T2JetCorrToolFcal1 = t2gscalibtoolfcal1 + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2gscalibtoolem3bar + t2calojetcalibtool.T2JetCorrToolHec0 = t2gscalibtoolhec0 + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2gscalibtoolem3fwd + t2calojetcalibtool.T2JetCorrToolPsBar = t2gscalibtoolpsbar + t2calojetcalibtool.doJetCalib = True + t2calojetcalibtool.doJetCorrTile1 = True + t2calojetcalibtool.doJetCorrFcal1 = True + t2calojetcalibtool.doJetCorrEm3Bar = True + t2calojetcalibtool.doJetCorrHec0 = True + t2calojetcalibtool.doJetCorrEm3Fwd = True + t2calojetcalibtool.doJetCorrPsBar = True + + t2calojetgridfromcells = T2CaloJetGridFromCells() + t2calojetgridfromcells.doTiming = True + t2calojetgridfromcells.doHECcellQualityCleaning = False + + self.jetOutputKey = "TrigT2CaloJet" + self.jetOutputKey = "TrigT2Calo" + + self.T2JetTools = [t2calojetgridfromcells, + t2calojetconetool, + t2calojetcalibtool] + + +class T2CaloJet_Jet_GSCalib_cellCleaning (T2CaloJet_Jet_GSCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib_cellCleaning"): + + t2calojetgridfromcells = T2CaloJetGridFromCells("T2CaloJetGridFromCells_cellCleaning") + t2calojetgridfromcells.doHECcellQualityCleaning = True + t2calojetgridfromcells.cellQualityThresholdHEC = 65535 + + +class T2CaloJet_Jet_GSCalib_noiseCut (T2CaloJet_Jet_GSCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib_noiseCut",noisecut=2.): + mlog = logging.getLogger( 'T2CaloJet_Jet_GSCalib_noiseCut:' ) + try: + from AthenaCommon.AppMgr import ToolSvc + from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault + theNoiseTool = CaloNoiseToolDefault() + ToolSvc += theNoiseTool + #cellTool.CaloNoiseTool=theCaloNoiseTool + except Exception: + mlog.error("could not get handle to CaloNoiseToolDefault") + print traceback.format_exc() + return False + + super(T2CaloJet_Jet_GSCalib_noiseCut, self).__init__(name) + #self.t2calojetgridfromcells = T2CaloJetGridFromCells() + self.T2JetTools[0].noiseTool = theNoiseTool + self.T2JetTools[0].applyNoiseCut = True + self.T2JetTools[0].noiseCutValue = noisecut + +class T2CaloJet_Jet_GSCalib_writeLayers (T2CaloJet_Jet_GSCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib_writeLayers"): + super(T2CaloJet_Jet_GSCalib_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +class T2CaloJet_Jet_GSCalib_cellCleaning_writeLayers (T2CaloJet_Jet_GSCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib_cellCleaning_writeLayers"): + super(T2CaloJet_Jet_GSCalib_cellCleaning_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +class T2CaloJet_Jet_GSCalib_noiseCut_writeLayers (T2CaloJet_Jet_GSCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_GSCalib_noiseCut_writeLayers"): + super(T2CaloJet_Jet_GSCalib_noiseCut_writeLayers, self).__init__(name) + self.fillLayerInfo = True + +### Classes for jets calibrated with the dedicated sampling method #### + +class T2CaloJet_Jet_sampCalib (T2CaloJetBase): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_sampCalib"): + super(T2CaloJet_Jet_sampCalib, self).__init__(name) + + # here put your customizations + t2calojetconetool = T2CaloJetConeTool() + t2calojetconetool.coneRadius = 0.4 + t2calojetconetool.numberOfIterations = 3 + t2calojetconetool.coneFJRadius=[1.0,0.7,0.4] + t2calojetconetool.cellQualityThresholdLAr = 4000 + t2calojetconetool.leadingCellFraction = 0.9 + + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.clearJetGrid = False + #self.OutputLevel = INFO + + t2sampcalibtool = T2SampCalibTool("T2SampCalibTool_Jet") + t2sampcalibtool.MinEtCut = 1 + t2sampcalibtool.nEtaBin = 50 + t2sampcalibtool.EtRegionLimit = 5000 + #New database tag + t2sampcalibtool.CreateDbObject=False + t2sampcalibtool.ReadFromDB=True + L2CalibFolder = "/CALO/T2CaloCalib/T2CaloJetCalib" + L2CalibTag = "L2JetCalib-10TeV-Ideal-01" + from IOVDbSvc.CondDB import conddb + conddb.addFolder("CALO",L2CalibFolder+"<tag>"+L2CalibTag+"</tag>") + + ############################################################# + ## THESE VALUES ARE NOT USED !!! # + ## ONLY USED AS A REFERENCE FOR WHAT WAS PUT IN THIS DB TAG # + ############################################################# + + t2sampcalibtool.EtaReg=[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9, + 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9, + 2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9, + 3.0,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9, + 4.0,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5.0] + + t2sampcalibtool.VECut=[ 1.0, 1.00500, 1.02006, 1.04534, 1.08107, + 1.12763, 1.18547, 1.25517, 1.33743, 1.43308, + 1.54308, 1.66852, 1.81065, 1.97091, 2.15090, + 2.35240, 2.57746, 2.82832, 3.10748, 3.41774, + 3.76220, 4.14432, 4.56790, 5.03722, 5.55694, + 6.13228, 6.76900, 7.47346, 8.25272, 9.11458, + 10.0677, 11.1215, 12.2866, 13.5748, 14.9987, + 16.5728, 18.3128, 20.2360, 22.3618, 24.7114, + 27.3082, 30.1784, 33.3507, 36.8567, 40.7316, + 1.0, 1.0, 1.0, 1.0, 1.0] + + t2sampcalibtool.Weights=[ + 1.71736, -0.0775919, 1., 0., + 1.68115, -0.0298649, 1., 0., + 1.72263, -0.0820785, 1., 0., + 1.59158, -0.0349583, 1., 0., + 1.71384, -0.0825993, 1., 0., + 1.56296, -0.0334272, 1., 0., + 1.71196, -0.0823075, 1., 0., + 1.55044, -0.0300373, 1., 0., + 1.73526, -0.0858796, 1., 0., + 1.52924, -0.0275084, 1., 0., + 1.74496, -0.0858104, 1., 0., + 1.61094, -0.032966, 1., 0., + 1.77075, -0.0874956, 1., 0., + 1.69556, -0.0399038, 1., 0., + 1.85845, -0.100017, 1., 0., + 1.63193, -0.0292829, 1., 0., + 1.92108, -0.108746, 1., 0., + 1.60507, -0.0185852, 1., 0., + 1.90991, -0.109427, 1., 0., + 1.73985, -0.0214682, 1., 0., + 1.97429, -0.114934, 1., 0., + 1.49217, -0.0234559, 1., 0., + 1.97011, -0.117122, 1., 0., + 1.40092, -0.0201076, 1., 0., + 1.96164, -0.119639, 1., 0., + 1.63634, -0.0399844, 1., 0., + 1.95562, -0.11617, 1., 0., + 1.81431, -0.0515824, 1., 0., + 1.96964, -0.105079, 1., 0., + 1.86882, -0.0653143, 1., 0., + 2.0155, -0.146639, 1., 0., + 1.60657, -0.00444997, 1., 0., + 1.82239, -0.111195, 1., 0., + 1.69562, -0.0408746, 1., 0., + 1.78718, -0.107874, 1., 0., + 1.6367, -0.0480624, 1., 0., + 1.73745, -0.100309, 1., 0., + 1.54562, -0.0400314, 1., 0., + 1.70874, -0.0979269, 1., 0., + 1.53771, -0.0414734, 1., 0., + 1.68658, -0.0964409, 1., 0., + 1.53234, -0.037261, 1., 0., + 1.62871, -0.0876685, 1., 0., + 1.5901, -0.0464532, 1., 0., + 1.60288, -0.0850231, 1., 0., + 1.51135, -0.0319969, 1., 0., + 1.55495, -0.0760847, 1., 0., + 1.60024, -0.0493416, 1., 0., + 1.61099, -0.0871627, 1., 0., + 1.56848, -0.0372076, 1., 0., + 1.61012, -0.080997, 1., 0., + 1.51628, -0.031721, 1., 0., + 1.5527, -0.0745029, 1., 0., + 1.68515, -0.0610052, 1., 0., + 1.54251, -0.0749989, 1., 0., + 1.75605, -0.0614183, 1., 0., + 1.5972, -0.0847241, 1., 0., + 1.83407, -0.0712398, 1., 0., + 1.63888, -0.085407, 1., 0., + 2.15163, -0.111614, 1., 0., + 1.86924, -0.127399, 1., 0., + 2.04718, -0.021142, 1., 0., + 1.93682, -0.114535, 1., 0., + 2.42857, -0.0398346, 1., 0., + 2.05425, -0.0634181, 1., 0., + 2.31097, -0.17624, 1., 0., + 2.3425, -0.134324, 1., 0., + 1.25573, 0.0160847, 1., 0., + 2.22724, -0.190316, 1., 0., + 1.59135, -0.0403045, 1., 0., + 1.70013, -0.105121, 1., 0., + 2.18796, -0.184129, 1., 0., + 1.46967, -0.0542641, 1., 0., + 1.40854, -0.00397349, 1., 0., + 1.7066, -0.103722, 1., 0., + 2.02067, -0.133273, 1., 0., + 2.3121, -0.244998, 1., 0., + -0.0145766, 0.362844, 1., 0., + 1.62273, -0.0687159, 1., 0., + 2.01868, -0.120886, 1., 0., + 1.07068, 0.0528097, 1., 0., + 3.34939, -0.412248, 1., 0., + 1.18681, 0.0214479, 1., 0., + 0.91684, 0.149364, 1., 0., + 0.377452, 0.214947, 1., 0., + 10.9671, -2.31455, 1., 0., + 2.77778, -0.372772, 1., 0., + -6.52839, 2.00992, 1., 0., + -5.04373, 1.62889, 1., 0., + -9.22444, 2.66876, 1., 0., + #46; Eta range [min,max]: [4.5,4.6] + #NEntries: 413 + 3.33217,-0.26788,1,0, + 3.66022,-0.303515,1,0, + #47; Eta range [min,max]: [4.6,4.7] + #NEntries: 292 + 3.64624,-0.30498,1,0, + 3.732,-0.297252,1,0, + #48; Eta range [min,max]: [4.7,4.8] + #NEntries: 207 + 5.74177,-0.587572,1,0, + 6.30603,-0.649457,1,0, + #49; Eta range [min,max]: [4.8,4.9] + #NEntries: 100 + 6.00682,-0.589085,1,0, + 16.6035,-2.09057,1,0, + #50; Eta range [min,max]: [4.9,5] + #NEntries: 4 + 1.42662,-0.0942826,1,0, + 8.93293,-0.0674104,1,0 + ] + + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2JetCalibTool = t2sampcalibtool + t2calojetcalibtool.doJetCalib = True + t2calojetcalibtool.T2JetCorrToolTile1 = t2sampcalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolFcal1 = t2sampcalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2sampcalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolHec0 = t2sampcalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2sampcalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolPsBar = t2sampcalibtool #dummy config + + t2calojetgridfromcells = T2CaloJetGridFromCells() + t2calojetgridfromcells.doTiming = True + t2calojetgridfromcells.doHECcellQualityCleaning = False + + self.jetOutputKey = "TrigT2CaloJet" + + self.T2JetTools = [t2calojetgridfromcells, + t2calojetconetool, + t2calojetcalibtool] + +class T2CaloJet_Jet_sampCalib_cellCleaning (T2CaloJet_Jet_sampCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_sampCalib_cellCleaning"): + + t2calojetgridfromcells = T2CaloJetGridFromCells("T2CaloJetGridFromCells_cellCleaning") + t2calojetgridfromcells.doHECcellQualityCleaning = True + t2calojetgridfromcells.cellQualityThresholdHEC = 65535 + + +class T2CaloJet_Jet_sampCalib_noiseCut (T2CaloJet_Jet_sampCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_sampCalib_noiseCut",noisecut=2.): + mlog = logging.getLogger( 'T2CaloJet_Jet_sampCalib_noiseCut:' ) + try: + from AthenaCommon.AppMgr import ToolSvc + from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault + theNoiseTool = CaloNoiseToolDefault() + ToolSvc += theNoiseTool + #cellTool.CaloNoiseTool=theCaloNoiseTool + except Exception: + mlog.error("could not get handle to CaloNoiseToolDefault") + print traceback.format_exc() + return False + + super(T2CaloJet_Jet_sampCalib_noiseCut, self).__init__(name) + #self.t2calojetgridfromcells = T2CaloJetGridFromCells() + self.T2JetTools[0].noiseTool = theNoiseTool + self.T2JetTools[0].applyNoiseCut = True + self.T2JetTools[0].noiseCutValue = noisecut + +### Legacy classes: use only one calibration option, disallow the others #### + +L2Calib="noCalib" +#L2Calib="JESCalib" +#L2Calib="JESCalib_LayerInfo" +#L2Calib="GSCalib" +#L2Calib="GSCalib_LayerInfo" +#L2Calib="sampCalib" + +if L2Calib=="JESCalib" : +### Use L2 jets calibrated with offline JES correction ### + class T2CaloJet_Jet (T2CaloJet_Jet_JESCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_JESCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_JESCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_JESCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" +elif L2Calib=="JESCalib_LayerInfo" : +### Use L2 jets calibrated with offline JES correction and write Layer energy ### + class T2CaloJet_Jet (T2CaloJet_Jet_JESCalib_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_JESCalib_noiseCut_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_JESCalib_cellCleaning_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_JESCalib_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" +elif L2Calib=="GSCalib" : +### Use L2 jets calibrated with offline GSC procedure ### + class T2CaloJet_Jet (T2CaloJet_Jet_GSCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_GSCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_GSCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_GSCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" +elif L2Calib=="GSCalib_LayerInfo" : +### Use L2 jets calibrated with offline GSC procedure and write Layer energy ### + class T2CaloJet_Jet (T2CaloJet_Jet_GSCalib_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_GSCalib_noiseCut_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_GSCalib_cellCleaning_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_GSCalib_writeLayers): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" +elif L2Calib=="sampCalib" : +### Use L2 jets calibrated with dedicated sampling method ### + class T2CaloJet_Jet (T2CaloJet_Jet_sampCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_sampCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_sampCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_sampCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" +else: +### Use non-calibrated L2 jets + class T2CaloJet_Jet (T2CaloJet_Jet_noCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet"): + super(T2CaloJet_Jet, self).__init__(name) + class T2CaloJet_Jet_noise (T2CaloJet_Jet_noCalib_noiseCut): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_noise"): + super(T2CaloJet_Jet_noise, self).__init__(name) + class T2CaloJet_Jet_cellCleaning (T2CaloJet_Jet_noCalib_cellCleaning): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_cellCleaning"): + super(T2CaloJet_Jet_cellCleaning, self).__init__(name) + class T2CaloJet_Jet_L15 (T2CaloJet_Jet_noCalib): + __slots__ = [] + def __init__ (self, name="T2CaloJet_Jet_L15"): + super(T2CaloJet_Jet_L15, self).__init__(name) + #self.jetOutputKey = "TrigT2CaloJet" + +### L2 Jets from Front-End Buffers ### + +class T2CaloJet_FEBJet (T2CaloJetBase): + __slots__ = [] + def __init__ (self, name="T2CaloJet_FEBJet"): + super(T2CaloJet_FEBJet, self).__init__(name) + + # here put your customizations + t2calojetconetool = T2CaloJetConeTool() + t2calojetconetool.coneRadius = 0.4 + t2calojetconetool.numberOfIterations = 3 + t2calojetconetool.coneFJRadius=[1.0,0.7,0.4] + + self.EtaWidth = 0.5 + self.PhiWidth = 0.5 + self.clearJetGrid = False + #self.OutputLevel = INFO + + t2sampcalibtool = T2SampCalibTool("T2SampCalibTool_Jet") + t2sampcalibtool.MinEtCut = 1 + t2sampcalibtool.nEtaBin = 50 + t2sampcalibtool.EtRegionLimit = 5000 + #New database tag + t2sampcalibtool.CreateDbObject=False + t2sampcalibtool.ReadFromDB=True + L2CalibFolder = "/CALO/T2CaloCalib/T2CaloJetCalib" + L2CalibTag = "L2JetCalib-10TeV-Ideal-01" + from IOVDbSvc.CondDB import conddb + conddb.addFolder("CALO",L2CalibFolder+"<tag>"+L2CalibTag+"</tag>") + + ############################################################# + ## THESE VALUES ARE NOT USED !!! # + ## ONLY USED AS A REFERENCE FOR WHAT WAS PUT IN THIS DB TAG # + ############################################################# + + t2sampcalibtool.EtaReg=[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9, + 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9, + 2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9, + 3.0,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9, + 4.0,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5.0] + + t2sampcalibtool.VECut=[ 1.0, 1.00500, 1.02006, 1.04534, 1.08107, + 1.12763, 1.18547, 1.25517, 1.33743, 1.43308, + 1.54308, 1.66852, 1.81065, 1.97091, 2.15090, + 2.35240, 2.57746, 2.82832, 3.10748, 3.41774, + 3.76220, 4.14432, 4.56790, 5.03722, 5.55694, + 6.13228, 6.76900, 7.47346, 8.25272, 9.11458, + 10.0677, 11.1215, 12.2866, 13.5748, 14.9987, + 16.5728, 18.3128, 20.2360, 22.3618, 24.7114, + 27.3082, 30.1784, 33.3507, 36.8567, 40.7316, + 1.0, 1.0, 1.0, 1.0, 1.0] + + t2sampcalibtool.Weights=[ + 1.71736, -0.0775919, 1., 0., + 1.68115, -0.0298649, 1., 0., + 1.72263, -0.0820785, 1., 0., + 1.59158, -0.0349583, 1., 0., + 1.71384, -0.0825993, 1., 0., + 1.56296, -0.0334272, 1., 0., + 1.71196, -0.0823075, 1., 0., + 1.55044, -0.0300373, 1., 0., + 1.73526, -0.0858796, 1., 0., + 1.52924, -0.0275084, 1., 0., + 1.74496, -0.0858104, 1., 0., + 1.61094, -0.032966, 1., 0., + 1.77075, -0.0874956, 1., 0., + 1.69556, -0.0399038, 1., 0., + 1.85845, -0.100017, 1., 0., + 1.63193, -0.0292829, 1., 0., + 1.92108, -0.108746, 1., 0., + 1.60507, -0.0185852, 1., 0., + 1.90991, -0.109427, 1., 0., + 1.73985, -0.0214682, 1., 0., + 1.97429, -0.114934, 1., 0., + 1.49217, -0.0234559, 1., 0., + 1.97011, -0.117122, 1., 0., + 1.40092, -0.0201076, 1., 0., + 1.96164, -0.119639, 1., 0., + 1.63634, -0.0399844, 1., 0., + 1.95562, -0.11617, 1., 0., + 1.81431, -0.0515824, 1., 0., + 1.96964, -0.105079, 1., 0., + 1.86882, -0.0653143, 1., 0., + 2.0155, -0.146639, 1., 0., + 1.60657, -0.00444997, 1., 0., + 1.82239, -0.111195, 1., 0., + 1.69562, -0.0408746, 1., 0., + 1.78718, -0.107874, 1., 0., + 1.6367, -0.0480624, 1., 0., + 1.73745, -0.100309, 1., 0., + 1.54562, -0.0400314, 1., 0., + 1.70874, -0.0979269, 1., 0., + 1.53771, -0.0414734, 1., 0., + 1.68658, -0.0964409, 1., 0., + 1.53234, -0.037261, 1., 0., + 1.62871, -0.0876685, 1., 0., + 1.5901, -0.0464532, 1., 0., + 1.60288, -0.0850231, 1., 0., + 1.51135, -0.0319969, 1., 0., + 1.55495, -0.0760847, 1., 0., + 1.60024, -0.0493416, 1., 0., + 1.61099, -0.0871627, 1., 0., + 1.56848, -0.0372076, 1., 0., + 1.61012, -0.080997, 1., 0., + 1.51628, -0.031721, 1., 0., + 1.5527, -0.0745029, 1., 0., + 1.68515, -0.0610052, 1., 0., + 1.54251, -0.0749989, 1., 0., + 1.75605, -0.0614183, 1., 0., + 1.5972, -0.0847241, 1., 0., + 1.83407, -0.0712398, 1., 0., + 1.63888, -0.085407, 1., 0., + 2.15163, -0.111614, 1., 0., + 1.86924, -0.127399, 1., 0., + 2.04718, -0.021142, 1., 0., + 1.93682, -0.114535, 1., 0., + 2.42857, -0.0398346, 1., 0., + 2.05425, -0.0634181, 1., 0., + 2.31097, -0.17624, 1., 0., + 2.3425, -0.134324, 1., 0., + 1.25573, 0.0160847, 1., 0., + 2.22724, -0.190316, 1., 0., + 1.59135, -0.0403045, 1., 0., + 1.70013, -0.105121, 1., 0., + 2.18796, -0.184129, 1., 0., + 1.46967, -0.0542641, 1., 0., + 1.40854, -0.00397349, 1., 0., + 1.7066, -0.103722, 1., 0., + 2.02067, -0.133273, 1., 0., + 2.3121, -0.244998, 1., 0., + -0.0145766, 0.362844, 1., 0., + 1.62273, -0.0687159, 1., 0., + 2.01868, -0.120886, 1., 0., + 1.07068, 0.0528097, 1., 0., + 3.34939, -0.412248, 1., 0., + 1.18681, 0.0214479, 1., 0., + 0.91684, 0.149364, 1., 0., + 0.377452, 0.214947, 1., 0., + 10.9671, -2.31455, 1., 0., + 2.77778, -0.372772, 1., 0., + -6.52839, 2.00992, 1., 0., + -5.04373, 1.62889, 1., 0., + -9.22444, 2.66876, 1., 0., + #46; Eta range [min,max]: [4.5,4.6] + #NEntries: 413 + 3.33217,-0.26788,1,0, + 3.66022,-0.303515,1,0, + #47; Eta range [min,max]: [4.6,4.7] + #NEntries: 292 + 3.64624,-0.30498,1,0, + 3.732,-0.297252,1,0, + #48; Eta range [min,max]: [4.7,4.8] + #NEntries: 207 + 5.74177,-0.587572,1,0, + 6.30603,-0.649457,1,0, + #49; Eta range [min,max]: [4.8,4.9] + #NEntries: 100 + 6.00682,-0.589085,1,0, + 16.6035,-2.09057,1,0, + #50; Eta range [min,max]: [4.9,5] + #NEntries: 4 + 1.42662,-0.0942826,1,0, + 8.93293,-0.0674104,1,0 + ] + + t2calojetcalibtool = T2CaloJetCalibTool() + t2calojetcalibtool.T2SampCalibTool = t2sampcalibtool + t2calojetcalibtool.UseFebJets = True + t2calojetcalibtool.doJetCalib = False + t2calojetcalibtool.T2JetCorrToolTile1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolFcal1 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Bar = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolHec0 = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolEm3Fwd = t2jescalibtool #dummy config + t2calojetcalibtool.T2JetCorrToolPsBar = t2jescalibtool #dummy config + + t2calojetgridfromfebs = T2CaloJetGridFromFEBHeader() + t2calojetgridfromfebs.doTiming = True + + self.jetOutputKey = "TrigT2CaloFEBJet" + + self.T2JetTools = [t2calojetgridfromfebs, + t2calojetconetool, + t2calojetcalibtool] + + + + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetMonitoring.py b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetMonitoring.py new file mode 100755 index 000000000000..1253f57a92e5 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/python/TrigT2CaloJetMonitoring.py @@ -0,0 +1,630 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + + +#Definitions of the monitoring classes + + + +from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig + + +class TrigT2CaloJetValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloJet_Validation"): + super(TrigT2CaloJetValidationMonitoring, self).__init__(name) + + self.defineTarget("Validation") +# this target contains all the histograms necessary for validation + + self.Histograms = [ defineHistogram('dR', type='TH1F', title="L2CaloJet FEX dR between roi and jet ;dR; nevents", xbins=100, xmin=-10., xmax=10.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="L2CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="L2CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="L2CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="L2CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="L2CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="L2CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="L2CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="L2CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="L2CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="L2CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="L2CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="L2CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="L2CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram ('ConversionErrors' ,type='TH1F',title='Conversion Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('Eta, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Eta;#eta; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Phi;#phi; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2CaloJetOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloJet_Online"): + """ defines hisograms for online """ + super(TrigT2CaloJetOnlineMonitoring, self).__init__(name) + + self.defineTarget("Online") +# right now this target has the same list of histograms as "Validation" + + self.Histograms = [ defineHistogram('dR', type='TH1F', title="L2CaloJet FEX dR between roi and jet ;dR; nevents", xbins=100, xmin=-10., xmax=10.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="L2CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="L2CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="L2CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="L2CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="L2CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="L2CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="L2CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="L2CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="L2CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="L2CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="L2CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="L2CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="L2CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram ('ConversionErrors' ,type='TH1F',title='Conversion Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('Eta, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Eta;#eta; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Phi;#phi; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2CaloJetCosmicMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloJet_Cosmic"): + """ defines hisograms for online """ + super(TrigT2CaloJetCosmicMonitoring, self).__init__(name) + + self.defineTarget("Cosmic") +# this target contains the same list of histograms as for "Online", but the axis range for plots of Et and etc. are smaller + + self.Histograms = [ defineHistogram('dR', type='TH1F', title="L2CaloJet FEX dR between roi and jet ;dR; nevents", xbins=100, xmin=-10., xmax=10.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="L2CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=300000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="L2CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=300000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="L2CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=300000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="L2CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=300000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="L2CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="L2CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="L2CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="L2CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=300000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="L2CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=300000.) ] + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="L2CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=300000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="L2CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=300000.) ] + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="L2CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="L2CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="L2CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="L2CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram ('ConversionErrors' ,type='TH1F',title='Conversion Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram ('Eta, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Eta;#eta; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, ConversionErrors' ,type='TH2F',title='ConversionErrors vs Phi;#phi; Conversion Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2CaloJetTimeMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloJet_TimeUnpack"): + super(TrigT2CaloJetTimeMonitoring, self).__init__(name) + self.defineTarget("Time") + self.Histograms += [ defineHistogram('LArUnpck', type='TH1F', title="L2CaloJet Unpacking time (LAr)", xbins=100, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('TileUnpck', type='TH1F', title="L2CaloJet Unpacking time (Tile)", xbins=100, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('HECUnpck', type='TH1F', title="L2CaloJet Unpacking time (HEC)", xbins=100, xmin=0., xmax=50.) ] + +class TrigT2L1CaloJetValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1CaloJet_Validation"): + super(TrigT2L1CaloJetValidationMonitoring, self).__init__(name) + + self.defineTarget("Validation") + # this target contains all the histograms necessary for validation + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2L1CaloJet FEX number of jets;N; nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2L1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="T2L1CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="T2L1CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2L1CaloJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2L1CaloJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1CaloJet number of L1 towers;number of L1 towers; nevents", xbins=101, xmin=-0.5, xmax=100.5) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1CaloJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('L1_UnpckTime', type='TH1F', title="T2L1CaloJet L1 Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2L1CaloJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('JetFindingTime', type='TH1F', title="T2L1CaloJet Jet finding time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('OverallTime', type='TH1F', title="T2L1CaloJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1CaloJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2L1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2L1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="T2L1CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="T2L1CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1CaloJet Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,L1_UnpckTime', type='TH2F', title="T2L1CaloJet L1 Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,FastJetTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,JetFindingTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,OverallTime', type='TH2F', title="T2L1CaloJet Total time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1CaloJet RoI making time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2L1CaloJetOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1CaloJet_Online"): + """ defines hisograms for online """ + super(TrigT2L1CaloJetOnlineMonitoring, self).__init__(name) + + self.defineTarget("Online") + # right now this target has the same list of histograms as "Validation" + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2L1CaloJet FEX number of jets;N; nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2L1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="T2L1CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="T2L1CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2L1CaloJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2L1CaloJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1CaloJet number of L1 towers;number of L1 towers; nevents", xbins=101, xmin=-0.5, xmax=100.5) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1CaloJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('L1_UnpckTime', type='TH1F', title="T2L1CaloJet L1 Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2L1CaloJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('JetFindingTime', type='TH1F', title="T2L1CaloJet Jet finding time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('OverallTime', type='TH1F', title="T2L1CaloJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1CaloJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2L1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2L1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="T2L1CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="T2L1CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1CaloJet Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,L1_UnpckTime', type='TH2F', title="T2L1CaloJet L1 Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,FastJetTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,JetFindingTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,OverallTime', type='TH2F', title="T2L1CaloJet Total time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1CaloJet RoI making time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + +class TrigT2L1CaloJetCosmicMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1CaloJet_Cosmic"): + """ defines hisograms for online """ + super(TrigT2L1CaloJetCosmicMonitoring, self).__init__(name) + + self.defineTarget("Cosmic") + # this target contains the same list of histograms as for "Online", but the axis range for plots of Et and etc. are smaller + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2L1CaloJet FEX number of jets;N; nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2L1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eem', type='TH1F', title="T2L1CaloJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Ehad', type='TH1F', title="T2L1CaloJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2L1CaloJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2L1CaloJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1CaloJet number of L1 towers;number of L1 towers; nevents", xbins=101, xmin=-0.5, xmax=100.5) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1CaloJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('L1_UnpckTime', type='TH1F', title="T2L1CaloJet L1 Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2L1CaloJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('JetFindingTime', type='TH1F', title="T2L1CaloJet Jet finding time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('OverallTime', type='TH1F', title="T2L1CaloJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1CaloJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=200.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2L1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2L1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Eem', type='TH2F', title="T2L1CaloJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ehad', type='TH2F', title="T2L1CaloJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Etem', type='TH2F', title="T2L1CaloJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Ethad', type='TH2F', title="T2L1CaloJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1CaloJet Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,L1_UnpckTime', type='TH2F', title="T2L1CaloJet L1 Unpack time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,FastJetTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,JetFindingTime', type='TH2F', title="T2L1CaloJet Jet finding time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,OverallTime', type='TH2F', title="T2L1CaloJet Total time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1CaloJet RoI making time vs. nTowers;nTowers;time [ms]", xbins=101, xmin=0., xmax=500., ybins=100, ymin=0., ymax=200.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + +class TrigT2L1UnpackingValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1Unpacking_Validation"): + super(TrigT2L1UnpackingValidationMonitoring, self).__init__(name) + + self.defineTarget("Validation") + # this target contains all the histograms necessary for validation + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nEMTowers', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nHADTowers', type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nEMTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nHADTowers_zoom',type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1Unpacking FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2L1Unpacking FEX Etem;EM Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2L1Unpacking FEX Ethad;Had Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1Unpacking FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaEM', type='TH1F', title="T2L1Unpacking FEX EM Eta;EM Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaHAD', type='TH1F', title="T2L1Unpacking FEX HAD Eta;HAD Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1Unpacking FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiEM', type='TH1F', title="T2L1Unpacking FEX EM Phi;EM Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiHAD', type='TH1F', title="T2L1Unpacking FEX HAD Phi;HAD Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('L1UnpckTime', type='TH1F', title="T2L1Unpacking L1 unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1Unpacking All unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime',type='TH1F', title="T2L1Unpacking Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1Unpacking RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2L1Unpacking Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1Unpacking phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaEM,PhiEM', type='TH2F', title="T2L1Unpacking EM phi vs. eta;EM #eta;EM #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaHAD,PhiHAD', type='TH2F', title="T2L1Unpacking HAD phi vs. eta;HAD #eta;HAD #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1Unpacking Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #eta;EM #eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #eta;HAD #eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1Unpacking Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #phi;EM #phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #phi;HAD #phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,L1UnpckTime', type='TH2F', title="T2L1Unpacking L1 unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1Unpacking All unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,CalibrationTime', type='TH2F', title="T2L1Unpacking Tower calibration time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1Unpacking RoI making time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,TotalTime', type='TH2F', title="T2L1Unpacking Total time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + + +class TrigT2L1UnpackingOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1Unpacking_Online"): + """ defines hisograms for online """ + super(TrigT2L1UnpackingOnlineMonitoring, self).__init__(name) + + self.defineTarget("Online") + # right now this target has the same list of histograms as "Validation" + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nEMTowers', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nHADTowers', type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nEMTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nHADTowers_zoom',type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1Unpacking FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2L1Unpacking FEX Etem;EM Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2L1Unpacking FEX Ethad;Had Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1Unpacking FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaEM', type='TH1F', title="T2L1Unpacking FEX EM Eta;EM Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaHAD', type='TH1F', title="T2L1Unpacking FEX HAD Eta;HAD Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1Unpacking FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiEM', type='TH1F', title="T2L1Unpacking FEX EM Phi;EM Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiHAD', type='TH1F', title="T2L1Unpacking FEX HAD Phi;HAD Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('L1UnpckTime', type='TH1F', title="T2L1Unpacking L1 unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1Unpacking All unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime',type='TH1F', title="T2L1Unpacking Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1Unpacking RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2L1Unpacking Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1Unpacking phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaEM,PhiEM', type='TH2F', title="T2L1Unpacking EM phi vs. eta;EM #eta;EM #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaHAD,PhiHAD', type='TH2F', title="T2L1Unpacking HAD phi vs. eta;HAD #eta;HAD #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1Unpacking Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #eta;EM #eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #eta;HAD #eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1Unpacking Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #phi;EM #phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #phi;HAD #phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,L1UnpckTime', type='TH2F', title="T2L1Unpacking L1 unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1Unpacking All unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,CalibrationTime', type='TH2F', title="T2L1Unpacking Tower calibration time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1Unpacking RoI making time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,TotalTime', type='TH2F', title="T2L1Unpacking Total time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + + +class TrigT2L1UnpackingCosmicMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2L1Unpacking_Cosmic"): + """ defines hisograms for online """ + super(TrigT2L1UnpackingCosmicMonitoring, self).__init__(name) + + self.defineTarget("Cosmic") + # this target contains the same list of histograms as for "Online", but the axis range for plots of Et and etc. are smaller + self.Histograms += [ defineHistogram('nEMTowers', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nHADTowers', type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nTowers', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('nTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 towers;number of L1 towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nEMTowers_zoom', type='TH1F', title="T2L1Unpacking number of L1 EM towers;number of L1 EM towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('nHADTowers_zoom',type='TH1F', title="T2L1Unpacking number of L1 HAD towers;number of L1 HAD towers; nevents", xbins=50, xmin=0., xmax=50.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2L1Unpacking FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2L1Unpacking FEX Etem;EM Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2L1Unpacking FEX Ethad;Had Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2L1Unpacking FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaEM', type='TH1F', title="T2L1Unpacking FEX EM Eta;EM Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('EtaHAD', type='TH1F', title="T2L1Unpacking FEX HAD Eta;HAD Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2L1Unpacking FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiEM', type='TH1F', title="T2L1Unpacking FEX EM Phi;EM Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('PhiHAD', type='TH1F', title="T2L1Unpacking FEX HAD Phi;HAD Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('L1UnpckTime', type='TH1F', title="T2L1Unpacking L1 unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('UnpckTime', type='TH1F', title="T2L1Unpacking All unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime',type='TH1F', title="T2L1Unpacking Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2L1Unpacking RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2L1Unpacking Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2L1Unpacking phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaEM,PhiEM', type='TH2F', title="T2L1Unpacking EM phi vs. eta;EM #eta;EM #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('EtaHAD,PhiHAD', type='TH2F', title="T2L1Unpacking HAD phi vs. eta;HAD #eta;HAD #phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2L1Unpacking Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #eta;EM #eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('EtaHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #eta;HAD #eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2L1Unpacking Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiEM,EtEM', type='TH2F', title="T2L1Unpacking EM E_{T} vs. #phi;EM #phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('PhiHAD,EtHAD', type='TH2F', title="T2L1Unpacking HAD E_{T} vs. #phi;HAD #phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416,ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nTowers,L1UnpckTime', type='TH2F', title="T2L1Unpacking L1 unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,UnpckTime', type='TH2F', title="T2L1Unpacking All unpack time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,CalibrationTime', type='TH2F', title="T2L1Unpacking Tower calibration time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,RoITime', type='TH2F', title="T2L1Unpacking RoI making time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nTowers,TotalTime', type='TH2F', title="T2L1Unpacking Total time vs. nTowers;nTowers;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + +class TrigT2CaloFastJetValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloFastJet_Validation"): + super(TrigT2CaloFastJetValidationMonitoring, self).__init__(name) + + self.defineTarget("Validation") + # this target contains all the histograms necessary for validation + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2CaloFastJet FEX number of jets;N;nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('nGrid', type='TH1F', title="T2CaloFastJet FEX number of inputs;N;nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2CaloFastJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2CaloFastJet FEX Et EM;Etem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2CaloFastJet FEX Et HAD;Ethad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2CaloFastJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EEM', type='TH1F', title="T2CaloFastJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EHAD', type='TH1F', title="T2CaloFastJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2CaloFastJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2CaloFastJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2CaloFastJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2CaloFastJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('UnpackTime', type='TH1F', title="T2CaloFastJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2CaloFastJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('puSubTime', type='TH1F', title="T2CaloFastJet FastJet pu sub time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CleaningTime', type='TH1F', title="T2CaloFastJet Cleaning time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime', type='TH1F', title="T2CaloFastJet Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2CaloFastJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2CaloFastJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2CaloFastJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2CaloFastJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2CaloFastJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EEM', type='TH2F', title="T2CaloFastJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EHAD', type='TH2F', title="T2CaloFastJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2CaloFastJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2CaloFastJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nGrid,UnpackTime', type='TH2F', title="T2CaloFastJet Unpack time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CalibrationTime', type='TH2F', title="T2CaloFastJet Jet calibration time vs. nJets;nJets;time [ms]",xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,RoITime', type='TH2F', title="T2CaloFastJet RoI making time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + +class TrigT2CaloFastJetOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloFastJet_Online"): + super(TrigT2CaloFastJetOnlineMonitoring, self).__init__(name) + + self.defineTarget("Online") + # this target contains all the histograms necessary for Online + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2CaloFastJet FEX number of jets;N;nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('nGrid', type='TH1F', title="T2CaloFastJet FEX number of inputs;N;nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2CaloFastJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2CaloFastJet FEX Et EM;Etem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2CaloFastJet FEX Et HAD;Ethad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2CaloFastJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EEM', type='TH1F', title="T2CaloFastJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EHAD', type='TH1F', title="T2CaloFastJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2CaloFastJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2CaloFastJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2CaloFastJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2CaloFastJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('UnpackTime', type='TH1F', title="T2CaloFastJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2CaloFastJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('puSubTime', type='TH1F', title="T2CaloFastJet FastJet pu sub time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CleaningTime', type='TH1F', title="T2CaloFastJet Cleaning time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime', type='TH1F', title="T2CaloFastJet Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2CaloFastJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2CaloFastJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2CaloFastJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2CaloFastJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2CaloFastJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EEM', type='TH2F', title="T2CaloFastJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EHAD', type='TH2F', title="T2CaloFastJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2CaloFastJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2CaloFastJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nGrid,UnpackTime', type='TH2F', title="T2CaloFastJet Unpack time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CalibrationTime', type='TH2F', title="T2CaloFastJet Jet calibration time vs. nJets;nJets;time [ms]",xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,RoITime', type='TH2F', title="T2CaloFastJet RoI making time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2CaloFastJetCosmicMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloFastJet_Cosmic"): + super(TrigT2CaloFastJetCosmicMonitoring, self).__init__(name) + + self.defineTarget("Cosmic") + # this target contains all the histograms necessary for Cosmic + self.Histograms = [ defineHistogram('nJets', type='TH1F', title="T2CaloFastJet FEX number of jets;N;nevents", xbins=21, xmin=-.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('nGrid', type='TH1F', title="T2CaloFastJet FEX number of inputs;N;nevents", xbins=100, xmin=0., xmax=1000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2CaloFastJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtEM', type='TH1F', title="T2CaloFastJet FEX Et EM;Etem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EtHAD', type='TH1F', title="T2CaloFastJet FEX Et HAD;Ethad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2CaloFastJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EEM', type='TH1F', title="T2CaloFastJet FEX Eem;Eem [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('EHAD', type='TH1F', title="T2CaloFastJet FEX Ehad;Ehad [MeV]; nevents", xbins=100, xmin=0., xmax=100000.) ] + self.Histograms += [ defineHistogram('nLeadingTowers', type='TH1F', title="T2CaloFastJet FEX nLeadingTowers;nLeadingTowers; nevents", xbins=21, xmin=-0.5, xmax=20.5) ] + self.Histograms += [ defineHistogram('Emf', type='TH1F', title="T2CaloFastJet FEX emf;EMF; nevents", xbins=100, xmin=-0.1, xmax=1.1) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2CaloFastJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2CaloFastJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('UnpackTime', type='TH1F', title="T2CaloFastJet Unpacking time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('FastJetTime', type='TH1F', title="T2CaloFastJet FastJet time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('puSubTime', type='TH1F', title="T2CaloFastJet FastJet pu sub time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CleaningTime', type='TH1F', title="T2CaloFastJet Cleaning time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('CalibrationTime', type='TH1F', title="T2CaloFastJet Calibration time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('RoITime', type='TH1F', title="T2CaloFastJet RoI making time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('TotalTime', type='TH1F', title="T2CaloFastJet Total time; time [ms]; nevents", xbins=200, xmin=0., xmax=100.) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2CaloFastJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2CaloFastJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #eta;#eta;E_{T}^{em} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #eta;#eta;E_{T}^{had} [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2CaloFastJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EEM', type='TH2F', title="T2CaloFastJet EM ene vs. eta;#eta;Eem [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Eta,EHAD', type='TH2F', title="T2CaloFastJet Had ene vs. eta;#eta;Ehad [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2CaloFastJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2CaloFastJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtEM', type='TH2F', title="T2CaloFastJet EM E_{T} vs. #phi;#phi;E_{T}^{em} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('Phi,EtHAD', type='TH2F', title="T2CaloFastJet HAD E_{T} vs. #phi;#phi;E_{T}^{had} [MeV]", xbins=100, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=100000.) ] + self.Histograms += [ defineHistogram('nGrid,UnpackTime', type='TH2F', title="T2CaloFastJet Unpack time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,FastJetTime', type='TH2F', title="T2CaloFastJet Jet finding time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,puSubTime', type='TH2F', title="T2CaloFastJet pu subtraction time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CleaningTime', type='TH2F', title="T2CaloFastJet Jet cleaning time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,CalibrationTime', type='TH2F', title="T2CaloFastJet Jet calibration time vs. nJets;nJets;time [ms]",xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,RoITime', type='TH2F', title="T2CaloFastJet RoI making time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nGrid,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nGrid;nGrid;time [ms]", xbins=100, xmin=0., xmax=1000., ybins=100, ymin=0., ymax=100.) ] + self.Histograms += [ defineHistogram('nJets,TotalTime', type='TH2F', title="T2CaloFastJet Total time vs. nJets;nJets;time [ms]", xbins=21, xmin=-.5, xmax=20.5, ybins=100, ymin=0., ymax=100.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + +class TrigT2VirtualL1CaloJetValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2VirtualL1CaloJet_Validation"): + super(TrigT2VirtualL1CaloJetValidationMonitoring, self).__init__(name) + + self.defineTarget("Validation") +# this target contains all the histograms necessary for validation + + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2VirtualL1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2VirtualL1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2VirtualL1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2VirtualL1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2VirtualL1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2VirtualL1CaloJetOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2VirtualL1CaloJet_Online"): + """ defines hisograms for online """ + super(TrigT2VirtualL1CaloJetOnlineMonitoring, self).__init__(name) + + self.defineTarget("Online") +# right now this target has the same list of histograms as "Validation" + + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2VirtualL1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2VirtualL1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2VirtualL1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2VirtualL1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2VirtualL1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + + +class TrigT2VirtualL1CaloJetCosmicMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2VirtualL1CaloJet_Cosmic"): + """ defines hisograms for online """ + super(TrigT2VirtualL1CaloJetCosmicMonitoring, self).__init__(name) + + self.defineTarget("Cosmic") +# this target contains the same list of histograms as for "Online", but the axis range for plots of Et and etc. are smaller + + self.Histograms += [ defineHistogram('E', type='TH1F', title="T2VirtualL1CaloJet FEX E;E [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Et', type='TH1F', title="T2VirtualL1CaloJet FEX Et;Et [MeV]; nevents", xbins=100, xmin=0., xmax=1000000.) ] + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2VirtualL1CaloJet FEX Eta;Eta; nevents", xbins=100, xmin=-5., xmax=5.) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2VirtualL1CaloJet FEX Phi;Phi; nevents", xbins=64, xmin=-3.1416, xmax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,Phi', type='TH2F', title="T2VirtualL1CaloJet phi vs. eta;#eta;#phi", xbins=100, xmin=-5., xmax=5., ybins=64, ymin=-3.1416, ymax=3.1416) ] + self.Histograms += [ defineHistogram('Eta,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. eta;#eta;ene [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,E', type='TH2F', title="T2VirtualL1CaloJet ene vs. phi;#phi;ene [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Eta,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. eta;#eta;Et [MeV]", xbins=100, xmin=-5., xmax=5., ybins=100 , ymin=0., ymax=1000000.) ] + self.Histograms += [ defineHistogram('Phi,Et', type='TH2F', title="T2VirtualL1CaloJet Et vs. phi;#phi;Et [MeV]", xbins=64, xmin=-3.1416, xmax=3.1416, ybins=100 , ymin=0., ymax=1000000.) ] + #self.Histograms += [ defineHistogram ('AlgorithmErrors', type='TH1F',title='Algorithm Errors bit mask' ,xbins=10,xmin=0,xmax=10)] + #self.Histograms += [ defineHistogram ('Eta, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Eta;#eta; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=100,xmin=-5.,xmax=5.)] + #self.Histograms += [ defineHistogram ('Phi, AlgorithmErrors' ,type='TH2F',title='AlgorithmErrors vs Phi;#phi; AlgorithmErrors Errors' ,ybins=6,ymin=0,ymax=6,xbins=64,xmin=-3.1416,xmax=3.1416)] + +# T2AllRoiUnpacking histograms [begin] +fexName = "T2AllRoiUnpacking" +hUnpckTime = defineHistogram(varname='UnpckTime', type='TH1F', + title='%s tot unpacking time; time [ms]'%fexName, + xbins=40, xmin=0., xmax=40) +hCellUnpckTime = defineHistogram(varname='CellUnpckTime', type='TH1F', + title='%s unpacking time (addCell only); time [ms]'%fexName, + xbins=50, xmin=0., xmax=10) +hRoITime = defineHistogram(varname='RoITime', type='TH1F', + title='%s time to setup output TE; time [ms]'%fexName, + xbins=50, xmin=0., xmax=10) +hMergeTime = defineHistogram(varname='MergeTime', type='TH1F', + title='%s time to merge the EM cells; time [ms]'%fexName, + xbins=50, xmin=0., xmax=10) +hTotalTime = defineHistogram('TotalTime', type='TH1F', + title='%s Total time; time [ms]; nevents'%fexName, + xbins=100, xmin=0., xmax=100.) +# T2AllRoiUnpacking histograms [end] + +class T2AllRoiUnpackingTimeOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name = "T2AllRoiUnpackingTimeOnlineMonitoring"): + super(T2AllRoiUnpackingTimeOnlineMonitoring, self).__init__(name) + self.defineTarget("Online") + self.Histograms = [hUnpckTime, hCellUnpckTime, hRoITime, hMergeTime, hTotalTime,] + +class T2AllRoiUnpackingTimeValidationMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name = "T2AllRoiUnpackingTimeValidationMonitoring"): + super(T2AllRoiUnpackingTimeValidationMonitoring, self).__init__(name) + self.defineTarget("Validation") + # validation can have additional histograms (online should be the minimal subset) + self.Histograms = [hUnpckTime, hCellUnpckTime, hRoITime, hMergeTime, hTotalTime,] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet.py b/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet.py new file mode 100755 index 000000000000..85acbcdbc086 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet.py @@ -0,0 +1,139 @@ +#---------------------------------------------------- +# T2CaloJet options +#---------------------------------------------------- +theApp.Dlls += [ "TrigT2CaloJet" ] + +include( "TrigT2CaloCommon/jobOfragment_TrigT2CaloCommon.py" ) + +#T2CaloJet_g4_L2 = Algorithm( "T2CaloJet_g4_L2" ) +#T2CaloJet_g4_L2.T2JetTools=["T2CaloJetGridFromCells","T2CaloJetConeTool","T2CaloJetCalibTool"] +#T2CaloJet_g4_L2.OutputLevel = INFO +#T2CaloJet_g4_L2.clearJetGrid = False + +# Set up default options (according to Osamu's talk at Trigger&Physics week, March) +# ROI half width in eta x phi: 0.7x0.7 +# Number of iterations = 3 +# Cone radius: R = 0.4 +#T2CaloJet_g4_L2.EtaWidth = 0.7 # Eta half width +#T2CaloJet_g4_L2.PhiWidth = 0.7 # Phi half width + +#T2CaloJet_g4_L2.T2CaloJetConeTool.coneRadius = 0.4; +#T2CaloJet_g4_L2.T2CaloJetConeTool.numberOfIterations = 3; + + +# Monitoring +#include( "TrigJetMonitoring/jobOfragment_TrigT2CaloJetMoni.py" ) + + +# Using CSC calibration. +# Performance described in: +# http://indico.cern.ch/materialDisplay.py?contribId=16&materialId=slides&confId=6198 + +include("TrigT2CaloCalibration/T2SampCalibration_jobOptions.py") + +#T2CaloJet_g4_L2.T2CaloJetCalibTool.CalibToolName = "T2SampCalibTool" + +#T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.nEtaBin = 44 +#T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.EtRegionLimit = 5000 + +#T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.EtaReg=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3.,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4] + +#T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.VECut=[20, 20.1001, 20.4013, 20.9068, 21.6214, 22.5525, 23.7093, 25.1034, 26.7487, 28.6617, 30.8616, 33.3704, 36.2131, 39.4183, 43.018, 47.0482, 51.5493, 56.5663, 62.1495, 68.3546, 75.2439, 82.8863, 91.3582, 100.744, 111.139, 122.646, 135.38, 149.469, 165.055, 182.292, 201.353, 222.43, 245.733, 271.495, 299.975, 331.456, 366.256, 404.72, 447.236, 494.227, 546.165, 603.569, 667.013, 737.134] + +#Schema of weights specification through jobO +########################################################### +# i -> this is the number of eta bin # +#m_wt[i][0][0],m_wt[i][0][1],m_wt[i][0][2],m_wt[i][0][3], # +#m_wt[i][1][0],m_wt[i][1][1],m_wt[i][0][2],m_wt[i][1][3], # +########################################################### + +#T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.Weights=[ +#1.51389, -0.0895586, 1., 0., +#1.72829, -0.0340167, 1., 0., +#1.49137, -0.0868803, 1., 0., +#1.70548, -0.0337713, 1., 0., +#1.4857, -0.0863495, 1., 0., +#1.72645, -0.0432542, 1., 0., +#1.47319, -0.0812488, 1., 0., +#1.74611, -0.0531648, 1., 0., +#1.48531, -0.0863878, 1., 0., +#1.72056, -0.0471587, 1., 0., +#1.48752, -0.084979, 1., 0., +#1.71981, -0.0444118, 1., 0., +#1.51808, -0.0926553, 1., 0., +#1.74622, -0.0519999, 1., 0., +#1.55659, -0.101366, 1., 0., +#1.71495, -0.01945, 1., 0., +#1.58541, -0.105946, 1., 0., +#1.8069, -0.0353912, 1., 0., +#1.58109, -0.104969, 1., 0., +#1.86016, -0.0246607, 1., 0., +#1.59103, -0.108539, 1., 0., +#1.61592, -0.0223561, 1., 0., +#1.56324, -0.102244, 1., 0., +#1.54431, -0.030708, 1., 0., +#1.56805, -0.110581, 1., 0., +#1.68662, -0.0425636, 1., 0., +#1.5175, -0.0904923, 1., 0., +#1.9283, -0.0795127, 1., 0., +#1.57129, -0.102665, 1., 0., +#1.75441, -0.0341709, 1., 0., +#1.45089, -0.108513, 1., 0., +#1.71627, -0.0184717, 1., 0., +#1.38183, -0.0832477, 1., 0., +#1.68205, -0.0600046, 1., 0., +#1.3759, -0.0820196, 1., 0., +#1.52486, -0.0399448, 1., 0., +#1.3698, -0.0820021, 1., 0., +#1.50279, -0.0339901, 1., 0., +#1.36276, -0.0791147, 1., 0., +#1.47426, -0.0298548, 1., 0., +#1.34213, -0.0787685, 1., 0., +#1.49542, -0.0335057, 1., 0., +#1.34028, -0.0808486, 1., 0., +#1.47619, -0.020763, 1., 0., +#1.29883, -0.0668448, 1., 0., +#1.4767, -0.0266885, 1., 0., +#1.3058, -0.0647559, 1., 0., +#1.56106, -0.055258, 1., 0., +#1.30474, -0.0660207, 1., 0., +#1.53641, -0.0402638, 1., 0., +#1.32559, -0.070272, 1., 0., +#1.52766, -0.0386046, 1., 0., +#1.27423, -0.0582557, 1., 0., +#1.57456, -0.0636291, 1., 0., +#1.27919, -0.0590284, 1., 0., +#1.61072, -0.0685855, 1., 0., +#1.32345, -0.0834648, 1., 0., +#1.62766, -0.0522781, 1., 0., +#1.33869, -0.0813973, 1., 0., +#1.84186, -0.0996512, 1., 0., +#1.43289, -0.116186, 1., 0., +#1.98947, -0.0398448, 1., 0., +#1.35306, -0.0829135, 1., 0., +#2.58078, -0.266127, 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#1., 0., 1., 0., +#] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet_RomeCalib.py b/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet_RomeCalib.py new file mode 100755 index 000000000000..a34a7951f0fe --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/share/jobOfragment_TrigT2CaloJet_RomeCalib.py @@ -0,0 +1,181 @@ +#---------------------------------------------------- +# T2CaloJet options +#---------------------------------------------------- +theApp.Dlls += [ "TrigT2CaloJet" ] + +include( "TrigT2CaloCommon/jobOfragment_TrigT2CaloCommon.py" ) + +T2CaloJet_g4_L2 = Algorithm( "T2CaloJet_g4_L2" ) +T2CaloJet_g4_L2.T2JetTools=["T2CaloJetGridFromCells","T2CaloJetConeTool","T2CaloJetCalibTool"] +T2CaloJet_g4_L2.OutputLevel = INFO +T2CaloJet_g4_L2.clearJetGrid = False + +# Set up default options (according to Osamu's talk at Trigger&Physics week, March) +# ROI size in eta x phi: 0.7x0.7 +# Number of iterations = 3 +# Cone radius: R = 0.4 +T2CaloJet_g4_L2.EtaWidth = 0.35 # Eta half width +T2CaloJet_g4_L2.PhiWidth = 0.35 # Phi half width + +T2CaloJet_g4_L2.T2CaloJetConeTool.coneRadius = 0.4; +T2CaloJet_g4_L2.T2CaloJetConeTool.numberOfIterations = 3; + +# Adding calibration. +# Performance described in: +# http://indico.cern.ch/getFile.py/access?contribId=25&sessionId=4&resId=0&materialId=slides&confId=5141 + +include("TrigT2CaloCalibration/T2SampCalibration_jobOptions.py") + +T2CaloJet_g4_L2.T2CaloJetCalibTool.CalibToolName = "T2SampCalibTool" +T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.nEtaBin = 44 +T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.EtRegionLimit = 5000 + +T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.EtaReg=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3.,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4] + +T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.VECut=[20, 20.1001, 20.4013, 20.9068, 21.6214, 22.5525, 23.7093, 25.1034, 26.7487, 28.6617, 30.8616, 33.3704, 36.2131, 39.4183, 43.018, 47.0482, 51.5493, 56.5663, 62.1495, 68.3546, 75.2439, 82.8863, 91.3582, 100.744, 111.139, 122.646, 135.38, 149.469, 165.055, 182.292, 201.353, 222.43, 245.733, 271.495, 299.975, 331.456, 366.256, 404.72, 447.236, 494.227, 546.165, 603.569, 667.013, 737.134] + +#Schema of weights specification through jobO +########################################################### +# i -> this is the number of eta bin # +#m_wt[i][0][0],m_wt[i][0][1],m_wt[i][0][2],m_wt[i][0][3], # +#m_wt[i][1][0],m_wt[i][1][1],m_wt[i][0][2],m_wt[i][1][3], # +########################################################### + +T2CaloJet_g4_L2.T2CaloJetCalibTool.T2SampCalibTool.Weights=[ +1.48308, -0.0826528, 0.5, 0.5, +1.42289, -0.0171067, 0.5, 0.5, + +1.45557, -0.0781768, 0.5, 0.5, +1.44633, -0.027712, 0.5, 0.5, + +1.43856, -0.0751478, 0.5, 0.5, +1.45253, -0.0306214, 0.5, 0.5, + +1.43498, -0.0718259, 0.5, 0.5, +1.45168, -0.032742, 0.5, 0.5, + +1.43684, -0.0729862, 0.5, 0.5, +1.49863, -0.048398, 0.5, 0.5, + +1.45232, -0.0772673, 0.5, 0.5, +1.45768, -0.03347, 0.5, 0.5, + +1.47967, -0.0838591, 0.5, 0.5, +1.43648, -0.0286997, 0.5, 0.5, + +1.50318, -0.0855062, 0.5, 0.5, +1.50884, -0.0353893, 0.5, 0.5, + +1.52509, -0.0885095, 0.5, 0.5, +1.52056, -0.032717, 0.5, 0.5, + +1.5283, -0.0951263, 0.5, 0.5, +1.58505, -0.0175355, 0.5, 0.5, + + 1.53577, -0.0941264, 0.5, 0.5, + 1.44049, -0.0297817, 0.5, 0.5, + + 1.54731, -0.103539, 0.5, 0.5, + 1.26273, 0.009096, 0.5, 0.5, + + 1.50927, -0.0939212, 0.5, 0.5, + 1.53218, -0.0516523, 0.5, 0.5, + + 1.53583, -0.0924597, 0.5, 0.5, + 1.57429, -0.0390652, 0.5, 0.5, + + 1.56737, -0.0848132, 0.5, 0.5, + 1.6557, -0.0695771, 0.5, 0.5, + + 1.48189, -0.122748, 0.5, 0.5, + 1.63334, -0.00433293, 0.5, 0.5, + + 1.3956, -0.0938853, 0.5, 0.5, + 1.65188, -0.0527244, 0.5, 0.5, + + 1.39098, -0.0913043, 0.5, 0.5, + 1.50682, -0.0362353, 0.5, 0.5, + + 1.3567, -0.0810333, 0.5, 0.5, + 1.47922, -0.0375228, 0.5, 0.5, + + 1.33288, -0.0776533, 0.5, 0.5, + 1.47069, -0.0322596, 0.5, 0.5, + + 1.29355, -0.067195, 0.5, 0.5, + 1.50526, -0.0458961, 0.5, 0.5, + + 1.27226, -0.0561386, 0.5, 0.5, + 1.51188, -0.0578599, 0.5, 0.5, + + 1.29132, -0.071984, 0.5, 0.5, + 1.41631, -0.0172732, 0.5, 0.5, + + 1.29759, -0.0714317, 0.5, 0.5, + 1.50393, -0.0499248, 0.5, 0.5, + + 1.27971, -0.0677093, 0.5, 0.5, + 1.47009, -0.036954, 0.5, 0.5, + + 1.27665, -0.0625996, 0.5, 0.5, + 1.47138, -0.0381273, 0.5, 0.5, + + 1.28796, -0.0642188, 0.5, 0.5, + 1.45072, -0.0414209, 0.5, 0.5, + + 1.23851, -0.0422229, 0.5, 0.5, + 1.57495, -0.0825966, 0.5, 0.5, + + 1.29582, -0.0643765, 0.5, 0.5, + 1.57768, -0.0887841, 0.5, 0.5, + + 1.37418, -0.116019, 0.5, 0.5, + 1.69627, -0.0531049, 0.5, 0.5, + + 1.3154, -0.0621647, 0.5, 0.5, + 2.28643, -0.265052, 0.5, 0.5, + + 1.28765, -0.0955826, 0.5, 0.5, + 2.76714, -0.109484, 0.5, 0.5, + + # Weights were not extracted for the forward calorimeters. + # don't apply any correction there: + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, + + 1., 0. , 0.5, 0.5, + 1., 0. , 0.5, 0.5, +] + + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/EtaPhiSampleHash.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/EtaPhiSampleHash.cxx new file mode 100644 index 000000000000..f13eeb5f7fa6 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/EtaPhiSampleHash.cxx @@ -0,0 +1,84 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigT2CaloJet/EtaPhiSampleHash.h" + +#include "TrigT2CaloJet/HashedTrig3Momentum.h" + +#include "TVector2.h" // Phi_mpi_pi + +#include <iostream> +#include <cmath> // M_PI, fabs + + + +const double EtaPhiSampleHash::kMinEta = -5.0; +const double EtaPhiSampleHash::kMaxEta = +5.0; +const double EtaPhiSampleHash::kMinPhi = -M_PI; +const double EtaPhiSampleHash::kMaxPhi = +M_PI; + +//------------------------------------------------ +EtaPhiSampleHash::EtaPhiSampleHash(const u_short &nEtaBins, const u_short &nPhiBins, + double minEta, double maxEta, + double minPhi, double maxPhi): + + m_minEta(minEta), + m_maxEta(maxEta), + m_minPhi(minPhi), + m_maxPhi(maxPhi), + m_nEtaBins(nEtaBins), + m_nPhiBins(nPhiBins) +{ + checkValues(); + m_dEta = (m_maxEta-m_minEta)/ static_cast<double>(m_nEtaBins); + m_dPhi = (m_maxPhi-m_minPhi)/ static_cast<double>(m_nPhiBins); + m_invDeta = 1.0/m_dEta; + m_invDphi = 1.0/m_dPhi; +} + +//------------------------------------------------ +void EtaPhiSampleHash::checkValues() +{ + using namespace std; + if(m_nEtaBins >= kMaxNetaBins) + cerr<<"EtaPhiSampleHash: number of eta bins too large" + <<" ("<<m_nEtaBins<<" >= "<<kMaxNetaBins<<")"<<endl; + if(m_nPhiBins >= kMaxNphiBins) + cerr<<"EtaPhiSampleHash: number of phi bins too large" + <<" ("<<m_nPhiBins<<" >= "<<kMaxNphiBins<<")"<<endl; +} +//------------------------------------------------ +u_int EtaPhiSampleHash::hash(const double &eta, const double &phi, + const CaloSampling::CaloSample &sample) const +{ + double rPhi = TVector2::Phi_mpi_pi(phi); + if(eta<m_minEta || eta>m_maxEta || rPhi<m_minPhi || rPhi>m_maxPhi){ + std::cerr<<"EtaPhiSampleHash::hash("<<eta<<", phi, "<<sample<<")"<<std::endl + <<"out of bounds: returning 0"<<std::endl; + return 0; + } + return (sample & kSixBits) + + ((int((eta-m_minEta)*m_invDeta) & kTenBits) << 6) + + ((int((phi-m_minPhi)*m_invDphi) & kTenBits) << 16); +} +//------------------------------------------------ +u_int EtaPhiSampleHash::hash(const Trig3Momentum &t3m) const +{ + return hash(t3m.eta(), t3m.phi(), t3m.caloSample()); +} +//------------------------------------------------ +u_int EtaPhiSampleHash::hash(const HashedTrig3Momentum &htm) const +{ + return hash(htm.eta(), htm.phi(), htm.caloSample()); +} + +//------------------------------------------------ +bool EtaPhiSampleHash::etaPhiSample(const u_int &hash, double &eta, double &phi, + CaloSampling::CaloSample &sample) const +{ + sample = static_cast< CaloSampling::CaloSample >(hash & kSixBits); + eta = m_minEta + m_dEta * ((hash >> 6) & kTenBits); + phi = m_minPhi + m_dPhi * ((hash >> 16) & kTenBits); + return true; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/GridsHandler.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/GridsHandler.cxx new file mode 100644 index 000000000000..d0b6b70a2d19 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/GridsHandler.cxx @@ -0,0 +1,72 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigT2CaloJet/GridsHandler.h" + +#include "TrigT2CaloJet/HashedTrig3Momentum.h" + +#include <iostream> + + +GridsHandler::GridsHandler() +{ + using namespace std; + vector< CaloSampling::CaloSample > samples; + vector< size_t > defaultSizes; + // need to ajust the default sizes? (granularity ~0.1) + samples.push_back(CaloSampling::PreSamplerB); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EMB1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EMB2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EMB3 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::PreSamplerE); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EME1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EME2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::EME3 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::HEC0 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::HEC1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::HEC2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::HEC3 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileBar0 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileBar1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileBar2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileGap1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileGap2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileGap3 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileExt0 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileExt1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::TileExt2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::FCAL0 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::FCAL1 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::FCAL2 ); defaultSizes.push_back(128); + samples.push_back(CaloSampling::Unknown ); defaultSizes.push_back(128); + + for(unsigned int iS=0; iS<samples.size(); iS++){ + CaloSampling::CaloSample &sample = samples[iS]; + m_grids[sample] = vector< HashedTrig3Momentum >(0); + m_grids[sample].reserve(defaultSizes[iS]); + } // end for(iS) + + copy(samples.begin(), samples.end(), + back_inserter< vector< CaloSampling::CaloSample> >(m_allSamples)); +} + +//------------------------------------------------ +void clearGrid(CsVmcPair &map){ map.second.clear(); } +//------------------------------------------------ +void GridsHandler::clearAllGrids() +{ + std::for_each(m_grids.begin(), m_grids.end(), clearGrid); +} + +//------------------------------------------------ +Vmc& GridsHandler::grid(const CaloSampling::CaloSample &sample) +{ + return m_grids[sample]; +} +//------------------------------------------------ +void GridsHandler::appendAllGrids(Vt3m &output) const +{ + for(CsVmcMap::const_iterator it=m_grids.begin(); it != m_grids.end(); ++it) + output.insert(output.end(), it->second.begin(), it->second.end()); +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/HashedTrig3Momentum.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/HashedTrig3Momentum.cxx new file mode 100644 index 000000000000..c657566a7f5e --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/HashedTrig3Momentum.cxx @@ -0,0 +1,55 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigT2CaloJet/HashedTrig3Momentum.h" + +#include <cmath> // fabs + +HashedTrig3Momentum::HashedTrig3Momentum() : Trig3Momentum(), m_hash(0) {} +//------------------------------------------------ +HashedTrig3Momentum::HashedTrig3Momentum(const Trig3Momentum &t3m, const u_int &hash) : + Trig3Momentum(t3m), m_hash(hash) +{ +} +//------------------------------------------------ +void HashedTrig3Momentum::addE(const double &eta, const double &phi, + const double &energy) +{ + //-dbg-using namespace std; + //-dbg-cout<<"adding ("<<eta<<", "<<phi<<", "<<energy<<") to " + //-dbg- <<" ("<<eta_<<", "<<phi_<<", "<<ene_<<")"<<endl; + updateWeightedCoord(eta, phi, energy); + setE(e() + energy); + //-dbg-cout<<"now ("<<eta_<<", "<<phi_<<", "<<ene_<<")"<<endl; +} +//------------------------------------------------ +void HashedTrig3Momentum::reset() +{ + m_hash = 0; + setE(0.); + setEta(0.); + setPhi(0.); +} +//------------------------------------------------ +void HashedTrig3Momentum::addE(const Trig3Momentum &t3m) +{ + HashedTrig3Momentum::addE(t3m.eta(), t3m.phi(), t3m.e()); +} +//------------------------------------------------ +void HashedTrig3Momentum::updateWeightedCoord(const double &etaVal, + const double &phiVal, + const double &energyVal) +{ + double weightOld(fabs(e())), weightNew(fabs(energyVal)); + double weightTot(weightOld+weightNew); + if(weightTot==0.0){ + setEta(0.5*(eta() + etaVal)); + setPhi(0.5*(phi() + phiVal)); + } else { + double invWeightTot = 1.0 / weightTot; + setEta((eta()*weightOld + etaVal*weightNew) * invWeightTot); + setPhi((phi()*weightOld + phiVal*weightNew) * invWeightTot); + } +} +//------------------------------------------------ diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2AllRoiUnpacking.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2AllRoiUnpacking.cxx new file mode 100644 index 000000000000..6b9f64dc7aec --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2AllRoiUnpacking.cxx @@ -0,0 +1,496 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2AllRoiUnpacking.cxx +// PACKAGE: Trigger/TrigAlgorithms/T2AllRoiUnpacking +// +// AUTHOR: Davide Gerbaudo, gerbaudo@cern.ch +// +// Description: Unpack several L2 calorimeter ROIs and store them in a single output grid. +// Used T2L1Unpacking (by Matthew Tamsett) as a template for this AllTEAlgo. +// ******************************************************************** + +#include "TrigT2CaloJet/T2AllRoiUnpacking.h" +#include "TrigCaloEvent/Trig3Momentum.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include <boost/assign/std/vector.hpp> // for 'operator+=()' +#include <boost/foreach.hpp> + +#include <cmath> +#include <algorithm> +#include <iostream> +#include <fstream> + +//-------------------------------------------------------------- +T2AllRoiUnpacking::T2AllRoiUnpacking(const std::string & name, ISvcLocator* pSvcLocator) + : HLT::AllTEAlgo(name, pSvcLocator), + kAllocatedGridCells_(8192), + m_jetOutputKey(""), + m_roiEtaHalfWidth(0.), + m_roiPhiHalfWidth(0.), + m_mergeEmCells(true), + m_tmpGrid(0), + m_ttEmSamplings(0), + m_ttHecSamplings(0), + m_tileSampling(0), + m_prepare(true), + m_tmm(), + m_caloGridFromCellsTool("T2CaloJetGridFromCells",0), + m_retrievedGridTool(false), + m_grid(0), + m_processedRegions(0), + m_overlapRegions(0), + m_log(0), + m_cell_unpacking_timer(0), + m_unpacking_timer(0), + m_RoI_timer(0), + m_merge_timer(0), + m_jet(0), + m_UnpckTime(0.), + m_cellUnpckTime(0.), + m_RoITime(0.), + m_mergeTime(0.) +{ + // unpacking tool + // configurables + declareProperty("GridFromCellsTool", m_caloGridFromCellsTool, "tool used to unpack the grid"); + declareProperty("L2RoiEtaHalfWidth", m_roiEtaHalfWidth = 1.0, "half width in eta of the L2 ROI"); + declareProperty("L2RoiPhiHalfWidth", m_roiPhiHalfWidth = 1.0, "half width in phi of the L2 ROI"); + declareProperty("jetOutputKey", m_jetOutputKey = "T2L1Towers"); + declareProperty("MergeEmCells", m_mergeEmCells = true, "whether EM cells shoud be merged"); + // monitoring + declareMonitoredVariable("UnpckTime", m_UnpckTime); + declareMonitoredVariable("CellUnpckTime", m_cellUnpckTime); + declareMonitoredVariable("RoITime", m_RoITime); + declareMonitoredVariable("MergeTime", m_mergeTime); + +} +//-------------------------------------------------------------- +HLT::ErrorCode T2AllRoiUnpacking::hltInitialize() { + m_log = new MsgStream(msgSvc(), name()); + MsgStream &logStream = *m_log; + + if(logStream.level() <= MSG::INFO) + logStream << MSG::INFO << " Initalizing FEX algorithm: " << name() << endmsg; + + initializeTimers(); + initializeHelperTools(); + + return HLT::OK; +} +//-------------------------------------------------------------- +T2AllRoiUnpacking::~T2AllRoiUnpacking(){ +} + +/* +// Just a functor that allows to use +// T2AllRoiUnpacking::processTriggerElement within for_each +// Right now I cannot use it because processTriggerElement is private. +// Later on I will check whether it's safe to make it public... +// DG Jan2012 +typedef std::vector<Trig3Momentum> Trig3MomentumVec; +struct SingleTeProcessor : + public std::binary_function< T2AllRoiUnpacking, Trig3MomentumVec, HLT::ErrorCode> { + Trig3MomentumVec *grid_; + SingleTeProcessor(Trig3MomentumVec *grid):grid_(grid) {} ; + bool operator() (const T2AllRoiUnpacking &tu, const HLT::TriggerElement *te) { + return tu.processTriggerElement(te, grid_); + } +}; +*/ +//-------------------------------------------------------------- +HLT::ErrorCode T2AllRoiUnpacking::hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& tes_in, + unsigned int type_out) +{ + MsgStream &logStream = *m_log; + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + beforeExecMonitors().ignore(); + // setup what we need (variables and tools) + resetTimers(); + if(!inputIsValid(tes_in)) return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + + // if the input is valid, take _the_ TEVec and process it + const HLT::TEVec &tev = tes_in[0]; + HLT::TriggerElement* outputTE(setupOutputTe(type_out)); + if(m_unpacking_timer) m_unpacking_timer->start(); + // N.B. the ownership of m_grid is passed on to m_jet, and then to outputTE (i.e. no need to delete) + m_grid = new std::vector<Trig3Momentum>(); + m_grid->reserve(kAllocatedGridCells_); + m_processedRegions.clear(); + for(unsigned int iTe=0; iTe<tev.size(); iTe++){ + const HLT::TriggerElement* inputTe = tev[iTe]; + processTriggerElement(inputTe, m_grid); + } // end for(iTe) + if(m_unpacking_timer) m_unpacking_timer->stop(); + logStream<<MSG::DEBUG + <<"Processed "<<tev.size()<<" TriggerElements" + <<" and filled the grid with "<<m_grid->size()<<" cells." + <<endmsg; + // finalize the output and the monitoring variables + { + HLT::ErrorCode stat(finalizeOutput(outputTE)); + if(stat!= HLT::OK) return stat; + } + finalizeAccessories(); + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + afterExecMonitors().ignore(); + return HLT::OK; +} +//-------------------------------------------------------------- +HLT::ErrorCode T2AllRoiUnpacking::hltFinalize() +{ + MsgStream &logStream = *m_log; + if ( logStream.level() <= MSG::DEBUG ) + logStream << MSG::DEBUG << "Finalizing T2AllRoiUnpacking FEX " << name() << endmsg; + + delete m_log; + + return HLT::OK; +} +//-------------------------------------------------------------- +HLT::ErrorCode T2AllRoiUnpacking::processTriggerElement(const HLT::TriggerElement *te, + std::vector<Trig3Momentum>* grid) { + MsgStream &logStream = *m_log; + // sanity check on inputs + if(!te || !grid){ + logStream<<MSG::ERROR + <<"Invalid TriggerElement ("<<te<<") or grid ("<<grid<<") pointers" + <<endmsg; + return HLT::ERROR; + } // end if(!te || !grid) + + // get the (eta,phi) rectangles and overlaps + const TrigRoiDescriptor* roiDescriptor = 0; + HLT::ErrorCode hltStatus = getFeature(te, roiDescriptor); + if(HLT::OK != hltStatus){ + logStream<<MSG::ERROR + <<" Failed to find RoiDescriptor "<<endmsg; + return hltStatus; + } // end if(not OK) + L2CaloRoiBoundsCalculator bcalc(roiDescriptor, m_roiEtaHalfWidth, m_roiPhiHalfWidth); + EtaPhiRectangle l2Roi(bcalc.etaMin(), bcalc.etaMax(), + bcalc.phiMin(), bcalc.phiMax()); + + // determine overlaps and avoid these regions for this TE + m_overlapRegions.clear(); + determineOverlaps(l2Roi); + m_caloGridFromCellsTool->setForbiddenRegions(m_overlapRegions); + + // unpack (see T2CaloJetGridFromCells::addAllCells for the various bits) + if(m_cell_unpacking_timer) m_cell_unpacking_timer->start(); + double etaMin(l2Roi.etaMin()), etaMax(l2Roi.etaMax()); + double phiMin(l2Roi.phiMin()), phiMax(l2Roi.phiMax()); + + StatusCode sc = StatusCode::SUCCESS; + if(!m_mergeEmCells){ + if(m_caloGridFromCellsTool->addAllCells(etaMin, etaMax, + phiMin, phiMax, + grid).isFailure()) + sc = StatusCode::FAILURE; + + } // end if not merge EM + else { + // merge EM + if(m_merge_timer) m_merge_timer->start(); + m_tmpGrid.clear(); + BOOST_FOREACH(int sampling, m_ttEmSamplings){ + if(m_caloGridFromCellsTool->addLArCells(etaMin, etaMax, phiMin, phiMax, + &m_tmpGrid, + TTEM, + sampling, m_prepare).isFailure()) + sc = StatusCode::FAILURE; + } + m_tmm.mergeCells(m_tmpGrid, *grid); + if(m_merge_timer) m_merge_timer->stop(); + + // then just add HEC and Tile + BOOST_FOREACH(int sampling, m_ttHecSamplings){ + if(m_caloGridFromCellsTool->addLArCells(etaMin, etaMax, phiMin, phiMax, + grid, + TTHEC, + sampling, m_prepare).isFailure()) + sc = StatusCode::FAILURE; + } + if(m_caloGridFromCellsTool->addTileCells(etaMin, etaMax, phiMin, phiMax, + grid, + TILE, + m_tileSampling, m_prepare).isFailure()) + sc = StatusCode::FAILURE; + } // end if(m_mergeEmCells) + + if(m_cell_unpacking_timer) m_cell_unpacking_timer->stop(); + if(sc.isFailure()){ + if(logStream.level() <= MSG::DEBUG) + logStream<<MSG::DEBUG + <<" Failure of addCells. Empty grid, or some missing cells! "<<endmsg; + return HLT::ERROR; + } // end if(isFailure) + m_processedRegions.push_back(l2Roi); + return HLT::OK; +} +//---------------------------------------------------------- +bool T2AllRoiUnpacking::initializeTimers(){ + MsgStream &logStream = *m_log; + ITrigTimerSvc *pTimerService=0; + if( service( "TrigTimerSvc", pTimerService).isFailure() + || !pTimerService){ + logStream<<MSG::ERROR + <<name()<<": Unable to locate TrigTimer Service" + <<endmsg; + return false; + } + logStream << MSG::DEBUG << " Adding timers" << endmsg; + //Add timers + m_cell_unpacking_timer = addTimer("cell_unpacking_time"); + m_unpacking_timer = addTimer("unpacking_time"); + m_RoI_timer = addTimer("RoI_time"); + m_merge_timer = addTimer("merge_time"); + return true; +} +//-------------------------------------------------------------- +bool T2AllRoiUnpacking::initializeHelperTools(){ + using namespace boost::assign; + MsgStream &logStream = *m_log; + if ( m_caloGridFromCellsTool.retrieve().isFailure() ) { + logStream << MSG::ERROR << "Failed to retreive CaloGridFromCells tool: " << m_caloGridFromCellsTool << endmsg; + m_retrievedGridTool = false; + return false; + } + m_retrievedGridTool = true; + logStream << MSG::DEBUG << "Retrieved " << m_caloGridFromCellsTool << endmsg; + + // not strictly 'helpers' but have to be initialized too + m_ttEmSamplings += 0,1,2,3; + m_ttHecSamplings += 0,1,2; + m_tmpGrid.reserve(kAllocatedGridCells_); + + return true; +} +//-------------------------------------------------------------- +void T2AllRoiUnpacking::resetTimers(){ + if(m_cell_unpacking_timer) m_cell_unpacking_timer->reset(); + if(m_unpacking_timer) m_unpacking_timer->reset(); + if(m_RoI_timer) m_RoI_timer->reset(); + if(m_merge_timer) m_merge_timer->reset(); +} +//-------------------------------------------------------------- +bool T2AllRoiUnpacking::inputIsValid(const std::vector<std::vector<HLT::TriggerElement*> >& input) const { + MsgStream &logStream = *m_log; + if(logStream.level() <= MSG::DEBUG) + logStream<< MSG::DEBUG << "T2AllRoiUnpacking "<<name()<<"\n" + <<input.size()<<" input trigger elements for T2AllRoiUnpacking" + <<endmsg; + // sanity check on the input + if(1!=input.size()){ + logStream<<MSG::ERROR<<"T2AllRoiUnpacking "<<name()<<"\n" + <<"Error! expected only one vector<TriggerElement> as input,\n" + <<" that should contain the L1 jets." + <<" (got "<<input.size()<<" vectors instead)\n" + <<"Exiting hltExecute." + <<endmsg; + return false; + } // end if(1!=input.size()) + return true; +} +//-------------------------------------------------------------- +HLT::TriggerElement* T2AllRoiUnpacking::setupOutputTe(unsigned int type_out) { + if(m_RoI_timer) m_RoI_timer->start(); + HLT::TriggerElement* outputTE = addRoI(type_out, new TrigRoiDescriptor( true ) ); + outputTE->setActiveState(true); + if(m_RoI_timer) m_RoI_timer->stop(); + return outputTE; +} +//-------------------------------------------------------------- +void T2AllRoiUnpacking::storeTimers(){ + if(m_cell_unpacking_timer) m_cellUnpckTime = m_cell_unpacking_timer->elapsed(); + if(m_unpacking_timer) m_UnpckTime = m_unpacking_timer->elapsed(); + if(m_RoI_timer) m_RoITime = m_RoI_timer->elapsed(); + if(m_merge_timer) m_mergeTime = m_merge_timer->elapsed(); +} +//-------------------------------------------------------------- +HLT::ErrorCode T2AllRoiUnpacking::finalizeOutput(HLT::TriggerElement* outputTE){ + MsgStream &logStream = *m_log; + if(m_RoI_timer) m_RoI_timer->start(); + // N.B. the ownership of m_jet is passed on to outputTE (i.e. no need to delete) + m_jet = new TrigT2Jet(); + m_jet->setGrid(m_grid); + //HLT::ErrorCode stat = attachFeature(outputTE, outJets, m_jetOutputKey); + std::string key = ""; + HLT::ErrorCode stat = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (stat != HLT::OK){ + logStream<<MSG::ERROR + <<" recording of TrigT2Jets into StoreGate failed" + <<endmsg; + return stat; + } + if(m_RoI_timer) m_RoI_timer->stop(); + if(logStream.level() <= MSG::DEBUG) + logStream<<MSG::DEBUG + <<" Unpacking done. "<<name() + <<endmsg; + return stat; +} +//-------------------------------------------------------------- +void T2AllRoiUnpacking::finalizeAccessories(){ + storeTimers(); +} +//-------------------------------------------------------------- + +void T2AllRoiUnpacking::determineOverlaps(const EtaPhiRectangle &l2Roi) +{ + for(unsigned int iR=0; + iR < m_processedRegions.size(); + iR++){ + const EtaPhiRectangle &previous = m_processedRegions[iR]; + EtaPhiRectangle overlap(EtaPhiRectangle::overlappingRectangle(l2Roi,previous)); + if (overlap.area()>0.) m_overlapRegions.push_back(overlap); + } // end for(iR) +} +//-------------------------------------------------------------- + +// M_PI is defined in cmath. + +EtaPhiRectangle::EtaPhiRectangle(const double &etaMin, const double &etaMax, + const double &phiMin, const double &phiMax){ + m_etaMin = etaMin; + m_etaMax = etaMax; + m_phiMin = phiMin; + m_phiMax = phiMax; + m_wrapsAroundPi = std::abs(m_phiMax-m_phiMin) > M_PI; + computeCenterCoord(); +} +//-------------------------------------------------------------- +bool EtaPhiRectangle::contains(const EtaPhiPoint &point) const { + return ((fabs(point.first - m_etaCen) < m_etaHw) + && fabs(phi_mpi_pi(point.second - m_phiCen)) < m_phiHw); +} +//-------------------------------------------------------------- +void EtaPhiRectangle::computeCenterCoord(){ + m_etaCen = 0.5*(m_etaMin + m_etaMax); + // this takes care of the 2pi wrap + m_phiCen = atan2(sin(m_phiMin) + sin(m_phiMax), + cos(m_phiMin) + cos(m_phiMax)); + m_etaHw = 0.5*fabs(m_etaMax - m_etaMin); + m_phiHw = 0.5*fabs(phi_mpi_pi(m_phiMax - m_phiMin)); +} +//-------------------------------------------------------------- +double EtaPhiRectangle::phi_mpi_pi(const double &val) { + double value(val); + while(value <= -M_PI) value += 2.*M_PI; + while(value > +M_PI) value -= 2.*M_PI; + return value; +} +//-------------------------------------------------------------- +double EtaPhiRectangle::phi_zero_2pi(const double &val) { + double value(val); + while(value <= 0. ) value += 2.*M_PI; + while(value > 2.*M_PI) value -= 2.*M_PI; + return value; +} +//-------------------------------------------------------------- +double EtaPhiRectangle::overlappingArea(const EtaPhiRectangle &lhs, + const EtaPhiRectangle &rhs) { + // this is duplicated...we should just use EtaPhiRectangle::overlappingRectangle().area() + double etaOverlap(0.), phiOverlap(0.); + double deltaEta12(fabs(lhs.eta() - rhs.eta())); + double totHalfEtaWidth(lhs.etaHalfWidth() + rhs.etaHalfWidth()); + double deltaPhi12(fabs(phi_mpi_pi(lhs.phi() - rhs.phi()))); + double totHalfPhiWidth(lhs.phiHalfWidth() + rhs.phiHalfWidth()); + if (deltaEta12 < totHalfEtaWidth) + etaOverlap = totHalfEtaWidth - deltaEta12; + if (deltaPhi12 < totHalfPhiWidth) + phiOverlap = totHalfPhiWidth - deltaPhi12; + return etaOverlap * phiOverlap; +} +//-------------------------------------------------------------- +EtaPhiRectangle EtaPhiRectangle::overlappingRectangle(const EtaPhiRectangle &lhs, + const EtaPhiRectangle &rhs) { + double etaOverlap(0.), phiOverlap(0.); + double deltaEta12(fabs(lhs.eta() - rhs.eta())); + double totHalfEtaWidth(lhs.etaHalfWidth() + rhs.etaHalfWidth()); + double deltaPhi12(fabs(phi_mpi_pi(lhs.phi() - rhs.phi()))); + double totHalfPhiWidth(lhs.phiHalfWidth() + rhs.phiHalfWidth()); + if (deltaEta12 < totHalfEtaWidth) + etaOverlap = totHalfEtaWidth - deltaEta12; + if (deltaPhi12 < totHalfPhiWidth) + phiOverlap = totHalfPhiWidth - deltaPhi12; + double etaAvg(0.5*(lhs.eta() + rhs.eta())); + double phiAvg(atan2(sin(lhs.phi()) + sin(rhs.phi()), + cos(lhs.phi()) + cos(rhs.phi()))); + + EtaPhiRectangle res(etaAvg-0.5*etaOverlap, etaAvg+0.5*etaOverlap, + phiAvg-0.5*phiOverlap, phiAvg+0.5*phiOverlap); + /* + using std::ofstream; + using std::endl; + ofstream outFile; + std::string fileName("overlap_check.txt"); + string marker(""); + if(res.area()>0.) marker = " <<<<<<<<<<<<< "; + outFile.open(fileName.c_str(), std::ios::app); + outFile<<"Checking the overlap between "<<endl + <<lhs<<endl<<rhs + <<" result: "<<res<<" (area "<<res.area() + <<" = " + <<2.0*res.etaHalfWidth()<<" x " + <<2.0*res.phiHalfWidth()<<")" + <<marker<<endl; + outFile.close(); + */ + return res; +} + +//-------------------------------------------------------------- +void EtaPhiRectangle::print(std::ostream& stream) const { + stream<<"eta ["<<m_etaMin<<", "<<m_etaMax<<"], phi ["<<m_phiMin<<", "<<m_phiMax<<"]"; +} +//-------------------------------------------------------------- +std::ostream& operator<< (std::ostream& stream, const EtaPhiRectangle &epr) { + epr.print(stream); + return stream; +} +//-------------------------------------------------------------- +L2CaloRoiBoundsCalculator::L2CaloRoiBoundsCalculator(const TrigRoiDescriptor* trd, + const double &etaHalfWidth, + const double &phiHalfWidth): + m_etaMin(0.), + m_etaMax(0.), + m_phiMin(0.), + m_phiMax(0.), + m_roiEtaLimit(4.8), + m_fcalEtaMin(3.0), + m_fcalEtaMax(5.0), + m_minFcalEtaCenter(3.2) { + computeBounds(trd, etaHalfWidth, phiHalfWidth); +} +//-------------------------------------------------------------- +void L2CaloRoiBoundsCalculator::computeBounds(const TrigRoiDescriptor* trd, + const double &etaHalfWidth, + const double &phiHalfWidth) { + if(!trd){ + std::cerr<<"L2CaloRoiBoundsCalculator::computeBounds: invalid TrigRoiDescriptor ptr"<<std::endl; + return; + } + // DG Jan2012: I don't know why here they used (0, 2pi]...keeping it just for consistency + m_etaMin = std::max(-1.0 * m_roiEtaLimit, trd->eta() - etaHalfWidth); + m_etaMax = std::min( 1.0 * m_roiEtaLimit, trd->eta() + etaHalfWidth); + m_phiMin = EtaPhiRectangle::phi_zero_2pi(trd->phi() - phiHalfWidth); + m_phiMax = EtaPhiRectangle::phi_zero_2pi(trd->phi() + phiHalfWidth); + //Look at RoIs in FCal + if(fabs(trd->eta()) > m_minFcalEtaCenter){ + if(trd->eta() < -m_minFcalEtaCenter){ + m_etaMin = -m_fcalEtaMax; + m_etaMax = -m_fcalEtaMin; + } + if(trd->eta() > +m_minFcalEtaCenter){ + m_etaMin = m_fcalEtaMin; + m_etaMax = m_fcalEtaMax; + } + } +} +//-------------------------------------------------------------- diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloFastJet.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloFastJet.cxx new file mode 100644 index 000000000000..a85e73691fbd --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloFastJet.cxx @@ -0,0 +1,824 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloFastJet.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett, tamsett@cern.ch +// +// Description: Level 2 FastJet FEX algorithm. +// ******************************************************************** +#include "TrigT2CaloJet/T2CaloFastJet.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigCaloEvent/TrigT2JetContainer.h" +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include <algorithm> +#include <iterator> + +T2CaloFastJet::T2CaloFastJet(const std::string & name, ISvcLocator* pSvcLocator) + : HLT::AllTEAlgo(name, pSvcLocator), + m_cellMinEnergy(0.), + m_tools(this), + m_pTimerService(0), + //m_total_timer(0), + m_unpack_timer(0), + m_fastjet_timer(0), + m_pu_subtraction_timer(0), + m_cleaning_timer(0), + m_calibration_timer(0), + m_RoI_timer(0), + m_jet_def(0), + m_cluster_sequence(0), + m_pu_cluster_sequence(0), + m_pu_area_cluster_sequence(0), + m_jet(0) +{ + // configurables + declareProperty("jetInputKey", m_jetInputKey = "T2L1Towers"); + declareProperty("jetOutputKey", m_jetOutputKey = "TrigT2CaloJet"); + declareProperty("distanceParameter", m_distanceParameter = 0.4); + declareProperty("pTmin", m_pTmin = 10000.); + declareProperty("inputType", m_inputType = 1); + declareProperty("outputType", m_outputType = 1); + declareProperty("T2JetTools", m_tools, "list of Jet tools"); + declareProperty("cellMinEnergy", m_cellMinEnergy=0.0); + // cleaning: + declareProperty("doCleaning", m_doCleaning = false); + declareProperty("doT2L1Cleaning", m_doT2L1Cleaning = true); + declareProperty("cellQualityThresholdLAr", m_cellQualityThresholdLAr = 4000); + declareProperty("leadingCellFraction", m_leadingCellFraction = 0.9); // for jet cleaning, e.g.: n90 -> leadingCellFraction = 0.9 + // navigation + declareProperty("writeMultipleOutputTEs", m_writeMultipleOutputTEs = false); + declareProperty("secondOutputType", m_secondOutputType = 0); + + // pileup subtraction + declareProperty("doPileupSubtraction", m_doPileupSubtraction = false); + + // monitoring + //declareMonitoredVariable("OverallTime", m_TotalTime); + declareMonitoredVariable("UnpackTime", m_UnpackTime); + declareMonitoredVariable("FastJetTime", m_FastJetTime); + declareMonitoredVariable("puSubTime", m_puSubTime); + declareMonitoredVariable("CleaningTime", m_CleaningTime); + declareMonitoredVariable("CalibrationTime",m_CalibrationTime); + declareMonitoredVariable("RoITime", m_RoITime); + declareMonitoredVariable("nJets", m_nJets); + declareMonitoredVariable("nGrid", m_nGrid); + declareMonitoredStdContainer("Et", m_et); + declareMonitoredStdContainer("EtEM", m_et_em); + declareMonitoredStdContainer("EtHAD", m_et_had); + declareMonitoredStdContainer("E", m_e); + declareMonitoredStdContainer("EEM", m_e_em); + declareMonitoredStdContainer("EHAD", m_e_had); + declareMonitoredStdContainer("Eta", m_eta); + declareMonitoredStdContainer("Phi", m_phi); + declareMonitoredStdContainer("Emf", m_em_frac); + declareMonitoredStdContainer("nLeadingTowers", m_nLeadingTowers); +} + +HLT::ErrorCode T2CaloFastJet::hltInitialize() +{ + m_log = new MsgStream(msgSvc(), name()); + + if((*m_log).level() <= MSG::INFO){ + (*m_log) << MSG::INFO << " Initalizing FEX algorithm: " << name() << endmsg; + (*m_log) << MSG::DEBUG << "Options: " << endmsg; + (*m_log) << MSG::DEBUG << " distanceParameter: " << m_distanceParameter << endmsg; + (*m_log) << MSG::DEBUG << " pTmin: " << m_pTmin << endmsg; + (*m_log) << MSG::DEBUG << " doCleaning: " << m_doCleaning << endmsg; + (*m_log) << MSG::DEBUG << " doT2L1Cleaning: " << m_doT2L1Cleaning << endmsg; + (*m_log) << MSG::DEBUG << " leadingCellFraction: " << m_leadingCellFraction << endmsg; + (*m_log) << MSG::DEBUG << " cellQualityThresholdLAr: " << m_cellQualityThresholdLAr << endmsg; + (*m_log) << MSG::DEBUG << " input type: " << m_inputType << endmsg; + (*m_log) << MSG::DEBUG << " output type: " << m_outputType << endmsg; + (*m_log) << MSG::DEBUG << " write multiple TEs: " << m_writeMultipleOutputTEs << endmsg; + (*m_log) << MSG::DEBUG << " secondary output type: " << m_secondOutputType << endmsg; + (*m_log) << MSG::DEBUG << " do pileup subtraction: " << m_doPileupSubtraction << endmsg; + + } + + // initalise T2L1 helper tools + m_t2l1_tools = T2L1Tools(); + + // Create helper tools + if ( m_tools.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_tools << endmsg; + } else { + (*m_log) << MSG::INFO << "Retrieved " << m_tools << endmsg; + } + + // Initialize timing service + if( service( "TrigTimerSvc", m_pTimerService).isFailure() ) { + (*m_log) << MSG::WARNING << name() << ": Unable to locate TrigTimer Service" << endmsg; + } + + if (m_pTimerService){ + (*m_log) << MSG::DEBUG << "Adding timers" << endmsg; + //Add timers + //m_total_timer = addTimer("total_time"); + m_unpack_timer = addTimer("unpack_time"); + m_fastjet_timer = addTimer("fastjet_time"); + m_pu_subtraction_timer = addTimer("pu_subtraction_time"); + m_cleaning_timer = addTimer("cleaing_time"); + m_calibration_timer = addTimer("calibration_time"); + m_RoI_timer = addTimer("roi_time"); + } + + // initialise fast jet + m_particles.reserve(100); + m_constituents.reserve(100); + m_jets.reserve(100); + + (*m_log) << MSG::INFO << "Setting up fastjet jet definition" << endmsg; + m_jet_def = new fastjet::JetDefinition(fastjet::antikt_algorithm, m_distanceParameter); // this should be made configurable in the future + // dummy call to fast jet so it's internal initalize methods are set (and we don't print the banner during execute) + (*m_log) << MSG::INFO << "Making dummy call to fast jet cluster sequence" << endmsg; + m_particles.clear(); + m_cluster_sequence = new fastjet::ClusterSequence(m_particles, *m_jet_def); + delete m_cluster_sequence; + // pileup subtraction + if (m_doPileupSubtraction) { + (*m_log) << MSG::INFO << "Setting up fastjet pileup subtraction" << endmsg; + // define the jet algorithm + double ktRadius(0.4); + m_pu_jet_def = new fastjet::JetDefinition(fastjet::kt_algorithm,ktRadius,fastjet::E_scheme,fastjet::Best); + // define jet area algorithm + m_pu_area_def = new fastjet::AreaDefinition(fastjet::VoronoiAreaSpec(0.9)); + } + + // cleaning + m_cellenergies.reserve(100); + + // monitored vectors + m_et.reserve(100); + m_et_em.reserve(100); + m_et_had.reserve(100); + m_e.reserve(100); + m_e_em.reserve(100); + m_e_had.reserve(100); + m_eta.reserve(100); + m_phi.reserve(100); + m_em_frac.reserve(100); + m_nLeadingTowers.reserve(100); + + return HLT::OK; +} + +T2CaloFastJet::~T2CaloFastJet(){ +} + + +HLT::ErrorCode T2CaloFastJet::hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& tes_in, + unsigned int type_out) +{ + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + beforeExecMonitors().ignore(); + + // ==== pre-execute setup + if(doTiming()) { + //m_total_timer->reset(); + m_unpack_timer->reset(); + m_fastjet_timer->reset(); + m_pu_subtraction_timer->reset(); + m_cleaning_timer->reset(); + m_calibration_timer->reset(); + m_RoI_timer->reset(); + //m_total_timer->start(); + } + m_particles.clear(); + m_constituents.clear(); + m_jets.clear(); + m_nJets = -99; + m_nGrid = -99; + //m_TotalTime = -99; + m_UnpackTime = -99; + m_FastJetTime = -99; + m_CleaningTime = -99; + m_CalibrationTime = -99; + m_RoITime = -99; + m_et.clear(); + m_et_em.clear(); + m_et_had.clear(); + m_e.clear(); + m_e_em.clear(); + m_e_had.clear(); + m_eta.clear(); + m_phi.clear(); + m_em_frac.clear(); + m_nLeadingTowers.clear(); + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "================= Executing T2CaloFastJet FEX " << name() << endmsg; + + } +#endif + + // === get the input particles + //HLT::TriggerElement* seednode(0); + const TrigT2Jet* inputGrid(0); + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << tes_in.size() << " input TEs found" << endmsg; + } +#endif + // error check, we should only have a single input TE + if ( tes_in.size() != 1 ) { + msg() << MSG::WARNING << "Got more than one input TE" << endmsg; + afterExecMonitors().ignore(); + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN, HLT::Reason::USERDEF_1); + } + + for ( unsigned type = 0; type < tes_in.size(); ++ type ) { + std::vector<HLT::TriggerElement*>& tes = tes_in.at(type); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - TE[" << type << "]: " << tes.size() << " sub TEs found" << endmsg; + } +#endif + // error check, we should only have a single sub TE + if ( tes.size() != 1 ) { + msg() << MSG::WARNING << "Got more than one sub TE" << endmsg; + afterExecMonitors().ignore(); + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN, HLT::Reason::USERDEF_1); + } + + for ( unsigned teIdx = 0; teIdx < tes.size(); ++teIdx ) { + HLT::ErrorCode ec = getFeature(tes.at(teIdx), inputGrid, m_jetInputKey); + //seednode = tes.at(teIdx); + if(ec!=HLT::OK) { + (*m_log) << MSG::WARNING << "Failed to get the input particles" << endmsg; + return ec; + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - A total of " << inputGrid->grid()->size() << " particles found in this TE" << endmsg; + } +#endif + } // end of loop on sub TEs + } // end of loop on TEs + + const std::vector<Trig3Momentum>* grid = inputGrid->grid(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "A total of " << grid->size() << " particles are to be clustered" << endmsg; + } +#endif + + // === Unpack the grid + if(doTiming()) m_unpack_timer->start(); + std::vector<Trig3Momentum>::const_iterator begin_grid, begin_grid_fixed, end_grid; + begin_grid = grid->begin(); + begin_grid_fixed = grid->begin(); + end_grid = grid->end(); + int jet_counter = 0; + for (; begin_grid != end_grid; ++begin_grid){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Trig3Momentum[" << jet_counter + << "]: Et: " << begin_grid->e()/cosh(begin_grid->eta()) + << " MeV, eta: " << begin_grid->eta() + << ", phi: " << begin_grid->phi() + << ", sampling: " << std::hex << begin_grid->caloSample() << std::dec << endmsg; + } +#endif + + // now fill fast jet particles + double energy(begin_grid->e()); + if(energy<m_cellMinEnergy) continue; + double eta(begin_grid->eta()); + double phi(begin_grid->phi()); + double transverse_energy = energy/cosh(eta); + double px = transverse_energy*cos(phi); + double py = transverse_energy*sin(phi); + double pz = transverse_energy*sinh(eta); + + fastjet::PseudoJet pseudo_jet( px, py, pz, energy); + pseudo_jet.set_user_index(std::distance(begin_grid_fixed, begin_grid)); + m_particles.push_back( pseudo_jet ); + + jet_counter++; + } + m_nGrid = grid->size(); + if(doTiming()) m_unpack_timer->stop(); + + // === Run fast jet + if(doTiming()) m_fastjet_timer->start(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "=== Performing jet finding " << endmsg; + } +#endif + // run the clustering, extract the jets + m_cluster_sequence = 0; + m_pu_cluster_sequence = 0; + if (m_doPileupSubtraction){ + m_pu_cluster_sequence = new fastjet::ClusterSequenceArea(m_particles, *m_jet_def, *m_pu_area_def); + m_jets = fastjet::sorted_by_pt(m_pu_cluster_sequence->inclusive_jets(m_pTmin)); // sorted by decreasing pt + } else { + m_cluster_sequence = new fastjet::ClusterSequence(m_particles, *m_jet_def); + m_jets = fastjet::sorted_by_pt(m_cluster_sequence->inclusive_jets(m_pTmin)); // sorted by decreasing pt + } + + //std::reverse(m_jets.begin(),m_jets.end()); // sorted by increasing pt + m_nJets = m_jets.size(); + if(doTiming()) m_fastjet_timer->stop(); + + // pileup subtraction + if(doTiming()) m_pu_subtraction_timer->start(); + if (m_doPileupSubtraction){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "=== Performing pileup subtraction jet finding " << endmsg; + } +#endif + m_pu_area_cluster_sequence = 0; + m_pu_area_cluster_sequence = new fastjet::ClusterSequenceArea(m_particles, *m_pu_jet_def, *m_pu_area_def); + // get rho in central eta range + m_rho = 0.; + m_sigma = 0.; + m_area = 0.; + fastjet::RangeDefinition etaRange(-2.,2.); + m_pu_area_cluster_sequence->get_median_rho_and_sigma(etaRange,false,m_rho,m_sigma,m_area); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " completed pileup subtraction jet finding" << endmsg; + (*m_log) << MSG::DEBUG << " median rho: " << m_rho << endmsg; + (*m_log) << MSG::DEBUG << " median sigma: " << m_sigma << endmsg; + (*m_log) << MSG::DEBUG << " area: " << m_area << endmsg; + + } +#endif + } + if(doTiming()) m_pu_subtraction_timer->pause(); + + // === Store output + if(doTiming()) m_RoI_timer->start(); + std::string key = ""; + HLT::TriggerElement* outputTE = 0; + if (!m_writeMultipleOutputTEs){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Writing all jets to a single output TE" << endmsg; + } +#endif + outputTE = addRoI(type_out, new TrigRoiDescriptor(true)); // make a single output TE + outputTE->setActiveState(true); + } else { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Writing each jet to it's own output TE" << endmsg; + } +#endif + } + int recorded_jet_counter = 0; + + + + // inspect the output jets, compute some cleaning variables then store +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Found "<< m_jets.size() << " jets " << endmsg; + if (m_jets.size()) (*m_log) << MSG::DEBUG << "== Resultant jets " << endmsg; + } +#endif + for (unsigned i = 0; i < m_jets.size(); ++i) { + if (m_doPileupSubtraction){ + m_constituents = fastjet::sorted_by_pt(m_pu_cluster_sequence->constituents(m_jets[i])); + } else { + m_constituents = fastjet::sorted_by_pt(m_cluster_sequence->constituents(m_jets[i])); + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " fastjet jet [" << i + << "]: Et: " << m_jets[i].e()/cosh(m_jets[i].eta()) + << " MeV, eta: " << m_jets[i].eta() + << ", phi: " << m_jets[i].phi_std() + << ", rapidity: " << m_jets[i].rapidity() + << ", n consituents: " << m_constituents.size() << endmsg; + } +#endif + // === pileup subtraction + if(doTiming()) m_pu_subtraction_timer->resume(); + double et_offset = 0.; + double e_offset = 0.; + if (m_doPileupSubtraction){ + double jet_area = m_pu_cluster_sequence->area(m_jets[i]); + et_offset = jet_area * m_rho; + e_offset = et_offset * cosh(m_jets[i].eta()); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - area: " << jet_area << ", offset (median m_rho * m_area): " << et_offset << endmsg; + (*m_log) << MSG::DEBUG << " - offset ET: " << (m_jets[i].e()/cosh(m_jets[i].eta())) - et_offset << ", e: " << m_jets[i].e()-e_offset << endmsg; + + } +#endif + } + if(doTiming()) m_pu_subtraction_timer->stop(); + // === cleaning + if(doTiming()) m_cleaning_timer->start(); + // taken from Tobias' L2 cleaning code in T2CaloJetConeTool + // initialize cleaning variables + int nLeadingCells = 0.; // number of leading cells + double em_energy = 0.; // EM energy + double had_energy = 0.; // hadronic energy + double emf = -9.; // fraction of jet energy in emc + double hecf = -9.; // fraction of jet energy in hec + float jetQuality = -9.; // quality of the jet + float jetTimeCells = -9.; // jet time calculated from cells + + // helper functions / variables for cleaning: + m_cellenergies.clear(); + float HECEnergy = 0.; + float EinBadCells = 0.; + bool isTile = false; + bool isLAr = false; + bool qualityTimeIsDefined = false; + float totaltime = 0.; + float norm = 0.; + float cellNorm = 0.; + float totCellE = 0.; // sum of energy in LAr cells with quality defined + double eTot=0, eta=0, phi=0, tmpE=0, eThresh=0, tmpPhi=0; + double tmpdPhi=0, dphi=0; + + if (m_doCleaning) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Computing cleaning variables "<< endmsg; + } +#endif + for (unsigned ii = 0; ii < m_constituents.size(); ++ii){ + int grid_id = m_constituents[ii].user_index(); + Trig3Momentum grid_element = grid->at(grid_id); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - Constituent["<< ii + << "], grid id[" << grid_id + << "]: Et: " << grid_element.e()/cosh(grid_element.eta()) + << " MeV, eta: " << grid_element.eta() + << ", phi: " << grid_element.phi() + << ", sampling: " << std::hex << grid_element.caloSample() << std::dec << endmsg; + if (!m_doT2L1Cleaning){ + (*m_log) << MSG::DEBUG << " provenance: " << grid_element.provenance() + << ", quality: " << grid_element.quality() + << ", time: " << grid_element.time() << endmsg; + } + } +#endif + // reset flags: + isTile = false; + isLAr = false; + + tmpE = grid_element.e(); + eTot += tmpE; // maybe this should be Et weighted + + // Summ contribution to hadronic/EM energy: + const CaloSampling::CaloSample s = grid_element.caloSample(); + if( s == CaloSampling::PreSamplerB || s == CaloSampling::PreSamplerE || + s == CaloSampling::EMB1 || s == CaloSampling::EME1 || + s == CaloSampling::EMB2 || s == CaloSampling::EME2 || + s == CaloSampling::EMB3 || s == CaloSampling::EME3 || + s == CaloSampling::FCAL0){ + em_energy += tmpE; + isLAr = true; // for cleaning + } + if( s == CaloSampling::HEC0 || s == CaloSampling::HEC1|| + s == CaloSampling::HEC2 || s == CaloSampling::HEC3 || + s == CaloSampling::TileBar0 || s == CaloSampling::TileExt0 || + s == CaloSampling::TileBar1 || s == CaloSampling::TileExt1 || + s == CaloSampling::TileBar2 || s == CaloSampling::TileExt2 || + s == CaloSampling::TileGap1 || s == CaloSampling::TileGap2 || + s == CaloSampling::TileGap3 || s == CaloSampling::FCAL1 || + s == CaloSampling::FCAL2) + had_energy += tmpE; + + if (tmpE>0){ // threshold from job options? + eThresh += tmpE; + eta += tmpE*grid_element.eta(); + tmpPhi = grid_element.phi(); + + tmpdPhi = tmpPhi - m_jets[i].phi_std(); // w.r.t Jet + if (tmpdPhi > M_PI) tmpdPhi -= 2*M_PI; + if (tmpdPhi < -1*M_PI) tmpdPhi += 2*M_PI; + + dphi += tmpE*tmpdPhi; // this needs the wrap-around check + + } + + // cleaning: + m_cellenergies.push_back( tmpE ); + if( s == CaloSampling::HEC0 || s == CaloSampling::HEC1 || + s == CaloSampling::HEC2 || s == CaloSampling::HEC3 ) { + HECEnergy += tmpE; + isLAr = true; + } + if( s == CaloSampling::FCAL1 || s == CaloSampling::FCAL2 ){ + isLAr = true; + } + if( s == CaloSampling::TileBar0 || s == CaloSampling::TileBar1 || + s == CaloSampling::TileBar2 || s == CaloSampling::TileGap1 || + s == CaloSampling::TileGap2 || s == CaloSampling::TileGap3 || + s == CaloSampling::TileExt0 || s == CaloSampling::TileExt1 || + s == CaloSampling::TileExt2 ) { + isTile = true; + } + + if (!m_doT2L1Cleaning){ + uint16_t cellprovenance = grid_element.provenance(); + // grab cell quality and cell time. + uint16_t cellquality = grid_element.quality(); + float celltime = grid_element.time(); + qualityTimeIsDefined = false; + + // check for tile + if(isTile){ + // cells with bad quality are masked -> don't take tile into account + // for jet quality calculation. + // provenance not set for tile cells. but time is defined. + // timing: + cellNorm = tmpE * tmpE; + totaltime += cellNorm * celltime; + norm += cellNorm; + } + // check for LAr. only take cells into accout which have time and quality defined + if( (isLAr) && (cellprovenance & 0x2000) ){ + qualityTimeIsDefined = true; + totCellE += tmpE; + // timing: + cellNorm = tmpE * tmpE; + totaltime += cellNorm * celltime; + norm += cellNorm; + } + + if( (isLAr) && (qualityTimeIsDefined) && (cellquality > m_cellQualityThresholdLAr) ){ + EinBadCells += tmpE; + } + } // end of non L1.5 cleaning + } // end loop over constituents + + // calculate the jet cleaning variables: + // ------------------------------------- + if(eThresh != 0) { + eta /= eThresh; + phi = dphi/eThresh + m_jets[i].phi_std(); // recover absolute value + + // phi must be between -pi and pi : + if(phi > M_PI) phi -= 2.0* M_PI; + if(phi < -1.0*M_PI) phi += 2.0*M_PI; + } + // sort cell-energy vector. (most energetic cell at end of vector) + std::sort(m_cellenergies.begin(), m_cellenergies.end()); + float sumE = 0.; + for(int k = m_cellenergies.size()-1; k > -1; k--){ + sumE += m_cellenergies[k]; + nLeadingCells++; + if(sumE > m_leadingCellFraction*eTot){ + break; + } + } + + float DELTA = 0.001; // distance to compare floats + if(fabs(eTot)>DELTA){ + hecf = HECEnergy/eTot; + emf = em_energy/eTot; + } + if (!m_doT2L1Cleaning){ + if(fabs(totCellE)>DELTA){ + jetQuality = EinBadCells/totCellE; + } + if(fabs(norm)>DELTA){ + jetTimeCells = totaltime/norm; + } + } + + // === cleaning completed +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - EM energy [MeV]: " << em_energy << ", (ET: " << em_energy/cosh(m_jets[i].eta()) << ")" << endmsg; + (*m_log) << MSG::DEBUG << " - HAD energy [MeV]: " << had_energy << ", (ET: " << had_energy/cosh(m_jets[i].eta()) << ")" << endmsg; + (*m_log) << MSG::DEBUG << " - n leading cells: " << nLeadingCells << endmsg; + (*m_log) << MSG::DEBUG << " - EM fraction: " << emf << endmsg; + (*m_log) << MSG::DEBUG << " - HEC fraction: " << hecf << endmsg; + (*m_log) << MSG::DEBUG << " - Jet quality: " << jetQuality << endmsg; + (*m_log) << MSG::DEBUG << " - Jet time: " << jetTimeCells << endmsg; + } +#endif + + } // end of cleaning + if(doTiming()) m_cleaning_timer->stop(); + // Set properties + m_jet = new TrigT2Jet(); + if (m_doPileupSubtraction){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " Recording with offset energy" << endmsg; +#endif + m_jet->setE(m_jets[i].e() - e_offset); + } else { + m_jet->setE(m_jets[i].e()); + } + m_jet->setEta(m_jets[i].eta()); + m_jet->setPhi(m_jets[i].phi_std()); + m_jet->setEem0(em_energy); + m_jet->setEhad0(had_energy); + // cleaning: + m_jet->setNLeadingCells(nLeadingCells); + m_jet->setHecf(hecf); + m_jet->setJetQuality(jetQuality); + m_jet->setEmf(emf); + m_jet->setJetTimeCells(jetTimeCells); + // RoI word + m_jet->set_RoIword(m_t2l1_tools.BLANKWORD+m_t2l1_tools.SET_INPUT*m_inputType+m_t2l1_tools.SET_OUTPUT*m_outputType+i); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " RoI word set to: " << m_jet->RoIword() << endmsg; +#endif + + // === calibration + if(doTiming()) m_calibration_timer->start(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " " << m_tools.size() << " calibration tools to be run"<< endmsg; + + } +#endif + // do loop over tools + ToolHandleArray< T2CaloJetBaseTool >::iterator it = m_tools.begin(), + itToolEnd = m_tools.end(); + int current=1; + for (; it != itToolEnd; ++it) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Executing tool [" << current << "]"<< endmsg; + } +#endif + if ((*it)->execute(m_jet, TrigRoiDescriptor(true), caloDDENull ).isFailure()){ // the zeros are the unused eta phi coordinates used by many base tools to define the RoI region + msg() << MSG::WARNING << "T2CaloFastJet AlgToolJets returned Failure" << endmsg; + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + current++; + } + +#ifndef NDEBUG + if( (m_tools.size()>0) && ((*m_log).level() <= MSG::DEBUG) ){ + (*m_log) << MSG::DEBUG << " calibrated jet [" << i + << "]: Et: " << m_jet->et() + << " MeV, eta: " << m_jet->eta() + << ", phi: " << m_jet->phi() + << endmsg; + } +#endif + if(doTiming()) m_calibration_timer->stop(); + // === monitor + m_et.push_back( m_jet->et()); + m_et_em.push_back( (m_jet->eem0()/cosh(m_jet->eta()))); + m_et_had.push_back( (m_jet->ehad0()/cosh(m_jet->eta()))); + m_e.push_back( m_jet->e()); + m_e_em.push_back( m_jet->eem0()); + m_e_had.push_back( m_jet->ehad0()); + m_eta.push_back( m_jet->eta() ); + m_phi.push_back( m_jet->phi() ); + m_em_frac.push_back( m_jet->emf() ); + m_nLeadingTowers.push_back( m_jet->nLeadingCells() ); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " recording T2CaloJet["<<recorded_jet_counter<<"]"<<endmsg; + } +#endif + if (m_writeMultipleOutputTEs){ + unsigned int secondary_roi_word = m_jet->RoIword(); + if (m_secondOutputType != 0){ + secondary_roi_word = m_t2l1_tools.BLANKWORD+m_t2l1_tools.SET_INPUT*m_outputType+m_t2l1_tools.SET_OUTPUT*m_secondOutputType+i; + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " preparing an output TE, using RoI word: " << secondary_roi_word <<endmsg; + } +#endif + // addRoI implementation + //outputTE = addRoI(type_out, m_jet->eta(), m_jet->phi()); // make an output TE + // alternative implementation + //outputTE = config()->getNavigation()->addNode(seednode,type_out); + //outputTE->setActiveState(true); + HLT::TriggerElement* initialTE = config()->getNavigation()->getInitialNode(); + outputTE = config()->getNavigation()->addNode(initialTE,type_out); + outputTE->setActiveState(true); + + // setup a trig RoI descriptor + unsigned int dummy_l1id = -9; // NO NO!!! THE L1ID IS AN UNSIGNED INT!!!! + int dummy_id = -9; // NO NO!!! THE ID IS AN UNSIGNED INT!!!! + TrigRoiDescriptor* newRoiDescriptor = + new TrigRoiDescriptor(unsigned(secondary_roi_word), unsigned(dummy_l1id), unsigned(dummy_id), + m_jet->eta(), m_jet->eta(), m_jet->eta(), + m_jet->phi(), m_jet->phi(), m_jet->phi() + ); + /// HOW BIG IS THE ROI ??? + HLT::ErrorCode hltStatus = attachFeature(outputTE, newRoiDescriptor, m_jetOutputKey); + if ( hltStatus != HLT::OK ) { + (*m_log) << MSG::ERROR << "recording of RoiDescriptor into StoreGate failed" << endmsg; + return hltStatus; + } + + + hltStatus = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (hltStatus != HLT::OK){ + (*m_log) << MSG::ERROR << "recording of TrigT2Jet into StoreGate failed" << endmsg; + return hltStatus; + } + } else { + HLT::ErrorCode hltStatus = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (hltStatus != HLT::OK){ + (*m_log) << MSG::ERROR << "recording of TrigT2Jet into StoreGate failed" << endmsg; + return hltStatus; + } + } + + + recorded_jet_counter++; + } + + m_RoI_timer->stop(); + + + // === post-execute admin + if (m_doPileupSubtraction){ + delete m_pu_cluster_sequence; + delete m_pu_area_cluster_sequence; + } else { + delete m_cluster_sequence; + } + if(doTiming()) { + //m_total_timer->stop(); + m_UnpackTime = m_unpack_timer->elapsed(); + m_FastJetTime = m_fastjet_timer->elapsed(); + m_puSubTime = m_pu_subtraction_timer->elapsed(); + m_CleaningTime = m_cleaning_timer->elapsed(); + m_CalibrationTime = m_calibration_timer->elapsed(); + m_RoITime = m_RoI_timer->elapsed(); + //m_TotalTime = m_total_timer->elapsed(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Unpacking completed in " << m_unpack_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "FastJet completed in " << m_fastjet_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "PU subtraction completed in " << m_pu_subtraction_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "Cleaning completed in " << m_cleaning_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "Calibration completed in " << m_calibration_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "RoI making completed in " << m_RoI_timer->elapsed() << " ms " << endmsg; + //(*m_log) << MSG::DEBUG << "T2CaloFastJet completed in " << m_total_timer->elapsed() << " ms " << endmsg; + } +#endif + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) (*m_log) << MSG::DEBUG << "================= Finished T2CaloFastJet " << name() << endmsg; +#endif + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + afterExecMonitors().ignore(); + + return HLT::OK; +} + + +HLT::ErrorCode T2CaloFastJet::hltFinalize() +{ + if ( (*m_log).level() <= MSG::DEBUG ) + (*m_log) << MSG::DEBUG << "Finalizing T2CaloFastJet FEX " << name() << endmsg; + + delete m_log; + m_particles.clear(); + m_jets.clear(); + m_constituents.clear(); + m_et.clear(); + m_et_em.clear(); + m_et_had.clear(); + m_e.clear(); + m_e_em.clear(); + m_e_had.clear(); + m_eta.clear(); + m_phi.clear(); + m_em_frac.clear(); + m_nLeadingTowers.clear(); + + if ( bool(m_jet_def) ){ + delete m_jet_def; + } + + if (m_doPileupSubtraction){ + delete m_pu_jet_def; + delete m_pu_area_def; + } + + + return HLT::OK; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJet.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJet.cxx new file mode 100755 index 000000000000..7185627e56ea --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJet.cxx @@ -0,0 +1,491 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloJet.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Kyle Cranmer +// ******************************************************************** + + +#include "GaudiKernel/IToolSvc.h" +//#include "GaudiKernel/StatusCode.h" + +//#include "TrigT1Interfaces/RecEmTauRoI.h" +#include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "TrigT2CaloJet/T2CaloJet.h" + +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigCaloEvent/TrigT2JetContainer.h" + +#include "CaloGeoHelpers/CaloSampling.h" + +#include "TrigT2CaloCommon/phiutils.h" + +#include <math.h> + +class ISvcLocator; + +T2CaloJet::T2CaloJet(const std::string & name, ISvcLocator* pSvcLocator) + : T2CaloBase(name, pSvcLocator), + m_jet(0), + m_layerInfo(0), + m_tools(this), + m_clearJetGrid(true), + m_fillLayerInfo(false), + m_timeLArUnpck(0), + m_timeTileUnpck(0), + m_timeHECUnpck(0) + +{ + declareProperty("jetOutputKey",m_jetOutputKey = "TrigT2CaloJet"); + declareProperty("clusterOutputKey",m_clusterOutputKey = "TrigT2Calo"); + // declareProperty("T2JetTools", m_toolNames); + declareProperty("T2JetTools", m_tools, "list of Jet tools"); + declareProperty("clearJetGrid",m_clearJetGrid = true); + declareProperty("fillLayerInfo",m_fillLayerInfo = false); + declareProperty("PhiIDWidth", m_phiIDWidth); + declareProperty("EtaIDWidth", m_etaIDWidth); + + declareMonitoredVariable("dR", m_dR); + declareMonitoredVariable("E", m_e); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eem", m_eem0); + declareMonitoredVariable("Ehad",m_ehad0); + declareMonitoredVariable("Etem", m_etem0); + declareMonitoredVariable("Ethad",m_ethad0); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); + declareMonitoredVariable("ConversionErrors", m_conversionError); + declareMonitoredVariable("AlgorithmErrors", m_algorithmError); + m_roiEtaLimit = 4.8; +} + +HLT::ErrorCode T2CaloJet::hltInitialize() +{ + + if (timerSvc()) { + m_timer.push_back(addTimer("TimeTot")); + } + + // Create helper tools + if ( m_tools.retrieve().isFailure() ) { + msg() << MSG::ERROR << "Failed to retreive helper tools: " << m_tools << endmsg; + } else { + msg() << MSG::INFO << "Retrieved " << m_tools << endmsg; + } + + if (timerSvc()) { + ToolHandleArray< T2CaloJetBaseTool >::iterator itTool = m_tools.begin(), + itToolEnd = m_tools.end(); + for ( ; itTool != itToolEnd; ++itTool ) { + + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG <<"Tool with name " << (*itTool).name()<< endmsg; + + m_timer.push_back(addTimer((*itTool).name())); + + if(((*itTool).name() == "T2CaloJetGridFromCells")||((*itTool).name() == "T2CaloJetGridFromFEBHeader")){ + + m_timeLArUnpck = (*itTool)->getTimer("LArUnpck"); + if(m_timeLArUnpck !=0){ + declareMonitoredObject("LArUnpck",m_timeLArUnpck, + &TrigTimer::lastElapsed); + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << "Found LArUnpck timer. Added to monitoring " + << endmsg; + } + + m_timeHECUnpck = (*itTool)->getTimer("HECUnpck"); + if(m_timeHECUnpck !=0){ + declareMonitoredObject("HECUnpck",m_timeHECUnpck, + &TrigTimer::lastElapsed); + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << "Found HECUnpck timer. Added to monitoring " + << endmsg; + } + + m_timeTileUnpck = (*itTool)->getTimer("TileUnpck"); + if(m_timeTileUnpck !=0){ + declareMonitoredObject("TileUnpck",m_timeTileUnpck, + &TrigTimer::lastElapsed); + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << "Found HECUnpck timer. Added to monitoring " + << endmsg; + } + } + } + } + + + return HLT::OK; +} + +T2CaloJet::~T2CaloJet(){ +} + +HLT::ErrorCode T2CaloJet::hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE) +{ + + if(timerSvc()) m_timer[0]->start(); + + m_dR = -99; + m_e = -99; + m_et = -99; + m_eem0 = -99; + m_ehad0 = -99; + m_etem0 = -99; + m_ethad0 = -99; + m_eta = -99; + m_phi = -99; + m_conversionError=0; + m_algorithmError=0; + + // Retrieve store. + // Very important! + // m_storeGate = getStore(); // not needed anymore + + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << "in execute()" << endmsg; + + // Some debug output: + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG + << "outputTE->getId(): " + << outputTE->getId() + << endmsg; + + msg() << MSG::DEBUG + << "inputTE->getId(): " + << inputTE->getId() + << endmsg; + } + // Note: new TriggerElement has no label() anymore ! + + + // ========================= + // retrieve RoI: + // ========================= + const IRoiDescriptor* roiDescriptor = 0; + HLT::ErrorCode hltStatus; + + const TrigRoiDescriptor* trigRoiDescriptor = 0; + hltStatus = getFeature(inputTE, trigRoiDescriptor); + roiDescriptor = trigRoiDescriptor; + + + if ( hltStatus == HLT::OK ) { + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << *roiDescriptor << endmsg; + + } else { + msg() << MSG::WARNING << " Failed to find RoiDescriptor " << endmsg; + return hltStatus; + } + + // Some debug output: + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG << "Message to count events. LVL1 phi=" + << roiDescriptor->phi() + << " & LVL1 eta=" + << roiDescriptor->eta() + << endmsg; + } + + /*** obsolete + // setup ROI bounds + double etamin = std::max(-1.0 * m_roiEtaLimit, roiDescriptor->eta0() - m_etaWidth); + double etamax = std::min( 1.0 * m_roiEtaLimit, roiDescriptor->eta0() + m_etaWidth); + double phimin = roiDescriptor->phi() - m_phiWidth; + double phimax = roiDescriptor->phi() + m_phiWidth; + while (phimin < 0) phimin += 2. * M_PI; + while (phimax > 2 * M_PI) phimax -= 2. * M_PI; + + + + //Look at RoIs in FCal - to what end ?? + if(fabs(roiDescriptor->eta())>3.2){ + if(roiDescriptor->eta()<-3.2){ + etamin = -m_fcalEtaMax; + etamax = -m_fcalEtaMin; + } + if(roiDescriptor->eta()>3.2){ + etamin = m_fcalEtaMin; + etamax = m_fcalEtaMax; + } + } + + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG << " etamin = "<< etamin << endmsg; + msg() << MSG::DEBUG << " etamax = "<< etamax << endmsg; + msg() << MSG::DEBUG << " phimin = "<< phimin << endmsg; + msg() << MSG::DEBUG << " phimax = "<< phimax << endmsg; + } + + ***/ + + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG << " roi = "<< *roiDescriptor << endmsg; + } + + // ========================= + // make Jet + // ========================= + // if(status) status = makeJet(outputTE); + + if(msgLvl() <= MSG::DEBUG) + msg() << MSG::DEBUG << " Making TrigT2Jet "<< endmsg; + + m_jet = new TrigT2Jet(); + + // jetContainer was only retrieved from StoreGate ... but never used + //TrigT2JetContainer* jetContainer; + +/* + StatusCode sc; + + if(!getStore()->transientContains<TrigT2JetContainer>(m_jetOutputKey)) { + if(msgLvl() <= MSG::DEBUG){ + msg() << MSG::DEBUG + <<" Create jetObjectMinimal container" + <<endmsg; + } + jetContainer = new TrigT2JetContainer(); + sc = m_storeGate->record(jetContainer,m_jetOutputKey); + + if (sc.isFailure()) + { + msg() << MSG::ERROR + << "Could not record TrigT2JetContainer in TDS" + << endmsg; + } + } + else{ + sc = m_storeGate->retrieve(jetContainer,m_jetOutputKey); + if(sc.isFailure()){ + msg() << MSG::ERROR + << "Could not retrieve TrigT2JetContainer " << m_jetOutputKey + << "from SG. Exiting..." + << endmsg; + return false; + } + } +*/ + //jetContainer->push_back(m_jet); + + + // Add RoI word to Jet + m_jet->set_RoIword(roiDescriptor->roiWord()); + + // Set eta,phi + m_jet->setEta(roiDescriptor->eta()); + m_jet->setPhi(roiDescriptor->phi()); + + + // do loop over tools + ToolHandleArray< T2CaloJetBaseTool >::iterator it = m_tools.begin(), + itToolEnd = m_tools.end(); + int courant=1; + uint32_t error = 0; + for ( ; it != itToolEnd; ++it ) { + if (timerSvc()) m_timer[courant]->start(); + /// if ((*it)->execute(m_jet, etamin, etamax, phimin, phimax).isFailure()){ + if ((*it)->execute(m_jet, *roiDescriptor, caloDDENull ).isFailure()){ + msg() << MSG::WARNING << "T2CaloJet AlgToolJets returned Failure" << endmsg; + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + uint32_t in_error = (*it)->report_error(); + if ( 0x0FFFFFFF & in_error ) m_conversionError++; + if ( 0xF0000000 & in_error ) m_algorithmError++; + error|=in_error; + if (timerSvc()) m_timer[courant]->stop(); + courant++; + } + + if(msgLvl() <= MSG::DEBUG){ + msg() << MSG::DEBUG << " Values of T2CaloJet produced: " << endmsg; + msg() << MSG::DEBUG << " REGTEST: Jet eta = " << m_jet->eta() << endmsg; + msg() << MSG::DEBUG << " REGTEST: Jet phi = " << m_jet->phi() << endmsg; + msg() << MSG::DEBUG << " REGTEST: Jet energy = " << m_jet->e() << endmsg; + } + + + double phia=roiDescriptor->phi(); + if(phia>M_PI) phia=phia-2*M_PI; + + double phib=m_jet->phi(); + if(phib>M_PI) phib=phib-2*M_PI; + + double dphi= phia-phib; + if(dphi>M_PI) dphi-=2*M_PI; + if(dphi<-M_PI) dphi+=2*M_PI; + + m_dR = sqrt( (roiDescriptor->eta()-m_jet->eta())*(roiDescriptor->eta()-m_jet->eta()) + dphi*dphi ); + + m_e = m_jet->e(); + m_eta = m_jet->eta(); + m_phi = m_jet->phi(); + + m_ehad0 = m_jet->ehad0(); + m_ethad0 = m_ehad0/cosh(m_eta); + + m_eem0 = m_jet->eem0(); + m_etem0 = m_eem0/cosh(m_eta); + + m_et = m_e/cosh(m_eta); + + // should probably set the delete the jet's vector of Trig3Momentum + // here, and set pointer to 0. + + // std::string jetKey = key2keyStore::getKey(m_jet); + // sc = m_storeGate->record( m_jet, jetKey, false, false ); + // if (sc.isFailure()){ + // msg() << MSG::ERROR << "Record of individual T2CaloJet into StoreGate failed" << endmsg; + // return false; + // }; + + std::string key = ""; + + hltStatus = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (hltStatus != HLT::OK) { + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::ERROR << "Write of TrigT2Jet into outputTE failed" + << endmsg; + } + return hltStatus; + } + + // ========================= + // make TrigCaloCluster + // ========================= + + if(msgLvl() <= MSG::DEBUG){ + msg() << MSG::DEBUG << "fillLayerInfo is set to "<< m_fillLayerInfo << endmsg; + } + + if (m_fillLayerInfo) { + if(msgLvl() <= MSG::DEBUG){ + msg() << MSG::DEBUG << "Making TrigCaloCluster "<< endmsg; + } + m_layerInfo = new TrigCaloCluster(); + + std::vector<Trig3Momentum>::iterator gridIt = m_jet->grid()->begin(); + std::vector<Trig3Momentum>::iterator gridEnd = m_jet->grid()->end(); + int nCells = 0; + double eLayer[CaloSampling::Unknown+1] = {0.0};//0 is CaloSampling::PreSamplerB, 24 is CaloSampling::Unknown + + // Loop in the jet cells: + for (; gridIt != gridEnd; ++gridIt){ + // consider only cells that are used in the cone: + if(! (*gridIt).inCone()) continue; + nCells++; + // get layer energy + const CaloSampling::CaloSample s = (*gridIt).caloSample(); + double cellE = (*gridIt).e(); + eLayer[s] = eLayer[s] + cellE; + } + + // fill TrigCaloCluster + m_layerInfo->setRawEnergy(m_jet->eem0()+m_jet->ehad0()); + m_layerInfo->setRawEt((m_jet->eem0()+m_jet->ehad0())/cosh(m_jet->eta())); + m_layerInfo->setRawEta(m_jet->eta()); + m_layerInfo->setRawPhi(m_jet->phi()); + m_layerInfo->setRoIword(m_jet->RoIword()); + m_layerInfo->setNCells(nCells); + for (int iSample=CaloSampling::PreSamplerB; iSample<CaloSampling::Unknown; ++iSample){ + const CaloSampling::CaloSample s = static_cast<CaloSampling::CaloSample> (iSample); + m_layerInfo->setRawEnergy(s,eLayer[s]); + } + + if(msgLvl() <= MSG::DEBUG){ + msg() << MSG::DEBUG << " Values of TrigCaloCluster produced: " << endmsg; + msg() << MSG::DEBUG << " REGTEST: Cluster raw eta = " << m_layerInfo->rawEta() << endmsg; + msg() << MSG::DEBUG << " REGTEST: Cluster raw phi = " << m_layerInfo->rawPhi() << endmsg; + msg() << MSG::DEBUG << " REGTEST: Cluster raw energy = " << m_layerInfo->rawEnergy() << endmsg; + msg() << MSG::DEBUG << " REGTEST: Cluster nb. of cells = " << m_layerInfo->nCells() << endmsg; + double totalE=0; + for (int iSample=CaloSampling::PreSamplerB; iSample<=CaloSampling::Unknown; ++iSample){ + const CaloSampling::CaloSample s = static_cast<CaloSampling::CaloSample> (iSample); + double layerE=m_layerInfo->rawEnergy(s); + totalE=totalE+layerE; + msg() << MSG::DEBUG << " REGTEST: Layer = " << iSample << " raw energy = " << layerE; + } + msg() << MSG::DEBUG << " REGTEST: Total = " << totalE << endmsg; + } + + // attach TrigCaloCluster + hltStatus = recordAndAttachFeature(outputTE, m_layerInfo, key, m_clusterOutputKey); + if (hltStatus != HLT::OK) { + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::ERROR << "Write of TrigCaloCluster into outputTE failed" + << endmsg; + } + return hltStatus; + } + } + + // ========================= + // make OutputTE + // ========================= + + // Create a new RoiDescriptor with updated eta and phi. + // Note that the steering will propagate l1Id and roiId automatically + // so no need to set them. + // How big is the RoI ????? + TrigRoiDescriptor* newRoiDescriptor = + //new TrigRoiDescriptor(roiDescriptor->l1Id(), roiDescriptor->roiId(), + // m_jet->eta(), m_jet->phi()); + new TrigRoiDescriptor(roiDescriptor->roiWord(), roiDescriptor->l1Id(), roiDescriptor->roiId(), + m_jet->eta(), m_jet->eta()-m_etaIDWidth, m_jet->eta()+m_etaIDWidth, + m_jet->phi(), + HLT::wrap_phi(m_jet->phi()-m_phiIDWidth), + HLT::wrap_phi(m_jet->phi()+m_phiIDWidth) ); + // We forward the roiWord to the EF (??) + + + hltStatus = attachFeature(outputTE, newRoiDescriptor, m_jetOutputKey); + + if ( hltStatus != HLT::OK ) { + msg() << MSG::ERROR << "Write of update TrigRoiDescriptor into outputTE failed" + << endmsg; + return hltStatus; + } + + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG << "Recorded an RoiDescriptor " << *newRoiDescriptor << endmsg; + } + + // Some debug output: + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG + << "We assume success, set TE with Id " + << outputTE->getId() + << " active to signal positive result." + << endmsg; + } + + + if(m_clearJetGrid) m_jet->clearGrid(); + + if (timerSvc()) { + m_timer[0]->stop(); + } + + return HLT::OK; +} + + +HLT::ErrorCode T2CaloJet::hltFinalize() +{ + if ( msgLvl() <= MSG::INFO ) + msg() << MSG::INFO << "in finalize()" << endmsg; + + return HLT::OK; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetBaseTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetBaseTool.cxx new file mode 100755 index 000000000000..3d1d006a8f64 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetBaseTool.cxx @@ -0,0 +1,61 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetBaseTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Base Tool for all T2CaloJet tools that require + an T2CaloJet object as its input. The derived + tool must implement an execute(T2CaloJet*) method. + +********************************************************************/ +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" + +T2CaloJetBaseTool::T2CaloJetBaseTool(const std::string& type, + const std::string& name, + const IInterface* parent): + IAlgToolCalo(type, name, parent) +{ + declareInterface<T2CaloJetBaseTool>( this ); +} + + +T2CaloJetBaseTool::~T2CaloJetBaseTool() +{ +} + +StatusCode T2CaloJetBaseTool::initialize() +{ + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetBaseTool::execute() +{ + return StatusCode::SUCCESS; +} + + +//StatusCode T2CaloJetBaseTool::execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax) +// StatusCode T2CaloJetBaseTool::execute(TrigT2Jet* /*jet*/,double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/) +StatusCode T2CaloJetBaseTool::execute(TrigT2Jet* /* jet */, const IRoiDescriptor& /* roi */, + const CaloDetDescrElement*& /*caloDDE*/ ) +{ + return StatusCode::SUCCESS; +} + + +StatusCode T2CaloJetBaseTool::finalize() +{ + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetCalibTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetCalibTool.cxx new file mode 100755 index 000000000000..837153a85eac --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetCalibTool.cxx @@ -0,0 +1,422 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetCalibTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Patricia Conde Muino <Patricia.Conde.Muino@cern.ch> + Nuno Anjos <Nuno.Anjos@cern.ch> +CREATED: May 2006 + +PURPOSE: Calibration tool for LVL2 jets. + +********************************************************************/ +#include "TrigT2CaloJet/T2CaloJetCalibTool.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "CaloGeoHelpers/CaloSampling.h" +#include "AthenaKernel/Timeout.h" + +#include "GaudiKernel/IToolSvc.h" + +//----------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------- +T2CaloJetCalibTool::T2CaloJetCalibTool(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), + m_log(NULL), + m_outputLevel(0), + m_t2JetCalibTool ("T2JetCalibTool",this), + m_t2JetCorrToolTile1 ("T2JetCorrToolTile1" ,this), + m_t2JetCorrToolFcal1 ("T2JetCorrToolFcal1" ,this), + m_t2JetCorrToolEm3Bar ("T2JetCorrToolEm3Bar",this), + m_t2JetCorrToolHec0 ("T2JetCorrToolHec0" ,this), + m_t2JetCorrToolEm3Fwd ("T2JetCorrToolEm3Fwd",this), + m_t2JetCorrToolPsBar ("T2JetCorrToolPsBar" ,this)//,m_layer_info(0) +{ + declareProperty("useFebJets", m_useFEBJets = false); +//declareProperty("fillLayerInfo", m_fillLayerInfo = false); + declareProperty("doJetCalib", m_doJetCalib = false); + declareProperty("doJetCorrTile1", m_doJetCorrTile1 = false); + declareProperty("doJetCorrFcal1", m_doJetCorrFcal1 = false); + declareProperty("doJetCorrEm3Bar", m_doJetCorrEm3Bar = false); + declareProperty("doJetCorrHec0", m_doJetCorrHec0 = false); + declareProperty("doJetCorrEm3Fwd", m_doJetCorrEm3Fwd = false); + declareProperty("doJetCorrPsBar", m_doJetCorrPsBar = false); + declareProperty("T2JetCalibTool", m_t2JetCalibTool, "Tool for L2 jet trigger Jet calibration"); + declareProperty("T2JetCorrToolTile1", m_t2JetCorrToolTile1 , "Tool for L2 jet trigger Tile1 corr"); + declareProperty("T2JetCorrToolFcal1", m_t2JetCorrToolFcal1 , "Tool for L2 jet trigger Fcal1 corr"); + declareProperty("T2JetCorrToolEm3Bar", m_t2JetCorrToolEm3Bar, "Tool for L2 jet trigger Em3Bar corr"); + declareProperty("T2JetCorrToolHec0", m_t2JetCorrToolHec0 , "Tool for L2 jet trigger Hec0 corr"); + declareProperty("T2JetCorrToolEm3Fwd", m_t2JetCorrToolEm3Fwd, "Tool for L2 jet trigger Em3Fwd corr"); + declareProperty("T2JetCorrToolPsBar", m_t2JetCorrToolPsBar , "Tool for L2 jet trigger PsBar corr"); +} + +//----------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------- +T2CaloJetCalibTool::~T2CaloJetCalibTool() +{ +} + +//----------------------------------------------------------------- +// Initialize: +//----------------------------------------------------------------- +StatusCode T2CaloJetCalibTool::initialize() +{ + + m_log = new MsgStream (msgSvc(), name()); + m_outputLevel = msgSvc()->outputLevel( name() ); + if(m_outputLevel <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " In initalize() " << endmsg; + + StatusCode sc; + // Retrieve the jet calibration tool: + ATH_CHECK( m_t2JetCalibTool.retrieve( DisableTool {!m_doJetCalib} )); + + // Retrieve the layer correction tools: + ATH_CHECK( m_t2JetCorrToolTile1.retrieve( DisableTool {!m_doJetCorrTile1} )); + ATH_CHECK( m_t2JetCorrToolFcal1.retrieve( DisableTool {!m_doJetCorrFcal1} )); + ATH_CHECK( m_t2JetCorrToolEm3Bar.retrieve( DisableTool {!m_doJetCorrEm3Bar} )); + ATH_CHECK( m_t2JetCorrToolHec0.retrieve( DisableTool {!m_doJetCorrHec0} )); + ATH_CHECK( m_t2JetCorrToolEm3Fwd.retrieve( DisableTool {!m_doJetCorrEm3Fwd} )); + ATH_CHECK( m_t2JetCorrToolPsBar.retrieve( DisableTool {!m_doJetCorrPsBar} )); + + // from IAlgToolCalo + m_geometryTool.disable(); + m_data.disable(); + +// if (m_fillLayerInfo) { +// m_layer_info = new TrigCaloCluster(); +// } + + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Execute +//----------------------------------------------------------------- +StatusCode T2CaloJetCalibTool::execute() +{ + return StatusCode::SUCCESS; +} + + +//----------------------------------------------------------------- +// Finalize: +//----------------------------------------------------------------- +StatusCode T2CaloJetCalibTool::finalize() +{ + delete m_log; + +// if (m_fillLayerInfo) { +// delete m_layer_info; +// } + + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Execute method of the tool. Apply energy correction to the jet. +//----------------------------------------------------------------- +StatusCode T2CaloJetCalibTool::execute(TrigT2Jet* jet, double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/) +{ + // reset error + m_error = 0x0; + + + // Calculate Hadronic and Electromagnetic transverse energies: +// double HadEn = 0, EMEn = 0; + double EMEn = jet->eem0(); + double HadEn = jet->ehad0(); + double jeta=jet->eta(); +// sc = calculateHadEMEnergy(jet, &HadEn, &EMEn); +// if(sc.isFailure()){ +// (*m_log) << MSG::WARNING << "It seems that the Had/EM energy was not properly calculated!" << endmsg; +// } +// +// if(m_outputLevel <= MSG::DEBUG){ +// (*m_log) << MSG::DEBUG << " EM, Had energy components: " << EMEn << ", " +// << HadEn << endmsg; +// } + + // Apply the calibration: + double corrEnergy=0; + if(m_doJetCalib){ + if(!m_useFEBJets){ + corrEnergy = m_t2JetCalibTool->c_energy(EMEn, HadEn, jeta); + } else { + corrEnergy = m_t2JetCalibTool->c_febenergy(EMEn, HadEn, jeta); + } + + if(corrEnergy == 0 || corrEnergy!=corrEnergy){//corrEnergy!=corrEnergy checks for nan + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG + << " JES Calibration failed. Jet energy is left uncalibrated: " + << endmsg; + } + corrEnergy = EMEn+HadEn ; + } + } else { + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG + << " Calibration not applied. Jet energy is left uncalibrated: " + << endmsg; + } + corrEnergy = EMEn+HadEn ; + } + + // Compute layer fractions: + double fTile1=0, fFcal1=0, fEm3=0, fHec0=0, fPs=0; + if( m_doJetCorrTile1 || + m_doJetCorrHec0 || + m_doJetCorrEm3Fwd || + m_doJetCorrFcal1 || + m_doJetCorrEm3Bar || + m_doJetCorrPsBar//|| m_fillLayerInfo + ) { + if (calculateLayerFracs(jet, &fTile1, &fFcal1, &fEm3, &fHec0, &fPs).isFailure()){ + (*m_log) << MSG::WARNING << "Layer Fractions not properly calculated!" << endmsg; + } + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Uncorr Jet E = " << EMEn+HadEn + << " Tile1 fraction = " << fTile1 + << " Fcal1 fraction = " << fFcal1 + << " Em3 fraction = " << fEm3 + << " Hec0 fraction = " << fHec0 + << " Ps fraction = " << fPs + << " Jet E before layer corr = " << corrEnergy << endmsg; + } + } + + // Apply layer corrections: + double response=1; + if(m_doJetCorrTile1) { + response = m_t2JetCorrToolTile1->c_energy(fTile1, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Tile1 response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + if(m_doJetCorrHec0) { + response = m_t2JetCorrToolHec0->c_energy(fHec0, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Hec0 response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + if(m_doJetCorrEm3Fwd) { + response = m_t2JetCorrToolEm3Fwd->c_energy(fEm3, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Em3Fwd response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + if(m_doJetCorrFcal1) { + response = m_t2JetCorrToolFcal1->c_energy(fFcal1, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Fcal1 response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + if(m_doJetCorrEm3Bar) { + response = m_t2JetCorrToolEm3Bar->c_energy(fEm3, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Em3Bar response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + if(m_doJetCorrPsBar) { + response = m_t2JetCorrToolPsBar->c_energy(fPs, corrEnergy, jeta); + if(response != 0 && response != 1 && response==response) corrEnergy = corrEnergy/response; + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "PsBar response = " << response + << " corrected E = " << corrEnergy << endmsg; + } + } + + + // Set jet energy: + jet->setE(corrEnergy); + + if(m_outputLevel <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Uncorrected E = " << EMEn+HadEn << ", Fully corrected E = " + << corrEnergy << ", eta = " << jet->eta() << endmsg; + } + + if ( Athena::Timeout::instance().reached() ) { + (*m_log) << MSG::ERROR << "Timeout reached in T2CaloJetCalibTool" << endmsg; + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + +//--------------------------------------------------------------- +// Calculate layer fractions of the jet energy: +//--------------------------------------------------------------- +StatusCode T2CaloJetCalibTool::calculateLayerFracs(TrigT2Jet* jet, double *fTile1, double *fFcal1, double *fEm3, double *fHec0, double *fPs) +{ + + // Loop in the jet cells: + + std::vector<Trig3Momentum>::iterator gridIt = jet->grid()->begin(); + std::vector<Trig3Momentum>::iterator gridEnd = jet->grid()->end(); + + double eTile1=0, eFcal1=0, eEm3=0, eHec0=0, ePs= 0; + int nCells = 0; + + for (; gridIt != gridEnd; ++gridIt){ + + // consider only cells that are used in the cone: + if(! (*gridIt).inCone()) continue; + nCells++; + + const CaloSampling::CaloSample s = (*gridIt).caloSample(); + double cellE = (*gridIt).e(); + +// if (m_fillLayerInfo) { +// m_layer_info->setRawEnergy(s,cellE); +// } + + switch ( s ) { + case CaloSampling::PreSamplerB: + case CaloSampling::PreSamplerE: + ePs += cellE; + break; + case CaloSampling::EMB3: + case CaloSampling::EME3: + eEm3 += cellE; + break; + case CaloSampling::FCAL0: + eFcal1 += cellE; + break; + case CaloSampling::HEC0: + eHec0 += cellE; + break; + case CaloSampling::TileBar0: + case CaloSampling::TileExt0: + eTile1 += cellE; + break; + default: + /* do nothing */ + break; + + }// end switch - Jet Sampling Layers + + + } // End of loop in cells; + +// if (m_fillLayerInfo) { +// m_layer_info->setRawEnergy(jet->eem0()+jet->ehad0()); +// m_layer_info->setRawEt((jet->eem0()+jet->ehad0())/cosh(jet->eta())); +// m_layer_info->setRawEta(jet->eta()); +// m_layer_info->setRawPhi(jet->phi()); +// m_layer_info->setRoIword(jet->RoIword()); +// m_layer_info->setNCells(nCells); +// } + + if ((jet->eem0()+jet->ehad0())!=0){ + (*fTile1) = eTile1/(jet->eem0()+jet->ehad0()); + (*fFcal1) = eFcal1/(jet->eem0()+jet->ehad0()); + (*fEm3) = eEm3 /(jet->eem0()+jet->ehad0()); + (*fHec0) = eHec0 /(jet->eem0()+jet->ehad0()); + (*fPs) = ePs /(jet->eem0()+jet->ehad0()); + } else { + (*fTile1) = 0; + (*fFcal1) = 0; + (*fEm3) = 0; + (*fHec0) = 0; + (*fPs) = 0; + } + + return StatusCode::SUCCESS; +} + +//--------------------------------------------------------------- +// Calculate hadronic/Electromagnetic component of the jet energy: +//--------------------------------------------------------------- +/*StatusCode T2CaloJetCalibTool::calculateHadEMEnergy(TrigT2Jet* jet, double *HadEnergy, double * EMEnergy) +{ + + // Loop in the jet cells: + + std::vector<Trig3Momentum>::iterator gridIt = jet->grid()->begin(); + std::vector<Trig3Momentum>::iterator gridEnd = jet->grid()->end(); + + (*HadEnergy) = 0; + (*EMEnergy) = 0; + for (; gridIt != gridEnd; ++gridIt){ + + // consider only cells that are used in the cone: + if(! (*gridIt).inCone()) continue; + + const CaloSampling::CaloSample s = (*gridIt).caloSample(); + double cellE = (*gridIt).e(); + + switch ( s ) { + case CaloSampling::PreSamplerB: + case CaloSampling::PreSamplerE: + case CaloSampling::EMB1: + case CaloSampling::EMB2: + case CaloSampling::EMB3: + case CaloSampling::EME1: + case CaloSampling::EME2: + case CaloSampling::EME3: + (*EMEnergy) += cellE; + break; + case CaloSampling::HEC0: + case CaloSampling::HEC1: + case CaloSampling::HEC2: + case CaloSampling::HEC3: + case CaloSampling::TileBar0: + case CaloSampling::TileBar1: + case CaloSampling::TileBar2: + case CaloSampling::TileExt0: + case CaloSampling::TileExt1: + case CaloSampling::TileExt2: + case CaloSampling::TileGap1: + case CaloSampling::TileGap2: + case CaloSampling::TileGap3: + case CaloSampling::FCAL0: + case CaloSampling::FCAL1: + case CaloSampling::FCAL2: + (*HadEnergy) += cellE; + break; + case CaloSampling::Unknown: + (*m_log) << MSG::WARNING + << "Unknown CaloCell type " + << s + << endmsg; + break; + + }// end switch - Jet Sampling Layers + + + } // End of loop in cells; + + + // Cross check that everything went fine: +// +// double eSum = (*HadEnergy)+(*EMEnergy); +// if( eSum != jet->e()){ +// +// (*m_log) << MSG::WARNING << " HadEnergy+EMEnergy != jet->e() !!! HadEnergy, EMEnergy, eSum, jetEnergy =" +// << (*HadEnergy) << ", " << (*EMEnergy) << ", " << eSum << ", " << jet->e() << endmsg; +// std::cout << eSum << ", " << jet->e() << std::endl; +// return StatusCode::FAILURE; +// } +// + + return StatusCode::SUCCESS; +} +*/ diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetConeTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetConeTool.cxx new file mode 100755 index 000000000000..3970145a250c --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetConeTool.cxx @@ -0,0 +1,352 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetConeTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Cone Tool for all T2CaloJet. Does simple cone alg after data + preparation. + +********************************************************************/ +#include <math.h> +#include "TrigT2CaloJet/T2CaloJetConeTool.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" +#include "AthenaKernel/Timeout.h" + +#include <sstream> + + +T2CaloJetConeTool::T2CaloJetConeTool(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), + m_inCone(0), + m_outCone(0), + m_totalCell(0), + m_pTimerService(NULL), + m_fcal_timer(NULL), + m_other_timer(NULL) +{ + declareProperty("numberOfIterations", m_nIterations = 1); + declareProperty("coneRadius", m_coneRadius = 0.7); + declareProperty("coneFJRadius", m_fj_cone_sizes); + // cleaning: + declareProperty("cellQualityThresholdLAr", m_cellQualityThresholdLAr = 4000); // for jet cleaning + declareProperty("leadingCellFraction", m_leadingCellFraction = 0.9); // for jet cleaning, e.g.: n90 -> leadingCellFraction = 0.9 +} + +T2CaloJetConeTool::~T2CaloJetConeTool() +{ +} + +StatusCode T2CaloJetConeTool::initialize() +{ + MsgStream log(msgSvc(), name()); + // Initialize timing service + if( service( "TrigTimerSvc", m_pTimerService).isFailure() ) { + log << MSG::WARNING << name() << ": Unable to locate TrigTimer Service" + << endmsg; + } + + if (m_pTimerService){ + //Add timers + m_fcal_timer = m_pTimerService->addItem("LVL2_FCal_Cone_Time"); + m_other_timer = m_pTimerService->addItem("LVL2_Other_Cone_Time"); + } + m_inCone=0; + m_outCone=0; + m_totalCell=0; + + // cleaning: + m_cellenergies.reserve(8192); + + // from IAlgToolCalo + m_geometryTool.disable(); + m_data.disable(); + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetConeTool::execute() +{ + return StatusCode::SUCCESS; +} + + +//StatusCode T2CaloJetConeTool::execute(TrigT2Jet* jet,double etamin, double etamax, double phimin, double phimax) +//StatusCode T2CaloJetConeTool::execute(TrigT2Jet* jet,double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/) +StatusCode T2CaloJetConeTool::execute(TrigT2Jet* jet, const IRoiDescriptor& /*roi*/ ) +{ + + MsgStream mLog(msgSvc(), name()); + int outputLevel = msgSvc()->outputLevel( name() ); + if(outputLevel <= MSG::DEBUG) + mLog << MSG::DEBUG << " executing T2CaloJetConeTool " << endmsg; + + + // reset error + m_error = 0x0; + + // do cone iterations on jet. + bool isFCal = fabs(jet->eta())>3.2 ? true : false; + if(isFCal){m_fcal_timer->start(); } + else{ m_other_timer->start(); } + for(int i=0; i<m_nIterations; i++){ + this->coneIteration(jet,i); + if ( Athena::Timeout::instance().reached() ) { + mLog << MSG::ERROR << "Timeout reached in coneIteration" << endmsg; + return StatusCode::FAILURE; + } + } + if(isFCal){m_fcal_timer->stop(); } + else{ m_other_timer->stop(); } + + if(m_fj_cone_sizes.size()==0||m_fj_cone_sizes.size()>3){ + mLog << MSG::WARNING << "FJ cone sizes are incorrectly setup. Using 1/7/4 technique." << endmsg; + } + return StatusCode::SUCCESS; +} + +void T2CaloJetConeTool::coneIteration(TrigT2Jet* jet, int coneIter) +{ + MsgStream mLog(msgSvc(), name()); + + std::vector<Trig3Momentum>* grid = jet->grid(); + + std::vector<Trig3Momentum>::iterator gridItr = grid->begin(); + std::vector<Trig3Momentum>::iterator gridEnd = grid->end(); + + double coneR = m_coneRadius; + + ///////////////////////// + // FCal cone algorithm // + ///////////////////////// + if(fabs(jet->eta())>3.2){ + if(m_fj_cone_sizes.size()==0||m_fj_cone_sizes.size()>3){ + mLog << MSG::DEBUG << "FJ cone sizes are incorrectly setup. Using 1/7/4 technique." << endmsg; + // Cone 1.0/0.7/0.4 Technique + // -Find inital seed looking at the full eta window + // -Subsequent iterations reduce cone size to 0.7 then 0.4 (or default) + if(fabs(jet->eta())>3.2&&coneIter==0){ + coneR=1; + } else if(fabs(jet->eta())>3.2&&coneIter==1){ + coneR=0.7; + } + } else { + coneR = m_fj_cone_sizes.at(coneIter); + } + mLog << MSG::DEBUG << "Iteration " << coneIter + << ", using cone size: " << coneR << endmsg; + } + double dEta = 0, dPhi=0; + + //Check if in FCal, if so find most energetic cell + //double max_e(-999); + double max_eta = jet->eta(); + double max_phi = jet->phi(); + + //Set jet eta & phi + jet->setEta(max_eta); + jet->setPhi(max_phi); + + // activate cells in cone + for(; gridItr!=gridEnd; gridItr++){ + dEta = fabs(jet->eta() - (*gridItr).eta()); + dPhi = fabs(jet->phi() - (*gridItr).phi()); + if (dPhi > M_PI) dPhi = 2*M_PI - dPhi; + + if( dEta*dEta + dPhi*dPhi < coneR*coneR ) { + m_inCone++; + (*gridItr).setInCone(true); + } else { + (*gridItr).setInCone(false); + m_outCone++; + } + m_totalCell++; + } + + // calculate e, eta, phi. + gridItr = grid->begin(); + double eTot=0, eta=0, phi=0, tmpE=0, eThresh=0, tmpPhi=0; + double ehad=0, eem=0; + + double tmpdPhi=0, dphi=0; + + // cleaning: + // initialize cleaning variables + int nLeadingCells = 0; // number of leading cells + float hecf = 0.; // fraction of jet energy in hec + float jetQuality = 0.; // quality of the jet + float emf = 0.; // fraction of jet energy in emc + float jetTimeCells = 0.; // jet time calculated from cells + + // helper functions / variables for cleaning: + m_cellenergies.clear(); + float HECEnergy = 0.; + float EinBadCells = 0.; + bool isTile = false; + bool isLAr = false; + bool qualityTimeIsDefined = false; + float totaltime = 0.; + float norm = 0.; + float cellNorm = 0.; + float totCellE = 0.; // sum of energy in LAr cells with quality defined + + for(; gridItr!=gridEnd; gridItr++){ + if( !(gridItr->inCone()) ) continue; + + // reset flags: + isTile = false; + isLAr = false; + + tmpE = (*gridItr).e(); + eTot += tmpE; // maybe this should be Et weighted + + // Summ contribution to hadronic/EM energy: + const CaloSampling::CaloSample s = (*gridItr).caloSample(); + if( s == CaloSampling::PreSamplerB || s == CaloSampling::PreSamplerE || + s == CaloSampling::EMB1 || s == CaloSampling::EME1 || + s == CaloSampling::EMB2 || s == CaloSampling::EME2 || + s == CaloSampling::EMB3 || s == CaloSampling::EME3 || + s == CaloSampling::FCAL0){ + eem += tmpE; + isLAr = true; // for cleaning + } + if( s == CaloSampling::HEC0 || s == CaloSampling::HEC1|| + s == CaloSampling::HEC2 || s == CaloSampling::HEC3 || + s == CaloSampling::TileBar0 || s == CaloSampling::TileExt0 || + s == CaloSampling::TileBar1 || s == CaloSampling::TileExt1 || + s == CaloSampling::TileBar2 || s == CaloSampling::TileExt2 || + s == CaloSampling::TileGap1 || s == CaloSampling::TileGap2 || + s == CaloSampling::TileGap3 || s == CaloSampling::FCAL1 || + s == CaloSampling::FCAL2) + ehad += tmpE; + + if (tmpE>0){ // threshold from job options? + eThresh += tmpE; + eta += tmpE*(*gridItr).eta(); + tmpPhi = (*gridItr).phi(); + + tmpdPhi = tmpPhi - jet->phi(); // w.r.t Jet + if (tmpdPhi > M_PI) tmpdPhi -= 2*M_PI; + if (tmpdPhi < -1*M_PI) tmpdPhi += 2*M_PI; + + dphi += tmpE*tmpdPhi; // this needs the wrap-around check + + } + + // cleaning: + m_cellenergies.push_back( tmpE ); + if( s == CaloSampling::HEC0 || s == CaloSampling::HEC1 || + s == CaloSampling::HEC2 || s == CaloSampling::HEC3 ) { + HECEnergy += tmpE; + isLAr = true; + } + if( s == CaloSampling::FCAL1 || s == CaloSampling::FCAL2 ){ + isLAr = true; + } + if( s == CaloSampling::TileBar0 || s == CaloSampling::TileBar1 || + s == CaloSampling::TileBar2 || s == CaloSampling::TileGap1 || + s == CaloSampling::TileGap2 || s == CaloSampling::TileGap3 || + s == CaloSampling::TileExt0 || s == CaloSampling::TileExt1 || + s == CaloSampling::TileExt2 ) { + isTile = true; + } + + uint16_t cellprovenance = (*gridItr).provenance(); + // grab cell quality and cell time. + uint16_t cellquality = (*gridItr).quality(); + float celltime = (*gridItr).time(); + qualityTimeIsDefined = false; + + // check for tile + if(isTile){ + // cells with bad quality are masked -> don't take tile into account + // for jet quality calculation. + // provenance not set for tile cells. but time is defined. + // timing: + cellNorm = tmpE * tmpE; + totaltime += cellNorm * celltime; + norm += cellNorm; + } + // check for LAr. only take cells into accout which have time and quality defined + if( (isLAr) && (cellprovenance & 0x2000) ){ + qualityTimeIsDefined = true; + totCellE += tmpE; + // timing: + cellNorm = tmpE * tmpE; + totaltime += cellNorm * celltime; + norm += cellNorm; + } + + if( (isLAr) && (qualityTimeIsDefined) && (cellquality > m_cellQualityThresholdLAr) ){ + EinBadCells += tmpE; + } + + } // end loop over cells + + if(eThresh != 0) { + eta /= eThresh; + phi = dphi/eThresh + jet->phi(); // recover absolute value + + // phi must be between -pi and pi : + if(phi > M_PI) phi -= 2.0* M_PI; + if(phi < -1.0*M_PI) phi += 2.0*M_PI; + } + + // calculate the jet cleaning variables: + // ------------------------------------- + + // sort cell-energy vector. (most energetic cell at end of vector) + std::sort(m_cellenergies.begin(), m_cellenergies.end()); + float sumE = 0.; + for(int k = m_cellenergies.size()-1; k > -1; k--){ + sumE += m_cellenergies[k]; + nLeadingCells++; + if(sumE > m_leadingCellFraction*eTot){ + break; + } + } + + float DELTA = 0.001; // distance to compare floats + if(fabs(eTot)>DELTA){ + hecf = HECEnergy/eTot; + emf = eem/eTot; + } + if(fabs(totCellE)>DELTA){ + jetQuality = EinBadCells/totCellE; + } + if(fabs(norm)>DELTA){ + jetTimeCells = totaltime/norm; + } + + + jet->setE(eTot); + jet->setEem0(eem); + jet->setEhad0(ehad); + jet->setEta(eta); + jet->setPhi(phi); + + // cleaning: + jet -> setNLeadingCells(nLeadingCells); + jet -> setHecf(hecf); + jet -> setJetQuality(jetQuality); + jet -> setEmf(emf); + jet -> setJetTimeCells(jetTimeCells); +} + +StatusCode T2CaloJetConeTool::finalize() +{ + m_cellenergies.clear(); + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromCells.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromCells.cxx new file mode 100644 index 000000000000..7a795861b106 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromCells.cxx @@ -0,0 +1,443 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetGridFromCells.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Data preparation from Cells + +********************************************************************/ +#include "TrigT2CaloJet/T2CaloJetGridFromCells.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigT2CaloJet/T2AllRoiUnpacking.h" + +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IToolSvc.h" + +// should use this, but needs fixes +//#include "TrigT2CaloCommon/ITrigDataAccess.h" +// instead, use this one +#include "TrigT2CaloCommon/TrigDataAccess.h" +#include "AthenaKernel/Timeout.h" + +#include <algorithm> +#include <sstream> + +T2CaloJetGridFromCells::T2CaloJetGridFromCells(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), + m_noiseCutValue(2.) , + m_cablingSvc("LArCablingLegacyService"), + m_noiseTool("CaloNoiseTool/CaloNoiseToolDefault"), + m_forbiddenRegions(0), + m_timerSvc(0) +{ + declareProperty("doTiming", m_doTiming= false ); + declareProperty("cablingSvc", m_cablingSvc, "cabling svc"); + declareProperty("noiseTool", m_noiseTool, "handle for noise tool"); + declareProperty("applyNoiseCut", m_applyNoiseCut = false); + declareProperty("noiseCutValue", m_noiseCutValue ); + declareProperty("doHECcellQualityCleaning", m_doHECcellQualityCleaning = false); // switch for cell based jet cleaning + declareProperty("cellQualityThresholdHEC", m_cellQualityThresholdHEC = 65535); // for cell based jet cleaning + +} + +T2CaloJetGridFromCells::~T2CaloJetGridFromCells() +{ +} + + +StatusCode T2CaloJetGridFromCells::initialize() +{ + + ATH_MSG_VERBOSE(" In initalize() "); + + ATH_CHECK(m_data.retrieve()); + +/// noise suppression + if(m_applyNoiseCut!=0){ + ATH_CHECK( m_noiseTool.retrieve() ); + + ATH_CHECK( m_cablingSvc.retrieve() ); + } else { + m_noiseTool.disable(); + m_cablingSvc.disable(); + } + + // Retrieve timing service + + if (m_doTiming) { + + StatusCode sc = service("TrigTimerSvc", m_timerSvc); + if (sc.isFailure()) { + ATH_MSG_ERROR( "unable to locate timing service TrigTimerSvc." + << " Setting doTiming = false!!! " ); + m_timerSvc = 0; + m_doTiming=false; + //return sc; + } + else{ + + std::string prefix = name() + ":"; + + // Define now the timers: + std::string label = prefix+"LArUnpck"; + TrigTimer *timer = m_timerSvc->addItem(label); + m_timers["LArUnpck"] = timer; + + label = prefix+"TileUnpck"; + timer = m_timerSvc->addItem( label); + m_timers["TileUnpck"] = timer; + + label = prefix+"HECUnpck"; + timer = m_timerSvc->addItem(label); + m_timers["HECUnpck"] = timer; + + } + } + + // from IAlgToolCalo + m_geometryTool.disable(); + + m_gridElement = new Trig3Momentum(); + + return StatusCode::SUCCESS; +} + +TrigTimer* T2CaloJetGridFromCells::getTimer(const std::string& timerName){ + + if (!m_doTiming ) return 0; + + std::map<std::string, TrigTimer*>::const_iterator t = m_timers.find(timerName); + if (t == m_timers.end()) { + ATH_MSG_DEBUG( " Timer " << timerName << " not found." ); + return 0; + } + + + return (*t).second; + +} + + +StatusCode T2CaloJetGridFromCells::execute() +{ + return StatusCode::SUCCESS; +} + + +//StatusCode T2CaloJetGridFromCells::execute(TrigT2Jet +//* jet,double etamin, double etamax, double phimin, double phimax) +StatusCode T2CaloJetGridFromCells::execute(TrigT2Jet +* jet,const IRoiDescriptor& roi ) +{ + + // reset error + m_error = 0x0; + + // this method should use region selector to get cells and fill grid + // of Trig3Momentum. + + // reset error + m_error = 0x0; + std::vector<Trig3Momentum>* grid = new std::vector<Trig3Momentum>(); + grid->reserve(8000); + + + //m_gridElement = new Trig3Momentum(); + // add all cells to grid + + StatusCode sc = addAllCells(roi.etaMinus(),roi.etaPlus(), roi.phiMinus(), roi.phiPlus(), grid); + if(sc.isFailure()){ + ATH_MSG_DEBUG( " Failure of addAllCells. Empty grid! " ); + } + + //then set the grid in the jet. do not delete anything. Cleanup + //happens at the end of jet finding. + jet->setGrid(grid); + + //delete m_gridElement; + //m_gridElement = 0; + + return StatusCode::SUCCESS; +} + + +StatusCode T2CaloJetGridFromCells::addAllCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid) +{ + + //This could check job options for a list of samplings to consider. + //We may not want to use presampler or strips. + + if(m_doTiming) getTimer("LArUnpck")->start(); + + //Now EM + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTEM, 0, true).isFailure() ){ + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTEM, 1, true).isFailure() ) { + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTEM, 2, true).isFailure() ) { + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTEM, 3, true).isFailure() ) { + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(m_doTiming){ + getTimer("LArUnpck")->stop(); + getTimer("HECUnpck")->start(); + } + + //Now HEC + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTHEC, 0, true).isFailure() ) { + if(m_doTiming) getTimer("HECUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTHEC, 1, true).isFailure() ) { + if(m_doTiming) getTimer("HECUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTHEC, 2, true).isFailure() ) { + if(m_doTiming) getTimer("HECUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArCells(etamin, etamax, phimin, phimax, grid, TTHEC, 3, true).isFailure() ) { + if(m_doTiming) getTimer("HECUnpck")->stop(); + return StatusCode::FAILURE; + } + if(m_doTiming){ + getTimer("HECUnpck")->stop(); + getTimer("TileUnpck")->start(); + } + + //Now Tile + // only prepare for first sampling, because containers created then. + if(addTileCells(etamin, etamax, phimin, phimax, grid, TILE, 0, true).isFailure() ){ + if(m_doTiming) getTimer("TileUnpck")->stop(); + return StatusCode::FAILURE; + } + + //Now FCAL + if(addLArCells(etamin, etamax, phimin, phimax, grid, FCALEM, 0, true).isFailure() ) + return StatusCode::FAILURE; + + if(addLArCells(etamin, etamax, phimin, phimax, grid, FCALHAD, 0, true).isFailure() ) + return StatusCode::FAILURE; + + if(addLArCells(etamin, etamax, phimin, phimax, grid, FCALHAD, 1, true).isFailure() ) + return StatusCode::FAILURE; + +/* if(addTileCells(etamin, etamax, phimin, phimax, grid, TILE, 1, false).isFailure() ) { + if(m_doTiming) getTimer("TileUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addTileCells(etamin, etamax, phimin, phimax, grid, TILE, 2, false).isFailure() ) { + if(m_doTiming) getTimer("TileUnpck")->stop(); + return StatusCode::FAILURE; + }*/ + + if(m_doTiming) getTimer("TileUnpck")->stop(); + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromCells::addLArCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare) +{ + + // Get detector offline ID's for Collections + m_data->RegionSelector(sampling,etamin,etamax,phimin,phimax, detectorID); + + // Prepare data, load collections + if ( m_data->LoadCollections(m_iBegin,m_iEnd, sampling, prepare).isFailure() ){ + return StatusCode::FAILURE; + } + + m_error|=m_data->report_error(); + + bool vetoRegions(m_forbiddenRegions.size() > 0); + // Main Loop over cells + const LArCell* larcell; + for(m_it = m_iBegin;m_it != m_iEnd; ++m_it) { + + // possibly do some noise thresholding + larcell = *m_it; + + // possibly do some calibration + // may want sampling. example: + CaloSampling::CaloSample samp; + //samp = CaloSampling::getSampling(*larcell); + samp = larcell->caloDDE()->getSampling(); + + // cell based cleaning: + // -------------------- + // check if cell cleaning is requested and if the cell is in hec: + bool isHECandDoCleaning = false; + if( m_doHECcellQualityCleaning && ( samp == CaloSampling::HEC0 || samp == CaloSampling::HEC1 || + samp == CaloSampling::HEC2 || samp == CaloSampling::HEC3 ) ) { + isHECandDoCleaning = true; + } + // now test for cell quality + if( isHECandDoCleaning && larcell -> quality() >= m_cellQualityThresholdHEC ) { + continue; + } + // end (cell based) cleaning + + // possibly do some tower building + + double cellE = larcell->e(); + if(m_applyNoiseCut){ + double larnoise = m_noiseTool->getNoise(larcell, + ICalorimeterNoiseTool::TOTALNOISE); + //std::cout << "noise rms in LAr = " << larnoise << std::endl; + if(m_applyNoiseCut && fabs(cellE) < (m_noiseCutValue*larnoise)) continue; + } + + double eta(larcell->eta()); + double phi(larcell->phi()); + if(vetoRegions && isInVetoRegion(eta, phi)) continue; + // for now fill grid elements like this +// gridElement = new Trig3Momentum(); + m_gridElement->setE(cellE); + m_gridElement->setEta(eta); + m_gridElement->setPhi(phi); + m_gridElement->setCaloSample(samp); + // jet cleaning: + m_gridElement->setProvenance( larcell -> provenance() ); + m_gridElement->setQuality( larcell -> quality() ); + m_gridElement->setTime( larcell -> time() ); + + //push them back into the grid + grid->push_back(*m_gridElement); + + } + + if ( Athena::Timeout::instance().reached() ) { + ATH_MSG_ERROR( "Timeout reached in addLArCells " ); + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + + +StatusCode T2CaloJetGridFromCells::addTileCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool /*prepare*/) +{ + + // Get detector offline ID's for Collections + m_data->RegionSelector(sampling,etamin,etamax,phimin,phimax, detectorID); + + // Prepare data, load collections + + for( unsigned int iR=0; iR!=m_data->TileContSize();++iR ){ + if ( m_data->LoadCollections(m_itBegin,m_itEnd, iR, !iR).isFailure() ){ + return StatusCode::FAILURE; + } + + m_error|=m_data->report_error(); + + bool vetoRegions(m_forbiddenRegions.size() > 0); + +// std::cout << "No of cells in Tile = " << m_data->TileContSize() << std::endl; + // Main Loop over cells + const TileCell* tilecell; + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { + tilecell = *m_itt; + + // possibly do some noise thresholding + + // possibly do some calibration + // may want sampling. example: + CaloSampling::CaloSample samp; + //samp = CaloSampling::getSampling(*tilecell); + samp = tilecell->caloDDE()->getSampling(); + + + double cellE = tilecell->e(); +// do noise thresholding + + if(m_applyNoiseCut) { + double tilenoise = m_noiseTool->getNoise(tilecell, + ICalorimeterNoiseTool::TOTALNOISE); + if(m_applyNoiseCut && fabs(cellE) < (m_noiseCutValue*tilenoise)) continue; + } + + // possibly do some tower building + + double eta(tilecell->eta()); + double phi(tilecell->phi()); + if(vetoRegions && isInVetoRegion(eta, phi)) continue; + + // for now fill grid elements like this +// gridElement = new Trig3Momentum(); + m_gridElement->setE(cellE); + m_gridElement->setEta(eta); + m_gridElement->setPhi(phi); + m_gridElement->setCaloSample(samp); + // jet cleaning: + m_gridElement->setProvenance( tilecell -> provenance() ); + m_gridElement->setQuality( tilecell -> quality() ); + m_gridElement->setTime( tilecell -> time() ); + + //push them back into the grid + grid->push_back(*m_gridElement); + + + } + if ( Athena::Timeout::instance().reached() ) { + ATH_MSG_ERROR( "Timeout reached in addTileCells " ); + return StatusCode::FAILURE; + } + } + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromCells::finalize() +{ + delete m_gridElement; + m_gridElement = 0; + return StatusCode::SUCCESS; +} + +// Just a functor so that I can use EtaPhiRectangle::contains within a std algorithm. +struct EtaPhiRectInsideChecker : public std::unary_function<EtaPhiRectangle, bool> { + double eta_, phi_; + EtaPhiRectInsideChecker(const double &eta, const double &phi): eta_(eta), phi_(phi) {} ; + bool operator() (const EtaPhiRectangle &r) const { + return r.contains(eta_, phi_); + } +}; + +bool T2CaloJetGridFromCells::isInVetoRegion(const double &eta, const double &phi){ + ATH_MSG_DEBUG("T2CaloJetGridFromCells::isInVetoRegion --DG-- checking" + <<" ("<<eta<<", "<<phi<<")" + <<" against "<<m_forbiddenRegions.size()<<" forbidden regions" ); + return + m_forbiddenRegions.end() != + std::find_if(m_forbiddenRegions.begin(), + m_forbiddenRegions.end(), + EtaPhiRectInsideChecker(eta,phi)); +} + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromFEBHeader.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromFEBHeader.cxx new file mode 100755 index 000000000000..1039d73c23f2 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromFEBHeader.cxx @@ -0,0 +1,381 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetGridFromFEBHeader.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> + Ignacio Aracena <ignacio.aracena@cern.ch> + +CREATED: November, 2005 + +PURPOSE: Data preparation from FEB Header (Ex,Ey,Ez) + +********************************************************************/ +#include "TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" +#include "TrigT2CaloCommon/TrigDataAccess.h" +#include "AthenaKernel/Timeout.h" + +T2CaloJetGridFromFEBHeader::T2CaloJetGridFromFEBHeader(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), + m_gridElement(NULL), + m_usedfeb(NULL), + m_timerSvc(0) +{ + declareProperty("doTiming", m_doTiming= false ); +} + +T2CaloJetGridFromFEBHeader::~T2CaloJetGridFromFEBHeader() +{ +} + +StatusCode T2CaloJetGridFromFEBHeader::initialize() +{ + + ATH_MSG_VERBOSE(" In initalize() "); + + ATH_CHECK( m_data.retrieve() ); + + // Retrieve timing service + + if (m_doTiming) { + + StatusCode sc = service("TrigTimerSvc", m_timerSvc); + if (sc.isFailure()) { + ATH_MSG_ERROR( "unable to locate timing service TrigTimerSvc." + << " Setting doTiming = false!!! " ); + m_timerSvc = 0; + m_doTiming=false; + //return sc; + } + else{ + + std::string prefix = name() + ":"; + + // Define now the timers: + std::string label = prefix+"LArUnpck"; + TrigTimer *timer = m_timerSvc->addItem(label); + m_timers["LArUnpck"] = timer; + + label = prefix+"TileUnpck"; + timer = m_timerSvc->addItem( label); + m_timers["TileUnpck"] = timer; + + label = prefix+"HECUnpck"; + timer = m_timerSvc->addItem(label); + m_timers["HECUnpck"] = timer; + + } + } + + // from IAlgToolCalo + m_geometryTool.disable(); + + return StatusCode::SUCCESS; +} + +TrigTimer* T2CaloJetGridFromFEBHeader::getTimer(const std::string& timerName){ + + if (!m_doTiming ) return 0; + + std::map<std::string, TrigTimer*>::const_iterator t = m_timers.find(timerName); + if (t == m_timers.end()) { + ATH_MSG_DEBUG(" Timer " << timerName << " not found."); + return 0; + } + + + return (*t).second; + +} + +StatusCode T2CaloJetGridFromFEBHeader::execute() +{ + return StatusCode::SUCCESS; +} + + +StatusCode T2CaloJetGridFromFEBHeader::execute(TrigT2Jet +* jet,double etamin, double etamax, double phimin, double phimax) +{ + + // Time total AlgTool time +// if (m_timersvc) m_timer[0]->start(); + + // this method should use region selector to get RODs, retrieve FEB + // Header, find eta for each FEB, and fill grid of Trig3Momentum. + + ATH_MSG_DEBUG(" executing T2CaloJetGridFromFEBHeader "); + + + std::vector<Trig3Momentum>* grid = new std::vector<Trig3Momentum>(); + + // now get ROD, FEB + + // turn ex,ey to e,eta,phi + + // possibly do some calibration + + // possibly do some tower building + + // now fill grid elements like this + m_gridElement = new Trig3Momentum(); + + m_usedfeb = new std::vector<int>; +/* if (m_timersvc) m_timer[1]->start(); + if (m_timersvc) m_timer[1]->pause(); + if (m_timersvc) m_timer[2]->start(); + if (m_timersvc) m_timer[2]->pause(); + if (m_timersvc) m_timer[3]->start(); + if (m_timersvc) m_timer[3]->pause(); + if (m_timersvc) m_timer[4]->start(); + if (m_timersvc) m_timer[4]->pause(); + + if (m_timersvc) m_timer[5]->start();*/ + + StatusCode sc = addFebEnergies(etamin, etamax, phimin, phimax, grid); + if(sc.isFailure()){ + ATH_MSG_DEBUG(" Failure of addFebEnergies. Empty grid! "); + } + +// gridElement->setE(10000.); +// gridElement->setEta(1.); +// gridElement->setPhi(0.); + + //push them back into the grid +// grid->push_back(*gridElement); + + + //then set the grid in the jet. do not delete anything. Cleanup + //happens at the end of jet finding. + jet->setGrid(grid); + + delete m_gridElement; + m_gridElement = 0; + delete m_usedfeb; + m_usedfeb = 0; + +/* if (m_timersvc) m_timer[5]->stop(); + if (m_timersvc) m_timer[0]->stop(); + if (m_timersvc) m_timer[1]->stop(); + if (m_timersvc) m_timer[2]->stop(); + if (m_timersvc) m_timer[3]->stop(); + if (m_timersvc) m_timer[4]->stop(); +*/ + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromFEBHeader::addFebEnergies(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid) +{ + + + if(m_doTiming) getTimer("LArUnpck")->start(); + if(addLArFebEnergy(etamin,etamax,phimin,phimax,grid,TTEM, 0, true).isFailure() ){ + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArFebEnergy(etamin,etamax,phimin,phimax,grid,TTEM, 1, true).isFailure() ){ + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArFebEnergy(etamin,etamax,phimin,phimax,grid,TTEM, 2, true).isFailure() ){ + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + if(addLArFebEnergy(etamin,etamax,phimin,phimax,grid,TTEM, 3, true).isFailure() ){ + if(m_doTiming) getTimer("LArUnpck")->stop(); + return StatusCode::FAILURE; + } + + if(m_doTiming){ + getTimer("LArUnpck")->stop(); + getTimer("HECUnpck")->start(); + } + + //Now HEC + // Do not need to loop over all the samplings when reading HEC FEBs + if(addLArFebEnergy(etamin, etamax, phimin, phimax, grid, TTHEC, 0, true).isFailure() ){ + if(m_doTiming) getTimer("HECUnpck")->stop(); + return StatusCode::FAILURE; + } +// if(addLArFebEnergy(etamin, etamax, phimin, phimax, grid, TTHEC, 1, true).isFailure() ) +// return StatusCode::FAILURE; +// if(addLArFebEnergy(etamin, etamax, phimin, phimax, grid, TTHEC, 2, true).isFailure() ) +// return StatusCode::FAILURE; +//Now FCAL + if(addLArFebEnergy(etamin, etamax, phimin, phimax, grid, FCALEM, 0, true).isFailure() ) + return StatusCode::FAILURE; + //std::cout << "NOW TRY FCALHAD 0" << std::endl; + if(addLArFebEnergy(etamin, etamax, phimin, phimax, grid, FCALHAD, 0, true).isFailure() ) + return StatusCode::FAILURE; + //std::cout << "NOW TRY FCALHAD 1" << std::endl; + if(addLArFebEnergy (etamin, etamax, phimin, phimax, grid, FCALHAD, 1, true).isFailure() ) + return StatusCode::FAILURE; + if(m_doTiming){ + getTimer("HECUnpck")->stop(); + getTimer("TileUnpck")->start(); + } + + + + if(addTileCells(etamin, etamax, phimin, phimax, grid, TILE, 0, true).isFailure() ){ + if(m_doTiming) getTimer("TileUnpck")->stop(); + return StatusCode::FAILURE; + } + + if(m_doTiming) getTimer("TileUnpck")->stop(); + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromFEBHeader::addLArFebEnergy(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool prepare) +{ + + // Time to access RegionSelector +// if (m_timersvc) m_timer[1]->resume(); + + m_data->RegionSelector(sampling,etamin,etamax,phimin,phimax,detectorID); +// if (m_timersvc) m_timer[1]->pause(); + + // Time to access Collection +// if (m_timersvc) m_timer[2]->resume(); + + if ( m_data->LoadCollections(m_iFebBegin,m_iFebEnd, sampling , prepare).isFailure() ) + return StatusCode::FAILURE; +// if (m_timersvc) m_timer[2]->pause(); + + // Algorithmic time +// if (m_timersvc) m_timer[4]->resume(); + + for(m_Febit=m_iFebBegin ;m_Febit!=m_iFebEnd; ++m_Febit){ + + bool used=false; + CaloSampling::CaloSample samp=CaloSampling::Unknown; + if(detectorID == TTHEC){ +// + samp = CaloSampling::HEC0; + } + if(detectorID == TTEM){ + int febid = (*m_Febit)->getFebId(); + int idit = 0; + int iditend = m_usedfeb->size(); + /* avoid double-counting of EM FEBs */ + for(;idit!=iditend; ++idit){ + if(febid == (*m_usedfeb)[idit] ){ + used = true; + idit++; + break; + } + } + m_usedfeb->push_back(febid); + samp = CaloSampling::EMB1; + // std::cout << "In the TTEM; E_tot = " << FebEnergy << std::endl; + } + + if(!used ){ + double FebEnergy = sqrt( ((*m_Febit)->getFebEx())*((*m_Febit)->getFebEx()) + + ((*m_Febit)->getFebEy())*((*m_Febit)->getFebEy()) + + ((*m_Febit)->getFebEz())*((*m_Febit)->getFebEz()) ); + + double phi = atan2((*m_Febit)->getFebEy(),(*m_Febit)->getFebEx()); + double eta = atanh((*m_Febit)->getFebEz()/FebEnergy); + m_gridElement->setE(FebEnergy); + m_gridElement->setEta(eta); + m_gridElement->setPhi(phi); + m_gridElement->setCaloSample(samp); + grid->push_back(*m_gridElement); + } + } + + if ( Athena::Timeout::instance().reached() ) { + ATH_MSG_ERROR("Timeout reached in addLArFebEnergy"); + return StatusCode::FAILURE; + } +// if (m_timersvc) m_timer[4]->pause(); + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromFEBHeader::addTileCells(double etamin, double etamax, + double phimin, double phimax, + std::vector<Trig3Momentum>* grid, + DETID detectorID, int sampling, + bool /*prepare*/) +{ + + // Time to access RegionSelector +// if (m_timersvc) m_timer[1]->resume(); + // Get detector offline ID's for Collections + m_data->RegionSelector(sampling,etamin,etamax,phimin,phimax, detectorID); + +// if (m_timersvc) m_timer[1]->pause(); + // Prepare data, load collections + + for( unsigned int iR=0; iR!=m_data->TileContSize();++iR ){ + // Time to access Collection +// if (m_timersvc) m_timer[3]->resume(); + + if ( m_data->LoadCollections(m_itBegin,m_itEnd, iR, !iR).isFailure() ) + return StatusCode::FAILURE; + +// if (m_timersvc) m_timer[3]->pause(); + // } + + + // Algorithmic time +// if (m_timersvc) m_timer[4]->resume(); + + // Main Loop over cells + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { + + // possibly do some noise thresholding + + // possibly do some calibration + // may want sampling. example: + CaloSampling::CaloSample samp; + //samp = CaloSampling::getSampling(*(*m_itt)); + samp = (*m_itt)->caloDDE()->getSampling(); + + // possibly do some tower building + + // for now fill grid elements like this +// gridElement = new Trig3Momentum(); + m_gridElement->setE((*m_itt)->e()); + m_gridElement->setEta((*m_itt)->eta()); + m_gridElement->setPhi((*m_itt)->phi()); + m_gridElement->setCaloSample(samp); + //push them back into the grid + grid->push_back(*m_gridElement); + + } +// if (m_timersvc) m_timer[4]->pause(); + } + + if ( Athena::Timeout::instance().reached() ) { + ATH_MSG_ERROR( "Timeout reached in addTileCells " ); + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromFEBHeader::finalize() +{ + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromLvl1Ppr.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromLvl1Ppr.cxx new file mode 100755 index 000000000000..0e89335a84d4 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2CaloJetGridFromLvl1Ppr.cxx @@ -0,0 +1,92 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2CaloJetGridFromLvl1Ppr.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Kyle Cranmer <cranmer@cern.ch> +CREATED: November, 2005 + +PURPOSE: Data preparation from Lvl1 Calo + +********************************************************************/ +#include "TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" + +T2CaloJetGridFromLvl1Ppr::T2CaloJetGridFromLvl1Ppr(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), m_gridElement(0) +{ +} + +T2CaloJetGridFromLvl1Ppr::~T2CaloJetGridFromLvl1Ppr() +{ +} + +StatusCode T2CaloJetGridFromLvl1Ppr::initialize() +{ + if ( !m_gridElement ) m_gridElement = new Trig3Momentum(); + + // from IAlgToolCalo + m_geometryTool.disable(); + m_data.disable(); + + return StatusCode::SUCCESS; +} + +StatusCode T2CaloJetGridFromLvl1Ppr::execute() +{ + return StatusCode::SUCCESS; +} + + +//StatusCode T2CaloJetGridFromLvl1Ppr::execute(TrigT2Jet +//* jet,double etamin, double etamax, double phimin, double phimax) +StatusCode T2CaloJetGridFromLvl1Ppr::execute(TrigT2Jet* jet, + double /*etamin*/, + double /*etamax*/, + double /*phimin*/, + double /*phimax*/) +{ + + // this method should use region selector to get TriggerTowers from + // the Lvl1 PreProcessor. Will require some chages to Region Selector + + std::vector<Trig3Momentum>* grid = new std::vector<Trig3Momentum>(); + + // now get TT's + + // possibly do some calibration + + // now fill grid elements like this + Trig3Momentum* gridElement = m_gridElement; + gridElement->setE(10000.); + gridElement->setEta(1.); + gridElement->setPhi(0.); + + //push them back into the grid + grid->push_back(*gridElement); + + + //then set the grid in the jet. do not delete anything. Cleanup + //happens at the end of jet finding. + jet->setGrid(grid); + + return StatusCode::SUCCESS; +} + + +StatusCode T2CaloJetGridFromLvl1Ppr::finalize() +{ + if ( m_gridElement ) delete m_gridElement; + m_gridElement = 0; + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloFullScanJet.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloFullScanJet.cxx new file mode 100644 index 000000000000..750fde7e612c --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloFullScanJet.cxx @@ -0,0 +1,322 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1CaloFullScanJet.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett +// ******************************************************************** + + +#include "GaudiKernel/IToolSvc.h" + + +#include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigCaloEvent/TrigT2JetContainer.h" +#include "TrigT2CaloJet/T2L1CaloFullScanJet.h" +#include "TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h" +#include "TrigTimeAlgs/TrigTimer.h" + +#include <sys/time.h> + +#include <math.h> + +class ISvcLocator; + +T2L1CaloFullScanJet::T2L1CaloFullScanJet(const std::string & name, ISvcLocator* pSvcLocator) + : HLT::AllTEAlgo(name, pSvcLocator), + m_jets(0), + m_tools(this) + +{ declareProperty("T2JetTools", m_tools, "L1.5 Full Scan Tools"); + declareProperty("jetOutputKey", m_jetOutputKey = "TrigT2CaloJet"); + // debug + declareProperty("recordOutput", m_recordOutput = true); + + declareMonitoredVariable("nJets", m_nJets); + declareMonitoredVariable("nTowers", m_nTowers); + declareMonitoredVariable("UnpckTime", m_UnpckTime); + declareMonitoredVariable("L1_UnpckTime", m_L1_UnpckTime); + declareMonitoredVariable("FastJetTime", m_FastJetTime); + declareMonitoredVariable("JetFindingTime", m_JetFindingTime); + declareMonitoredVariable("OverallTime", m_TotalTime); + declareMonitoredVariable("RoITime", m_RoITime); + declareMonitoredStdContainer("E", m_e); + declareMonitoredStdContainer("Et", m_et); + declareMonitoredStdContainer("Eem", m_eem); + declareMonitoredStdContainer("Ehad", m_ehad); + declareMonitoredStdContainer("Etem", m_etem); + declareMonitoredStdContainer("Ethad",m_ethad); + declareMonitoredStdContainer("Eta", m_eta); + declareMonitoredStdContainer("Phi", m_phi); + declareMonitoredStdContainer("Emf", m_emfrac); + declareMonitoredStdContainer("nLeadingTowers", m_nLeadingTowers); +} + +HLT::ErrorCode T2L1CaloFullScanJet::hltInitialize() +{ + m_log = new MsgStream(msgSvc(), name()); + + if((*m_log).level() <= MSG::INFO){ + (*m_log) << MSG::INFO << " Initalizing FEX algorithm: " << name() << endmsg; + (*m_log) << MSG::DEBUG << "Options: " << endmsg; + (*m_log) << MSG::DEBUG << " jetOutputKey: " << m_jetOutputKey << endmsg; + (*m_log) << MSG::DEBUG << " recordOutput: " << m_recordOutput << endmsg; + } + + if (timerSvc()) { + m_timer.push_back(addTimer("TimeTot")); + m_timer.push_back(addTimer("RoIMaking")); + } + + if ( m_tools.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_tools << endmsg; + } else { + (*m_log) << MSG::DEBUG << "Retrieved l1.5 full scan tools: " << m_tools << endmsg; + } + + // add timers for the tools + if (timerSvc()) { + ToolHandleArray< T2L1CaloJetFullScanBaseTool >::iterator itTool = m_tools.begin(), + itToolEnd = m_tools.end(); + for ( ; itTool != itToolEnd; ++itTool ) { + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG <<"Tool with name " << (*itTool).name()<< endmsg; + + m_timer.push_back(addTimer((*itTool).name())); + } + } + + m_jets = new DataVector<TrigT2Jet>(SG::VIEW_ELEMENTS); + m_jets->reserve(100); + + m_e.reserve(100); + m_et.reserve(100); + m_eem.reserve(100); + m_ehad.reserve(100); + m_etem.reserve(100); + m_ethad.reserve(100); + m_eta.reserve(100); + m_phi.reserve(100); + m_emfrac.reserve(100); + m_nLeadingTowers.reserve(100); + + return HLT::OK; +} + +T2L1CaloFullScanJet::~T2L1CaloFullScanJet(){ +} + +HLT::ErrorCode T2L1CaloFullScanJet::hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& /*tes_in*/, + unsigned int type_out) +{ + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + beforeExecMonitors().ignore(); + + if(timerSvc()) m_timer[0]->start(); + + m_nJets = -99; + m_nTowers = -99; + m_UnpckTime = -99; + m_L1_UnpckTime = -99; + m_FastJetTime = -99; + m_JetFindingTime = -99; + m_TotalTime = -99; + m_RoITime = -99; + m_e.clear(); + m_et.clear(); + m_eem.clear(); + m_ehad.clear(); + m_etem.clear(); + m_ethad.clear(); + m_eta.clear(); + m_phi.clear(); + m_emfrac.clear(); + m_nLeadingTowers.clear(); + m_jets->clear(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "================= Executing T2L1CaloFullScanJet FEX " << name() << endmsg; + //(*m_log) << MSG::DEBUG << "m_jetOutputKey: " << m_jetOutputKey << endmsg; + } +#endif + + DataVector<TrigT2Jet>::const_iterator begin_jet, end_jet; // iterators for the produced jets + + // ====== Run the tools + // do loop over tools + ToolHandleArray< T2L1CaloJetFullScanBaseTool >::iterator itTool = m_tools.begin(), + itToolEnd = m_tools.end(); + + int currant_tool=0; + //uint32_t error = 0; + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Looping over tools vector" << endmsg; + } +#endif + + for ( ; itTool != itToolEnd; ++itTool ) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Running tool: [" << currant_tool+1 << "] of " << m_tools.size() << endmsg; + (*m_log) << MSG::DEBUG << "Alg name: " << (*itTool)->name() << endmsg; + } +#endif + + if (timerSvc()) m_timer[currant_tool+2]->start(); // offset = number of other timers + + if ((*itTool)->execute(m_jets,m_nTowers,m_L1_UnpckTime,m_UnpckTime,m_FastJetTime,m_JetFindingTime).isFailure()){ + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::WARNING << "T2L1CaloJet AlgTool returned Failure" << endmsg; + } + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + + //uint32_t in_error = (*itTool)->report_error(); + //error|=in_error; + + if (timerSvc()) m_timer[currant_tool+2]->stop(); + currant_tool++; + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "=== Finished jet finding" << endmsg; + (*m_log) << MSG::DEBUG << " Towers unpacked: " << m_nTowers << " in " << m_UnpckTime << " ms, of this L1 unpacking took "<< m_L1_UnpckTime << " ms" << endmsg; + (*m_log) << MSG::DEBUG << " T2CaloJets found: " << m_jets->size() << " in " << m_JetFindingTime << " ms, of this FastJet took " << m_FastJetTime << " ms" << endmsg; + if (m_UnpckTime > 50){ + (*m_log) << MSG::DEBUG << " That was a long time " << endmsg; + } + + begin_jet = m_jets->begin(); + end_jet = m_jets->end(); + int jet_counter = 0; + for (; begin_jet != end_jet; ++begin_jet){ + (*m_log) << MSG::DEBUG << " T2CaloJet["<<jet_counter + << "]: Et: " << (*begin_jet)->et() + << " MeV, eta: " << (*begin_jet)->eta() + << ", phi; " << (*begin_jet)->phi() << endmsg; + jet_counter++; + } + } +#endif + // ====== now monitor record and attach features + + if(timerSvc()) m_timer[1]->start(); // start of RoI recording + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Monitoring, recording and attaching features" << endmsg; + (*m_log) << MSG::DEBUG << "Using L2 output jet key = " << m_jetOutputKey << endmsg; + } +#endif + + m_nJets = m_jets->size(); + + // store the final jets into an output TE. + HLT::TriggerElement* outputTE = 0; + std::string key = ""; + int recorded_jet_counter = 0; + if (m_recordOutput){ + outputTE = addRoI(type_out, new TrigRoiDescriptor(true)); + outputTE->setActiveState(true); + + } else { + //outputTE->setActiveState(false); + } + + begin_jet = m_jets->begin(); + end_jet = m_jets->end(); + for (; begin_jet != end_jet; ++begin_jet){ + m_jet = (*begin_jet); + + // Monitor + m_e.push_back( m_jet->e()); + m_et.push_back( m_jet->et()); + m_eta.push_back( m_jet->eta() ); + m_phi.push_back( m_jet->phi() ); + m_eem.push_back( m_jet->eem0()); + m_ehad.push_back( m_jet->ehad0()); + m_etem.push_back( (m_jet->eem0()/cosh(m_jet->eta()))); + m_ethad.push_back( (m_jet->ehad0()/cosh(m_jet->eta()))); + m_emfrac.push_back( m_jet->emf() ); + m_nLeadingTowers.push_back( m_jet->nLeadingCells() ); + + if (m_recordOutput){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " recording T2CaloJet["<<recorded_jet_counter<<"]"<<endmsg; + } +#endif + // store each jet as we go along so they're in the standard T2JetContainer + + HLT::ErrorCode hltStatus = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (hltStatus != HLT::OK){ + (*m_log) << MSG::ERROR << "recording of TrigT2Jet into StoreGate failed" << endmsg; + return hltStatus; + } + + recorded_jet_counter++; + } + + + + } + + + if(timerSvc()) m_timer[1]->stop(); // end of RoI recording + + if(timerSvc()) m_timer[0]->stop(); // end of execute + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "RoI making time: " << m_timer[1]->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "Total time: " << m_timer[0]->elapsed() << " ms " << endmsg; + if (m_timer[0]->elapsed() > 50){ + (*m_log) << MSG::DEBUG << "That was a long time " << endmsg; + } + (*m_log) << MSG::DEBUG << "================= Finished T2L1CaloFullScanJet FEX " << name() << endmsg; + } +#endif + + m_TotalTime = m_timer[0]->elapsed(); + m_RoITime = m_timer[1]->elapsed(); + + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + afterExecMonitors().ignore(); + + return HLT::OK; +} + + +HLT::ErrorCode T2L1CaloFullScanJet::hltFinalize() +{ + if ( (*m_log).level() <= MSG::DEBUG ) + (*m_log) << MSG::DEBUG << "Finalizing T2L1CaloFullScanJet FEX " << name() << endmsg; + + m_jets->clear(); + delete m_jets; + m_timer.clear(); + m_e.clear(); + m_et.clear(); + m_eta.clear(); + m_phi.clear(); + m_eem.clear(); + m_ehad.clear(); + m_emfrac.clear(); + m_nLeadingTowers.clear(); + + delete m_log; + + return HLT::OK; +} + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJet.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJet.cxx new file mode 100755 index 000000000000..be69e0b9a97f --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJet.cxx @@ -0,0 +1,371 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1CaloJet.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Denis Oliveira Damazio +// ******************************************************************** + + +#include "GaudiKernel/IToolSvc.h" + + +#include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include "TrigCaloEvent/TrigT2Jet.h" +#include "TrigCaloEvent/TrigT2JetContainer.h" +#include "TrigT2CaloJet/T2L1CaloJet.h" +#include "TrigT1CaloByteStream/ITrigT1CaloDataAccess.h" +#include "TrigT1CaloToolInterfaces/IL1JetTools.h" +#include "TrigTimeAlgs/TrigTimer.h" +#include <sys/time.h> + +#include <math.h> + +class ISvcLocator; + +T2L1CaloJet::T2L1CaloJet(const std::string & name, ISvcLocator* pSvcLocator) + : HLT::FexAlgo(name, pSvcLocator), + m_jet(0), + m_log(NULL), + m_dataL1("LVL1BS__TrigT1CaloDataAccess/TrigT1CaloDataAccess",0), + m_jetL1Tools("LVL1::L1JetTools/L1JetTools",this),m_storedJEs(0), + m_retrievedJetTool(false) +{ + declareProperty("TrigT1CaloDataAccess", m_dataL1, "L1 Calo Data Access"); + declareProperty("L1JetTool", m_jetL1Tools, "L1 Calo Jet Algorithm"); + declareProperty("jetOutputKey",m_jetOutputKey = "TrigT2L1CaloJet"); + + + declareMonitoredVariable("E", m_e); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); +} + +HLT::ErrorCode T2L1CaloJet::hltInitialize() +{ + m_log = new MsgStream(msgSvc(), name()); + + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Intializing: " << name() <<endmsg; + } + + if (timerSvc()) { + m_timer.push_back(addTimer("TimeTot")); + m_timer.push_back(addTimer("JEUnpacking")); + m_timer.push_back(addTimer("JEformsums")); + m_timer.push_back(addTimer("RoIMaking")); + } + + // Create helper tools + if ( m_dataL1.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_dataL1 << endmsg; + m_retrievedJetTool = false; + } else { + m_retrievedJetTool = true; + (*m_log) << MSG::INFO << "Retrieved " << m_dataL1 << endmsg; + } + + if ( m_jetL1Tools.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_jetL1Tools << endmsg; + } else { + (*m_log) << MSG::INFO << "Retrieved " << m_jetL1Tools << endmsg; + } + + m_storedJEs = new ConstDataVector<DataVector<LVL1::JetElement> >(SG::VIEW_ELEMENTS); + + + return HLT::OK; +} + +T2L1CaloJet::~T2L1CaloJet(){ +} + +HLT::ErrorCode T2L1CaloJet::hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE) +{ + + if(timerSvc()){ + m_timer[0]->start(); + } + + m_e = -99; + m_et = -99; + //m_eem0 = -99; + //m_ehad0 = -99; + m_eta = -99; + m_phi = -99; + + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Executing T2L1CaloJet FEX " << name() << endmsg; + (*m_log) << MSG::DEBUG << "m_jetOutputKey: " << m_jetOutputKey << endmsg; + (*m_log) << MSG::DEBUG + << "outputTE->getId(): " + << outputTE->getId() << endmsg; + (*m_log) << MSG::DEBUG + << "inputTE->getId(): " + << inputTE->getId() << endmsg; + } +#endif + + // Note: new TriggerElement has no label() anymore ! + + + // ========================= + // retrieve RoI: + // ========================= +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "getting RoI" << endmsg; + } +#endif + + const TrigRoiDescriptor* roiDescriptor = 0; + + HLT::ErrorCode hltStatus = getFeature(inputTE, roiDescriptor); + + if ( hltStatus == HLT::OK ) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << "got the roi descriptor" << endmsg; + (*m_log) << MSG::DEBUG << *roiDescriptor << endmsg; + } +#endif + + } else { + (*m_log) << MSG::WARNING << " Failed to find RoiDescriptor " << endmsg; + return hltStatus; + } + + // Some debug output: +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) { + (*m_log) << MSG::DEBUG << "Inspect the LVL1 object; LVL1 phi=" + << roiDescriptor->phi() + << ", LVL1 eta=" + << roiDescriptor->eta() + << endmsg; + } +#endif + + // ========================= + // make Jet + // ========================= +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Making TrigT2Jet "<< endmsg; + } +#endif + m_jet = new TrigT2Jet(); + + // Add RoI word to Jet + m_jet->set_RoIword(roiDescriptor->roiWord()); + + // Set eta,phi + m_jet->setEta(roiDescriptor->eta()); + m_jet->setPhi(roiDescriptor->phi()); + + if(timerSvc()) m_timer[1]->start(); // start of JE unpacking + int counter=0; + DataVector<LVL1::JetElement>::const_iterator begj, endj; + + if ( m_retrievedJetTool ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loading the L1 data using ITrigT1CaloDataAccess tool, this loads the jet elements for the entire event"<< endmsg; + } +#endif + (m_dataL1->loadCollection(begj,endj)).ignore(); + } + + m_storedJEs->clear(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Looping over the jet elements"<< endmsg; + } +#endif + + for(; begj!=endj;begj++){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "JetElement["<<counter<<"]: ETs [GeV]: EM: "<< (*begj)->emEnergy()<<", HAD: "<< (*begj)->hadEnergy()<<", Total: "<<(*begj)->energy()<<", eta: "<<(*begj)->eta()<<", phi: "<<(*begj)->phi()<<endmsg; + } +#endif + + m_storedJEs->push_back(*begj); + counter++; + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Stored L1 data as DataVector<LVL1::JetElement>* m_storedJEs" << endmsg; + (*m_log) << MSG::DEBUG << "A total of " << counter << " elements were retreived" << endmsg; + (*m_log) << MSG::DEBUG << "These will now be mapped onto a map of ints and LVL1::JetInput[s]" << endmsg; + } +#endif + + std::map<int, LVL1::JetInput*> jetInputs; // This will have to be cleared after being used + if (m_retrievedJetTool) { + m_jetL1Tools->mapJetInputs(m_storedJEs->asDataVector(), &jetInputs); + } + + double roiPhi = (roiDescriptor)->phi(); + if( roiPhi < 0 ) roiPhi += 2 * M_PI; + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "RoI descriptor phi: "<<(roiDescriptor)->phi()<<", in L1 coordinates: "<<roiPhi<<endmsg; + } +#endif + + if(timerSvc()) m_timer[1]->stop(); // end of JE unpacking + if(timerSvc()) m_timer[2]->start(); // start of jet finding + + if ( m_retrievedJetTool ) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Using m_jetL1Tools to 'formSums' at the roi descriptor coordinates, this reproduces the L1 Jet object"<<endmsg; + } +#endif + m_jetL1Tools->formSums( (roiDescriptor)->eta(), roiPhi, & jetInputs ); + // now we must clear the map of jet inputs + std::map<int, LVL1::JetInput*> ::const_iterator begin_JetInputMap, + end_JetInputMap; + begin_JetInputMap = jetInputs.begin(); + end_JetInputMap = jetInputs.end(); + for(; begin_JetInputMap!=end_JetInputMap;begin_JetInputMap++){ + delete begin_JetInputMap->second; + } + + m_jet->setEta( (roiDescriptor)->eta() ); + // The L1 roiDescriptor phi0 can sometimes be == Pi which causes navigation errors + if ((roiDescriptor)->phi() >= M_PI){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "RoI descriptor phi >= M_PI, this causes issues with the creation of RoI descriptors: therefore setting phi to M_PI-0.001"<<endmsg; + } +#endif + m_jet->setPhi( M_PI-0.001 ); + } + else{ + m_jet->setPhi( (roiDescriptor)->phi() ); + } + //m_jet->setPhi( (roiDescriptor)->phi() ); + m_jet->setE ( m_jetL1Tools->ET8x8()*1e3*cosh((roiDescriptor)->eta()) ); + //m_jet->setEem0 ( 0.0 ); + //m_jet->setEhad0 ( 0.0 ); + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Values of T2L1CaloJet produced: " << endmsg; + (*m_log) << MSG::DEBUG << " REGTEST: Jet eta = " << m_jet->eta() << endmsg; + (*m_log) << MSG::DEBUG << " REGTEST: Jet phi = " << m_jet->phi() << endmsg; + (*m_log) << MSG::DEBUG << " REGTEST: Jet energy = " << m_jet->e() << endmsg; + (*m_log) << MSG::DEBUG << " REGTEST: Jet et = " << m_jet->et() << endmsg; + } +#endif + + m_e = m_jet->e(); + //m_ehad0 = m_jet->ehad0(); + //m_eem0 = m_jet->eem0(); + m_eta = m_jet->eta(); + m_et = m_e/cosh(m_eta); + m_phi = m_jet->phi(); + + if(timerSvc()) m_timer[2]->stop(); // end of jet finding + if(timerSvc()) m_timer[3]->start(); // start of RoI creation + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Recording created features"<<endmsg; + } +#endif + + std::string key = ""; + + hltStatus = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (hltStatus != HLT::OK) { + if((*m_log).level() <= MSG::DEBUG) { + (*m_log) << MSG::ERROR << "Write of TrigT2Jet into outputTE failed" + << endmsg; + } + return hltStatus; + } + + + // ========================= + // make OutputTE + // ========================= + + // Create a new RoiDescriptor with updated eta and phi. + // Note that the steering will propagate l1Id and roiId automatically + // so no need to set them. + // How big is theis RoI ????? + TrigRoiDescriptor* newRoiDescriptor = + new TrigRoiDescriptor(roiDescriptor->roiWord(), roiDescriptor->l1Id(), roiDescriptor->roiId(), + m_jet->eta(), m_jet->eta(), m_jet->eta(), + m_jet->phi(), m_jet->phi(), m_jet->phi() + ); // We forward the roiWord to the EF + + + hltStatus = attachFeature(outputTE, newRoiDescriptor, m_jetOutputKey); + + if ( hltStatus != HLT::OK ) { + (*m_log) << MSG::ERROR << "Write of update TrigRoiDescriptor into outputTE failed" + << endmsg; + return hltStatus; + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) { + (*m_log) << MSG::DEBUG << "Recorded an RoiDescriptor " + << " phi " << newRoiDescriptor->phi() + << " eta " << newRoiDescriptor->eta() << endmsg; + (*m_log) << MSG::DEBUG + << "We assume success, set TE with Id " + << outputTE->getId() + << " active to signal positive result." + << endmsg; + } +#endif + + if (timerSvc()) { + m_timer[3]->stop();// end of RoI creation + m_timer[0]->stop();// end of algorithm + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Finished T2L1CaloJet FEX " << name() << endmsg; + } +#endif + + return HLT::OK; +} + + +HLT::ErrorCode T2L1CaloJet::hltFinalize() +{ + m_storedJEs->clear(); + delete m_storedJEs; + + if ( (*m_log).level() <= MSG::INFO ){ + (*m_log) << MSG::INFO << "Finalizing: " << name() << endmsg; + + } + delete m_log; + + return HLT::OK; +} + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetCalibTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetCalibTool.cxx new file mode 100644 index 000000000000..79d9f082ad60 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetCalibTool.cxx @@ -0,0 +1,236 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2L1CaloJetCalibTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch> +CREATED: June 2012 + + +PURPOSE: Calibration tool for L2FS jets. + + + +********************************************************************/ +#include "TrigT2CaloJet/T2L1CaloJetCalibTool.h" +#include "TrigCaloEvent/Trig3Momentum.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "AthenaKernel/Timeout.h" + +#include "GaudiKernel/IToolSvc.h" + +//----------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------- +T2L1CaloJetCalibTool::T2L1CaloJetCalibTool(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent) +{ + declareInterface<T2L1CaloJetCalibTool>( this ); + // configurables + declareConstant("Calib_Factors", m_CalibConstants); + //declareProperty("Et_bin_edges", m_et_bin_lower_edges); + declareProperty("Eta_bin_edges", m_eta_bin_lower_edges); + //declareConstant("Phi_bin_edges", m_phi_bin_lower_edges); + + +} + +//----------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------- +T2L1CaloJetCalibTool::~T2L1CaloJetCalibTool() +{ +} + +//----------------------------------------------------------------- +// Initialize: +//----------------------------------------------------------------- +StatusCode T2L1CaloJetCalibTool::initialize() +{ + m_log = new MsgStream(msgSvc(), name()); + (*m_log) << MSG::INFO << " Initalizing Tool: " << name () << endmsg; + + if ( m_eta_bin_lower_edges.empty() ) { + (*m_log) << MSG::ERROR << name() << ": No eta bin edges provided " << endmsg; + return StatusCode::FAILURE; + } else { + (*m_log) << MSG::INFO << " eta bin edges provided: " << m_eta_bin_lower_edges.size() << endmsg; + if((*m_log).level() <= MSG::DEBUG){ + for ( unsigned i=0 ; i<m_eta_bin_lower_edges.size() ; i++ ) { + (*m_log) << MSG::DEBUG << " - bin[" << i << "] lower edge: " << m_eta_bin_lower_edges[i] << endmsg; + } + } + } + + + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Execute +//----------------------------------------------------------------- +StatusCode T2L1CaloJetCalibTool::execute() +{ + return StatusCode::SUCCESS; +} + +StatusCode T2L1CaloJetCalibTool::execute(TrigT2Jet* jet, double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/) +{ + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "===== Executing: T2L1CaloJetCalibTool " << name() << endmsg; + } +#endif + + // === get the input jet + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Initial TrigT2CaloJet Et: " << jet->e()/cosh(jet->eta()) + << " MeV, eta: " << jet->eta() + << ", phi: " << jet->phi() + << endmsg; + (*m_log) << MSG::DEBUG << " - EM Et: " << jet->eem0()/cosh(jet->eta()) + << " MeV, Had Et: " << jet->ehad0()/cosh(jet->eta()) + << " MeV, emf: " << jet->emf() + << endmsg; + } +#endif + // calibrate the jet + int eta_bin = GetEtaBin(jet->eta()); + double transverse_energy = jet->e()/cosh(jet->eta()); + + double CalibFactor = GetCalibFactor(eta_bin,transverse_energy/1000.); + double correction_factor = 1. / (1. + CalibFactor); + double em_correction_factor = correction_factor; + double had_correction_factor = correction_factor; + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " - Eta Bin: " << eta_bin << endmsg; + (*m_log) << MSG::DEBUG << " - CalibFactor: " << CalibFactor << endmsg; + (*m_log) << MSG::DEBUG << " - Multiplicative correction: " << correction_factor << endmsg; + (*m_log) << MSG::DEBUG << " - em correction: " << em_correction_factor << endmsg; + (*m_log) << MSG::DEBUG << " - had correction: " << had_correction_factor << endmsg; + + } +#endif + + double corrected_transverse_energy = (jet->e()/cosh(jet->eta()))*correction_factor; + double corrected_energy = corrected_transverse_energy*cosh(jet->eta() ); + jet->setE(corrected_energy); + + double corrected_em_transverse_energy = (jet->eem0()/cosh(jet->eta()))*em_correction_factor; + double corrected_em_energy = corrected_em_transverse_energy*cosh(jet->eta() ); + jet->setEem0(corrected_em_energy); + + double corrected_had_transverse_energy = (jet->ehad0()/cosh(jet->eta()))*had_correction_factor; + double corrected_had_energy = corrected_had_transverse_energy*cosh(jet->eta() ); + jet->setEhad0(corrected_had_energy); + + double emf = 0; + if (corrected_em_transverse_energy){ + emf = jet->eem0() / jet->e(); + } + jet->setEmf(emf); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Calibrated TrigT2CaloJet: Et: " << jet->e()/cosh(jet->eta()) + << " MeV, eta: " << jet->eta() + << ", phi: " << jet->phi() + << endmsg; + (*m_log) << MSG::DEBUG << " - EM Et: " << jet->eem0()/cosh(jet->eta()) + << " MeV, Had Et: " << jet->ehad0()/cosh(jet->eta()) + << " MeV, emf: " << jet->emf() + << endmsg; + } +#endif + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "===== Finished: T2L1CaloJetCalibTool " << name() << endmsg; + } +#endif + + return StatusCode::SUCCESS; +} + + +//----------------------------------------------------------------- +// Finalize: +//----------------------------------------------------------------- +StatusCode T2L1CaloJetCalibTool::finalize() +{ + delete m_log; + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Calibration tools: +//----------------------------------------------------------------- +StatusCode T2L1CaloJetCalibTool::setProperty (const std::string& propname, + const std::string& value) +{ + StatusCode sc = AlgTool::setProperty (propname, value); + if (sc.isFailure()) return sc; + + sc=CaloRec::ToolWithConstantsMixin::setProperty (propname, value); + if (sc.isFailure()) return sc; + + return StatusCode::SUCCESS; +} + +StatusCode T2L1CaloJetCalibTool::setProperty (const Property& p) +{ + StatusCode sc=AlgTool::setProperty (p); + if (sc.isFailure()) return sc; + + sc=CaloRec::ToolWithConstantsMixin::setProperty (p); + if (sc.isFailure()) return sc; + + return StatusCode::SUCCESS; + +} + +int T2L1CaloJetCalibTool::GetEtaBin(double jet_eta) +{ + for ( unsigned i=0 ; i<m_eta_bin_lower_edges.size(); i++ ) { + if (jet_eta < m_eta_bin_lower_edges[i]){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " eta: " << jet_eta + << " < bin edge[" << i + << "]: " << m_eta_bin_lower_edges[i] + << endmsg; + } +#endif + return i-1; + } + } + if (jet_eta < 0) return 0; + return m_eta_bin_lower_edges.size()-1; +} + + +double T2L1CaloJetCalibTool::GetCalibFactor(int etabin, double transverse_energy) +{ + //up to 7 parameter for the pol-fit + unsigned Npar=7; + double logET=1./log10(transverse_energy); + double y=0; + for (unsigned i=0;i<Npar;++i) + y += m_CalibConstants[etabin][i]*pow(logET,i); + return y; +} + + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanBaseTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanBaseTool.cxx new file mode 100644 index 000000000000..b67bd030f110 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanBaseTool.cxx @@ -0,0 +1,57 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2L1CaloJetFullScanBaseTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch> +CREATED: July, 2011 + +PURPOSE: Base Tool for all T2L1CaloJetFullScan tools that require + a vector of T2CaloJet objects as its input. The derived + tool must implement an execute(DataVector<T2CaloJet*>) method. + +********************************************************************/ +#include "TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" + +T2L1CaloJetFullScanBaseTool::T2L1CaloJetFullScanBaseTool(const std::string& type, + const std::string& name, + const IInterface* parent): + IAlgToolCalo(type, name, parent) +{ + declareInterface<T2L1CaloJetFullScanBaseTool>( this ); +} + + +T2L1CaloJetFullScanBaseTool::~T2L1CaloJetFullScanBaseTool() +{ +} + +StatusCode T2L1CaloJetFullScanBaseTool::initialize() +{ + return StatusCode::SUCCESS; +} + +StatusCode T2L1CaloJetFullScanBaseTool::execute() +{ + return StatusCode::SUCCESS; +} + +StatusCode T2L1CaloJetFullScanBaseTool::execute(DataVector<TrigT2Jet>* /*output jets*/,int& /*n_towers*/,float& /*L1 unpack time*/, float& /*all unpack time*/,float& /*fastjet time*/,float& /*all jet finding time*/) +{ + return StatusCode::SUCCESS; +} + + +StatusCode T2L1CaloJetFullScanBaseTool::finalize() +{ + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanFastJetTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanFastJetTool.cxx new file mode 100644 index 000000000000..8bba44d7f6b7 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1CaloJetFullScanFastJetTool.cxx @@ -0,0 +1,568 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2L1CaloJetFullScanFastJetTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch> +CREATED: July, 2011 + +PURPOSE: FastJet Tool for full scan reconstruction of jets from Lvl-1 + inputs. + +********************************************************************/ +#include "TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h" +#include "TrigCaloEvent/TrigT2Jet.h" + +#include "TrigT1CaloByteStream/ITrigT1CaloDataAccess.h" +#include "TrigT1CaloToolInterfaces/IL1JetTools.h" +#include "TrigT1CaloEvent/TriggerTower.h" + +#include "fastjet/ClusterSequence.hh" + +#include "GaudiKernel/MsgStream.h" + +#include "GaudiKernel/IToolSvc.h" + + +T2L1CaloJetFullScanFastJetTool::T2L1CaloJetFullScanFastJetTool(const std::string& type, + const std::string& name, + const IInterface* parent): + T2L1CaloJetFullScanBaseTool(type, name, parent), + m_dataL1("LVL1BS__TrigT1CaloDataAccess/TrigT1CaloDataAccess",0), + m_jet(0), + m_total_timer(0), + m_unpacking_timer(0), + m_load_collection_timer(0), + m_jet_finding_timer(0), + m_jet_def(0) + +{ + declareInterface<T2L1CaloJetFullScanFastJetTool>( this ); + // configurables + declareProperty("TrigT1CaloDataAccess", m_dataL1, "L1 Calo Data Access"); + declareProperty("doTriggerTowers", m_doTriggerTowers = false); + declareProperty("coneRadius", m_coneRadius = 0.4); + declareProperty("pTmin", m_pTmin = 5000.); + declareProperty("inputType", m_inputType = T2L1::NONE); + // cleaning: + declareProperty("doCleaning", m_doCleaning = true); + declareProperty("leadingCellFraction", m_leadingCellFraction = 0.9); // for jet cleaning, e.g.: n90 -> leadingCellFraction = 0.9 + // debug + declareProperty("doJetFinding", m_doJetFinding = true); +} + + +T2L1CaloJetFullScanFastJetTool::~T2L1CaloJetFullScanFastJetTool() +{ +} + +StatusCode T2L1CaloJetFullScanFastJetTool::initialize() +{ + m_log = new MsgStream(msgSvc(), name()); + + + (*m_log) << MSG::INFO << " Initalizing Tool: " << name () << endmsg; + (*m_log) << MSG::DEBUG << "Options: " << endmsg; + (*m_log) << MSG::DEBUG << " doTriggerTowers: " << m_doTriggerTowers << endmsg; + (*m_log) << MSG::DEBUG << " coneRadius: " << m_coneRadius << endmsg; + (*m_log) << MSG::DEBUG << " pTmin: " << m_pTmin << endmsg; + (*m_log) << MSG::DEBUG << " inputType (hex): " << std::hex << m_inputType << std::dec << endmsg; + (*m_log) << MSG::DEBUG << " doCleaning: " << m_doCleaning << endmsg; + (*m_log) << MSG::DEBUG << " leadingCellFraction: " << m_leadingCellFraction << endmsg; + (*m_log) << MSG::DEBUG << " doJetFinding: " << m_doJetFinding << endmsg; + + // Initialize timing service + if( service( "TrigTimerSvc", m_pTimerService).isFailure() ) { + (*m_log) << MSG::WARNING << name() << ": Unable to locate TrigTimer Service" << endmsg; + } + + if (m_pTimerService){ + (*m_log) << MSG::DEBUG << " Adding timers" << endmsg; + //Add timers + m_total_timer = m_pTimerService->addItem("LVL1_5_total_time"); + m_unpacking_timer = m_pTimerService->addItem("LVL1_5_FS_unpacking_time"); + m_load_collection_timer = m_pTimerService->addItem("LVL1_5_FS_load_collection_time"); + m_jet_finding_timer = m_pTimerService->addItem("LVL1_5_FS_jet_finding_time"); + m_fastjet_timer = m_pTimerService->addItem("LVL1_5_FS_fastjet_time"); + } + + // Create helper tools + if ( m_dataL1.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_dataL1 << endmsg; + m_retrievedJetTool = false; + } else { + m_retrievedJetTool = true; + (*m_log) << MSG::DEBUG << "Retrieved " << m_dataL1 << endmsg; + } + + // settings for Trigger tower retrieval + m_etaMin = -5.; + m_etaMax = 5.; + m_phiMin = 0.; + m_phiMax = 2 * M_PI; + m_fullScan = true; + + // initialise storage for l1 towers + m_l1_tower_information.reserve(1000); + m_cellenergies.reserve(100); + + // initialise fast jet + m_particles.reserve(100); + m_constituents.reserve(100); + m_jets.reserve(100); + + if (m_doJetFinding){ + (*m_log) << MSG::INFO << " Setting up fastjet jet definition" << endmsg; + m_jet_def = new fastjet::JetDefinition(fastjet::antikt_algorithm, m_coneRadius); + // dummy call to fast jet so it's internal initalize methods are set (and we don't print the banner during execute) + (*m_log) << MSG::INFO << " Making dummy call to fast jet cluster sequence" << endmsg; + m_particles.clear(); + fastjet::ClusterSequence* cs(0); + cs = new fastjet::ClusterSequence(m_particles, *m_jet_def); + delete cs; + } + + + + return StatusCode::SUCCESS; +} + +StatusCode T2L1CaloJetFullScanFastJetTool::execute() +{ + return StatusCode::SUCCESS; +} + + +StatusCode T2L1CaloJetFullScanFastJetTool::execute(DataVector<TrigT2Jet>* output_t2_jets,int& n_towers,float& l1_unpack_time, float& all_unpack_time, float& fastjet_time, float& all_jet_finding_time) +{ + m_total_timer->reset(); + m_unpacking_timer->reset(); + m_load_collection_timer->reset(); + m_jet_finding_timer->reset(); + m_fastjet_timer->reset(); + m_total_timer->start(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "===== Executing: T2L1CaloJetFullScanFastJetTool " << name() << endmsg; + } +#endif + + // output_t2_jets->clear(); // this should be cleared when it arrives + m_particles.clear(); + m_constituents.clear(); + m_jets.clear(); + m_l1_tower_information.clear(); + m_cellenergies.clear(); + + n_towers = -9; + all_unpack_time = -9; + l1_unpack_time = -9; + fastjet_time = -9; + all_jet_finding_time = -9; + // === now fill the particles vector, this is different for jet elements and trigger towers + // eventually this could be split off into a seperate FEX to be reused by this, vl1 etc. + m_unpacking_timer->start(); + + int counter = 0; + if ( m_doTriggerTowers ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Trigger tower version" <<endmsg; + } +#endif + + DataVector<LVL1::TriggerTower>::const_iterator tt_begj, tt_endj; + + // now get TT's + if ( m_retrievedJetTool ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loading the L1 data using ITrigT1CaloDataAccess tool"<< endmsg; + (*m_log) << MSG::DEBUG << "Getting trigger towers using m_etaMin: " << m_etaMin + << ", etaMax: " << m_etaMax + << ", phiMin: " << m_phiMin + << ", phiMax: " << m_phiMax + << ", full: " << m_fullScan << endmsg; + } +#endif + m_load_collection_timer->start(); + StatusCode sc = m_dataL1->loadCollection(tt_begj,tt_endj,m_etaMin,m_etaMax,m_phiMin,m_phiMax,m_fullScan); + if (sc.isFailure()) { + (*m_log) << MSG::WARNING << "Error accessing trigger tower data" << endmsg; + return sc; + } + m_load_collection_timer->stop(); + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loaded trigger towers in "<< m_load_collection_timer->elapsed() << " ms" << endmsg; + (*m_log) << MSG::DEBUG << "Looping over trigger towers"<< endmsg; + } +#endif + + for(; tt_begj!=tt_endj;++tt_begj){ + const LVL1::TriggerTower* TT = (*tt_begj); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "TriggerTower[" << counter + << "]: ETs [GeV]: EM: " << TT->emEnergy() + << ", HAD: " << TT->hadEnergy() + << ", eta: " << TT->eta() + << ", phi: " << TT->phi() << endmsg; + } +#endif + // change to a more standard phi definition + float tt_phi = TT->phi(); + if( tt_phi >= M_PI ) tt_phi -= 2 * M_PI; + float transverse_energy = (TT->emEnergy() + TT->hadEnergy())*1000.; + float cosh_eta = cosh(TT->eta()); + float energy = transverse_energy*cosh_eta; + // possibly do some calibration + + // now fill fast jet particles + float px = transverse_energy*cos(tt_phi); + float py = transverse_energy*sin(tt_phi); + float pz = transverse_energy*sinh(TT->eta()); + + if (m_doJetFinding){ + if (transverse_energy > 0.99){ // some Jet Elements have zero energy (this may also be true for trigger towers), there is no need to give these to fastjet + fastjet::PseudoJet pseudo_jet( px, py, pz, energy); + pseudo_jet.set_user_index(counter); + m_particles.push_back( pseudo_jet ); + } + + // now fill these into a vector of floats so we can construct cleaning variables later + if (m_doCleaning) { + m_l1_tower_information.push_back(energy); + m_l1_tower_information.push_back(TT->eta()); + m_l1_tower_information.push_back(TT->phi()); + m_l1_tower_information.push_back(TT->emEnergy()*cosh_eta*1000.); + m_l1_tower_information.push_back(TT->hadEnergy()*cosh_eta*1000.); + } + } + + counter++; + } + } else { // if we aren't running on trigger towers we use jet elements instead +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Jet element version" <<endmsg; + } +#endif + DataVector<LVL1::JetElement>::const_iterator je_begj, je_endj; + + if ( m_retrievedJetTool ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loading the L1 data using ITrigT1CaloDataAccess tool, this loads the jet elements for the entire event"<< endmsg; + } +#endif + m_load_collection_timer->start(); + StatusCode sc = m_dataL1->loadCollection(je_begj,je_endj); + if (sc.isFailure()) { + (*m_log) << MSG::WARNING << "Error accessing jet element data" << endmsg; + return sc; + } + m_load_collection_timer->stop(); + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loaded jet elements in "<< m_load_collection_timer->elapsed() << " ms" << endmsg; + (*m_log) << MSG::DEBUG << "Looping over the jet elements"<< endmsg; + } +#endif + + for(; je_begj!=je_endj;++je_begj){ + const LVL1::JetElement* JE = (*je_begj); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "JetElement[" << counter + << "]: ETs [GeV]: EM: " << JE->emEnergy() + << ", HAD: " << JE->hadEnergy() + << ", Total: " << JE->energy() + << ", eta: " << JE->eta() + << ", phi: " << JE->phi() << endmsg; + } +#endif + + // change to a more standard phi definition + float je_phi = JE->phi(); + if( je_phi >= M_PI ) je_phi -= 2 * M_PI; + float transverse_energy = JE->energy()*1000.; + float cosh_eta = cosh(JE->eta()); + float energy = transverse_energy*cosh_eta; + // possibly do some calibration + + // now fill fast jet particles + float px = transverse_energy*cos(je_phi); + float py = transverse_energy*sin(je_phi); + float pz = transverse_energy*sinh(JE->eta()); + + if (m_doJetFinding){ + if (JE->energy() > 0.99){ // some Jet Elements have zero energy, there is no need to give these to fastjet + fastjet::PseudoJet pseudo_jet( px, py, pz, energy); + pseudo_jet.set_user_index(counter); + m_particles.push_back( pseudo_jet ); + } + // now fill these into a vector of floats so we can construct cleaning variables later + if (m_doCleaning) { + m_l1_tower_information.push_back(energy); + m_l1_tower_information.push_back(JE->eta()); + m_l1_tower_information.push_back(JE->phi()); + m_l1_tower_information.push_back(JE->emEnergy()*cosh_eta*1000.); + m_l1_tower_information.push_back(JE->hadEnergy()*cosh_eta*1000.); + } + } + counter++; + } + } // end of particle creation step + m_unpacking_timer->stop(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "A total of " << m_particles.size() << " L1 particles are to be clustered" << endmsg; + if (m_doCleaning) { (*m_log) << MSG::DEBUG << "A total of " << m_l1_tower_information.size()/5. << " are saved as L1 towers for the cleaning" << endmsg; } + } +#endif + // ===== now find the jets + m_jet_finding_timer->start(); + if (m_doJetFinding){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Performing jet finding " << endmsg; + } +#endif + // run the clustering, extract the jets + m_fastjet_timer->start(); + fastjet::ClusterSequence* cs(0); + cs = new fastjet::ClusterSequence(m_particles, *m_jet_def); + + m_jets = fastjet::sorted_by_pt(cs->inclusive_jets(m_pTmin)); // sorted by increasing pt + m_fastjet_timer->stop(); + std::reverse(m_jets.begin(),m_jets.end()); // sorted by decreasing pt + + // inspect the output jets and make some cleaning variables +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "== Resultant jets " << endmsg; + } +#endif + for (unsigned i = 0; i < m_jets.size(); ++i) { + m_constituents = fastjet::sorted_by_pt(cs->constituents(m_jets[i])); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " fastjet jet " << i + << ": Et: " << m_jets[i].e()/cosh(m_jets[i].eta()) + << " MeV, eta: " << m_jets[i].eta() + << ", phi: " << m_jets[i].phi_std() + << ", rapidity: " << m_jets[i].rapidity() + << ", n constituents: " << m_constituents.size() << endmsg; + } +#endif + int nLeadingCells = -9; + float em_energy = -9; + float em_frac = -9; + float had_energy = -9; + + if (m_doCleaning) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Computing cleaning variables "<< endmsg; + } +#endif + float total_energy = 0.; + //float had_frac = 0.; + em_energy = 0.; + em_frac = 0.; + had_energy = 0.; + //had_frac = 0.; + for (unsigned ii = 0; ii < m_constituents.size(); ++ii){ + int l1_id = m_constituents[ii].user_index(); + float energy = m_l1_tower_information.at((l1_id*5)); + float emEnergy = m_l1_tower_information.at((l1_id*5)+3); + float hadEnergy = m_l1_tower_information.at((l1_id*5)+4); + +#ifndef NDEBUG + float eta = m_l1_tower_information.at((l1_id*5)+1); + float phi = m_l1_tower_information.at((l1_id*5)+2); + float transverse_energy = energy / cosh(eta); + + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " constituent[" << std::setw(3) << ii + << "]: Et: " << std::setw(8) << m_constituents[ii].e()/cosh(m_constituents[ii].eta()) + //<< " MeV (em,had) (" << std::setw(8) << emEnergy/cosh(eta) + //<<"," << std::setw(8) << hadEnergy/cosh(eta) + << ", eta: " << std::setw(8) << m_constituents[ii].eta() + << ", phi: " << std::setw(8) << m_constituents[ii].phi_std() + << ", rapidity: " << std::setw(6) << m_constituents[ii].rapidity() + << ", user index: " << std::setw(5) << m_constituents[ii].user_index() << endmsg; + + (*m_log) << MSG::VERBOSE << " L1 tower[" << l1_id + << "]: Et: " << transverse_energy + << " GeV (em,had) (" << emEnergy / cosh(eta) + << "," << hadEnergy / cosh(eta) + << "), energy: " << energy + << ", eta: " << eta + << ", phi: " << phi << endmsg; + } +#endif + + // cleaning: + total_energy+=energy; + em_energy+=emEnergy; + had_energy+=hadEnergy; + m_cellenergies.push_back( energy ); + + } + + if (total_energy > 0.){ + em_frac = em_energy / total_energy; + //had_frac= had_energy / total_energy; + } + + // sort cell-energy vector. (most energetic cell at end of vector) + nLeadingCells = 0; + std::sort(m_cellenergies.begin(), m_cellenergies.end()); + float running_energy_sum = 0.; + for(int k = m_cellenergies.size()-1; k > -1; --k){ + running_energy_sum += m_cellenergies[k]; + nLeadingCells++; + if(running_energy_sum > m_leadingCellFraction*total_energy){ + break; + } + } +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " total Et: " << total_energy/cosh(m_jets[i].eta()) + << " MeV (em,had) (" << em_energy/cosh(m_jets[i].eta()) + << "," << had_energy/cosh(m_jets[i].eta()) + << "), em frac: " << em_frac + << ", had frac: " << (total_energy ? had_energy / total_energy : 0) + << ", nLeadingCells: " << nLeadingCells + << endmsg; + } +#endif + } + + // ========================= + // Record the final jet + // ========================= +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " making TrigT2Jet "<< endmsg; + } +#endif + + m_jet = new TrigT2Jet(); + + // Add RoI word to Jet + int outputType = T2L1::UNKNOWN; + if (m_doTriggerTowers){ + if (m_coneRadius==0.4){ + outputType = T2L1::A4TT; + } else if (m_coneRadius==1.0){ + outputType = T2L1::A10TT; + } else { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " unable to determine RoI type from m_coneRadius = " << m_coneRadius << ", setting output RoI type to UNKNOWN" << endmsg; +#endif + outputType = T2L1::UNKNOWN; + } + } else { + if (m_coneRadius==0.4){ + outputType = T2L1::A4JE; + } else if (m_coneRadius==1.0){ + outputType = T2L1::A10JE; + } else { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " unable to determine RoI type from m_coneRadius = " << m_coneRadius << ", setting output RoI type to UNKNOWN" << endmsg; +#endif + outputType = T2L1::UNKNOWN; + } + } + + m_jet->set_RoIword(T2L1::BLANKWORD+T2L1::INPUT*m_inputType+T2L1::OUTPUT*outputType+i); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG) + (*m_log) << MSG::DEBUG << " RoI word set to: " << std::hex << m_jet->RoIword() << std::dec << endmsg; +#endif + + // Set properties + m_jet->setE(m_jets[i].e()); + m_jet->setEta(m_jets[i].eta()); + m_jet->setPhi(m_jets[i].phi_std()); + m_jet->setEem0(em_energy); + m_jet->setEhad0(had_energy); + m_jet->setEmf(em_frac); + m_jet->setNLeadingCells(nLeadingCells); + + // look at the jet produced +#ifndef NDEBUG + if((*m_log).level() <= MSG::VERBOSE){ + (*m_log) << MSG::VERBOSE << " Values of T2CaloJet produced: " << endmsg; + (*m_log) << MSG::VERBOSE << " REGTEST: Jet eta = " << m_jet->eta() << endmsg; + (*m_log) << MSG::VERBOSE << " REGTEST: Jet phi = " << m_jet->phi() << endmsg; + (*m_log) << MSG::VERBOSE << " REGTEST: Jet energy = " << m_jet->e() << endmsg; + (*m_log) << MSG::VERBOSE << " REGTEST: Jet et = " << m_jet->et() << endmsg; + } +#endif + output_t2_jets->push_back(m_jet); + } // end of loop on found jets + + // delete the fast jet cluster sequence + delete cs; + } + m_jet_finding_timer->stop(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "FastJet completed in " << m_fastjet_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "Jet finding completed in " << m_jet_finding_timer->elapsed() << " ms " << endmsg; + } +#endif + m_total_timer->stop(); + // fill monitoring variables + n_towers = counter; + l1_unpack_time = m_load_collection_timer->elapsed(); + all_unpack_time = m_unpacking_timer->elapsed(); + fastjet_time = m_fastjet_timer->elapsed(); + all_jet_finding_time = m_jet_finding_timer->elapsed(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "================= Finished T2L1CaloFullScanFastJetTool " << name() << " in " << m_total_timer->elapsed() << " ms " << endmsg; + } +#endif + + return StatusCode::SUCCESS; +} + + +StatusCode T2L1CaloJetFullScanFastJetTool::finalize() +{ + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Finalising: T2L1CaloJetFullScanFastJetTool " << name() << endmsg; + } + delete m_log; + m_particles.clear(); + m_jets.clear(); + m_constituents.clear(); + m_l1_tower_information.clear(); + m_cellenergies.clear(); + + if ( bool(m_jet_def) ){ + delete m_jet_def; + } + return StatusCode::SUCCESS; +} + + + + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1TowerCalibTool.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1TowerCalibTool.cxx new file mode 100644 index 000000000000..4ba90e3381a9 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1TowerCalibTool.cxx @@ -0,0 +1,255 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: T2L1TowerCalibTool.cxx +PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet + +AUTHORS: Matthew Tamsett <tamsett@cern.ch>, Carlos Sandoval <csandova@mail.cern.ch> +CREATED: December 2011 + + +PURPOSE: Calibration tool for L1 towers. + + + +********************************************************************/ +#include "TrigT2CaloJet/T2L1TowerCalibTool.h" +#include "TrigCaloEvent/Trig3Momentum.h" +#include "TrigCaloEvent/TrigT2Jet.h" +#include "AthenaKernel/Timeout.h" + +#include "GaudiKernel/IToolSvc.h" + +//----------------------------------------------------------------- +// Constructor +//----------------------------------------------------------------- +T2L1TowerCalibTool::T2L1TowerCalibTool(const std::string& type, + const std::string& name, + const IInterface* parent): + T2CaloJetBaseTool(type, name, parent), + m_grid_element(0) +{ + declareInterface<T2L1TowerCalibTool>( this ); + // configurables + declareConstant("Calib_Factors", m_CalibConstants); + + +} + +//----------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------- +T2L1TowerCalibTool::~T2L1TowerCalibTool() +{ +} + +//----------------------------------------------------------------- +// Initialize: +//----------------------------------------------------------------- +StatusCode T2L1TowerCalibTool::initialize() +{ + m_log = new MsgStream(msgSvc(), name()); + (*m_log) << MSG::INFO << " Initalizing Tool: " << name () << endmsg; + + // output + m_grid_element = new Trig3Momentum(); + + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Execute +//----------------------------------------------------------------- +StatusCode T2L1TowerCalibTool::execute() +{ + return StatusCode::SUCCESS; +} + +StatusCode T2L1TowerCalibTool::execute(TrigT2Jet* jet, double /*etamin*/, double /*etamax*/, double /*phimin*/, double /*phimax*/) +{ + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "===== Executing: T2L1TowerCalibTool " << name() << endmsg; + } +#endif + + // === get the input particles + + std::vector<Trig3Momentum>* old_grid = jet->grid(); + std::vector<Trig3Momentum>* new_grid = new std::vector<Trig3Momentum>(); + new_grid->reserve(8000); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "A total of " << old_grid->size() << " particles are to be calibrated" << endmsg; + } +#endif + + // === Unpack the grid + std::vector<Trig3Momentum>::const_iterator begin_grid, end_grid; + begin_grid = old_grid->begin(); + end_grid = old_grid->end(); + int jet_counter = 0; + for (; begin_grid != end_grid; ++begin_grid){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::VERBOSE){ + (*m_log) << MSG::VERBOSE << " Initial Trig3Momentum[" << jet_counter + << "]: Et: " << begin_grid->e()/cosh(begin_grid->eta()) + << " MeV, eta: " << begin_grid->eta() + << ", phi: " << begin_grid->phi() + << ", sampling: " << std::hex << begin_grid->caloSample() << std::dec + << ", provenance: " << begin_grid->provenance() << endmsg; + } +#endif + // calibrate the towers + double transverse_energy_uncorrected = begin_grid->e()/cosh(begin_grid->eta()); + if (begin_grid->provenance()!=9999){ + // If provenance is set then this tower has been split into its EM and HAD components for clustering. + // Calibration is currently based on the sum of energy, therefore we must recover the sum energy before + // obtaining the calibration factor + double extra_energy = old_grid->at(begin_grid->provenance()).e()/cosh(begin_grid->eta()); + transverse_energy_uncorrected = transverse_energy_uncorrected + extra_energy; +#ifndef NDEBUG + if((*m_log).level() <= MSG::VERBOSE){ + (*m_log) << MSG::VERBOSE << " - EM + HAD ET: " << transverse_energy_uncorrected << endmsg; + } +#endif + } + + int eta_bin = GetEtaBin(begin_grid->eta() ); + int phi_bin = GetPhiBin(begin_grid->phi()); + int et_bin = GetEtBin(transverse_energy_uncorrected); + double CalibFactor = GetEtaCalibFactor(eta_bin,phi_bin,et_bin); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::VERBOSE){ + (*m_log) << MSG::VERBOSE << " - Eta Bin: " << eta_bin << endmsg; + (*m_log) << MSG::VERBOSE << " - Phi Bin: " << phi_bin << endmsg; + (*m_log) << MSG::VERBOSE << " - Et Bin: " << et_bin << endmsg; + (*m_log) << MSG::VERBOSE << " - CalibFactor: " << CalibFactor << endmsg; + } +#endif + + double corrected_transverse_energy = (begin_grid->e()/cosh(begin_grid->eta()))*CalibFactor; + double corrected_energy = corrected_transverse_energy*cosh(begin_grid->eta() ); + + m_grid_element->setE(corrected_energy); + m_grid_element->setEta(begin_grid->eta()); + m_grid_element->setPhi(begin_grid->phi()); + m_grid_element->setCaloSample(begin_grid->caloSample()); + + new_grid->push_back(*m_grid_element); + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << " Calibrated Trig3Momentum[" << jet_counter + << "]: Et: " << m_grid_element->e()/cosh(m_grid_element->eta()) + << " MeV, eta: " << m_grid_element->eta() + << ", phi: " << m_grid_element->phi() + << ", sampling: " << std::hex << m_grid_element->caloSample() << std::dec << endmsg; + } +#endif + jet_counter++; + + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "A total of " << new_grid->size() << " particles were calibrated" << endmsg; + } +#endif + + jet->setGrid(new_grid); + delete old_grid; + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "===== Finished: T2L1TowerCalibTool " << name() << endmsg; + } +#endif + + return StatusCode::SUCCESS; +} + + +//----------------------------------------------------------------- +// Finalize: +//----------------------------------------------------------------- +StatusCode T2L1TowerCalibTool::finalize() +{ + delete m_log; + delete m_grid_element; + return StatusCode::SUCCESS; +} + +//----------------------------------------------------------------- +// Calibration tools: +//----------------------------------------------------------------- +StatusCode T2L1TowerCalibTool::setProperty (const std::string& propname, + const std::string& value) +{ + StatusCode sc = AlgTool::setProperty (propname, value); + if (sc.isFailure()) return sc; + + sc=CaloRec::ToolWithConstantsMixin::setProperty (propname, value); + if (sc.isFailure()) return sc; + + return StatusCode::SUCCESS; +} + +StatusCode T2L1TowerCalibTool::setProperty (const Property& p) +{ + StatusCode sc=AlgTool::setProperty (p); + if (sc.isFailure()) return sc; + + sc=CaloRec::ToolWithConstantsMixin::setProperty (p); + if (sc.isFailure()) return sc; + + return StatusCode::SUCCESS; + +} + +int T2L1TowerCalibTool::GetEtaBin(double jet_eta) +{ + //45 eta bins + int ieta=int(((jet_eta*10)+45)/2); + // if (jet_eta<0) ieta-=1; + if ( ieta < 0 ) return 0; + if ( ieta > 43 ) return 44; + return ieta; +} + + +int T2L1TowerCalibTool::GetPhiBin(double jet_phi) +{ + //32 eta bins + int iphi=int(((jet_phi*10)+M_PI*10)/2); + // if (jet_eta<0) ieta-=1; + if ( iphi < 0 ) return 0; + if ( iphi > 31 ) return 31; + return iphi; +} + + + +int T2L1TowerCalibTool::GetEtBin(double jet_et) +{ + //21 Et bins + int iet = int(log10(jet_et/1000.)*10-10); + if ( iet < 0 ) return 0; + if ( iet > 19 ) return 20; + return iet; +} + + +double T2L1TowerCalibTool::GetEtaCalibFactor(int etabin, int /* phibin */, int etbin) +{ + return m_CalibConstants[etabin][etbin]; +} + + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1Unpacking.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1Unpacking.cxx new file mode 100644 index 000000000000..008cfa2e914a --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/T2L1Unpacking.cxx @@ -0,0 +1,649 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2L1Unpacking.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloJet +// +// AUTHOR: Matthew Tamsett, tamsett@cern.ch +// +// Description: Level 1.5 unpacking FEX algorithm +// ******************************************************************** + +#include "TrigT2CaloJet/T2L1Unpacking.h" +#include "TrigCaloEvent/Trig3Momentum.h" +#include "TrigCaloEvent/TrigT2Jet.h" +//#include "TrigCaloEvent/TrigT2JetContainer.h" +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" + +#include "TrigT1CaloByteStream/ITrigT1CaloDataAccess.h" +#include "TrigT1CaloToolInterfaces/IL1JetTools.h" +#include "TrigT1CaloEvent/TriggerTower.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + + + +T2L1Unpacking::T2L1Unpacking(const std::string & name, ISvcLocator* pSvcLocator) + : HLT::AllTEAlgo(name, pSvcLocator), + m_tools(this), + //m_total_timer(0), + m_l1_unpacking_timer(0), + m_unpacking_timer(0), + m_calibration_timer(0), + m_RoI_timer(0), + m_dataL1("LVL1BS__TrigT1CaloDataAccess/TrigT1CaloDataAccess",0), + m_jet(0), + m_grid_element(0) +{ + // configurables + declareProperty("TrigT1CaloDataAccess", m_dataL1, "L1 Calo Data Access"); + declareProperty("jetOutputKey", m_jetOutputKey = "T2L1Towers"); + declareProperty("doTriggerTowers", m_doTriggerTowers = false); + declareProperty("T2JetTools", m_tools, "list of Jet tools"); + + // monitoring + declareMonitoredVariable("L1UnpckTime", m_L1UnpckTime); + declareMonitoredVariable("UnpckTime", m_UnpckTime); + declareMonitoredVariable("CalibrationTime",m_CalibrationTime); + declareMonitoredVariable("RoITime", m_RoITime); + //declareMonitoredVariable("OverallTime", m_TotalTime); + declareMonitoredVariable("nTowers", m_nTowers); + declareMonitoredVariable("nEMTowers", m_nEMTowers); + declareMonitoredVariable("nHADTowers", m_nHADTowers); + declareMonitoredVariable("nTowers_zoom", m_nTowers); + declareMonitoredVariable("nEMTowers_zoom", m_nEMTowers); + declareMonitoredVariable("nHADTowers_zoom",m_nHADTowers); + declareMonitoredStdContainer("Et", m_et); + declareMonitoredStdContainer("EtEM", m_et_em); + declareMonitoredStdContainer("EtHAD", m_et_had); + declareMonitoredStdContainer("Eta", m_eta); + declareMonitoredStdContainer("EtaEM", m_eta_em); + declareMonitoredStdContainer("EtaHAD", m_eta_had); + declareMonitoredStdContainer("Phi", m_phi); + declareMonitoredStdContainer("PhiEM", m_phi_em); + declareMonitoredStdContainer("PhiHAD", m_phi_had); + +} + +HLT::ErrorCode T2L1Unpacking::hltInitialize() +{ + m_log = new MsgStream(msgSvc(), name()); + + if((*m_log).level() <= MSG::INFO){ + (*m_log) << MSG::INFO << " Initalizing FEX algorithm: " << name() << endmsg; + //(*m_log) << MSG::DEBUG << "Options: " << endmsg; + } + + // Initialize timing service + if( service( "TrigTimerSvc", m_pTimerService).isFailure() ) { + (*m_log) << MSG::WARNING << name() << ": Unable to locate TrigTimer Service" << endmsg; + } + + if (m_pTimerService){ + (*m_log) << MSG::DEBUG << " Adding timers" << endmsg; + //Add timers + //m_total_timer = addTimer("total_time"); + m_l1_unpacking_timer = addTimer("l1_unpacking_time"); + m_unpacking_timer = addTimer("unpacking_time"); + m_calibration_timer = addTimer("calibration_time"); + m_RoI_timer = addTimer("RoI_time"); + } + + // Create helper tools + if ( m_dataL1.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_dataL1 << endmsg; + m_retrievedJetTool = false; + } else { + m_retrievedJetTool = true; + (*m_log) << MSG::DEBUG << "Retrieved " << m_dataL1 << endmsg; + } + + if ( m_tools.retrieve().isFailure() ) { + (*m_log) << MSG::ERROR << "Failed to retreive helper tools: " << m_tools << endmsg; + } else { + (*m_log) << MSG::INFO << "Retrieved " << m_tools << endmsg; + } + + // settings for Trigger tower retrieval + m_etaMin = -5.; + m_etaMax = 5.; + m_phiMin = 0.; + m_phiMax = 2 * M_PI; + m_fullScan = true; + + /// aha! fullscan should be from -pi to pi + + // output + m_grid_element = new Trig3Momentum(); + + + + return HLT::OK; +} + +T2L1Unpacking::~T2L1Unpacking(){ +} + +HLT::ErrorCode T2L1Unpacking::hltExecute(std::vector<std::vector<HLT::TriggerElement*> >& /*tes_in*/, + unsigned int type_out) +{ + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + beforeExecMonitors().ignore(); + + // ==== pre-execute setup + if(doTiming()) { + //m_total_timer->reset(); + m_l1_unpacking_timer->reset(); + m_unpacking_timer->reset(); + m_calibration_timer->reset(); + m_RoI_timer->reset(); + //m_total_timer->start(); + } + m_nTowers = -99; + m_nEMTowers = -99; + m_nHADTowers = -99; + m_UnpckTime = -99; + m_RoITime = -99; + //m_TotalTime = -99; + m_et.clear(); + m_et_em.clear(); + m_et_had.clear(); + m_eta.clear(); + m_eta_em.clear(); + m_eta_had.clear(); + m_phi.clear(); + m_phi_em.clear(); + m_phi_had.clear(); + + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "================= Executing T2L1Unpacking FEX " << name() << endmsg; + + } +#endif + + // === setup the output trigger element + if(doTiming()) m_RoI_timer->start(); + + TrigRoiDescriptor* roi = new TrigRoiDescriptor( true ); + + HLT::TriggerElement* outputTE = addRoI(type_out, roi ); /// NB: a fullscan RoI !!! + outputTE->setActiveState(true); + if(doTiming()) m_RoI_timer->stop(); + + if(doTiming()) m_unpacking_timer->start(); + std::vector<Trig3Momentum>* grid = new std::vector<Trig3Momentum>(); + grid->reserve(8000); + + // === unpacking + int counter = 0; + uint16_t tower_by_sampling_counter = 0; + int recorded_counter = 0; + int EM_recorded_counter = 0; + int HAD_recorded_counter = 0; + if ( m_doTriggerTowers ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Trigger tower version" <<endmsg; + } +#endif + // now get TT's + DataVector<LVL1::TriggerTower>::const_iterator tt_begj, tt_endj; + if ( m_retrievedJetTool ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loading the L1 data using ITrigT1CaloDataAccess tool"<< endmsg; + (*m_log) << MSG::DEBUG << "Getting trigger towers using " + << " roi: " << *roi + // << " etaMin: " << m_etaMin + // << ", etaMax: " << m_etaMax + // << ", phiMin: " << m_phiMin + // << ", phiMax: " << m_phiMax + << ", full: " << m_fullScan << endmsg; + } +#endif + if(doTiming()) m_l1_unpacking_timer->start(); + StatusCode sc = m_dataL1->loadCollection( tt_begj, tt_endj, + roi->etaMinus(), roi->etaPlus(), + roi->phiMinus(), roi->phiPlus(), roi->isFullscan() ); + if(doTiming()) m_l1_unpacking_timer->stop(); + if (sc.isFailure()) { + (*m_log) << MSG::WARNING << "Error accessing trigger tower data" << endmsg; + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loaded trigger towers in "<< m_l1_unpacking_timer->elapsed() << " ms" << endmsg; + (*m_log) << MSG::DEBUG << "Looping over trigger towers"<< endmsg; + } +#endif + } + for(; tt_begj!=tt_endj;++tt_begj){ + const LVL1::TriggerTower* TT = (*tt_begj); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "TriggerTower[" << counter + << "]: ETs [GeV]: EM: " << TT->emEnergy() + << ", HAD: " << TT->hadEnergy() + << ", eta: " << TT->eta() + << ", phi: " << TT->phi() << endmsg; + } +#endif + counter++; + // To remove ambiguities due to degenerate distance measures we deform the calorimeter: + // low eta, low phi cells are marginally closer together than high eta, high phi cells. + // + // It's best to use slightly different deformations for eta and phi. + // taken from recomendation 5. from here: http://fastjet.fr/FAQ.html + double tt_eta = TT->eta() + 1.000000e-6 * pow(TT->eta(),2); + double tt_phi = TT->phi() + 1.047198e-6 * pow(TT->phi(),2); + // change to a more standard phi definition + if( tt_phi >= M_PI ) tt_phi -= 2 * M_PI; + double transverse_energy = (TT->emEnergy() + TT->hadEnergy())*1000.; + //double cosh_eta = cosh(tt_eta); + //double energy = transverse_energy*cosh_eta; + // possibly do some calibration + + + if (transverse_energy > 0.99){ // some Jet Elements have zero energy (this may also be true for trigger towers), there is no need to give these to fastjet + // Set properties, EM and HAD seperately + // EM + if (TT->emEnergy()){ + tower_by_sampling_counter++; + double this_eta = determineTriggerTowerEta(tt_eta,true); + double this_cosh_eta = cosh(this_eta); + m_grid_element->setE((TT->emEnergy()*1000.)*this_cosh_eta); + m_grid_element->setEta(this_eta); // map this eta to a physical eta + m_grid_element->setPhi(tt_phi); + CaloSampling::CaloSample sampling = determineCaloSampling(fabs(tt_eta), true); + m_grid_element->setCaloSample(sampling); + if (TT->hadEnergy()){ + // record provenance of this jet + // in this context this means that if the tower was split into two we keep the index of its other half + m_grid_element->setProvenance(tower_by_sampling_counter); + } else { + m_grid_element->setProvenance(uint16_t(9999)); + } + + grid->push_back(*m_grid_element); + EM_recorded_counter++; + // Monitor + m_et_em.push_back( TT->emEnergy()*1000. ); + m_eta_em.push_back( m_grid_element->eta() ); + m_phi_em.push_back( m_grid_element->phi() ); + + } + // HAD + if (TT->hadEnergy()){ + tower_by_sampling_counter++; + double this_eta = determineTriggerTowerEta(tt_eta,false); + double this_cosh_eta = cosh(this_eta); + m_grid_element->setE((TT->hadEnergy()*1000.)*this_cosh_eta); + m_grid_element->setEta(this_eta); // map this eta to a physical eta + m_grid_element->setPhi(tt_phi); + CaloSampling::CaloSample sampling = determineCaloSampling(fabs(tt_eta), false); + m_grid_element->setCaloSample(sampling); + if (TT->emEnergy()){ + // record provenance of this jet + // in this context this means that if the tower was split into two we keep the index of its other half + m_grid_element->setProvenance(tower_by_sampling_counter-2); + } else { + m_grid_element->setProvenance(uint16_t(9999)); + } + + grid->push_back(*m_grid_element); + HAD_recorded_counter++; + // Monitor + m_et_had.push_back( TT->hadEnergy()*1000. ); + m_eta_had.push_back( m_grid_element->eta() ); + m_phi_had.push_back( m_grid_element->phi() ); + } + + // Monitor + recorded_counter++; + m_et.push_back( transverse_energy ); + m_eta.push_back( tt_eta ); + m_phi.push_back( tt_phi ); + + } + } + } else { // if we aren't running on trigger towers we use jet elements instead +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Jet element version" <<endmsg; + } +#endif + DataVector<LVL1::JetElement>::const_iterator je_begj, je_endj; + + if ( m_retrievedJetTool ){ +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loading the L1 data using ITrigT1CaloDataAccess tool, this loads the jet elements for the entire event"<< endmsg; + } +#endif + if(doTiming()) m_l1_unpacking_timer->start(); + StatusCode sc = m_dataL1->loadCollection(je_begj,je_endj); + if(doTiming()) m_l1_unpacking_timer->stop(); + if (sc.isFailure()) { + (*m_log) << MSG::WARNING << "Error accessing jet element data" << endmsg; + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Loaded jet elements in "<< m_l1_unpacking_timer->elapsed() << " ms" << endmsg; + (*m_log) << MSG::DEBUG << "Looping over jet elements"<< endmsg; + } +#endif + } + + for(; je_begj!=je_endj;++je_begj){ + const LVL1::JetElement* JE = (*je_begj); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "JetElement[" << counter + << "]: ETs [GeV]: EM: " << JE->emEnergy() + << ", HAD: " << JE->hadEnergy() + << ", Total: " << JE->energy() + << ", eta: " << JE->eta() + << ", phi: " << JE->phi() << endmsg; + } +#endif + counter++; + // To remove ambiguities due to degenerate distance measures we deform the calorimeter: + // low eta, low phi cells are marginally closer together than high eta, high phi cells. + // + // It's best to use slightly different deformations for eta and phi. + // taken from recomendation 5. from here: http://fastjet.fr/FAQ.html + double je_eta = JE->eta() + 1.000000e-6 * pow(JE->eta(),2); + double je_phi = JE->phi() + 1.047198e-6 * pow(JE->phi(),2); + // change to a more standard phi definition + if( je_phi >= M_PI ) je_phi -= 2 * M_PI; + double transverse_energy = (JE->energy())*1000.; + double cosh_eta = cosh(je_eta); + //double energy = transverse_energy*cosh_eta; + // possibly do some calibration + + + if (transverse_energy > 0.99){ // some Jet Elements have zero energy, there is no need to give these to fastjet + // Set properties, EM and HAD seperately + // EM + if (JE->emEnergy()){ + tower_by_sampling_counter++; + m_grid_element->setE((JE->emEnergy()*1000.)*cosh_eta); + m_grid_element->setEta(je_eta); + m_grid_element->setPhi(je_phi); + CaloSampling::CaloSample sampling = determineCaloSampling(fabs(je_eta), true); + m_grid_element->setCaloSample(sampling); + if (JE->hadEnergy()){ + // record provenance of this jet + // in this context this means that if the tower was split into two we keep the index of its other half + m_grid_element->setProvenance(tower_by_sampling_counter); + } else { + m_grid_element->setProvenance(uint16_t(9999)); + } + + grid->push_back(*m_grid_element); + EM_recorded_counter++; + // Monitor + m_et_em.push_back( JE->emEnergy()*1000. ); + m_eta_em.push_back( m_grid_element->eta() ); + m_phi_em.push_back( m_grid_element->phi() ); + + } + // HAD + if (JE->hadEnergy()){ + tower_by_sampling_counter++; + m_grid_element->setE((JE->hadEnergy()*1000.)*cosh_eta); + m_grid_element->setEta(je_eta); + m_grid_element->setPhi(je_phi); + CaloSampling::CaloSample sampling = determineCaloSampling(fabs(je_eta), false); + m_grid_element->setCaloSample(sampling); + if (JE->emEnergy()){ + // record provenance of this jet + // in this context this means that if the tower was split into two we keep the index of its other half + m_grid_element->setProvenance(tower_by_sampling_counter-2); + } else { + m_grid_element->setProvenance(uint16_t(9999)); + } + + grid->push_back(*m_grid_element); + HAD_recorded_counter++; + // Monitor + m_et_had.push_back( JE->hadEnergy()*1000. ); + m_eta_had.push_back( m_grid_element->eta() ); + m_phi_had.push_back( m_grid_element->phi() ); + } + + // Monitor + recorded_counter++; + m_et.push_back( transverse_energy ); + m_eta.push_back( je_eta ); + m_phi.push_back( je_phi ); + } + } + } + + // monitor + //m_nTowers = outJets->size(); + m_nTowers = recorded_counter; + m_nEMTowers = EM_recorded_counter; + m_nHADTowers = HAD_recorded_counter; + if(doTiming()) m_unpacking_timer->stop(); + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "A total of " << grid->size() << " L1 particles are to be clustered" << endmsg; + } + + if((*m_log).level() <= MSG::VERBOSE){ + std::vector<Trig3Momentum>::const_iterator begin_jet, end_jet; // iterators for the produced jets + begin_jet = grid->begin(); + end_jet = grid->end(); + int jet_counter = 0; + for (; begin_jet != end_jet; ++begin_jet){ + (*m_log) << MSG::VERBOSE << "Trig3Momentum[" <<jet_counter + << "]: Et: " << begin_jet->e()/cosh(begin_jet->eta()) + << " MeV, " + << "eta: " << begin_jet->eta() + << ", phi: " << begin_jet->phi() + << ", sampling: " << std::hex << begin_jet->caloSample() << std::dec + << ", provenance: " << begin_jet->provenance() << endmsg; + jet_counter++; + } + } +#endif + + if(doTiming()) m_RoI_timer->start(); + m_jet = new TrigT2Jet(); + m_jet->setGrid(grid); + //// RoI word +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Making TrigT2Jet to save" << endmsg; + } +#endif + if(doTiming()) m_RoI_timer->pause(); + + // do loop over tools, e.g tower level correction tool + // === calibration + if(doTiming()) m_calibration_timer->start(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << m_tools.size() << " calibration tools to be run"<< endmsg; + + } +#endif + + ToolHandleArray< T2CaloJetBaseTool >::iterator it = m_tools.begin(), + itToolEnd = m_tools.end(); + int current=1; + for (; it != itToolEnd; ++it) { +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "Executing tool [" << current << "]"<< endmsg; + } +#endif + if ((*it)->execute(m_jet, TrigRoiDescriptor(true), caloDDENull ).isFailure()){ // the zeros are the unused eta phi coordinates used by many base tools to define the RoI region + msg() << MSG::WARNING << "T2CaloFastJet AlgToolJets returned Failure" << endmsg; + return HLT::ErrorCode(HLT::Action::ABORT_CHAIN,HLT::Reason::USERDEF_1); + } + current++; + } + if(doTiming()) m_calibration_timer->stop(); + + // === finaly recored the output jet + if(doTiming()) m_RoI_timer->resume(); + std::string key = ""; + HLT::ErrorCode stat = recordAndAttachFeature(outputTE, m_jet, key, m_jetOutputKey); + if (stat != HLT::OK){ + (*m_log) << MSG::ERROR << "recording of TrigT2Jets into StoreGate failed" << endmsg; + return stat; + } + if(doTiming()) m_RoI_timer->stop(); + + + // === post-execute admin + if(doTiming()) { + //m_total_timer->stop(); + m_L1UnpckTime = m_l1_unpacking_timer->elapsed(); + m_UnpckTime = m_unpacking_timer->elapsed(); + m_RoITime = m_RoI_timer->elapsed(); + //m_TotalTime = m_total_timer->elapsed(); +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "L1 unpacking completed in " << m_l1_unpacking_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "All unpacking completed in " << m_unpacking_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "Calibration completed in " << m_calibration_timer->elapsed() << " ms " << endmsg; + (*m_log) << MSG::DEBUG << "RoI making completed in " << m_RoI_timer->elapsed() << " ms " << endmsg; + //(*m_log) << MSG::DEBUG << "T2L1Unpacking completed in " << m_total_timer->elapsed() << " ms " << endmsg; + } +#endif + } + +#ifndef NDEBUG + if((*m_log).level() <= MSG::DEBUG){ + (*m_log) << MSG::DEBUG << "================= Finished T2L1Unpacking " << name() << endmsg; + } +#endif + + // since this is an AllTEAlgo, we have to call the monitoring ourselves: + afterExecMonitors().ignore(); + + return HLT::OK; +} + + +HLT::ErrorCode T2L1Unpacking::hltFinalize() +{ + if ( (*m_log).level() <= MSG::DEBUG ) + (*m_log) << MSG::DEBUG << "Finalizing T2L1Unpacking FEX " << name() << endmsg; + + m_et.clear(); + m_et_em.clear(); + m_et_had.clear(); + m_eta.clear(); + m_eta_em.clear(); + m_eta_had.clear(); + m_phi.clear(); + m_phi_em.clear(); + m_phi_had.clear(); + delete m_grid_element; + m_grid_element = 0; + + delete m_log; + + return HLT::OK; +} + +double T2L1Unpacking::determineTriggerTowerEta(double eta, bool isEM) +{ + /* + Determines a more realistic eta coordinate for the forward trigger towers + + The mapping used is: + * "EM" + ---- + Tower "eta" : -4.7 -4.3 -3.8 -3.4 3.4 3.8 4.3 4.7 + Physical eta: -4.45 -3.75 -3.35 -3.15 3.15 3.35 3.75 4.45 + Module : FCAL1 FCAL1 FCAL1 FCAL1 FCAL1 FCAL1 FCAL1 FCAL1 + + * "Had": + ------ + Tower "eta" : -4.7 -4.3 -3.8 -3.4 3.4 3.8 4.3 4.7 + Physical eta: -4.2 -4.2 -3.4 -3.4 3.4 3.4 4.2 4.2 + Module : FCAL2 FCAL3 FCAL2 FCAL3 FCAL2 FCAL3 FCAL2 FCAL3 + + You'll note that each L1 tower is either FCAL2 or FCAL3, not the sum of the two. + */ + + double fabs_eta = fabs(eta); + + if (fabs_eta < 3.3) return eta; // for non-forward towers return eta + + double sign_eta = 1; + if (eta < 0.) sign_eta = -1; + + if (fabs_eta > 4.5){ + if (isEM) return sign_eta*4.45; + return sign_eta*4.2; + + } else if (fabs_eta > 4.1){ + if (isEM) return sign_eta*3.75; + return sign_eta*4.2; + + } else if (fabs_eta > 3.6){ + if (isEM) return sign_eta*3.35; + return sign_eta*3.4; + + } else { + if (isEM) return sign_eta*3.15; + return sign_eta*3.4; + } +} + +CaloSampling::CaloSample T2L1Unpacking::determineCaloSampling(double fabs_eta, bool isEM) +{ + /* + Determine the calo sampling of trigger towers and jet elements based on their eta + + For Trigger towers this mapping is + EM layer: |eta| = 0 - 1.5 LArg EM Barrel + |eta| = 1.4 - 3.2 LArg EM Endcap: note the overlap here + + Had layer: |eta| = 0 - 0.9 Tile Long Barrel + |eta| = 0.9 - 1.5 Tile Extended Barrel + |eta| = 1.5 - 3.2 LArg Hadronic Endcap + + FCAL: anything above |eta| = 3.2 + + In addition, for jet elements: + [em] |eta| = 1.4-1.6 spans EMB+EMEC (1.5 in JE eta) + + [had] |eta| = 0.8-1.0 partly tile barrel, partly extended barrel (0.9 in JE eta) + |eta| = 1.4-1.6 Tile-HEC transition (1.5 in JE eta) + + [em?] |eta| = 2.4-2.7, i.e. the OW+IW boundary. (2.55 in JE eta) + + As these are summed over layers we'll return the middle sampling + */ + + if (fabs_eta > 3.2) { // FCAL + if (isEM) return CaloSampling::FCAL0; // EM FCAL + return CaloSampling::FCAL1; // HAD FCAL + } else if (isEM && (fabs_eta < 1.4)) { // EM, cut at 1.4 assigns overlap region to the EME + return CaloSampling::EMB1; + } else if (isEM) { + return CaloSampling::EME1; + } else if (fabs_eta < 0.8) { // HAD, cut at 0.8 assigns overlap region to TileExt + return CaloSampling::TileBar1; + } else if (fabs_eta < 1.4) { // cut at 1.4 assigne overlap region to HEC + return CaloSampling::TileExt1; + } else { + return CaloSampling::HEC1; + } +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/Trig3MomentumMerger.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/Trig3MomentumMerger.cxx new file mode 100644 index 000000000000..daa54180b57f --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/Trig3MomentumMerger.cxx @@ -0,0 +1,140 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigT2CaloJet/Trig3MomentumMerger.h" + +#include <iostream> +#include <algorithm> +#include <cmath> // M_PI, fabs + +//------------------------------------------------ +Trig3MomentumMerger::Trig3MomentumMerger() : +m_hashMap(), m_gridsHandler() +{ +} +//------------------------------------------------ +void resetCell(HashedTrig3Momentum &c) +{ + c.reset(); +} +//------------------------------------------------ +// match criterion to be used with find_if +struct HashMatchCriterion +{ + HashMatchCriterion(const u_int value, const EtaPhiSampleHash &hm): + hash_(value), m_hashMap(hm) {}; + bool operator() (const HashedTrig3Momentum &cell) { + return hash_ == cell.hash(); + }; + u_int hash_; + EtaPhiSampleHash m_hashMap; +}; + +//------------------------------------------------ +// functor to be used with for_each +struct CellMerger +{ + CellMerger(const EtaPhiSampleHash &hm, GridsHandler &gridsHandler) : + hm_(hm), m_gridsHandler(gridsHandler) {} + void operator() (const Trig3Momentum &t3m) { + u_int hash(hm_.hash(t3m)); + HashMatchCriterion hmc(hash, hm_); + Vmc &grid = m_gridsHandler.grid(t3m.caloSample()); + Vmc::iterator mergeCell = find_if(grid.begin(), grid.end(), hmc); + if(mergeCell != grid.end()) mergeCell->addE(t3m); + else grid.push_back(HashedTrig3Momentum(t3m, hash)); + } + EtaPhiSampleHash hm_; + GridsHandler &m_gridsHandler; +}; +//------------------------------------------------ +bool Trig3MomentumMerger::mergeCells(const Vt3m &input, Vt3m &output) +{ + m_gridsHandler.clearAllGrids(); + CellMerger merger(m_hashMap, m_gridsHandler); + std::for_each(input.begin(), input.end(), merger); + m_gridsHandler.appendAllGrids(output); + return true; +} +//------------------------------------------------ +unsigned int Trig3MomentumMerger::expectedLength(const Vt3m &input) +{ + // 4*4 b/c we should reduce the (eta,phi) granularity from 0.025x0.025 -> 0.1x0.1 + unsigned int expectedRedFactor=4*4; + return input.size()/expectedRedFactor; +} +//------------------------------------------------ +void testEtaPhiSampleHash(){ + using std::cout; + using std::endl; + double epsilon = 1.0e-9; + double eta = EtaPhiSampleHash::kMinEta + epsilon; + double phi = EtaPhiSampleHash::kMinPhi + epsilon; + double dEta(2.0*5.0/100.), dPhi(2.0*M_PI/64.); + const int nSamples = 25; + // drop this and use GridsHandler::allSamples_ + CaloSampling::CaloSample samples[nSamples] = + { + CaloSampling::PreSamplerB, + CaloSampling::EMB1, + CaloSampling::EMB2, + CaloSampling::EMB3, + CaloSampling::PreSamplerE, + CaloSampling::EME1, + CaloSampling::EME2, + CaloSampling::EME3, + CaloSampling::HEC0, + CaloSampling::HEC1, + CaloSampling::HEC2, + CaloSampling::HEC3, + CaloSampling::TileBar0, + CaloSampling::TileBar1, + CaloSampling::TileBar2, + CaloSampling::TileGap1, + CaloSampling::TileGap2, + CaloSampling::TileGap3, + CaloSampling::TileExt0, + CaloSampling::TileExt1, + CaloSampling::TileExt2, + CaloSampling::FCAL0, + CaloSampling::FCAL1, + CaloSampling::FCAL2, + CaloSampling::Unknown + }; + + CaloSampling::CaloSample sample = CaloSampling::PreSamplerB; + EtaPhiSampleHash eph; + int iSample(0); + eta = EtaPhiSampleHash::kMinEta + epsilon; + while(eta<EtaPhiSampleHash::kMaxEta){ + phi = EtaPhiSampleHash::kMinPhi + epsilon; + while(phi<EtaPhiSampleHash::kMaxPhi){ + iSample = 0; + while(iSample<nSamples){ + sample = samples[iSample]; + u_int hash(eph.hash(eta,phi,sample)); + cout<<"(eta, phi, sample) " + <<"= ("<<eta<<", "<<phi<<", "<<sample<<")" + <<" -> "<<hash<<endl; + double oEta(0.), oPhi(0.); + CaloSampling::CaloSample oSample(CaloSampling::Unknown); + eph.etaPhiSample(hash, oEta, oPhi, oSample); + if(fabs(eta-oEta)>dEta) + cout<<"deltaEta("<<hash<<", "<<fabs(eta-oEta)<<")" + <<" : in "<<eta<<" out "<<oEta<<endl; + if(fabs(phi-oPhi)>dPhi) + cout<<"deltaPhi("<<hash<<", "<<fabs(phi-oPhi)<<")" + <<" : in "<<phi<<" out "<<oPhi<<endl; + if(sample!=oSample) + cout<<"sample("<<hash<<")" + <<" : in "<<sample<<" out "<<oSample<<endl; + iSample++; + } // end while(iSample) + phi += dPhi; + } // end while(phi) + eta += dEta; + } // end while(eta) +} +//------------------------------------------------ + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloJet/src/components/TrigT2CaloJet_entries.cxx b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/components/TrigT2CaloJet_entries.cxx new file mode 100644 index 000000000000..3fb3d02c56c9 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloJet/src/components/TrigT2CaloJet_entries.cxx @@ -0,0 +1,35 @@ +#include "TrigT2CaloJet/T2CaloJet.h" +#include "TrigT2CaloJet/T2L1CaloJet.h" +#include "TrigT2CaloJet/T2L1CaloFullScanJet.h" +#include "TrigT2CaloJet/T2L1Unpacking.h" +#include "TrigT2CaloJet/Trig3MomentumMerger.h" +#include "TrigT2CaloJet/T2AllRoiUnpacking.h" +#include "TrigT2CaloJet/T2CaloFastJet.h" +#include "TrigT2CaloJet/T2CaloJetBaseTool.h" +#include "TrigT2CaloJet/T2CaloJetConeTool.h" +#include "TrigT2CaloJet/T2CaloJetCalibTool.h" +#include "TrigT2CaloJet/T2CaloJetGridFromCells.h" +#include "TrigT2CaloJet/T2CaloJetGridFromFEBHeader.h" +#include "TrigT2CaloJet/T2CaloJetGridFromLvl1Ppr.h" +#include "TrigT2CaloJet/T2L1CaloJetFullScanBaseTool.h" +#include "TrigT2CaloJet/T2L1CaloJetFullScanFastJetTool.h" +#include "TrigT2CaloJet/T2L1TowerCalibTool.h" +#include "TrigT2CaloJet/T2L1CaloJetCalibTool.h" + +DECLARE_COMPONENT( T2CaloJet ) +DECLARE_COMPONENT( T2L1CaloJet ) +DECLARE_COMPONENT( T2L1CaloFullScanJet ) +DECLARE_COMPONENT( T2CaloFastJet ) +DECLARE_COMPONENT( T2L1Unpacking ) +DECLARE_COMPONENT( T2AllRoiUnpacking ) +DECLARE_COMPONENT( T2CaloJetBaseTool ) +DECLARE_COMPONENT( T2CaloJetConeTool ) +DECLARE_COMPONENT( T2CaloJetCalibTool ) +DECLARE_COMPONENT( T2CaloJetGridFromCells ) +DECLARE_COMPONENT( T2CaloJetGridFromFEBHeader ) +DECLARE_COMPONENT( T2CaloJetGridFromLvl1Ppr ) +DECLARE_COMPONENT( T2L1CaloJetFullScanBaseTool ) +DECLARE_COMPONENT( T2L1CaloJetFullScanFastJetTool ) +DECLARE_COMPONENT( T2L1TowerCalibTool ) +DECLARE_COMPONENT( T2L1CaloJetCalibTool ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigT2CaloTau/CMakeLists.txt new file mode 100644 index 000000000000..3c3d84b5f7eb --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/CMakeLists.txt @@ -0,0 +1,42 @@ +################################################################################ +# Package: TrigT2CaloTau +################################################################################ + +# Declare the package name: +atlas_subdir( TrigT2CaloTau ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + Calorimeter/CaloInterface + GaudiKernel + Trigger/TrigAlgorithms/TrigT2CaloCommon + Trigger/TrigEvent/TrigCaloEvent + Trigger/TrigEvent/TrigSteeringEvent + Trigger/TrigSteer/TrigInterfaces + Trigger/TrigTools/TrigT2CaloCalibration + PRIVATE + Calorimeter/CaloEvent + Calorimeter/CaloGeoHelpers + Calorimeter/CaloIdentifier + Control/AthenaKernel + Trigger/TrigT1/TrigT1Interfaces ) + +# External dependencies: +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Component(s) in the package: +atlas_add_library( TrigT2CaloTauLib + src/*.cxx + PUBLIC_HEADERS TrigT2CaloTau + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel TrigCaloEvent TrigSteeringEvent TrigT2CaloCommonLib TrigInterfacesLib TrigT2CaloCalibrationLib + PRIVATE_LINK_LIBRARIES CaloEvent CaloGeoHelpers CaloIdentifier AthenaKernel TrigT1Interfaces ) + +atlas_add_component( TrigT2CaloTau + src/components/*.cxx + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel TrigT2CaloCommonLib TrigCaloEvent TrigSteeringEvent TrigInterfacesLib TrigT2CaloCalibrationLib CaloEvent CaloGeoHelpers CaloIdentifier AthenaKernel TrigT1Interfaces TrigT2CaloTauLib ) + +# Install files from the package: +atlas_install_python_modules( python/*.py ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CalibrationTau.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CalibrationTau.h new file mode 100755 index 000000000000..8bad3b2b7a67 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CalibrationTau.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CalibrationTau.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTau +// +// AUTHOR: D.O. Damazio +// +// Object only designed to understand cluster calibration +// Should be used by EM and Tau people in the near future +// It should be possible to introduce the calibration configuration +// from a jobOption file. Not possible now. +// +// ******************************************************************** + +#ifndef TRIGT2CALOTAU_T2CALIBRATIONTAU +#define TRIGT2CALOTAU_T2CALIBRATIONTAU +#include <vector> +#include <math.h> +#include "TrigT2CaloCommon/T2Calibration.h" + +class T2CalibrationTau : public T2Calibration { +public: + +/** Constructor */ + T2CalibrationTau() : T2Calibration(){} +/** Destructor */ + ~T2CalibrationTau(){} + + // The two methods of this class, initialize and Calib, are virtual + // in the base class T2Calibration and implemented there as for the + // moment calibration is the same for egamma/tau. For an specific + // calibration override these methods. + + // In the initialize, one should provide a vector with the + // Eta limits (eg.: 0-2.5), the dimensions of the correction + // vector (eg: 2 100 - for 2 lines of one hundred constants - the + // first line is the eta of that bin and the second brings + // the calibration constant for that bin +// void initialize(const std::vector<float>& limit, const std::vector<int>& +// dimension, const std::vector<float>& correction); + + // This, for a given cluster eta and energy (not being used yet), + // provides the calibration constant +// double Calib( const double ClusterEta, const double EnergyCluster); + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTau.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTau.h new file mode 100755 index 000000000000..f9dad2ab7200 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTau.h @@ -0,0 +1,144 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2Calo.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTau +// +// AUTHORS: M.P. Casado +// C. Osuna +// updates: 3/3/11 ccuenca, added new vars for monitoring +// +// - Add new variables to allow job option control of eta/phi regions +// used in each tool. Also hardcode in eta ranges and granularities +// for all layers and add a new function so that tools can adjust the +// number of strips used in energy sums for changes in granularity. +// The goal is to try to sample a constant eta/phi area. - R. Soluk +// ******************************************************************** + +#ifndef TRIGT2CALOTAU_T2CALOTAU_H +#define TRIGT2CALOTAU_T2CALOTAU_H + +#include <string> +#include "GaudiKernel/ToolHandle.h" +#include "TrigInterfaces/FexAlgo.h" +#include "TrigT2CaloCommon/T2CaloBase.h" +#include "TrigT2CaloCalibration/IT2HadCalibTool.h" +#include "TrigT2CaloTau/T2CaloTauErrorMon.h" +#include "TrigCaloEvent/TrigTauCluster.h" + +class StoreGateSvc; +namespace HLT +{ + class TriggerElement; +} +class IAlgToolCalo; + +class T2CaloTau : public T2CaloBase +{ +public: + /** Constructor */ + T2CaloTau(const std::string & name, ISvcLocator* pSvcLocator); + /** Destructor */ + ~T2CaloTau(); + /** HLT method to execute */ + HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, HLT::TriggerElement* outputTE); + + /** HLT method to initialize */ + HLT::ErrorCode hltInitialize(); + /** HLT method to finalize */ + HLT::ErrorCode hltFinalize(); + +private: + // Properties: + + /** SG key for TrigTauCluster*/ + std::string m_trigTauClusterKey; + + /** EMRadius variable for monitoring */ + double m_EMRadius; + /** EMRadius3S variable for monitoring */ + double m_EMRadius3S; + /** CaloRadius variable for monitoring */ + double m_CaloRadius; + + /** HadRad variable for monitoring */ + double m_HadRad; + + /** Isofrac variable for monitoring */ + double m_IsoFrac ; + /** stripWidth variable for monitoring*/ + double m_StripWidth ; + + /** Fraction of EM energy over total energy in a normal (dR<0.3) cone for monitoring */ + double m_EMFraction; + + /** Raw Et in wide 0.3 cone for monitoring */ + double m_EtRawWide; + + /** EM Energy in (dR<0.2) cone for monitoring */ + double m_EMEnMedium; + /** HAD Energy in (dR<0.2) cone for monitoring */ + double m_HADEnMedium; + + /** EM Energy in (dR<0.1) cone for monitoring */ + double m_EMEnNarrow; + /** HAD Energy in (dR<0.1) cone for monitoring */ + double m_HADEnNarrow; + /** Raw Et in medium cone for monitoring */ + double m_EtRawMedium; + /** Raw Et in medium cone for monitoring (EM Sampling 0) */ + double m_EtRawMediumEM0; + /** Raw Et in medium cone for monitoring (EM Sampling 1) */ + double m_EtRawMediumEM1; + /** Raw Et in medium cone for monitoring (EM Sampling 2) */ + double m_EtRawMediumEM2; + /** Raw Et in medium cone for monitoring (EM Sampling 3) */ + double m_EtRawMediumEM3; + /** Raw Et in medium cone for monitoring (Had Sampling 0) */ + double m_EtRawMediumHad0; + /** Raw Et in medium cone for monitoring (Had Sampling 1) */ + double m_EtRawMediumHad1; + /** Raw Et in medium cone for monitoring (Had Sampling 2) */ + double m_EtRawMediumHad2; + + /** EtRawNarrow/EtRawMedium */ + double m_CoreFraction; + + /** eta of seed of L1 ROI */ + double m_EtaL1 ; + /** phi of seed of L1 ROI */ + double m_PhiL1 ; + + /** eta of seed of calo Cluster */ + double m_Eta ; + /** phi of seed of calo Cluster */ + double m_Phi ; + /** Difference in Eta at L2 and L1 for monitoring */ + double m_dEtaL2Tau_RoI ; + /** Difference in Phi at L2 and L1 for monitoring */ + double m_dPhiL2Tau_RoI ; + + /** counter for conversion error */ + unsigned int m_conversionError; + /** counter for algorithm error */ + unsigned int m_algorithmError; + /** error monitoring of cluster quality */ + std::vector<unsigned char> m_quality; + + /** Should or not storeCells into a cell container attached to output RoI */ + bool m_storeCells; + /** container pointer */ + CaloCellContainer* m_Container; + + /** option to update RoiDescriptor after execution (important for following trigger chain steps) */ + bool m_updateRoiDescriptor; + + /** phi, eta EM width */ + double m_phiWidthEM; + double m_etaWidthEM; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorHandler.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorHandler.h new file mode 100755 index 000000000000..8fde34fa3a70 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorHandler.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOTAU_T2CALOTAUERRORHANDLER_H +#define TRIGT2CALOTAU_T2CALOTAUERRORHANDLER_H + +namespace TAUCLUSTERROR { + + /** enumerate tau-specific errors */ + enum TAUCLUSTERROR{ + FAILPRESEED=31, + FAILSEED=30, + HADS1E0=11, + HADS2E0=10, + HADS3E0=9, + EMS0E0=15, + EMS1E0=14, + EMS2E0=13, + EMS3E0=12 + }; + + +} +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorMon.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorMon.h new file mode 100755 index 000000000000..9288f4befa15 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/T2CaloTauErrorMon.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGT2CALOTAU_T2CALOTAUERRORMON_H +#define TRIGT2CALOTAU_T2CALOTAUERRORMON_H +#include "TrigT2CaloTau/T2CaloTauErrorHandler.h" + +namespace TAUCLUSTMON { + + /** enumerate tau-specific errors for monitoring */ + enum TAUCLUSTMON{ + LARPROB=0, + TILEPROB=1, + ROBPROB=2, + RODPROB=3, + FAILSEED=4, + FAILPRESEED=5, + EMS0E0=6, + EMS1E0=7, + EMS2E0=8, + EMS3E0=9, + HADS1E0=10, + HADS2E0=11, + HADS3E0=12, + OTHERERRORS=13, + GOODCLUST=14, + ALLCLUST=15 + }; + + bool GetClusterError(unsigned int bit,uint32_t error ) { return ((error >> bit)&0x1)!=0 ;} + + void FillErrorMonitoring(uint32_t error, std::vector<unsigned char> * quality){ + bool isError=false; + if ( 0x000000FF & error ) {isError=true; quality->push_back(LARPROB); } + if ( 0x0FFF0000 & error ) {isError=true; quality->push_back(TILEPROB); } + if ( 0x10000000 & error ) {isError=true; quality->push_back(ROBPROB); } + if ( 0x20000000 & error ) {isError=true; quality->push_back(RODPROB); } + if ( GetClusterError( TAUCLUSTERROR::FAILSEED , error) ) {isError=true; quality->push_back(FAILSEED); } + if ( GetClusterError( TAUCLUSTERROR::FAILPRESEED , error) ) {isError=true; quality->push_back(FAILPRESEED); } + if ( GetClusterError( TAUCLUSTERROR::EMS0E0 , error) ) {isError=true; quality->push_back(EMS0E0); } + if ( GetClusterError( TAUCLUSTERROR::EMS1E0 , error) ) {isError=true; quality->push_back(EMS1E0); } + if ( GetClusterError( TAUCLUSTERROR::EMS2E0 , error) ) {isError=true; quality->push_back(EMS2E0); } + if ( GetClusterError( TAUCLUSTERROR::EMS3E0 , error) ) {isError=true; quality->push_back(EMS3E0); } + if ( GetClusterError( TAUCLUSTERROR::HADS1E0 , error) ) {isError=true; quality->push_back(HADS1E0); } + if ( GetClusterError( TAUCLUSTERROR::HADS2E0 , error) ) {isError=true; quality->push_back(HADS2E0); } + if ( GetClusterError( TAUCLUSTERROR::HADS3E0 , error) ) {isError=true; quality->push_back(HADS3E0); } + if (isError==false && error>0 ) {quality->push_back(OTHERERRORS); } + } + +} +#endif + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/TauAllCaloDRFex.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/TauAllCaloDRFex.h new file mode 100644 index 000000000000..8e3b993182ee --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/TrigT2CaloTau/TauAllCaloDRFex.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TauAllCaloDRFex.h +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTau +// +// AUTHOR: Olga Igonkina (Nikhef), Pilar Casado (IFAE), Mogens Dam (NBI) +// +// CREATED: June-09 +// +// DESCRIPTION: Tool to compute calorimeter tau variables in EM and HAD +// ******************************************************************** + +#ifndef TRIGT2CALOTAU_TAUALLCALODRFEX_H +#define TRIGT2CALOTAU_TAUALLCALODRFEX_H + + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "GaudiKernel/AlgTool.h" +#include "TrigCaloEvent/TrigTauCluster.h" +#include "TrigT2CaloTau/T2CaloTauErrorHandler.h" +#include "CaloInterface/ICalorimeterNoiseTool.h" + +class TauAllCaloDRFex : public IAlgToolCalo +{ +public: + /** Constructor */ + TauAllCaloDRFex(const std::string& type, const std::string& name, const IInterface* parent); + /** virtual Destructor */ + virtual ~TauAllCaloDRFex(); + /** execute method of IAlgToolCalo */ + using IAlgToolCalo::execute; + /** execute method */ + + /// take two roi descriptors into the shower + HLT::ErrorCode execute(TrigTauCluster &rtrigTauCluster, const IRoiDescriptor& roi, + const CaloDetDescrElement*& /*caloDDE*/); + + // HLT::ErrorCode execute(TrigTauCluster &rtrigTauCluster, double phiWidth, + // double etaWidth, double phiWidthEM, + // double etaWidthEM, double RoIeta, double RoIphi); + + // HLT::ErrorCode execute(TrigTauCluster &rtrigTauCluster,double phiWidth, + // double etaWidth, double RoIeta, double RoIphi); + + /** initialize function **/ + StatusCode initialize(); + +private: + /** Energy threshold for numStrips counting */ + double m_stripEthr; + + /** dR cut for reconstruction of the seed */ + double m_dRSeed; + /** dR cut for full region, Wide (previously called Normal) */ + double m_dRConeWide; + /** dR cut for Medium region (previously called Med) */ + double m_dRConeMedium; + /** dR cut for Narrow region (previously called Nar) */ + double m_dRConeNarrow; + + /** Variable to control noise substraction */ + bool m_applyNoiseCut; + /** Number of sigmas for noise cut */ + double m_noiseNSigmaCut; + /** int for hecQualityCut */ + int m_hecQualityCut; + + /** choose default width: 0 Narrow, 1 Medium, 2 Wide (Normal) */ + int m_defaultWidth; + + + /** Tool for noise substraction */ + ToolHandle<ICalorimeterNoiseTool> m_noiseTool; + + double emRadiusAllSampl(const TrigTauClusterDetails* clusterDetails, int maxEmSamp=100); + double caloRadius(const TrigTauClusterDetails* clusterDetails); + double coreFraction(const TrigTauClusterDetails* clusterDetails); + double emFraction(const TrigTauCluster* ptrigTauCluster); + double hadRadius(const TrigTauClusterDetails* clusterDetails); + double calcEnergyPhi(double energyNegPhi, double energyPosPhi, double EnergyWidNegPhi, double EnergyWidPosPhi, double energyNegPhiConv); + bool getdR(double compPhi, double compEta, double etaCell, double phiCell, double dRCut, double& dR); + double getEMEnergy(const TrigTauClusterDetails* clusterDetails, int widthChoice); + double getHADEnergy(const TrigTauClusterDetails* clusterDetails, int widthChoice); +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/doc/packagedoc.h b/Trigger/TrigAlgorithms/TrigT2CaloTau/doc/packagedoc.h new file mode 100644 index 000000000000..2f753fb3ea30 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/doc/packagedoc.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/** + +@page TrigT2CaloTau_page +@author Carlos Osuna +@author Stefania Xella +@author M. Pilar Casado +@author Olga Igonkina + +@section TrigT2CaloTau_TrigT2CaloTauOverview Overview +This package is in charge of the calorimeter reconstruction in +the trigger LVL2 for taus. It builds a set of shower shape variables +to discriminate jet and taus. +Deposited energy is available in 3 different window sizes for all sampling. + + + +*/ diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauConfig.py new file mode 100755 index 000000000000..a53ce9b16fd7 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauConfig.py @@ -0,0 +1,104 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +#------------------------------------------------ +# T2CaloTau Calibration Options +#------------------------------------------------ + +from TrigT2CaloTau.TrigT2CaloTauConf import T2CaloTau, TauAllCaloDRFex + +from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault +theCaloNoiseTool=CaloNoiseToolDefault() + +from AthenaCommon.AppMgr import ToolSvc +ToolSvc+=theCaloNoiseTool + +from AthenaCommon.Constants import VERBOSE,DEBUG,INFO + +#Make changes to TauAllCaloDRFex parameters here: + +class TauAllCaloDRFexConfig (TauAllCaloDRFex): + __slots__ = [] + def __init__ (self, name="TauAllCaloDRFexConfig",tdRNar=0.1,tdRMed=0.2,tdRWid=0.4,tdefWidth=2): + super(TauAllCaloDRFexConfig, self).__init__(name) + # here put your customizations + self.CaloNoiseTool = theCaloNoiseTool + self.applyNoiseCut = True + self.noiseNSigmaCut = 2. + self.hecQualityCut = 0 + self.dRSeed = 0.15 + self.StripEthr = 200. + self.defaultWidth = tdefWidth #Sets which width size is saved for EMEnergy (0:Narrow,1:Medium,2:Wide) + self.dRConeNarrow = tdRNar + self.dRConeMedium = tdRMed + self.dRConeWide = tdRWid + + +## configurable class +class T2CaloTau_Tau_custom (T2CaloTau): + __slots__ = [] + def __init__ (self, name="T2CaloTau_Tau_custom"): + super(T2CaloTau_Tau_custom, self).__init__(name) + self.EtaWidth = 0.4 + self.PhiWidth = 0.4 + self.EtaWidthForID = 0.3 + self.PhiWidthForID = 0.3 + + tauAllCaloDRFex = TauAllCaloDRFexConfig() + + self.IAlgToolList=[tauAllCaloDRFex] + self.TimerNtuple="T2CaloTau.T2CaTautTot" + self.TrigTauClusterKey = "T2CaloTrigTauCluster" + +# monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = [] + from TrigT2CaloTau.TrigT2CaloTauMonitoring import T2CaloTauValidationMonitoring, T2CaloTauOnlineMonitoring, T2CaloTauCosmicMonitoring + validation = T2CaloTauValidationMonitoring() + online = T2CaloTauOnlineMonitoring() + cosmic = T2CaloTauCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("Time") + + self.AthenaMonTools = [ time, validation, online, cosmic ] + + +## calo monitoring class +class T2CaloTau_cells (T2CaloTau_Tau_custom): + __slots__ = [] + def __init__ (self, name="T2CaloTau_cells"): + super(T2CaloTau_cells, self).__init__(name) + # here put your customizations + self.IAlgToolList= [TauAllCaloDRFexConfig('tauAllCaloDRFexCells')] + # Save cells + for item in self.IAlgToolList: + item.SaveCellsInContainer=True + item.ThresholdKeepCells=-100000. + item.hecQualityCut=0 + item.CaloNoiseTool=theCaloNoiseTool + item.applyNoiseCut=False + item.noiseNSigmaCut=2. + + self.StoreCells=True + self.EtaWidth = 0.4 + self.PhiWidth = 0.4 + self.TimerNtuple="T2CaloTau.T2CaTautTot" + self.TrigTauClusterKey = "T2CaloTrigTauCluster" + + +############### to be imported by the menu ############### + +# default class (2011) +class T2CaloTau_Tau (T2CaloTau_Tau_custom): + __slots__ = [] + #def __init__ (self, name="T2CaloTau_Tau"): + def __init__ (self, name="T2CaloTau_Tau"): + T2CaloTau_Tau_custom.__init__(self,name) + tauAllCaloDRFex = TauAllCaloDRFexConfig(tdRNar=0.1,tdRMed=0.2,tdRWid=0.4,tdefWidth=2) # use Wide (Nor in 2011), cone size 0.4 + self.IAlgToolList=[tauAllCaloDRFex] + +# class for 2012: uses Medium cone size as default +class T2CaloTau_Tau_Med (T2CaloTau_Tau_custom): + __slots__ = [] + def __init__ (self, name="T2CaloTau_Tau_Med"): + T2CaloTau_Tau_custom.__init__(self,name) + tauAllCaloDRFex = TauAllCaloDRFexConfig(tdRNar=0.1,tdRMed=0.2,tdRWid=0.4,tdefWidth=1) # use Medium cone size (0.2) variables + self.IAlgToolList=[tauAllCaloDRFex] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauMonitoring.py b/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauMonitoring.py new file mode 100755 index 000000000000..2d831bbe61fd --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/python/TrigT2CaloTauMonitoring.py @@ -0,0 +1,109 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + +################# Validation, DQ checks +from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig + +# Set labels for error monitoring histogram. The order has to match with T2CaloTauErrorMon.h file! Number has to match with histo definition. +errorlabels = 'LAr_Problem:Tile_Problem:N_ROBs<requested:empty_ROD_block:Fail_Seed:Fail_PreSeed:EM_S0_E0:EM_S1_E0:EM_S2_E0:EM_S3_E0:HAD_S1_E0:HAD_S2_E0:HAD_S3_E0:Other_Errors:Good_Clusters:All_Clusters' + +class T2CaloTauOnlineMonitoring(TrigGenericMonitoringToolConfig): + def __init__ (self, name="T2CaloTauOnlineMonitoring"): + super(T2CaloTauOnlineMonitoring, self).__init__(name) + self.defineTarget("Online") + + self.Histograms += [ defineHistogram('EMRadius', type='TH1F', title="L2CaloTau FEX EMRadius;EMRadius; nevents", xbins=100, xmin=-0.5, xmax=1.5) ] + self.Histograms += [ defineHistogram('EMRadius3S', type='TH1F', title="L2CaloTau FEX EMRadius3S;EMRadius3S; nevents", xbins=100, xmin=-0.5, xmax=1.5) ] + self.Histograms += [ defineHistogram('HadRad', type='TH1F', title="L2CaloTau FEX HadRad;HadRad; nevents", xbins=100, xmin=-0.5, xmax=1.5) ] + self.Histograms += [ defineHistogram('CaloRadius', type='TH1F', title="L2CaloTau FEX CaloRadius;CaloRadius; nevents", xbins=100, xmin=-0.5, xmax=1.5) ] + + self.Histograms += [ defineHistogram('IsoFrac', type='TH1F', title="L2CaloTau FEX IsoFrac;IsoFrac; nevents", xbins=80, xmin=-1.0, xmax=3.0) ] + self.Histograms += [ defineHistogram('StripWidth', type='TH1F', title="L2CaloTau FEX StripWidth;StripWidth; nevents", xbins=70, xmin=-0.1, xmax=0.6) ] + + self.Histograms += [ defineHistogram('EMFraction', type='TH1F', title="L2CaloTau FEX EM Energy Fraction;EMFraction; nevents", xbins=90, xmin=-0.6, xmax=1.2) ] + + ##Medium: cone 0.2 + self.Histograms += [ defineHistogram('EMEnMedium', type='TH1F', title="L2CaloTau FEX EMEnMedium in (dR<0.2) cone;EMEnMedium [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('HADEnMedium', type='TH1F', title="L2CaloTau FEX HADEnMedium in (dR<0.2) cone;HADEnMedium [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + + ##Narrow: cone 0.1 + self.Histograms += [ defineHistogram('EMEnNarrow', type='TH1F', title="L2CaloTau FEX EMEnNarrow in (dR<0.1) cone;EMEnNarrow [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('HADEnNarrow', type='TH1F', title="L2CaloTau FEX HADEnNarrow in (dR<0.1) cone;HADEnNarrow [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + + self.Histograms += [ defineHistogram('EtRawMedium', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone;EtRawMedium [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumEM0', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 0 of EM;EtRawMediumEM0 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumEM1', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 1 of EM;EtRawMediumEM1 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumEM2', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 2 of EM;EtRawMediumEM2 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumEM3', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 3 of EM;EtRawMediumEM3 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumHad0', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 0 of Had;EtRawMediumHad0 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumHad1', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 1 of Had;EtRawMediumHad1 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + self.Histograms += [ defineHistogram('EtRawMediumHad2', type='TH1F', title="L2CaloTau FEX EtRaw in a medium (dR<0.2) cone - Layer 2 of Had;EtRawMediumHad2 [MeV]; nevents", xbins=171, xmin=-13000, xmax=500000) ] + + self.Histograms += [ defineHistogram('CoreFraction', type='TH1F', title="EtRawNarrow/EtRawMedium; Core Fraction; nevents", xbins=70, xmin=-0.2, xmax=1.2) ] + + self.Histograms += [ defineHistogram('EtaL1, PhiL1', type='TH2F', title="L1 ROI Eta vs Phi in T2CaloTau FEX; #eta; #varphi; nevents", xbins=51, xmin=-2.55, xmax=2.55, + ybins=65, ymin=-3.1415936-0.098174/2., ymax=3.1415936+0.098174/2.)] + + self.Histograms += [ defineHistogram('EtaL1', type='TH1F', title="T2CaloTau L1 Eta; Eta; nevents", xbins=80, xmin=-4, xmax=4) ] + self.Histograms += [ defineHistogram('PhiL1', type='TH1F', title="T2CaloTau L1 Phi; Phi; nevents", xbins=65, xmin=-3.1415936-0.098174/2., xmax=3.1415936+0.098174/2.)] + + self.Histograms += [ defineHistogram('Eta', type='TH1F', title="T2CaloTau FEX Eta; Eta; nevents", xbins=80, xmin=-4, xmax=4) ] + self.Histograms += [ defineHistogram('Phi', type='TH1F', title="T2CaloTau FEX Phi; Phi; nevents", xbins=65, xmin=-3.1415936-0.098174/2., xmax=3.1415936+0.098174/2.)] + + self.Histograms += [ defineHistogram('dEtaL2Tau_RoI, dPhiL2Tau_RoI', type='TH2F', title="dEta vs dPhi in L2CaloTau FEX; Delta-eta; Delta-phi", xbins=40 , xmin=-0.2, xmax=0.2, + ybins=40 , ymin=-0.2, ymax=0.2) ] + + self.Histograms += [ defineHistogram('ConversionErrors',type='TH1F',title='L2CaloTau Conversion Errors; # Errors; # Clusters',xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram('AlgorithmErrors', type='TH1F',title='L2CaloTau Algorithm Errors; # Errors; # Clusters', xbins=10,xmin=0,xmax=10)] + self.Histograms += [ defineHistogram('Quality', type='TH1I',title='L2CaloTau FEX Error bit mask; Error; # Clusters', xbins=16,xmin=0,xmax=16,labels=errorlabels )] + +########## ############################################################## +# add validation specific histograms. +# If you ever remove histograms from Online - move them into Validation +# +######################################################################### +class T2CaloTauValidationMonitoring(T2CaloTauOnlineMonitoring): + def __init__ (self, name="T2CaloTauValidationMonitoring"): + super(T2CaloTauValidationMonitoring, self).__init__(name) + self.defineTarget("Validation") + +########## ############################################################## +# add cosmic specific histograms. +# +######################################################################### +class T2CaloTauCosmicMonitoring(T2CaloTauOnlineMonitoring): + def __init__ (self, name="T2CaloTauCosmicMonitoring"): + super(T2CaloTauCosmicMonitoring, self).__init__(name) + self.defineTarget("Cosmic") + + self.Histograms += [ defineHistogram('EtaL2vsL1', type='TH1F', title="L2CaloTau FEX Eta_L2 - Eta_L1; dEta; nevents", xbins=40, xmin=-0.4, xmax=0.4) ] + self.Histograms += [ defineHistogram('PhiL2vsL1', type='TH1F', title="L2CaloTau FEX Phi_L2 - Phi_L1; dPhi; nevents", xbins=40, xmin=-0.4, xmax=0.4) ] + self.Histograms += [ defineHistogram('EMFraction', type='TH1F', title="L2CaloTau FEX EM Energy Fraction;EMFraction; nevents",xbins=90, xmin=-0.6, xmax=1.2) ] + self.Histograms += [ defineHistogram('EMEnMedium', type='TH1F', title="L2CaloTau FEX EMEnMedium in (dR<0.3) cone;EMEnMedium [MeV]; nevents", xbins=54, xmin=-12000, xmax=150000) ] + self.Histograms += [ defineHistogram('HADEnMedium', type='TH1F', title="L2CaloTau FEX HADEnMedium in (dR<0.3) cone;HADEnMedium [MeV]; nevents", xbins=54, xmin=-12000, xmax=150000) ] + self.Histograms += [ defineHistogram('EMEnNarrow', type='TH1F', title="L2CaloTau FEX EMEnNarrow in (dR<0.1) cone;EMEnNarrow [MeV]; nevents", xbins=54, xmin=-12000, xmax=150000) ] + self.Histograms += [ defineHistogram('HADEnNarrow', type='TH1F', title="L2CaloTau FEX HADEnNarrow in (dR<0.1) cone;HADEnNarrow [MeV]; nevents", xbins=54, xmin=-12000, xmax=150000) ] + +class TrigT2CaloTauTimeMonitoring(TrigGenericMonitoringToolConfig) : + def __init__ (self, name="TrigT2CaloTauTimeMonitoring"): + super(TrigT2CaloTauTimeMonitoring,self).__init__(name) + self.defineTarget("Time") + + types_list=['Total','RegSel','BSCnv','Algor','SaveEM'] + tools_list=['ESamp2','ESamp1','EaEmEn','EHadEn'] + for tool in tools_list: + for type in types_list: + hist_title=tool+type + thismax=1.0 + if ( (type.find("RegSel")>-1) or (type.find("SaveEM")>-1) ): + thismax=0.2 + if ( (type.find("Algor")>-1) ): + thismax=0.5 + self.Histograms+= [defineHistogram (hist_title, + type='TH1F',title=hist_title + ,xbins=40,xmin=0.0,xmax=thismax)] + self.Histograms+= [defineHistogram ('TotalTime', + type='TH1F',title=hist_title + ,xbins=50,xmin=0.0,xmax=5)] + self.Histograms += [ defineHistogram('Eta, TotalTime', + type='TH2F', title="#eta vs. time", xbins=50, xmin=-2.5, + xmax=2.5, ybins=50, ymin=0, ymax=5) ] diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/src/T2CaloTau.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/T2CaloTau.cxx new file mode 100755 index 000000000000..cc794e7f57c4 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/T2CaloTau.cxx @@ -0,0 +1,663 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloTau.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTau +// +// AUTHOR: M.P. Casado +// S.R. Armstrong +// updates: 3/3/11 ccuenca, added new vars for monitoring +// +// - Add variables for job option controlled region limits, set defaults +// to most likely values. +// - Add function EtaPhiRange to return the maximum and minimum eta or phi +// values to use when calculating energy sums over a region - R. Soluk +// ******************************************************************** + +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IToolSvc.h" +#include "GaudiKernel/StatusCode.h" +#include "GaudiKernel/ITHistSvc.h" + +#include "TrigT1Interfaces/RecEmTauRoI.h" +#include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include "CaloEvent/CaloCluster.h" +#include "CaloEvent/CaloClusterContainer.h" +#include "TrigCaloEvent/TrigTauCluster.h" +#include "TrigCaloEvent/TrigTauClusterDetails.h" +#include "TrigCaloEvent/TrigTauClusterDetailsContainer.h" + +#include "TrigT2CaloCommon/T2CaloBase.h" +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "TrigT2CaloCommon/phiutils.h" +#include "TrigT2CaloTau/T2CaloTau.h" + +//#include <TH1F.h> +#include "AthenaKernel/errorcheck.h" + +#define NEG_ENERGY_CLUSTER HLT::Reason::USERDEF_1 +#define NULL_ENERGY_SAMPLING HLT::Reason::USERDEF_2 + +class ISvcLocator; + +T2CaloTau::T2CaloTau(const std::string & name, ISvcLocator* pSvcLocator) : T2CaloBase(name, pSvcLocator), + m_storeCells(false), + m_updateRoiDescriptor(false), + m_phiWidthEM(0.4), + m_etaWidthEM(0.4) +{ + + //properties + declareProperty("TrigTauClusterKey", m_trigTauClusterKey = "T2CaloTrigTauCluster"); + + declareProperty("StoreCells", m_storeCells,"store cells in container attached to RoI"); + declareProperty("updateRoiDescriptor", m_updateRoiDescriptor, "option to update RoiDescriptor after execution"); + declareProperty("PhiWidthEM", m_phiWidthEM, "phi width EM calo"); + declareProperty("EtaWidthEM", m_etaWidthEM, "eta width EM calo"); + + //Monitored variables + declareMonitoredVariable("EMRadius", m_EMRadius); + declareMonitoredVariable("EMRadius3S", m_EMRadius3S); + declareMonitoredVariable("CaloRadius", m_CaloRadius); + declareMonitoredVariable("HadRad", m_HadRad); + + declareMonitoredVariable("IsoFrac", m_IsoFrac); + declareMonitoredVariable("StripWidth", m_StripWidth); + + declareMonitoredVariable("EMFraction", m_EMFraction); + + //Wide, cone 0.3 (Wide in TrigTauClusterDetails) + declareMonitoredVariable("EtRawWide", m_EtRawWide); + + //Medium, cone 0.2 (Medium in TrigTauClusterDetails) + declareMonitoredVariable("EMEnMedium", m_EMEnMedium); + declareMonitoredVariable("HADEnMedium", m_HADEnMedium); + + //Narrow, cone 0.1 (Narrow in TrigTauClusterDetails) + declareMonitoredVariable("EMEnNarrow", m_EMEnNarrow); + declareMonitoredVariable("HADEnNarrow", m_HADEnNarrow); + + declareMonitoredVariable("EtRawMedium", m_EtRawMedium); + declareMonitoredVariable("EtRawMediumEM0", m_EtRawMediumEM0); + declareMonitoredVariable("EtRawMediumEM1", m_EtRawMediumEM1); + declareMonitoredVariable("EtRawMediumEM2", m_EtRawMediumEM2); + declareMonitoredVariable("EtRawMediumEM3", m_EtRawMediumEM3); + declareMonitoredVariable("EtRawMediumHad0", m_EtRawMediumHad0); + declareMonitoredVariable("EtRawMediumHad1", m_EtRawMediumHad1); + declareMonitoredVariable("EtRawMediumHad2", m_EtRawMediumHad2); + + + //EtNarrow/EtWide ratio + declareMonitoredVariable("CoreFraction", m_CoreFraction); + + declareMonitoredVariable("EtaL1", m_EtaL1); + declareMonitoredVariable("PhiL1", m_PhiL1); + declareMonitoredVariable("Eta", m_Eta); + declareMonitoredVariable("Phi", m_Phi); + declareMonitoredVariable("dEtaL2Tau_RoI", m_dEtaL2Tau_RoI); + declareMonitoredVariable("dPhiL2Tau_RoI", m_dPhiL2Tau_RoI); + + declareMonitoredVariable("ConversionErrors", m_conversionError); + declareMonitoredVariable("AlgorithmErrors", m_algorithmError); + + declareMonitoredStdContainer("Quality", m_quality); + + m_Container = 0; + +} + +T2CaloTau::~T2CaloTau() +{ +} + +HLT::ErrorCode T2CaloTau::hltInitialize() +{ + // MsgStream log(msgSvc(), name()); + + // IToolSvc* toolSvc; + // service("ToolSvc",toolSvc); + + ToolHandleArray<IAlgToolCalo>::iterator it = m_emAlgTools.begin(); + for(; it != m_emAlgTools.end(); ++it) + { + StatusCode sc = it->retrieve(); + if(sc.isFailure()) + { + msg() << MSG::ERROR << "Unable to initialize tool " << *it << endmsg; + return HLT::BAD_ALGO_CONFIG ; + } + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "REGTEST: Created " << *it << " AlgTool" << endmsg; + } + (*it)->setCellContainerPointer(&m_Container); + } + + if(msgLvl() <= MSG::DEBUG) + { + if(m_updateRoiDescriptor) + { + msg() << MSG::DEBUG << "REGTEST: TrigRoiDescriptor will be updated " << endmsg; + } + else + { + msg() << MSG::DEBUG << "REGTEST: TrigRoiDescriptor will NOT be updated " << endmsg; + } + } + + if(m_storeCells && msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "REGTEST: will store cells in output " << endmsg; + } + + return HLT::OK; +} + +HLT::ErrorCode T2CaloTau::hltFinalize() +{ + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << " hltFinalize is done" << endmsg; + } + return HLT::OK; +} + +HLT::ErrorCode T2CaloTau::hltExecute(const HLT::TriggerElement* inputTE, HLT::TriggerElement* outputTE) +{ + // Time total T2Calo execution time. + if(timerSvc()) m_timer[0]->start(); + + m_conversionError = 0; + m_algorithmError = 0; + // reset quality vector for monitoring + m_quality.clear(); + + m_EMRadius = -99.0; + m_EMRadius3S = -99.0; + m_CaloRadius = -99.0; + m_HadRad = -99.0; + + m_IsoFrac = -99.0; + m_StripWidth = -99.0; + + m_EMFraction = -99.0; + + m_EtRawWide = -99.0; + + m_EMEnMedium = -99.0; + m_HADEnMedium = -99.0; + + m_EMEnNarrow = -99.0; + m_HADEnNarrow = -99.0; + + m_EtRawMedium = -99.0; + m_EtRawMediumEM0 = -99.0; + m_EtRawMediumEM1 = -99.0; + m_EtRawMediumEM2 = -99.0; + m_EtRawMediumEM3 = -99.0; + m_EtRawMediumHad0 = -99.0; + m_EtRawMediumHad1 = -99.0; + m_EtRawMediumHad2 = -99.0; + + m_CoreFraction = -99.0; + + m_EtaL1 = -99.0; + m_PhiL1 = -99.0; + m_Eta = -99.0; + m_Phi = -99.0; + m_dEtaL2Tau_RoI = -99.0; + m_dPhiL2Tau_RoI = -99.0; + + +#ifndef NDEBUG + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::INFO << "in execute()" << endmsg; + } +#endif + + // Some debug output: +#ifndef NDEBUG + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "output TE ID: " << outputTE->getId() << endmsg; + } +#endif + + // Some debug output: +#ifndef NDEBUG + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "input TE ID: " << inputTE->getId() << endmsg; + } +#endif + const TrigRoiDescriptor* roiDescriptor = 0; + HLT::ErrorCode st = getFeature(inputTE, roiDescriptor); + + if(st == HLT::OK && roiDescriptor) + { +#ifndef NDEBUG // Will not be executed in optimised build + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << " RoI id " << roiDescriptor->roiId() + << " LVL1 id " << roiDescriptor->l1Id() + << *roiDescriptor << endmsg; + // << " located at phi = " << roiDescriptor->phi0() + // << ", eta = " << roiDescriptor->eta0() << endmsg; + } +#endif + } + else + { + msg() << MSG::WARNING << " Failed to find RoiDescriptor " << endmsg; + return HLT::ERROR; + } + + // Some debug output: + + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "Message to count events. LVL1 phi=" + << roiDescriptor->phi() + << " & LVL1 eta=" + << roiDescriptor->eta() << " " << roiDescriptor + << endmsg; + } + + + // End LVL1 part + // double RoIeta = roiDescriptor->eta(); + // double RoIphi = roiDescriptor->phi(); + + const TrigTauClusterDetails * pDetails= new TrigTauClusterDetails(); + + std::string key = ""; + HLT::ErrorCode hltstatusD = recordAndAttachFeature(outputTE, pDetails, key, "TrigT2CaloTauDetails"); + if(hltstatusD != HLT::OK) + { + if (msgLvl() <= MSG::DEBUG) + { + msg() << MSG::ERROR << "Write of TrigTauClusterDetails into outputTE failed" << endmsg; + } + return hltstatusD; + } + + // retrieve TrigTauClusterDetails from the TE + ElementLink< TrigTauClusterDetailsContainer > ELDetails; + HLT::ErrorCode stat = getFeatureLink< TrigTauClusterDetailsContainer, TrigTauClusterDetails >( outputTE, ELDetails ); + + if(stat == HLT::OK && ELDetails.isValid()) + { + if(msgLvl() <= MSG::DEBUG) + { + (*ELDetails)->print(msg()); + } + } + else + { + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "Failed to get TrigTauClusterDetails" << endmsg; + } + return HLT::MISSING_FEATURE; + } + + TrigTauCluster* ptrigTauCluster = new TrigTauCluster(ELDetails.getStorableObjectPointer(), ELDetails.index(), 0.0, -10.0, -10.0, 0); + // Energies, EMRadius and other variables are initialized at the + // TrigTauCluster creation time. + + // Add RoI word to TrigTauCluster + ptrigTauCluster->setRoIword(roiDescriptor->roiWord()); + + // zeros the container per RoI + m_Container = 0; + + HLT::ErrorCode ToolStat = HLT::OK; // define flag to monitor problems with tools without stopping the sequence. + + + /// generate the new roiDescriptor with the correct sizes + + const TrigRoiDescriptor* roitmp = roiDescriptor; + + TrigRoiDescriptor roi( roitmp->eta(), roitmp->eta()-m_etaWidth, roitmp->eta()+m_etaWidth, + roitmp->phi(), HLT::wrap_phi(roitmp->phi()-m_phiWidth), HLT::wrap_phi(roitmp->phi()+m_phiWidth) ); + + /// this isn't needed + // TrigRoiDescriptor* roiEM = new TrigRoiDescriptor( roitmp->eta(), roitmp->eta()-m_etaWidthEM, roitmp->eta()+m_etaWidthE<, + // roitmp->phi(), HLT::wrap_phi(roitmp->phi()-m_phiWidthEM), HLT::wrap_phi(roitmp->phi()+m_phiWidthEM) ); + + msg() << MSG::DEBUG << "Using RoIs " << roi << endmsg; + + ToolHandleArray<IAlgToolCalo>::iterator it = m_emAlgTools.begin(); + if(timerSvc()) m_timer[1]->start(); + uint32_t error = 0; + for(; it < m_emAlgTools.end(); it++) + { + // HLT::ErrorCode stat = (*it)->execute(*ptrigTauCluster, m_phiWidth, m_etaWidth, m_phiWidthEM, m_etaWidthEM, RoIeta, RoIphi); + // HLT::ErrorCode stat = (*it)->execute(*ptrigTauCluster, *roi, *roiEM ); + HLT::ErrorCode stat = (*it)->execute(*ptrigTauCluster, roi, caloDDENull ); + if(stat.reason() == NEG_ENERGY_CLUSTER) + { + msg() << MSG::DEBUG << (*it)->name() << " Found a cluster with E~<=0. CONTINUE execution. " << endmsg; + // do not forget to delete trigTauCluster of attach it to storegate if return + // return stat; // uncomment to avaid running on the remaining tools. + ToolStat = stat; + } + if(stat.reason() == NULL_ENERGY_SAMPLING) + { + msg() << MSG::DEBUG << (*it)->name() << " Found E==0 in this sampling. CONTINUE execution. " << endmsg; + // do not forget to delete trigTauCluster of attach it to storegate if return + // return stat; // uncomment to avaid running on the remaining tools. + ToolStat = stat; + // since userdefined errors are not monitored (reason=continue) + // fill our own variable with T2CaloTau related errors + } + if(stat == HLT::TOOL_FAILURE) + { + msg() << MSG::WARNING << "T2CaloTau AlgTool " << (*it)->name() << " returned Failure" << endmsg; + // if tool has returned this failure, then loadingCollection has failed and it + // does not make sense to keep this TrigTauCluster - we would not learn anything from it + delete ptrigTauCluster; + delete pDetails; + return stat; + } + uint32_t in_error = (*it)->report_error(); + if(0x0FFF00FF & in_error) m_conversionError++; + if(0xF0000000 & in_error) m_algorithmError++; + + error |= in_error; + } + + // convert bits into fixed-size vector variable for error monitoring + TAUCLUSTMON::FillErrorMonitoring(error, &m_quality); + // Fill ALLCLUST bin for all clusters, so we can know the relative importance of each error with this normalization. + m_quality.push_back(TAUCLUSTMON::ALLCLUST); + // Fill GOODCLUST for clusters without errors + if(!error) m_quality.push_back(TAUCLUSTMON::GOODCLUST); + + // OI Now, ensure that phi is [-pi,pi] indepedent on what tools do... + while(ptrigTauCluster->phi() < -M_PI) ptrigTauCluster->setPhi(ptrigTauCluster->phi() + 2.0 * M_PI); + while(ptrigTauCluster->phi() > M_PI) ptrigTauCluster->setPhi(ptrigTauCluster->phi() - 2.0 * M_PI); + + // + // Get L1 RoiDescriptor + const TrigRoiDescriptor* roiL1Descriptor = 0; + HLT::ErrorCode tmpStatus = getFeature( inputTE, roiL1Descriptor, "initialRoI" ); + + if(tmpStatus == HLT::OK && roiDescriptor){ + if(msgLvl() <= MSG::DEBUG) { + msg() << MSG::DEBUG << " RoI id " << roiL1Descriptor->roiId() + << " LVL1 id " << roiL1Descriptor->l1Id() + << *roiL1Descriptor << endmsg; + } + } else { + msg() << MSG::WARNING << " Failed to find RoiDescriptor " << endmsg; + return HLT::ERROR; + } + + + //Fill monitored variables + const TrigTauClusterDetails* clusterDetails = ptrigTauCluster->clusterDetails(); + const double coshEta = cosh(ptrigTauCluster->eta()); + const double inv_coshEta = 1. / coshEta; + + m_EMRadius = clusterDetails->EMRadius(2); + m_EMRadius3S = ptrigTauCluster->EMRadius3S(); + m_CaloRadius = ptrigTauCluster->CaloRadius(); + m_HadRad = ptrigTauCluster->HadRadius(); + m_IsoFrac = ptrigTauCluster->IsoFrac(); + m_StripWidth = ptrigTauCluster->stripWidth(); + m_EMFraction = ptrigTauCluster->EMFrac(); + + //wide: cone 0.3 -> wide at TrigTauClusterDetails + m_EtRawWide = (clusterDetails->EMenergyWide(0) + + clusterDetails->EMenergyWide(1) + + clusterDetails->EMenergyWide(2) + + clusterDetails->EMenergyWide(3) + + clusterDetails->HADenergyWide(0) + + clusterDetails->HADenergyWide(1) + + clusterDetails->HADenergyWide(2)) * inv_coshEta; + + //medium: cone 0.2 -> medium at TrigTauClusterDetails. In previus version of the code, Wide instead of Medium + m_EMEnMedium = clusterDetails->EMenergyMedium(0) + + clusterDetails->EMenergyMedium(1) + + clusterDetails->EMenergyMedium(2) + + clusterDetails->EMenergyMedium(3); + m_HADEnMedium = clusterDetails->HADenergyMedium(0) + + clusterDetails->HADenergyMedium(1) + + clusterDetails->HADenergyMedium(2); + + //narrow: cone 0.1 -> narrow at TrigTauClusterDetails + m_EMEnNarrow = clusterDetails->EMenergyNarrow(0) + + clusterDetails->EMenergyNarrow(1) + + clusterDetails->EMenergyNarrow(2) + + clusterDetails->EMenergyNarrow(3); + m_HADEnNarrow = clusterDetails->HADenergyNarrow(0) + + clusterDetails->HADenergyNarrow(1) + + clusterDetails->HADenergyNarrow(2); + + m_EtRawMediumEM0 = clusterDetails->EMenergyMedium(0) * inv_coshEta; + m_EtRawMediumEM1 = clusterDetails->EMenergyMedium(1) * inv_coshEta; + m_EtRawMediumEM2 = clusterDetails->EMenergyMedium(2) * inv_coshEta; + m_EtRawMediumEM3 = clusterDetails->EMenergyMedium(3) * inv_coshEta; + m_EtRawMediumHad0 = clusterDetails->HADenergyMedium(0) * inv_coshEta; + m_EtRawMediumHad1 = clusterDetails->HADenergyMedium(1) * inv_coshEta; + m_EtRawMediumHad2 = clusterDetails->HADenergyMedium(2) * inv_coshEta; + + m_EtRawMedium = m_EtRawMediumEM0 + m_EtRawMediumEM1 + m_EtRawMediumEM2 + m_EtRawMediumEM3 + m_EtRawMediumHad0 + m_EtRawMediumHad1 + m_EtRawMediumHad2; + + m_CoreFraction = ptrigTauCluster->CoreFrac(); + + m_Eta = ptrigTauCluster->eta(); + m_Phi = ptrigTauCluster->phi(); + if(roiL1Descriptor) + { + m_EtaL1 = roiL1Descriptor->eta(); + m_PhiL1 = roiL1Descriptor->phi(); + } + + m_dEtaL2Tau_RoI = m_Eta - m_EtaL1; + m_dPhiL2Tau_RoI = m_Phi - m_PhiL1; + // m_dEtaL2Tau_RoI = ptrigTauCluster->eta() - roiL1Descriptor->eta0(); + // m_dPhiL2Tau_RoI = ptrigTauCluster->phi() - roiL1Descriptor->phi0(); + + if(m_dPhiL2Tau_RoI > M_PI) m_dPhiL2Tau_RoI -= 2 * M_PI; + if(m_dPhiL2Tau_RoI < -M_PI) m_dPhiL2Tau_RoI += 2 * M_PI; + + + if(m_EtRawWide > 495000.) m_EtRawWide = 499000.; + + if(m_EMEnMedium > 495000.) m_EMEnMedium = 499000.; + if(m_HADEnMedium > 495000.) m_HADEnMedium = 499000.; + + if(m_EMEnNarrow > 495000.) m_EMEnNarrow = 499000.; + if(m_HADEnNarrow > 495000.) m_HADEnNarrow = 499000.; + + if(m_EtRawMedium > 495000.) m_EtRawMedium = 499000.; + if(m_EtRawMediumEM0 > 495000.) m_EtRawMediumEM0 = 499000.; + if(m_EtRawMediumEM1 > 495000.) m_EtRawMediumEM1 = 499000.; + if(m_EtRawMediumEM2 > 495000.) m_EtRawMediumEM2 = 499000.; + if(m_EtRawMediumEM3 > 495000.) m_EtRawMediumEM3 = 499000.; + if(m_EtRawMediumHad0 > 495000.) m_EtRawMediumHad0 = 499000.; + if(m_EtRawMediumHad1 > 495000.) m_EtRawMediumHad1 = 499000.; + if(m_EtRawMediumHad2 > 495000.) m_EtRawMediumHad2 = 499000.; + + // Cluster quality is a collection of possible errors + // No error => quality=0 + ptrigTauCluster->setquality(error); + + if(timerSvc()) m_timer[1]->stop(); + + + if(msgLvl() <= MSG::DEBUG) + { + // Print out Cluster produced + // msg() << MSG::DEBUG << "TEST-TEST-TEST-TEST" << endmsg; + msg() << MSG::DEBUG << " REGTEST: eta/phi = "<< m_Eta << "/" << m_Phi << endmsg; + //msg() << MSG::DEBUG << " REGTEST: etaL1/phiL1 = "<< m_EtaL1 << "/" << m_PhiL1 << endmsg; + msg() << MSG::DEBUG << " REGTEST: EMenergy0Narrow/Medium/Wide = "<< (*ptrigTauCluster).clusterDetails()->EMenergyNarrow(0) + << "/" << (*ptrigTauCluster).clusterDetails()->EMenergyMedium(0) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWide(0) << endmsg; + msg() << MSG::DEBUG << " REGTEST: EMenergy1Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->EMenergyNarrow(1) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyMedium(1) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWide(1) << endmsg; + msg() << MSG::DEBUG << " REGTEST: EMenergy2Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->EMenergyNarrow(2) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyMedium(2) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWide(2) << endmsg; + msg() << MSG::DEBUG << " REGTEST: EMenergy3Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->EMenergyNarrow(3) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyMedium(3) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWide(3) << endmsg; + msg() << MSG::DEBUG << " REGTEST: HADenergy0Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->HADenergyNarrow(0) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyMedium(0) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyWide(0) << endmsg; + msg() << MSG::DEBUG << " REGTEST: HADenergy1Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->HADenergyNarrow(1) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyMedium(1) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyWide(1) << endmsg; + msg() << MSG::DEBUG << " REGTEST: HADenergy2Narrow/Medium/Wide = " + << (*ptrigTauCluster).clusterDetails()->HADenergyNarrow(2) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyMedium(2) << "/" + << (*ptrigTauCluster).clusterDetails()->HADenergyWide(2) << endmsg; + + msg() << MSG::DEBUG << " REGTEST: EMRadius0/1/2/3 = " + << (*ptrigTauCluster).clusterDetails()->EMRadius(0) << "/" + << (*ptrigTauCluster).clusterDetails()->EMRadius(1) << "/" + << (*ptrigTauCluster).clusterDetails()->EMRadius(2) << "/" + << (*ptrigTauCluster).clusterDetails()->EMRadius(3) << endmsg; + + msg() << MSG::DEBUG << " REGTEST: HADRadius0/1/2 = " + << (*ptrigTauCluster).clusterDetails()->HADRadius(0) << "/" + << (*ptrigTauCluster).clusterDetails()->HADRadius(1) << "/" + << (*ptrigTauCluster).clusterDetails()->HADRadius(2) << endmsg; + + msg() << MSG::DEBUG << " REGTEST: EMenergyWidth0/1/2/3 = " + << (*ptrigTauCluster).clusterDetails()->EMenergyWidth(0) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWidth(1) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWidth(2) << "/" + << (*ptrigTauCluster).clusterDetails()->EMenergyWidth(3) << endmsg; + + msg() << MSG::DEBUG << " REGTEST: EMenergy/Hadenergy = " + << (*ptrigTauCluster).EMenergy() << "/" + << (*ptrigTauCluster).HADenergy() << "/" + << endmsg; + msg() << MSG::DEBUG << " REGTEST: numStripCells/stripWidth/IsoFrac = " + << (*ptrigTauCluster).numStripCells() << "/" + << (*ptrigTauCluster).stripWidth() << "/" + << m_IsoFrac << endmsg; + msg() << MSG::DEBUG << " REGTEST: RoIWord = " + << (*ptrigTauCluster).RoIword() << endmsg; + } + + //// From egamma. This is already done inside the tools for tau! but maybe would like to change at some point... + // if ( error ) { + // // Clustering failed. Transmit ahead L1 + // ptrigTauCluster->setEta(etaL1); + // ptrigTauCluster->setPhi(phiL1); + // ptrigTauCluster->setEnergy(0.0); + // } + + key = ""; + HLT::ErrorCode hltstatus = recordAndAttachFeature(outputTE, ptrigTauCluster, key, "TrigT2CaloTau"); + if(hltstatus != HLT::OK) + { + if (msgLvl() <= MSG::DEBUG) + { + msg() << MSG::ERROR << "Write of TrigTauCluster into outputTE failed" << endmsg; + } + return hltstatus; + } + + if(m_storeCells) + { + if(m_Container != 0) + { + HLT::ErrorCode hltstatus = recordAndAttachFeature(outputTE, m_Container, key, "TrigT2CaloTauCells"); + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << " recorded " << m_Container->size() << " cells "<< endmsg; + } + if(hltstatus != HLT::OK) + { +#ifndef NDEBUG + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::ERROR << "Write of TrigTauClusterCells into outputTE failed" << endmsg; + } +#endif + if(m_timersvc) m_timer[0]->stop(); + return hltstatus; + } + } // End of if to check whether there is a container + } // End of if to check the option is ok + + // Create a new RoiDescriptor with updated eta and phi. + // Note that the steering will propagate l1Id and roiId automatically + // so no need to set them. + + if(m_updateRoiDescriptor) + { + + /// what size should we create this roi with ??? + /// use some new parameters + + double eta = ptrigTauCluster->eta(); + double phi = ptrigTauCluster->phi(); + + TrigRoiDescriptor* newRoiDescriptor = new TrigRoiDescriptor( roiDescriptor->roiWord(), + roiDescriptor->l1Id(), + roiDescriptor->roiId(), + eta, eta-m_etaWidthForID, eta+m_etaWidthForID, + phi, HLT::wrap_phi(phi-m_phiWidthForID), HLT::wrap_phi(phi+m_phiWidthForID) ); + + /// obsolete constructor + // TrigRoiDescriptor* newRoiDescriptor = new TrigRoiDescriptor(roiDescriptor->roiWord(), + // roiDescriptor->l1Id(), + // roiDescriptor->roiId(), + // ptrigTauCluster->eta(), + // ptrigTauCluster->phi()); + + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG << "Recorded an RoiDescriptor " + << " phi " << newRoiDescriptor->phi() + << " eta " << newRoiDescriptor->eta() << " " << *newRoiDescriptor << endmsg; + } + + hltstatus = attachFeature(outputTE, newRoiDescriptor, "TrigT2CaloTau"); + + if(hltstatus != HLT::OK) + { + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::ERROR << "Write of newRoiDescriptor into outputTE failed" << endmsg; + } + return hltstatus; + } + } + // Some debug output: +#ifndef NDEBUG + if(msgLvl() <= MSG::DEBUG) + { + msg() << MSG::DEBUG + << "We assume success, set TE with id " + << outputTE->getId() + << " active to signal positive result." + << endmsg; + } +#endif + + // Time total T2CaloT2Calo execution time. + if(timerSvc()) m_timer[0]->stop(); + + //return HLT::OK; + return ToolStat; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/src/TauAllCaloDRFex.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/TauAllCaloDRFex.cxx new file mode 100644 index 000000000000..460a3a0bb94c --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/TauAllCaloDRFex.cxx @@ -0,0 +1,1186 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TauAllCaloDRFex.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTau +// +// AUTHOR: Olga Igonkina (Nikhef), M. Pilar Casado (IFAE), Mogens Dam (NBI) +// based on TauEmEnFex.cxx +// +// CREATED: Jun-09 +// +// DESCRIPTION: Tool to compute LVL2 Calo tau variables at +// EM sampling 2 +// ******************************************************************** + +#include "CaloIdentifier/LArEM_ID.h" + +#include "CaloEvent/CaloCluster.h" +#include "TrigCaloEvent/TrigTauCluster.h" +#include "TrigCaloEvent/TrigTauClusterDetails.h" +#include "CaloGeoHelpers/CaloSampling.h" + +#include "TrigT2CaloTau/TauAllCaloDRFex.h" +#include "TrigT2CaloCommon/Calo_Def.h" +#include "TrigSteeringEvent/Enums.h" + +#define NEG_ENERGY_CLUSTER HLT::Reason::USERDEF_1 +#define NULL_ENERGY_SAMPLING HLT::Reason::USERDEF_2 + +TauAllCaloDRFex::TauAllCaloDRFex(const std::string& type, const std::string& name, const IInterface* parent) : IAlgToolCalo(type, name, parent) +{ + declareProperty("StripEthr", m_stripEthr); + declareProperty("dRSeed", m_dRSeed, "dR cut for reconstruction of the seed "); + declareProperty("CaloNoiseTool", m_noiseTool, "Tool Handle for noise tool"); + declareProperty("applyNoiseCut", m_applyNoiseCut, "swithch on/off noise suppression"); + declareProperty("noiseNSigmaCut", m_noiseNSigmaCut, "number of sigmas for 2 sided noise substraction"); + declareProperty("hecQualityCut", m_hecQualityCut, "Control for HEC Quality"); + declareProperty("defaultWidth", m_defaultWidth, "default width to be saved"); + declareProperty("dRConeNarrow", m_dRConeNarrow, "dR cut for full region (Narrow) "); + declareProperty("dRConeMedium", m_dRConeMedium, "dR cut for full region (Medium) "); + declareProperty("dRConeWide", m_dRConeWide, "dR cut for full region (Wide) "); + m_saveCells = false; +} + +TauAllCaloDRFex::~TauAllCaloDRFex() +{ +} + +StatusCode TauAllCaloDRFex::initialize() +{ + StatusCode sc = IAlgToolCalo::initialize(); + if( sc.isFailure() ) return sc; + msg() << MSG::INFO << "REGTEST initialized with:" << endmsg; + msg() << MSG::INFO << "REGTEST dRSeed=" << m_dRSeed << endmsg; + msg() << MSG::INFO << "REGTEST StripEthr=" << m_stripEthr << endmsg; + msg() << MSG::INFO << "REGTEST CaloNoiseTool=" << m_noiseTool << endmsg; + msg() << MSG::INFO << "REGTEST applyNoiseCut=" << m_applyNoiseCut << endmsg; + msg() << MSG::INFO << "REGTEST noiseNSigmaCut=" << m_noiseNSigmaCut << endmsg; + msg() << MSG::INFO << "REGTEST hecQualityCut=" << m_hecQualityCut << endmsg; + msg() << MSG::INFO << "REGTEST defaultWidth=" << m_defaultWidth << endmsg; + msg() << MSG::INFO << "REGTEST dRConeNarrow=" << m_dRConeNarrow << endmsg; + msg() << MSG::INFO << "REGTEST dRConeMedium=" << m_dRConeMedium << endmsg; + msg() << MSG::INFO << "REGTEST dRConeWide=" << m_dRConeWide << endmsg; + + if( m_saveCells && msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << "REGTEST: store cells with Et> " << m_cellkeepthr << endmsg; + + if ( !m_timersvc.empty() ) + { + m_timer[0] = m_timersvc->addItem("T2CaloTau.Tools.Total"); + m_timer[1] = m_timersvc->addItem("T2CaloTau.Tools.RegSel"); + m_timer[2] = m_timersvc->addItem("T2CaloTau.Tools.DataPrep"); + m_timer[3] = m_timersvc->addItem("T2CaloTau.Tools.Algorithmic"); + m_timer[4] = m_timersvc->addItem("T2CaloTau.Tools.Saving"); + } + + // noise suppression + if(m_applyNoiseCut!=0) + { + if(m_noiseTool.retrieve().isFailure()) + { + msg() << MSG::FATAL << "Unable to find CaloNoiseTool" << endmsg; + return StatusCode::FAILURE; + } + } + + return sc; +} + + +HLT::ErrorCode TauAllCaloDRFex::execute( TrigTauCluster &rtrigTauCluster, + const IRoiDescriptor& roi, + const CaloDetDescrElement*& /*caloDDE*/) +{ + + // Time total AlgTool time + if (!m_timersvc.empty()) m_timer[0]->start(); + // reset error + m_error = 0x0; + + //these aren't used: + // phiWidthEM = 0.; + // etaWidthEM = 0.; + + //samplings + const unsigned int NSamplings = 7; + int samplings[NSamplings] = {0,1,2,3,0,1,2}; + DETID detectorID[NSamplings] = {TTEM,TTEM,TTEM,TTEM,TTHEC,TTHEC,TTHEC}; + + + // Time to access RegionSelector + if (!m_timersvc.empty()) m_timer[1]->start(); + if (!m_timersvc.empty()) m_timer[1]->pause(); + // Time to access Collection (and ByteStreamCnv ROBs) + if (!m_timersvc.empty()) m_timer[2]->start(); + if (!m_timersvc.empty()) m_timer[2]->pause(); + + + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->start(); + double seedPhi = roi.phi(); + double seedEta = roi.eta(); + + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << " Seed position (L1) eta/phi=" << seedEta << "/" << seedPhi << endmsg; + + + double energyEta = 0.; + double energyPhi = 0.; + + // Variables to take care of phi wrap-around + double energyNegPhi = 0.; + double energyNegPhiConv = 0.; + double energyPosPhi = 0.; + + double EnergyMediumPosPhi = 0; + double EnergyMediumNegPhi = 0; + + // double etamin = std::max(-2.5,RoIeta - etaWidth); + // double etamax = std::min( 2.5,RoIeta + etaWidth); + + // double phimin = RoIphi - phiWidth; + // double phimax = RoIphi + phiWidth; + + // while (phimin < 0) phimin += 2. * M_PI; + // while (phimax > 2*M_PI) phimax -= 2. * M_PI; + + + //------------------ step 1 : clusterization ----------------------------------- + // loop over all samplings + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << " Start clusterization "<< endmsg; + + for(unsigned int is=0; is<NSamplings;++is) + { + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << "LAr sampling "<< samplings[is]<< endmsg; + + if (!m_timersvc.empty()) { m_timer[3]->pause(); m_timer[1]->resume();} + // m_data->RegionSelector(samplings[is], etamin, etamax, phimin, phimax, detectorID[is]); + m_data->RegionSelector(samplings[is], roi, detectorID[is]); + if (!m_timersvc.empty()) {m_timer[1]->pause(); m_timer[2]->resume(); } + if ( m_data->LoadCollections(m_iBegin,m_iEnd).isFailure() ){ + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << " can not LoadCollections " << *m_iBegin << " " << *m_iEnd << endmsg; + return HLT::TOOL_FAILURE; + } + m_error|=m_data->report_error(); + if (!m_timersvc.empty()){ m_timer[2]->pause(); m_timer[3]->resume(); } + + for(m_it = m_iBegin;m_it != m_iEnd; ++m_it) + { + const LArCell* cell = *m_it; + double etaCell = cell->eta(); + double phiCell = cell->phi(); + double dR; + if( ! getdR(seedPhi, seedEta, etaCell, phiCell, m_dRSeed, dR) ) + continue; + + float energyCell = cell->energy(); + if (m_applyNoiseCut) { + double rms = m_noiseTool->getNoise(cell, ICalorimeterNoiseTool::TOTALNOISE); + if ( fabs(energyCell) < m_noiseNSigmaCut * rms) + continue; + } + + if (detectorID[is]==TTHEC) { + if (energyCell < -5e3) continue; + if ((m_hecQualityCut!=0) && (((cell->quality())&0xffff) > m_hecQualityCut) ) continue; + } + energyEta += energyCell * etaCell ; + + if (phiCell > 0.){ + EnergyMediumPosPhi += energyCell; + energyPosPhi += energyCell * phiCell; + } else { + energyNegPhi += energyCell * phiCell; + energyNegPhiConv += energyCell * (phiCell+2.0*M_PI); + EnergyMediumNegPhi += energyCell; + } + + } // end of loop over EM sampling + } // end loop over EM LAr + + // Region Selector, no sample needed + // Get detector offline ID's for Collections + + // m_data->RegionSelector(0,etamin,etamax,phimin,phimax,TILE); + m_data->RegionSelector( 0, roi, TILE ); + if (!m_timersvc.empty()) m_timer[1]->pause(); + + for (unsigned int iR=0;iR< m_data->TileContSize();iR++) + { + if (!m_timersvc.empty()) m_timer[2]->resume(); + // For the first sample you will create the containers + // For the others no + if ( m_data->LoadCollections(m_itBegin,m_itEnd,iR,!iR).isFailure() ){ + return HLT::TOOL_FAILURE; + } + m_error|=m_data->report_error(); + // Finished to access Collection + if (!m_timersvc.empty()) { m_timer[2]->pause(); m_timer[3]->resume(); } + + + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) + { + const CaloCell* cell = (*m_itt); + + double etaCell = cell->eta(); + double phiCell = cell->phi(); + double dR; + if (! getdR(seedPhi, seedEta, etaCell, phiCell, m_dRSeed, dR) ) + continue; + + float energyCell = cell->energy(); + + if (m_applyNoiseCut) { + if (! m_noiseTool->isEOverNSigma( cell, m_noiseNSigmaCut, + ICalorimeterNoiseTool::MAXSYMMETRYHANDLING, + ICalorimeterNoiseTool::TOTALNOISE) ) + continue; + } + + energyEta += energyCell * etaCell ; + + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << "take cell E="<<energyCell << " Eta/Phi="<<etaCell << "/"<<phiCell<< endmsg; + + if (phiCell > 0.){ + EnergyMediumPosPhi += energyCell; + energyPosPhi +=energyCell * phiCell; + } else { + energyNegPhi +=energyCell * phiCell; + energyNegPhiConv += energyCell * ( phiCell+2.0*M_PI); + EnergyMediumNegPhi += energyCell; + } + + } // end of loop over Tile cells + } // end loop over Tile samplings + + + + + + // End options for cluster position + //---------------- step 2 calculation of variables + + HLT::ErrorCode StatError = HLT::OK; // define flag for cluster with negative energy or sampling with 0 energy. + + // Phi wrap-around + if ( (EnergyMediumNegPhi + EnergyMediumPosPhi) > 0. ){ // dont divide by zero + energyEta /= (EnergyMediumNegPhi + EnergyMediumPosPhi) ; + energyPhi = calcEnergyPhi(energyNegPhi, energyPosPhi, EnergyMediumNegPhi, EnergyMediumPosPhi, energyNegPhiConv); + } else { + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG <<"REGTEST problems finding seed: negative energy = "<< EnergyMediumNegPhi + EnergyMediumPosPhi + <<" eta/phi = "<< energyEta<<" / "<<energyPhi <<" . Seed set to L1 direction: eta/phi = " + <<roi.eta()<<" / "<<roi.phi()<< endmsg; + energyEta = roi.eta() ; // if Cluster energy is null or negative, set L1 position + energyPhi = roi.phi() ; + SetClusterError(TAUCLUSTERROR::FAILSEED); + + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NEG_ENERGY_CLUSTER); + } + + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG <<"REGTEST Pre-seed eta/phi " << seedEta<<"/"<<seedPhi << " => Cluster eta/phi = "<< energyEta << "/"<< energyPhi << endmsg; + + while (energyPhi < -M_PI) energyPhi= energyPhi + 2. * M_PI; + while (energyPhi > M_PI) energyPhi= energyPhi - 2. * M_PI; + + float dPhiL1 = fabs(energyPhi - seedPhi); + if( dPhiL1 > M_PI ) dPhiL1 = 2*M_PI - dPhiL1; + + // If seed is too far from pre seed, means that something has happened, probably too small energy deposition + if ( fabs(energyEta - seedEta)> m_dRSeed || fabs(dPhiL1)> m_dRSeed){ + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG <<"REGTEST problems finding seed: eta/phi = "<<energyEta<<" / "<<energyPhi + <<" too far from L1 eta/phi = "<< seedEta<<" / "<<seedPhi + <<" . Energy = "<< EnergyMediumNegPhi + EnergyMediumPosPhi<< endmsg; + energyEta=roi.eta(); + energyPhi=roi.phi(); + // this a similar case as above: energy is too small to calculate a good seed position. they should be monitored together. + SetClusterError(TAUCLUSTERROR::FAILSEED); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NEG_ENERGY_CLUSTER); + } + + const TrigTauClusterDetails* pDetailsConst = rtrigTauCluster.clusterDetails(); + TrigTauClusterDetails* pDetails = const_cast<TrigTauClusterDetails*> (pDetailsConst); // why do not we have function for that, if needed? + + if (!m_timersvc.empty()) m_timer[3]->pause(); + // Time to store cluster quantities + if (!m_timersvc.empty()) m_timer[4]->start(); + rtrigTauCluster.setEta(energyEta); + rtrigTauCluster.setPhi(energyPhi); + if (!m_timersvc.empty()) m_timer[4]->pause(); + if (!m_timersvc.empty()) m_timer[3]->resume(); + + ClearClusterError(TAUCLUSTERROR::EMS0E0); // this bit might at some point be set by the common data access + ClearClusterError(TAUCLUSTERROR::EMS1E0); // this bit might at some point be set by the common data access + ClearClusterError(TAUCLUSTERROR::EMS2E0); // this bit might at some point be set by the common data access + ClearClusterError(TAUCLUSTERROR::EMS3E0); // this bit might at some point be set by the common data access + + ClearClusterError(TAUCLUSTERROR::HADS1E0); + ClearClusterError(TAUCLUSTERROR::HADS2E0); + ClearClusterError(TAUCLUSTERROR::HADS3E0); + + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << " Start shape calculation "<< endmsg; + + + int numStripCell = 0; + int numTotalCells = 0; + + int nEmCellsNarrow = 0; + int nEmCellsMed = 0; + int nEmCellsWide = 0; + + int nHadCellsNarrow[3] = {0,0,0}; + int nHadCellsMed[3] = {0,0,0}; + int nHadCellsWide [3] = {0,0,0}; + + + double emRadiusNarrow = 0; + double emRadiusMed = 0; + double emRadiusWide = 0; + + double hadRadiusNarrow[3] = {0.0,0.0,0.0}; + double hadRadiusMed[3] = {0.0,0.0,0.0}; + double hadRadiusWide[3] = {0.0,0.0,0.0}; + + + double emEnergyNarrow = 0; + double emEnergyMed = 0; + double emEnergyWide = 0; + + double hadEnergyNarrow[3] = {0.0,0.0,0.0}; + double hadEnergyMed[3] = {0.0,0.0,0.0}; + double hadEnergyWide[3] = {0.0,0.0,0.0}; + + + double emWeightEtaNarrow = 0.0; + double emWeightEtaMed = 0.0; + double emWeightEtaWide = 0.0; + + double hadWeightEtaNarrow[3] = {0.0,0.0,0.0}; + double hadWeightEtaMed[3] = {0.0,0.0,0.0}; + double hadWeightEtaWide[3] = {0.0,0.0,0.0}; + + + double emWeightEta2Narrow = 0.0; + double emWeightEta2Med = 0.0; + double emWeightEta2Wide = 0.0; + + double hadWeightEta2Narrow[3] = {0.0,0.0,0.0}; + double hadWeightEta2Med[3] = {0.0,0.0,0.0}; + double hadWeightEta2Wide[3] = {0.0,0.0,0.0}; + + + + + + + + //loop over LAr samplings + for(unsigned int is=0; is<NSamplings;++is){ + + emRadiusNarrow = 0.; + emRadiusMed = 0.; + emRadiusWide = 0.; + + nEmCellsNarrow = 0; + nEmCellsMed = 0; + nEmCellsWide = 0; + + emRadiusNarrow = 0.; + emRadiusMed = 0.; + emRadiusWide = 0.; + + emEnergyNarrow = 0.; + emEnergyMed = 0.; + emEnergyWide = 0.; + + emWeightEtaNarrow = 0.; + emWeightEtaMed = 0.; + emWeightEtaWide = 0.; + + emWeightEta2Narrow = 0.; + emWeightEta2Med = 0.; + emWeightEta2Wide = 0.; + + + //get data + if (!m_timersvc.empty()){ m_timer[3]->pause(); m_timer[1]->resume(); } + + // m_data->RegionSelector(samplings[is],etamin,etamax,phimin,phimax,detectorID[is]); + m_data->RegionSelector( samplings[is], roi, detectorID[is] ); + + if (!m_timersvc.empty()) { m_timer[1]->pause(); m_timer[2]->resume(); } + + if ( m_data->LoadCollections(m_iBegin,m_iEnd).isFailure() ){ + if (msg().level()<=MSG::DEBUG) + msg() << MSG::DEBUG << " can not LoadCollections " << *m_iBegin << " " << *m_iEnd << endmsg; + return HLT::TOOL_FAILURE; + } + m_error|=m_data->report_error(); + if (!m_timersvc.empty()){ m_timer[2]->pause(); m_timer[3]->resume(); } + + if ( m_saveCells ){ + m_data->storeCells(m_iBegin,m_iEnd,*m_CaloCellContPoint,m_cellkeepthr,100000); + } + + + //loop over cells per sampling + for(m_it = m_iBegin;m_it != m_iEnd; ++m_it) { + const LArCell* cell = *m_it; + double etaCell = cell->eta(); + double phiCell = cell->phi(); + double dR = 0.0; + //effectively applying the dR<m_dRConeWide cut + if ( !getdR(energyPhi, energyEta, etaCell, phiCell,m_dRConeWide , dR) ) continue; + + float energyCell = cell->energy(); + + + // Count cells + if ( is < 4 ) { + nEmCellsWide += 1; + if( dR < m_dRConeMedium ) { + nEmCellsMed += 1; + if( dR < m_dRConeNarrow ) + nEmCellsNarrow += 1; + } + } else { + nHadCellsWide[samplings[is]] += 1; + if( dR < m_dRConeMedium ) { + nHadCellsMed[samplings[is]] += 1; + if( dR < m_dRConeNarrow ) + nHadCellsNarrow[samplings[is]] += 1; + } + } + + //count n cells + numTotalCells = rtrigTauCluster.numTotCells(); + numTotalCells = numTotalCells + 1; + rtrigTauCluster.setNumTotCells(numTotalCells); + + //Noise subtraction + if (m_applyNoiseCut) { + double rms = m_noiseTool->getNoise(cell, ICalorimeterNoiseTool::TOTALNOISE); + if ( fabs(energyCell) < m_noiseNSigmaCut * rms) + continue; + } + + if (detectorID[is]==TTHEC) { + if (energyCell < -5e3) continue; + if ((m_hecQualityCut!=0) && (((cell->quality())&0xffff) > m_hecQualityCut) ) continue; + } + + if ( is < 4 ) { + emRadiusWide += energyCell * dR; + emEnergyWide += energyCell; + emWeightEta2Wide += energyCell * etaCell * etaCell; + emWeightEtaWide += energyCell * etaCell; + + } else { + hadRadiusWide[samplings[is]] += energyCell * dR; + hadEnergyWide[samplings[is]] += energyCell; + hadWeightEta2Wide[samplings[is]] += energyCell * etaCell * etaCell; + hadWeightEtaWide[samplings[is]] += energyCell * etaCell; + } + + if ( (is==1) && (energyCell > m_stripEthr ) ) numStripCell += 1; + + + if( dR < m_dRConeMedium ) { + if( is < 4 ) { + emRadiusMed += energyCell * dR; + emEnergyMed += energyCell; + emWeightEta2Med += energyCell * etaCell * etaCell; + emWeightEtaMed += energyCell * etaCell; + } else { + hadRadiusMed[samplings[is]] += energyCell * dR; + hadEnergyMed[samplings[is]] += energyCell; + hadWeightEta2Med[samplings[is]] += energyCell * etaCell * etaCell; + hadWeightEtaMed[samplings[is]] += energyCell * etaCell; + } + + if( dR < m_dRConeNarrow ) { + if( is < 4 ) { + emRadiusNarrow += energyCell * dR; + emEnergyNarrow += energyCell; + emWeightEta2Narrow += energyCell * etaCell * etaCell; + emWeightEtaNarrow += energyCell * etaCell; + } else { + hadRadiusNarrow[samplings[is]] += energyCell * dR; + hadEnergyNarrow[samplings[is]] += energyCell; + hadWeightEta2Narrow[samplings[is]] += energyCell * etaCell * etaCell; + hadWeightEtaNarrow[samplings[is]] += energyCell * etaCell; + } + } + } + } // end of loop over cells + + + //Set clusterWidth and emRadius for EM Samplings + if ( is < 4 ) { + + double clusterWidthWide; + double clusterWidthMed; + double clusterWidthNarrow; + + //Wide + if ( (emEnergyWide > 0.) && (nEmCellsWide > 0) ) { + clusterWidthWide = + (emWeightEta2Wide/emEnergyWide) - + (emWeightEtaWide/emEnergyWide)* + (emWeightEtaWide/emEnergyWide); + + clusterWidthWide > 0.? clusterWidthWide = + sqrt(clusterWidthWide) : -99.; + + emRadiusWide = emRadiusWide / emEnergyWide ; + } else { + if(nEmCellsWide == 0) { + clusterWidthWide = 0.; + emRadiusWide = 0. ; + + /// What is this code for?? why is it hardcoded with values like eta=1.8 ??? + + // if E==0 in a dR<0.3 region, probably means problems with unpacking. + if ((is < 4) && + (samplings[is]==0) && + ((fabs(energyEta) - m_dRConeWide) < (1.8 - (0.025/2) - 0.05) ) && + ((fabs(roi.etaMinus())<(1.8-1e-7)) || (fabs(roi.etaPlus())<(1.8-1e-7)) ) + ) { + SetClusterError(TAUCLUSTERROR::EMS0E0); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NULL_ENERGY_SAMPLING); + } + if ((is < 4) && (samplings[is]==1)) { + SetClusterError(TAUCLUSTERROR::EMS1E0); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NULL_ENERGY_SAMPLING); + } + if ((is < 4) && (samplings[is]==2)) { + SetClusterError(TAUCLUSTERROR::EMS2E0); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NULL_ENERGY_SAMPLING); + } + if ((is < 4) && (samplings[is]==3)) { + SetClusterError(TAUCLUSTERROR::EMS3E0); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NULL_ENERGY_SAMPLING); + } + } + else { + clusterWidthWide = -99.; + emRadiusWide = -99.; + } + } + + //Medium + if ( (emEnergyMed > 0.) && (nEmCellsMed > 0) ) { + clusterWidthMed = + (emWeightEta2Med/emEnergyMed) - + (emWeightEtaMed/emEnergyMed)* + (emWeightEtaMed/emEnergyMed); + + clusterWidthMed > 0.? clusterWidthMed = + sqrt(clusterWidthMed) : -99.; + + emRadiusMed = emRadiusMed / emEnergyMed ; + } else { + if( nEmCellsMed == 0 ) { + clusterWidthMed = 0.; + emRadiusMed = 0. ; + } else { + clusterWidthMed = -99.; + emRadiusMed = -99.; + } + } + + + //Narrow + if ( (emEnergyNarrow > 0.) && (nEmCellsNarrow > 0) ) { + clusterWidthNarrow = + (emWeightEta2Narrow/emEnergyNarrow) - + (emWeightEtaNarrow /emEnergyNarrow)* + (emWeightEtaNarrow /emEnergyNarrow); + + clusterWidthNarrow > 0.? clusterWidthNarrow = + sqrt(clusterWidthNarrow) : -99.; + + emRadiusNarrow = emRadiusNarrow / emEnergyNarrow ; + } else { + if( nEmCellsNarrow == 0 ) { + clusterWidthNarrow = 0.; + emRadiusNarrow = 0. ; + } else { + clusterWidthNarrow = -99.; + emRadiusNarrow = -99.; + } + } + + if (!m_timersvc.empty()){ m_timer[3]->pause(); m_timer[4]->resume(); } + + float emRad = -1.0; + float clusWidth = -1.0; + switch (m_defaultWidth) { + case 0: + emRad = emRadiusNarrow; + clusWidth = clusterWidthNarrow; + break; + case 1: + emRad = emRadiusMed; + clusWidth = clusterWidthMed; + break; + case 2: + emRad = emRadiusWide; + clusWidth = clusterWidthWide; + break; + } + + pDetails->setEMRadius (samplings[is],emRad); + pDetails->setEMenergyWidth (samplings[is],clusWidth); + + pDetails->setEMenergyNarrow(samplings[is],emEnergyNarrow); + pDetails->setEMenergyMedium(samplings[is],emEnergyMed); + pDetails->setEMenergyWide (samplings[is],emEnergyWide); + + //if samplings==2 in the first 4 samples + if (samplings[is]==2) { + if(emEnergyMed != 0) rtrigTauCluster.setIsoFrac( (emEnergyMed - emEnergyNarrow) / emEnergyMed ); + else rtrigTauCluster.setIsoFrac(-99. ); + } + } + if (!m_timersvc.empty()){ m_timer[4]->pause(); m_timer[3]->resume(); } + } + + if (!m_timersvc.empty()) m_timer[3]->pause(); + + if (!m_timersvc.empty()) m_timer[4]->resume(); + rtrigTauCluster.setNumStripCells (numStripCell); + rtrigTauCluster.setStripWidthOffline(rtrigTauCluster.EMenergyWidth(1)); + rtrigTauCluster.setStripWidth (rtrigTauCluster.EMenergyWidth(2)); + rtrigTauCluster.setEMRadius2 (rtrigTauCluster.EMRadius(2)); + rtrigTauCluster.setEMenergy (getEMEnergy(pDetails, m_defaultWidth) ); + + if (!m_timersvc.empty()){ m_timer[4]->pause(); m_timer[3]->resume(); } + if (!m_timersvc.empty()) { m_timer[3]->pause(); m_timer[1]->resume();} + + // m_data->RegionSelector(0,etamin,etamax,phimin,phimax,TILE); + m_data->RegionSelector( 0, roi, TILE ); + if (!m_timersvc.empty()) m_timer[1]->pause(); + + + + // Tile energy + for (unsigned int iR=0; iR<m_data->TileContSize(); iR++) { + + if (!m_timersvc.empty()) m_timer[2]->resume(); + if ( m_data->LoadCollections(m_itBegin,m_itEnd,iR,!iR).isFailure() ){ + return HLT::TOOL_FAILURE; + } + m_error|=m_data->report_error(); + if ( m_saveCells ){ + m_data->storeCells(m_itBegin,m_itEnd,*m_CaloCellContPoint,m_cellkeepthr,100000); + } + if (!m_timersvc.empty()) { m_timer[2]->pause(); m_timer[3]->resume();} + + //loop over tile cells + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { + const CaloCell* cell = (*m_itt); + double etaCell = cell->eta(); + double phiCell = cell->phi(); + double dR = 0.0; + if (!getdR(energyPhi, energyEta, etaCell, phiCell, m_dRConeWide, dR) ) + continue; + + float energyCell = cell->energy(); + + + //samp = CaloSampling::getSampling(*cell); + //CaloSampling::CaloSample samp = CaloSampling::getSampling(*(*m_itt)); + CaloSampling::CaloSample samp = (*m_itt)->caloDDE()->getSampling(); + + int idxsamp = -99; + if (CaloSampling::TileBar0 == samp || + CaloSampling::TileExt0 == samp) { + idxsamp = 0; + } else if (CaloSampling::TileBar1 == samp || + CaloSampling::TileExt1 == samp) { + idxsamp = 1; + } else if (CaloSampling::TileBar2 == samp || + CaloSampling::TileExt2 == samp) { + idxsamp = 2; + }else continue; + + // Count this cell + numTotalCells=rtrigTauCluster.numTotCells(); + rtrigTauCluster.setNumTotCells(numTotalCells++); + + // Count cells + nHadCellsWide[idxsamp] += 1; + if( dR < m_dRConeMedium ) { + nHadCellsMed[idxsamp] += 1; + if( dR < m_dRConeNarrow ) + nHadCellsNarrow[idxsamp] += 1; + } + + if (m_applyNoiseCut) { + if (! m_noiseTool->isEOverNSigma( cell, m_noiseNSigmaCut, + ICalorimeterNoiseTool::MAXSYMMETRYHANDLING, + ICalorimeterNoiseTool::TOTALNOISE) ) + continue; + } + + hadRadiusWide[idxsamp] += energyCell * dR; + hadEnergyWide[idxsamp] += energyCell; + hadWeightEta2Wide[idxsamp] += energyCell * etaCell * etaCell; + hadWeightEtaWide[idxsamp] += energyCell * etaCell; + + if( dR < m_dRConeMedium ) { + hadRadiusMed[idxsamp] += energyCell * dR; + hadEnergyMed[idxsamp] += energyCell; + hadWeightEta2Med[idxsamp] += energyCell * etaCell * etaCell; + hadWeightEtaMed[idxsamp] += energyCell * etaCell; + + if( dR < m_dRConeNarrow ) { + hadRadiusNarrow[idxsamp] += energyCell * dR; + hadEnergyNarrow[idxsamp] += energyCell; + hadWeightEta2Narrow[idxsamp] += energyCell * etaCell * etaCell; + hadWeightEtaNarrow[idxsamp] += energyCell * etaCell; + } + } + } // end loop over cells + } // end loop over collections + + + //Fix had variables + for(int sampling=0; sampling<3;++sampling){ + // calculate cluster width in a region (Eta/Phi)StripsEM2Nor from jobO + // ??? ClearClusterError(TAUCLUSTERROR::EMS2E0); // this bit might at some point be set by the common data access + + double clusterWidthWide; + double clusterWidthMed; + double clusterWidthNarrow; + + //HadWide + if ( hadEnergyWide[sampling] > 0. && nHadCellsWide[sampling] > 0 ) { + clusterWidthWide = + (hadWeightEta2Wide[sampling]/hadEnergyWide[sampling]) - + (hadWeightEtaWide[sampling]/hadEnergyWide[sampling])* + (hadWeightEtaWide[sampling]/hadEnergyWide[sampling]); + + clusterWidthWide > 0.? clusterWidthWide = + sqrt(clusterWidthWide) : -99.; + + hadRadiusWide[sampling] = hadRadiusWide[sampling] / hadEnergyWide[sampling] ; + } else { + if(nHadCellsWide[sampling] == 0) { + clusterWidthWide = 0.; + hadRadiusWide[sampling] = 0. ; + + // if E==0 in a dR<0.3 region, probably means problems with unpacking. + if ( sampling==0) SetClusterError(TAUCLUSTERROR::HADS1E0); + if ( sampling==1) SetClusterError(TAUCLUSTERROR::HADS2E0); + if ( sampling==2) SetClusterError(TAUCLUSTERROR::HADS3E0); + StatError = HLT::ErrorCode(HLT::Action::CONTINUE, NULL_ENERGY_SAMPLING); + } else { + clusterWidthWide = -99.; + hadRadiusWide[sampling] = -99.; + } + } + + //HadMed + if ( hadEnergyMed[sampling] > 0. && nHadCellsMed[sampling] > 0 ) { + clusterWidthMed = + (hadWeightEta2Med[sampling]/hadEnergyMed[sampling]) - + (hadWeightEtaMed[sampling]/hadEnergyMed[sampling])* + (hadWeightEtaMed[sampling]/hadEnergyMed[sampling]); + + clusterWidthMed > 0.? clusterWidthMed = + sqrt(clusterWidthMed) : -99.; + + hadRadiusMed[sampling] = hadRadiusMed[sampling] / hadEnergyMed[sampling] ; + } else { + if(nHadCellsMed[sampling] == 0) { + clusterWidthMed = 0.; + hadRadiusMed[sampling] = 0. ; + } else { + clusterWidthMed = -99.; + hadRadiusMed[sampling] = -99.; + } + } + + + //HadNarrow + if ( hadEnergyNarrow[sampling] > 0. && nHadCellsNarrow[sampling] > 0 ) { + clusterWidthNarrow = + (hadWeightEta2Narrow[sampling]/hadEnergyNarrow[sampling]) - + (hadWeightEtaNarrow[sampling]/hadEnergyNarrow[sampling])* + (hadWeightEtaNarrow[sampling]/hadEnergyNarrow[sampling]); + + clusterWidthNarrow > 0.? clusterWidthNarrow = + sqrt(clusterWidthNarrow) : -99.; + + hadRadiusNarrow[sampling] = hadRadiusNarrow[sampling] / hadEnergyNarrow[sampling] ; + } else { + if(nHadCellsNarrow[sampling] == 0) { + clusterWidthNarrow = 0.; + hadRadiusNarrow[sampling] = 0. ; + } else { + clusterWidthNarrow = -99.; + hadRadiusNarrow[sampling] = -99.; + } + } + + if (!m_timersvc.empty()) {m_timer[3]->pause(); m_timer[4]->resume(); } + + //set values + float hadRad = -1.0; + float clusWidth = -1.0; + switch (m_defaultWidth) { + case 0: + hadRad = hadRadiusNarrow[sampling]; + clusWidth = clusterWidthNarrow; + break; + case 1: + hadRad = hadRadiusMed[sampling]; + clusWidth = clusterWidthMed; + break; + case 2: + hadRad = hadRadiusWide[sampling]; + clusWidth = clusterWidthWide; + break; + } + + pDetails->setHADRadius (sampling,hadRad); + pDetails->setHADenergyWidth (sampling,clusWidth); + + pDetails->setHADenergyNarrow(sampling,hadEnergyNarrow[sampling]); + pDetails->setHADenergyMedium(sampling,hadEnergyMed[sampling]); + pDetails->setHADenergyWide (sampling,hadEnergyWide[sampling]); + + if (!m_timersvc.empty()){ m_timer[4]->pause(); m_timer[3]->resume(); } + } + + if (!m_timersvc.empty()){ m_timer[3]->pause(); m_timer[4]->resume();} + + + //set Raw and Had energy + rtrigTauCluster.setHADenergy( getHADEnergy(pDetails, m_defaultWidth) ); + rtrigTauCluster.setRawEnergy( rtrigTauCluster.rawEnergy() + rtrigTauCluster.EMenergy() + rtrigTauCluster.HADenergy() ); + + if ( msg().level() <= MSG::DEBUG) + msg()<<MSG::DEBUG + << "REGTEST Record energy RawE" << rtrigTauCluster.rawEnergy() + << "Had " << rtrigTauCluster.HADenergy() << endmsg; + + if (!m_timersvc.empty()){ m_timer[4]->pause(); m_timer[3]->resume();} + + + //set Radius + float caloRad = caloRadius(pDetails); + float emRadius3S = emRadiusAllSampl(pDetails, 3); + float coreFrac = coreFraction(pDetails); + float emFrac = emFraction(&rtrigTauCluster); + float hadRad = hadRadius(pDetails); + + if (!m_timersvc.empty()){ m_timer[3]->pause(); m_timer[4]->resume();} + + rtrigTauCluster.setCaloRadius(caloRad); + rtrigTauCluster.setEMRadius3S(emRadius3S); + rtrigTauCluster.setCoreFrac(coreFrac); + rtrigTauCluster.setEMFrac(emFrac); + rtrigTauCluster.setHadRadius(hadRad); + + if (!m_timersvc.empty()) { + m_timer[1]->stop(); + m_timer[2]->stop(); + m_timer[3]->stop(); + m_timer[4]->stop(); + m_timer[0]->stop(); + } + + // return HLT::OK; + return StatError; + +} + +double TauAllCaloDRFex::emRadiusAllSampl(const TrigTauClusterDetails* clusterDetails, int maxEmSamp) +{ + double emRadAll = 0.0; + double totEn = 0.0; + + double emEnergy[4] = {0.0, 0.0, 0.0, 0.0}; + + for (int iS=0; iS<4 && iS < maxEmSamp; iS++) { + switch (m_defaultWidth) { + case 0: + emEnergy[iS] = clusterDetails->EMenergyNarrow(iS); + break; + case 1: + emEnergy[iS] = clusterDetails->EMenergyMedium(iS); + break; + case 2: + emEnergy[iS] = clusterDetails->EMenergyWide(iS); + break; + } + } + + for(int emSamp = 0; emSamp <= 3 && emSamp < maxEmSamp; emSamp++) { + if( emEnergy[emSamp] > 0.0 && fabs(clusterDetails->EMRadius(emSamp)) < 90.0) { + emRadAll += emEnergy[emSamp] * clusterDetails->EMRadius(emSamp); + totEn += emEnergy[emSamp]; + } + } + + if (totEn > 0.0) { + return emRadAll / totEn; + } + return -99.0; +} + +double TauAllCaloDRFex::caloRadius(const TrigTauClusterDetails* clusterDetails) +{ + double caloRad = 0.0; + double totEn = 0.0; + + double emEnergy[4] = {0.0, 0.0, 0.0, 0.0}; + double hadEnergy[3] = {0.0, 0.0, 0.0}; + + for (int iS=0; iS<4; iS++) { + switch (m_defaultWidth) { + case 0: + emEnergy[iS] = clusterDetails->EMenergyNarrow(iS); + if (iS<3) + hadEnergy[iS] = clusterDetails->HADenergyNarrow(iS); + break; + case 1: + emEnergy[iS] = clusterDetails->EMenergyMedium(iS); + if (iS<3) + hadEnergy[iS] = clusterDetails->HADenergyMedium(iS); + break; + case 2: + emEnergy[iS] = clusterDetails->EMenergyWide(iS); + if (iS<3) + hadEnergy[iS] = clusterDetails->HADenergyWide(iS); + break; + } + } + + + for(int emSamp = 0; emSamp <= 3; emSamp++) { + if( emEnergy[emSamp] > 0.0 && fabs(clusterDetails->EMRadius(emSamp)) < 90.0) { + caloRad += emEnergy[emSamp] * clusterDetails->EMRadius(emSamp); + totEn += emEnergy[emSamp]; + } + } + for(int hadSamp = 0; hadSamp <= 2; hadSamp++) { + if( hadEnergy[hadSamp] > 0.0 && fabs(clusterDetails->HADRadius(hadSamp)) < 90.0) { + caloRad += hadEnergy[hadSamp] * clusterDetails->HADRadius(hadSamp); + totEn += hadEnergy[hadSamp]; + } + } + if(totEn > 0.0) { + return caloRad / totEn; + } + return -99.0; +} + +double TauAllCaloDRFex::hadRadius(const TrigTauClusterDetails* clusterDetails) +{ + double hadRad = 0.0; + double totEn = 0.0; + + double hadEnergy[3] = {0.0, 0.0, 0.0}; + + for (int iS=0; iS<3; iS++) { + switch (m_defaultWidth) { + case 0: + hadEnergy[iS] = clusterDetails->HADenergyNarrow(iS); + break; + case 1: + hadEnergy[iS] = clusterDetails->HADenergyMedium(iS); + break; + case 2: + hadEnergy[iS] = clusterDetails->HADenergyWide(iS); + break; + } + } + + + for(int hadSamp = 0; hadSamp <= 2; hadSamp++) { + if(hadEnergy[hadSamp] > 0.0 && fabs(clusterDetails->HADRadius(hadSamp)) < 90.0) { + hadRad += hadEnergy[hadSamp] * clusterDetails->HADRadius(hadSamp); + totEn += hadEnergy[hadSamp]; + } + } + + if(totEn > 0.0) { + return hadRad / totEn; + } + return -99.0; +} + + + +double TauAllCaloDRFex::coreFraction(const TrigTauClusterDetails* clusterDetails) +{ + double ERawNarrow = (clusterDetails->EMenergyNarrow(0) + + clusterDetails->EMenergyNarrow(1) + + clusterDetails->EMenergyNarrow(2) + + clusterDetails->EMenergyNarrow(3) + + clusterDetails->HADenergyNarrow(0) + + clusterDetails->HADenergyNarrow(1) + + clusterDetails->HADenergyNarrow(2)); + + double ERawMedium = (clusterDetails->EMenergyMedium(0) + + clusterDetails->EMenergyMedium(1) + + clusterDetails->EMenergyMedium(2) + + clusterDetails->EMenergyMedium(3) + + clusterDetails->HADenergyMedium(0) + + clusterDetails->HADenergyMedium(1) + + clusterDetails->HADenergyMedium(2)); + + if(ERawMedium > 0.0) { + return ERawNarrow / ERawMedium; + } + return -99.0; +} + +double TauAllCaloDRFex::emFraction(const TrigTauCluster* ptrigTauCluster) +{ + float totEn = ptrigTauCluster->EMenergy() + ptrigTauCluster->HADenergy(); + if(totEn != 0.0) { + return ptrigTauCluster->EMenergy() / totEn; + } + + return -99.0; +} + +double TauAllCaloDRFex::calcEnergyPhi(double energyNegPhi, double energyPosPhi, double EnergyMediumNegPhi, double EnergyMediumPosPhi, double energyNegPhiConv) +{ + double AvgNegPhi = 0.; + double AvgPosPhi = 0.; + double energyPhi = 0.; + + if (EnergyMediumNegPhi > 0. ){ + AvgNegPhi = energyNegPhi / EnergyMediumNegPhi; + } else { + AvgNegPhi = -999.0; + } + + if (EnergyMediumPosPhi > 0. ){ + AvgPosPhi = energyPosPhi / EnergyMediumPosPhi; + } else { + AvgPosPhi = -999.0; + } + + if (AvgPosPhi==-999.0) { + if (AvgNegPhi != -999.0) { + energyPhi = AvgNegPhi; + } + } + + if (AvgNegPhi==-999.0) { + if (AvgPosPhi != -999.0) { + energyPhi = AvgPosPhi; + } + } + + if (AvgNegPhi != -999.0 && AvgPosPhi != -999.0) { + if ( (AvgNegPhi > (-M_PI/2.0)) && (AvgPosPhi < (M_PI/2.0)) ) { + energyPhi = (energyNegPhi + energyPosPhi)/ + (EnergyMediumNegPhi + EnergyMediumPosPhi); + } else { + if ((AvgNegPhi < (-M_PI/2.0)) && (AvgPosPhi > (M_PI/2.0))) { + energyPhi = (energyNegPhiConv + energyPosPhi)/ + (EnergyMediumNegPhi + EnergyMediumPosPhi); + if (energyPhi > M_PI) { + energyPhi = energyPhi - 2*M_PI; + } + } + } + } + return energyPhi; +} + +bool TauAllCaloDRFex::getdR(double compPhi, double compEta, double etaCell, double phiCell, double dRCut, double& dR) +{ + + float dEta = fabs(etaCell - compEta); + if( dEta > dRCut ) return false; + float dPhi = fabs(phiCell - compPhi); + if( dPhi > M_PI ) dPhi = 2*M_PI - dPhi; + if( dPhi > dRCut ) return false; + dR = std::sqrt(dEta*dEta + dPhi*dPhi); + if( dR > dRCut ) return false; + return true; + +} + +double TauAllCaloDRFex::getEMEnergy(const TrigTauClusterDetails* clusterDetails, int widthChoice) +{ + double EMEnergy; + switch (widthChoice) + { + case 0: + EMEnergy = (clusterDetails->EMenergyNarrow(0)+ + clusterDetails->EMenergyNarrow(1)+ + clusterDetails->EMenergyNarrow(2)+ + clusterDetails->EMenergyNarrow(3)); + break; + case 1: + EMEnergy = (clusterDetails->EMenergyMedium(0)+ + clusterDetails->EMenergyMedium(1)+ + clusterDetails->EMenergyMedium(2)+ + clusterDetails->EMenergyMedium(3)); + break; + case 2: + EMEnergy = (clusterDetails->EMenergyWide(0)+ + clusterDetails->EMenergyWide(1)+ + clusterDetails->EMenergyWide(2)+ + clusterDetails->EMenergyWide(3)); + break; + default: + EMEnergy = (clusterDetails->EMenergyNarrow(0)+ + clusterDetails->EMenergyNarrow(1)+ + clusterDetails->EMenergyNarrow(2)+ + clusterDetails->EMenergyNarrow(3)); + + } + return EMEnergy; +} + +double TauAllCaloDRFex::getHADEnergy(const TrigTauClusterDetails* clusterDetails, int widthChoice) +{ + double HADEnergy; + switch (widthChoice) + { + case 0: + HADEnergy = (clusterDetails->HADenergyNarrow(0)+ + clusterDetails->HADenergyNarrow(1)+ + clusterDetails->HADenergyNarrow(2)); + break; + case 1: + HADEnergy = (clusterDetails->HADenergyMedium(0)+ + clusterDetails->HADenergyMedium(1)+ + clusterDetails->HADenergyMedium(2)); + break; + case 2: + HADEnergy = (clusterDetails->HADenergyWide(0)+ + clusterDetails->HADenergyWide(1)+ + clusterDetails->HADenergyWide(2)); + break; + default: + HADEnergy = (clusterDetails->HADenergyNarrow(0)+ + clusterDetails->HADenergyNarrow(1)+ + clusterDetails->HADenergyNarrow(2)); + + } + + return HADEnergy; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTau/src/components/TrigT2CaloTau_entries.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/components/TrigT2CaloTau_entries.cxx new file mode 100644 index 000000000000..4f403a0aa6ab --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTau/src/components/TrigT2CaloTau_entries.cxx @@ -0,0 +1,7 @@ +#include "TrigT2CaloTau/T2CaloTau.h" +#include "TrigT2CaloTau/TauAllCaloDRFex.h" + +DECLARE_COMPONENT( T2CaloTau ) + +DECLARE_COMPONENT( TauAllCaloDRFex ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/CMakeLists.txt new file mode 100644 index 000000000000..ccf23c25f80d --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/CMakeLists.txt @@ -0,0 +1,36 @@ +################################################################################ +# Package: TrigT2CaloTileMon +################################################################################ + +# Declare the package name: +atlas_subdir( TrigT2CaloTileMon ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + GaudiKernel + Trigger/TrigAlgorithms/TrigT2CaloCommon + Trigger/TrigEvent/TrigCaloEvent + Trigger/TrigEvent/TrigSteeringEvent + PRIVATE + Calorimeter/CaloGeoHelpers + Trigger/TrigT1/TrigT1Interfaces ) + +# External dependencies: +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Component(s) in the package: +atlas_add_library( TrigT2CaloTileMonLib + src/*.cxx + PUBLIC_HEADERS TrigT2CaloTileMon + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel TrigCaloEvent TrigSteeringEvent TrigT2CaloCommonLib + PRIVATE_LINK_LIBRARIES CaloGeoHelpers TrigT1Interfaces ) + +atlas_add_component( TrigT2CaloTileMon + src/components/*.cxx + INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} + LINK_LIBRARIES ${ROOT_LIBRARIES} GaudiKernel TrigT2CaloCommonLib TrigCaloEvent TrigSteeringEvent CaloGeoHelpers TrigT1Interfaces TrigT2CaloTileMonLib ) + +# Install files from the package: +atlas_install_python_modules( python/*.py ) + diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/T2CaloTileMon.h b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/T2CaloTileMon.h new file mode 100755 index 000000000000..35564527824d --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/T2CaloTileMon.h @@ -0,0 +1,76 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: T2CaloTileMon.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon + + AUTHOR: D.O. Damazion Jens Damaske + + PURPOSE: Based on T2CaloBase works as main driver for the LVL2 + Calorimeter TileMon Algorithm. Receives and decodes LVL1 + information (RoI position) and just makes some monitoring + *******************************************************************/ + +#ifndef TRIGT2CALOTILEMON_T2CALOTILEMON_H +#define TRIGT2CALOTILEMON_T2CALOTILEMON_H + +#include <string> +#include "TrigT2CaloCommon/T2CaloBase.h" +#include "GaudiKernel/ToolHandle.h" + +class IAlgToolCalo; +class T2CaloEgammaMon; +class MsgStream; +class TrigEMCluster; +class TrigT2TileJet; +class TrigT2Tower; + +/** Main LVL2 Algorithm. Processes LVL1 information, call FEX + IAlgToolCalos and produces the TrigEMCluster output. */ +class T2CaloTileMon: public T2CaloBase { + + public: + /** Constructor */ + T2CaloTileMon(const std::string & name, ISvcLocator* pSvcLocator); + /** Destructor */ + ~T2CaloTileMon(); + + /** hltExecute will call FEX IAlgToolCalo::execute() to process RoI. + called by the Steering per EMRoI. */ + HLT::ErrorCode hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* outputTE); + /** hltInitialize. Called by the Steering. */ + HLT::ErrorCode hltInitialize(); + /** hltFinalize. Called by the Steering. */ + HLT::ErrorCode hltFinalize(); + + private: + /** To support new monitoring. Values must be copied to + this monitored Cluster for each RoI. */ + //const TrigEMCluster* m_monitoredCluster; + /** To monitor rCore */ + //float m_rCore; + /** To monitor eRatio */ + //float m_eRatio; + /** Forced LVL1 eta */ + float m_l1eta; + /** Forced LVL1 phi */ + float m_l1phi; + + //int m_index; + + // Properties: + std::string m_trigEmClusterKey; + /** Will monitoring be used or not */ + //bool m_mon; + /** Coordinates to be used by the tools (in order by tool) */ + std::vector<float> m_etamin; + std::vector<float> m_etamax; + std::vector<float> m_phimin; + std::vector<float> m_phimax; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TileMonHadEnFex.h b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TileMonHadEnFex.h new file mode 100755 index 000000000000..86b74bca0f6c --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TileMonHadEnFex.h @@ -0,0 +1,80 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: TileMonHadEnFex.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon + + AUTHOR: D.O.Damazio + + PURPOSE: Based on Cluster position defined in the second + EM Calorimeter layer, calculates total Had cluster + energy. + *******************************************************************/ + +#ifndef TRIGT2CALOTILEMON_TILEMONHADENFEX_H +#define TRIGT2CALOTILEMON_TILEMONHADENFEX_H + +#include "TrigT2CaloCommon/IAlgToolCalo.h" +#include "GaudiKernel/AlgTool.h" +#include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/ITHistSvc.h" +#include "GaudiKernel/IIncidentSvc.h" +#include "GaudiKernel/IIncidentListener.h" +#include "TH1.h" +#include "TH2.h" + + +/** Feature extraction Tool for LVL2 Calo. Hadronic EndCaps + and Tile Calorimeter. All Samples */ +class TileMonHadEnFex: public IAlgToolCalo, virtual public IIncidentListener +{ + public: + TileMonHadEnFex(const std::string & type, const std::string & name, + const IInterface* parent); + virtual ~TileMonHadEnFex(); + using IAlgToolCalo::execute; + /** @brief execute feature extraction for the EM Calorimeter + * second layer + * @param[out] rtrigEmCluster is the output cluster. + * @param[in] eta/phi-min/max = RoI definition. + */ + StatusCode execute(TrigEMCluster &rtrigEmCluster,double etamin, + double etamax, double phimin, double phimax); + StatusCode initialize(); + StatusCode finalize(); + TH1*** hists(){ return m_hists; } + /** handle to init a new event */ + void handle (const Incident& ); + double logEnergy(double energy); +// void BinLogY(TH2* h); + + private: + ServiceHandle<ITHistSvc> m_thistSvc; + float m_THR_1; + float m_THR_2; + float m_end_detec_eta; + float m_end_detec_phi; + float m_eta_division; + float m_phi_division; + float m_energyCell_Thr; + + //Monitoring + TH1*** m_hists; + //TH1*** m_hist_TB0; //TileBar0 + //TH1*** m_hist_TB1; //TileBar1 + //TH1*** m_hist_TB2; //TileBar2 + TH2F** m_2dhists; + TH2F** m_2dhists_TB0; //TileBar0 + TH2F** m_2dhists_TB1; //TileBar1 + TH2F** m_2dhists_TB2; //TileBar2 + //TH2* m_mainHist; + std::string m_histPath; + bool m_configured; + +}; + + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2TileJet.h b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2TileJet.h new file mode 100755 index 000000000000..f2c2b311da41 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2TileJet.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: TrigT2TileJet.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon + + AUTHOR: Jens Damaske + + *******************************************************************/ + +#ifndef TRIGT2CALOTILEMON_TRIGTT2TILEJET_H +#define TRIGT2CALOTILEMON_TRIGTT2TILEJET_H + +// #include "TrigCaloEvent/TrigEMCluster.h" +#include "TrigCaloEvent/Trig3Momentum.h" +/// #include "Trig3Momentum.h" + +#include "TrigT2CaloTileMon/TrigT2Tower.h" +/// #include "TrigT2Tower.h" + +#include "GaudiKernel/MsgStream.h" + +#include <vector> +#include <iostream> + +/** LVL2 Trigger TileJet Class */ +class TrigT2TileJet /* : public TrigEMCluster */ +{ + + public: + // Default ctor/dtor. + + void insertCell(const Trig3Momentum& newCell, MsgStream& log); + void searchTowerAndInsert( const Trig3Momentum& cell, MsgStream& log, double etaShift = 0.0 ); + + /** find hottest Tower */ + bool findHottestTower(TrigT2Tower &tower) const; + + /** debugging */ + void print(MsgStream& log) const; + + private: + /** vector of TrigT2Tower elements that compose Jet */ + std::vector<TrigT2Tower> m_towercollection; +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2Tower.h b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2Tower.h new file mode 100644 index 000000000000..45a087ad9188 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/TrigT2CaloTileMon/TrigT2Tower.h @@ -0,0 +1,80 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: TrigT2Tower.h + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon + + AUTHOR: Jens Damaske + PURPOSE: Compines 3 Trig3Momentum Objects to a Tower + + *******************************************************************/ + +#ifndef TRIGT2CALOTILEMON_TRIGTT2TOWER_H +#define TRIGT2CALOTILEMON_TRIGTT2TOWER_H + +#include "TrigCaloEvent/Trig3Momentum.h" +/// #include "Trig3Momentum.h" + +#include "GaudiKernel/MsgStream.h" + +#include <sstream> +#include <iostream> +#include <cmath> + +/** + 3 cells of type Trig3Momentum per tower + "cell.inCone is used as cell.inTower" +*/ +class TrigT2Tower{ + + public: + /** Default Constructor */ + TrigT2Tower(); + TrigT2Tower(const Trig3Momentum& newCell, MsgStream& log, double etaShift=0.0); + + // Get methods + /** Get the energy */ + double e() const {return m_e; } + /** Get the eta position */ + double eta() const {return m_eta; } + /** Get the phi position */ + double phi() const {return m_phi; } + /** Return if tower consists of 3 cells */ + bool isComplete() const {return m_full; } + /** Check if newCell belongs to this tower */ + bool isMember(const Trig3Momentum& newCell, MsgStream& log, double etaShift=0.0) const; + Trig3Momentum cell(int i) const {return m_cells[i]; } + + // Set methods + /** Set energy */ + void setE(double e) {m_e = e; } + /** Set eta */ + void setEta(double eta) {m_eta = eta; } + /** Set phi */ + void setPhi(double phi) {m_phi = phi; } + /** Flag if tower is full */ + void setComplete(bool isComplete) {m_full = isComplete;} + /** Insert cell */ + bool insertCell(const Trig3Momentum& newCell, MsgStream& log); + + // debugging + void print(MsgStream& log, MSG::Level level) const; + + private: + /** Energy */ + double m_e; + /** Eta */ + double m_eta; + /** Phi */ + double m_phi; + /** is full tower */ + bool m_full; + /** tower cells one for each layer */ + Trig3Momentum m_cells[3]; + +}; + +#endif diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/python/TrigT2CaloTileMonConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/python/TrigT2CaloTileMonConfig.py new file mode 100755 index 000000000000..6b30ec851ceb --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/python/TrigT2CaloTileMonConfig.py @@ -0,0 +1,36 @@ +# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + + +from TrigT2CaloTileMon.TrigT2CaloTileMonConf import TileMonHadEnFex +from TrigT2CaloTileMon.TrigT2CaloTileMonConf import T2CaloTileMon + +#from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram +#from TrigMonitorBase.TrigGenericMonitoringToolConfig import TrigGenericMonitoringToolConfig + +#from AthenaCommon.Constants import VERBOSE,DEBUG + +class TileMonHadEnFex(TileMonHadEnFex): + __slots__ = [] + def __init__ (self, name="TileMonHadEnFex"): + super(TileMonHadEnFex,self).__init__(name) + self.THR_1=100 + self.HistogramsPath="/EXPERT/TileMonHadEnFex" + + +class T2CaloCosmic_Cosmic (T2CaloTileMon): + __slots__ = [] + def __init__ (self, name="T2CaloCosmic_Cosmic"): + super(T2CaloTileMon, self).__init__(name) + # here put your customizations + self.IAlgToolList= [TileMonHadEnFex() ] + self.IAlgToolList[0].HistogramsPath= "/EXPERT/" + self.IAlgToolList[0].HistogramsPath+=name + self.doTiming=True + +class T2CaloTileMon_TileMon (T2CaloTileMon): + __slots__ = [] + def __init__ (self, name="T2CaloTileMon_TileMon"): + super(T2CaloTileMon, self).__init__(name) + # here put your customizations + self.IAlgToolList= [TileMonHadEnFex() ] + self.doTiming=True diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/T2CaloTileMon.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/T2CaloTileMon.cxx new file mode 100755 index 000000000000..dcf3165a4109 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/T2CaloTileMon.cxx @@ -0,0 +1,156 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: T2CaloTileMon.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon +// +// AUTHOR: D.O. Damazio, Jens Damaske +// +// - Add variables for job option controlled region limits, set defaults +// to most likely values. +// - Add function EtaPhiRange to return the maximum and minimum eta or phi +// values to use when calculating energy sums over a region - R. Soluk +// ******************************************************************** + +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IToolSvc.h" +#include "GaudiKernel/StatusCode.h" + +#include "TrigT1Interfaces/RecEmTauRoI.h" +#include "TrigSteeringEvent/TrigRoiDescriptor.h" +#include "TrigSteeringEvent/PhiHelper.h" + +#include "TrigCaloEvent/TrigEMClusterContainer.h" +#include "TrigT2CaloTileMon/TrigT2TileJet.h" +#include "TrigT2CaloTileMon/TrigT2Tower.h" + +#include "TrigT2CaloTileMon/T2CaloTileMon.h" +#include "TrigT2CaloCommon/IAlgToolCalo.h" + +class ISvcLocator; + +T2CaloTileMon::T2CaloTileMon(const std::string & name, ISvcLocator* pSvcLocator) : + T2CaloBase(name, pSvcLocator) +{ + declareProperty("TrigEMClusterKey",m_trigEmClusterKey = "T2CaloTrigEMCluster"); + declareProperty("L1ForceEta",m_l1eta = -10.0); + declareProperty("L1ForcePhi",m_l1phi = -10.0); + declareProperty("EtaMin",m_etamin); + declareProperty("EtaMax",m_etamax); + declareProperty("PhiMin",m_phimin); + declareProperty("PhiMax",m_phimax); + +} + +T2CaloTileMon::~T2CaloTileMon() +{ +} + + +HLT::ErrorCode T2CaloTileMon::hltInitialize() +{ + return HLT::OK; +} + + +HLT::ErrorCode T2CaloTileMon::hltExecute(const HLT::TriggerElement* inputTE, + HLT::TriggerElement* /*outputTE*/) +{ + // Time total T2CaloTileMon execution time. + if ( m_timersvc ) m_timer[0]->start(); + +#ifndef NDEBUG + ATH_MSG_INFO( "in execute()" ); +#endif + + const TrigRoiDescriptor* roiDescriptor = 0; + HLT::ErrorCode hltStatus = getFeature(inputTE, roiDescriptor); + + if ( hltStatus == HLT::OK ) { +#ifndef NDEBUG + ATH_MSG_DEBUG( *roiDescriptor ); +#endif + } + else + { + ATH_MSG_WARNING( " Failed to find RoiDescriptor " ); + return hltStatus; + } + + // End LVL1 part + double etamin, etamax, phimin, phimax; + if ( (m_l1eta<-9.9)&&(m_l1phi<-9.9)){ + etamin = std::max(-2.5,roiDescriptor->eta() - m_etaWidth); + etamax = std::min( 2.5,roiDescriptor->eta() + m_etaWidth); + phimin = HLT::wrapPhi(roiDescriptor->phi() - m_phiWidth); + phimax = HLT::wrapPhi(roiDescriptor->phi() + m_phiWidth); + } else { + etamin = std::max(-2.5,m_l1eta - m_etaWidth); + etamax = std::min( 2.5,m_l1eta + m_etaWidth); + phimin = HLT::wrapPhi(m_l1phi - m_phiWidth); + phimax = HLT::wrapPhi(m_l1phi + m_phiWidth); + } + +#ifndef NDEBUG + ATH_MSG_DEBUG( " etamin = "<< etamin ); + ATH_MSG_DEBUG( " etamax = "<< etamax ); + ATH_MSG_DEBUG( " phimin = "<< phimin ); + ATH_MSG_DEBUG( " phimax = "<< phimax ); +#endif + + /// TrigRoiDescriptor* newroi = new TrigRoiDescriptor( roiDescriptor->eta(), etamin, etamax, + /// roiDescriptor->phi(), phimin, phimax ); + + /// attachFeature( outputTE, newroi, "T2CaloTimeMon"); + /// Tile RS shoudl map to it's own requirements niw - we can + ///still use d-pi .. pi wrapping + + const TrigRoiDescriptor newroi( roiDescriptor->eta(), etamin, etamax, + roiDescriptor->phi(), phimin, phimax ); + + +#ifndef NDEBUG + ATH_MSG_DEBUG( " Making TrigEMCluster " ); +#endif + + + //std::vector<xAOD::TrigEMCluster*> vec_clus; + // Ok, ignoring LVL1 and forcing a position + + ToolHandleArray<IAlgToolCalo>::iterator it = m_emAlgTools.begin(); + if ( m_timersvc ) m_timer[1]->start(); + + //TrigEMCluster* ptrigEmCluster = new TrigT2TileJet(); + xAOD::TrigEMCluster* ptrigEmCluster = new xAOD::TrigEMCluster(); + for (; it < m_emAlgTools.end(); it++) + { + + // if ((*it)->execute(*ptrigEmCluster,etamin,etamax,phimin,phimax).isFailure() ) + if ((*it)->execute(*ptrigEmCluster,newroi, caloDDENull).isFailure() ) + { + ATH_MSG_WARNING( "T2Calo AlgToolTileMon returned Failure" ); + return HLT::TOOL_FAILURE; + } + } + delete ptrigEmCluster; // in for loop will be destroyed automatically + + if ( m_timersvc ) m_timer[1]->stop(); + + // Time total T2CaloTileMon execution time. + if ( m_timersvc ) m_timer[0]->stop(); + + return HLT::OK; +} + + +HLT::ErrorCode T2CaloTileMon::hltFinalize(){ + +#ifndef NDEBUG + ATH_MSG_INFO( "in finalize()" ); +#endif + + return HLT::OK; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TileMonHadEnFex.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TileMonHadEnFex.cxx new file mode 100755 index 000000000000..ec5551a799c1 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TileMonHadEnFex.cxx @@ -0,0 +1,424 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TileMonHadEnFex.cxx +// PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon +// +// AUTHOR: Jens Damaske +// +// ******************************************************************** + +#include "TrigCaloEvent/TrigEMCluster.h" +#include "TrigT2CaloTileMon/TrigT2TileJet.h" +#include "TrigT2CaloTileMon/TrigT2Tower.h" +#include "TrigCaloEvent/Trig3Momentum.h" +#include "CaloGeoHelpers/CaloSampling.h" + +#include "TrigT2CaloTileMon/TileMonHadEnFex.h" +#include "TrigT2CaloCommon/Calo_Def.h" + +#include <math.h> +#include <TMath.h> +#include <string> + + +TileMonHadEnFex::TileMonHadEnFex(const std::string & type, const std::string & name, + const IInterface* parent) : + IAlgToolCalo(type, name, parent), + m_thistSvc("THistSvc/THistSvc","TileMonHadEnFex"), + m_THR_1(400), + m_THR_2(100), + m_hists(NULL), + //m_hist_TB0(NULL), + //m_hist_TB1(NULL), + //m_hist_TB2(NULL), + m_2dhists(NULL), + m_2dhists_TB0(NULL), + m_2dhists_TB1(NULL), + m_2dhists_TB2(NULL) + //m_mainHist(NULL) +{ + declareProperty("THistSvc",m_thistSvc,"THistSvc output"); + declareProperty("HistogramsPath",m_histPath="/EXPERT/T2CaloTileMon"); + declareProperty("THR_1",m_THR_1); + declareProperty("THR_2",m_THR_2); + m_end_detec_eta = 1.6; + m_end_detec_phi = M_PI; + m_eta_division = 0.1; + m_phi_division = M_PI/32.; + m_energyCell_Thr = 0.01; //Threshold in Gev + m_configured=false; +} + +TileMonHadEnFex::~TileMonHadEnFex(){ +} + +StatusCode TileMonHadEnFex::initialize(){ + if ( IAlgToolCalo::initialize().isFailure() ) + return StatusCode::FAILURE; + if ( m_thistSvc.retrieve().isFailure() ) + return StatusCode::FAILURE; + IIncidentSvc* p_incSvc; + if ( service("IncidentSvc",p_incSvc, true).isFailure() ) { + return StatusCode::FAILURE; + } + else + { + p_incSvc->addListener(this, "BeginRun",100); + } + + return StatusCode::SUCCESS; +} + + +double TileMonHadEnFex::logEnergy(double energy) +{ + energy = energy/1.e3; // energy in GeV + energy = TMath::Log(energy); + return energy; +} + +/** +* @brief changes the Y-axis binning of a given histogram to a logarithmic scale +* +* NOT SUPPORTED BY ONLINE HISTO GATHERER +* +* For a given histogram the Y-axis binning is changed form a linear to a logarithmic scale +* Take care, that the axis minimum is > 0 +* +* @param[in] h pointer to the histogram +*/ +// void TileMonHadEnFex::BinLogY(TH2* h) +// { +// TAxis *axis = h->GetYaxis(); +// int bins = axis->GetNbins(); +// Axis_t min = axis->GetXmin(); +// Axis_t max = axis->GetXmax(); +// Axis_t width = (max - min) / bins; +// Axis_t *new_bins = new Axis_t[bins + 1]; +// +// double logWidth = ( TMath::Log(max)-TMath::Log(min) ) / bins; +// +// // cout << "min:" << min << " max:" << max << " bins:" << bins << " logWidth:" << logWidth << endl; +// +// for (int i = 0; i <= bins; i++) { +// // cout << min + i * width << "\t"; +// new_bins[i] = min*TMath::Exp(i * logWidth); +// // cout << new_bins[i] << endl; +// } +// axis->Set(bins, new_bins); +// delete new_bins; +// } + +void TileMonHadEnFex::handle( const Incident& ) +{ + m_configured=false; + + m_2dhists = new TH2F* [(int)floorf((2*m_end_detec_eta)/m_eta_division)]; //2D histo Et vs phi + m_2dhists_TB0 = new TH2F* [(int)floorf((2*m_end_detec_eta)/m_eta_division)]; //2D histo Et vs phi for TileBar0 and TileExt0 + m_2dhists_TB1 = new TH2F* [(int)floorf((2*m_end_detec_eta)/m_eta_division)]; //2D histo Et vs phi for TileBar1 and TileExt1 + m_2dhists_TB2 = new TH2F* [(int)floorf((2*m_end_detec_eta)/m_eta_division)]; //2D histo Et vs phi for TileBar2 and TileExt2 + + for(float eta=-m_end_detec_eta;eta<m_end_detec_eta;eta+=m_eta_division) + { + int hist_grid_eta=(int)floorf(((eta)+m_end_detec_eta)/m_eta_division); + char name_2dhist[60]; + char name_2dhist_TB0[60]; + char name_2dhist_TB1[60]; + char name_2dhist_TB2[60]; + char name_2dhist_toreg[100]; + char name_2dhist_toreg_TB0[100]; + char name_2dhist_toreg_TB1[100]; + char name_2dhist_toreg_TB2[100]; + + float etaN = eta; + float epsilon = 0.00001; + + sprintf(name_2dhist,"TowerMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); //Tower + if (etaN <= (-1.1 + epsilon) || etaN >= (1.0 - epsilon) ) //Extended Barrel - Cell + { + sprintf(name_2dhist_TB0,"TE0_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + sprintf(name_2dhist_TB1,"TE1_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + sprintf(name_2dhist_TB2,"TE2_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + } + else if( etaN > (-1.1 + epsilon) && etaN < (1.0 - epsilon) ) //Central Barrel - Cell + { + sprintf(name_2dhist_TB0,"TB0_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + sprintf(name_2dhist_TB1,"TB1_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + sprintf(name_2dhist_TB2,"TB2_CellMonitor_eta=%-2.1f_%-2.1f",etaN,etaN+m_eta_division); + } + + sprintf(name_2dhist_toreg,"%s/TowerMonitor_n=%-2.1f",m_histPath.c_str(),etaN); //Tower + if (etaN <= (-1.1 + epsilon) || etaN >= (1.0 - epsilon) ) //Extended Barrel - Cell + { + sprintf(name_2dhist_toreg_TB0,"%s/TileExt0/TE0_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + sprintf(name_2dhist_toreg_TB1,"%s/TileExt1/TE1_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + sprintf(name_2dhist_toreg_TB2,"%s/TileExt2/TE2_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + } + else if( etaN > (-1.1 + epsilon) && etaN < (1.0 - epsilon) ) //Central Barrel - Cell + { + sprintf(name_2dhist_toreg_TB0,"%s/TileBar0/TB0_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + sprintf(name_2dhist_toreg_TB1,"%s/TileBar1/TB1_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + sprintf(name_2dhist_toreg_TB2,"%s/TileBar2/TB2_CellMonitor_n=%-2.1f",m_histPath.c_str(),etaN); + } + + std::string str1 =name_2dhist; + std::string str2=name_2dhist_TB0; + std::string str3=name_2dhist_TB1; + std::string str4=name_2dhist_TB2; + std::string str5=name_2dhist_toreg; + std::string str6=name_2dhist_toreg_TB0; + std::string str7=name_2dhist_toreg_TB1; + std::string str8=name_2dhist_toreg_TB2; + + std::string dot("."); + + if ( str1.find(".") != std::string::npos ) str1.replace(str1.find("."),dot.length(),"_"); + if ( str1.find(".") != std::string::npos ) str1.replace(str1.find("."),dot.length(),"_"); + + if ( str2.find(".") != std::string::npos ) str2.replace(str2.find("."),dot.length(),"_"); + if ( str2.find(".") != std::string::npos ) str2.replace(str2.find("."),dot.length(),"_"); + + if ( str3.find(".") != std::string::npos ) str3.replace(str3.find("."),dot.length(),"_"); + if ( str3.find(".") != std::string::npos ) str3.replace(str3.find("."),dot.length(),"_"); + + if ( str4.find(".") != std::string::npos ) str4.replace(str4.find("."),dot.length(),"_"); + if ( str4.find(".") != std::string::npos ) str4.replace(str4.find("."),dot.length(),"_"); + + if ( str5.find(".") != std::string::npos ) str5.replace(str5.find("."),dot.length(),"_"); + + if ( str6.find(".") != std::string::npos ) str6.replace(str6.find("."),dot.length(),"_"); + + if ( str7.find(".") != std::string::npos ) str7.replace(str7.find("."),dot.length(),"_"); + + if ( str8.find(".") != std::string::npos ) str8.replace(str8.find("."),dot.length(),"_"); + + strcpy(name_2dhist,str1.c_str()); + strcpy(name_2dhist_TB0,str2.c_str()); + strcpy(name_2dhist_TB1,str3.c_str()); + strcpy(name_2dhist_TB2,str4.c_str()); + strcpy(name_2dhist_toreg,str5.c_str()); + strcpy(name_2dhist_toreg_TB0,str6.c_str()); + strcpy(name_2dhist_toreg_TB1,str7.c_str()); + strcpy(name_2dhist_toreg_TB2,str8.c_str()); + + + /** + * Energy range should be from 0.02GeV - 50GeV with a precision of 1% + * we insert tower energy as ln(energy), so we need an energy axis from -4 to 4 with 800 bins + */ + m_2dhists[hist_grid_eta] = new TH2F(name_2dhist,name_2dhist,(int)floorf(2*m_end_detec_phi/m_phi_division),-m_end_detec_phi,m_end_detec_phi,800,-4.,4.); + m_2dhists[hist_grid_eta]->SetXTitle("#phi[#circ]"); + m_2dhists[hist_grid_eta]->SetYTitle("ln(E_{T}) [GeV]"); + + m_2dhists_TB0[hist_grid_eta] = new TH2F(name_2dhist_TB0,name_2dhist_TB0,(int)floorf(2*m_end_detec_phi/m_phi_division),-m_end_detec_phi,m_end_detec_phi,800,-4.,4.); + m_2dhists_TB0[hist_grid_eta]->SetXTitle("#phi[#circ]"); + m_2dhists_TB0[hist_grid_eta]->SetYTitle("ln(E_{T}) [GeV]"); + + m_2dhists_TB1[hist_grid_eta] = new TH2F(name_2dhist_TB1,name_2dhist_TB1,(int)floorf(2*m_end_detec_phi/m_phi_division),-m_end_detec_phi,m_end_detec_phi,800,-4.,4.); + m_2dhists_TB1[hist_grid_eta]->SetXTitle("#phi[#circ]"); + m_2dhists_TB1[hist_grid_eta]->SetYTitle("ln(E_{T}) [GeV]"); + + m_2dhists_TB2[hist_grid_eta] = new TH2F(name_2dhist_TB2,name_2dhist_TB2,(int)floorf(2*m_end_detec_phi/m_phi_division),-m_end_detec_phi,m_end_detec_phi,800,-4.,4.); + m_2dhists_TB2[hist_grid_eta]->SetXTitle("#phi[#circ]"); + m_2dhists_TB2[hist_grid_eta]->SetYTitle("ln(E_{T}) [GeV]"); + + if ( m_thistSvc->regHist(name_2dhist_toreg,m_2dhists[hist_grid_eta]).isFailure() ) msg() << MSG::ERROR << "Did not register hists" << endmsg; //return StatusCode::FAILURE; + if ( m_thistSvc->regHist(name_2dhist_toreg_TB0,m_2dhists_TB0[hist_grid_eta]).isFailure() ) msg() << MSG::ERROR << "Did not register hists" << endmsg; //return StatusCode::FAILURE; + if ( m_thistSvc->regHist(name_2dhist_toreg_TB1,m_2dhists_TB1[hist_grid_eta]).isFailure() ) msg() << MSG::ERROR << "Did not register hists" << endmsg; //return StatusCode::FAILURE; + if ( m_thistSvc->regHist(name_2dhist_toreg_TB2,m_2dhists_TB2[hist_grid_eta]).isFailure() ) msg() << MSG::ERROR << "Did not register hists" << endmsg; //return StatusCode::FAILURE; + } + + // m_mainHist = new + // TH2F("TT","TT",(int)floorf(2.*m_end_detec_eta/m_eta_division),-m_end_detec_eta,m_end_detec_eta,(int)floorf(2.*m_end_detec_phi/m_phi_division),-m_end_detec_phi,m_end_detec_phi); + // if ( m_thistSvc->regHist("/NT/TT",m_mainHist).isFailure() ) { + // return StatusCode::FAILURE; + // } + + + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << "Histograms correctly allocated" << endmsg; // + m_configured=true; + //return StatusCode::SUCCESS; +} + +StatusCode TileMonHadEnFex::finalize(){ +// Don't delete histograms. ROOT takes care of this. + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HadEnFex: call finalize()" << endmsg; +// for(float eta=-m_end_detec_eta;eta<m_end_detec_eta;eta+=m_eta_division){ +// int hist_grid_eta=(int)floorf(((eta)+m_end_detec_eta)/m_eta_division); +// for(float phi=-m_end_detec_phi;phi<m_end_detec_phi;phi+=m_phi_division){ +// int hist_grid_phi=(int)floorf(((phi)+m_end_detec_phi)/m_phi_division); +// if ( m_hists[hist_grid_eta][hist_grid_phi]->GetMean() != 0 ) +// std::cout << "eta : " << eta << " phi : " << phi << " " << +// hist_grid_eta << " " << hist_grid_phi << " " << +// m_hists[hist_grid_eta][hist_grid_phi]->GetMean() << std::endl; +// m_mainHist->SetBinContent(hist_grid_eta,hist_grid_phi, +// m_hists[hist_grid_eta][hist_grid_phi]->GetMean() ); +// } +// } + + return StatusCode::SUCCESS; +} + +StatusCode TileMonHadEnFex::execute(TrigEMCluster &/*rtrigEmCluster*/,double etamin, + double etamax, double phimin, double phimax) +{ + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HadEnFex: call execute()" << endmsg; + + // If there was a problem in configuration, stop now + if ( !m_configured ) return StatusCode::SUCCESS; + m_tiledecoded=false; + // Time total AlgTool time + if (!m_timersvc.empty()) m_timer[0]->start(); + + // MsgStream log(msgSvc(), name()); +#ifndef NDEBUG + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << "in execute(TrigEMCluster &)" << endmsg; +#endif + + CaloSampling::CaloSample samp; + + if (!m_timersvc.empty()) { + m_timer[1]->start(); + m_timer[1]->pause(); + m_timer[2]->start(); + m_timer[2]->pause(); + m_timer[3]->start(); + m_timer[3]->pause(); + m_timer[4]->start(); + m_timer[4]->pause(); + } + + + // TILECAL Assuming no knowledge about first sample + + // Time to access RegionSelector + if (!m_timersvc.empty()) m_timer[1]->resume(); + + /** + ToolHandle<ITrigDataAccess> m_data is an object that provides data access in a Region of Interest. + is inherited from "/Trigger/TrigAlgorithms/TrigT2CaloCommon/IAlgToolCalo.h"! See TrigT2CaloCommon/ITrigDataAccess.h for more details. + Region Selector, no sample needed + Get detector offline ID's for Collections + */ + m_data->RegionSelector(0,etamin,etamax,phimin,phimax,TILE); + + if (!m_timersvc.empty()) m_timer[1]->pause(); + +#ifndef NDEBUG + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: TILE: TileContSize()" << m_data->TileContSize() << endmsg; +#endif + + TrigT2TileJet jet; + + for (unsigned int iR=0;iR<m_data->TileContSize();iR++) { //loop over TileCal drawers + // Time to access Collection (and ByteStreamCnv ROBs) + if (!m_timersvc.empty()) m_timer[2]->resume(); + // For the first sample you will create the containers + // For the others no + if ( m_data->LoadCollections(m_itBegin,m_itEnd,iR,!iR).isFailure() ) { + return StatusCode::FAILURE; + } + // Finished to access Collection + if (!m_timersvc.empty()) m_timer[2]->pause(); + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->resume(); + + // Each cell must contribute to only one histogram + for(m_itt = m_itBegin;m_itt != m_itEnd; ++m_itt) { //loop over cells + + +// CaloSampling::CaloSample samp; +// samp = CaloSampling::getSampling(*(*m_itt)); +// double cellE = (*m_itt)->e(); + + + const TileCell* tilecell = (*m_itt); + double etaCell = tilecell->eta(); + double phiCell = tilecell->phi(); + double energyCell = tilecell->energy(); + //samp = CaloSampling::getSampling(*tilecell); + samp = tilecell->caloDDE()->getSampling(); + + // BAD CELLS +// if ( tilecell->badcell() ) std::cout << "JENSONBUTTON: e:" << energyCell/1.e3 << ", eta:" << etaCell << ", phi:" << phiCell << ", samp:" << samp << " bad:" << tilecell->badcell() << std::endl; + + // possibly do some tower building + // Energy Eta Phi Layer + Trig3Momentum tile_cell(energyCell,etaCell,phiCell,samp); + jet.insertCell(tile_cell, msg()); + + } // end of loop over cells + + // Algorithmic time + if (!m_timersvc.empty()) m_timer[3]->pause(); + + } // End of loop over TileCal drawers + + + if ( msg().level()<MSG::DEBUG ) + jet.print(msg()); + TrigT2Tower hottest_tower; + jet.findHottestTower(hottest_tower); + + // FILL HISTOS if at least one cell is set. if not RoI is not in Tile Barrel or Ext, Barrel and in consequence Hottest_tower would be emtpy + // Will get bias because of check for > 0.0 but can't be avoided because we take log(e) + if ( (hottest_tower.cell(0).inCone() || hottest_tower.cell(1).inCone() || hottest_tower.cell(2).inCone()) && hottest_tower.e() > 0.0 ) + { + + if ( msg().level() <= MSG::DEBUG ){ + msg() << MSG::DEBUG << " REGTEST: HOTTEST_TOWER: print:" << endmsg; + hottest_tower.print(msg(),MSG::DEBUG); + } + + // TOWER + int hist_grid_eta = (int) floorf( ((hottest_tower.eta()) + m_end_detec_eta)/m_eta_division); + m_2dhists[hist_grid_eta]->Fill((float)hottest_tower.phi(), logEnergy(hottest_tower.e()) ); + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HOTTEST_TOWER: fill in histo: eta:" << hottest_tower.eta() << " phi:"<< (float)hottest_tower.phi() << " log(e):" << logEnergy(hottest_tower.e()) << endmsg; + + // CELLS + if ( hottest_tower.cell(0).inCone() && hottest_tower.cell(0).e() > 0.0 ) + { + m_2dhists_TB0[hist_grid_eta]->Fill((float)hottest_tower.cell(0).phi(), logEnergy(hottest_tower.cell(0).e()) ); + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HOTTEST_CELL_0: fill in histo: eta:" << hottest_tower.cell(0).eta() << " phi:"<< (float)hottest_tower.cell(0).phi() << " log(e):" << logEnergy(hottest_tower.cell(0).e()) << endmsg; + } + + if ( hottest_tower.cell(1).inCone() && hottest_tower.cell(1).e() > 0.0 ) + { + m_2dhists_TB1[hist_grid_eta]->Fill((float)hottest_tower.cell(1).phi(), logEnergy(hottest_tower.cell(1).e()) ); + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HOTTEST_CELL_1: fill in histo: eta:" << hottest_tower.cell(1).eta() << " phi:"<< (float)hottest_tower.cell(1).phi() << " log(e):" << logEnergy(hottest_tower.cell(1).e()) << endmsg; + } + + if ( hottest_tower.cell(2).inCone() && hottest_tower.cell(2).e() > 0.0 ) + { + // eta is different for layer 2 + hist_grid_eta=(int)floorf( ((hottest_tower.cell(2).eta()) + m_end_detec_eta)/m_eta_division); + m_2dhists_TB2[hist_grid_eta]->Fill((float)hottest_tower.cell(2).phi(), logEnergy(hottest_tower.cell(2).e()) ); + if ( msg().level() <= MSG::DEBUG ) + msg() << MSG::DEBUG << " REGTEST: HOTTEST_CELL_2: fill in histo: eta:" << hottest_tower.cell(2).eta() << " phi:"<< (float)hottest_tower.cell(2).phi() << " log(e):" << logEnergy(hottest_tower.cell(2).e()) << endmsg; + } + } + + + // Stop all timers + if (!m_timersvc.empty()){ + m_timer[4]->stop(); + m_timer[3]->stop(); + m_timer[2]->stop(); + m_timer[1]->stop(); + m_timer[0]->stop(); + } + + return StatusCode::SUCCESS; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2TileJet.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2TileJet.cxx new file mode 100755 index 000000000000..c173ee3da9c1 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2TileJet.cxx @@ -0,0 +1,97 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "TrigT2CaloTileMon/TrigT2TileJet.h" +/// #include "TrigT2TileJet.h" +#include "TrigCaloEvent/Trig3Momentum.h" +/// #include "Trig3Momentum.h" + +void TrigT2TileJet::insertCell(const Trig3Momentum& newCell, MsgStream& log) +{ + if ( log.level() <= MSG::DEBUG ){ + log << MSG::DEBUG << " REGTEST: CELL: initial cell info: eta:" << newCell.eta() << " phi:" << newCell.phi() + << " e:" << newCell.e() << " layer:" << newCell.caloSample() << endmsg; + } + + // ONLY TILE BARREL AND EXTEND BARREL ALLOWED TO PASS HERE + if ( + newCell.caloSample() == CaloSampling::TileBar0 || + newCell.caloSample() == CaloSampling::TileBar1 || + newCell.caloSample() == CaloSampling::TileBar2 || + newCell.caloSample() == CaloSampling::TileExt0 || + newCell.caloSample() == CaloSampling::TileExt1 || + newCell.caloSample() == CaloSampling::TileExt2 + ) + { + // if cell in layer 2, cell size is 0.2 x 0.1 + // make a copy of this cell and assign both two a tower + if ( + newCell.caloSample() == CaloSampling::TileBar2 || + newCell.caloSample() == CaloSampling::TileExt2 + ) + { + searchTowerAndInsert( newCell, log, -0.05 ); + searchTowerAndInsert( newCell, log, +0.05 ); + } + else + { + searchTowerAndInsert(newCell, log); + } + + } +} + +void TrigT2TileJet::searchTowerAndInsert( const Trig3Momentum& cell, MsgStream& log, double etaShift ) +{ + bool flag = 0; + + // walk through tower collection and look for an appropriate tower + for (TrigT2Tower& tt : m_towercollection) + { + if( tt.isMember(cell, log, etaShift) ) + { + if( tt.insertCell(cell, log) ) + { + // insert new Cell and end loop immediately + flag = 1; + break; // stop loop + } + else + { + log << MSG::WARNING << " REGTEST: CELL: tried to insert Cell twice in a tower!" << endmsg; + flag=1; // do not insert in new tower + break; + } + } + } + // tower not in collection yet, so create one + if ( !flag ) + { + if ( log.level() <= MSG::DEBUG ) + log << MSG::DEBUG << " REGTEST: CELL: insert in NEW tower" << endmsg; + m_towercollection.emplace_back( cell, log, etaShift ); + + } + +} + +void TrigT2TileJet::print(MsgStream& log) const +{ + log << MSG::DEBUG << " REGTEST: JET: print jet:" << endmsg; + for (const TrigT2Tower& tt : m_towercollection) + { + tt.print(log,MSG::DEBUG); + } +} + +bool TrigT2TileJet::findHottestTower(TrigT2Tower &tower) const +{ + tower.setE(0.); + for (const TrigT2Tower& tt : m_towercollection) + { + if ( tt.e() > tower.e() ) tower = tt; + } + if ( tower.e() > 0.0) return true; + else return false; +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2Tower.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2Tower.cxx new file mode 100644 index 000000000000..fb9fa8129f47 --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/TrigT2Tower.cxx @@ -0,0 +1,131 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + + NAME: TrigT2Tower.cxx + PACKAGE: Trigger/TrigAlgorithms/TrigT2CaloTileMon + + AUTHOR: Jens Damaske + PURPOSE: Combines 3 Trig3Momentum Objects to a Tower + + *******************************************************************/ + +#include "TrigT2CaloTileMon/TrigT2Tower.h" +/// #include "TrigT2Tower.h" + + +TrigT2Tower::TrigT2Tower(): m_eta(0.0), m_phi(0.0) +{ + // flush tower + setComplete( 0 ); + setE( 0. ); + + // flush all 3 cells + for( int i=0; i<3; i++ ) + { + m_cells[i] = Trig3Momentum( 0., 0., 0., CaloSampling::Unknown); + m_cells[i].setInCone(0); + } +} + +/** insert first Cell everytime new tower is build */ +TrigT2Tower::TrigT2Tower(const Trig3Momentum& newCell, MsgStream& log, double etaShift): m_eta(0.0), m_phi(0.0) +{ + // flush tower + setComplete( 0 ); + setE( 0. ); + + // flush all 3 cells + for( int i=0; i<3; i++ ) + { + m_cells[i] = Trig3Momentum( 0., 0., 0., CaloSampling::Unknown); + m_cells[i].setInCone(0); + } + + // set tower position to first cell position + setEta( newCell.eta() + etaShift ); + setPhi( newCell.phi() ); + + insertCell( newCell, log); +} + +bool TrigT2Tower::insertCell(const Trig3Momentum& cell, MsgStream& log) +{ + if ( cell.caloSample() == CaloSampling::TileBar0 || cell.caloSample() == CaloSampling::TileExt0 ) + { + if ( !m_cells[0].inCone() ) + { + m_cells[0] = cell; + setE( e() + cell.e() ); + m_cells[0].setInCone(1); + } + else return 0; + } + else if ( cell.caloSample() == CaloSampling::TileBar1 || cell.caloSample() == CaloSampling::TileExt1 ) + { + if ( !m_cells[1].inCone() ) + { + m_cells[1] = cell; + setE( e() + cell.e() ); + m_cells[1].setInCone(1); + } + else return 0; + } + else if ( cell.caloSample() == CaloSampling::TileBar2 || cell.caloSample() == CaloSampling::TileExt2 ) + { + if ( !m_cells[2].inCone() ) + { + m_cells[2] = cell; + setE( e() + cell.e()/2. ); + m_cells[2].setInCone(1); + } + else return 0; + } + else + { + log << MSG::WARNING << " REGTEST: CELL: is not in TILE. caloSample ID is: " << cell.caloSample() << endmsg; + return 0; + } + + // is tower full now ?? + int sum = 0; + for( int i=0; i<3; i++ ) + { + if ( m_cells[i].inCone() ) sum++; + } + if ( sum == 3 ) setComplete(1); + + return 1; +} + +// phi and eta is known up to 3 decimal +bool TrigT2Tower::isMember(const Trig3Momentum& cell, MsgStream& log, double etaShift) const +{ + double delta = 0.005; + if ( fabs(eta()-(cell.eta()+etaShift))<delta && fabs(phi()-cell.phi())<delta ) + { + if ( log.level()<MSG::DEBUG ) + log << MSG::DEBUG << " REGTEST: CELL: insert in EXISTING tower: eta" << eta() << " phi:" << phi() << endmsg; + return true; + } + + return false; +} + +void TrigT2Tower::print(MsgStream& log, MSG::Level level) const +{ + log << level << " REGTEST: TOWER: eta:" << eta() << " phi:" << phi() << " e:" << e() << endmsg; + + for( int i=0; i<3; i++ ) + { + if ( m_cells[i].inCone() ) + { + log << level << " REGTEST: CELL " << i << " : eta:" << m_cells[i].eta() << " phi:" << m_cells[i].phi() + << " e:" << m_cells[i].e() << endmsg; + } + else log << level << " REGTEST: CELL " << i << " : is NOT SET" << endmsg; + } + +} diff --git a/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/components/TrigT2CaloTileMon_entries.cxx b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/components/TrigT2CaloTileMon_entries.cxx new file mode 100644 index 000000000000..9157c8f71a3a --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigT2CaloTileMon/src/components/TrigT2CaloTileMon_entries.cxx @@ -0,0 +1,6 @@ +#include "TrigT2CaloTileMon/T2CaloTileMon.h" +#include "TrigT2CaloTileMon/TileMonHadEnFex.h" + +DECLARE_COMPONENT( T2CaloTileMon ) +DECLARE_COMPONENT( TileMonHadEnFex ) + -- GitLab From 72bd0c323c6b8ab0f2e14daac3453a29225295b9 Mon Sep 17 00:00:00 2001 From: MihaMuskinja <miha.muskinja@gmail.com> Date: Fri, 8 Mar 2019 14:51:20 +0100 Subject: [PATCH 064/163] Added more histograms as a function of initial step vol/process/material --- .../G4DebuggingTools/src/StepHistogram.cxx | 50 ++++++++++++++++++- .../G4DebuggingTools/src/StepHistogram.h | 18 ++++++- .../src/StepHistogramTool.cxx | 13 +++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/Simulation/G4Utilities/G4DebuggingTools/src/StepHistogram.cxx b/Simulation/G4Utilities/G4DebuggingTools/src/StepHistogram.cxx index 31120d091e6c..c9daf81988e4 100644 --- a/Simulation/G4Utilities/G4DebuggingTools/src/StepHistogram.cxx +++ b/Simulation/G4Utilities/G4DebuggingTools/src/StepHistogram.cxx @@ -25,7 +25,10 @@ namespace G4UA{ StepHistogram::StepHistogram(const Config& config): AthMessaging(Gaudi::svcLocator()->service<IMessageSvc>("MessageSvc"),"StepHistogram"), m_config(config), - m_initialKineticEnergyOfStep() + m_initialKineticEnergyOfStep(), + m_initialVolume(), + m_initialMaterial(), + m_initialProcess() {} void StepHistogram::UserSteppingAction(const G4Step * aStep){ @@ -150,6 +153,11 @@ namespace G4UA{ if (tr->GetCurrentStepNumber()==1) { // initial kinetic energy m_initialKineticEnergyOfStep = stepKinetic; + + // initial volume/material/processes + m_initialVolume = volumeName; + m_initialMaterial = materialName; + m_initialProcess = processName; // save track ID for checking if we later have the same track m_trackID = tr->GetTrackID(); @@ -157,6 +165,12 @@ namespace G4UA{ // initial energy InitializeFillHistogram(m_report.histoMapMap_InitialE, "InitialE", particleName, "AllATLAS", 1000, -9, 7, log10(m_initialKineticEnergyOfStep), 1.0); + InitializeFillHistogram(m_report.histoMapMap_vol_InitialE, "vol_InitialE", particleName, m_initialVolume, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), 1.0); + InitializeFillHistogram(m_report.histoMapMap_mat_InitialE, "mat_InitialE", particleName, m_initialMaterial, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), 1.0); + InitializeFillHistogram(m_report.histoMapMap_prc_InitialE, "prc_InitialE", particleName, m_initialProcess, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), 1.0); } // last step @@ -170,9 +184,30 @@ namespace G4UA{ int nSteps = tr->GetCurrentStepNumber() + 1; InitializeFillHistogram(m_report.histoMapMap_numberOfSteps, "numberOfSteps", particleName, "AllATLAS", 10000, 0.5, 10000.5, nSteps, 1.); + InitializeFillHistogram(m_report.histoMapMap_vol_numberOfSteps, "vol_numberOfSteps", particleName, m_initialVolume, + 10000, 0.5, 10000.5, nSteps, 1.); + InitializeFillHistogram(m_report.histoMapMap_mat_numberOfSteps, "mat_numberOfSteps", particleName, m_initialMaterial, + 10000, 0.5, 10000.5, nSteps, 1.); + InitializeFillHistogram(m_report.histoMapMap_prc_numberOfSteps, "prc_numberOfSteps", particleName, m_initialProcess, + 10000, 0.5, 10000.5, nSteps, 1.); // number of steps vs initial energy InitializeFillHistogram(m_report.histoMapMap_numberOfStepsPerInitialE, "numberOfStepsPerInitialE", particleName, "AllATLAS", 1000, -9, 7, log10(m_initialKineticEnergyOfStep), nSteps); + InitializeFillHistogram(m_report.histoMapMap_vol_numberOfStepsPerInitialE, "vol_numberOfStepsPerInitialE", particleName, m_initialVolume, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), nSteps); + InitializeFillHistogram(m_report.histoMapMap_mat_numberOfStepsPerInitialE, "mat_numberOfStepsPerInitialE", particleName, m_initialMaterial, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), nSteps); + InitializeFillHistogram(m_report.histoMapMap_prc_numberOfStepsPerInitialE, "prc_numberOfStepsPerInitialE", particleName, m_initialProcess, + 1000, -9, 7, log10(m_initialKineticEnergyOfStep), nSteps); + // track length vs initial energy + InitializeFillHistogram(m_report.histoMapMap_trackLengthPerInitialE, "trackLengthPerInitialE", particleName, "AllATLAS", + 1000, -9, 7, log10(tr->GetTrackLength()), 1.); + InitializeFillHistogram(m_report.histoMapMap_vol_trackLengthPerInitialE, "vol_trackLengthPerInitialE", particleName, m_initialVolume, + 1000, -9, 7, log10(tr->GetTrackLength()), 1.); + InitializeFillHistogram(m_report.histoMapMap_mat_trackLengthPerInitialE, "mat_trackLengthPerInitialE", particleName, m_initialMaterial, + 1000, -9, 7, log10(tr->